diff --git a/CHANGELOG.md b/CHANGELOG.md index 95e9f1c..dbee3a1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## [1.1.5] - 2020-10-19 +### Fixed +- Fixed MetadataProvider for Overlay Plane Module - [@triet12369] +- Remove checks for non-image series in StudyMetadata -[@triet12369] +- Replace BulkDataURI with correct url in Overlay series [@triet12369] + ## [1.1.4] - 2020-10-19 ### Fixed - Bind this to cache full callback in StudyPrefetcher - [@triet12369] diff --git a/dist/index.umd.js b/dist/index.umd.js index 327bc51..30b501b 100644 --- a/dist/index.umd.js +++ b/dist/index.umd.js @@ -1,3 +1,3 @@ /*! For license information please see index.umd.js.LICENSE.txt */ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("cornerstone-core"),require("dcmjs"),require("cornerstone-tools"),require("cornerstone-math"),require("dicom-parser"),require("cornerstone-wado-image-loader")):"function"==typeof define&&define.amd?define(["cornerstone-core","dcmjs","cornerstone-tools","cornerstone-math","dicom-parser","cornerstone-wado-image-loader"],t):"object"==typeof exports?exports.viewerCore=t(require("cornerstone-core"),require("dcmjs"),require("cornerstone-tools"),require("cornerstone-math"),require("dicom-parser"),require("cornerstone-wado-image-loader")):e.viewerCore=t(e["cornerstone-core"],e.dcmjs,e["cornerstone-tools"],e["cornerstone-math"],e["dicom-parser"],e["cornerstone-wado-image-loader"])}(window,(function(e,t,r,n,a,i){return function(e){function t(t){for(var r,a,i=t[0],o=t[1],s=0,c=[];so&&(n=t.tooLong||this.tooLong||"is too long (maximum is %{count} characters)",u.push(i.format(n,{count:o}))),u.length>0?t.message||u:void 0):(i.error(i.format("Attribute %{attr} has a non numeric value for `length`",{attr:r})),t.message||this.notValid||"has an incorrect length")}},numericality:function(e,t,r,n,a){if(i.isDefined(e)){var o,s,u=[],c={greaterThan:function(e,t){return e>t},greaterThanOrEqualTo:function(e,t){return e>=t},equalTo:function(e,t){return e===t},lessThan:function(e,t){return eo&&(r=t.tooLate||t.message||this.tooLate||"must be no later than %{date}",r=i.format(r,{date:this.format(o,t),value:this.format(e,t)}),n.push(r)),n.length?i.unique(n):void 0)}}),{parse:null,format:null}),date:function(e,t){return t=i.extend({},t,{dateOnly:!0}),i.validators.datetime.call(i.validators.datetime,e,t)},format:function(e,t){(i.isString(t)||t instanceof RegExp)&&(t={pattern:t});var r,n=(t=i.extend({},this.options,t)).message||this.message||"is invalid",a=t.pattern;if(i.isDefined(e))return i.isString(e)?(i.isString(a)&&(a=new RegExp(t.pattern,t.flags)),(r=a.exec(e))&&r[0].length==e.length?void 0:n):n},inclusion:function(e,t){if(i.isDefined(e)&&(i.isArray(t)&&(t={within:t}),t=i.extend({},this.options,t),!i.contains(t.within,e))){var r=t.message||this.message||"^%{value} is not included in the list";return i.format(r,{value:e})}},exclusion:function(e,t){if(i.isDefined(e)&&(i.isArray(t)&&(t={within:t}),t=i.extend({},this.options,t),i.contains(t.within,e))){var r=t.message||this.message||"^%{value} is restricted";return i.format(r,{value:e})}},email:i.extend((function(e,t){var r=(t=i.extend({},this.options,t)).message||this.message||"is not a valid email";if(i.isDefined(e))return i.isString(e)&&this.PATTERN.exec(e)?void 0:r}),{PATTERN:/^[a-z0-9\u007F-\uffff!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9\u007F-\uffff!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z]{2,}$/i}),equality:function(e,t,r,n,a){if(i.isDefined(e)){i.isString(t)&&(t={attribute:t});var o=(t=i.extend({},this.options,t)).message||this.message||"is not equal to %{attribute}";if(i.isEmpty(t.attribute)||!i.isString(t.attribute))throw new Error("The attribute must be a non empty string");var s=i.getDeepObjectValue(n,t.attribute),u=t.comparator||function(e,t){return e===t},c=t.prettify||a&&a.prettify||i.prettify;return u(e,s,t,r,n)?void 0:i.format(o,{attribute:c(t.attribute)})}},url:function(e,t){if(i.isDefined(e)){var r=(t=i.extend({},this.options,t)).message||this.message||"is not a valid url",n=t.schemes||this.schemes||["http","https"],a=t.allowLocal||this.allowLocal||!1;if(!i.isString(e))return r;var o="^(?:(?:"+n.join("|")+")://)(?:\\S+(?::\\S*)?@)?(?:",s="(?:\\.(?:[a-z\\u00a1-\\uffff]{2,}))";return a?s+="?":o+="(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})",o+="(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)*"+s+")(?::\\d{2,5})?(?:[/?#]\\S*)?$",new RegExp(o,"i").exec(e)?void 0:r}}},a.formatters={detailed:function(e){return e},flat:i.flattenErrorsToArray,grouped:function(e){var t;for(t in e=i.groupErrorsByAttribute(e))e[t]=i.flattenErrorsToArray(e[t]);return e},constraint:function(e){var t;for(t in e=i.groupErrorsByAttribute(e))e[t]=e[t].map((function(e){return e.validator})).sort();return e}},a.exposeModule(a,this,e,t,r(106))}).call(this,t,e,r(106))}).call(this,r(36)(e))},,function(e,t,r){var n=r(138),a=r(144);e.exports=function(e,t){var r=a(e,t);return n(r)?r:void 0}},function(e,t){e.exports=function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}},function(e,t,r){var n=r(26),a=r(140),i=r(141),o=n?n.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":o&&o in Object(e)?a(e):i(e)}},function(e,t,r){"use strict";function n(e,t,r){var n=r?" !== ":" === ",a=r?" || ":" && ",i=r?"!":"",o=r?"":"!";switch(e){case"null":return t+n+"null";case"array":return i+"Array.isArray("+t+")";case"object":return"("+i+t+a+"typeof "+t+n+'"object"'+a+o+"Array.isArray("+t+"))";case"integer":return"(typeof "+t+n+'"number"'+a+o+"("+t+" % 1)"+a+t+n+t+")";default:return"typeof "+t+n+'"'+e+'"'}}e.exports={copy:function(e,t){for(var r in t=t||{},e)t[r]=e[r];return t},checkDataType:n,checkDataTypes:function(e,t){switch(e.length){case 1:return n(e[0],t,!0);default:var r="",a=i(e);for(var o in a.array&&a.object&&(r=a.null?"(":"(!"+t+" || ",r+="typeof "+t+' !== "object")',delete a.null,delete a.array,delete a.object),a.number&&delete a.integer,a)r+=(r?" && ":"")+n(o,t,!0);return r}},coerceToTypes:function(e,t){if(Array.isArray(t)){for(var r=[],n=0;n=t)throw new Error("Cannot access property/index "+n+" levels up, current level is "+t);return r[t-n]}if(n>t)throw new Error("Cannot access data "+n+" levels up, current level is "+t);if(i="data"+(t-n||""),!a)return i}for(var s=i,c=a.split("/"),l=0;l{t=/\[(\d*)\]$/.exec(e),e=e.replace(/\[\d*\]$/,""),t?(void 0===n[e]&&(n[e]={}),n[e][t[1]]=r):n[e]=r};case"bracket":return(e,r,n)=>{t=/(\[\])$/.exec(e),e=e.replace(/\[\]$/,""),t?void 0!==n[e]?n[e]=[].concat(n[e],r):n[e]=[r]:n[e]=r};case"comma":case"separator":return(t,r,n)=>{const a="string"==typeof r&&r.split("").indexOf(e.arrayFormatSeparator)>-1?r.split(e.arrayFormatSeparator).map(t=>u(t,e)):null===r?r:u(r,e);n[t]=a};default:return(e,t,r)=>{void 0!==r[e]?r[e]=[].concat(r[e],t):r[e]=t}}}(t),n=Object.create(null);if("string"!=typeof e)return n;if(!(e=e.trim().replace(/^[?#&]/,"")))return n;for(const a of e.split("&")){let[e,o]=i(t.decode?a.replace(/\+/g," "):a,"=");o=void 0===o?null:["comma","separator"].includes(t.arrayFormat)?o:u(o,t),r(u(e,t),o,n)}for(const e of Object.keys(n)){const r=n[e];if("object"==typeof r&&null!==r)for(const e of Object.keys(r))r[e]=f(r[e],t);else n[e]=f(r,t)}return!1===t.sort?n:(!0===t.sort?Object.keys(n).sort():Object.keys(n).sort(t.sort)).reduce((e,t)=>{const r=n[t];return Boolean(r)&&"object"==typeof r&&!Array.isArray(r)?e[t]=function e(t){return Array.isArray(t)?t.sort():"object"==typeof t?e(Object.keys(t)).sort((e,t)=>Number(e)-Number(t)).map(e=>t[e]):t}(r):e[t]=r,e},Object.create(null))}t.extract=l,t.parse=d,t.stringify=(e,t)=>{if(!e)return"";o((t=Object.assign({encode:!0,strict:!0,arrayFormat:"none",arrayFormatSeparator:","},t)).arrayFormatSeparator);const r=r=>t.skipNull&&null==e[r]||t.skipEmptyString&&""===e[r],n=function(e){switch(e.arrayFormat){case"index":return t=>(r,n)=>{const a=r.length;return void 0===n||e.skipNull&&null===n||e.skipEmptyString&&""===n?r:null===n?[...r,[s(t,e),"[",a,"]"].join("")]:[...r,[s(t,e),"[",s(a,e),"]=",s(n,e)].join("")]};case"bracket":return t=>(r,n)=>void 0===n||e.skipNull&&null===n||e.skipEmptyString&&""===n?r:null===n?[...r,[s(t,e),"[]"].join("")]:[...r,[s(t,e),"[]=",s(n,e)].join("")];case"comma":case"separator":return t=>(r,n)=>null==n||0===n.length?r:0===r.length?[[s(t,e),"=",s(n,e)].join("")]:[[r,s(n,e)].join(e.arrayFormatSeparator)];default:return t=>(r,n)=>void 0===n||e.skipNull&&null===n||e.skipEmptyString&&""===n?r:null===n?[...r,s(t,e)]:[...r,[s(t,e),"=",s(n,e)].join("")]}}(t),a={};for(const t of Object.keys(e))r(t)||(a[t]=e[t]);const i=Object.keys(a);return!1!==t.sort&&i.sort(t.sort),i.map(r=>{const a=e[r];return void 0===a?"":null===a?s(r,t):Array.isArray(a)?a.reduce(n(r),[]).join("&"):s(r,t)+"="+s(a,t)}).filter(e=>e.length>0).join("&")},t.parseUrl=(e,t)=>({url:c(e).split("?")[0]||"",query:d(l(e),t)}),t.stringifyUrl=(e,r)=>{const n=c(e.url).split("?")[0]||"",a=t.extract(e.url),i=t.parse(a),o=function(e){let t="";const r=e.indexOf("#");return-1!==r&&(t=e.slice(r)),t}(e.url),s=Object.assign(i,e.query);let u=t.stringify(s,r);return u&&(u="?"+u),`${n}${u}${o}`}},function(e,t,r){var n;!function(a,i,o){if(a){for(var s,u={8:"backspace",9:"tab",13:"enter",16:"shift",17:"ctrl",18:"alt",20:"capslock",27:"esc",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down",45:"ins",46:"del",91:"meta",93:"meta",224:"meta"},c={106:"*",107:"+",109:"-",110:".",111:"/",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'"},l={"~":"`","!":"1","@":"2","#":"3",$:"4","%":"5","^":"6","&":"7","*":"8","(":"9",")":"0",_:"-","+":"=",":":";",'"':"'","<":",",">":".","?":"/","|":"\\"},f={option:"alt",command:"meta",return:"enter",escape:"esc",plus:"+",mod:/Mac|iPod|iPhone|iPad/.test(navigator.platform)?"meta":"ctrl"},d=1;d<20;++d)u[111+d]="f"+d;for(d=0;d<=9;++d)u[d+96]=d.toString();g.prototype.bind=function(e,t,r){return e=e instanceof Array?e:[e],this._bindMultiple.call(this,e,t,r),this},g.prototype.unbind=function(e,t){return this.bind.call(this,e,(function(){}),t)},g.prototype.trigger=function(e,t){return this._directMap[e+":"+t]&&this._directMap[e+":"+t]({},e),this},g.prototype.reset=function(){return this._callbacks={},this._directMap={},this},g.prototype.stopCallback=function(e,t){if((" "+t.className+" ").indexOf(" mousetrap ")>-1)return!1;if(function e(t,r){return null!==t&&t!==i&&(t===r||e(t.parentNode,r))}(t,this.target))return!1;if("composedPath"in e&&"function"==typeof e.composedPath){var r=e.composedPath()[0];r!==e.target&&(t=r)}return"INPUT"==t.tagName||"SELECT"==t.tagName||"TEXTAREA"==t.tagName||t.isContentEditable},g.prototype.handleKey=function(){var e=this;return e._handleKey.apply(e,arguments)},g.addKeycodes=function(e){for(var t in e)e.hasOwnProperty(t)&&(u[t]=e[t]);s=null},g.init=function(){var e=g(i);for(var t in e)"_"!==t.charAt(0)&&(g[t]=function(t){return function(){return e[t].apply(e,arguments)}}(t))},g.init(),a.Mousetrap=g,e.exports&&(e.exports=g),void 0===(n=function(){return g}.call(t,r,t,e))||(e.exports=n)}function p(e,t,r){e.addEventListener?e.addEventListener(t,r,!1):e.attachEvent("on"+t,r)}function h(e){if("keypress"==e.type){var t=String.fromCharCode(e.which);return e.shiftKey||(t=t.toLowerCase()),t}return u[e.which]?u[e.which]:c[e.which]?c[e.which]:String.fromCharCode(e.which).toLowerCase()}function m(e){return"shift"==e||"ctrl"==e||"alt"==e||"meta"==e}function v(e,t,r){return r||(r=function(){if(!s)for(var e in s={},u)e>95&&e<112||u.hasOwnProperty(e)&&(s[u[e]]=e);return s}()[e]?"keydown":"keypress"),"keypress"==r&&t.length&&(r="keydown"),r}function y(e,t){var r,n,a,i=[];for(r=function(e){return"+"===e?["+"]:(e=e.replace(/\+{2}/g,"+plus")).split("+")}(e),a=0;a1?d(e,s,r,n):(o=y(e,n),t._callbacks[o.key]=t._callbacks[o.key]||[],c(o.key,o.modifiers,{type:o.action},a,e,i),t._callbacks[o.key][a?"unshift":"push"]({callback:r,modifiers:o.modifiers,action:o.action,seq:a,level:i,combo:e}))}t._handleKey=function(e,t,r){var n,a=c(e,t,r),i={},f=0,d=!1;for(n=0;n-1&&e%1==0&&e-1&&e%1==0&&e<=9007199254740991}},function(e,t){e.exports=function(e){return function(t){return e(t)}}},function(e,t,r){(function(e){var n=r(71),a=t&&!t.nodeType&&t,i=a&&"object"==typeof e&&e&&!e.nodeType&&e,o=i&&i.exports===a&&n.process,s=function(){try{var e=i&&i.require&&i.require("util").types;return e||o&&o.binding&&o.binding("util")}catch(e){}}();e.exports=s}).call(this,r(36)(e))},function(e,t){var r=Object.prototype;e.exports=function(e){var t=e&&e.constructor;return e===("function"==typeof t&&t.prototype||r)}},function(e,t,r){var n=r(169),a=r(79),i=Object.prototype.propertyIsEnumerable,o=Object.getOwnPropertySymbols,s=o?function(e){return null==e?[]:(e=Object(e),n(o(e),(function(t){return i.call(e,t)})))}:a;e.exports=s},function(e,t,r){var n=r(76)(Object.getPrototypeOf,Object);e.exports=n},function(e,t,r){var n=r(85);e.exports=function(e){var t=new e.constructor(e.byteLength);return new n(t).set(new n(e)),t}},function(e,t){e.exports=function(e){var t=-1,r=Array(e.size);return e.forEach((function(e){r[++t]=e})),r}},function(e,t,r){var n=r(15),a=r(61),i=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,o=/^\w*$/;e.exports=function(e,t){if(n(e))return!1;var r=typeof e;return!("number"!=r&&"symbol"!=r&&"boolean"!=r&&null!=e&&!a(e))||(o.test(e)||!i.test(e)||null!=t&&e in Object(t))}},function(e,t,r){var n=r(23),a=r(17);e.exports=function(e){return"symbol"==typeof e||a(e)&&"[object Symbol]"==n(e)}},function(e,t){e.exports=function(e){return e}},function(e,t,r){"use strict";var n=r(236),a=r(64),i=r(24),o=r(98),s=r(238);function u(e,t,r){var n=this._refs[r];if("string"==typeof n){if(!this._refs[n])return u.call(this,e,t,n);n=this._refs[n]}if((n=n||this._schemas[r])instanceof o)return h(n.schema,this._opts.inlineRefs)?n.schema:n.validate||this._compile(n);var a,i,s,l=c.call(this,t,r);return l&&(a=l.schema,t=l.root,s=l.baseId),a instanceof o?i=a.validate||e.call(this,a.schema,t,void 0,s):void 0!==a&&(i=h(a,this._opts.inlineRefs)?a:e.call(this,a,t,void 0,s)),i}function c(e,t){var r=n.parse(t),a=v(r),i=m(this._getId(e.schema));if(0===Object.keys(e.schema).length||a!==i){var s=g(a),u=this._refs[s];if("string"==typeof u)return l.call(this,e,u,r);if(u instanceof o)u.validate||this._compile(u),e=u;else{if(!((u=this._schemas[s])instanceof o))return;if(u.validate||this._compile(u),s==g(t))return{schema:u,root:e,baseId:i};e=u}if(!e.schema)return;i=m(this._getId(e.schema))}return d.call(this,r,i,e.schema,e)}function l(e,t,r){var n=c.call(this,e,t);if(n){var a=n.schema,i=n.baseId;e=n.root;var o=this._getId(a);return o&&(i=b(i,o)),d.call(this,r,i,a,e)}}e.exports=u,u.normalizeId=g,u.fullPath=m,u.url=b,u.ids=function(e){var t=g(this._getId(e)),r={"":t},o={"":m(t,!1)},u={},c=this;return s(e,{allKeys:!0},(function(e,t,s,l,f,d,p){if(""!==t){var h=c._getId(e),m=r[l],v=o[l]+"/"+f;if(void 0!==p&&(v+="/"+("number"==typeof p?p:i.escapeFragment(p))),"string"==typeof h){h=m=g(m?n.resolve(m,h):h);var y=c._refs[h];if("string"==typeof y&&(y=c._refs[y]),y&&y.schema){if(!a(e,y.schema))throw new Error('id "'+h+'" resolves to more than one schema')}else if(h!=g(v))if("#"==h[0]){if(u[h]&&!a(e,u[h]))throw new Error('id "'+h+'" resolves to more than one schema');u[h]=e}else c._refs[h]=v}r[t]=m,o[t]=v}})),u},u.inlineRef=h,u.schema=c;var f=i.toHash(["properties","patternProperties","enum","dependencies","definitions"]);function d(e,t,r,n){if(e.fragment=e.fragment||"","/"==e.fragment.slice(0,1)){for(var a=e.fragment.split("/"),o=1;oe.length)&&(t=e.length);for(var r=0,n=new Array(t);rl))return!1;var d=u.get(e);if(d&&u.get(t))return d==t;var p=-1,h=!0,m=2&r?new n:void 0;for(u.set(e,t),u.set(t,e);++p",g=p?">":"<",b=void 0;if(v){var I=e.util.getData(m.$data,o,e.dataPathArr),w="exclusive"+i,S="exclType"+i,P="exclIsNumber"+i,D="' + "+(x="op"+i)+" + '";a+=" var schemaExcl"+i+" = "+I+"; ",a+=" var "+w+"; var "+S+" = typeof "+(I="schemaExcl"+i)+"; if ("+S+" != 'boolean' && "+S+" != 'undefined' && "+S+" != 'number') { ";var E;b=h;(E=E||[]).push(a),a="",!1!==e.createErrors?(a+=" { keyword: '"+(b||"_exclusiveLimit")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(c)+" , params: {} ",!1!==e.opts.messages&&(a+=" , message: '"+h+" should be boolean' "),e.opts.verbose&&(a+=" , schema: validate.schema"+u+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+f+" "),a+=" } "):a+=" {} ";var O=a;a=E.pop(),!e.compositeRule&&l?e.async?a+=" throw new ValidationError(["+O+"]); ":a+=" validate.errors = ["+O+"]; return false; ":a+=" var err = "+O+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+=" } else if ( ",d&&(a+=" ("+n+" !== undefined && typeof "+n+" != 'number') || "),a+=" "+S+" == 'number' ? ( ("+w+" = "+n+" === undefined || "+I+" "+y+"= "+n+") ? "+f+" "+g+"= "+I+" : "+f+" "+g+" "+n+" ) : ( ("+w+" = "+I+" === true) ? "+f+" "+g+"= "+n+" : "+f+" "+g+" "+n+" ) || "+f+" !== "+f+") { var op"+i+" = "+w+" ? '"+y+"' : '"+y+"='; ",void 0===s&&(b=h,c=e.errSchemaPath+"/"+h,n=I,d=v)}else{D=y;if((P="number"==typeof m)&&d){var x="'"+D+"'";a+=" if ( ",d&&(a+=" ("+n+" !== undefined && typeof "+n+" != 'number') || "),a+=" ( "+n+" === undefined || "+m+" "+y+"= "+n+" ? "+f+" "+g+"= "+m+" : "+f+" "+g+" "+n+" ) || "+f+" !== "+f+") { "}else{P&&void 0===s?(w=!0,b=h,c=e.errSchemaPath+"/"+h,n=m,g+="="):(P&&(n=Math[p?"min":"max"](m,s)),m===(!P||n)?(w=!0,b=h,c=e.errSchemaPath+"/"+h,g+="="):(w=!1,D+="="));x="'"+D+"'";a+=" if ( ",d&&(a+=" ("+n+" !== undefined && typeof "+n+" != 'number') || "),a+=" "+f+" "+g+" "+n+" || "+f+" !== "+f+") { "}}b=b||t,(E=E||[]).push(a),a="",!1!==e.createErrors?(a+=" { keyword: '"+(b||"_limit")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(c)+" , params: { comparison: "+x+", limit: "+n+", exclusive: "+w+" } ",!1!==e.opts.messages&&(a+=" , message: 'should be "+D+" ",a+=d?"' + "+n:n+"'"),e.opts.verbose&&(a+=" , schema: ",a+=d?"validate.schema"+u:""+s,a+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+f+" "),a+=" } "):a+=" {} ";O=a;return a=E.pop(),!e.compositeRule&&l?e.async?a+=" throw new ValidationError(["+O+"]); ":a+=" validate.errors = ["+O+"]; return false; ":a+=" var err = "+O+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+=" } ",l&&(a+=" else { "),a}},function(e,t,r){"use strict";e.exports=function(e,t,r){var n,a=" ",i=e.level,o=e.dataLevel,s=e.schema[t],u=e.schemaPath+e.util.getProperty(t),c=e.errSchemaPath+"/"+t,l=!e.opts.allErrors,f="data"+(o||""),d=e.opts.$data&&s&&s.$data;d?(a+=" var schema"+i+" = "+e.util.getData(s.$data,o,e.dataPathArr)+"; ",n="schema"+i):n=s,a+="if ( ",d&&(a+=" ("+n+" !== undefined && typeof "+n+" != 'number') || "),a+=" "+f+".length "+("maxItems"==t?">":"<")+" "+n+") { ";var p=t,h=h||[];h.push(a),a="",!1!==e.createErrors?(a+=" { keyword: '"+(p||"_limitItems")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(c)+" , params: { limit: "+n+" } ",!1!==e.opts.messages&&(a+=" , message: 'should NOT have ",a+="maxItems"==t?"more":"fewer",a+=" than ",a+=d?"' + "+n+" + '":""+s,a+=" items' "),e.opts.verbose&&(a+=" , schema: ",a+=d?"validate.schema"+u:""+s,a+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+f+" "),a+=" } "):a+=" {} ";var m=a;return a=h.pop(),!e.compositeRule&&l?e.async?a+=" throw new ValidationError(["+m+"]); ":a+=" validate.errors = ["+m+"]; return false; ":a+=" var err = "+m+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+="} ",l&&(a+=" else { "),a}},function(e,t,r){"use strict";e.exports=function(e,t,r){var n,a=" ",i=e.level,o=e.dataLevel,s=e.schema[t],u=e.schemaPath+e.util.getProperty(t),c=e.errSchemaPath+"/"+t,l=!e.opts.allErrors,f="data"+(o||""),d=e.opts.$data&&s&&s.$data;d?(a+=" var schema"+i+" = "+e.util.getData(s.$data,o,e.dataPathArr)+"; ",n="schema"+i):n=s;var p="maxLength"==t?">":"<";a+="if ( ",d&&(a+=" ("+n+" !== undefined && typeof "+n+" != 'number') || "),!1===e.opts.unicode?a+=" "+f+".length ":a+=" ucs2length("+f+") ",a+=" "+p+" "+n+") { ";var h=t,m=m||[];m.push(a),a="",!1!==e.createErrors?(a+=" { keyword: '"+(h||"_limitLength")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(c)+" , params: { limit: "+n+" } ",!1!==e.opts.messages&&(a+=" , message: 'should NOT be ",a+="maxLength"==t?"longer":"shorter",a+=" than ",a+=d?"' + "+n+" + '":""+s,a+=" characters' "),e.opts.verbose&&(a+=" , schema: ",a+=d?"validate.schema"+u:""+s,a+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+f+" "),a+=" } "):a+=" {} ";var v=a;return a=m.pop(),!e.compositeRule&&l?e.async?a+=" throw new ValidationError(["+v+"]); ":a+=" validate.errors = ["+v+"]; return false; ":a+=" var err = "+v+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+="} ",l&&(a+=" else { "),a}},function(e,t,r){"use strict";e.exports=function(e,t,r){var n,a=" ",i=e.level,o=e.dataLevel,s=e.schema[t],u=e.schemaPath+e.util.getProperty(t),c=e.errSchemaPath+"/"+t,l=!e.opts.allErrors,f="data"+(o||""),d=e.opts.$data&&s&&s.$data;d?(a+=" var schema"+i+" = "+e.util.getData(s.$data,o,e.dataPathArr)+"; ",n="schema"+i):n=s,a+="if ( ",d&&(a+=" ("+n+" !== undefined && typeof "+n+" != 'number') || "),a+=" Object.keys("+f+").length "+("maxProperties"==t?">":"<")+" "+n+") { ";var p=t,h=h||[];h.push(a),a="",!1!==e.createErrors?(a+=" { keyword: '"+(p||"_limitProperties")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(c)+" , params: { limit: "+n+" } ",!1!==e.opts.messages&&(a+=" , message: 'should NOT have ",a+="maxProperties"==t?"more":"fewer",a+=" than ",a+=d?"' + "+n+" + '":""+s,a+=" properties' "),e.opts.verbose&&(a+=" , schema: ",a+=d?"validate.schema"+u:""+s,a+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+f+" "),a+=" } "):a+=" {} ";var m=a;return a=h.pop(),!e.compositeRule&&l?e.async?a+=" throw new ValidationError(["+m+"]); ":a+=" validate.errors = ["+m+"]; return false; ":a+=" var err = "+m+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+="} ",l&&(a+=" else { "),a}},function(e){e.exports=JSON.parse('{"$schema":"http://json-schema.org/draft-07/schema#","$id":"http://json-schema.org/draft-07/schema#","title":"Core schema meta-schema","definitions":{"schemaArray":{"type":"array","minItems":1,"items":{"$ref":"#"}},"nonNegativeInteger":{"type":"integer","minimum":0},"nonNegativeIntegerDefault0":{"allOf":[{"$ref":"#/definitions/nonNegativeInteger"},{"default":0}]},"simpleTypes":{"enum":["array","boolean","integer","null","number","object","string"]},"stringArray":{"type":"array","items":{"type":"string"},"uniqueItems":true,"default":[]}},"type":["object","boolean"],"properties":{"$id":{"type":"string","format":"uri-reference"},"$schema":{"type":"string","format":"uri"},"$ref":{"type":"string","format":"uri-reference"},"$comment":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"default":true,"readOnly":{"type":"boolean","default":false},"examples":{"type":"array","items":true},"multipleOf":{"type":"number","exclusiveMinimum":0},"maximum":{"type":"number"},"exclusiveMaximum":{"type":"number"},"minimum":{"type":"number"},"exclusiveMinimum":{"type":"number"},"maxLength":{"$ref":"#/definitions/nonNegativeInteger"},"minLength":{"$ref":"#/definitions/nonNegativeIntegerDefault0"},"pattern":{"type":"string","format":"regex"},"additionalItems":{"$ref":"#"},"items":{"anyOf":[{"$ref":"#"},{"$ref":"#/definitions/schemaArray"}],"default":true},"maxItems":{"$ref":"#/definitions/nonNegativeInteger"},"minItems":{"$ref":"#/definitions/nonNegativeIntegerDefault0"},"uniqueItems":{"type":"boolean","default":false},"contains":{"$ref":"#"},"maxProperties":{"$ref":"#/definitions/nonNegativeInteger"},"minProperties":{"$ref":"#/definitions/nonNegativeIntegerDefault0"},"required":{"$ref":"#/definitions/stringArray"},"additionalProperties":{"$ref":"#"},"definitions":{"type":"object","additionalProperties":{"$ref":"#"},"default":{}},"properties":{"type":"object","additionalProperties":{"$ref":"#"},"default":{}},"patternProperties":{"type":"object","additionalProperties":{"$ref":"#"},"propertyNames":{"format":"regex"},"default":{}},"dependencies":{"type":"object","additionalProperties":{"anyOf":[{"$ref":"#"},{"$ref":"#/definitions/stringArray"}]}},"propertyNames":{"$ref":"#"},"const":true,"enum":{"type":"array","items":true,"minItems":1,"uniqueItems":true},"type":{"anyOf":[{"$ref":"#/definitions/simpleTypes"},{"type":"array","items":{"$ref":"#/definitions/simpleTypes"},"minItems":1,"uniqueItems":true}]},"format":{"type":"string"},"contentMediaType":{"type":"string"},"contentEncoding":{"type":"string"},"if":{"$ref":"#"},"then":{"$ref":"#"},"else":{"$ref":"#"},"allOf":{"$ref":"#/definitions/schemaArray"},"anyOf":{"$ref":"#/definitions/schemaArray"},"oneOf":{"$ref":"#/definitions/schemaArray"},"not":{"$ref":"#"}},"default":true}')},function(e,t){e.exports=function(){throw new Error("define cannot be used indirect")}},function(e,t,r){var n=r(3),a=r(44),i=r(123),o=r(66);function s(t){var r="function"==typeof Map?new Map:void 0;return e.exports=s=function(e){if(null===e||!i(e))return e;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==r){if(r.has(e))return r.get(e);r.set(e,t)}function t(){return o(e,arguments,n(this).constructor)}return t.prototype=Object.create(e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),a(t,e)},s(t)}e.exports=s},function(e,t){e.exports=function(e){var t;if("undefined"!=typeof Symbol){if(Symbol.asyncIterator&&null!=(t=e[Symbol.asyncIterator]))return t.call(e);if(Symbol.iterator&&null!=(t=e[Symbol.iterator]))return t.call(e)}throw new TypeError("Object is not async iterable")}},function(e,t,r){var n=r(126);e.exports=function(e){return function(){return new n(e.apply(this,arguments))}}},function(e,t,r){var n=r(219),a=r(226)((function(e,t,r){n(e,t,r)}));e.exports=a},function(e){e.exports=JSON.parse('{"both":{"Location":{}},"baseline":{"TargetType":{},"MaxTargetsPerOrgan":{"limit":2},"MaxTargets":{"limit":5},"MeasurementsLength":[{"longAxis":10,"longAxisSliceThicknessMultiplier":2,"modalityIn":["CT","MR"],"locationNotIn":["Lymph Node"],"message":"Extranodal lesions must be >= 10mm long axis AND >= double the acquisition slice thickness by CT and MR"},{"shortAxis":20,"longAxis":20,"modalityIn":["PX","XA"],"locationNotIn":["Lymph Node"],"message":"Extranodal lesions must be >= 20mm on chest x-ray (although x-rays rarely used for clinical trial assessment)"},{"shortAxis":15,"shortAxisSliceThicknessMultiplier":2,"modalityIn":["CT","MR"],"locationIn":["Lymph Node"],"message":"Nodal lesions must be >= 15mm short axis AND >= double the acquisition slice thickness by CT and MR"}]},"followup":{}}')},function(e,t,r){"use strict";var n=r(235),a=r(63),i=r(239),o=r(98),s=r(99),u=r(240),c=r(241),l=r(262),f=r(24);e.exports=y,y.prototype.validate=function(e,t){var r;if("string"==typeof e){if(!(r=this.getSchema(e)))throw new Error('no schema with key or ref "'+e+'"')}else{var n=this._addSchema(e);r=n.validate||this._compile(n)}var a=r(t);!0!==r.$async&&(this.errors=r.errors);return a},y.prototype.compile=function(e,t){var r=this._addSchema(e,void 0,t);return r.validate||this._compile(r)},y.prototype.addSchema=function(e,t,r,n){if(Array.isArray(e)){for(var i=0;i=0;--a){var i=this.tryEntries[a],o=i.completion;if("root"===i.tryLoc)return n("end");if(i.tryLoc<=this.prev){var s=r.call(i,"catchLoc"),u=r.call(i,"finallyLoc");if(s&&u){if(this.prev=0;--n){var a=this.tryEntries[n];if(a.tryLoc<=this.prev&&r.call(a,"finallyLoc")&&this.prev=0;--t){var r=this.tryEntries[t];if(r.finallyLoc===e)return this.complete(r.completion,r.afterLoc),w(r),c}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var r=this.tryEntries[t];if(r.tryLoc===e){var n=r.completion;if("throw"===n.type){var a=n.arg;w(r)}return a}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,r){return this.delegate={iterator:P(e),resultName:t,nextLoc:r},"next"===this.method&&(this.arg=void 0),c}},e}(e.exports);try{regeneratorRuntime=n}catch(e){Function("r","regeneratorRuntime = r")(n)}},function(e,t,r){"use strict";e.exports=e=>encodeURIComponent(e).replace(/[!'()*]/g,e=>"%"+e.charCodeAt(0).toString(16).toUpperCase())},function(e,t,r){"use strict";var n=new RegExp("%[a-f0-9]{2}","gi"),a=new RegExp("(%[a-f0-9]{2})+","gi");function i(e,t){try{return decodeURIComponent(e.join(""))}catch(e){}if(1===e.length)return e;t=t||1;var r=e.slice(0,t),n=e.slice(t);return Array.prototype.concat.call([],i(r),i(n))}function o(e){try{return decodeURIComponent(e)}catch(a){for(var t=e.match(n),r=1;r{if("string"!=typeof e||"string"!=typeof t)throw new TypeError("Expected the arguments to be of type `string`");if(""===t)return[e];const r=e.indexOf(t);return-1===r?[e]:[e.slice(0,r),e.slice(r+t.length)]}},function(e,t){e.exports=function(e){return-1!==Function.toString.call(e).indexOf("[native code]")}},function(e,t){e.exports=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}},function(e,t,r){var n=r(70);e.exports=function(e){return new n(e)}},function(e,t,r){var n=r(70);function a(e){var t,r;function a(t,r){try{var o=e[t](r),s=o.value,u=s instanceof n;Promise.resolve(u?s.wrapped:s).then((function(e){u?a("return"===t?"return":"next",e):i(o.done?"return":"normal",e)}),(function(e){a("throw",e)}))}catch(e){i("throw",e)}}function i(e,n){switch(e){case"return":t.resolve({value:n,done:!0});break;case"throw":t.reject(n);break;default:t.resolve({value:n,done:!1})}(t=t.next)?a(t.key,t.arg):r=null}this._invoke=function(e,n){return new Promise((function(i,o){var s={key:e,arg:n,resolve:i,reject:o,next:null};r?r=r.next=s:(t=r=s,a(e,n))}))},"function"!=typeof e.return&&(this.return=void 0)}"function"==typeof Symbol&&Symbol.asyncIterator&&(a.prototype[Symbol.asyncIterator]=function(){return this}),a.prototype.next=function(e){return this._invoke("next",e)},a.prototype.throw=function(e){return this._invoke("throw",e)},a.prototype.return=function(e){return this._invoke("return",e)},e.exports=a},function(e,t,r){var n=r(29),a=r(157),i=r(73),o=r(158),s=r(165),u=r(77),c=r(78),l=r(168),f=r(170),d=r(82),p=r(171),h=r(39),m=r(175),v=r(176),y=r(87),g=r(15),b=r(35),I=r(181),w=r(16),S=r(183),P=r(34),D={};D["[object Arguments]"]=D["[object Array]"]=D["[object ArrayBuffer]"]=D["[object DataView]"]=D["[object Boolean]"]=D["[object Date]"]=D["[object Float32Array]"]=D["[object Float64Array]"]=D["[object Int8Array]"]=D["[object Int16Array]"]=D["[object Int32Array]"]=D["[object Map]"]=D["[object Number]"]=D["[object Object]"]=D["[object RegExp]"]=D["[object Set]"]=D["[object String]"]=D["[object Symbol]"]=D["[object Uint8Array]"]=D["[object Uint8ClampedArray]"]=D["[object Uint16Array]"]=D["[object Uint32Array]"]=!0,D["[object Error]"]=D["[object Function]"]=D["[object WeakMap]"]=!1,e.exports=function e(t,r,E,O,x,_){var k,j=1&r,T=2&r,A=4&r;if(E&&(k=x?E(t,O,x,_):E(t)),void 0!==k)return k;if(!w(t))return t;var R=g(t);if(R){if(k=m(t),!j)return c(t,k)}else{var M=h(t),U="[object Function]"==M||"[object GeneratorFunction]"==M;if(b(t))return u(t,j);if("[object Object]"==M||"[object Arguments]"==M||U&&!x){if(k=T||U?{}:y(t),!j)return T?f(t,s(k,t)):l(t,o(k,t))}else{if(!D[M])return x?t:{};k=v(t,M,j)}}_||(_=new n);var N=_.get(t);if(N)return N;_.set(t,k),S(t)?t.forEach((function(n){k.add(e(n,r,E,n,t,_))})):I(t)&&t.forEach((function(n,a){k.set(a,e(n,r,E,a,t,_))}));var C=A?T?p:d:T?keysIn:P,F=R?void 0:C(t);return a(F||t,(function(n,a){F&&(n=t[a=n]),i(k,a,e(n,r,E,a,t,_))})),k}},function(e,t){e.exports=function(){this.__data__=[],this.size=0}},function(e,t,r){var n=r(31),a=Array.prototype.splice;e.exports=function(e){var t=this.__data__,r=n(t,e);return!(r<0)&&(r==t.length-1?t.pop():a.call(t,r,1),--this.size,!0)}},function(e,t,r){var n=r(31);e.exports=function(e){var t=this.__data__,r=n(t,e);return r<0?void 0:t[r][1]}},function(e,t,r){var n=r(31);e.exports=function(e){return n(this.__data__,e)>-1}},function(e,t,r){var n=r(31);e.exports=function(e,t){var r=this.__data__,a=n(r,e);return a<0?(++this.size,r.push([e,t])):r[a][1]=t,this}},function(e,t,r){var n=r(30);e.exports=function(){this.__data__=new n,this.size=0}},function(e,t){e.exports=function(e){var t=this.__data__,r=t.delete(e);return this.size=t.size,r}},function(e,t){e.exports=function(e){return this.__data__.get(e)}},function(e,t){e.exports=function(e){return this.__data__.has(e)}},function(e,t,r){var n=r(30),a=r(45),i=r(47);e.exports=function(e,t){var r=this.__data__;if(r instanceof n){var o=r.__data__;if(!a||o.length<199)return o.push([e,t]),this.size=++r.size,this;r=this.__data__=new i(o)}return r.set(e,t),this.size=r.size,this}},function(e,t,r){var n=r(46),a=r(142),i=r(16),o=r(72),s=/^\[object .+?Constructor\]$/,u=Function.prototype,c=Object.prototype,l=u.toString,f=c.hasOwnProperty,d=RegExp("^"+l.call(f).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");e.exports=function(e){return!(!i(e)||a(e))&&(n(e)?d:s).test(o(e))}},function(e,t){var r;r=function(){return this}();try{r=r||new Function("return this")()}catch(e){"object"==typeof window&&(r=window)}e.exports=r},function(e,t,r){var n=r(26),a=Object.prototype,i=a.hasOwnProperty,o=a.toString,s=n?n.toStringTag:void 0;e.exports=function(e){var t=i.call(e,s),r=e[s];try{e[s]=void 0;var n=!0}catch(e){}var a=o.call(e);return n&&(t?e[s]=r:delete e[s]),a}},function(e,t){var r=Object.prototype.toString;e.exports=function(e){return r.call(e)}},function(e,t,r){var n,a=r(143),i=(n=/[^.]+$/.exec(a&&a.keys&&a.keys.IE_PROTO||""))?"Symbol(src)_1."+n:"";e.exports=function(e){return!!i&&i in e}},function(e,t,r){var n=r(14)["__core-js_shared__"];e.exports=n},function(e,t){e.exports=function(e,t){return null==e?void 0:e[t]}},function(e,t,r){var n=r(146),a=r(30),i=r(45);e.exports=function(){this.size=0,this.__data__={hash:new n,map:new(i||a),string:new n}}},function(e,t,r){var n=r(147),a=r(148),i=r(149),o=r(150),s=r(151);function u(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t=200){var m=t?null:s(e);if(m)return u(m);d=!1,l=o,h=new n}else h=t?[]:p;e:for(;++c-1}},function(e,t,r){var n=r(213),a=r(214),i=r(215);e.exports=function(e,t,r){return t==t?i(e,t,r):n(e,a,r)}},function(e,t){e.exports=function(e,t,r,n){for(var a=e.length,i=r+(n?1:-1);n?i--:++i1?r[i-1]:void 0,s=i>2?r[2]:void 0;for(o=e.length>3&&"function"==typeof o?(i--,o):void 0,s&&a(r[0],r[1],s)&&(o=i<3?void 0:o,i=1),t=Object(t);++n0){if(++t>=800)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}},function(e,t,r){var n=r(25),a=r(37),i=r(50),o=r(16);e.exports=function(e,t,r){if(!o(r))return!1;var s=typeof t;return!!("number"==s?a(r)&&i(t,r.length):"string"==s&&t in r)&&n(r[t],e)}},function(e,t,r){"use strict";var n=r(63),a=r(24),i=r(65),o=r(99),s=r(100),u=a.ucs2length,c=r(64),l=i.Validation;function f(e,t,r){var n=p.call(this,e,t,r);return n>=0?{index:n,compiling:!0}:(n=this._compilations.length,this._compilations[n]={schema:e,root:t,baseId:r},{index:n,compiling:!1})}function d(e,t,r){var n=p.call(this,e,t,r);n>=0&&this._compilations.splice(n,1)}function p(e,t,r){for(var n=0;n1){t[0]=t[0].slice(0,-1);for(var n=t.length-1,a=1;a= 0x80 (not a basic code point)","invalid-input":"Invalid input"},h=Math.floor,m=String.fromCharCode;function v(e){throw new RangeError(p[e])}function y(e,t){var r=e.split("@"),n="";r.length>1&&(n=r[0]+"@",e=r[1]);var a=function(e,t){for(var r=[],n=e.length;n--;)r[n]=t(e[n]);return r}((e=e.replace(d,".")).split("."),t).join(".");return n+a}function g(e){for(var t=[],r=0,n=e.length;r=55296&&a<=56319&&r>1,e+=h(e/t);e>455;n+=36)e=h(e/35);return h(n+36*e/(e+38))},w=function(e){var t,r=[],n=e.length,a=0,i=128,o=72,s=e.lastIndexOf("-");s<0&&(s=0);for(var u=0;u=128&&v("not-basic"),r.push(e.charCodeAt(u));for(var l=s>0?s+1:0;l=n&&v("invalid-input");var m=(t=e.charCodeAt(l++))-48<10?t-22:t-65<26?t-65:t-97<26?t-97:36;(m>=36||m>h((c-a)/d))&&v("overflow"),a+=m*d;var y=p<=o?1:p>=o+26?26:p-o;if(mh(c/g)&&v("overflow"),d*=g}var b=r.length+1;o=I(a-f,b,0==f),h(a/b)>c-i&&v("overflow"),i+=h(a/b),a%=b,r.splice(a++,0,i)}return String.fromCodePoint.apply(String,r)},S=function(e){var t=[],r=(e=g(e)).length,n=128,a=0,i=72,o=!0,s=!1,u=void 0;try{for(var l,f=e[Symbol.iterator]();!(o=(l=f.next()).done);o=!0){var d=l.value;d<128&&t.push(m(d))}}catch(e){s=!0,u=e}finally{try{!o&&f.return&&f.return()}finally{if(s)throw u}}var p=t.length,y=p;for(p&&t.push("-");y=n&&xh((c-a)/_)&&v("overflow"),a+=(w-n)*_,n=w;var k=!0,j=!1,T=void 0;try{for(var A,R=e[Symbol.iterator]();!(k=(A=R.next()).done);k=!0){var M=A.value;if(Mc&&v("overflow"),M==n){for(var U=a,N=36;;N+=36){var C=N<=i?1:N>=i+26?26:N-i;if(U>6|192).toString(16).toUpperCase()+"%"+(63&t|128).toString(16).toUpperCase():"%"+(t>>12|224).toString(16).toUpperCase()+"%"+(t>>6&63|128).toString(16).toUpperCase()+"%"+(63&t|128).toString(16).toUpperCase()}function x(e){for(var t="",r=0,n=e.length;r=194&&a<224){if(n-r>=6){var i=parseInt(e.substr(r+4,2),16);t+=String.fromCharCode((31&a)<<6|63&i)}else t+=e.substr(r,6);r+=6}else if(a>=224){if(n-r>=9){var o=parseInt(e.substr(r+4,2),16),s=parseInt(e.substr(r+7,2),16);t+=String.fromCharCode((15&a)<<12|(63&o)<<6|63&s)}else t+=e.substr(r,9);r+=9}else t+=e.substr(r,3),r+=3}return t}function _(e,t){function r(e){var r=x(e);return r.match(t.UNRESERVED)?r:e}return e.scheme&&(e.scheme=String(e.scheme).replace(t.PCT_ENCODED,r).toLowerCase().replace(t.NOT_SCHEME,"")),void 0!==e.userinfo&&(e.userinfo=String(e.userinfo).replace(t.PCT_ENCODED,r).replace(t.NOT_USERINFO,O).replace(t.PCT_ENCODED,a)),void 0!==e.host&&(e.host=String(e.host).replace(t.PCT_ENCODED,r).toLowerCase().replace(t.NOT_HOST,O).replace(t.PCT_ENCODED,a)),void 0!==e.path&&(e.path=String(e.path).replace(t.PCT_ENCODED,r).replace(e.scheme?t.NOT_PATH:t.NOT_PATH_NOSCHEME,O).replace(t.PCT_ENCODED,a)),void 0!==e.query&&(e.query=String(e.query).replace(t.PCT_ENCODED,r).replace(t.NOT_QUERY,O).replace(t.PCT_ENCODED,a)),void 0!==e.fragment&&(e.fragment=String(e.fragment).replace(t.PCT_ENCODED,r).replace(t.NOT_FRAGMENT,O).replace(t.PCT_ENCODED,a)),e}function k(e){return e.replace(/^0*(.*)/,"$1")||"0"}function j(e,t){var r=e.match(t.IPV4ADDRESS)||[],n=u(r,2)[1];return n?n.split(".").map(k).join("."):e}function T(e,t){var r=e.match(t.IPV6ADDRESS)||[],n=u(r,3),a=n[1],i=n[2];if(a){for(var o=a.toLowerCase().split("::").reverse(),s=u(o,2),c=s[0],l=s[1],f=l?l.split(":").map(k):[],d=c.split(":").map(k),p=t.IPV4ADDRESS.test(d[d.length-1]),h=p?7:8,m=d.length-h,v=Array(h),y=0;y1){var I=v.slice(0,g.index),w=v.slice(g.index+g.length);b=I.join(":")+"::"+w.join(":")}else b=v.join(":");return i&&(b+="%"+i),b}return e}var A=/^(?:([^:\/?#]+):)?(?:\/\/((?:([^\/?#@]*)@)?(\[[^\/?#\]]+\]|[^\/?#:]*)(?:\:(\d*))?))?([^?#]*)(?:\?([^#]*))?(?:#((?:.|\n|\r)*))?/i,R=void 0==="".match(/(){0}/)[1];function M(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r={},n=!1!==t.iri?s:o;"suffix"===t.reference&&(e=(t.scheme?t.scheme+":":"")+"//"+e);var a=e.match(A);if(a){R?(r.scheme=a[1],r.userinfo=a[3],r.host=a[4],r.port=parseInt(a[5],10),r.path=a[6]||"",r.query=a[7],r.fragment=a[8],isNaN(r.port)&&(r.port=a[5])):(r.scheme=a[1]||void 0,r.userinfo=-1!==e.indexOf("@")?a[3]:void 0,r.host=-1!==e.indexOf("//")?a[4]:void 0,r.port=parseInt(a[5],10),r.path=a[6]||"",r.query=-1!==e.indexOf("?")?a[7]:void 0,r.fragment=-1!==e.indexOf("#")?a[8]:void 0,isNaN(r.port)&&(r.port=e.match(/\/\/(?:.|\n)*\:(?:\/|\?|\#|$)/)?a[4]:void 0)),r.host&&(r.host=T(j(r.host,n),n)),void 0!==r.scheme||void 0!==r.userinfo||void 0!==r.host||void 0!==r.port||r.path||void 0!==r.query?void 0===r.scheme?r.reference="relative":void 0===r.fragment?r.reference="absolute":r.reference="uri":r.reference="same-document",t.reference&&"suffix"!==t.reference&&t.reference!==r.reference&&(r.error=r.error||"URI is not a "+t.reference+" reference.");var i=E[(t.scheme||r.scheme||"").toLowerCase()];if(t.unicodeSupport||i&&i.unicodeSupport)_(r,n);else{if(r.host&&(t.domainHost||i&&i.domainHost))try{r.host=P(r.host.replace(n.PCT_ENCODED,x).toLowerCase())}catch(e){r.error=r.error||"Host's domain name can not be converted to ASCII via punycode: "+e}_(r,o)}i&&i.parse&&i.parse(r,t)}else r.error=r.error||"URI can not be parsed.";return r}function U(e,t){var r=!1!==t.iri?s:o,n=[];return void 0!==e.userinfo&&(n.push(e.userinfo),n.push("@")),void 0!==e.host&&n.push(T(j(String(e.host),r),r).replace(r.IPV6ADDRESS,(function(e,t,r){return"["+t+(r?"%25"+r:"")+"]"}))),"number"==typeof e.port&&(n.push(":"),n.push(e.port.toString(10))),n.length?n.join(""):void 0}var N=/^\.\.?\//,C=/^\/\.(\/|$)/,F=/^\/\.\.(\/|$)/,L=/^\/?(?:.|\n)*?(?=\/|$)/;function V(e){for(var t=[];e.length;)if(e.match(N))e=e.replace(N,"");else if(e.match(C))e=e.replace(C,"/");else if(e.match(F))e=e.replace(F,"/"),t.pop();else if("."===e||".."===e)e="";else{var r=e.match(L);if(!r)throw new Error("Unexpected dot segment condition");var n=r[0];e=e.slice(n.length),t.push(n)}return t.join("")}function q(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=t.iri?s:o,n=[],a=E[(t.scheme||e.scheme||"").toLowerCase()];if(a&&a.serialize&&a.serialize(e,t),e.host)if(r.IPV6ADDRESS.test(e.host));else if(t.domainHost||a&&a.domainHost)try{e.host=t.iri?D(e.host):P(e.host.replace(r.PCT_ENCODED,x).toLowerCase())}catch(r){e.error=e.error||"Host's domain name can not be converted to "+(t.iri?"Unicode":"ASCII")+" via punycode: "+r}_(e,r),"suffix"!==t.reference&&e.scheme&&(n.push(e.scheme),n.push(":"));var i=U(e,t);if(void 0!==i&&("suffix"!==t.reference&&n.push("//"),n.push(i),e.path&&"/"!==e.path.charAt(0)&&n.push("/")),void 0!==e.path){var u=e.path;t.absolutePath||a&&a.absolutePath||(u=V(u)),void 0===i&&(u=u.replace(/^\/\//,"/%2F")),n.push(u)}return void 0!==e.query&&(n.push("?"),n.push(e.query)),void 0!==e.fragment&&(n.push("#"),n.push(e.fragment)),n.join("")}function $(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=arguments[3],a={};return n||(e=M(q(e,r),r),t=M(q(t,r),r)),!(r=r||{}).tolerant&&t.scheme?(a.scheme=t.scheme,a.userinfo=t.userinfo,a.host=t.host,a.port=t.port,a.path=V(t.path||""),a.query=t.query):(void 0!==t.userinfo||void 0!==t.host||void 0!==t.port?(a.userinfo=t.userinfo,a.host=t.host,a.port=t.port,a.path=V(t.path||""),a.query=t.query):(t.path?("/"===t.path.charAt(0)?a.path=V(t.path):(void 0===e.userinfo&&void 0===e.host&&void 0===e.port||e.path?e.path?a.path=e.path.slice(0,e.path.lastIndexOf("/")+1)+t.path:a.path=t.path:a.path="/"+t.path,a.path=V(a.path)),a.query=t.query):(a.path=e.path,void 0!==t.query?a.query=t.query:a.query=e.query),a.userinfo=e.userinfo,a.host=e.host,a.port=e.port),a.scheme=e.scheme),a.fragment=t.fragment,a}function z(e,t){return e&&e.toString().replace(t&&t.iri?s.PCT_ENCODED:o.PCT_ENCODED,x)}var G={scheme:"http",domainHost:!0,parse:function(e,t){return e.host||(e.error=e.error||"HTTP URIs must have a host."),e},serialize:function(e,t){return e.port!==("https"!==String(e.scheme).toLowerCase()?80:443)&&""!==e.port||(e.port=void 0),e.path||(e.path="/"),e}},B={scheme:"https",domainHost:G.domainHost,parse:G.parse,serialize:G.serialize},H={},W="[A-Za-z0-9\\-\\.\\_\\~\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]",Q="[0-9A-Fa-f]",K=r(r("%[EFef]"+Q+"%"+Q+Q+"%"+Q+Q)+"|"+r("%[89A-Fa-f]"+Q+"%"+Q+Q)+"|"+r("%"+Q+Q)),J=t("[\\!\\$\\%\\'\\(\\)\\*\\+\\,\\-\\.0-9\\<\\>A-Z\\x5E-\\x7E]",'[\\"\\\\]'),Y=new RegExp(W,"g"),X=new RegExp(K,"g"),Z=new RegExp(t("[^]","[A-Za-z0-9\\!\\$\\%\\'\\*\\+\\-\\^\\_\\`\\{\\|\\}\\~]","[\\.]",'[\\"]',J),"g"),ee=new RegExp(t("[^]",W,"[\\!\\$\\'\\(\\)\\*\\+\\,\\;\\:\\@]"),"g"),te=ee;function re(e){var t=x(e);return t.match(Y)?t:e}var ne={scheme:"mailto",parse:function(e,t){var r=e,n=r.to=r.path?r.path.split(","):[];if(r.path=void 0,r.query){for(var a=!1,i={},o=r.query.split("&"),s=0,u=o.length;s=55296&&t<=56319&&a%\\^`{|}]|%[0-9a-f]{2})|\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?)*\})*$/i,l=/^(?:(?:http[s\u017F]?|ftp):\/\/)(?:(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+(?::(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?@)?(?:(?!10(?:\.[0-9]{1,3}){3})(?!127(?:\.[0-9]{1,3}){3})(?!169\.254(?:\.[0-9]{1,3}){2})(?!192\.168(?:\.[0-9]{1,3}){2})(?!172\.(?:1[6-9]|2[0-9]|3[01])(?:\.[0-9]{1,3}){2})(?:[1-9][0-9]?|1[0-9][0-9]|2[01][0-9]|22[0-3])(?:\.(?:1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])){2}(?:\.(?:[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-4]))|(?:(?:(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-?)*(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)(?:\.(?:(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-?)*(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)*(?:\.(?:(?:[KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]){2,})))(?::[0-9]{2,5})?(?:\/(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?$/i,f=/^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i,d=/^(?:\/(?:[^~/]|~0|~1)*)*$/,p=/^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i,h=/^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/;function m(e){return e="full"==e?"full":"fast",n.copy(m[e])}function v(e){var t=e.match(a);if(!t)return!1;var r=+t[1],n=+t[2],o=+t[3];return n>=1&&n<=12&&o>=1&&o<=(2==n&&function(e){return e%4==0&&(e%100!=0||e%400==0)}(r)?29:i[n])}function y(e,t){var r=e.match(o);if(!r)return!1;var n=r[1],a=r[2],i=r[3],s=r[5];return(n<=23&&a<=59&&i<=59||23==n&&59==a&&60==i)&&(!t||s)}e.exports=m,m.fast={date:/^\d\d\d\d-[0-1]\d-[0-3]\d$/,time:/^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i,"date-time":/^\d\d\d\d-[0-1]\d-[0-3]\d[t\s](?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i,uri:/^(?:[a-z][a-z0-9+-.]*:)(?:\/?\/)?[^\s]*$/i,"uri-reference":/^(?:(?:[a-z][a-z0-9+-.]*:)?\/?\/)?(?:[^\\\s#][^\s#]*)?(?:#[^\\\s]*)?$/i,"uri-template":c,url:l,email:/^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i,hostname:s,ipv4:/^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/,ipv6:/^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i,regex:w,uuid:f,"json-pointer":d,"json-pointer-uri-fragment":p,"relative-json-pointer":h},m.full={date:v,time:y,"date-time":function(e){var t=e.split(g);return 2==t.length&&v(t[0])&&y(t[1],!0)},uri:function(e){return b.test(e)&&u.test(e)},"uri-reference":/^(?:[a-z][a-z0-9+\-.]*:)?(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'"()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?(?:\?(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i,"uri-template":c,url:l,email:/^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i,hostname:s,ipv4:/^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/,ipv6:/^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i,regex:w,uuid:f,"json-pointer":d,"json-pointer-uri-fragment":p,"relative-json-pointer":h};var g=/t|\s/i;var b=/\/|:/;var I=/[^\\]\\Z/;function w(e){if(I.test(e))return!1;try{return new RegExp(e),!0}catch(e){return!1}}},function(e,t,r){"use strict";var n=r(242),a=r(24).toHash;e.exports=function(){var e=[{type:"number",rules:[{maximum:["exclusiveMaximum"]},{minimum:["exclusiveMinimum"]},"multipleOf","format"]},{type:"string",rules:["maxLength","minLength","pattern","format"]},{type:"array",rules:["maxItems","minItems","items","contains","uniqueItems"]},{type:"object",rules:["maxProperties","minProperties","required","dependencies","propertyNames",{properties:["additionalProperties","patternProperties"]}]},{rules:["$ref","const","enum","not","anyOf","oneOf","allOf","if"]}],t=["type","$comment"];return e.all=a(t),e.types=a(["number","integer","string","array","object","boolean","null"]),e.forEach((function(r){r.rules=r.rules.map((function(r){var a;if("object"==typeof r){var i=Object.keys(r)[0];a=r[i],r=i,a.forEach((function(r){t.push(r),e.all[r]=!0}))}return t.push(r),e.all[r]={keyword:r,code:n[r],implements:a}})),e.all.$comment={keyword:"$comment",code:n.$comment},r.type&&(e.types[r.type]=r)})),e.keywords=a(t.concat(["$schema","$id","id","$data","$async","title","description","default","definitions","examples","readOnly","writeOnly","contentMediaType","contentEncoding","additionalItems","then","else"])),e.custom={},e}},function(e,t,r){"use strict";e.exports={$ref:r(243),allOf:r(244),anyOf:r(245),$comment:r(246),const:r(247),contains:r(248),dependencies:r(249),enum:r(250),format:r(251),if:r(252),items:r(253),maximum:r(101),minimum:r(101),maxItems:r(102),minItems:r(102),maxLength:r(103),minLength:r(103),maxProperties:r(104),minProperties:r(104),multipleOf:r(254),not:r(255),oneOf:r(256),pattern:r(257),properties:r(258),propertyNames:r(259),required:r(260),uniqueItems:r(261),validate:r(100)}},function(e,t,r){"use strict";e.exports=function(e,t,r){var n,a,i=" ",o=e.level,s=e.dataLevel,u=e.schema[t],c=e.errSchemaPath+"/"+t,l=!e.opts.allErrors,f="data"+(s||""),d="valid"+o;if("#"==u||"#/"==u)e.isRoot?(n=e.async,a="validate"):(n=!0===e.root.schema.$async,a="root.refVal[0]");else{var p=e.resolveRef(e.baseId,u,e.isRoot);if(void 0===p){var h=e.MissingRefError.message(e.baseId,u);if("fail"==e.opts.missingRefs){e.logger.error(h),(g=g||[]).push(i),i="",!1!==e.createErrors?(i+=" { keyword: '$ref' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(c)+" , params: { ref: '"+e.util.escapeQuotes(u)+"' } ",!1!==e.opts.messages&&(i+=" , message: 'can\\'t resolve reference "+e.util.escapeQuotes(u)+"' "),e.opts.verbose&&(i+=" , schema: "+e.util.toQuotedString(u)+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+f+" "),i+=" } "):i+=" {} ";var m=i;i=g.pop(),!e.compositeRule&&l?e.async?i+=" throw new ValidationError(["+m+"]); ":i+=" validate.errors = ["+m+"]; return false; ":i+=" var err = "+m+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",l&&(i+=" if (false) { ")}else{if("ignore"!=e.opts.missingRefs)throw new e.MissingRefError(e.baseId,u,h);e.logger.warn(h),l&&(i+=" if (true) { ")}}else if(p.inline){var v=e.util.copy(e);v.level++;var y="valid"+v.level;v.schema=p.schema,v.schemaPath="",v.errSchemaPath=u,i+=" "+e.validate(v).replace(/validate\.schema/g,p.code)+" ",l&&(i+=" if ("+y+") { ")}else n=!0===p.$async||e.async&&!1!==p.$async,a=p.code}if(a){var g;(g=g||[]).push(i),i="",e.opts.passContext?i+=" "+a+".call(this, ":i+=" "+a+"( ",i+=" "+f+", (dataPath || '')",'""'!=e.errorPath&&(i+=" + "+e.errorPath);var b=i+=" , "+(s?"data"+(s-1||""):"parentData")+" , "+(s?e.dataPathArr[s]:"parentDataProperty")+", rootData) ";if(i=g.pop(),n){if(!e.async)throw new Error("async schema referenced by sync schema");l&&(i+=" var "+d+"; "),i+=" try { await "+b+"; ",l&&(i+=" "+d+" = true; "),i+=" } catch (e) { if (!(e instanceof ValidationError)) throw e; if (vErrors === null) vErrors = e.errors; else vErrors = vErrors.concat(e.errors); errors = vErrors.length; ",l&&(i+=" "+d+" = false; "),i+=" } ",l&&(i+=" if ("+d+") { ")}else i+=" if (!"+b+") { if (vErrors === null) vErrors = "+a+".errors; else vErrors = vErrors.concat("+a+".errors); errors = vErrors.length; } ",l&&(i+=" else { ")}return i}},function(e,t,r){"use strict";e.exports=function(e,t,r){var n=" ",a=e.schema[t],i=e.schemaPath+e.util.getProperty(t),o=e.errSchemaPath+"/"+t,s=!e.opts.allErrors,u=e.util.copy(e),c="";u.level++;var l="valid"+u.level,f=u.baseId,d=!0,p=a;if(p)for(var h,m=-1,v=p.length-1;m0:e.util.schemaHasRules(h,e.RULES.all))&&(d=!1,u.schema=h,u.schemaPath=i+"["+m+"]",u.errSchemaPath=o+"/"+m,n+=" "+e.validate(u)+" ",u.baseId=f,s&&(n+=" if ("+l+") { ",c+="}"));return s&&(n+=d?" if (true) { ":" "+c.slice(0,-1)+" "),n=e.util.cleanUpCode(n)}},function(e,t,r){"use strict";e.exports=function(e,t,r){var n=" ",a=e.level,i=e.dataLevel,o=e.schema[t],s=e.schemaPath+e.util.getProperty(t),u=e.errSchemaPath+"/"+t,c=!e.opts.allErrors,l="data"+(i||""),f="valid"+a,d="errs__"+a,p=e.util.copy(e),h="";p.level++;var m="valid"+p.level;if(o.every((function(t){return e.opts.strictKeywords?"object"==typeof t&&Object.keys(t).length>0:e.util.schemaHasRules(t,e.RULES.all)}))){var v=p.baseId;n+=" var "+d+" = errors; var "+f+" = false; ";var y=e.compositeRule;e.compositeRule=p.compositeRule=!0;var g=o;if(g)for(var b,I=-1,w=g.length-1;I0:e.util.schemaHasRules(o,e.RULES.all);if(n+="var "+d+" = errors;var "+f+";",b){var I=e.compositeRule;e.compositeRule=p.compositeRule=!0,p.schema=o,p.schemaPath=s,p.errSchemaPath=u,n+=" var "+h+" = false; for (var "+m+" = 0; "+m+" < "+l+".length; "+m+"++) { ",p.errorPath=e.util.getPathExpr(e.errorPath,m,e.opts.jsonPointers,!0);var w=l+"["+m+"]";p.dataPathArr[v]=m;var S=e.validate(p);p.baseId=g,e.util.varOccurences(S,y)<2?n+=" "+e.util.varReplace(S,y,w)+" ":n+=" var "+y+" = "+w+"; "+S+" ",n+=" if ("+h+") break; } ",e.compositeRule=p.compositeRule=I,n+=" if (!"+h+") {"}else n+=" if ("+l+".length == 0) {";var P=P||[];P.push(n),n="",!1!==e.createErrors?(n+=" { keyword: 'contains' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(u)+" , params: {} ",!1!==e.opts.messages&&(n+=" , message: 'should contain a valid item' "),e.opts.verbose&&(n+=" , schema: validate.schema"+s+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+l+" "),n+=" } "):n+=" {} ";var D=n;return n=P.pop(),!e.compositeRule&&c?e.async?n+=" throw new ValidationError(["+D+"]); ":n+=" validate.errors = ["+D+"]; return false; ":n+=" var err = "+D+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",n+=" } else { ",b&&(n+=" errors = "+d+"; if (vErrors !== null) { if ("+d+") vErrors.length = "+d+"; else vErrors = null; } "),e.opts.allErrors&&(n+=" } "),n=e.util.cleanUpCode(n)}},function(e,t,r){"use strict";e.exports=function(e,t,r){var n=" ",a=e.level,i=e.dataLevel,o=e.schema[t],s=e.schemaPath+e.util.getProperty(t),u=e.errSchemaPath+"/"+t,c=!e.opts.allErrors,l="data"+(i||""),f="errs__"+a,d=e.util.copy(e),p="";d.level++;var h="valid"+d.level,m={},v={},y=e.opts.ownProperties;for(w in o){var g=o[w],b=Array.isArray(g)?v:m;b[w]=g}n+="var "+f+" = errors;";var I=e.errorPath;for(var w in n+="var missing"+a+";",v)if((b=v[w]).length){if(n+=" if ( "+l+e.util.getProperty(w)+" !== undefined ",y&&(n+=" && Object.prototype.hasOwnProperty.call("+l+", '"+e.util.escapeQuotes(w)+"') "),c){n+=" && ( ";var S=b;if(S)for(var P=-1,D=S.length-1;P0:e.util.schemaHasRules(g,e.RULES.all))&&(n+=" "+h+" = true; if ( "+l+e.util.getProperty(w)+" !== undefined ",y&&(n+=" && Object.prototype.hasOwnProperty.call("+l+", '"+e.util.escapeQuotes(w)+"') "),n+=") { ",d.schema=g,d.schemaPath=s+e.util.getProperty(w),d.errSchemaPath=u+"/"+e.util.escapeFragment(w),n+=" "+e.validate(d)+" ",d.baseId=U,n+=" } ",c&&(n+=" if ("+h+") { ",p+="}"))}return c&&(n+=" "+p+" if ("+f+" == errors) {"),n=e.util.cleanUpCode(n)}},function(e,t,r){"use strict";e.exports=function(e,t,r){var n=" ",a=e.level,i=e.dataLevel,o=e.schema[t],s=e.schemaPath+e.util.getProperty(t),u=e.errSchemaPath+"/"+t,c=!e.opts.allErrors,l="data"+(i||""),f="valid"+a,d=e.opts.$data&&o&&o.$data;d&&(n+=" var schema"+a+" = "+e.util.getData(o.$data,i,e.dataPathArr)+"; ");var p="i"+a,h="schema"+a;d||(n+=" var "+h+" = validate.schema"+s+";"),n+="var "+f+";",d&&(n+=" if (schema"+a+" === undefined) "+f+" = true; else if (!Array.isArray(schema"+a+")) "+f+" = false; else {"),n+=f+" = false;for (var "+p+"=0; "+p+"<"+h+".length; "+p+"++) if (equal("+l+", "+h+"["+p+"])) { "+f+" = true; break; }",d&&(n+=" } "),n+=" if (!"+f+") { ";var m=m||[];m.push(n),n="",!1!==e.createErrors?(n+=" { keyword: 'enum' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(u)+" , params: { allowedValues: schema"+a+" } ",!1!==e.opts.messages&&(n+=" , message: 'should be equal to one of the allowed values' "),e.opts.verbose&&(n+=" , schema: validate.schema"+s+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+l+" "),n+=" } "):n+=" {} ";var v=n;return n=m.pop(),!e.compositeRule&&c?e.async?n+=" throw new ValidationError(["+v+"]); ":n+=" validate.errors = ["+v+"]; return false; ":n+=" var err = "+v+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",n+=" }",c&&(n+=" else { "),n}},function(e,t,r){"use strict";e.exports=function(e,t,r){var n=" ",a=e.level,i=e.dataLevel,o=e.schema[t],s=e.schemaPath+e.util.getProperty(t),u=e.errSchemaPath+"/"+t,c=!e.opts.allErrors,l="data"+(i||"");if(!1===e.opts.format)return c&&(n+=" if (true) { "),n;var f,d=e.opts.$data&&o&&o.$data;d?(n+=" var schema"+a+" = "+e.util.getData(o.$data,i,e.dataPathArr)+"; ",f="schema"+a):f=o;var p=e.opts.unknownFormats,h=Array.isArray(p);if(d){n+=" var "+(m="format"+a)+" = formats["+f+"]; var "+(v="isObject"+a)+" = typeof "+m+" == 'object' && !("+m+" instanceof RegExp) && "+m+".validate; var "+(y="formatType"+a)+" = "+v+" && "+m+".type || 'string'; if ("+v+") { ",e.async&&(n+=" var async"+a+" = "+m+".async; "),n+=" "+m+" = "+m+".validate; } if ( ",d&&(n+=" ("+f+" !== undefined && typeof "+f+" != 'string') || "),n+=" (","ignore"!=p&&(n+=" ("+f+" && !"+m+" ",h&&(n+=" && self._opts.unknownFormats.indexOf("+f+") == -1 "),n+=") || "),n+=" ("+m+" && "+y+" == '"+r+"' && !(typeof "+m+" == 'function' ? ",e.async?n+=" (async"+a+" ? await "+m+"("+l+") : "+m+"("+l+")) ":n+=" "+m+"("+l+") ",n+=" : "+m+".test("+l+"))))) {"}else{var m;if(!(m=e.formats[o])){if("ignore"==p)return e.logger.warn('unknown format "'+o+'" ignored in schema at path "'+e.errSchemaPath+'"'),c&&(n+=" if (true) { "),n;if(h&&p.indexOf(o)>=0)return c&&(n+=" if (true) { "),n;throw new Error('unknown format "'+o+'" is used in schema at path "'+e.errSchemaPath+'"')}var v,y=(v="object"==typeof m&&!(m instanceof RegExp)&&m.validate)&&m.type||"string";if(v){var g=!0===m.async;m=m.validate}if(y!=r)return c&&(n+=" if (true) { "),n;if(g){if(!e.async)throw new Error("async format in sync schema");n+=" if (!(await "+(b="formats"+e.util.getProperty(o)+".validate")+"("+l+"))) { "}else{n+=" if (! ";var b="formats"+e.util.getProperty(o);v&&(b+=".validate"),n+="function"==typeof m?" "+b+"("+l+") ":" "+b+".test("+l+") ",n+=") { "}}var I=I||[];I.push(n),n="",!1!==e.createErrors?(n+=" { keyword: 'format' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(u)+" , params: { format: ",n+=d?""+f:""+e.util.toQuotedString(o),n+=" } ",!1!==e.opts.messages&&(n+=" , message: 'should match format \"",n+=d?"' + "+f+" + '":""+e.util.escapeQuotes(o),n+="\"' "),e.opts.verbose&&(n+=" , schema: ",n+=d?"validate.schema"+s:""+e.util.toQuotedString(o),n+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+l+" "),n+=" } "):n+=" {} ";var w=n;return n=I.pop(),!e.compositeRule&&c?e.async?n+=" throw new ValidationError(["+w+"]); ":n+=" validate.errors = ["+w+"]; return false; ":n+=" var err = "+w+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",n+=" } ",c&&(n+=" else { "),n}},function(e,t,r){"use strict";e.exports=function(e,t,r){var n=" ",a=e.level,i=e.dataLevel,o=e.schema[t],s=e.schemaPath+e.util.getProperty(t),u=e.errSchemaPath+"/"+t,c=!e.opts.allErrors,l="data"+(i||""),f="valid"+a,d="errs__"+a,p=e.util.copy(e);p.level++;var h="valid"+p.level,m=e.schema.then,v=e.schema.else,y=void 0!==m&&(e.opts.strictKeywords?"object"==typeof m&&Object.keys(m).length>0:e.util.schemaHasRules(m,e.RULES.all)),g=void 0!==v&&(e.opts.strictKeywords?"object"==typeof v&&Object.keys(v).length>0:e.util.schemaHasRules(v,e.RULES.all)),b=p.baseId;if(y||g){var I;p.createErrors=!1,p.schema=o,p.schemaPath=s,p.errSchemaPath=u,n+=" var "+d+" = errors; var "+f+" = true; ";var w=e.compositeRule;e.compositeRule=p.compositeRule=!0,n+=" "+e.validate(p)+" ",p.baseId=b,p.createErrors=!0,n+=" errors = "+d+"; if (vErrors !== null) { if ("+d+") vErrors.length = "+d+"; else vErrors = null; } ",e.compositeRule=p.compositeRule=w,y?(n+=" if ("+h+") { ",p.schema=e.schema.then,p.schemaPath=e.schemaPath+".then",p.errSchemaPath=e.errSchemaPath+"/then",n+=" "+e.validate(p)+" ",p.baseId=b,n+=" "+f+" = "+h+"; ",y&&g?n+=" var "+(I="ifClause"+a)+" = 'then'; ":I="'then'",n+=" } ",g&&(n+=" else { ")):n+=" if (!"+h+") { ",g&&(p.schema=e.schema.else,p.schemaPath=e.schemaPath+".else",p.errSchemaPath=e.errSchemaPath+"/else",n+=" "+e.validate(p)+" ",p.baseId=b,n+=" "+f+" = "+h+"; ",y&&g?n+=" var "+(I="ifClause"+a)+" = 'else'; ":I="'else'",n+=" } "),n+=" if (!"+f+") { var err = ",!1!==e.createErrors?(n+=" { keyword: 'if' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(u)+" , params: { failingKeyword: "+I+" } ",!1!==e.opts.messages&&(n+=" , message: 'should match \"' + "+I+" + '\" schema' "),e.opts.verbose&&(n+=" , schema: validate.schema"+s+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+l+" "),n+=" } "):n+=" {} ",n+="; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",!e.compositeRule&&c&&(e.async?n+=" throw new ValidationError(vErrors); ":n+=" validate.errors = vErrors; return false; "),n+=" } ",c&&(n+=" else { "),n=e.util.cleanUpCode(n)}else c&&(n+=" if (true) { ");return n}},function(e,t,r){"use strict";e.exports=function(e,t,r){var n=" ",a=e.level,i=e.dataLevel,o=e.schema[t],s=e.schemaPath+e.util.getProperty(t),u=e.errSchemaPath+"/"+t,c=!e.opts.allErrors,l="data"+(i||""),f="valid"+a,d="errs__"+a,p=e.util.copy(e),h="";p.level++;var m="valid"+p.level,v="i"+a,y=p.dataLevel=e.dataLevel+1,g="data"+y,b=e.baseId;if(n+="var "+d+" = errors;var "+f+";",Array.isArray(o)){var I=e.schema.additionalItems;if(!1===I){n+=" "+f+" = "+l+".length <= "+o.length+"; ";var w=u;u=e.errSchemaPath+"/additionalItems",n+=" if (!"+f+") { ";var S=S||[];S.push(n),n="",!1!==e.createErrors?(n+=" { keyword: 'additionalItems' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(u)+" , params: { limit: "+o.length+" } ",!1!==e.opts.messages&&(n+=" , message: 'should NOT have more than "+o.length+" items' "),e.opts.verbose&&(n+=" , schema: false , parentSchema: validate.schema"+e.schemaPath+" , data: "+l+" "),n+=" } "):n+=" {} ";var P=n;n=S.pop(),!e.compositeRule&&c?e.async?n+=" throw new ValidationError(["+P+"]); ":n+=" validate.errors = ["+P+"]; return false; ":n+=" var err = "+P+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",n+=" } ",u=w,c&&(h+="}",n+=" else { ")}var D=o;if(D)for(var E,O=-1,x=D.length-1;O0:e.util.schemaHasRules(E,e.RULES.all)){n+=" "+m+" = true; if ("+l+".length > "+O+") { ";var _=l+"["+O+"]";p.schema=E,p.schemaPath=s+"["+O+"]",p.errSchemaPath=u+"/"+O,p.errorPath=e.util.getPathExpr(e.errorPath,O,e.opts.jsonPointers,!0),p.dataPathArr[y]=O;var k=e.validate(p);p.baseId=b,e.util.varOccurences(k,g)<2?n+=" "+e.util.varReplace(k,g,_)+" ":n+=" var "+g+" = "+_+"; "+k+" ",n+=" } ",c&&(n+=" if ("+m+") { ",h+="}")}if("object"==typeof I&&(e.opts.strictKeywords?"object"==typeof I&&Object.keys(I).length>0:e.util.schemaHasRules(I,e.RULES.all))){p.schema=I,p.schemaPath=e.schemaPath+".additionalItems",p.errSchemaPath=e.errSchemaPath+"/additionalItems",n+=" "+m+" = true; if ("+l+".length > "+o.length+") { for (var "+v+" = "+o.length+"; "+v+" < "+l+".length; "+v+"++) { ",p.errorPath=e.util.getPathExpr(e.errorPath,v,e.opts.jsonPointers,!0);_=l+"["+v+"]";p.dataPathArr[y]=v;k=e.validate(p);p.baseId=b,e.util.varOccurences(k,g)<2?n+=" "+e.util.varReplace(k,g,_)+" ":n+=" var "+g+" = "+_+"; "+k+" ",c&&(n+=" if (!"+m+") break; "),n+=" } } ",c&&(n+=" if ("+m+") { ",h+="}")}}else if(e.opts.strictKeywords?"object"==typeof o&&Object.keys(o).length>0:e.util.schemaHasRules(o,e.RULES.all)){p.schema=o,p.schemaPath=s,p.errSchemaPath=u,n+=" for (var "+v+" = 0; "+v+" < "+l+".length; "+v+"++) { ",p.errorPath=e.util.getPathExpr(e.errorPath,v,e.opts.jsonPointers,!0);_=l+"["+v+"]";p.dataPathArr[y]=v;k=e.validate(p);p.baseId=b,e.util.varOccurences(k,g)<2?n+=" "+e.util.varReplace(k,g,_)+" ":n+=" var "+g+" = "+_+"; "+k+" ",c&&(n+=" if (!"+m+") break; "),n+=" }"}return c&&(n+=" "+h+" if ("+d+" == errors) {"),n=e.util.cleanUpCode(n)}},function(e,t,r){"use strict";e.exports=function(e,t,r){var n,a=" ",i=e.level,o=e.dataLevel,s=e.schema[t],u=e.schemaPath+e.util.getProperty(t),c=e.errSchemaPath+"/"+t,l=!e.opts.allErrors,f="data"+(o||""),d=e.opts.$data&&s&&s.$data;d?(a+=" var schema"+i+" = "+e.util.getData(s.$data,o,e.dataPathArr)+"; ",n="schema"+i):n=s,a+="var division"+i+";if (",d&&(a+=" "+n+" !== undefined && ( typeof "+n+" != 'number' || "),a+=" (division"+i+" = "+f+" / "+n+", ",e.opts.multipleOfPrecision?a+=" Math.abs(Math.round(division"+i+") - division"+i+") > 1e-"+e.opts.multipleOfPrecision+" ":a+=" division"+i+" !== parseInt(division"+i+") ",a+=" ) ",d&&(a+=" ) "),a+=" ) { ";var p=p||[];p.push(a),a="",!1!==e.createErrors?(a+=" { keyword: 'multipleOf' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(c)+" , params: { multipleOf: "+n+" } ",!1!==e.opts.messages&&(a+=" , message: 'should be multiple of ",a+=d?"' + "+n:n+"'"),e.opts.verbose&&(a+=" , schema: ",a+=d?"validate.schema"+u:""+s,a+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+f+" "),a+=" } "):a+=" {} ";var h=a;return a=p.pop(),!e.compositeRule&&l?e.async?a+=" throw new ValidationError(["+h+"]); ":a+=" validate.errors = ["+h+"]; return false; ":a+=" var err = "+h+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+="} ",l&&(a+=" else { "),a}},function(e,t,r){"use strict";e.exports=function(e,t,r){var n=" ",a=e.level,i=e.dataLevel,o=e.schema[t],s=e.schemaPath+e.util.getProperty(t),u=e.errSchemaPath+"/"+t,c=!e.opts.allErrors,l="data"+(i||""),f="errs__"+a,d=e.util.copy(e);d.level++;var p="valid"+d.level;if(e.opts.strictKeywords?"object"==typeof o&&Object.keys(o).length>0:e.util.schemaHasRules(o,e.RULES.all)){d.schema=o,d.schemaPath=s,d.errSchemaPath=u,n+=" var "+f+" = errors; ";var h,m=e.compositeRule;e.compositeRule=d.compositeRule=!0,d.createErrors=!1,d.opts.allErrors&&(h=d.opts.allErrors,d.opts.allErrors=!1),n+=" "+e.validate(d)+" ",d.createErrors=!0,h&&(d.opts.allErrors=h),e.compositeRule=d.compositeRule=m,n+=" if ("+p+") { ";var v=v||[];v.push(n),n="",!1!==e.createErrors?(n+=" { keyword: 'not' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(u)+" , params: {} ",!1!==e.opts.messages&&(n+=" , message: 'should NOT be valid' "),e.opts.verbose&&(n+=" , schema: validate.schema"+s+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+l+" "),n+=" } "):n+=" {} ";var y=n;n=v.pop(),!e.compositeRule&&c?e.async?n+=" throw new ValidationError(["+y+"]); ":n+=" validate.errors = ["+y+"]; return false; ":n+=" var err = "+y+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",n+=" } else { errors = "+f+"; if (vErrors !== null) { if ("+f+") vErrors.length = "+f+"; else vErrors = null; } ",e.opts.allErrors&&(n+=" } ")}else n+=" var err = ",!1!==e.createErrors?(n+=" { keyword: 'not' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(u)+" , params: {} ",!1!==e.opts.messages&&(n+=" , message: 'should NOT be valid' "),e.opts.verbose&&(n+=" , schema: validate.schema"+s+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+l+" "),n+=" } "):n+=" {} ",n+="; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",c&&(n+=" if (false) { ");return n}},function(e,t,r){"use strict";e.exports=function(e,t,r){var n=" ",a=e.level,i=e.dataLevel,o=e.schema[t],s=e.schemaPath+e.util.getProperty(t),u=e.errSchemaPath+"/"+t,c=!e.opts.allErrors,l="data"+(i||""),f="valid"+a,d="errs__"+a,p=e.util.copy(e),h="";p.level++;var m="valid"+p.level,v=p.baseId,y="prevValid"+a,g="passingSchemas"+a;n+="var "+d+" = errors , "+y+" = false , "+f+" = false , "+g+" = null; ";var b=e.compositeRule;e.compositeRule=p.compositeRule=!0;var I=o;if(I)for(var w,S=-1,P=I.length-1;S0:e.util.schemaHasRules(w,e.RULES.all))?(p.schema=w,p.schemaPath=s+"["+S+"]",p.errSchemaPath=u+"/"+S,n+=" "+e.validate(p)+" ",p.baseId=v):n+=" var "+m+" = true; ",S&&(n+=" if ("+m+" && "+y+") { "+f+" = false; "+g+" = ["+g+", "+S+"]; } else { ",h+="}"),n+=" if ("+m+") { "+f+" = "+y+" = true; "+g+" = "+S+"; }";return e.compositeRule=p.compositeRule=b,n+=h+"if (!"+f+") { var err = ",!1!==e.createErrors?(n+=" { keyword: 'oneOf' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(u)+" , params: { passingSchemas: "+g+" } ",!1!==e.opts.messages&&(n+=" , message: 'should match exactly one schema in oneOf' "),e.opts.verbose&&(n+=" , schema: validate.schema"+s+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+l+" "),n+=" } "):n+=" {} ",n+="; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",!e.compositeRule&&c&&(e.async?n+=" throw new ValidationError(vErrors); ":n+=" validate.errors = vErrors; return false; "),n+="} else { errors = "+d+"; if (vErrors !== null) { if ("+d+") vErrors.length = "+d+"; else vErrors = null; }",e.opts.allErrors&&(n+=" } "),n}},function(e,t,r){"use strict";e.exports=function(e,t,r){var n,a=" ",i=e.level,o=e.dataLevel,s=e.schema[t],u=e.schemaPath+e.util.getProperty(t),c=e.errSchemaPath+"/"+t,l=!e.opts.allErrors,f="data"+(o||""),d=e.opts.$data&&s&&s.$data;d?(a+=" var schema"+i+" = "+e.util.getData(s.$data,o,e.dataPathArr)+"; ",n="schema"+i):n=s,a+="if ( ",d&&(a+=" ("+n+" !== undefined && typeof "+n+" != 'string') || "),a+=" !"+(d?"(new RegExp("+n+"))":e.usePattern(s))+".test("+f+") ) { ";var p=p||[];p.push(a),a="",!1!==e.createErrors?(a+=" { keyword: 'pattern' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(c)+" , params: { pattern: ",a+=d?""+n:""+e.util.toQuotedString(s),a+=" } ",!1!==e.opts.messages&&(a+=" , message: 'should match pattern \"",a+=d?"' + "+n+" + '":""+e.util.escapeQuotes(s),a+="\"' "),e.opts.verbose&&(a+=" , schema: ",a+=d?"validate.schema"+u:""+e.util.toQuotedString(s),a+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+f+" "),a+=" } "):a+=" {} ";var h=a;return a=p.pop(),!e.compositeRule&&l?e.async?a+=" throw new ValidationError(["+h+"]); ":a+=" validate.errors = ["+h+"]; return false; ":a+=" var err = "+h+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+="} ",l&&(a+=" else { "),a}},function(e,t,r){"use strict";e.exports=function(e,t,r){var n=" ",a=e.level,i=e.dataLevel,o=e.schema[t],s=e.schemaPath+e.util.getProperty(t),u=e.errSchemaPath+"/"+t,c=!e.opts.allErrors,l="data"+(i||""),f="errs__"+a,d=e.util.copy(e),p="";d.level++;var h="valid"+d.level,m="key"+a,v="idx"+a,y=d.dataLevel=e.dataLevel+1,g="data"+y,b="dataProperties"+a,I=Object.keys(o||{}),w=e.schema.patternProperties||{},S=Object.keys(w),P=e.schema.additionalProperties,D=I.length||S.length,E=!1===P,O="object"==typeof P&&Object.keys(P).length,x=e.opts.removeAdditional,_=E||O||x,k=e.opts.ownProperties,j=e.baseId,T=e.schema.required;if(T&&(!e.opts.$data||!T.$data)&&T.length8)n+=" || validate.schema"+s+".hasOwnProperty("+m+") ";else{var R=I;if(R)for(var M=-1,U=R.length-1;M0:e.util.schemaHasRules(Y,e.RULES.all)){var X=e.util.getProperty(Q),Z=(G=l+X,H&&void 0!==Y.default);d.schema=Y,d.schemaPath=s+X,d.errSchemaPath=u+"/"+e.util.escapeFragment(Q),d.errorPath=e.util.getPath(e.errorPath,Q,e.opts.jsonPointers),d.dataPathArr[y]=e.util.toQuotedString(Q);B=e.validate(d);if(d.baseId=j,e.util.varOccurences(B,g)<2){B=e.util.varReplace(B,g,G);var ee=G}else{ee=g;n+=" var "+g+" = "+G+"; "}if(Z)n+=" "+B+" ";else{if(A&&A[Q]){n+=" if ( "+ee+" === undefined ",k&&(n+=" || ! Object.prototype.hasOwnProperty.call("+l+", '"+e.util.escapeQuotes(Q)+"') "),n+=") { "+h+" = false; ";L=e.errorPath,q=u;var te,re=e.util.escapeQuotes(Q);e.opts._errorDataPathProperty&&(e.errorPath=e.util.getPath(L,Q,e.opts.jsonPointers)),u=e.errSchemaPath+"/required",(te=te||[]).push(n),n="",!1!==e.createErrors?(n+=" { keyword: 'required' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(u)+" , params: { missingProperty: '"+re+"' } ",!1!==e.opts.messages&&(n+=" , message: '",e.opts._errorDataPathProperty?n+="is a required property":n+="should have required property \\'"+re+"\\'",n+="' "),e.opts.verbose&&(n+=" , schema: validate.schema"+s+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+l+" "),n+=" } "):n+=" {} ";$=n;n=te.pop(),!e.compositeRule&&c?e.async?n+=" throw new ValidationError(["+$+"]); ":n+=" validate.errors = ["+$+"]; return false; ":n+=" var err = "+$+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",u=q,e.errorPath=L,n+=" } else { "}else c?(n+=" if ( "+ee+" === undefined ",k&&(n+=" || ! Object.prototype.hasOwnProperty.call("+l+", '"+e.util.escapeQuotes(Q)+"') "),n+=") { "+h+" = true; } else { "):(n+=" if ("+ee+" !== undefined ",k&&(n+=" && Object.prototype.hasOwnProperty.call("+l+", '"+e.util.escapeQuotes(Q)+"') "),n+=" ) { ");n+=" "+B+" } "}}c&&(n+=" if ("+h+") { ",p+="}")}}if(S.length){var ne=S;if(ne)for(var ae,ie=-1,oe=ne.length-1;ie0:e.util.schemaHasRules(Y,e.RULES.all)){d.schema=Y,d.schemaPath=e.schemaPath+".patternProperties"+e.util.getProperty(ae),d.errSchemaPath=e.errSchemaPath+"/patternProperties/"+e.util.escapeFragment(ae),n+=k?" "+b+" = "+b+" || Object.keys("+l+"); for (var "+v+"=0; "+v+"<"+b+".length; "+v+"++) { var "+m+" = "+b+"["+v+"]; ":" for (var "+m+" in "+l+") { ",n+=" if ("+e.usePattern(ae)+".test("+m+")) { ",d.errorPath=e.util.getPathExpr(e.errorPath,m,e.opts.jsonPointers);G=l+"["+m+"]";d.dataPathArr[y]=m;B=e.validate(d);d.baseId=j,e.util.varOccurences(B,g)<2?n+=" "+e.util.varReplace(B,g,G)+" ":n+=" var "+g+" = "+G+"; "+B+" ",c&&(n+=" if (!"+h+") break; "),n+=" } ",c&&(n+=" else "+h+" = true; "),n+=" } ",c&&(n+=" if ("+h+") { ",p+="}")}}}return c&&(n+=" "+p+" if ("+f+" == errors) {"),n=e.util.cleanUpCode(n)}},function(e,t,r){"use strict";e.exports=function(e,t,r){var n=" ",a=e.level,i=e.dataLevel,o=e.schema[t],s=e.schemaPath+e.util.getProperty(t),u=e.errSchemaPath+"/"+t,c=!e.opts.allErrors,l="data"+(i||""),f="errs__"+a,d=e.util.copy(e);d.level++;var p="valid"+d.level;if(n+="var "+f+" = errors;",e.opts.strictKeywords?"object"==typeof o&&Object.keys(o).length>0:e.util.schemaHasRules(o,e.RULES.all)){d.schema=o,d.schemaPath=s,d.errSchemaPath=u;var h="key"+a,m="idx"+a,v="i"+a,y="' + "+h+" + '",g="data"+(d.dataLevel=e.dataLevel+1),b="dataProperties"+a,I=e.opts.ownProperties,w=e.baseId;I&&(n+=" var "+b+" = undefined; "),n+=I?" "+b+" = "+b+" || Object.keys("+l+"); for (var "+m+"=0; "+m+"<"+b+".length; "+m+"++) { var "+h+" = "+b+"["+m+"]; ":" for (var "+h+" in "+l+") { ",n+=" var startErrs"+a+" = errors; ";var S=h,P=e.compositeRule;e.compositeRule=d.compositeRule=!0;var D=e.validate(d);d.baseId=w,e.util.varOccurences(D,g)<2?n+=" "+e.util.varReplace(D,g,S)+" ":n+=" var "+g+" = "+S+"; "+D+" ",e.compositeRule=d.compositeRule=P,n+=" if (!"+p+") { for (var "+v+"=startErrs"+a+"; "+v+"0:e.util.schemaHasRules(b,e.RULES.all))||(h[h.length]=v)}}else h=o;if(d||h.length){var I=e.errorPath,w=d||h.length>=e.opts.loopRequired,S=e.opts.ownProperties;if(c)if(n+=" var missing"+a+"; ",w){d||(n+=" var "+p+" = validate.schema"+s+"; ");var P="' + "+(k="schema"+a+"["+(O="i"+a)+"]")+" + '";e.opts._errorDataPathProperty&&(e.errorPath=e.util.getPathExpr(I,k,e.opts.jsonPointers)),n+=" var "+f+" = true; ",d&&(n+=" if (schema"+a+" === undefined) "+f+" = true; else if (!Array.isArray(schema"+a+")) "+f+" = false; else {"),n+=" for (var "+O+" = 0; "+O+" < "+p+".length; "+O+"++) { "+f+" = "+l+"["+p+"["+O+"]] !== undefined ",S&&(n+=" && Object.prototype.hasOwnProperty.call("+l+", "+p+"["+O+"]) "),n+="; if (!"+f+") break; } ",d&&(n+=" } "),n+=" if (!"+f+") { ",(_=_||[]).push(n),n="",!1!==e.createErrors?(n+=" { keyword: 'required' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(u)+" , params: { missingProperty: '"+P+"' } ",!1!==e.opts.messages&&(n+=" , message: '",e.opts._errorDataPathProperty?n+="is a required property":n+="should have required property \\'"+P+"\\'",n+="' "),e.opts.verbose&&(n+=" , schema: validate.schema"+s+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+l+" "),n+=" } "):n+=" {} ";var D=n;n=_.pop(),!e.compositeRule&&c?e.async?n+=" throw new ValidationError(["+D+"]); ":n+=" validate.errors = ["+D+"]; return false; ":n+=" var err = "+D+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",n+=" } else { "}else{n+=" if ( ";var E=h;if(E)for(var O=-1,x=E.length-1;O 1) { ";var h=e.schema.items&&e.schema.items.type,m=Array.isArray(h);if(!h||"object"==h||"array"==h||m&&(h.indexOf("object")>=0||h.indexOf("array")>=0))a+=" outer: for (;i--;) { for (j = i; j--;) { if (equal("+f+"[i], "+f+"[j])) { "+d+" = false; break outer; } } } ";else{a+=" var itemIndices = {}, item; for (;i--;) { var item = "+f+"[i]; ";var v="checkDataType"+(m?"s":"");a+=" if ("+e.util[v](h,"item",!0)+") continue; ",m&&(a+=" if (typeof item == 'string') item = '\"' + item; "),a+=" if (typeof itemIndices[item] == 'number') { "+d+" = false; j = itemIndices[item]; break; } itemIndices[item] = i; } "}a+=" } ",p&&(a+=" } "),a+=" if (!"+d+") { ";var y=y||[];y.push(a),a="",!1!==e.createErrors?(a+=" { keyword: 'uniqueItems' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(c)+" , params: { i: i, j: j } ",!1!==e.opts.messages&&(a+=" , message: 'should NOT have duplicate items (items ## ' + j + ' and ' + i + ' are identical)' "),e.opts.verbose&&(a+=" , schema: ",a+=p?"validate.schema"+u:""+s,a+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+f+" "),a+=" } "):a+=" {} ";var g=a;a=y.pop(),!e.compositeRule&&l?e.async?a+=" throw new ValidationError(["+g+"]); ":a+=" validate.errors = ["+g+"]; return false; ":a+=" var err = "+g+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+=" } ",l&&(a+=" else { ")}else l&&(a+=" if (true) { ");return a}},function(e,t,r){"use strict";var n=["multipleOf","maximum","exclusiveMaximum","minimum","exclusiveMinimum","maxLength","minLength","pattern","additionalItems","maxItems","minItems","uniqueItems","maxProperties","minProperties","required","additionalProperties","enum","format","const"];e.exports=function(e,t){for(var r=0;r1&&void 0!==arguments[1]?arguments[1]:{};if(e){var n=e.id;n||(n=Math.random().toString(36).substr(2,5),h.warn("Extension ID not set. Using random string ID: ".concat(n))),this.registeredExtensionIds.includes(n)?h.warn("Extension ID ".concat(n," has already been registered. Exiting before duplicating modules.")):(e.preRegistration&&e.preRegistration({servicesManager:this._servicesManager,commandsManager:this._commandsManager,appConfig:this._appConfig,configuration:r}),this.moduleTypeNames.forEach((function(a){var i=t._getExtensionModule(a,e,n,r);i&&(t._initSpecialModuleTypes(a,i),t.modules[a].push({extensionId:n,module:i}))})),this.registeredExtensionIds.push(n))}else h.warn("Attempting to register a null/undefined extension. Exiting early.")}},{key:"_getExtensionModule",value:function(e,t,r,n){var a,i="get".concat((a=e).charAt(0).toUpperCase()+a.substr(1)),o=t[i];if(o)try{var s=o({servicesManager:this._servicesManager,commandsManager:this._commandsManager,appConfig:this._appConfig,configuration:n});return s||h.warn("Null or undefined returned when registering the ".concat(i," module for the ").concat(r," extension")),s}catch(e){h.error("Exception thrown while trying to call ".concat(i," for the ").concat(r," extension"))}}},{key:"_initSpecialModuleTypes",value:function(e,t){switch(e){case"commandsModule":var r=t.definitions,n=t.defaultContext;if(!r||0===Object.keys(r).length)return void h.warn("Commands Module contains no command definitions");this._initCommandsModule(r,n)}}},{key:"_initCommandsModule",value:function(e){var t=this,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"VIEWER";this._commandsManager.getContext(r)||this._commandsManager.createContext(r),Object.keys(e).forEach((function(n){var a=e[n];a.context&&!t._commandsManager.getContext(a.context)&&t._commandsManager.createContext(a.context),t._commandsManager.registerCommand(a.context||r,n,a)}))}}]),e}();var v=function(){function e(){f()(this,e),this.services={},this.registeredServiceNames=[]}return p()(e,[{key:"registerService",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};e?e.name?this.registeredServiceNames.includes(e.name)?h.warn("Service name ".concat(e.name," has already been registered. Exiting before duplicating services.")):e.create?(this.services[e.name]=e.create({configuration:t}),this.registeredServiceNames.push(e.name)):h.warn("Service create factory function not defined. Exiting early."):h.warn("Service name not set. Exiting early."):h.warn("Attempting to register a null/undefined service. Exiting early.")}},{key:"registerServices",value:function(e){var t=this;e.forEach((function(e){if(Array.isArray(e)){var r=c()(e,2),n=r[0],a=r[1];t.registerService(n,a)}else t.registerService(e)}))}}]),e}(),y=[],g={name:"UINotificationService",hide:function(e){return b._hide({id:e})},show:function(e){var t=e.title,r=e.message,n=e.duration,a=void 0===n?5e3:n,i=e.position,o=void 0===i?"bottomRight":i,s=e.type,u=void 0===s?"info":s,c=e.autoClose,l=void 0===c||c;return b._show({title:t,message:r,duration:a,position:o,type:u,autoClose:l})},setServiceImplementation:function(e){var t=e.hide,r=e.show;t&&(b._hide=t);if(r)for(b._show=r;y.length>0;){var n=y.pop();b._show(n)}}},b={_hide:function(){return console.warn("hide() NOT IMPLEMENTED")},_show:function(e){y.push(e),console.warn("show() NOT IMPLEMENTED")}};var I={name:"UINotificationService",create:function(e){e.configuration;return g}},w={name:"UIModalService",hide:function(){return S._hide()},show:function(e){var t=e.content,r=void 0===t?null:t,n=e.contentProps,a=void 0===n?null:n,i=e.shouldCloseOnEsc,o=void 0!==i&&i,s=e.isOpen,u=void 0===s||s,c=e.closeButton,l=void 0===c||c,f=e.title,d=void 0===f?null:f,p=e.customClassName,h=void 0===p?null:p;return S._show({content:r,contentProps:a,shouldCloseOnEsc:o,isOpen:u,closeButton:l,title:d,customClassName:h})},setServiceImplementation:function(e){var t=e.hide,r=e.show;t&&(S._hide=t);r&&(S._show=r)}},S={_hide:function(){return console.warn("hide() NOT IMPLEMENTED")},_show:function(){return console.warn("show() NOT IMPLEMENTED")}};var P={name:"UIModalService",create:function(e){e.configuration;return w}},D={name:"UIDialogService",dismiss:function(e){var t=e.id;return E._dismiss({id:t})},dismissAll:function(){return E._dismissAll()},create:function(e){var t=e.id,r=e.content,n=e.contentProps,a=e.onStart,i=e.onDrag,o=e.onStop,s=e.centralize,u=void 0!==s&&s,c=e.preservePosition,l=void 0===c||c,f=e.isDraggable,d=void 0===f||f,p=e.showOverlay,h=void 0!==p&&p,m=e.defaultPosition;return E._create({id:t,content:r,contentProps:n,onStart:a,onDrag:i,onStop:o,centralize:u,preservePosition:l,isDraggable:d,showOverlay:h,defaultPosition:m})},setServiceImplementation:function(e){var t=e.dismiss,r=e.dismissAll,n=e.create;t&&(E._dismiss=t);r&&(E._dismissAll=r);n&&(E._create=n)}},E={_dismiss:function(){return console.warn("dismiss() NOT IMPLEMENTED")},_dismissAll:function(){return console.warn("dismissAll() NOT IMPLEMENTED")},_create:function(){return console.warn("create() NOT IMPLEMENTED")}};var O={name:"UIDialogService",create:function(e){e.configuration;return D}},x=r(4),_=r.n(x),k=function(){var e=function(){return Math.floor(65536*(1+Math.random())).toString(16).substring(1)};return e()+e()+"-"+e()+"-"+e()+"-"+e()+"-"+e()+e()+e()};function j(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}var T,A,R=["id","SOPInstanceUID","FrameOfReferenceUID","referenceSeriesUID","label","description","type","unit","area","points","source"],M={MEASUREMENT_UPDATED:"event::measurement_updated",MEASUREMENT_ADDED:"event::measurement_added"},U={POLYLINE:"value_type::polyline",POINT:"value_type::point",ELLIPSE:"value_type::ellipse",MULTIPOINT:"value_type::multipoint",CIRCLE:"value_type::circle"},N=function(){function e(){f()(this,e),this._arrayOfObjects=function(e){return Object.entries(e).map((function(e){return _()({},e[0],e[1])}))},this.sources={},this.mappings={},this.measurements={},this.listeners={},Object.defineProperty(this,"EVENTS",{value:M,writable:!1,enumerable:!0,configurable:!1}),Object.defineProperty(this,"VALUE_TYPES",{value:U,writable:!1,enumerable:!0,configurable:!1})}return p()(e,[{key:"getMeasurements",value:function(){var e=this,t=this._arrayOfObjects(this.measurements);return t&&t.map((function(t){return e.measurements[Object.keys(t)[0]]}))}},{key:"getMeasurement",value:function(e){var t=null,r=this.measurements[e];return r&&Object.keys(r).length>0&&(t=this.measurements[e]),t}},{key:"createSource",value:function(e,t){var r=this;if(e){if(t){var n=k(),a={id:n,name:e,version:t,addOrUpdate:function(e,t){return r.addOrUpdate(a,e,t)},getAnnotation:function(e,t){return r.getAnnotation(a,e,t)}};return h.info("New '".concat(e,"@").concat(t,"' source added.")),this.sources[n]=a,a}h.warn("Source version not provided. Exiting early.")}else h.warn("Source name not provided. Exiting early.")}},{key:"addMapping",value:function(e,t,r,n,a){if(this._isValidSource(e))if(r)if(t)if(n)if(a){var i={matchingCriteria:r,definition:t,toSourceSchema:n,toMeasurementSchema:a};Array.isArray(this.mappings[e.id])?this.mappings[e.id].push(i):this.mappings[e.id]=[i],h.info("New measurement mapping added to source '".concat(this._getSourceInfo(e),"'."))}else h.warn("Measurement mapping function not provided. Exiting early.");else h.warn("Source mapping function not provided. Exiting early.");else h.warn("Definition not provided. Exiting early.");else h.warn("Matching criteria not provided. Exiting early.");else h.warn("Invalid source. Exiting early.")}},{key:"getAnnotation",value:function(e,t,r){if(this._isValidSource(e))if(t){var n=this._getMappingByMeasurementSource(r,t);if(n)return n.toSourceSchema(a,t);var a=this.getMeasurement(r),i=this._getMatchingMapping(e,t,a);if(i)return h.info("Matching mapping found:",i),(0,i.toSourceSchema)(a,i.definition)}else h.warn("No source definition provided. Exiting early.");else h.warn("Invalid source. Exiting early.")}},{key:"addOrUpdate",value:function(e,t,r){if(this._isValidSource(e)){var n=this._getSourceInfo(e);if(!t)return console.log("TEST"),void h.warn("No source definition provided. Exiting early.");if(this._sourceHasMappings(e)){var a={};try{(a=(0,this.mappings[e.id].find((function(e){return e.definition===t})).toMeasurementSchema)(r)).source=e}catch(e){return void h.warn("Failed to map '".concat(n,"' measurement for definition ").concat(t,":"),e.message)}if(this._isValidMeasurement(a)){var i=r.id;i||(i=k(),h.warn("Measurement ID not found. Generating UID: ".concat(i)));var o=function(e){for(var t=1;t0,a=Array.isArray(this.listeners[e]);n&&a&&this.listeners[e].forEach((function(e){e.callback({source:t,measurement:r})}))}},{key:"_unsubscribe",value:function(e,t){if(this.listeners[e]){var r=this.listeners[e];Array.isArray(r)?this.listeners[e]=r.filter((function(e){return e.id!==t})):this.listeners[e]=void 0}}},{key:"_isValidMeasurement",value:function(e){return Object.keys(e).forEach((function(e){if(!R.includes(e))return h.warn("Invalid measurement key: ".concat(e)),!1})),!0}},{key:"_isValidEvent",value:function(e){return Object.values(this.EVENTS).includes(e)}}]),e}(),C={name:"MeasurementService",create:function(e){e.configuration;return new N}},F=r(9),L=r.n(F),V=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=t.getAppState,n=t.getActiveContexts;f()(this,e),this.contexts={},r&&n||h.warn("CommandsManager was instantiated without getAppState() or getActiveContexts()"),this._getAppState=r,this._getActiveContexts=n}return p()(e,[{key:"createContext",value:function(e){if(e)return this.contexts[e]?this.clearContext(e):void(this.contexts[e]={})}},{key:"getContext",value:function(e){var t=this.contexts[e];if(t)return t}},{key:"clearContext",value:function(e){e&&(this.contexts[e]={})}},{key:"registerCommand",value:function(e,t,r){if("object"===L()(r)){var n=this.getContext(e);n&&(n[t]=r)}}},{key:"getCommand",value:function(e,t){var r,n=this,a=[];if(t){var i=this.getContext(t);i&&a.push(i)}else{this._getActiveContexts().forEach((function(e){var t=n.getContext(e);t&&a.push(t)}))}if(0!==a.length)return a.forEach((function(t){t[e]&&(r=t[e])})),r}},{key:"runCommand",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2?arguments[2]:void 0,n=this.getCommand(e,r);if(n){var a=n.commandFn,i=n.storeContexts,o=void 0===i?[]:i,s=n.options,u={},c=this._getAppState();if(o.forEach((function(e){u[e]=c[e]})),u=Object.assign({},u,s,t),"function"==typeof a)return a(u);h.warn('No commandFn was defined for command "'.concat(e,'"'))}else h.warn('Command "'.concat(e,'" not found in current context'))}}]),e}(),q=r(10),$=r.n(q),z=r(42),G=r.n(z);!function(e){var t=[],r=null,n=[],a=!1,i=e.prototype.handleKey;function o(e,t,r){var o=this;if(o.recording)if("keydown"===r.type){1===e.length&&a&&u();for(var c=0;c0&&u();else i.apply(o,arguments)}function s(e){for(var t=0;t1&&1===t.length?-1:1===e.length&&t.length>1||e>t?1:-1})),e[t]=e[t].join("+")}(t),r(t)),t=[],r=null,n=[]}e.prototype.record=function(e){var t=this;t.recording=!0,r=function(){t.recording=!1,e.apply(t,arguments)}},e.prototype.stopRecord=function(){this.recording=!1},e.prototype.startRecording=function(){this.recording=!0},e.prototype.handleKey=function(){var e=this;o.apply(e,arguments)},e.init()}(G.a),T=G.a,A=T.prototype.stopCallback,T.prototype.stopCallback=function(e,t,r){return!!this.paused||A.call(this,e,t,r)},T.prototype.pause=function(){this.paused=!0},T.prototype.unpause=function(){this.paused=!1},T.init();var B=G.a;function H(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function W(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:[];try{var r=this._getValidDefinitions(t);r.forEach((function(t){return e.registerHotkeys(t)}))}catch(e){var n=this._servicesManager.services.UINotificationService;n.show({title:"Hotkeys Manager",message:"Erro while setting hotkeys",type:"error"})}}},{key:"setDefaultHotKeys",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=this._getValidDefinitions(e);this.hotkeyDefaults=t}},{key:"_getValidDefinitions",value:function(e){return Array.isArray(e)?$()(e):this._parseToArrayLike(e)}},{key:"_parseToArrayLike",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=W({},t);return Object.entries(r).map((function(t){return e._parseToHotKeyObj(t[0],t[1])}))}},{key:"_parseToHotKeyObj",value:function(e,t){return W({commandName:e},t)}},{key:"registerHotkeys",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.commandName,r=e.keys,n=e.label;if(t){var a=this.hotkeyDefinitions[t];if(a){var i=a.keys;this._unbindHotkeys(t,i),h.info("Unbinding ".concat(t," from ").concat(i))}this.hotkeyDefinitions[t]={keys:r,label:n},this._bindHotkeys(t,r),h.info("Binding ".concat(t," to ").concat(r))}else h.warn('No command was defined for hotkey "'.concat(r,'"'))}},{key:"restoreDefaultBindings",value:function(){this.setHotkeys(this.hotkeyDefaults)}},{key:"destroy",value:function(){this.hotkeyDefaults=[],this.hotkeyDefinitions={},B.reset()}},{key:"_bindHotkeys",value:function(e,t){var r=this;""===t||void 0===t||(t instanceof Array?t:[t]).forEach((function(t){return B.bind(t,(function(t){t.preventDefault(),t.stopPropagation(),r._commandsManager.runCommand(e,{evt:t})}))}))}},{key:"_unbindHotkeys",value:function(e,t){""!==t&&void 0!==t&&(t instanceof Array?t:[t]).forEach((function(e){return B.unbind(e)}))}}]),e}(),K=r(22),J=r.n(K),Y=r(6),X=r.n(Y),Z=r(8),ee=r.n(Z),te=r(3),re=r.n(te);var ne={userLoggedIn:function(){return!1},getUserId:function(){return null},getName:function(){return null},getAccessToken:function(){return null},login:function(){return new Promise((function(e,t){return t()}))},logout:function(){return new Promise((function(e,t){return t()}))},getData:function(e){return null},setData:function(e,t){return null}};var ae={getAttribute:function(e,t){return e&&e.Value&&e.Value.length?function(e){function t(e){var t=e.length;return 0==t?"0000":1==t?"000".concat(e):2==t?"00".concat(e):3==t?"0".concat(e):e}for(var r="",n=0;n0&&void 0!==arguments[0]?arguments[0]:{},t=e.requestOptions,r={},n=ne&&ne.getAccessToken&&ne.getAccessToken();return t&&t.auth?"function"==typeof t.auth?r.Authorization=t.auth(t):r.Authorization="Basic ".concat(btoa(t.auth)):n&&(r.Authorization=n),r},getModalities:function(e,t){if(!e&&!t)return{};var r=e||{vr:"CS",Value:[]};if(t){if(!r.vr||r.vr!==t.vr)return t;for(var n=0;n0}},{key:"isValidIndex",value:function(e){return"number"===L()(e)&&e>=0&&(0|e)===e}},{key:"isValidCallback",value:function(e){return"function"===L()(e)}}]),e}();function he(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}var me=function(e){X()(n,e);var t,r=(t=n,function(){var e,r=re()(t);if(he()){var n=re()(this).constructor;e=Reflect.construct(r,arguments,n)}else e=r.apply(this,arguments);return ee()(this,e)});function n(e,t){var a;return f()(this,n),a=r.call(this,e,t),Object.defineProperties(J()(a),{_imageId:{configurable:!0,enumerable:!1,writable:!0,value:null}}),a._definePublicProperties(),a}return p()(n,[{key:"_definePublicProperties",value:function(){Object.defineProperty(this,"SOPInstanceUID",{configurable:!1,enumerable:!1,get:function(){return this.getSOPInstanceUID()}})}},{key:"getStudyInstanceUID",value:function(){return this.getTagValue("StudyInstanceUID",null)}},{key:"getSeriesInstanceUID",value:function(){return this.getTagValue("SeriesInstanceUID",null)}},{key:"getSOPInstanceUID",value:function(){return this.getTagValue("SOPInstanceUID",null)}},{key:"getStringValue",value:function(e,t,r){var a=this.getTagValue(e,r);return"string"!==L()(a)&&"undefined"!==L()(a)&&(a=a.toString()),n.getIndexedValue(a,t,r)}},{key:"getFloatValue",value:function(e,t,r){var a=this.getTagValue(e,r);return(a=n.getIndexedValue(a,t,r))instanceof Array?(a.forEach((function(e,t){a[t]=parseFloat(e)})),a):"string"===L()(a)?parseFloat(a):a}},{key:"getIntValue",value:function(e,t,r){var a=this.getTagValue(e,r);return(a=n.getIndexedValue(a,t,r))instanceof Array?(a.forEach((function(e,t){a[t]=parseFloat(e)})),a):"string"===L()(a)?parseInt(a):a}},{key:"getTagValue",value:function(e,t){throw new ce("InstanceMetadata::getTagValue is not overriden. Please, override it in a specialized class. See OHIFInstanceMetadata for example")}},{key:"equals",value:function(e){return e===this||e instanceof n&&e.getSOPInstanceUID()===this.getSOPInstanceUID()}},{key:"tagExists",value:function(e){throw new ce("InstanceMetadata::tagExists is not overriden. Please, override it in a specialized class. See OHIFInstanceMetadata for example")}},{key:"getImageId",value:function(e){throw new ce("InstanceMetadata::getImageId is not overriden. Please, override it in a specialized class. See OHIFInstanceMetadata for example")}}],[{key:"getIndexedValue",value:function(e,t,r){var n=r;if("string"===L()(e)){var a=-1!==e.indexOf("\\");if(n=e,a){var i=e.split("\\");if(pe.isValidIndex(t)){var o=i[t];n="string"!==L()(o)?r:o}else n=i}}return n}}]),n}(pe);function ve(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}var ye=function(e){X()(n,e);var t,r=(t=n,function(){var e,r=re()(t);if(ve()){var n=re()(this).constructor;e=Reflect.construct(r,arguments,n)}else e=r.apply(this,arguments);return ee()(this,e)});function n(e,t){var a;return f()(this,n),a=r.call(this,e,t),Object.defineProperties(J()(a),{_seriesInstanceUID:{configurable:!0,enumerable:!1,writable:!0,value:null},_instances:{configurable:!1,enumerable:!1,writable:!1,value:[]},_firstInstance:{configurable:!1,enumerable:!1,writable:!0,value:null}}),a._definePublicProperties(),a}return p()(n,[{key:"_definePublicProperties",value:function(){Object.defineProperty(this,"seriesInstanceUID",{configurable:!1,enumerable:!1,get:function(){return this.getSeriesInstanceUID()}})}},{key:"getSeriesInstanceUID",value:function(){return this._seriesInstanceUID}},{key:"addInstance",value:function(e){var t=!1;return e instanceof me&&void 0===this.getInstanceByUID(e.getSOPInstanceUID())&&(this._instances.push(e),t=!0),t}},{key:"getFirstInstance",value:function(){var e=this._firstInstance;if(!(e instanceof me)){e=null;var t=this.getInstanceByIndex(0);t instanceof me&&(this._firstInstance=t,e=t)}return e}},{key:"getInstanceByIndex",value:function(e){var t;return pe.isValidIndex(e)&&(t=this._instances[e]),t}},{key:"getInstanceByUID",value:function(e){var t;return pe.isValidUID(e)&&(t=this._instances.find((function(t){return t.getSOPInstanceUID()===e}))),t}},{key:"getInstanceCount",value:function(){return this._instances.length}},{key:"forEachInstance",value:function(e){pe.isValidCallback(e)&&this._instances.forEach((function(t,r){e.call(null,t,r)}))}},{key:"indexOfInstance",value:function(e){return this._instances.indexOf(e)}},{key:"findInstance",value:function(e){if(pe.isValidCallback(e))return this._instances.find((function(t,r){return e.call(null,t,r)}))}},{key:"equals",value:function(e){return e===this||e instanceof n&&e.getSeriesInstanceUID()===this.getSeriesInstanceUID()}}]),n}(pe);function ge(e){return(ge="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function be(e,t){for(var r=0;r2&&void 0!==arguments[2]?arguments[2]:0;if(r+t.length>e.length)return!1;for(var n=r,a=0;a2&&void 0!==arguments[2]?arguments[2]:0,n=arguments.length>3?arguments[3]:void 0,a=e.length;n&&(a=Math.min(r+n,e.length));for(var i=r;i1&&void 0!==arguments[1]?arguments[1]:0,r=arguments.length>2?arguments[2]:void 0,n=r||e.length-t,a="",i=t;i1?e:e[0]},ke="application/dicom",je="application/dicom+json",Te="application/octet-stream",Ae="application/pdf";var Re={DICOMwebClient:function(){function e(t){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.baseURL=t.url,this.baseURL||console.error("no DICOMweb base url provided - calls will fail"),"username"in t&&(this.username=t.username,"password"in t||console.error("no password provided to authenticate with DICOMweb service"),this.password=t.password),"qidoURLPrefix"in t?(console.log("use URL prefix for QIDO-RS: ".concat(t.qidoURLPrefix)),this.qidoURL="".concat(this.baseURL,"/").concat(t.qidoURLPrefix)):this.qidoURL=this.baseURL,"wadoURLPrefix"in t?(console.log("use URL prefix for WADO-RS: ".concat(t.wadoURLPrefix)),this.wadoURL="".concat(this.baseURL,"/").concat(t.wadoURLPrefix)):this.wadoURL=this.baseURL,"stowURLPrefix"in t?(console.log("use URL prefix for STOW-RS: ".concat(t.stowURLPrefix)),this.stowURL="".concat(this.baseURL,"/").concat(t.stowURLPrefix)):this.stowURL=this.baseURL,this.headers=t.headers||{}}var t,r,n;return t=e,n=[{key:"_parseQueryParameters",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t="?";return Object.keys(e).forEach((function(r,n){0!==n&&(t+="&"),t+="".concat(r,"=").concat(encodeURIComponent(e[r]))})),t}},{key:"_assertMediaTypeIsValid",value:function(e){if(!e)throw new Error("Not a valid media type: ".concat(e));var t=e.indexOf("/");if(-1===t)throw new Error("Not a valid media type: ".concat(e));var r=e.slice(0,t);if(!["application","image","text","video"].includes(r))throw new Error("Not a valid media type: ".concat(e));if(e.slice(t+1).includes("/"))throw new Error("Not a valid media type: ".concat(e))}},{key:"_parseMediaType",value:function(t){return e._assertMediaTypeIsValid(t),t.split("/")}},{key:"_buildAcceptHeaderFieldValue",value:function(t,r){if(!Array.isArray(t))throw new Error("Acceptable media types must be provided as an Array");return t.map((function(t){var n=t.mediaType;if(e._assertMediaTypeIsValid(n),!r.includes(n))throw new Error("Media type ".concat(n," is not supported for requested resource"));return n})).join(", ")}},{key:"_buildMultipartAcceptHeaderFieldValue",value:function(t,r){if(!Array.isArray(t))throw new Error("Acceptable media types must be provided as an Array");if(!Array.isArray(r)&&!Ee(r))throw new Error("Supported media types must be provided as an Array or an Object");var n=[];return t.forEach((function(t){var a=t.transferSyntaxUID,i=t.mediaType;e._assertMediaTypeIsValid(i);var o='multipart/related; type="'.concat(i,'"');if(Ee(r)){if(!(Object.values(r).flat(1).includes(i)||i.endsWith("/*")&&i.endsWith("/")))throw new Error("Media type ".concat(i," is not supported for requested resource"));if(a){if("*"!==a){if(!Object.keys(r).includes(a))throw new Error("Transfer syntax ".concat(a," is not supported for requested resource"));var s=r[a];if(!s.includes(i)){var u=e._parseMediaType(i)[0];s.map((function(t){var r=e._parseMediaType(t)[0];if(u!==r||!i.endsWith("/*")&&!i.endsWith("/"))throw new Error("Transfer syntax ".concat(a," is not supported for requested resource"))}))}}o+="; transfer-syntax=".concat(a)}}else if(Array.isArray(r)&&!r.includes(i))throw new Error("Media type ".concat(i," is not supported for requested resource"));n.push(o)})),n.join(", ")}},{key:"_buildRangeHeaderFieldValue",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return 1===e.length?"bytes=".concat(e[0],"-"):2===e.length?"bytes=".concat(e[0],"-").concat(e[1]):"bytes=0-"}},{key:"_getCommonMediaType",value:function(t){if(!t||!t.length)throw new Error("No acceptable media types provided");var r=new Set;if(t.forEach((function(t){var n=t.mediaType;if(n.startsWith("application"))r.add(n);else{var a=e._parseMediaType(n)[0];r.add("".concat(a,"/"))}})),0===r.size)throw new Error("No common acceptable media type could be identified.");if(r.size>1)throw new Error("Acceptable media types must have the same type.");return Array.from(r)[0]}}],(r=[{key:"_httpRequest",value:function(e,t,r){var n=this,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};return new Promise((function(i,o){var s=new XMLHttpRequest;s.open(t,e,!0),"responseType"in a&&(s.responseType=a.responseType),"object"===ge(r)&&Object.keys(r).forEach((function(e){s.setRequestHeader(e,r[e])}));var u=n.headers;Object.keys(u).forEach((function(e){s.setRequestHeader(e,u[e])})),s.onloadstart=function(){},s.onloadend=function(){},s.onreadystatechange=function(){if(4===s.readyState)if(200===s.status)i(s.response);else if(202===s.status)console.warn("some resources already existed: ",s),i(s.response);else if(204===s.status)console.warn("empty response for request: ",s),i([]);else{console.error("request failed: ",s);var e=new Error("request failed");e.request=s,e.response=s.response,e.status=s.status,console.error(e),console.error(e.response),o(e)}},"progressCallback"in a&&"function"==typeof a.progressCallback&&(s.onprogress=a.progressCallback),"data"in a?s.send(a.data):s.send()}))}},{key:"_httpGet",value:function(e,t,r,n){return this._httpRequest(e,"get",t,{responseType:r,progressCallback:n})}},{key:"_httpGetApplicationJson",value:function(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2?arguments[2]:void 0,a=t;"object"===ge(r)&&(Oe(r)||(a+=e._parseQueryParameters(r)));var i={Accept:je},o="json";return this._httpGet(a,i,o,n)}},{key:"_httpGetApplicationPdf",value:function(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2?arguments[2]:void 0,a=t;"object"===ge(r)&&(Oe(r)||(a+=e._parseQueryParameters(r)));var i={Accept:Ae},o="json";return this._httpGet(a,i,o,n)}},{key:"_httpGetImage",value:function(t,r){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},a=arguments.length>3?arguments[3]:void 0,i=t;"object"===ge(n)&&(Oe(n)||(i+=e._parseQueryParameters(n)));var o=["image/","image/*","image/jpeg","image/jp2","image/gif","image/png"],s=e._buildAcceptHeaderFieldValue(r,o),u={Accept:s},c="arraybuffer";return this._httpGet(i,u,c,a)}},{key:"_httpGetText",value:function(t,r){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},a=arguments.length>3?arguments[3]:void 0,i=t;"object"===ge(n)&&(Oe(n)||(i+=e._parseQueryParameters(n)));var o=["text/","text/*","text/html","text/plain","text/rtf","text/xml"],s=e._buildAcceptHeaderFieldValue(r,o),u={Accept:s},c="arraybuffer";return this._httpGet(i,u,c,a)}},{key:"_httpGetVideo",value:function(t,r){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},a=arguments.length>3?arguments[3]:void 0,i=t;"object"===ge(n)&&(Oe(n)||(i+=e._parseQueryParameters(n)));var o=["video/","video/*","video/mpeg","video/mp4","video/H265"],s=e._buildAcceptHeaderFieldValue(r,o),u={Accept:s},c="arraybuffer";return this._httpGet(i,u,c,a)}},{key:"_httpGetMultipartImage",value:function(t,r,n,a){var i,o=arguments.length>4&&void 0!==arguments[4]&&arguments[4],s=arguments.length>5?arguments[5]:void 0,u={};return o?i=["image/jpeg","image/gif","image/png","image/jp2"]:(i={"1.2.840.10008.1.2.5":["image/x-dicom-rle"],"1.2.840.10008.1.2.4.50":["image/jpeg"],"1.2.840.10008.1.2.4.51":["image/jpeg"],"1.2.840.10008.1.2.4.57":["image/jpeg"],"1.2.840.10008.1.2.4.70":["image/jpeg"],"1.2.840.10008.1.2.4.80":["image/x-jls","image/jls"],"1.2.840.10008.1.2.4.81":["image/x-jls","image/jls"],"1.2.840.10008.1.2.4.90":["image/jp2"],"1.2.840.10008.1.2.4.91":["image/jp2"],"1.2.840.10008.1.2.4.92":["image/jpx"],"1.2.840.10008.1.2.4.93":["image/jpx"]},n&&(u.Range=e._buildRangeHeaderFieldValue(n))),u.Accept=e._buildMultipartAcceptHeaderFieldValue(r,i),this._httpGet(t,u,"arraybuffer",s).then(De)}},{key:"_httpGetMultipartVideo",value:function(t,r,n,a){var i,o=arguments.length>4&&void 0!==arguments[4]&&arguments[4],s=arguments.length>5?arguments[5]:void 0,u={};return o?i=["video/","video/*","video/mpeg2","video/mp4","video/H265"]:(i={"1.2.840.10008.1.2.4.100":["video/mpeg2"],"1.2.840.10008.1.2.4.101":["video/mpeg2"],"1.2.840.10008.1.2.4.102":["video/mp4"],"1.2.840.10008.1.2.4.103":["video/mp4"],"1.2.840.10008.1.2.4.104":["video/mp4"],"1.2.840.10008.1.2.4.105":["video/mp4"],"1.2.840.10008.1.2.4.106":["video/mp4"]},n&&(u.Range=e._buildRangeHeaderFieldValue(n))),u.Accept=e._buildMultipartAcceptHeaderFieldValue(r,i),this._httpGet(t,u,"arraybuffer",s).then(De)}},{key:"_httpGetMultipartApplicationDicom",value:function(t,r,n,a){var i={},o="application/dicom",s={"1.2.840.10008.1.2.1":[o],"1.2.840.10008.1.2.5":[o],"1.2.840.10008.1.2.4.50":[o],"1.2.840.10008.1.2.4.51":[o],"1.2.840.10008.1.2.4.57":[o],"1.2.840.10008.1.2.4.70":[o],"1.2.840.10008.1.2.4.80":[o],"1.2.840.10008.1.2.4.81":[o],"1.2.840.10008.1.2.4.90":[o],"1.2.840.10008.1.2.4.91":[o],"1.2.840.10008.1.2.4.92":[o],"1.2.840.10008.1.2.4.93":[o],"1.2.840.10008.1.2.4.100":[o],"1.2.840.10008.1.2.4.101":[o],"1.2.840.10008.1.2.4.102":[o],"1.2.840.10008.1.2.4.103":[o],"1.2.840.10008.1.2.4.104":[o],"1.2.840.10008.1.2.4.105":[o],"1.2.840.10008.1.2.4.106":[o]},u=r;return r||(u=[{mediaType:o}]),i.Accept=e._buildMultipartAcceptHeaderFieldValue(u,s),this._httpGet(t,i,"arraybuffer",a).then(De)}},{key:"_httpGetMultipartApplicationOctetStream",value:function(t,r,n,a,i){var o={},s={"1.2.840.10008.1.2.1":["application/octet-stream"]},u=r;return r||(u=[{mediaType:"application/octet-stream"}]),n&&(o.Range=e._buildRangeHeaderFieldValue(n)),o.Accept=e._buildMultipartAcceptHeaderFieldValue(u,s),this._httpGet(t,o,"arraybuffer",i).then(De)}},{key:"_httpPost",value:function(e,t,r,n){return this._httpRequest(e,"post",t,{data:r,progressCallback:n})}},{key:"_httpPostApplicationJson",value:function(e,t,r){var n={"Content-Type":je};return this._httpPost(e,n,t,r)}},{key:"searchForStudies",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};console.log("search for studies");var r="".concat(this.qidoURL,"/studies");return"queryParams"in t&&(r+=e._parseQueryParameters(t.queryParams)),this._httpGetApplicationJson(r)}},{key:"retrieveStudyMetadata",value:function(e){if(!("studyInstanceUID"in e))throw new Error("Study Instance UID is required for retrieval of study metadata");console.log("retrieve metadata of study ".concat(e.studyInstanceUID));var t="".concat(this.wadoURL,"/studies/").concat(e.studyInstanceUID,"/metadata");return this._httpGetApplicationJson(t)}},{key:"searchForSeries",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=this.qidoURL;return"studyInstanceUID"in t&&(console.log("search series of study ".concat(t.studyInstanceUID)),r+="/studies/".concat(t.studyInstanceUID)),r+="/series","queryParams"in t&&(r+=e._parseQueryParameters(t.queryParams)),this._httpGetApplicationJson(r)}},{key:"retrieveSeriesMetadata",value:function(e){if(!("studyInstanceUID"in e))throw new Error("Study Instance UID is required for retrieval of series metadata");if(!("seriesInstanceUID"in e))throw new Error("Series Instance UID is required for retrieval of series metadata");console.log("retrieve metadata of series ".concat(e.seriesInstanceUID));var t="".concat(this.wadoURL,"/studies/").concat(e.studyInstanceUID,"/series/").concat(e.seriesInstanceUID,"/metadata");return this._httpGetApplicationJson(t)}},{key:"searchForInstances",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=this.qidoURL;return"studyInstanceUID"in t?(r+="/studies/".concat(t.studyInstanceUID),"seriesInstanceUID"in t?(console.log("search for instances of series ".concat(t.seriesInstanceUID)),r+="/series/".concat(t.seriesInstanceUID)):console.log("search for instances of study ".concat(t.studyInstanceUID))):console.log("search for instances"),r+="/instances","queryParams"in t&&(r+=e._parseQueryParameters(t.queryParams)),this._httpGetApplicationJson(r)}},{key:"buildInstanceWadoURIUrl",value:function(e){if(!("studyInstanceUID"in e))throw new Error("Study Instance UID is required.");if(!("seriesInstanceUID"in e))throw new Error("Series Instance UID is required.");if(!("sopInstanceUID"in e))throw new Error("SOP Instance UID is required.");var t=e.contentType||ke,r=e.transferSyntax||"*",n=[];n.push("requestType=WADO"),n.push("studyUID=".concat(e.studyInstanceUID)),n.push("seriesUID=".concat(e.seriesInstanceUID)),n.push("objectUID=".concat(e.sopInstanceUID)),n.push("contentType=".concat(t)),n.push("transferSyntax=".concat(r));var a=n.join("&");return"".concat(this.wadoURL,"?").concat(a)}},{key:"retrieveInstanceMetadata",value:function(e){if(!("studyInstanceUID"in e))throw new Error("Study Instance UID is required for retrieval of instance metadata");if(!("seriesInstanceUID"in e))throw new Error("Series Instance UID is required for retrieval of instance metadata");if(!("sopInstanceUID"in e))throw new Error("SOP Instance UID is required for retrieval of instance metadata");console.log("retrieve metadata of instance ".concat(e.sopInstanceUID));var t="".concat(this.wadoURL,"/studies/").concat(e.studyInstanceUID,"/series/").concat(e.seriesInstanceUID,"/instances/").concat(e.sopInstanceUID,"/metadata");return this._httpGetApplicationJson(t)}},{key:"retrieveInstanceFrames",value:function(t){if(!("studyInstanceUID"in t))throw new Error("Study Instance UID is required for retrieval of instance frames");if(!("seriesInstanceUID"in t))throw new Error("Series Instance UID is required for retrieval of instance frames");if(!("sopInstanceUID"in t))throw new Error("SOP Instance UID is required for retrieval of instance frames");if(!("frameNumbers"in t))throw new Error("frame numbers are required for retrieval of instance frames");console.log("retrieve frames ".concat(t.frameNumbers.toString()," of instance ").concat(t.sopInstanceUID));var r="".concat(this.wadoURL,"/studies/").concat(t.studyInstanceUID,"/series/").concat(t.seriesInstanceUID,"/instances/").concat(t.sopInstanceUID,"/frames/").concat(t.frameNumbers.toString()),n=t.mediaTypes;if(!n)return this._httpGetMultipartApplicationOctetStream(r);var a=e._getCommonMediaType(n);if(a===Te)return this._httpGetMultipartApplicationOctetStream(r,n);if(a.startsWith("image"))return this._httpGetMultipartImage(r,n);if(a.startsWith("video"))return this._httpGetMultipartVideo(r,n);throw new Error("Media type ".concat(a," is not supported for retrieval of frames."))}},{key:"retrieveInstanceRendered",value:function(t){if(!("studyInstanceUID"in t))throw new Error("Study Instance UID is required for retrieval of rendered instance");if(!("seriesInstanceUID"in t))throw new Error("Series Instance UID is required for retrieval of rendered instance");if(!("sopInstanceUID"in t))throw new Error("SOP Instance UID is required for retrieval of rendered instance");var r="".concat(this.wadoURL,"/studies/").concat(t.studyInstanceUID,"/series/").concat(t.seriesInstanceUID,"/instances/").concat(t.sopInstanceUID,"/rendered"),n=t.mediaTypes,a=t.params;if(!n)return this._httpGet(r,{},"arraybuffer");var i=e._getCommonMediaType(n);if(i.startsWith("image"))return this._httpGetImage(r,n,a);if(i.startsWith("video"))return this._httpGetVideo(r,n,a);if(i.startsWith("text"))return this._httpGetText(r,n,a);if(i===Ae)return this._httpGetApplicationPdf(r,a);throw new Error("Media type ".concat(i," is not supported for retrieval of rendered instance."))}},{key:"retrieveInstanceFramesRendered",value:function(t){if(!("studyInstanceUID"in t))throw new Error("Study Instance UID is required for retrieval of rendered instance frames");if(!("seriesInstanceUID"in t))throw new Error("Series Instance UID is required for retrieval of rendered instance frames");if(!("sopInstanceUID"in t))throw new Error("SOP Instance UID is required for retrieval of rendered instance frames");if(!("frameNumbers"in t))throw new Error("frame numbers are required for retrieval of rendered instance frames");console.debug("retrieve rendered frames ".concat(t.frameNumbers.toString()," of instance ").concat(t.sopInstanceUID));var r="".concat(this.wadoURL,"/studies/").concat(t.studyInstanceUID,"/series/").concat(t.seriesInstanceUID,"/instances/").concat(t.sopInstanceUID,"/frames/").concat(t.frameNumbers.toString(),"/rendered"),n=t.mediaTypes;if(!n)return this._httpGet(r,{},"arraybuffer");var a=e._getCommonMediaType(n);if(a.startsWith("image"))return this._httpGetImage(r,n);if(a.startsWith("video"))return this._httpGetVideo(r,n);throw new Error("Media type ".concat(a," is not supported for retrieval of rendered frame."))}},{key:"retrieveInstance",value:function(t){if(!("studyInstanceUID"in t))throw new Error("Study Instance UID is required");if(!("seriesInstanceUID"in t))throw new Error("Series Instance UID is required");if(!("sopInstanceUID"in t))throw new Error("SOP Instance UID is required");var r="".concat(this.wadoURL,"/studies/").concat(t.studyInstanceUID,"/series/").concat(t.seriesInstanceUID,"/instances/").concat(t.sopInstanceUID),n=t.mediaTypes;if(!n)return this._httpGetMultipartApplicationDicom(r).then(xe);var a=e._getCommonMediaType(n);if(a===ke)return this._httpGetMultipartApplicationDicom(r,n).then(xe);if(a===Te)return this._httpGetMultipartApplicationOctetStream(r,n).then(xe);if(a.startsWith("image"))return this._httpGetMultipartImage(r,n).then(_e);if(a.startsWith("video"))return this._httpGetMultipartVideo(r,n).then(_e);throw new Error("Media type ".concat(a," is not supported for retrieval of instance."))}},{key:"retrieveSeries",value:function(t){if(!("studyInstanceUID"in t))throw new Error("Study Instance UID is required");if(!("seriesInstanceUID"in t))throw new Error("Series Instance UID is required");var r="".concat(this.wadoURL,"/studies/").concat(t.studyInstanceUID,"/series/").concat(t.seriesInstanceUID),n=t.mediaTypes;if(!n)return this._httpGetMultipartApplicationDicom(r);var a=e._getCommonMediaType(n);if(a===ke)return this._httpGetMultipartApplicationDicom(r,n);if(a===Te)return this._httpGetMultipartApplicationOctetStream(r,n);if(a.startsWith("image"))return this._httpGetMultipartImage(r,n);if(a.startsWith("video"))return this._httpGetMultipartVideo(r,n);throw new Error("Media type ".concat(a," is not supported for retrieval of series."))}},{key:"retrieveStudy",value:function(t){if(!("studyInstanceUID"in t))throw new Error("Study Instance UID is required");var r="".concat(this.wadoURL,"/studies/").concat(t.studyInstanceUID),n=t.mediaTypes;if(!n)return this._httpGetMultipartApplicationDicom(r);var a=e._getCommonMediaType(n);if(a===ke)return this._httpGetMultipartApplicationDicom(r,n);if(a===Te)return this._httpGetMultipartApplicationOctetStream(r,n);if(a.startsWith("image"))return this._httpGetMultipartImage(r,n);if(a.startsWith("video"))return this._httpGetMultipartVideo(r,n);throw new Error("Media type ".concat(a," is not supported for retrieval of study."))}},{key:"retrieveBulkData",value:function(t){if(!("BulkDataURI"in t))throw new Error("BulkDataURI is required.");var r=t.BulkDataURI,n=t.mediaTypes,a=t.byteRange;if(!n)return this._httpGetMultipartApplicationOctetStream(r,n,a);var i=e._getCommonMediaType(n);if(i===Te)return this._httpGetMultipartApplicationOctetStream(r,n,a);if(i.startsWith("image"))return this._httpGetMultipartImage(r,n,a);throw new Error("Media type ".concat(i," is not supported for retrieval of bulk data."))}},{key:"storeInstances",value:function(e){if(!("datasets"in e))throw new Error("datasets are required for storing");var t="".concat(this.stowURL,"/studies");"studyInstanceUID"in e&&(t+="/".concat(e.studyInstanceUID));var r=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Pe(),r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"application/dicom",n="Content-Type: ".concat(r),a="\r\n--".concat(t,"\r\n").concat(n,"\r\n\r\n"),i="\r\n--".concat(t,"--"),o=Ie(a),s=Ie(i),u=o.length,c=s.length,l=0,f=e.map((function(e){var t=new Uint8Array(e),r=t.length;return l+=u+r+c,t})),d=new Uint8Array(l);d.set(o,0);var p=0;return f.forEach((function(e){d.set(o,p),d.set(e,p+u),p+=u+e.length})),d.set(s,p),{data:d.buffer,boundary:t}}(e.datasets),n=r.data,a=r.boundary,i={"Content-Type":"multipart/related; type=application/dicom; boundary=".concat(a)};return this._httpPost(t,i,n,e.progressCallback)}}])&&be(t.prototype,r),n&&be(t,n),e}()},Me=["1.2.840.10008.5.1.4.1.1.1","1.2.840.10008.5.1.4.1.1.1.1","1.2.840.10008.5.1.4.1.1.1.1.1","1.2.840.10008.5.1.4.1.1.1.2","1.2.840.10008.5.1.4.1.1.1.2.1","1.2.840.10008.5.1.4.1.1.1.3","1.2.840.10008.5.1.4.1.1.1.3.1","1.2.840.10008.5.1.4.1.1.2","1.2.840.10008.5.1.4.1.1.2.1","1.2.840.10008.5.1.4.1.1.2.2","1.2.840.10008.5.1.4.1.1.3.1","1.2.840.10008.5.1.4.1.1.4","1.2.840.10008.5.1.4.1.1.4.1","1.2.840.10008.5.1.4.1.1.4.3","1.2.840.10008.5.1.4.1.1.4.4","1.2.840.10008.5.1.4.1.1.6.1","1.2.840.10008.5.1.4.1.1.7","1.2.840.10008.5.1.4.1.1.7.1","1.2.840.10008.5.1.4.1.1.7.2","1.2.840.10008.5.1.4.1.1.7.3","1.2.840.10008.5.1.4.1.1.7.4","1.2.840.10008.5.1.4.1.1.12.1","1.2.840.10008.5.1.4.1.1.12.1.1","1.2.840.10008.5.1.4.1.1.12.2","1.2.840.10008.5.1.4.1.1.12.2.1","1.2.840.10008.5.1.4.1.1.13.1.1","1.2.840.10008.5.1.4.1.1.13.1.2","1.2.840.10008.5.1.4.1.1.13.1.3","1.2.840.10008.5.1.4.1.1.13.1.4","1.2.840.10008.5.1.4.1.1.13.1.5","1.2.840.10008.5.1.4.1.1.14.1","1.2.840.10008.5.1.4.1.1.14.2","1.2.840.10008.5.1.4.1.1.20","1.2.840.10008.5.1.4.1.1.77.1.1","1.2.840.10008.5.1.4.1.1.77.1.1.1","1.2.840.10008.5.1.4.1.1.77.1.2","1.2.840.10008.5.1.4.1.1.77.1.2.1","1.2.840.10008.5.1.4.1.1.77.1.3","1.2.840.10008.5.1.4.1.1.77.1.4","1.2.840.10008.5.1.4.1.1.77.1.4.1","1.2.840.10008.5.1.4.1.1.77.1.5.1","1.2.840.10008.5.1.4.1.1.77.1.5.2","1.2.840.10008.5.1.4.1.1.77.1.5.4","1.2.840.10008.5.1.4.1.1.77.1.6","1.2.840.10008.5.1.4.1.1.128","1.2.840.10008.5.1.4.1.1.130","1.2.840.10008.5.1.4.1.1.128.1","1.2.840.10008.5.1.4.1.1.481.1"],Ue=function(e){return!!e&&-1!==Me.indexOf(e)};function Ne(e){if(!e.length)return{value:!1};var t=e[0].getData().metadata,r=t.Modality,n=t.NumberOfFrames>1;return Le.includes(r)&&(n||1!==e.length)?n?(e[0],{value:!1}):function(e){for(var t=e[0].getData().metadata,r=t.Rows,n=t.Columns,a=t.SamplesPerPixel,i=t.ImageOrientationPatient,o=t.ImagePositionPatient,s=1;s2){var p=e[e.length-1].getData().metadata.ImagePositionPatient;if(!o||!p)return{value:!1}}return{value:!0,missingFrames:0}}(e):{value:!1}}function Ce(e,t){if(void 0!==e&&void 0!==!t)return Math.abs(e[0]-t[0])0?(d!==e.length-1&&(f[d]=v),f[d-1]=(t=Math.abs(v-f[d-1]),+(Math.round(t+"e+2")+"e-2"))):f.push(v)}var y=function(e){var t=$()(new Set(e)),r=new Array(t.length).fill(0),n=0,a=1/0;e.forEach((function(e){e>n&&(n=e),e0)){var a=new de([]),i=t.getData();return a.setAttributes({displaySetInstanceUID:a.uid,SeriesInstanceUID:i.SeriesInstanceUID,SeriesDescription:i.SeriesDescription,SeriesNumber:i.SeriesNumber,Modality:i.Modality,combinedId:t.combinedId}),n.push(a),n}var o=function(e){var t=new Set;return e.forEachInstance((function(e){var r=e.getTagValue("SOPClassUID");t.add(r)})),Array.from(t)}(t);if(e&&e.length>0){var s=function(e,t,r,n){if(1!==n.length)return void console.warn("getDisplaySetFromSopClassPlugin: More than one SOPClassUID in the same series is not yet supported.");var a=n[0],i=e.map((function(e){return e.module})).filter((function(e){return e.sopClassUIDs.includes(a)}));if(!i||!i.length)return;var o=i[0],s=ae.getAuthorizationHeader(),u=$e.getHTTPErrorHandler(),c=new He({url:r.getData().wadoRoot,headers:s,errorInterceptor:u}),l=o.getDisplaySetFromSeries(t,r,c,s);if(l&&!l.Modality){var f=t.getFirstInstance();l.Modality=f.getTagValue("Modality")}return l}(e,t,r,o);if(s)return s.sopClassModule=!0,s.isDerived?this._addDerivedDisplaySet(s):n.push(s),s.combinedId=t.combinedId,n}var u=[];if(t.forEachInstance((function(e){var a;(Ue(e.getTagValue("SOPClassUID"))||e.getTagValue("Rows"))&&(We(e)?((a=Qe(t,[e])).setAttributes({sopClassUIDs:o,isClip:!0,SeriesInstanceUID:t.getSeriesInstanceUID(),StudyInstanceUID:r.getStudyInstanceUID(),numImageFrames:e.getTagValue("NumberOfFrames"),InstanceNumber:e.getTagValue("InstanceNumber"),AcquisitionDatetime:e.getTagValue("AcquisitionDateTime")}),n.push(a)):Ke(e.Modality)?((a=Qe(t,[e])).setAttributes({sopClassUIDs:o,StudyInstanceUID:r.getStudyInstanceUID(),SeriesInstanceUID:t.getSeriesInstanceUID(),InstanceNumber:e.getTagValue("InstanceNumber"),AcquisitionDatetime:e.getTagValue("AcquisitionDateTime")}),n.push(a)):u.push(e))})),u.length){var c=Qe(t,u);c.setAttribute("StudyInstanceUID",r.getStudyInstanceUID()),c.setAttributes({sopClassUIDs:o}),n.push(c)}return n}},{key:"_addDerivedDisplaySet",value:function(e){this._derivedDisplaySets.push(e)}},{key:"_addDerivedDisplaySets",value:function(e){var t=this;e.map((function(e){return t._derivedDisplaySets.push(e)}))}},{key:"getDerivedDatasets",value:function(e){var t=e.Modality,r=e.referencedSeriesInstanceUID,n=e.referencedFrameOfReferenceUID,a=this._derivedDisplaySets;return t&&(a=a.filter((function(e){return e.Modality===t}))),r&&(a=a.filter((function(e){return!!e.metadata.ReferencedSeriesSequence&&(Array.isArray(e.metadata.ReferencedSeriesSequence)?e.metadata.ReferencedSeriesSequence:[e.metadata.ReferencedSeriesSequence]).some((function(e){return e.SeriesInstanceUID===r}))}))),n&&(a=a.filter((function(e){return e.ReferencedFrameOfReferenceUID===n}))),a}},{key:"createDisplaySets",value:function(e){var t=this,r=[];return this.getSeriesCount()?(this.forEachSeries((function(n){var a=t._createDisplaySetsForSeries(e,n);r.push.apply(r,$()(a))})),Ye(r)):r}},{key:"sortDisplaySets",value:function(){Ye(this._displaySets)}},{key:"createAndAddDisplaySetsForSeries",value:function(e,t){var r=this;if(!this.containsSeries(t))return!1;for(var n=this._createDisplaySetsForSeries(e,t),a=this._displaySets.length-1;a>=0;a--){this._displaySets[a].combinedId===t.combinedId&&this._displaySets.splice(a,1)}return n.forEach((function(e){r.addDisplaySet(e)})),this.sortDisplaySets(),!0}},{key:"setDisplaySets",value:function(e){var t=this;Array.isArray(e)&&e.length>0&&(this._displaySets.splice(0),e.forEach((function(e){return t.addDisplaySet(e)})),this.sortDisplaySets())}},{key:"addDisplaySet",value:function(e){return!!(e instanceof de||e.sopClassModule)&&(this._displaySets.push(e),!0)}},{key:"forEachDisplaySet",value:function(e){pe.isValidCallback(e)&&this._displaySets.forEach((function(t,r){e.call(null,t,r)}))}},{key:"findDisplaySet",value:function(e){if(pe.isValidCallback(e))return this._displaySets.find((function(t,r){return e.call(null,t,r)}))}},{key:"getDisplaySetCount",value:function(){return this._displaySets.length}},{key:"getStudyInstanceUID",value:function(){return this._studyInstanceUID}},{key:"getSeries",value:function(){return this._series.slice()}},{key:"addSeries",value:function(e){var t=!1;return e instanceof ye&&(void 0===this.getSeriesByUID(e.getSeriesInstanceUID())||e.isSubSeries())&&(this._series.push(e),t=!0),t}},{key:"updateSeries",value:function(e,t){var r=this.getSeriesIndexByCustomId(t.getCustomSeriesInstanceUID());if(!(t instanceof ye))throw new Error("Series must be an instance of SeriesMetadata");return this._series[r]=t,!0}},{key:"getSeriesByIndex",value:function(e){var t;return pe.isValidIndex(e)&&(t=this._series[e]),t}},{key:"getSeriesByUID",value:function(e){var t;return pe.isValidUID(e)&&(t=this._series.find((function(t){return t.getSeriesInstanceUID()===e}))),t}},{key:"containsSeries",value:function(e){return e instanceof ye&&this._series.indexOf(e)>=0}},{key:"getSeriesCount",value:function(){return this._series.length}},{key:"getInstanceCount",value:function(){return this._series.reduce((function(e,t){return e+t.getInstanceCount()}),0)}},{key:"forEachSeries",value:function(e){pe.isValidCallback(e)&&this._series.forEach((function(t,r){e.call(null,t,r)}))}},{key:"indexOfSeries",value:function(e){return this._series.indexOf(e)}},{key:"sortSeriesByDisplaySets",value:function(){var e=this,t={};this.forEachDisplaySet((function(e,r){if(!(e instanceof de))throw new ce("StudyMetadata::sortSeriesByDisplaySets display set at index ".concat(r," is not an instance of ImageSet"));void 0===t[e.SeriesInstanceUID]&&(t[e.SeriesInstanceUID]=r)})),this.getSeries().forEach((function(r,n){if(!(r instanceof ye))throw new ce("StudyMetadata::sortSeriesByDisplaySets series at index ".concat(n," is not an instance of SeriesMetadata"));var a=t[r.getSeriesInstanceUID()];e._series[a]=r}))}},{key:"equals",value:function(e){return e===this||e instanceof n&&e.getStudyInstanceUID()===this.getStudyInstanceUID()}},{key:"getFirstSeries",value:function(){var e=this._firstSeries;if(!(e instanceof ye)){e=null;var t=this.getSeriesByIndex(0);t instanceof ye&&(this._firstSeries=t,e=t)}return e}},{key:"getFirstImageId",value:function(e){try{return this.findDisplaySet((function(t){return t.displaySetInstanceUID===e})).images[0].getImageId()}catch(e){return console.error("Failed to retrieve image metadata"),null}}},{key:"getFirstInstance",value:function(){var e=this._firstInstance;if(!(e instanceof me)){e=null;var t=this.getFirstSeries();if(t instanceof ye){var r=t.getFirstInstance();r instanceof me&&(this._firstInstance=r,e=r)}}return e}},{key:"findSeriesAndInstanceByInstance",value:function(e){var t;if(pe.isValidCallback(e)){var r,n=this._series.find((function(t){return(r=t.findInstance(e))instanceof me}));n instanceof ye&&(t={series:n,instance:r})}return t||{}}},{key:"findSeriesByInstance",value:function(e){return this.findSeriesAndInstanceByInstance(e).series}},{key:"findInstance",value:function(e){return this.findSeriesAndInstanceByInstance(e).instance}},{key:"getSeriesIndexByCustomId",value:function(e){var t=this._series.findIndex((function(t){return t.combinedId===e}));return t<0?null:t}}]),n}(pe),He=Re.DICOMwebClient,We=function(e){return e.getTagValue("NumberOfFrames")>1},Qe=function(e,t){var r=t[0],n=new de(t),a=e.getData();n.setAttributes({displaySetInstanceUID:n.uid,SeriesDate:a.SeriesDate,SeriesTime:a.SeriesTime,SeriesInstanceUID:e.getSeriesInstanceUID(),SeriesNumber:e.getSeriesNumber(),SeriesDescription:e.getSeriesDescription(),numImageFrames:t.length,frameRate:r.getTagValue("FrameTime"),Modality:r.getTagValue("Modality"),isMultiFrame:We(r)});n.sortBy((function(e,t){return(parseInt(e.getTagValue("InstanceNumber",0))||0)-(parseInt(t.getTagValue("InstanceNumber",0))||0)})),n.setAttribute("InstanceNumber",n.getImage(0).getTagValue("InstanceNumber"));var i=Ne(t);n.isReconstructable=i.value,n.isReconstructable&&n.sortByImagePositionPatient(),i.missingFrames&&(n.missingFrames=i.missingFrames);var o=ze(t);return n.calculatedSpacings=o,n},Ke=function(e){return"CR"===e||"MG"===e||"DX"===e};function Je(e,t){var r=qe(e.Modality),n=qe(t.Modality);return!r&&n?-1:r&&!n?1:function(e,t){return e.SeriesNumber>t.SeriesNumber||!e.SeriesNumber&&t.SeriesNumber?1:-1}(e,t)}function Ye(e){return e.sort(Je)}var Xe=r(2),Ze=r.n(Xe),et=r(5),tt=r.n(et),rt=r(7),nt=r.n(rt);function at(){return Promise.resolve().then(r.t.bind(null,275,7))}function it(e,t){var r=function(e,t){var r=e.wadorsuri;if(r)return null===t?r=r.replace(/frames\/(\d+)/,""):(t=t?parseInt(t)+1:1,r=r.replace(/frames\/(\d+)/,"frames/".concat(t))),r}(e,t);if(r)return"wadors:".concat(r)}function ot(e,t,r){var n=new RegExp("([?&])"+t+"=.*?(&|$)","i"),a=-1!==e.indexOf("?")?"&":"?";return e.match(n)?e.replace(n,"$1"+t+"="+r+"$2"):e+a+t+"="+r}function st(e,t){var r=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(e){if("function"==typeof e.getImageId)return e.getImageId();if(e.url)return void 0!==t&&(e.url=ot(e.url,"frame",t)),e.url;var n=r?"thumbnailRendering":"imageRendering";if(!e[n]||"wadouri"===e[n]||!e.wadorsuri){var a="dicomweb:"+e.wadouri;return void 0!==t&&(a+="&frame="+t),a}return it(e,t)}}var ut=r(12),ct=r.n(ut),lt=r(41),ft=r.n(lt),dt=r(43),pt=r.n(dt);function ht(e){for(var t=e.length,r=new Uint8Array(t),n=0;n0},get:function(e){var t=null;return Object.prototype.hasOwnProperty.call(this.entries,e)&&(t=this.entries[e],Date.now()-t.time>this.maxAge&&(delete this.entries[e],this.count--,t=null)),t},add:function(e){if(this.isValidUID(e.uid)){var t=e.uid;!0!==Object.prototype.hasOwnProperty.call(this.entries,t)&&this.count++,e.time=Date.now(),this.entries[t]=e}}};function gt(e,t,r){var n=r[0],a=r[2],i=function(e,t){return e[t]+256*e[t+1]},o=function(e){var t=new Uint8Array(e),r=[];if(16===a)for(var o=0;o>a)}return r}function It(e,t){return wt.apply(this,arguments)}function wt(){return(wt=tt()(Ze.a.mark((function e(t,r){var n,a;return Ze.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=[],a=[],e.abrupt("return",new Promise((function(e){for(var i=0;i<=30;i+=2){var o="60".concat(i.toString(16));3===o.length&&(o="600".concat(i.toString(16)));var s="".concat(o,"3000");if(t[s]&&t[s].InlineBinary){var u=ht(atob(t[s].InlineBinary));t[s]=bt(u)}else t[s]&&t[s].BulkDataURI?(n.push(St(t[s],r)),a.push(s)):t[s]&&t[s]instanceof ArrayBuffer&&(t[s]=bt(t[s]))}n.length?Promise.all(n).then((function(r){for(var n=0;n1&&void 0!==p[1]?p[1]:{},t instanceof ArrayBuffer?(a=ut.data.DicomMessage.readFile(t),n=a.dict):n=t,i=void 0===n.SeriesInstanceUID?ut.data.DicomMetaDictionary.naturalizeDataset(n):n,r.StudyInstanceUID&&(i.StudyInstanceUID=r.StudyInstanceUID),s=(o=i).StudyInstanceUID,u=o.SeriesInstanceUID,c=o.SOPInstanceUID,l=this._getAndCacheStudy(s),f=this._getAndCacheSeriesFromStudy(l,u),d=this._getAndCacheInstanceFromStudy(f,c),Object.assign(d,i),e.abrupt("return",d);case 10:case"end":return e.stop()}}),e,this)}))),function(e){return r.apply(this,arguments)})},{key:"addImageIdToUIDs",value:function(e,t){this.imageIdToUIDs.set(e,t)}},{key:"_getAndCacheStudy",value:function(e){var t=this.studies,r=t.get(e);return r||(r={series:new Map},t.set(e,r)),r}},{key:"_getAndCacheSeriesFromStudy",value:function(e,t){var r=e.series.get(t);return r||(r={instances:new Map},e.series.set(t,r)),r}},{key:"_getAndCacheInstanceFromStudy",value:function(e,t){var r=e.instances.get(t);return r||(r={},e.instances.set(t,r)),r}},{key:"_checkBulkDataAndInlineBinaries",value:(t=tt()(Ze.a.mark((function e(t,r){return Ze.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,It(t,r);case 2:if("PALETTE COLOR"!==t.PhotometricInterpretation){e.next=5;break}return e.next=5,mt(t,r);case 5:case"end":return e.stop()}}),e)}))),function(e,r){return t.apply(this,arguments)})},{key:"_getInstance",value:function(e){var t=this._getUIDsFromImageID(e);if(t){var r=t.StudyInstanceUID,n=t.SeriesInstanceUID,a=t.SOPInstanceUID;return this._getInstanceData(r,n,a)}}},{key:"get",value:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{fallback:!1},n=this._getInstance(t);return e===Ot?n:this.getTagFromInstance(e,n,r)}},{key:"getTag",value:function(e,t,r){return this.get(e,t,r)}},{key:"getInstance",value:function(e){return this.get(Ot,e)}},{key:"getTagFromInstance",value:function(e,t){if(t)return t[e]?t[e]:this._getCornerstoneWADOImageLoaderTag(e,t)}},{key:"_getCornerstoneWADOImageLoaderTag",value:function(e,t){var r;switch(e){case Et.GENERAL_SERIES_MODULE:var n,a,i=t.SeriesDate,o=t.SeriesTime;i&&(n=pt.a.parseDA(i)),o&&(a=pt.a.parseTM(o)),r={modality:t.Modality,seriesInstanceUID:t.SeriesInstanceUID,seriesNumber:t.SeriesNumber,studyInstanceUID:t.StudyInstanceUID,seriesDate:n,seriesTime:a,seriesDescription:t.SeriesDescription};break;case Et.PATIENT_STUDY_MODULE:r={patientAge:t.PatientAge,patientSize:t.PatientSize,patientWeight:t.PatientWeight};break;case Et.IMAGE_PLANE_MODULE:var s,u,c,l,f=t.ImageOrientationPatient,d=function(e){var t=e.PixelSpacing,r=e.ImagerPixelSpacing,n=e.SOPClassUID,a=e.PixelSpacingCalibrationType,i=e.PixelSpacingCalibrationDescription,o=e.EstimatedRadiographicMagnificationFactor,s=e.SequenceOfUltrasoundRegions,u=["1.2.840.10008.5.1.4.1.1.1","1.2.840.10008.5.1.4.1.1.1.1","1.2.840.10008.5.1.4.1.1.1.1.1","1.2.840.10008.5.1.4.1.1.1.2","1.2.840.10008.5.1.4.1.1.1.2.1","1.2.840.10008.5.1.4.1.1.1.3","1.2.840.10008.5.1.4.1.1.1.3.1","1.2.840.10008.5.1.4.1.1.12.1","1.2.840.10008.5.1.4.1.1.12.1.1","1.2.840.10008.5.1.4.1.1.12.2","1.2.840.10008.5.1.4.1.1.12.2.1","1.2.840.10008.5.1.4.1.1.12.3"].includes(n),c="NOT_APPLICABLE";if(u&&!r)return{PixelSpacing:t,type:"UNKNOWN",isProjection:u};if(t&&r&&t===r)return{PixelSpacing:t,type:"DETECTOR",isProjection:u};if(t&&r&&t!==r)return{PixelSpacing:t,type:"CALIBRATED",isProjection:u,PixelSpacingCalibrationType:a,PixelSpacingCalibrationDescription:i};if(!t&&r){var l=r;return o?l=r.map((function(e){return e/o})):h.info("EstimatedRadiographicMagnificationFactor was not present. Unable to correct ImagerPixelSpacing."),{PixelSpacing:l,isProjection:u}}if(s&&"object"===L()(s))return{PixelSpacing:[10*s.PhysicalDeltaX,10*s.PhysicalDeltaY]};if(s&&Array.isArray(s)&&s.length>1)h.warn("Sequence of Ultrasound Regions > one entry. This is not yet implemented, all measurements will be shown in pixels.");else if(!1===u&&!r)return{PixelSpacing:t,type:c,isProjection:u};h.info("Unknown combination of PixelSpacing and ImagerPixelSpacing identified. Unable to determine spacing.")}(t).PixelSpacing;d&&(s=d[0],u=d[1]),f&&(c=f.slice(0,3),l=f.slice(3,6)),r={frameOfReferenceUID:t.FrameOfReferenceUID,rows:t.Rows,columns:t.Columns,imageOrientationPatient:f,rowCosines:c,columnCosines:l,imagePositionPatient:t.ImagePositionPatient,sliceThickness:t.SliceThickness,sliceLocation:t.SliceLocation,pixelSpacing:d,rowPixelSpacing:s,columnPixelSpacing:u};break;case Et.IMAGE_PIXEL_MODULE:r={samplesPerPixel:t.SamplesPerPixel,photometricInterpretation:t.PhotometricInterpretation,rows:t.Rows,columns:t.Columns,bitsAllocated:t.BitsAllocated,bitsStored:t.BitsStored,highBit:t.HighBit,pixelRepresentation:t.PixelRepresentation,planarConfiguration:t.PlanarConfiguration,pixelAspectRatio:t.PixelAspectRatio,smallestPixelValue:t.SmallestPixelValue,largestPixelValue:t.LargestPixelValue,redPaletteColorLookupTableDescriptor:t.RedPaletteColorLookupTableDescriptor,greenPaletteColorLookupTableDescriptor:t.GreenPaletteColorLookupTableDescriptor,bluePaletteColorLookupTableDescriptor:t.BluePaletteColorLookupTableDescriptor,redPaletteColorLookupTableData:t.RedPaletteColorLookupTableData,greenPaletteColorLookupTableData:t.GreenPaletteColorLookupTableData,bluePaletteColorLookupTableData:t.BluePaletteColorLookupTableData};break;case Et.VOI_LUT_MODULE:var p=t.WindowCenter,m=t.WindowWidth;r={windowCenter:Array.isArray(p)?p:[p],windowWidth:Array.isArray(m)?m:[m]};break;case Et.MODALITY_LUT_MODULE:r={rescaleIntercept:t.RescaleIntercept,rescaleSlope:t.RescaleSlope,rescaleType:t.RescaleType};break;case Et.SOP_COMMON_MODULE:r={sopClassUID:t.SOPClassUID,sopInstanceUID:t.SOPInstanceUID};break;case Et.PET_ISOTOPE_MODULE:var v=t.RadiopharmaceuticalInformationSequence;if(v){var y=Array.isArray(v)?v[0]:v,g=y.RadiopharmaceuticalStartTime,b=y.RadionuclideTotalDose,I=y.RadionuclideHalfLife;r={radiopharmaceuticalInfo:{radiopharmaceuticalStartTime:pt.a.parseTM(g),radionuclideTotalDose:b,radionuclideHalfLife:I}}}break;case Et.OVERLAY_PLANE_MODULE:r={};for(var w=0;w<=30;w+=2){var S="60".concat(w.toString(16));3===S.length&&(S="600".concat(w.toString(16)));var P=t["".concat(S,"3000")];if(P){var D="".concat(S,"0010"),E="".concat(S,"0011"),O="".concat(S,"0040"),x="".concat(S,"0050"),_="".concat(S,"0022"),k="".concat(S,"1500"),j="".concat(S,"1301"),T="".concat(S,"1302"),A="".concat(S,"1303"),R=t[x];r.overlay={rows:t[D],columns:t[E],type:t[O],x:R[0],y:R[1],pixelData:P,description:t[_],label:t[k],roiArea:t[j],roiMean:t[T],roiStandardDeviation:t[A]}}}break;case Et.PATIENT_MODULE:var M,U=t.PatientName;U&&(M=U.Alphabetic),r={patientName:M,patientId:t.PatientID};break;case Et.GENERAL_IMAGE_MODULE:r={instanceNumber:t.InstanceNumber,lossyImageCompression:t.LossyImageCompression,lossyImageCompressionRatio:t.LossyImageCompressionRatio,lossyImageCompressionMethod:t.LossyImageCompressionMethod};break;case Et.GENERAL_STUDY_MODULE:r={studyDescription:t.StudyDescription,studyDate:t.StudyDate,studyTime:t.StudyTime,accessionNumber:t.AccessionNumber};break;case Et.CINE_MODULE:r={frameTime:t.FrameTime}}return r}},{key:"_getInstanceData",value:function(e,t,r){var n=this.studies.get(e);if(n){var a=n.series.get(t);if(a)return a.instances.get(r)}}},{key:"_getUIDsFromImageID",value:function(e){if(e.includes("wadors:")){var t=e.split("studies/")[1].split("/");return{StudyInstanceUID:t[0],SeriesInstanceUID:t[2],SOPInstanceUID:t[4]}}if(e.includes("wado?requestType=WADO")){var r=ft.a.parse(e);return{StudyInstanceUID:r.studyUID,SeriesInstanceUID:r.seriesUID,SOPInstanceUID:r.objectUID}}return this.imageIdToUIDs.get(e)}}]),e}()),Et={GENERAL_SERIES_MODULE:"generalSeriesModule",PATIENT_STUDY_MODULE:"patientStudyModule",IMAGE_PLANE_MODULE:"imagePlaneModule",IMAGE_PIXEL_MODULE:"imagePixelModule",VOI_LUT_MODULE:"voiLutModule",MODALITY_LUT_MODULE:"modalityLutModule",SOP_COMMON_MODULE:"sopCommonModule",PET_ISOTOPE_MODULE:"petIsotopeModule",OVERLAY_PLANE_MODULE:"overlayPlaneModule",PATIENT_MODULE:"patientModule",GENERAL_IMAGE_MODULE:"generalImageModule",GENERAL_STUDY_MODULE:"generalStudyModule",CINE_MODULE:"cineModule"},Ot="instance",xt={},_t={},kt=[];_t={createAndAddStack:function(e,t,r,n){var a=r.images;if(a){var i,o=a.length,s=[];r.images.forEach((function(e,n){var a=e.getData(),u={instance:a,series:r,study:t,numImages:o,imageIndex:n+1},c=e.getData().metadata,l=c.NumberOfFrames;if(l>1)for(var f=0;f1&&void 0!==arguments[1]?arguments[1]:{};f()(this,e),this.id=e.getNewId(),this.stack=t,this.startListening(),this.statsItemsLimit=r.statsItemsLimit||2,this.stats={items:[],total:0,elapsedTime:0,speed:0},this._setProgressData=r._setProgressData,this._clearProgressById=r._clearProgressById,this._addStatsData(0),this._updateProgress()}return p()(e,[{key:"_addStatsData",value:function(e){var t=new Date,r=this.stats,n=r.items,a={value:e,date:t};for(n.push(a),r.total+=a.value;n.length>this.statsItemsLimit;){var i=n.shift();r.total-=i.value}if(n.length>1){var o=n[0];r.elapsedTime=(a.date.getTime()-o.date.getTime())/1e3,r.speed=(r.total-o.value)/r.elapsedTime}}},{key:"_getProgressId",value:function(){return"StackProgress:"+this.stack.displaySetInstanceUID}},{key:"_clearProgress",value:function(){var e=this._getProgressId();this._clearProgressById(e)}},{key:"startListening",value:function(){throw new Error("`startListening` must be implemented by child classes")}},{key:"stopListening",value:function(){throw new Error("`stopListening` must be implemented by child classes")}},{key:"destroy",value:function(){this.stopListening(),this._clearProgress()}}],[{key:"getNewId",value:function(){var e=(new Date).getTime().toString().slice(-8),t=parseInt(1e9*Math.random());return e.toString()+t.toString()}}]),e}(),Mt=function(e){X()(n,e);var t,r=Tt(n);function n(e,t){var a;return f()(this,n),(a=r.call(this,e,t))._imageLoadProgressEventHandler=function(e){var t=e.detail,r=a._convertImageIdToDataSetUrl(t.imageId),n=t.loaded-a._lastLoaded;!a._dataSetUrl!==r&&(a._addStatsData(n),a._updateProgress(t),a._lastLoaded=t.loaded)},a._dataSetUrl=a._getDataSetUrl(e),a._lastLoaded=0,a._checkCachedData(),a}return p()(n,[{key:"_checkCachedData",value:(t=tt()(Ze.a.mark((function e(){var t,r,n;return Ze.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,at();case 2:t=e.sent,(r=t.wadouri.dataSetCacheManager.get(this._dataSetUrl))&&(n=r.byteArray.length,this._updateProgress({percentComplete:100,loaded:n,total:n}));case 5:case"end":return e.stop()}}),e,this)}))),function(){return t.apply(this,arguments)})},{key:"_getImageLoadProgressEventName",value:function(){return"cornerstoneimageloadprogress."+this.id}},{key:"startListening",value:function(){var e=this._getImageLoadProgressEventName();this.imageLoadProgressEventHandler=this._imageLoadProgressEventHandle.bind(this),this.stopListening(),nt.a.events.addEventListener(e,this.imageLoadProgressEventHandle)}},{key:"stopListening",value:function(){var e=this._getImageLoadProgressEventName();nt.a.events.removeEventListener(e,this.imageLoadProgressEventHandle)}},{key:"_updateProgress",value:function(e){var t=this._getProgressId(),r={multiFrame:!1,percentComplete:(e=e||{}).percentComplete,bytesLoaded:e.loaded,bytesTotal:e.total,bytesPerSecond:this.stats.speed};this._setProgressData(t,r)}},{key:"_convertImageIdToDataSetUrl",value:function(e){return e=(e=(e=e.replace(/^(dicomweb:|wadouri:)/i,"")).replace(/frame=\d+&?/i,"")).replace(/&$/,"")}},{key:"_getDataSetUrl",value:function(e){var t=e.imageIds[0];return this._convertImageIdToDataSetUrl(t)}}]),n}(Rt),Ut=function(e){X()(r,e);var t=Tt(r);function r(e){var n,a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return f()(this,r),a.statsItemsLimit=20,(n=t.call(this,e,a)).imageDataMap=n._convertImageIdsArrayToMap(e.imageIds),n.framesStatus=n._createArray(e.imageIds.length,!1),n.loadedCount=0,n._checkCachedData(),n}return p()(r,[{key:"_convertImageIdsArrayToMap",value:function(e){for(var t=new Map,r=0;r=0;r--){var n=e[r];delete n.id,delete n.payload,e[r]=null}e.splice(0,t),this._invalidate()}},{key:"remove",value:function(e){var t=this.findAllEntriesBy(e),r=t.length,n=[];if(r>0){for(var a=this._elements(!0),i=r-1;i>=0;i--){var o=t[i];a.splice(o[2],1),n.push(o[0])}this._invalidate()}return n}},{key:"getElementId",value:function(e){var t=this._elementWithPayload(e);return t&&t.id}},{key:"findById",value:function(e){var t=this._elementWithId(e);return t&&t.payload}},{key:"indexOfElement",value:function(e){return this._elements().indexOf(this._elementWithPayload(e,!0))}},{key:"indexOfId",value:function(e){return this._elements().indexOf(this._elementWithId(e,!0))}},{key:"getElementByIndex",value:function(e){var t=this._elements()[e>=0?e:-1];return t&&t.payload}},{key:"find",value:function(e){var t,r=this;return Vt(e)&&(t=this._elements().find((function(t,n){return e.call(r,t.payload,t.id,n)}))),t&&t.payload}},{key:"findBy",value:function(e,t){var r;if(Ft(t)){var n=this.all(t);n.length>0&&(r=Ft(e)?n.find((function(t){return $t(e,t)})):n[0])}else Ft(e)&&(r=this._elements().find((function(t){return $t(e,t.payload)})))&&(r=r.payload);return r}},{key:"findAllEntriesBy",value:function(e){var t=[];return Ft(e)&&this._elements().forEach((function(r,n){$t(e,r.payload)&&t.push([r.payload,r.id,n])})),t}},{key:"findAllBy",value:function(e,t){var r=this.findAllEntriesBy(e).map((function(e){return e[0]}));return Ft(t)&&"sort"in t&&zt(r,t.sort),r}},{key:"forEach",value:function(e){var t=this;Vt(e)&&this._elements().forEach((function(r,n){e.call(t,r.payload,r.id,n)}))}},{key:"count",value:function(){return this._elements().length}},{key:"all",value:function(e){var t=this._elements().map((function(e){return e.payload}));return Ft(e)&&"sort"in e&&zt(t,e.sort),t}}]),e}();function Ft(e){return e instanceof Object||"object"===L()(e)&&null!==e}function Lt(e){return"string"==typeof e}function Vt(e){return"function"==typeof e}function qt(e,t){var r;if(Ft(e)&&Lt(t)){var n=t.split("."),a=n.length;if(a>0){var i=n[0],o=a>1?n.slice(1).join("."):null;r=e[i],null!==o&&(r=qt(r,o))}}return r}function $t(e,t){var r=!1;for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){if(e[n]!==qt(t,n)){r=!1;break}!0!==r&&(r=!0)}return r}function zt(e,t){if(!(e instanceof Array&&function(e){var t=!0;if(e instanceof Array&&e.length>0)for(var r=e.length-1;r>=0;r--){var n=e[r];if(n instanceof Array){var a=n[0],i=n[1];if(Lt(a)&&("asc"===i||"desc"===i))continue}t=!1;break}return t}(t)))throw new Error("Invalid Arguments");var r=t.length;e.sort((function(e,n){for(var a=0;ac)return 1*s;if(++a>=r)return 0}}))}var Gt=new Ct;var Bt={add:function(e){Gt.insert(e)},get:function(e){return Gt.findBy({studyInstanceUID:e})},all:function(e){return Gt.all(e)},remove:function(e){Gt.remove({studyInstanceUID:e})},purge:function(){Gt.removeAll()}},Ht=function(){function e(){f()(this,e)}return p()(e,[{key:"getByInstanceUID",value:function(e){throw new ce("StudyMetadataSource::getByInstanceUID is not overriden. Please, override it in a specialized class. See OHIFStudyMetadataSource for example")}},{key:"loadStudy",value:function(e){throw new ce("StudyMetadataSource::loadStudy is not overriden. Please, override it in a specialized class. See OHIFStudyMetadataSource for example")}}]),e}(),Wt=function(e){var t=e["00081115"],r=[];return t&&t.Value&&t.Value.forEach((function(e){var t=ae.getString(e["0020000E"]),n=e["0008114A"],a=[];n.Value.forEach((function(e){a.push({referencedSOPClassUID:ae.getString(e["00081150"]),referencedSOPInstanceUID:ae.getString(e["00081155"])})})),r.push({referencedSeriesInstanceUID:t,referencedInstanceSequence:a})})),r};function Qt(e,t,r){return{series:[],seriesMap:Object.create(null),seriesLoader:null,wadoUriRoot:e.wadoUriRoot,wadoRoot:e.wadoRoot,qidoRoot:e.qidoRoot,PatientName:ae.getName(t["00100010"]),PatientID:ae.getString(t["00100020"]),PatientAge:ae.getNumber(t["00101010"]),PatientSize:ae.getNumber(t["00101020"]),PatientWeight:ae.getNumber(t["00101030"]),AccessionNumber:ae.getString(t["00080050"]),StudyTime:ae.getString(t["00080030"]),StudyDate:ae.getString(t["00080020"]),FrameOfReferenceUID:ae.getString(t["00200052"]),ReferencedSeriesSequence:Wt(t),modalities:ae.getString(t["00080061"]),StudyDescription:ae.getString(t["00081030"]),NumberOfStudyRelatedInstances:ae.getString(t["00201208"]),StudyInstanceUID:r||ae.getString(t["0020000D"]),InstitutionName:ae.getString(t["00080080"])}}function Kt(e,t,r,n){var a=[];a.push("requestType=WADO"),a.push("studyUID=".concat(t)),a.push("seriesUID=".concat(r)),a.push("objectUID=".concat(n)),a.push("contentType=application/dicom"),a.push("transferSyntax=*");var i=a.join("&");return"".concat(e.wadoUriRoot,"?").concat(i)}function Jt(e,t,r,n){return"".concat(e.wadoRoot,"/studies/").concat(t,"/series/").concat(r,"/instances/").concat(n)}function Yt(e,t,r,n,a){var i=Jt(e,t,r,n);return a=null!=a||1,"".concat(i,"/frames/").concat(a)}function Xt(e,t,r){return Zt.apply(this,arguments)}function Zt(){return(Zt=tt()(Ze.a.mark((function e(t,r,n){var a,i,o,s,u,c,l,f,d,p,h,m,v,y,g;return Ze.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Dt.addInstance(n,{server:t,StudyInstanceUID:r.StudyInstanceUID});case 2:if(a=e.sent,i=a.StudyInstanceUID,o=a.SeriesInstanceUID,s=a.SOPInstanceUID,(u=r.seriesMap[o])||(u={SeriesInstanceUID:o,SeriesDescription:a.SeriesDescription,Modality:a.Modality,SeriesNumber:a.SeriesNumber,SeriesDate:a.SeriesDate,SeriesTime:a.SeriesTime,instances:[]},r.seriesMap[o]=u,r.series.push(u)),c=Kt(t,i,o,s),l=Jt(t,i,o,s),f=Yt(t,i,o,s),d={metadata:a,baseWadoRsUri:l,wadouri:c,wadorsuri:f,wadoRoot:t.wadoRoot,imageRendering:t.imageRendering,thumbnailRendering:t.thumbnailRendering},u.instances.push(d),"wadors"!==d.thumbnailRendering&&"wadors"!==d.imageRendering){e.next=18;break}return p=Object.assign(n),e.next=15,at();case 15:if(h=e.sent,m=d.metadata.NumberOfFrames)for(v=0;v0)){e.next=6;break}return a=r[0],i=Qt(t,a,n),e.next=5,er(t,i,r);case 5:return e.abrupt("return",i);case 6:throw new Error("Failed to create study out of provided SOP instance list");case 7:case"end":return e.stop()}}),e)})));return function(t,r,n){return e.apply(this,arguments)}}();function nr(e){if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(e=function(e,t){if(!e)return;if("string"==typeof e)return ar(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(r);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return ar(e,t)}(e))){var t=0,r=function(){};return{s:r,n:function(){return t>=e.length?{done:!0}:{done:!1,value:e[t++]}},e:function(e){throw e},f:r}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var n,a,i=!0,o=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return i=e.done,e},e:function(e){o=!0,a=e},f:function(){try{i||null==n.return||n.return()}finally{if(o)throw a}}}}function ar(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r2&&void 0!==arguments[2]?arguments[2]:{};f()(this,e),this.server=t,this.studyInstanceUID=r,this.filters=n}var t,r,n,a,i,o;return p()(e,[{key:"execLoad",value:(o=tt()(Ze.a.mark((function e(){var t,r,n;return Ze.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,this.configLoad();case 2:return e.next=4,this.preLoad();case 4:return t=e.sent,e.next=7,this.load(t);case 7:return r=e.sent,e.next=10,this.posLoad(r);case 10:return n=e.sent,e.abrupt("return",n);case 12:case"end":return e.stop()}}),e,this)}))),function(){return o.apply(this,arguments)})},{key:"runLoaders",value:(i=tt()(Ze.a.mark((function e(t){var r,n,a,i;return Ze.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n=nr(t),e.prev=1,n.s();case 3:if((a=n.n()).done){e.next=12;break}return i=a.value,e.next=7,i();case 7:if(!(r=e.sent)||!r.length){e.next=10;break}return e.abrupt("break",12);case 10:e.next=3;break;case 12:e.next=17;break;case 14:e.prev=14,e.t0=e.catch(1),n.e(e.t0);case 17:return e.prev=17,n.f(),e.finish(17);case 20:if(!t.next().done||r){e.next=22;break}throw new Error("RetrieveMetadataLoader failed");case 22:return e.abrupt("return",r);case 23:case"end":return e.stop()}}),e,null,[[1,14,17,20]])}))),function(e){return i.apply(this,arguments)})},{key:"configLoad",value:(a=tt()(Ze.a.mark((function e(){return Ze.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:case"end":return e.stop()}}),e)}))),function(){return a.apply(this,arguments)})},{key:"preLoad",value:(n=tt()(Ze.a.mark((function e(){return Ze.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:case"end":return e.stop()}}),e)}))),function(){return n.apply(this,arguments)})},{key:"load",value:(r=tt()(Ze.a.mark((function e(t){return Ze.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:case"end":return e.stop()}}),e)}))),function(e){return r.apply(this,arguments)})},{key:"posLoad",value:(t=tt()(Ze.a.mark((function e(t){return Ze.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:case"end":return e.stop()}}),e)}))),function(e){return t.apply(this,arguments)})}]),e}();function or(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}var sr=function(e){X()(i,e);var t,r,n,a=(t=i,function(){var e,r=re()(t);if(or()){var n=re()(this).constructor;e=Reflect.construct(r,arguments,n)}else e=r.apply(this,arguments);return ee()(this,e)});function i(){return f()(this,i),a.apply(this,arguments)}return p()(i,[{key:"getOptions",value:function(){var e={studyInstanceUID:this.studyInstanceUID},t=this.filters.seriesInstanceUID;return t&&(e.seriesInstanceUID=t),e}},{key:"getLoaders",value:Ze.a.mark((function e(){var t,r,n,a,i;return Ze.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=[],r=this.studyInstanceUID,n=this.filters,a=(n=void 0===n?{}:n).seriesInstanceUID,i=this.client,a&&t.push(i.retrieveSeriesMetadata.bind(i,{studyInstanceUID:r,seriesInstanceUID:a})),t.push(i.retrieveStudyMetadata.bind(i,{studyInstanceUID:r})),e.delegateYield(t,"t0",7);case 7:case"end":return e.stop()}}),e,this)}))},{key:"configLoad",value:function(){var e=this.server,t=new Re.DICOMwebClient({url:e.wadoRoot,headers:ae.getAuthorizationHeader(e)});this.client=t}},{key:"load",value:(n=tt()(Ze.a.mark((function e(t){var r,n;return Ze.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=this.getLoaders(),n=this.runLoaders(r),e.abrupt("return",n);case 3:case"end":return e.stop()}}),e,this)}))),function(e){return n.apply(this,arguments)})},{key:"posLoad",value:(r=tt()(Ze.a.mark((function e(t){var r,n;return Ze.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=this.server,n=this.studyInstanceUID,e.abrupt("return",rr(r,t,n));case 2:case"end":return e.stop()}}),e,this)}))),function(e){return r.apply(this,arguments)})}]),i}(ir),ur=Symbol("INFO");function cr(e){var t=e[ur];if(!t){var r=ae.getString(e["00080060"],"").toUpperCase();t=Object.freeze({Modality:r,isLowPriority:qe(r),SeriesInstanceUID:ae.getString(e["0020000E"]),SeriesNumber:ae.getNumber(e["00200011"],0)||0}),e[ur]=t}return t}var lr={default:function(e,t){return e.SeriesNumber-t.SeriesNumber},seriesInfoSortingCriteria:function(e,t){var r=cr(e),n=cr(t);return!r.isLowPriority&&n.isLowPriority?-1:r.isLowPriority&&!n.isLowPriority?1:r.SeriesNumber-n.SeriesNumber}},fr={default:function(e,t){return e.InstanceNumber-t.InstanceNumber}},dr=lr,pr=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:lr.default;return e.sort(t)},hr=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:fr.default;return e.sort(t)};function mr(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}var vr=ct.a.data.DicomMetaDictionary.naturalizeDataset;function yr(e,t,r){t.seriesLoader=Object.freeze({hasNext:function(){return r.hasNext()},next:function(){return tt()(Ze.a.mark((function n(){var a;return Ze.a.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return n.next=2,r.next();case 2:return a=n.sent,n.next=5,er(e,t,a.sopInstances,t.StudyInstanceUID);case 5:return n.abrupt("return",t.seriesMap[a.seriesInstanceUID]);case 6:case"end":return n.stop()}}),n)})))()}})}function gr(e,t,r){return Object.freeze({hasNext:function(){return r.length>0},next:function(){return tt()(Ze.a.mark((function n(){var a,i;return Ze.a.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return a=r.shift(),n.next=3,e.retrieveSeriesMetadata({studyInstanceUID:t,seriesInstanceUID:a});case 3:return i=n.sent,n.abrupt("return",{studyInstanceUID:t,seriesInstanceUID:a,sopInstances:i});case 5:case"end":return n.stop()}}),n)})))()}})}var br=function(e){X()(o,e);var t,r,n,a,i=(t=o,function(){var e,r=re()(t);if(mr()){var n=re()(this).constructor;e=Reflect.construct(r,arguments,n)}else e=r.apply(this,arguments);return ee()(this,e)});function o(){return f()(this,o),i.apply(this,arguments)}return p()(o,[{key:"configLoad",value:function(){var e=this.server,t=new Re.DICOMwebClient({url:e.qidoRoot,headers:ae.getAuthorizationHeader(e),errorInterceptor:$e.getHTTPErrorHandler()});this.client=t}},{key:"getPreLoaders",value:Ze.a.mark((function e(){var t,r,n,a,i,o;return Ze.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=[],r=this.studyInstanceUID,n=this.filters,a=(n=void 0===n?{}:n).seriesInstanceUID,i=this.client,a&&(o={studyInstanceUID:r,queryParams:{SeriesInstanceUID:a}},t.push(i.searchForSeries.bind(i,o))),t.push(i.searchForSeries.bind(i,{studyInstanceUID:r})),e.delegateYield(t,"t0",7);case 7:case"end":return e.stop()}}),e,this)}))},{key:"preLoad",value:(a=tt()(Ze.a.mark((function e(){var t,r,n,a;return Ze.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.getPreLoaders(),e.next=3,this.runLoaders(t);case 3:return r=e.sent,n=pr(r,dr.seriesInfoSortingCriteria),a=n.map((function(e){return cr(e).SeriesInstanceUID})),e.abrupt("return",{seriesInstanceUIDsMap:a,seriesData:r});case 7:case"end":return e.stop()}}),e,this)}))),function(){return a.apply(this,arguments)})},{key:"load",value:(n=tt()(Ze.a.mark((function e(t){var r,n,a,i;return Ze.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=this.client,n=this.studyInstanceUID,a=gr(r,n,t.seriesInstanceUIDsMap),e.next=4,a.next();case 4:return i=e.sent,e.abrupt("return",{sopInstances:i.sopInstances,asyncLoader:a,seriesData:t.seriesData});case 6:case"end":return e.stop()}}),e,this)}))),function(e){return n.apply(this,arguments)})},{key:"posLoad",value:(r=tt()(Ze.a.mark((function e(t){var r,n,a,i,o,s;return Ze.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=this.server,n=this.studyInstanceUID,a=t.sopInstances,i=t.asyncLoader,o=t.seriesData,e.next=4,rr(r,a,n);case 4:return s=e.sent,o.map(vr).forEach((function(e,t){var r={SeriesInstanceUID:e.SeriesInstanceUID,SeriesDescription:e.SeriesDescription,SeriesNumber:e.SeriesNumber,Modality:e.Modality,instances:[]};s.series[t]?s.series[t]=Object.assign(r,s.series[t]):s.series[t]=r,s.seriesMap[e.SeriesInstanceUID]=s.series[t]})),i.hasNext()&&yr(r,s,i),e.abrupt("return",s);case 9:case"end":return e.stop()}}),e,this)}))),function(e){return r.apply(this,arguments)})}]),o}(ir);function Ir(){return(Ir=tt()(Ze.a.mark((function e(t,r){var n,a,i,o,s=arguments;return Ze.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=s.length>2&&void 0!==s[2]?s[2]:{},a=!1!==t.enableStudyLazyLoad?br:sr,i=new a(t,r,n),o=i.execLoad(),e.abrupt("return",o);case 5:case"end":return e.stop()}}),e)})))).apply(this,arguments)}var wr=function(e,t){return Ir.apply(this,arguments)},Sr=new Map;function Pr(e,t,r){if(!e)throw new Error("".concat("RetrieveStudyMetadata",": Required 'server' parameter not provided."));if(!t)throw new Error("".concat("RetrieveStudyMetadata",": Required 'StudyInstanceUID' parameter not provided."));if(Sr.has(t))return Sr.get(t);var n=new Promise((function(n,a){wr(e,t,r).then((function(e){n(e)}),a)}));return Sr.set(t,n),n}function Dr(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}var Er=function(e){X()(n,e);var t,r=(t=n,function(){var e,r=re()(t);if(Dr()){var n=re()(this).constructor;e=Reflect.construct(r,arguments,n)}else e=r.apply(this,arguments);return ee()(this,e)});function n(){return f()(this,n),r.apply(this,arguments)}return p()(n,[{key:"getByInstanceUID",value:function(e,t){return Pr(e,t)}},{key:"loadStudy",value:function(e){var t=this;if(!(e instanceof Be))throw new ce("OHIFStudyMetadataSource::loadStudy study is not an instance of StudyMetadata");return new Promise((function(r,a){var i=e.getStudyInstanceUID();if(e instanceof Be)return OHIF.viewer.Studies.findBy({StudyInstanceUID:i})||n._updateStudyCollections(e),void r(e);t.getByInstanceUID(i).then((function(e){var t=new Be(e,e.StudyInstanceUID),a=t.createDisplaySets();t.setDisplaySets(a),n._updateStudyCollections(t),r(t)})).catch(a)}))}}],[{key:"_updateStudyCollections",value:function(e){var t=e.getData();t.selected=!0,t.displaySets=e.getDisplaySets(),Bt.add(e)}}]),n}(Ht),Or=r(18),xr=r.n(Or),_r={OHIFStudyMetadataSource:Er,MetadataProvider:Dt,CommandsManager:V,HotkeysManager:Q,ImageSet:de,StudyPrefetcher:function(){function e(t){f()(this,e),this.studies=t||[],this.prefetchDisplaySetsTimeout=300,this.lastActiveViewportElement=null,nt.a.events.addEventListener("cornerstoneimagecachefull.StudyPrefetcher",this.cacheFullHandler.bind(this))}return p()(e,[{key:"destroy",value:function(){this.stopPrefetching(),nt.a.events.removeEventListener("cornerstoneimagecachefull.StudyPrefetcher",this.cacheFullHandler.bind(this))}},{key:"setStudies",value:function(e){this.stopPrefetching(),this.studies=e}},{key:"prefetch",value:function(){this.studies&&this.studies.length&&(this.stopPrefetching(),this.prefetchDisplaySets())}},{key:"stopPrefetching",value:function(){xr.a.requestPoolManager.clearRequestStack("prefetch")}},{key:"prefetchDisplaySetsAsync",value:function(e){var t=this;e=e||this.prefetchDisplaySetsTimeout,clearTimeout(this.prefetchDisplaySetsHandler),this.prefetchDisplaySetsHandler=setTimeout((function(){t.prefetchDisplaySets()}),e)}},{key:"prefetchDisplaySets",value:function(){var e=this.getDisplaySetsToPrefetch({order:"closest",displaySetCount:1}),t=this.getImageIdsFromDisplaySets(e);this.prefetchImageIds(t)}},{key:"prefetchImageIds",value:function(e){var t=this.filterCachedImageIds(e),r=xr.a.requestPoolManager,n=function(){};t.forEach((function(e){r.addRequest({},e,"prefetch",!1,n,n)})),r.startGrabbing()}},{key:"getInstance",value:function(e,t){var r=nt.a.metaData.get("instance",t.imageId);return e.getInstanceByUID(r.SOPInstanceUID)}},{key:"getActiveDisplaySet",value:function(e,t){return e.find((function(e){return e.images.some((function(e){return e.SOPInstanceUID===t.SOPInstanceUID}))}))}},{key:"getDisplaySetsToPrefetch",value:function(e){var t=this.getActiveViewportImage();if(!t||!e||!e.displaySetCount)return[];var r=this.getStudy(t).displaySets,n=e.order,a=this[{topdown:"getFirstDisplaySets",downward:"getNextDisplaySets",closest:"getClosestDisplaySets"}[n]];return a?a.call(this,r,null,e.displaySetCount):(n&&h.warn("Invalid prefetch order configuration (".concat(n,")")),[])}},{key:"getFirstDisplaySets",value:function(e,t,r){for(var n=e.length,a=[],i=0;i=0||s=0&&(i.push(e[o]),r--,o--),s1)for(var n=0;n1&&void 0!==arguments[1])||arguments[1],r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:lr.default,n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:fr.default;if(!e||!e.series)throw new Error("Insufficient study data was provided to sortStudy");return pr(e.series,r),t&&e.series.forEach((function(e){hr(e.instances,n)})),e}},Cr=function(e){var t="/";if(!e)return t;var r=window.location.origin,n=r.split("/");if(n.length>4){var a=r.indexOf(n[3]);t+=r.substring(a)+e}else t+=e;return t.replace(/\/\/+/g,"/")},Fr=function(e,t){if(!e||!t)throw new Error("The servers and store must be defined");Object.keys(e).forEach((function(r){e[r].forEach((function(e){var n=Object.assign({},e);n.type=r,t.dispatch({type:"ADD_SERVER",server:n})}))}))},Lr=function(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:512,n=atob(e),a=[],i=0;i1&&void 0!==arguments[1]?arguments[1]:ae.getAuthorizationHeader();return fetch(e,t).then((function(e){return e.arrayBuffer()}))},Jr=function(e){return nt.a.loadAndCacheImage(e).then((function(e){return e&&e.data&&e.data.byteArray.buffer}))},Yr=function(e,t,r,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:ae.getAuthorizationHeader(),i={url:e,headers:a},o=new Re.DICOMwebClient(i);return o.retrieveInstance({studyInstanceUID:t,seriesInstanceUID:r,sopInstanceUID:n})},Xr=new(function(){function e(){f()(this,e)}var t,r;return p()(e,[{key:"getLocalData",value:(r=tt()(Ze.a.mark((function e(t,r){var n,a,i;return Ze.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!t||!t.localFile){e.next=9;break}if(n=Wr(t),a=Qr(n),Hr(a)&&(a=Br(r,t.displaySetInstanceUID)),Hr(a)){e.next=9;break}return e.next=7,at();case 7:return i=e.sent,e.abrupt("return",i.wadouri.loadFileRequest(a));case 9:case"end":return e.stop()}}),e)}))),function(e,t){return r.apply(this,arguments)})},{key:"getDataByImageType",value:function(e){var t=Wr(e);if(t){var r=Qr(t),n=Kr;switch(function(e){var t=/^\w+:/,r=t.exec(e);return 0===t.lastIndex&&r&&r[0]&&r[0].replace(":","")||""}(r)){case"dicomfile":n=Jr.bind(this,r);break;case"wadors":var a=t.getData().wadoRoot,i=t.getStudyInstanceUID(),o=t.getSeriesInstanceUID(),s=t.getSOPInstanceUID();if(Hr([a,i,o,s]))return;n=Yr.bind(this,a,i,o,s);break;case"wadouri":if(r=r.substring(r.indexOf(":")+1),Hr(r))return;n=Kr.bind(this,r)}return n()}}},{key:"getDataByDatasetType",value:function(e){var t=e.StudyInstanceUID,r=e.SeriesInstanceUID,n=e.SOPInstanceUID,a=e.authorizationHeaders,i=e.wadoRoot,o=e.wadoUri;return Hr(i)?Hr(o)?void 0:Kr(o,{headers:a}):Yr(i,t,r,n,a)}},{key:"getLoaderIterator",value:function(e,t){var r=this;return zr()(Ze.a.mark((function n(){return Ze.a.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return n.next=2,r.getLocalData(e,t);case 2:return n.next=4,r.getDataByImageType(e);case 4:return n.next=6,r.getDataByDatasetType(e);case 6:case"end":return n.stop()}}),n)})))()}},{key:"findDicomDataPromise",value:(t=tt()(Ze.a.mark((function e(t,r){var n,a,i,o,s,u,c,l;return Ze.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n=this.getLoaderIterator(t,r),a=!0,i=!1,e.prev=3,s=qr()(n);case 5:return e.next=7,s.next();case 7:return u=e.sent,a=u.done,e.next=11,u.value;case 11:if(c=e.sent,a){e.next=19;break}if(!(l=c)){e.next=16;break}return e.abrupt("return",l);case 16:a=!0,e.next=5;break;case 19:e.next=25;break;case 21:e.prev=21,e.t0=e.catch(3),i=!0,o=e.t0;case 25:if(e.prev=25,e.prev=26,a||null==s.return){e.next=30;break}return e.next=30,s.return();case 30:if(e.prev=30,!i){e.next=33;break}throw o;case 33:return e.finish(30);case 34:return e.finish(25);case 35:throw new Error("Invalid dicom data loader");case 36:case"end":return e.stop()}}),e,this,[[3,21,25,35],[26,,30,34]])}))),function(e,r){return t.apply(this,arguments)})}]),e}()),Zr=function(e,t){var r=e.StudyInstanceUID,n=e.SeriesInstanceUID,a=Bt.get(r);if(a){var i=a.getDerivedDatasets({referencedSeriesInstanceUID:n});if(i.length){var o={};i.forEach((function(e){var t=e.Modality;void 0===o[t]&&(o[t]=[]),o[t].push(e)})),Object.keys(o).forEach((function(r){var n=o[r];if(!n.some((function(e){return e.isLoaded}))){var a,i=0;n.forEach((function(e){var t=Number("".concat(e.SeriesDate).concat(e.SeriesTime));t>i&&(i=t,a=e)})),a.load(e,t)}}))}}};function en(){var e=[].slice.call(arguments),t=e.length;return function(r,n){var a,i,o,s,u,c,l;for(l=0;li&&(c=1*u),0===c);l++);return c}}function tn(e){return e[0].toLowerCase()+e.slice(1)}var rn=function(e){return e?ft.a.parse(e):{}},nn={getQueryFilters:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.search;if(t){var r=rn(t),n={};return Object.entries(r).forEach((function(e){var t=c()(e,2),r=t[0],a=t[1];n[tn(r)]=a})),n}}},an={isValidPath:function(e){var t="/".concat(":");return e.indexOf(t)<0},parseParam:function(e){var t=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";try{var t=window.atob(e);return t}catch(t){return e}}(e);if(t&&"string"==typeof t)return t.split(";")},replaceParam:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1?arguments[1]:void 0,r=arguments.length>2?arguments[2]:void 0,n="".concat(":").concat(t);return r?e.replace(n,r):e}};function on(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}var sn=function(e){var t=e.instances,r=e.Modality;if(!t||!t.length)return[e];switch(r){case"MR":return un(e);default:return[e]}},un=function(e){var t,r,n,a,i=cn(e.instances,(n=e.instances[0],a=n.metadata,t=a.Manufacturer||a["00080070"]||"",r=t.toLowerCase(),r.indexOf("siemens")>-1?{MR:["ImageType","SequenceName","0019100C","EchoTime","RepetitionTime"]}:r.indexOf("philips")>-1?{MR:["ImageType","20011020","20011003","EchoTime","RepetitionTime"]}:{MR:["ImageType","SequenceName","DiffusionBValue","EchoTime","RepetitionTime"]}).MR);delete e.instance;var o,s=0,u=!1;return i.length>1&&(u=!0,o=" - Subseries "),i.map((function(t){return s++,function(e){for(var t=1;t0&&e.isValidObject(t)){for(var s=0,u=i-1,c=t;s0&&e.isValidObject(t)){for(var o=0,s=i-1,u=t;o1&&void 0!==arguments[1]?arguments[1]:{};if(f()(this,e),e.Instance)return e.Instance.initialize(t,r),e.Instance;this.initialize(t,r),e.Instance=this}return p()(e,null,[{key:"setConfiguration",value:function(e){Object.assign(Un,e)}},{key:"getConfiguration",value:function(){return Un}}]),p()(e,[{key:"initialize",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.currentTimepointId=e,this.comparisonTimepointKey=t.comparisonTimepointKey||"baseline",this.options=t,this.timepoints=[]}},{key:"onTimepointsUpdated",value:function(){"function"==typeof this.options.onTimepointsUpdated?this.options.onTimepointsUpdated(Object.assign([],this.timepoints)):h.warn("Timepoints update callback is not defined")}},{key:"calculateVisitNumber",value:function(e){var t=this.timepoints.sort((function(e,t){return e.visitDate>t.visitDate?1:-1})).find((function(t){return t.PatientID===e.PatientID&&t.timepointType===e.timepointType})).map((function(e){return e.timepointId})).indexOf(e.timepointId)+1;if(!t)throw new Error("Current timepoint was not in the list of relevant timepoints?");return t}},{key:"retrieveTimepoints",value:function(e){var t=this,r=Un.dataExchange.retrieve;if("function"==typeof r)return new Promise((function(n,a){r(e).then((function(e){h.info("Timepoint data retrieval"),e.forEach((function(e){var r=t.timepoints.findIndex((function(t){return t.timepointId===e.timepointId}));r<0?t.timepoints.push(e):t.timepoints[r]=e})),t.onTimepointsUpdated(),n()})).catch((function(e){h.error("Timepoint retrieval function failed: ".concat(e)),a(e)}))}));h.error("Timepoint retrieval function has not been configured.")}},{key:"storeTimepoints",value:function(){var e=Un.dataExchange.store;if("function"==typeof e)return h.info("Preparing to store timepoints"),h.info(JSON.stringify(this.timepoints,null,2)),e(this.timepoints);h.error("Timepoint store function has not been configured.")}},{key:"disassociateStudy",value:function(e,t){var r=this,n=Un.dataExchange.disassociate;"function"==typeof n?n(e,t).then((function(){h.info("Disassociation completed"),r.timepoints=[],r.retrieveTimepoints({})})):h.error("Study disassociate function has not been configured.")}},{key:"removeTimepoint",value:function(e){var t=this,r=Un.dataExchange.remove;if("function"==typeof r){var n={timepointId:e};h.info("Preparing to remove timepoint"),h.info(JSON.stringify(n,null,2)),r(n).then((function(){h.info("Timepoint removal completed");var r=t.timepoints.findIndex((function(t){return t.timepointId===e}));r>-1&&t.timepoints.splice(r,1),t.onTimepointsUpdated()}))}else h.error("Timepoint remove function has not been configured.")}},{key:"updateTimepoint",value:function(e,t){var r=this,n=Un.dataExchange.update;if("function"==typeof n){var a={timepointId:e};h.info("Preparing to update timepoint"),h.info(JSON.stringify(a,null,2)),h.info(JSON.stringify(t,null,2)),n(a,t).then((function(){h.info("Timepoint updated completed");var n=r.timepoints.findIndex((function(t){return t.timepointId===e}));n>-1&&(r.timepoints[n]=Mn({},r.timepoints[n],{},t)),r.onTimepointsUpdated()}))}else h.error("Timepoint update function has not been configured.")}},{key:"all",value:function(e){return(e?this.timepoints.filter(e):this.timepoints).sort((function(e,t){return e.visitDate0&&void 0!==arguments[0]?arguments[0]:this.comparisonTimepointKey,t=this.current(),r=this.comparison(e),n=[t];return r&&!n.find((function(e){return e.timepointId===r.timepointId}))&&n.push(r),n}},{key:"isRebaseline",value:function(e){var t=e?this.timepoints.find((function(t){return t.timepointId===e})):this.current();return!!t&&this.timepoints.filter((function(e){return"baseline"===e.timepointType&&e.visitDate<=t.visitDate})).length>1}},{key:"nextBaselineAfterCurrent",value:function(){var e=this.current();return this.timepoints.sort((function(e,t){return e.visitDate>t.visitDate?1:-1})).find((function(t){return t.visitDate>e.visitDate&&"baseline"===t.timepointType}))}},{key:"setCurrentTimepointId",value:function(e){this.currentTimepointId=e}},{key:"setUserComparison",value:function(e){this.userComparison=e}},{key:"comparison",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.comparisonTimepointKey;if(this.userComparison)return this.userComparison;var t=this.current();if(t){if("prebaseline"===t.timepointType){var r=this.nextBaselineAfterCurrent();if(r)return r}if("baseline"===t.timepointType){var n=this.prior();if(n)return n}var a=this[e]();if(!a||a.timepointId!==t.timepointId)return a}}},{key:"latestInitialTimepointAfterCurrent",value:function(){var e=this.current();if("followup"!==e.timepointType){var t=this.timepoints.sort((function(e,t){return e.visitDate>t.visitDate?1:-1})).filter((function(t){return t.visitDate>e.visitDate})),r=t.findIndex((function(e){return"followup"===e.timepointType}))-1;return r<0?t[t.length-1]:t[r]}}},{key:"initialTimepointIds",value:function(){var e=this.current();"prebaseline"!==e.timepointType&&"baseline"!==e.timepointType||(e=this.latestInitialTimepointAfterCurrent()||e);var t=e.visitDate,r=(this.timepoints.filter((function(e){return"prebaseline"===e.timepointType&&e.visitDate<=t}))||[]).map((function(e){return e.timepointId})),n=(this.timepoints.filter((function(e){return"baseline"===e.timepointType&&e.visitDate<=t}))||[]).map((function(e){return e.timepointId}));return r.concat(n)}},{key:"baseline",value:function(){var e=this.current().visitDate;return this.all().find((function(t){return"baseline"===t.timepointType&&t.visitDate<=e}))}},{key:"nadir",value:function(){var e=this.current(),t=this.all().find((function(t){return t.timepointId!==e.timepointId&&"nadir"===t.timepointKey&&t.visitDate<=e.visitDate}));return t||this.baseline()}},{key:"key",value:function(){var e=[this.current()],t=this.prior(),r=this.nadir(),n=this.baseline(),a=function(t){return!!e.find((function(e){return e.timepointId===t.timepointId}))};return t&&!1===a(t)&&e.push(t),r&&!1===a(r)&&e.push(r),n&&!1===a(n)&&e.push(n),e}},{key:"study",value:function(e){return this.all().filter((function(t){return t.studyInstanceUIDs.includes(e)}))}},{key:"name",value:function(e){var t=Nn[e.timepointType];if("baseline"===e.timepointType)return"Baseline";if(e.visitNumber)return"".concat(t," ").concat(e.visitNumber);var r=this.calculateVisitNumber(e);return"".concat(t," ").concat(r)}},{key:"title",value:function(e){for(var t=this.name(e),r=this.all(),n=-1,a=null,i=0;i1&&void 0!==arguments[1]&&arguments[1],r=e.split("_"),n=c()(r,4),a=n[0],i=n[1],o=n[2],s=n[3],u=Bt.get(a),l=u.getSeriesByUID(i),f=l.getInstanceByUID(o);return f.getImageId(s,t)};function qn(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function $n(e){for(var t=1;t1&&void 0!==arguments[1]?arguments[1]:{};if(f()(this,e),this.temporaryDeletedMeasurement={},this.getTemporaryDeletedMeasurements=function(e){return r.temporaryDeletedMeasurement[e]||[]},this.addTemporaryDeletedMeasurements=function(e){var t=e.StudyInstanceUID,n=r.getTemporaryDeletedMeasurements(t);0!==n.length&&-1!==n.findIndex((function(t){return t.id===e.id}))||(h.info("add measurement to temporary deleted list",e),n.push(e),r.temporaryDeletedMeasurement[t]=n)},this.clearTemporaryDeletedMeasurement=function(e){delete r.temporaryDeletedMeasurement[e]},e.Instance)return e.Instance.initialize(t,n),e.Instance;this.initialize(t,n),e.Instance=this}return p()(e,null,[{key:"setConfiguration",value:function(e){Object.assign(zn,e)}},{key:"getConfiguration",value:function(){return zn}},{key:"getToolsGroupsMap",value:function(){var e={};return zn.measurementTools.forEach((function(t){t.childTools.forEach((function(r){return e[r.id]=t.id}))})),e}},{key:"getToolGroupTools",value:function(e){var t={};return Object.keys(e).forEach((function(r){var n=e[r];t[n]||(t[n]=[]),t[n].push(r)})),t}},{key:"getToolConfiguration",value:function(t){var r,n=e.getConfiguration(),a=e.getToolsGroupsMap()[t],i=n.measurementTools.find((function(e){return e.id===a}));return i&&(r=i.childTools.find((function(e){return e.id===t}))),{toolGroupId:a,toolGroup:i,tool:r}}},{key:"syncMeasurementAndToolData",value:function(t){h.info("syncMeasurementAndToolData",t);var r=Fn(t);r&&(t.labels=[r]);var n=xr.a.globalImageIdSpecificToolStateManager.saveToolState(),a=t.StudyInstanceUID;if(Bt.get(a)){var i=t.toolType,o=e.getToolConfiguration(i).tool;if(Array.isArray(o.childTools))o.childTools.forEach((function(r){var n=t[r];n&&(n._id=t._id,n.measurementNumber=t.measurementNumber,n.lesionNamingNumber=t.lesionNamingNumber,e.syncMeasurementAndToolData(n))}));else{var s=Vn(t.imagePath);n[s]||(n[s]={});var u=n[s][i],c=u&&u.data;if(c&&c.length){var l=n[s][i].data,f=!1;if(l.forEach((function(e){if(e._id===t._id)return f=!0,Object.assign(e,t),!1})),!0===f)return}else n[s][i]={data:[]};n[s][i].data.push(t),xr.a.globalImageIdSpecificToolStateManager.restoreToolState(n)}}}},{key:"isToolIncluded",value:function(e){return e.options&&e.options.caseProgress&&e.options.caseProgress.include}}]),p()(e,[{key:"initialize",value:function(t){var r=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.timepointApi=t,this.options=n,this.toolGroups={},this.tools={},this.toolsGroupsMap=e.getToolsGroupsMap(),this.toolGroupTools=e.getToolGroupTools(this.toolsGroupsMap),zn.measurementTools.forEach((function(e){r.toolGroups[e.id]=[],e.childTools.forEach((function(e){r.tools[e.id]=[]}))}))}},{key:"onMeasurementsUpdated",value:function(){"function"==typeof this.options.onMeasurementsUpdated?this.options.onMeasurementsUpdated($n({},this.tools)):h.warn("Measurements update callback is not defined")}},{key:"processMeasurementData",value:function(e){var t=this;e&&(h.info("Measurement data retrieval"),h.info(e),Object.keys(e).forEach((function(r){e[r].forEach((function(e){var r=e.toolType;t.addMeasurement(r,e)}))}))),this.syncMeasurementsAndToolData();try{nt.a.getEnabledElements().forEach((function(e){nt.a.updateImage(e.element)}))}catch(e){h.error(e)}this.onMeasurementsUpdated()}},{key:"retrieveMeasurements",value:function(e){var t=this,r=zn.dataExchange.retrieve,n=zn.server;if("function"==typeof r)return new Promise((function(a,i){r(n,e).then((function(e){t.processMeasurementData(e),a()}),i)}));h.error("Measurement retrieval function has not been configured.")}},{key:"storeMeasurements",value:function(t,r){var n=this,a=zn.server,i=zn.dataExchange.store;if("function"==typeof i){var o={};zn.measurementTools.forEach((function(t){e.isToolIncluded(t)&&t.childTools.forEach((function(r){e.isToolIncluded(r)&&(o[t.id]||(o[t.id]=[]),o[t.id]=o[t.id].concat(n.tools[r.id]))}))}));var s=t?function(e){return e.timepointId===t}:null,u=this.timepointApi.all(s),c=u.map((function(e){return e.timepointId})),l={PatientID:u[0].PatientID,timepointIds:c};return h.info("Saving Measurements for timepoints:",u),i(o,l,a,r).then((function(e){return h.info("Measurement storage completed",e),n.processMeasurementData(e),e}))}h.error("Measurement store function has not been configured.")}},{key:"calculateLesionNamingNumber",value:function(e){var t,r=e.sort((function(e,t){return e.lesionNamingNumber>t.lesionNamingNumber?1:e.lesionNamingNumber=e.measurementNumber};zn.measurementTools.filter((function(e){return"temp"!==e.id})).forEach((function(e){r.updateNumbering(r.toolGroups[e.id],n,"measurementNumber",t),e.childTools.forEach((function(e){r.updateNumbering(r.tools[e.id],n,"measurementNumber",t)}))}))}},{key:"addMeasurement",value:function(e,t){var r,n=this.toolsGroupsMap[e],a=this.toolGroups[n],i=this.tools[e],o=i.find((function(e){return e.lesionNamingNumber===t.lesionNamingNumber&&e.toolType===t.toolType}));if(o&&o.location&&(t.location=o.location),o&&o.description&&(t.description=o.description),t._id||(t._id=k()),t.StudyInstanceUID)r=this.timepointApi.study(t.StudyInstanceUID)[0];else{var s=t.timepointId;r=this.timepointApi.timepoints.find((function(e){return e.timepointId===s}))}if(r){var u=a.find((function(e){return e.toolItemId===t._id&&e.timepointId===r.timepointId}));if(t.timepointId=r.timepointId,u)t.lesionNamingNumber=u.lesionNamingNumber,t.measurementNumber=u.measurementNumber,a.filter((function(e){return e.timepointId===r.timepointId&&e.lesionNamingNumber===t.lesionNamingNumber})).forEach((function(e){e.toolId=t.toolType,e.toolItemId=t._id,e.createdAt=t.createdAt,e.measurementNumber=t.measurementNumber,e.id=t.id}));else{h.info("handle measurement not added by cornerstone tool",t);var c=a.filter((function(e){return e.timepointId===r.timepointId}));t.lesionNamingNumber=t.lesionNamingNumber||this.calculateLesionNamingNumber(c),t.measurementNumber=t.measurementNumber||this.calculateMeasurementNumber(t)+1}var l,f={timepointId:r.timepointId,lesionNamingNumber:t.lesionNamingNumber,measurementNumber:t.measurementNumber,id:t.id},d=this.getPreviousMeasurement(t);if(d){h.info("previous measurement",d),t.lesionNamingNumber=d.lesionNamingNumber,t.measurementNumber=d.measurementNumber,f.lesionNamingNumber=d.lesionNamingNumber,f.measurementNumber=d.measurementNumber,f.additionalData=t.additionalData||{},f.additionalData.TrialPatientLocationUID=d.additionalData&&d.additionalData.TrialPatientLocationUID,f.location=d.location,f.label=d.label,f.description=d.description,f.isSplitLesion=d.isSplitLesion,f.isNodal=d.isNodal;var p=Ln(d);p&&(f.description=p)}else this.hasDuplicateMeasurementNumber(t);var m=i.findIndex((function(e){return e._id===t._id}));return m>-1?(l=$n({},i[m],{},f),i[m]=l):(l=$n({},t,{},f),i.push(l)),u||a.push({toolId:e,toolItemId:l._id,timepointId:r.timepointId,StudyInstanceUID:l.StudyInstanceUID,createdAt:l.createdAt,lesionNamingNumber:l.lesionNamingNumber,measurementNumber:l.measurementNumber,id:l.id}),this.onMeasurementsUpdated(),l}}},{key:"updateMeasurement",value:function(e,t){var r=this.tools[e],n=r.findIndex((function(e){return e._id===t._id}));n<0||(r[n]=$n({},t,{updated:!0}),this.onMeasurementsUpdated())}},{key:"onMeasurementRemoved",value:function(e,t){var r=this,n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],a=t.lesionNamingNumber,i=t.measurementNumber,o=this.toolsGroupsMap[e],s=this.toolGroups[o],u=s.findIndex((function(e){return e.toolItemId===t._id}));if(h.info("onMeasurementRemoved",t,s,u),!(u<0)){s.splice(u,1);var c=s.filter((function(e){return e.measurementNumber===i})).map((function(e){return e.timepointId}));if(c.length<1){var l=function(e){return e.lesionNamingNumber>=a};this.updateNumbering(s,l,"lesionNamingNumber",-1);var f=zn.measurementTools.find((function(e){return e.id===o}));f&&f.childTools&&f.childTools.forEach((function(e){var t=r.tools[e.id];r.updateNumbering(t,l,"lesionNamingNumber",-1)})),this.updateMeasurementNumberForAllMeasurements(t,-1)}this.syncMeasurementsAndToolData(),this.onMeasurementsUpdated();var d=t.id;d&&n&&this.addTemporaryDeletedMeasurements(t)}}},{key:"syncMeasurementsAndToolData",value:function(){var t=this;zn.measurementTools.forEach((function(r){e.isToolIncluded(r)&&r.childTools.forEach((function(r){e.isToolIncluded(r)&&t.tools[r.id].forEach((function(t){e.syncMeasurementAndToolData(t)}))}))}))}},{key:"deleteMeasurements",value:function(t,r,n,a){var i=this,o={lesionNamingNumber:n.lesionNamingNumber,timepointId:n.timepointId},s=Object.keys(o),u=this.toolGroups[r];if(u){var c=u.filter((function(e){return s.every((function(t){return e[t]===o[t]}))})),l=[];if(c.forEach((function(e){if(e.toolId){var t=i.tools[e.toolId],r=t.findIndex((function(t){return t._id===e.toolItemId}));r>-1&&(l.push(t[r]),t.splice(r,1))}})),l.length){var f=o.lesionNamingNumber||l[0].lesionNamingNumber,d=xr.a.globalImageIdSpecificToolStateManager.saveToolState();l.forEach((function(r){var n=[],o=e.getToolConfiguration(r.toolType).tool;Array.isArray(o.childTools)?o.childTools.forEach((function(e){var t=r[e];t&&n.push(t)})):n.push(r),n.forEach((function(e){var t=e.imagePath,n=e.toolType,a=Vn(t);if(a&&d[a]){var i=d[a][n],o=i&&i.data,s=o.find((function(e){return e._id===r._id}));if(s){var u=o.indexOf(s);o.splice(u,1)}}})),i.onMeasurementRemoved(t,r,a)})),xr.a.globalImageIdSpecificToolStateManager.restoreToolState(d);var p=$n({},o);delete p.timepointId,delete p.lesionNamingNumber;var h=Object.keys(p);$()(new Set(l.map((function(e){return e.toolType})))).forEach((function(t){i.tools[t].filter((function(e){return e.lesionNamingNumber>f-1&&h.every((function(t){return e[t]===o[t]}))})).forEach((function(t){e.syncMeasurementAndToolData(t)}))}))}}}}],[{key:"getInstance",value:function(){return this.Instance||(this.Instance=new e),this.Instance}}]),e}();Gn.Instance=void 0;var Bn=r(112),Hn=r.n(Bn),Wn=function(){function e(t,r){f()(this,e),this.options=t,this.criterionName=r}return p()(e,[{key:"generateResponse",value:function(e,t){return{passed:!e,isGlobal:!t||!t.length,message:e,measurements:t,criterionName:this.criterionName}}},{key:"getNewTargetNumbers",value:function(e){var t=this.options,r=[],n=new Set;return t.newTarget&&(e.targets.forEach((function(e){var t=e.measurement.measurementNumber;"baseline"===e.timepoint.timepointType&&r.push(t)})),e.targets.forEach((function(e){var t=e.measurement.measurementNumber;"followup"===e.timepoint.timepointType&&(r.includes(t)||n.add(t))}))),n}}]),e}();function Qn(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}var Kn={type:"object"},Jn=function(e){X()(n,e);var t,r=(t=n,function(){var e,r=re()(t);if(Qn()){var n=re()(this).constructor;e=Reflect.construct(r,arguments,n)}else e=r.apply(this,arguments);return ee()(this,e)});function n(){f()(this,n);for(var e=arguments.length,t=new Array(e),a=0;ar.limit&&a.push(t))})),a.length){var o=r.newTarget?"new ":"";t=r.message||"Each organ should not have more than ".concat(r.limit," ").concat(o,"targets.")}return this.generateResponse(t,a)}}]),n}(Wn);function ea(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}var ta={type:"object",properties:{limit:{label:"Max targets allowed in study",type:"integer",minimum:0},newTarget:{label:"Flag to evaluate only new targets",type:"boolean"},locationIn:{label:"Filter to evaluate only measurements with the specified locations",type:"array",items:{type:"string"},minItems:1,uniqueItems:!0},locationNotIn:{label:"Filter to evaluate only measurements without the specified locations",type:"array",items:{type:"string"},minItems:1,uniqueItems:!0},isNodal:{label:"Filter to evaluate only nodal or extranodal measurements",type:"boolean"},message:{label:"Message to be displayed in case of nonconformity",type:"string"}},required:["limit"]},ra=function(e){X()(n,e);var t,r=(t=n,function(){var e,r=re()(t);if(ea()){var n=re()(this).constructor;e=Reflect.construct(r,arguments,n)}else e=r.apply(this,arguments);return ee()(this,e)});function n(){f()(this,n);for(var e=arguments.length,t=new Array(e),a=0;a-1||n.push(o)}));var a,i="";if("boolean"==typeof t.isNodal&&(i=t.isNodal?"nodal ":"extranodal "),n.length>t.limit){var o=t.newTarget?"new ":"",s=1===t.limit?"":"s",u=0===t.limit?"":"more than ".concat(t.limit);a=t.message||"The study should not have ".concat(u," ").concat(o).concat(i,"target").concat(s,".")}return this.generateResponse(a)}}]),n}(Wn);function na(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}var aa={type:"object",properties:{longAxis:{label:"Minimum length of long axis",type:"number",minimum:0},shortAxis:{label:"Minimum length of short axis",type:"number",minimum:0},longAxisSliceThicknessMultiplier:{label:"Length of long axis multiplier",type:"number",minimum:0},shortAxisSliceThicknessMultiplier:{label:"Length of short axis multiplier",type:"number",minimum:0},modalityIn:{label:"Filter to evaluate only measurements with the specified modalities",type:"array",items:{type:"string"},minItems:1,uniqueItems:!0},modalityNotIn:{label:"Filter to evaluate only measurements without the specified modalities",type:"array",items:{type:"string"},minItems:1,uniqueItems:!0},locationIn:{label:"Filter to evaluate only measurements with the specified locations",type:"array",items:{type:"string"},minItems:1,uniqueItems:!0},locationNotIn:{label:"Filter to evaluate only measurements without the specified locations",type:"array",items:{type:"string"},minItems:1,uniqueItems:!0},isNodal:{label:"Filter to evaluate only nodal or extranodal measurements",type:"boolean"},message:{label:"Message to be displayed in case of nonconformity",type:"string"}},anyOf:[{required:["message","longAxis"]},{required:["message","shortAxis"]},{required:["message","longAxisSliceThicknessMultiplier"]},{required:["message","shortAxisSliceThicknessMultiplier"]}]},ia=function(e){X()(n,e);var t,r=(t=n,function(){var e,r=re()(t);if(na()){var n=re()(this).constructor;e=Reflect.construct(r,arguments,n)}else e=r.apply(this,arguments);return ee()(this,e)});function n(){f()(this,n);for(var e=arguments.length,t=new Array(e),a=0;a-1||n.modalityNotIn&&n.modalityNotIn.indexOf(p)>-1||(n.longAxis&&u1?"modalities":"Modality";t="The ".concat(c," ").concat(u," should not be used as a method of measurement")}return this.generateResponse(t,i)}}]),n}(Wn);function ca(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}var la={type:"object"},fa=function(e){X()(n,e);var t,r=(t=n,function(){var e,r=re()(t);if(ca()){var n=re()(this).constructor;e=Reflect.construct(r,arguments,n)}else e=r.apply(this,arguments);return ee()(this,e)});function n(){f()(this,n);for(var e=arguments.length,t=new Array(e),a=0;a0&&void 0!==arguments[0]&&arguments[0],t=0;return this.criteria.forEach((function(r){var n=e===!!r.options.newTarget;if(r instanceof va.MaxTargetsCriterion&&n){var a=r.options.limit;a>t&&(t=a)}})),t}},{key:"getCriteriaValidator",value:function(){if(e.criteriaValidator)return e.criteriaValidator;var t={properties:{},definitions:{}};return Object.keys(va).forEach((function(e){if(va[e].prototype instanceof Wn){var r=e.replace(/Criterion$/,""),n="#/definitions/".concat(r);t.definitions[r]=va["".concat(r,"Schema")],t.properties[r]={oneOf:[{$ref:n},{type:"array",items:{$ref:n}}]}}})),e.criteriaValidator=(new Hn.a).compile(t),e.criteriaValidator}},{key:"evaluate",value:function(e){var t=[];return this.criteria.forEach((function(r){var n=r.evaluate(e);n.passed||t.push(n)})),t}}],[{key:"setCriterion",value:function(e,t){va[e]=t}}]),e}(),ga=r(111),ba=r.t(ga,2);function Ia(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}var wa=function(e){for(var t=1;t2&&void 0!==arguments[2]?arguments[2]:{};f()(this,e),this.measurementApi=t,this.timepointApi=r,this.nonconformities=[],this.groupedNonConformities=[],this.maxTargets=null,this.maxNewTargets=null,this.options=n}var t,r;return p()(e,[{key:"loadStudy",value:function(e){if("function"!=typeof this.options.loadStudy)throw new Error("loadStudy callback is not defined");return this.options.loadStudy(null,e)}},{key:"validate",value:(r=tt()(Ze.a.mark((function e(t){var r,n,a,i,o,s,u,l,f,d,p,h;return Ze.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=this.getData("baseline"),n=this.getData("followup"),e.next=4,Promise.all([r,n]);case 4:return a=e.sent,i=c()(a,2),o=i[0],s=i[1],(u={targets:[],nonTargets:[]}).targets=u.targets.concat(o.targets),u.targets=u.targets.concat(s.targets),u.nonTargets=u.nonTargets.concat(o.nonTargets),u.nonTargets=u.nonTargets.concat(s.nonTargets),this.maxTargets=null,this.maxNewTargets=null,l=this.validateTimepoint("both",t,u),f=this.validateTimepoint("baseline",t,o),d=this.validateTimepoint("followup",t,s),p=f.concat(d).concat(l),h=this.groupNonConformities(p),this.nonconformities=p,this.groupedNonConformities=h,console.warn("nonconformities"),console.warn(p),console.warn("groupedNonConformities"),console.warn(h),e.abrupt("return",p);case 27:case"end":return e.stop()}}),e,this)}))),function(e){return r.apply(this,arguments)})},{key:"groupNonConformities",value:function(e){var t={},r=this.measurementApi.toolsGroupsMap;return e.forEach((function(e){if(e.isGlobal)return t.globals=t.globals||{messages:[]},void t.globals.messages.push(e.message);e.measurements.forEach((function(n){var a=r[n.toolType];t[a]=t[a]||{measurementNumbers:{}};var i=t[a],o=n.measurementNumber,s=i.measurementNumbers[o];s||(s=i.measurementNumbers[o]={messages:[],measurements:[]}),s.messages.push(e.message),s.measurements.push(n)}))})),t}},{key:"validateTimepoint",value:function(e,t,r){var n=this,a=this.getEvaluators(e,t),i=[];return a.forEach((function(t){var a=t.getMaxTargets(!1),o=t.getMaxTargets(!0);a&&(n.maxTargets=a),o&&(n.maxNewTargets=o);var s=t.evaluate(r);s.length>0&&s.forEach((function(t){t.timepointType=e})),i=i.concat(s)})),i}},{key:"getEvaluators",value:function(e,t){var r=[];console.warn(wa);var n=t.id.toLowerCase(),a=wa[n];if(a){var i=a[e];i&&r.push(new ya(i))}return r}},{key:"getData",value:(t=tt()(Ze.a.mark((function e(t){var r,n,a,i=this;return Ze.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r={targets:[],nonTargets:[]},n=[],(a=function(e){i.measurementApi.fetch(e).forEach((function(a){var o=a.StudyInstanceUID,s=a.timepointId,u=s&&i.timepointApi.timepoints.find((function(e){return e.timepointId===s}));if(u&&("both"===t||u.timepointType===t)){var c=i.loadStudy(o);c.then((function(t){r[e].push({measurement:a,metadata:t.getFirstInstance(),timepoint:u})}),(function(e){throw new Error(e)})),n.push(c)}}))})("targets"),a("nonTargets"),e.next=7,Promise.all(n);case 7:return e.abrupt("return",r);case 8:case"end":return e.stop()}}),e)}))),function(e){return t.apply(this,arguments)})}],[{key:"setEvaluationDefinitions",value:function(e,t){wa[e]=t}}]),e}(),Pa=function(e){var t=nt.a.getEnabledElement(e).image.imageId,r=nt.a.metaData.get("instance",t),n=r.StudyInstanceUID,a=r.PatientID,i=r.SeriesInstanceUID,o=r.SOPInstanceUID,s=t.split("&frame"),u=void 0!==s[1]?Number(s[1]):0,c=[n,i,o,u].join("_");return{PatientID:a,StudyInstanceUID:n,SeriesInstanceUID:i,SOPInstanceUID:o,frameIndex:u,imagePath:c}};function Da(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function Ea(e){var t=e.eventData,r=e.tool,n=Gn.Instance;n||h.warn("Measurement API is not initialized");var a=t.measurementData,i=t.toolType;if(n.tools[i]&&a&&!a.cancelled){h.info("CornerstoneToolsMeasurementAdded");var o=function(e){for(var t=1;t-1?o[s]:null;u&&(1===u.childToolsCount?(o.splice(s,1),i.onMeasurementRemoved(r.parentTool,u,a)):(u[r.attribute]=null,u.childToolsCount=(u.childToolsCount||0)-1,i.updateMeasurement(r.parentTool,u)),nt.a.getEnabledElements().forEach((function(e){nt.a.updateImage(e.element)})),Gn.isToolIncluded(r))}},Ra=function(e){var t=e.detail;return t.toolName&&(t.toolType=t.toolName),t},Ma={handleSingleMeasurementAdded:Ea,handleChildMeasurementAdded:_a,handleSingleMeasurementModified:ka,handleChildMeasurementModified:ja,handleSingleMeasurementRemoved:Ta,handleChildMeasurementRemoved:Aa,onAdded:function(e){var t=Ra(e),r=t.toolType,n=Gn.getToolConfiguration(r),a=n.toolGroupId,i=n.toolGroup,o=n.tool,s=Cn.getInstance().current();s&&(t.measurementData.timepointId=s.timepointId);var u={eventData:t,tool:o,toolGroupId:a,toolGroup:i};o&&(o.parentTool?_a(u):Ea(u))},onModified:function(e){var t=Ra(e),r=t.toolType,n=Gn.getToolConfiguration(r),a=n.toolGroupId,i=n.toolGroup,o=n.tool,s={eventData:t,tool:o,toolGroupId:a,toolGroup:i};o&&(o.parentTool?ja(s):ka(s))},onRemoved:function(e){var t=Ra(e),r=t.toolType,n=Gn.getToolConfiguration(r),a=n.toolGroupId,i=n.toolGroup,o=n.tool,s={eventData:t,tool:o,toolGroupId:a,toolGroup:i};o&&(o.parentTool?Aa(s):Ta(s))}},Ua=r(11),Na=r.n(Ua),Ca={id:"targets",name:"Targets",childTools:[gn,On,_n,xn],options:{caseProgress:{include:!0,evaluate:!0}}},Fa={id:"nonTargets",name:"Non-Targets",childTools:[Pn],options:{caseProgress:{include:!0,evaluate:!0}}};function La(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}var Va=Na()([Sn,bn]);Va.forEach((function(e){e.options=function(e){for(var t=1;t0&&h.warn("[DICOMSR] Tooltypes not supported: ".concat(a.join(", "))),{dataset:t.generateReport(n,nt.a.metaData).dataset}},Ha=function(e){var t=[];return e.forEach((function(e){e.getDisplaySets&&(t=t.concat(e.getDisplaySets()))})),t},Wa=function(){var e=tt()(Ze.a.mark((function e(t,r,n){var a,i,o,s,u,c,l;return Ze.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return a={url:n,headers:ae.getAuthorizationHeader()},i=new Re.DICOMwebClient(a),o=t.getFirstInstance(),s={studyInstanceUID:o.getStudyInstanceUID(),seriesInstanceUID:o.getSeriesInstanceUID(),sopInstanceUID:o.getSOPInstanceUID()},e.next=6,i.retrieveInstance(s);case 6:return u=e.sent,c=Ha(r),l=vn(u,c),e.abrupt("return",l);case 10:case"end":return e.stop()}}),e)})));return function(t,r,n){return e.apply(this,arguments)}}(),Qa=function(){var e=tt()(Ze.a.mark((function e(t,r){var n,a,i,o,s,u,c,l,f,d,p,h;return Ze.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=Ba(t),a=n.dataset,i=ut.data,o=i.DicomMetaDictionary,s=i.DicomDict,u={FileMetaInformationVersion:a._meta.FileMetaInformationVersion.Value,MediaStorageSOPClassUID:a.SOPClassUID,MediaStorageSOPInstanceUID:a.SOPInstanceUID,TransferSyntaxUID:"1.2.840.10008.1.2.1",ImplementationClassUID:o.uid(),ImplementationVersionName:"dcmjs-0.0"},c=o.denaturalizeDataset(u),(l=new s(c)).dict=o.denaturalizeDataset(a),f=l.write(),d={url:r,headers:ae.getAuthorizationHeader()},p=new Re.DICOMwebClient(d),h={datasets:[f]},e.next=12,p.storeInstances(h);case 12:case"end":return e.stop()}}),e)})));return function(t,r){return e.apply(this,arguments)}}(),Ka=function(e){var t=e.getFirstInstance().getData().metadata.SOPClassUID;return["1.2.840.10008.5.1.4.1.1.88.22","1.2.840.10008.5.1.4.1.1.11.1"].includes(t)},Ja=function(e,t){return e._data.SeriesDate>t._data.SeriesDate||e._data.SeriesDate===t._data.SeriesDate&&e._data.SeriesTime>t._data.SeriesTime},Ya=function(e){var t;return e.forEach((function(e){(e.getSeries?e.getSeries():[]).forEach((function(e){e.instances&&e.instances.length&&Ka(e)&&(t&&!Ja(e,t)||(t=e))}))})),t},Xa={retrieveMeasurements:function(e){if(h.info("[DICOMSR] retrieveMeasurements"),!e||"dicomWeb"!==e.type)return h.error("[DICOMSR] DicomWeb server is required!"),Promise.reject({});var t=e.wadoRoot,r=dn.studyMetadataManager.all(),n=Ya(r);return n?Wa(n,r,t):Promise.resolve({})},storeMeasurements:function(){var e=tt()(Ze.a.mark((function e(t,r,n){var a,i,o,s;return Ze.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(h.info("[DICOMSR] storeMeasurements"),n&&"dicomWeb"===n.type){e.next=4;break}return h.error("[DICOMSR] DicomWeb server is required!"),e.abrupt("return",Promise.reject({}));case 4:return a=n.wadoRoot,i=Object.keys(t)[0],o=t[i][0],s=o&&o.StudyInstanceUID,e.prev=8,e.next=11,Qa(t,a);case 11:return s&&Nr.deleteStudyMetadataPromise(s),e.abrupt("return",{message:"Measurements saved successfully"});case 15:throw e.prev=15,e.t0=e.catch(8),h.error("[DICOMSR] Error while saving the measurements: ".concat(e.t0.message)),new Error("Error while saving the measurements.");case 19:case"end":return e.stop()}}),e,null,[[8,15]])})));return function(t,r,n){return e.apply(this,arguments)}}(),isToolSupported:Ga},Za={metadataProvider:Dt};function ei(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}var ti=function(e){X()(n,e);var t,r=(t=n,function(){var e,r=re()(t);if(ei()){var n=re()(this).constructor;e=Reflect.construct(r,arguments,n)}else e=r.apply(this,arguments);return ee()(this,e)});function n(e,t,a,i){var o;return f()(this,n),(o=r.call(this,e,i)).init(t,a),o}return p()(n,[{key:"init",value:function(e,t){var r=this.getData();Object.defineProperties(this,{_sopInstanceUID:{configurable:!1,enumerable:!1,writable:!1,value:r.SOPInstanceUID},_study:{configurable:!1,enumerable:!1,writable:!1,value:t},_series:{configurable:!1,enumerable:!1,writable:!1,value:e},_instance:{configurable:!1,enumerable:!1,writable:!1,value:r},_cache:{configurable:!1,enumerable:!1,writable:!1,value:Object.create(null)}})}},{key:"getTagValue",value:function(e,t,r){if(e in this._cache&&!0!==r)return this._cache[e];var n,a=this._instance.metadata;return e in a?n=a[e]:e in this._series?n=this._series[e]:e in this._study&&(n=this._study[e]),void 0!==n?(this._cache[e]=n,n):t}},{key:"tagExists",value:function(e){return e in this._instance.metadata||e in this._series||e in this._study}},{key:"getImageId",value:function(e,t){return null===this._imageId&&(this._imageId=st(this.getData(),e,t)),this._imageId}}]),n}(me);function ri(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}var ni=function(e){X()(n,e);var t,r=(t=n,function(){var e,r=re()(t);if(ri()){var n=re()(this).constructor;e=Reflect.construct(r,arguments,n)}else e=r.apply(this,arguments);return ee()(this,e)});function n(e,t,a){var i;return f()(this,n),(i=r.call(this,e,a)).init(t),i}return p()(n,[{key:"init",value:function(e){var t=this,r=this.getData();Object.defineProperty(this,"_seriesInstanceUID",{configurable:!1,enumerable:!1,writable:!1,value:r.SeriesInstanceUID}),r.instances.forEach((function(n){t.addInstance(new ti(n,r,e))})),this.combinedId=r.SeriesInstanceUID+(r.SubSeriesIndex||"")}},{key:"isSubSeries",value:function(){return this._data.isSubSeries}},{key:"getSeriesDescription",value:function(){return this._data.SeriesDescription}},{key:"getSeriesNumber",value:function(){return this._data.SeriesNumber}},{key:"getCustomSeriesInstanceUID",value:function(){return this.combinedId}}]),n}(ye);function ai(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}var ii={Metadata:pe,StudyMetadata:Be,SeriesMetadata:ye,InstanceMetadata:me,OHIFStudyMetadata:function(e){X()(n,e);var t,r=(t=n,function(){var e,r=re()(t);if(ai()){var n=re()(this).constructor;e=Reflect.construct(r,arguments,n)}else e=r.apply(this,arguments);return ee()(this,e)});function n(e,t){var a;return f()(this,n),(a=r.call(this,e,t)).init(),a}return p()(n,[{key:"init",value:function(){var e=this,t=this.getData();Object.defineProperty(this,"_studyInstanceUID",{configurable:!1,enumerable:!1,writable:!1,value:t.StudyInstanceUID}),t.series.forEach((function(r){sn(r).forEach((function(r){e.addSeries(new ni(r,t))}))}))}}]),n}(Be),OHIFSeriesMetadata:ni,OHIFInstanceMetadata:ti},oi=r(19),si=r.n(oi);si.a.validators.equals=function(e,t,r,n){if(t&&e!==t.value)return"".concat(r,"must equal ").concat(t.value)},si.a.validators.doesNotEqual=function(e,t,r){if(t&&e===t.value)return"".concat(r,"cannot equal ").concat(t.value)},si.a.validators.contains=function(e,t,r){if(t&&e.indexOf&&-1===e.indexOf(t.value))return"".concat(r,"must contain ").concat(t.value)},si.a.validators.doesNotContain=function(e,t,r){if(t&&e.indexOf&&-1!==e.indexOf(t.value))return"".concat(r,"cannot contain ").concat(t.value)},si.a.validators.startsWith=function(e,t,r){if(t&&e.startsWith&&!e.startsWith(t.value))return"".concat(r,"must start with ").concat(t.value)},si.a.validators.endsWith=function(e,t,r){if(t&&e.endsWith&&!e.endsWith(t.value))return"".concat(r,"must end with ").concat(t.value)};var ui={};var ci=ii.InstanceMetadata,li=function(e,t){if(!(e instanceof ci))throw new ce("HPMatcher::match metadataInstance must be an instance of InstanceMetadata");var r={format:"grouped"},n={passed:[],failed:[]},a=!1,i=0;return t.forEach((function(t){var o=t.attribute;if(Object.prototype.hasOwnProperty.call(ui,o)){var s=ui[o];e.setCustomAttribute(o,s.callback(e))}var u,c=_()({},o,t.constraint),l=e.customAttributeExists(o)?e.getCustomAttribute(o):e.getTagValue(o),f=_()({},o,l);try{u=si()(f,c,[r])}catch(e){u=["Something went wrong during validation.",e]}u?(t.required&&(a=!0),n.failed.push({rule:t,errorMessages:u})):(i+=parseInt(t.weight,10),n.passed.push({rule:t}))})),a&&(i=0),{score:i,details:n,requiredFailed:a}},fi={};var di=[{id:"equals",name:"= (Equals)",validator:"equals",validatorOption:"value",description:"The attribute must equal this value."},{id:"doesNotEqual",name:"!= (Does not equal)",validator:"doesNotEqual",validatorOption:"value",description:"The attribute must not equal this value."},{id:"contains",name:"Contains",validator:"contains",validatorOption:"value",description:"The attribute must contain this value."},{id:"doesNotContain",name:"Does not contain",validator:"doesNotContain",validatorOption:"value",description:"The attribute must not contain this value."},{id:"startsWith",name:"Starts with",validator:"startsWith",validatorOption:"value",description:"The attribute must start with this value."},{id:"endsWith",name:"Ends with",validator:"endsWith",validatorOption:"value",description:"The attribute must end with this value."},{id:"onlyInteger",name:"Only Integers",validator:"numericality",validatorOption:"onlyInteger",description:"Real numbers won't be allowed."},{id:"greaterThan",name:"> (Greater than)",validator:"numericality",validatorOption:"greaterThan",description:"The attribute has to be greater than this value."},{id:"greaterThanOrEqualTo",name:">= (Greater than or equal to)",validator:"numericality",validatorOption:"greaterThanOrEqualTo",description:"The attribute has to be at least this value."},{id:"lessThanOrEqualTo",name:"<= (Less than or equal to)",validator:"numericality",validatorOption:"lessThanOrEqualTo",description:"The attribute can be this value at the most."},{id:"lessThan",name:"< (Less than)",validator:"numericality",validatorOption:"lessThan",description:"The attribute has to be less than this value."},{id:"odd",name:"Odd",validator:"numericality",validatorOption:"odd",description:"The attribute has to be odd."},{id:"even",name:"Even",validator:"numericality",validatorOption:"even",description:"The attribute has to be even."}];Object.freeze(di);var pi=/^equals$/,hi=function(){function e(t,r,n,a){f()(this,e),this.id=k(),this.weight=a||1,t&&(this.attribute=t),r&&(this.constraint=r),this.required=void 0!==n&&n,this._constraintInfo=void 0,this._validatorAndValue=void 0}return p()(e,[{key:"fromObject",value:function(e){this.id=e.id||k(),this.required=e.required,this.weight=e.weight,this.attribute=e.attribute,this.constraint=e.constraint}},{key:"getConstraintInfo",value:function(){var e=this._constraintInfo;if(void 0!==e)return e;var t=Object.keys(this.constraint)[0];return void 0!==t&&(e=di.find((function(e){return t===e.id}))),this._constraintInfo=e,e}},{key:"isRuleForPrior",value:function(){return"abstractPriorValue"===this.attribute}},{key:"getNumberOfPriorsReferenced",value:function(){if(!this.isRuleForPrior())return-1;var e=this.getConstraintValidatorAndValue(),t=e.value,r=e.validator,n=parseInt(t,10)||0;return pi.test(r)?n<0?1:n:0}},{key:"getConstraintValidatorAndValue",value:function(){var e=this._validatorAndValue;if(void 0!==e)return e;var t=this.getConstraintInfo();if(void 0!==t){var r=t.validator,n=this.constraint[r];if(n)e={value:n[t.validatorOption],validator:t.id},this._validatorAndValue=e}return e}}]),e}();function mi(e){return function(){var t,r=re()(e);if(vi()){var n=re()(this).constructor;t=Reflect.construct(r,arguments,n)}else t=r.apply(this,arguments);return ee()(this,t)}}function vi(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}var yi=function(e){X()(r,e);var t=mi(r);function r(){return f()(this,r),t.apply(this,arguments)}return r}(hi),gi=function(e){X()(r,e);var t=mi(r);function r(){return f()(this,r),t.apply(this,arguments)}return r}(hi),bi=function(e){X()(r,e);var t=mi(r);function r(){return f()(this,r),t.apply(this,arguments)}return r}(hi),Ii=function(e){X()(r,e);var t=mi(r);function r(){return f()(this,r),t.apply(this,arguments)}return r}(hi),wi=function(e,t){return!(!e||!e.length)&&(e.forEach((function(e,n){if(e===t)return r=n,!1})),!!r&&(e.splice(r,1),!0));var r},Si=function(){function e(t,r){f()(this,e),this.type=t,this.properties=r}return p()(e,[{key:"fromObject",value:function(e){this.type=e.type,this.properties=e.properties}},{key:"getLayoutTemplateName",value:function(){switch(this.type){case"grid":return"gridLayout"}}},{key:"getNumViewports",value:function(){switch(this.type){case"grid":return this.properties.Rows*this.properties.Columns}}}]),e}(),Pi=function(){function e(){f()(this,e),this.viewportSettings={},this.imageMatchingRules=[],this.seriesMatchingRules=[],this.studyMatchingRules=[]}return p()(e,[{key:"fromObject",value:function(e){var t=this;e.imageMatchingRules&&e.imageMatchingRules.forEach((function(e){var r=new Ii;r.fromObject(e),t.imageMatchingRules.push(r)})),e.seriesMatchingRules&&e.seriesMatchingRules.forEach((function(e){var r=new bi;r.fromObject(e),t.seriesMatchingRules.push(r)})),e.studyMatchingRules&&e.studyMatchingRules.forEach((function(e){var r=new gi;r.fromObject(e),t.studyMatchingRules.push(r)})),e.viewportSettings&&(this.viewportSettings=e.viewportSettings)}},{key:"removeRule",value:function(e){var t;e instanceof gi?t=this.studyMatchingRules:e instanceof bi?t=this.seriesMatchingRules:e instanceof Ii&&(t=this.imageMatchingRules),wi(t,e)}}]),e}();function Di(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}var Ei=function(){function e(t,r){f()(this,e),this.id=k(),this.name=r,this.viewportStructure=t,this.viewports=[],this.createdDate=new Date}return p()(e,[{key:"createClone",value:function(t){var r=function(e){for(var t=1;t0&&void 0!==arguments[0]&&arguments[0],t=!0!==e?this.numberOfPriorsReferenced:-1;return t>-1||(t=0,this.stages.forEach((function(e){e.viewports&&e.viewports.forEach((function(e){e.studyMatchingRules&&e.studyMatchingRules.forEach((function(e){var r=e.getNumberOfPriorsReferenced();r>t&&(t=r)}))}))})),this.numberOfPriorsReferenced=t),t}},{key:"updateNumberOfPriorsReferenced",value:function(){this.getNumberOfPriorsReferenced(!0)}},{key:"protocolWasModified",value:function(){ne.userLoggedIn&&ne.userLoggedIn()&&(this.modifiedBy=ne.getUserId()),this.hasUpdatedPriorsInformation=!1,this.updateNumberOfPriorsReferenced(),this.modifiedDate=new Date}},{key:"fromObject",value:function(e){var t=this;this.id=e.id||k(),this.name=e.name,this.locked=!!e.locked,e.protocolMatchingRules&&e.protocolMatchingRules.forEach((function(e){var r=new yi;r.fromObject(e),t.protocolMatchingRules.push(r)})),e.stages&&e.stages.forEach((function(e){var r=new Ei;r.fromObject(e),t.stages.push(r)}))}},{key:"createClone",value:function(t){var r=function(e){for(var t=1;t4&&void 0!==arguments[4]?arguments[4]:{};if(f()(this,e),this.matchedProtocols=new Map,this.matchedProtocolScores={},!(a instanceof Ht))throw new ce("ProtocolEngine::constructor studyMetadataSource is not an instance of StudyMetadataSource");if(!(r instanceof Array||r.every((function(e){return e instanceof ki}))))throw new ce("ProtocolEngine::constructor studies is not an array or it's items are not instances of StudyMetadata");this.protocolStore=t,this.studies=r,this.priorStudies=n instanceof Map?n:new Map,this.studyMetadataSource=a,this.options=i,this.reset(),this.newStageIds=[]}return p()(e,[{key:"reset",value:function(){var e=this.getBestProtocolMatch();this.setHangingProtocol(e)}},{key:"getCurrentStageModel",value:function(){return this.protocol.stages[this.stage]}},{key:"findMatchByStudy",value:function(e){h.trace("ProtocolEngine::findMatchByStudy");var t=[],r=e.getFirstInstance(),n=this.getNumberOfAvailablePriors(e.getObjectID());return this.protocolStore.getProtocol().forEach((function(e){var a=e.protocolMatchingRules.slice();if(a&&!(e.getNumberOfPriorsReferenced()>n)){var i=li(r,a).score;i>0&&t.push({score:i,protocol:e})}})),t.length?(t.sort((function(e,t){return t.score-e.score})),h.trace("ProtocolEngine::findMatchByStudy matched",t),t):[{score:1,protocol:this.protocolStore.getProtocol("defaultProtocol")}]}},{key:"_clearMatchedProtocols",value:function(){this.matchedProtocols.clear(),this.matchedProtocolScores={}}},{key:"updateProtocolMatches",value:function(){var e=this;h.trace("ProtocolEngine::updateProtocolMatches"),this._clearMatchedProtocols(),this.studies.forEach((function(t){e.findMatchByStudy(t).forEach((function(t){var r=t.protocol;r&&(e.matchedProtocols.has(r.id)||(h.trace("ProtocolEngine::updateProtocolMatches inserting protocol match",t),e.matchedProtocols.set(r.id,r),e.matchedProtocolScores[r.id]=t.score))}))}))}},{key:"_largestKeyByValue",value:function(e){return Object.keys(e).reduce((function(t,r){return e[t]>e[r]?t:r}))}},{key:"_getHighestScoringProtocol",value:function(){if(!Object.keys(this.matchedProtocolScores).length)return this.protocolStore.getProtocol("defaultProtocol");var e=this._largestKeyByValue(this.matchedProtocolScores);return this.matchedProtocols.get(e)}},{key:"getBestProtocolMatch",value:function(){this.updateProtocolMatches();var e=this._getHighestScoringProtocol();return h.trace("ProtocolEngine::getBestProtocolMatch bestMatch",e),e}},{key:"getNumberOfAvailablePriors",value:function(e){return this.getAvailableStudyPriors(e).length}},{key:"getAvailableStudyPriors",value:function(e){var t=this.priorStudies.get(e);return t instanceof Array?t:[]}},{key:"matchImages",value:function(e,t){var r=this;h.trace("ProtocolEngine::matchImages");var n,a=e.studyMatchingRules,i=e.seriesMatchingRules,o=e.imageMatchingRules,s=[],u=this.studies[0],c=u.getFirstInstance(),l=0,f=0;u.setCustomAttribute("abstractPriorValue",0),c instanceof ji&&c.setCustomAttribute("abstractPriorValue",0),a.forEach((function(e){if("abstractPriorValue"===e.attribute){var a,i=Object.keys(e.constraint)[0],o=Object.keys(e.constraint[i])[0],s=e.constraint[i][o];if(s=parseInt(s,10),n||(n=r.getAvailableStudyPriors(u.getObjectID())),-1===s)a=n[n.length-1];else{var c=Math.max(s-1,0);a=n[c]}if(!(a instanceof ki))return;var l=a.getObjectID();if(r.studies.find((function(e){return e.getObjectID()===l})))return;r.studyMetadataSource.loadStudy(a).then((function(e){e.setCustomAttribute("abstractPriorValue",s);var n=e.getFirstInstance();n instanceof ji&&n.setCustomAttribute("abstractPriorValue",s),r.studies.push(e),r.updateViewports(t)}),(function(e){throw h.warn(e),new ce("ProtocolEngine::matchImages could not get study metadata for the Study with the following ObjectID: ".concat(l))}))}})),this.studies.forEach((function(e){var t=li(e.getFirstInstance(),a);!0===t.requiredFailed||t.score1&&void 0!==arguments[1])||arguments[1];h.trace("ProtocolEngine::setHangingProtocol newProtocol",e),h.trace("ProtocolEngine::setHangingProtocol updateViewports = ".concat(t)),this.newStageIds=[],Object.prototype.isPrototypeOf.call(e,xi)?this.protocol=e:(this.protocol=new xi,this.protocol.fromObject(e)),this.stage=0,t&&this.updateViewports()}},{key:"isNextStageAvailable",value:function(){var e=this.getNumProtocolStages();return this.stage+1=0}},{key:"setCurrentProtocolStage",value:function(e){return!(-1===e&&!this.isPreviousStageAvailable())&&(!(1===e&&!this.isNextStageAvailable())&&(this.stage+=e,h.trace("ProtocolEngine::setCurrentProtocolStage stage = ".concat(this.stage)),this.updateViewports(),!0))}},{key:"getNumProtocolStages",value:function(){if(this.protocol&&this.protocol.stages&&this.protocol.stages.length)return this.protocol.stages.length}},{key:"nextProtocolStage",value:function(){h.trace("ProtocolEngine::nextProtocolStage"),this.setCurrentProtocolStage(1)||h.trace("ProtocolEngine::nextProtocolStage failed")}},{key:"previousProtocolStage",value:function(){h.trace("ProtocolEngine::previousProtocolStage"),this.setCurrentProtocolStage(-1)||h.trace("ProtocolEngine::previousProtocolStage failed")}}]),e}(),Ai=function(){function e(t){f()(this,e),this.strategy=t}return p()(e,[{key:"onReady",value:function(e){this.strategy.onReady(e)}},{key:"getProtocol",value:function(t){var r=this.strategy.getProtocol(t);return e.getProtocolInstance(r)}},{key:"addProtocol",value:function(e){this.strategy.addProtocol(e)}},{key:"updateProtocol",value:function(e,t){this.strategy.updateProtocol(e,t)}},{key:"removeProtocol",value:function(e){this.strategy.removeProtocol(e)}}],[{key:"getProtocolInstance",value:function(e){var t=e;if(t instanceof Array)t.forEach((function(e,r){if(!(e instanceof xi)){var n=new xi;n.fromObject(e),t[r]=n}}));else if(void 0!==t&&!(t instanceof xi)){var r=new xi;r.fromObject(t),t=r}return t}}]),e}();var Ri=function(){var e=new xi("Default");e.id="defaultProtocol",e.locked=!0;var t=new Si("grid",{Rows:1,Columns:1}),r=new Pi,n=new Ei(t,"oneByOne");return n.viewports.push(r),e.stages.push(n),e}(),Mi={ProtocolEngine:Ti,ProtocolStore:Ai,ProtocolStrategy:function(){function e(){f()(this,e),this.hangingProtocols=new Map,this.defaultsAdded=!1}return p()(e,[{key:"onReady",value:function(e){this.defaultsAdded||(h.info("Inserting the default hanging protocol..."),this.addProtocol(Ri),this.defaultsAdded=!0),e()}},{key:"getProtocol",value:function(e){return e?this.hangingProtocols.get(e):Array.from(this.hangingProtocols.values())}},{key:"addProtocol",value:function(e){this.hangingProtocols.set(e.id,e)}},{key:"updateProtocol",value:function(e,t){this.hangingProtocols.has(e)&&this.hangingProtocols.set(e,t)}},{key:"removeProtocol",value:function(e){this.hangingProtocols.has(e)&&this.hangingProtocols.delete(e)}}]),e}(),addCustomAttribute:function(e,t,r){ui[e]={name:t,callback:r}},addCustomViewportSetting:function(e,t,r,n){fi[e]={id:e,text:t,options:r,callback:n}}},Ui={};var Ni={getNestedObject:function(e){var t={};for(var r in e)if(Object.prototype.hasOwnProperty.call(e,r))for(var n=e[r],a=r.split("."),i=t;a.length;){var o=a.shift();a.length?(i[o]||(i[o]={}),i=i[o]):i[o]=n}return t},getShallowObject:function(e){var t={};return function e(t,r,n){for(var a in r)if(Object.prototype.hasOwnProperty.call(r,a)){var i=t?"".concat(t,".").concat(a):a,o=r[a];"object"===L()(o)?(o instanceof Array&&(i+="[]"),e(i,o,n)):n[i]=o}}("",e,t),t}},Ci={setViewportActive:function(e){return{type:"VIEWPORT::SET_ACTIVE",viewportIndex:e}},setViewportSpecificData:function(e,t){return{type:"VIEWPORT::SET",viewportIndex:e,viewportSpecificData:t}},setViewportLayoutAndData:function(e,t){return{type:"VIEWPORT::SET_VIEWPORT_LAYOUT_AND_DATA",numRows:e.numRows,numColumns:e.numColumns,viewports:e.viewports,viewportSpecificData:t}},setLayout:function(e){return{type:"VIEWPORT::SET_LAYOUT",numRows:e.numRows,numColumns:e.numColumns,viewports:e.viewports}},clearViewportSpecificData:function(e){return{type:"VIEWPORT::CLEAR",viewportIndex:e}},setActiveViewportSpecificData:function(e){return{type:"VIEWPORT::SET_ACTIVE_SPECIFIC_DATA",viewportSpecificData:e}},setStudyLoadingProgress:function(e,t){return{type:"SET_STUDY_LOADING_PROGRESS",progressId:e,progressData:t}},clearStudyLoadingProgress:function(e){return{type:"CLEAR_STUDY_LOADING_PROGRESS",progressId:e}},setUserPreferences:function(e){return{type:"SET_USER_PREFERENCES",state:e}},setExtensionData:function(e,t){return{type:"SET_EXTENSION_DATA",extension:e,data:t}},setTimepoints:function(e){return{type:"SET_TIMEPOINTS",state:e}},setMeasurements:function(e){return{type:"SET_MEASUREMENTS",state:e}},setStudyData:function(e,t){return{type:"SET_STUDY_DATA",StudyInstanceUID:e,data:t}},setServers:function(e){return{type:"SET_SERVERS",servers:e}}};function Fi(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function Li(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:Vi,t=arguments.length>1?arguments[1]:void 0;switch(t.type){case"SET_EXTENSION_DATA":var r=t.extension,n=e[r]||{},a=t.data,i=_()({},r,Li({},n,{},a));return Li({},e,{},i);default:return e}};function $i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function zi(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:Gi,r=arguments.length>1?arguments[1]:void 0;switch(r.type){case"SET_STUDY_LOADING_PROGRESS":return(e=Na()(t).progress)[r.progressId]=r.progressData,zi({},t,{progress:e,lastUpdated:(new Date).getTime()});case"CLEAR_STUDY_LOADING_PROGRESS":return delete(e=Na()(t).progress)[r.progressId],zi({},t,{progress:e,lastUpdated:(new Date).getTime()});default:return t}};function Hi(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function Wi(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:Qi,t=arguments.length>1?arguments[1]:void 0;switch(t.type){case"SET_USER_PREFERENCES":return Wi({},e,{},t.state);default:return e}},Ji=r(67),Yi=r.n(Ji);function Xi(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function Zi(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:eo,t=arguments.length>1?arguments[1]:void 0;switch(t.type){case"ADD_SERVER":var r=Yi()([].concat($()(e.servers),[t.server]),"id");return r.forEach((function(e){return e.active=!0})),Zi({},e,{servers:r});case"ACTIVATE_SERVER":var n=Zi({},t.server,{active:!0}),a=e.servers;return a.forEach((function(e){return e.active=!1})),Zi({},e,{servers:Yi()([].concat($()(a),[n]),"wadoRoot")});case"SET_SERVERS":return Zi({},e,{servers:t.servers});default:return e}};function ro(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function no(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:ao,t=arguments.length>1?arguments[1]:void 0;switch(t.type){case"SET_STUDY_DATA":var r=Na()(e).studyData;return r[t.StudyInstanceUID]=t.data,no({},e,{studyData:r});default:return e}};function oo(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function so(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:uo,t=arguments.length>1?arguments[1]:void 0;switch(t.type){case"SET_TIMEPOINTS":return so({},e,{timepoints:t.state});case"SET_MEASUREMENTS":return so({},e,{measurements:t.state});default:return e}},lo=r(110),fo=r.n(lo);function po(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function ho(e){for(var t=1;t2&&void 0!==arguments[2]?arguments[2]:{},n=e*t,a=Na()(r);return nn-1&&delete a[e]})),a},yo=function(e,t,r){return r>e*t-1?mo.activeViewportIndex:r},go={reducers:{extensions:qi,loading:Bi,preferences:Ki,servers:to,studies:io,timepointManager:co,viewports:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:mo,t=arguments.length>1?arguments[1]:void 0,r=!1;switch(t.type){case"VIEWPORT::SET_ACTIVE":var n=yo(e.numRows,e.numColumns,t.viewportIndex);return ho({},e,{activeViewportIndex:n});case"VIEWPORT::SET_LAYOUT":var a=t.numRows,i=t.numColumns,o=vo(a,i,e.viewportSpecificData),s=yo(a,i,e.activeViewportIndex);return ho({},e,{numRows:t.numRows,numColumns:t.numColumns,layout:{viewports:$()(t.viewports)},viewportSpecificData:o,activeViewportIndex:s});case"VIEWPORT::SET_VIEWPORT_LAYOUT_AND_DATA":var u=t.numRows,c=t.numColumns,l=vo(u,c,t.viewportSpecificData),f=yo(u,c,e.activeViewportIndex);return ho({},e,{numRows:t.numRows,numColumns:t.numColumns,layout:{viewports:$()(t.viewports)},viewportSpecificData:l,activeViewportIndex:f});case"VIEWPORT::SET":var d=Na()(e.layout),p=Na()(e.viewportSpecificData);return p[t.viewportIndex]=fo()({},p[t.viewportIndex],t.viewportSpecificData),t.viewportSpecificData&&t.viewportSpecificData.plugin&&!d.viewports[t.viewportIndex].plugin&&(d.viewports[t.viewportIndex].plugin=t.viewportSpecificData.plugin),ho({},e,{layout:d,viewportSpecificData:p});case"VIEWPORT::SET_ACTIVE_SPECIFIC_DATA":r=!0;case"VIEWPORT::SET_SPECIFIC_DATA":var h=Na()(e.layout),m=r?e.activeViewportIndex:t.viewportIndex,v=Na()(e.viewportSpecificData);return v[m]=ho({},t.viewportSpecificData),t.viewportSpecificData&&t.viewportSpecificData.plugin&&(h.viewports[m].plugin=t.viewportSpecificData.plugin),ho({},e,{layout:h,viewportSpecificData:v});case"VIEWPORT::CLEAR":var y=Na()(e.viewportSpecificData);return t.viewportIndex?(y[t.viewportIndex]={},ho({},e,{viewportSpecificData:y})):mo;default:return e}}},actions:Ci};function bo(e){return e instanceof Object||"object"===L()(e)&&null!==e}function Io(e){return"string"==typeof e}var wo={search:function e(t,r){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[],i=new RegExp(r.trim(),"i");return Object.keys(t).forEach((function(o){var s=t[o];if(s){var u=Io(n)?s[n]:s;Io(u)&&i.test(u)&&a.push(s),bo(s)&&e(s,r,n,a)}})),a},encodeId:function(e){var t=e&&e.toString?e.toString():e;return""===t||"string"!=typeof t?"_":t.replace(/[^a-zA-Z0-9-]/g,(function(e){return"_".concat(e[0].charCodeAt(0).toString(16),"_")}))}};function So(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}var Po={getScrollbarSize:function(){var e=document.createElement("p");e.style.width="100%",e.style.height="100%";var t=document.createElement("div");t.style.position="absolute",t.style.top="0px",t.style.left="0px",t.style.visibility="hidden",t.style.width="100px",t.style.height="100px",t.style.overflow="hidden",t.appendChild(e),document.body.appendChild(t);var r=e.offsetWidth,n=e.offsetHeight;t.style.overflow="scroll";var a=e.offsetWidth,i=e.offsetHeight;return r===a&&(a=t.clientWidth),n===i&&(i=t.clientHeight),document.body.removeChild(t),[r-a,n-i]},getOffset:function(e){var t=0,r=0;if(e.offsetParent)do{r+=e.offsetLeft,t+=e.offsetTop}while(e=e.offsetParent);return{left:r,top:t}},isCharacterKeyPress:function(e){return void 0===e.which||"number"==typeof e.which&&e.which>0&&(!e.ctrlKey&&!e.metaKey&&!e.altKey&&8!==e.which)},handleError:function(e){var t=e.title,r=e.message;t||e instanceof Error&&(t=e.name),r||e instanceof Error&&(r=e.message),function(e){for(var t=1;to&&(n=t.tooLong||this.tooLong||"is too long (maximum is %{count} characters)",u.push(i.format(n,{count:o}))),u.length>0?t.message||u:void 0):(i.error(i.format("Attribute %{attr} has a non numeric value for `length`",{attr:r})),t.message||this.notValid||"has an incorrect length")}},numericality:function(e,t,r,n,a){if(i.isDefined(e)){var o,s,u=[],c={greaterThan:function(e,t){return e>t},greaterThanOrEqualTo:function(e,t){return e>=t},equalTo:function(e,t){return e===t},lessThan:function(e,t){return eo&&(r=t.tooLate||t.message||this.tooLate||"must be no later than %{date}",r=i.format(r,{date:this.format(o,t),value:this.format(e,t)}),n.push(r)),n.length?i.unique(n):void 0)}}),{parse:null,format:null}),date:function(e,t){return t=i.extend({},t,{dateOnly:!0}),i.validators.datetime.call(i.validators.datetime,e,t)},format:function(e,t){(i.isString(t)||t instanceof RegExp)&&(t={pattern:t});var r,n=(t=i.extend({},this.options,t)).message||this.message||"is invalid",a=t.pattern;if(i.isDefined(e))return i.isString(e)?(i.isString(a)&&(a=new RegExp(t.pattern,t.flags)),(r=a.exec(e))&&r[0].length==e.length?void 0:n):n},inclusion:function(e,t){if(i.isDefined(e)&&(i.isArray(t)&&(t={within:t}),t=i.extend({},this.options,t),!i.contains(t.within,e))){var r=t.message||this.message||"^%{value} is not included in the list";return i.format(r,{value:e})}},exclusion:function(e,t){if(i.isDefined(e)&&(i.isArray(t)&&(t={within:t}),t=i.extend({},this.options,t),i.contains(t.within,e))){var r=t.message||this.message||"^%{value} is restricted";return i.format(r,{value:e})}},email:i.extend((function(e,t){var r=(t=i.extend({},this.options,t)).message||this.message||"is not a valid email";if(i.isDefined(e))return i.isString(e)&&this.PATTERN.exec(e)?void 0:r}),{PATTERN:/^[a-z0-9\u007F-\uffff!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9\u007F-\uffff!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z]{2,}$/i}),equality:function(e,t,r,n,a){if(i.isDefined(e)){i.isString(t)&&(t={attribute:t});var o=(t=i.extend({},this.options,t)).message||this.message||"is not equal to %{attribute}";if(i.isEmpty(t.attribute)||!i.isString(t.attribute))throw new Error("The attribute must be a non empty string");var s=i.getDeepObjectValue(n,t.attribute),u=t.comparator||function(e,t){return e===t},c=t.prettify||a&&a.prettify||i.prettify;return u(e,s,t,r,n)?void 0:i.format(o,{attribute:c(t.attribute)})}},url:function(e,t){if(i.isDefined(e)){var r=(t=i.extend({},this.options,t)).message||this.message||"is not a valid url",n=t.schemes||this.schemes||["http","https"],a=t.allowLocal||this.allowLocal||!1;if(!i.isString(e))return r;var o="^(?:(?:"+n.join("|")+")://)(?:\\S+(?::\\S*)?@)?(?:",s="(?:\\.(?:[a-z\\u00a1-\\uffff]{2,}))";return a?s+="?":o+="(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})",o+="(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)*"+s+")(?::\\d{2,5})?(?:[/?#]\\S*)?$",new RegExp(o,"i").exec(e)?void 0:r}}},a.formatters={detailed:function(e){return e},flat:i.flattenErrorsToArray,grouped:function(e){var t;for(t in e=i.groupErrorsByAttribute(e))e[t]=i.flattenErrorsToArray(e[t]);return e},constraint:function(e){var t;for(t in e=i.groupErrorsByAttribute(e))e[t]=e[t].map((function(e){return e.validator})).sort();return e}},a.exposeModule(a,this,e,t,r(106))}).call(this,t,e,r(106))}).call(this,r(36)(e))},,function(e,t,r){var n=r(138),a=r(144);e.exports=function(e,t){var r=a(e,t);return n(r)?r:void 0}},function(e,t){e.exports=function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}},function(e,t,r){var n=r(26),a=r(140),i=r(141),o=n?n.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":o&&o in Object(e)?a(e):i(e)}},function(e,t,r){"use strict";function n(e,t,r){var n=r?" !== ":" === ",a=r?" || ":" && ",i=r?"!":"",o=r?"":"!";switch(e){case"null":return t+n+"null";case"array":return i+"Array.isArray("+t+")";case"object":return"("+i+t+a+"typeof "+t+n+'"object"'+a+o+"Array.isArray("+t+"))";case"integer":return"(typeof "+t+n+'"number"'+a+o+"("+t+" % 1)"+a+t+n+t+")";default:return"typeof "+t+n+'"'+e+'"'}}e.exports={copy:function(e,t){for(var r in t=t||{},e)t[r]=e[r];return t},checkDataType:n,checkDataTypes:function(e,t){switch(e.length){case 1:return n(e[0],t,!0);default:var r="",a=i(e);for(var o in a.array&&a.object&&(r=a.null?"(":"(!"+t+" || ",r+="typeof "+t+' !== "object")',delete a.null,delete a.array,delete a.object),a.number&&delete a.integer,a)r+=(r?" && ":"")+n(o,t,!0);return r}},coerceToTypes:function(e,t){if(Array.isArray(t)){for(var r=[],n=0;n=t)throw new Error("Cannot access property/index "+n+" levels up, current level is "+t);return r[t-n]}if(n>t)throw new Error("Cannot access data "+n+" levels up, current level is "+t);if(i="data"+(t-n||""),!a)return i}for(var s=i,c=a.split("/"),l=0;l{t=/\[(\d*)\]$/.exec(e),e=e.replace(/\[\d*\]$/,""),t?(void 0===n[e]&&(n[e]={}),n[e][t[1]]=r):n[e]=r};case"bracket":return(e,r,n)=>{t=/(\[\])$/.exec(e),e=e.replace(/\[\]$/,""),t?void 0!==n[e]?n[e]=[].concat(n[e],r):n[e]=[r]:n[e]=r};case"comma":case"separator":return(t,r,n)=>{const a="string"==typeof r&&r.split("").indexOf(e.arrayFormatSeparator)>-1?r.split(e.arrayFormatSeparator).map(t=>u(t,e)):null===r?r:u(r,e);n[t]=a};default:return(e,t,r)=>{void 0!==r[e]?r[e]=[].concat(r[e],t):r[e]=t}}}(t),n=Object.create(null);if("string"!=typeof e)return n;if(!(e=e.trim().replace(/^[?#&]/,"")))return n;for(const a of e.split("&")){let[e,o]=i(t.decode?a.replace(/\+/g," "):a,"=");o=void 0===o?null:["comma","separator"].includes(t.arrayFormat)?o:u(o,t),r(u(e,t),o,n)}for(const e of Object.keys(n)){const r=n[e];if("object"==typeof r&&null!==r)for(const e of Object.keys(r))r[e]=f(r[e],t);else n[e]=f(r,t)}return!1===t.sort?n:(!0===t.sort?Object.keys(n).sort():Object.keys(n).sort(t.sort)).reduce((e,t)=>{const r=n[t];return Boolean(r)&&"object"==typeof r&&!Array.isArray(r)?e[t]=function e(t){return Array.isArray(t)?t.sort():"object"==typeof t?e(Object.keys(t)).sort((e,t)=>Number(e)-Number(t)).map(e=>t[e]):t}(r):e[t]=r,e},Object.create(null))}t.extract=l,t.parse=d,t.stringify=(e,t)=>{if(!e)return"";o((t=Object.assign({encode:!0,strict:!0,arrayFormat:"none",arrayFormatSeparator:","},t)).arrayFormatSeparator);const r=r=>t.skipNull&&null==e[r]||t.skipEmptyString&&""===e[r],n=function(e){switch(e.arrayFormat){case"index":return t=>(r,n)=>{const a=r.length;return void 0===n||e.skipNull&&null===n||e.skipEmptyString&&""===n?r:null===n?[...r,[s(t,e),"[",a,"]"].join("")]:[...r,[s(t,e),"[",s(a,e),"]=",s(n,e)].join("")]};case"bracket":return t=>(r,n)=>void 0===n||e.skipNull&&null===n||e.skipEmptyString&&""===n?r:null===n?[...r,[s(t,e),"[]"].join("")]:[...r,[s(t,e),"[]=",s(n,e)].join("")];case"comma":case"separator":return t=>(r,n)=>null==n||0===n.length?r:0===r.length?[[s(t,e),"=",s(n,e)].join("")]:[[r,s(n,e)].join(e.arrayFormatSeparator)];default:return t=>(r,n)=>void 0===n||e.skipNull&&null===n||e.skipEmptyString&&""===n?r:null===n?[...r,s(t,e)]:[...r,[s(t,e),"=",s(n,e)].join("")]}}(t),a={};for(const t of Object.keys(e))r(t)||(a[t]=e[t]);const i=Object.keys(a);return!1!==t.sort&&i.sort(t.sort),i.map(r=>{const a=e[r];return void 0===a?"":null===a?s(r,t):Array.isArray(a)?a.reduce(n(r),[]).join("&"):s(r,t)+"="+s(a,t)}).filter(e=>e.length>0).join("&")},t.parseUrl=(e,t)=>({url:c(e).split("?")[0]||"",query:d(l(e),t)}),t.stringifyUrl=(e,r)=>{const n=c(e.url).split("?")[0]||"",a=t.extract(e.url),i=t.parse(a),o=function(e){let t="";const r=e.indexOf("#");return-1!==r&&(t=e.slice(r)),t}(e.url),s=Object.assign(i,e.query);let u=t.stringify(s,r);return u&&(u="?"+u),`${n}${u}${o}`}},function(e,t,r){var n;!function(a,i,o){if(a){for(var s,u={8:"backspace",9:"tab",13:"enter",16:"shift",17:"ctrl",18:"alt",20:"capslock",27:"esc",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down",45:"ins",46:"del",91:"meta",93:"meta",224:"meta"},c={106:"*",107:"+",109:"-",110:".",111:"/",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'"},l={"~":"`","!":"1","@":"2","#":"3",$:"4","%":"5","^":"6","&":"7","*":"8","(":"9",")":"0",_:"-","+":"=",":":";",'"':"'","<":",",">":".","?":"/","|":"\\"},f={option:"alt",command:"meta",return:"enter",escape:"esc",plus:"+",mod:/Mac|iPod|iPhone|iPad/.test(navigator.platform)?"meta":"ctrl"},d=1;d<20;++d)u[111+d]="f"+d;for(d=0;d<=9;++d)u[d+96]=d.toString();g.prototype.bind=function(e,t,r){return e=e instanceof Array?e:[e],this._bindMultiple.call(this,e,t,r),this},g.prototype.unbind=function(e,t){return this.bind.call(this,e,(function(){}),t)},g.prototype.trigger=function(e,t){return this._directMap[e+":"+t]&&this._directMap[e+":"+t]({},e),this},g.prototype.reset=function(){return this._callbacks={},this._directMap={},this},g.prototype.stopCallback=function(e,t){if((" "+t.className+" ").indexOf(" mousetrap ")>-1)return!1;if(function e(t,r){return null!==t&&t!==i&&(t===r||e(t.parentNode,r))}(t,this.target))return!1;if("composedPath"in e&&"function"==typeof e.composedPath){var r=e.composedPath()[0];r!==e.target&&(t=r)}return"INPUT"==t.tagName||"SELECT"==t.tagName||"TEXTAREA"==t.tagName||t.isContentEditable},g.prototype.handleKey=function(){var e=this;return e._handleKey.apply(e,arguments)},g.addKeycodes=function(e){for(var t in e)e.hasOwnProperty(t)&&(u[t]=e[t]);s=null},g.init=function(){var e=g(i);for(var t in e)"_"!==t.charAt(0)&&(g[t]=function(t){return function(){return e[t].apply(e,arguments)}}(t))},g.init(),a.Mousetrap=g,e.exports&&(e.exports=g),void 0===(n=function(){return g}.call(t,r,t,e))||(e.exports=n)}function p(e,t,r){e.addEventListener?e.addEventListener(t,r,!1):e.attachEvent("on"+t,r)}function h(e){if("keypress"==e.type){var t=String.fromCharCode(e.which);return e.shiftKey||(t=t.toLowerCase()),t}return u[e.which]?u[e.which]:c[e.which]?c[e.which]:String.fromCharCode(e.which).toLowerCase()}function m(e){return"shift"==e||"ctrl"==e||"alt"==e||"meta"==e}function v(e,t,r){return r||(r=function(){if(!s)for(var e in s={},u)e>95&&e<112||u.hasOwnProperty(e)&&(s[u[e]]=e);return s}()[e]?"keydown":"keypress"),"keypress"==r&&t.length&&(r="keydown"),r}function y(e,t){var r,n,a,i=[];for(r=function(e){return"+"===e?["+"]:(e=e.replace(/\+{2}/g,"+plus")).split("+")}(e),a=0;a1?d(e,s,r,n):(o=y(e,n),t._callbacks[o.key]=t._callbacks[o.key]||[],c(o.key,o.modifiers,{type:o.action},a,e,i),t._callbacks[o.key][a?"unshift":"push"]({callback:r,modifiers:o.modifiers,action:o.action,seq:a,level:i,combo:e}))}t._handleKey=function(e,t,r){var n,a=c(e,t,r),i={},f=0,d=!1;for(n=0;n-1&&e%1==0&&e-1&&e%1==0&&e<=9007199254740991}},function(e,t){e.exports=function(e){return function(t){return e(t)}}},function(e,t,r){(function(e){var n=r(71),a=t&&!t.nodeType&&t,i=a&&"object"==typeof e&&e&&!e.nodeType&&e,o=i&&i.exports===a&&n.process,s=function(){try{var e=i&&i.require&&i.require("util").types;return e||o&&o.binding&&o.binding("util")}catch(e){}}();e.exports=s}).call(this,r(36)(e))},function(e,t){var r=Object.prototype;e.exports=function(e){var t=e&&e.constructor;return e===("function"==typeof t&&t.prototype||r)}},function(e,t,r){var n=r(169),a=r(79),i=Object.prototype.propertyIsEnumerable,o=Object.getOwnPropertySymbols,s=o?function(e){return null==e?[]:(e=Object(e),n(o(e),(function(t){return i.call(e,t)})))}:a;e.exports=s},function(e,t,r){var n=r(76)(Object.getPrototypeOf,Object);e.exports=n},function(e,t,r){var n=r(85);e.exports=function(e){var t=new e.constructor(e.byteLength);return new n(t).set(new n(e)),t}},function(e,t){e.exports=function(e){var t=-1,r=Array(e.size);return e.forEach((function(e){r[++t]=e})),r}},function(e,t,r){var n=r(15),a=r(61),i=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,o=/^\w*$/;e.exports=function(e,t){if(n(e))return!1;var r=typeof e;return!("number"!=r&&"symbol"!=r&&"boolean"!=r&&null!=e&&!a(e))||(o.test(e)||!i.test(e)||null!=t&&e in Object(t))}},function(e,t,r){var n=r(23),a=r(17);e.exports=function(e){return"symbol"==typeof e||a(e)&&"[object Symbol]"==n(e)}},function(e,t){e.exports=function(e){return e}},function(e,t,r){"use strict";var n=r(236),a=r(64),i=r(24),o=r(98),s=r(238);function u(e,t,r){var n=this._refs[r];if("string"==typeof n){if(!this._refs[n])return u.call(this,e,t,n);n=this._refs[n]}if((n=n||this._schemas[r])instanceof o)return h(n.schema,this._opts.inlineRefs)?n.schema:n.validate||this._compile(n);var a,i,s,l=c.call(this,t,r);return l&&(a=l.schema,t=l.root,s=l.baseId),a instanceof o?i=a.validate||e.call(this,a.schema,t,void 0,s):void 0!==a&&(i=h(a,this._opts.inlineRefs)?a:e.call(this,a,t,void 0,s)),i}function c(e,t){var r=n.parse(t),a=v(r),i=m(this._getId(e.schema));if(0===Object.keys(e.schema).length||a!==i){var s=g(a),u=this._refs[s];if("string"==typeof u)return l.call(this,e,u,r);if(u instanceof o)u.validate||this._compile(u),e=u;else{if(!((u=this._schemas[s])instanceof o))return;if(u.validate||this._compile(u),s==g(t))return{schema:u,root:e,baseId:i};e=u}if(!e.schema)return;i=m(this._getId(e.schema))}return d.call(this,r,i,e.schema,e)}function l(e,t,r){var n=c.call(this,e,t);if(n){var a=n.schema,i=n.baseId;e=n.root;var o=this._getId(a);return o&&(i=b(i,o)),d.call(this,r,i,a,e)}}e.exports=u,u.normalizeId=g,u.fullPath=m,u.url=b,u.ids=function(e){var t=g(this._getId(e)),r={"":t},o={"":m(t,!1)},u={},c=this;return s(e,{allKeys:!0},(function(e,t,s,l,f,d,p){if(""!==t){var h=c._getId(e),m=r[l],v=o[l]+"/"+f;if(void 0!==p&&(v+="/"+("number"==typeof p?p:i.escapeFragment(p))),"string"==typeof h){h=m=g(m?n.resolve(m,h):h);var y=c._refs[h];if("string"==typeof y&&(y=c._refs[y]),y&&y.schema){if(!a(e,y.schema))throw new Error('id "'+h+'" resolves to more than one schema')}else if(h!=g(v))if("#"==h[0]){if(u[h]&&!a(e,u[h]))throw new Error('id "'+h+'" resolves to more than one schema');u[h]=e}else c._refs[h]=v}r[t]=m,o[t]=v}})),u},u.inlineRef=h,u.schema=c;var f=i.toHash(["properties","patternProperties","enum","dependencies","definitions"]);function d(e,t,r,n){if(e.fragment=e.fragment||"","/"==e.fragment.slice(0,1)){for(var a=e.fragment.split("/"),o=1;oe.length)&&(t=e.length);for(var r=0,n=new Array(t);rl))return!1;var d=u.get(e);if(d&&u.get(t))return d==t;var p=-1,h=!0,m=2&r?new n:void 0;for(u.set(e,t),u.set(t,e);++p",g=p?">":"<",b=void 0;if(v){var I=e.util.getData(m.$data,o,e.dataPathArr),w="exclusive"+i,S="exclType"+i,P="exclIsNumber"+i,D="' + "+(x="op"+i)+" + '";a+=" var schemaExcl"+i+" = "+I+"; ",a+=" var "+w+"; var "+S+" = typeof "+(I="schemaExcl"+i)+"; if ("+S+" != 'boolean' && "+S+" != 'undefined' && "+S+" != 'number') { ";var E;b=h;(E=E||[]).push(a),a="",!1!==e.createErrors?(a+=" { keyword: '"+(b||"_exclusiveLimit")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(c)+" , params: {} ",!1!==e.opts.messages&&(a+=" , message: '"+h+" should be boolean' "),e.opts.verbose&&(a+=" , schema: validate.schema"+u+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+f+" "),a+=" } "):a+=" {} ";var O=a;a=E.pop(),!e.compositeRule&&l?e.async?a+=" throw new ValidationError(["+O+"]); ":a+=" validate.errors = ["+O+"]; return false; ":a+=" var err = "+O+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+=" } else if ( ",d&&(a+=" ("+n+" !== undefined && typeof "+n+" != 'number') || "),a+=" "+S+" == 'number' ? ( ("+w+" = "+n+" === undefined || "+I+" "+y+"= "+n+") ? "+f+" "+g+"= "+I+" : "+f+" "+g+" "+n+" ) : ( ("+w+" = "+I+" === true) ? "+f+" "+g+"= "+n+" : "+f+" "+g+" "+n+" ) || "+f+" !== "+f+") { var op"+i+" = "+w+" ? '"+y+"' : '"+y+"='; ",void 0===s&&(b=h,c=e.errSchemaPath+"/"+h,n=I,d=v)}else{D=y;if((P="number"==typeof m)&&d){var x="'"+D+"'";a+=" if ( ",d&&(a+=" ("+n+" !== undefined && typeof "+n+" != 'number') || "),a+=" ( "+n+" === undefined || "+m+" "+y+"= "+n+" ? "+f+" "+g+"= "+m+" : "+f+" "+g+" "+n+" ) || "+f+" !== "+f+") { "}else{P&&void 0===s?(w=!0,b=h,c=e.errSchemaPath+"/"+h,n=m,g+="="):(P&&(n=Math[p?"min":"max"](m,s)),m===(!P||n)?(w=!0,b=h,c=e.errSchemaPath+"/"+h,g+="="):(w=!1,D+="="));x="'"+D+"'";a+=" if ( ",d&&(a+=" ("+n+" !== undefined && typeof "+n+" != 'number') || "),a+=" "+f+" "+g+" "+n+" || "+f+" !== "+f+") { "}}b=b||t,(E=E||[]).push(a),a="",!1!==e.createErrors?(a+=" { keyword: '"+(b||"_limit")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(c)+" , params: { comparison: "+x+", limit: "+n+", exclusive: "+w+" } ",!1!==e.opts.messages&&(a+=" , message: 'should be "+D+" ",a+=d?"' + "+n:n+"'"),e.opts.verbose&&(a+=" , schema: ",a+=d?"validate.schema"+u:""+s,a+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+f+" "),a+=" } "):a+=" {} ";O=a;return a=E.pop(),!e.compositeRule&&l?e.async?a+=" throw new ValidationError(["+O+"]); ":a+=" validate.errors = ["+O+"]; return false; ":a+=" var err = "+O+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+=" } ",l&&(a+=" else { "),a}},function(e,t,r){"use strict";e.exports=function(e,t,r){var n,a=" ",i=e.level,o=e.dataLevel,s=e.schema[t],u=e.schemaPath+e.util.getProperty(t),c=e.errSchemaPath+"/"+t,l=!e.opts.allErrors,f="data"+(o||""),d=e.opts.$data&&s&&s.$data;d?(a+=" var schema"+i+" = "+e.util.getData(s.$data,o,e.dataPathArr)+"; ",n="schema"+i):n=s,a+="if ( ",d&&(a+=" ("+n+" !== undefined && typeof "+n+" != 'number') || "),a+=" "+f+".length "+("maxItems"==t?">":"<")+" "+n+") { ";var p=t,h=h||[];h.push(a),a="",!1!==e.createErrors?(a+=" { keyword: '"+(p||"_limitItems")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(c)+" , params: { limit: "+n+" } ",!1!==e.opts.messages&&(a+=" , message: 'should NOT have ",a+="maxItems"==t?"more":"fewer",a+=" than ",a+=d?"' + "+n+" + '":""+s,a+=" items' "),e.opts.verbose&&(a+=" , schema: ",a+=d?"validate.schema"+u:""+s,a+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+f+" "),a+=" } "):a+=" {} ";var m=a;return a=h.pop(),!e.compositeRule&&l?e.async?a+=" throw new ValidationError(["+m+"]); ":a+=" validate.errors = ["+m+"]; return false; ":a+=" var err = "+m+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+="} ",l&&(a+=" else { "),a}},function(e,t,r){"use strict";e.exports=function(e,t,r){var n,a=" ",i=e.level,o=e.dataLevel,s=e.schema[t],u=e.schemaPath+e.util.getProperty(t),c=e.errSchemaPath+"/"+t,l=!e.opts.allErrors,f="data"+(o||""),d=e.opts.$data&&s&&s.$data;d?(a+=" var schema"+i+" = "+e.util.getData(s.$data,o,e.dataPathArr)+"; ",n="schema"+i):n=s;var p="maxLength"==t?">":"<";a+="if ( ",d&&(a+=" ("+n+" !== undefined && typeof "+n+" != 'number') || "),!1===e.opts.unicode?a+=" "+f+".length ":a+=" ucs2length("+f+") ",a+=" "+p+" "+n+") { ";var h=t,m=m||[];m.push(a),a="",!1!==e.createErrors?(a+=" { keyword: '"+(h||"_limitLength")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(c)+" , params: { limit: "+n+" } ",!1!==e.opts.messages&&(a+=" , message: 'should NOT be ",a+="maxLength"==t?"longer":"shorter",a+=" than ",a+=d?"' + "+n+" + '":""+s,a+=" characters' "),e.opts.verbose&&(a+=" , schema: ",a+=d?"validate.schema"+u:""+s,a+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+f+" "),a+=" } "):a+=" {} ";var v=a;return a=m.pop(),!e.compositeRule&&l?e.async?a+=" throw new ValidationError(["+v+"]); ":a+=" validate.errors = ["+v+"]; return false; ":a+=" var err = "+v+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+="} ",l&&(a+=" else { "),a}},function(e,t,r){"use strict";e.exports=function(e,t,r){var n,a=" ",i=e.level,o=e.dataLevel,s=e.schema[t],u=e.schemaPath+e.util.getProperty(t),c=e.errSchemaPath+"/"+t,l=!e.opts.allErrors,f="data"+(o||""),d=e.opts.$data&&s&&s.$data;d?(a+=" var schema"+i+" = "+e.util.getData(s.$data,o,e.dataPathArr)+"; ",n="schema"+i):n=s,a+="if ( ",d&&(a+=" ("+n+" !== undefined && typeof "+n+" != 'number') || "),a+=" Object.keys("+f+").length "+("maxProperties"==t?">":"<")+" "+n+") { ";var p=t,h=h||[];h.push(a),a="",!1!==e.createErrors?(a+=" { keyword: '"+(p||"_limitProperties")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(c)+" , params: { limit: "+n+" } ",!1!==e.opts.messages&&(a+=" , message: 'should NOT have ",a+="maxProperties"==t?"more":"fewer",a+=" than ",a+=d?"' + "+n+" + '":""+s,a+=" properties' "),e.opts.verbose&&(a+=" , schema: ",a+=d?"validate.schema"+u:""+s,a+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+f+" "),a+=" } "):a+=" {} ";var m=a;return a=h.pop(),!e.compositeRule&&l?e.async?a+=" throw new ValidationError(["+m+"]); ":a+=" validate.errors = ["+m+"]; return false; ":a+=" var err = "+m+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+="} ",l&&(a+=" else { "),a}},function(e){e.exports=JSON.parse('{"$schema":"http://json-schema.org/draft-07/schema#","$id":"http://json-schema.org/draft-07/schema#","title":"Core schema meta-schema","definitions":{"schemaArray":{"type":"array","minItems":1,"items":{"$ref":"#"}},"nonNegativeInteger":{"type":"integer","minimum":0},"nonNegativeIntegerDefault0":{"allOf":[{"$ref":"#/definitions/nonNegativeInteger"},{"default":0}]},"simpleTypes":{"enum":["array","boolean","integer","null","number","object","string"]},"stringArray":{"type":"array","items":{"type":"string"},"uniqueItems":true,"default":[]}},"type":["object","boolean"],"properties":{"$id":{"type":"string","format":"uri-reference"},"$schema":{"type":"string","format":"uri"},"$ref":{"type":"string","format":"uri-reference"},"$comment":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"default":true,"readOnly":{"type":"boolean","default":false},"examples":{"type":"array","items":true},"multipleOf":{"type":"number","exclusiveMinimum":0},"maximum":{"type":"number"},"exclusiveMaximum":{"type":"number"},"minimum":{"type":"number"},"exclusiveMinimum":{"type":"number"},"maxLength":{"$ref":"#/definitions/nonNegativeInteger"},"minLength":{"$ref":"#/definitions/nonNegativeIntegerDefault0"},"pattern":{"type":"string","format":"regex"},"additionalItems":{"$ref":"#"},"items":{"anyOf":[{"$ref":"#"},{"$ref":"#/definitions/schemaArray"}],"default":true},"maxItems":{"$ref":"#/definitions/nonNegativeInteger"},"minItems":{"$ref":"#/definitions/nonNegativeIntegerDefault0"},"uniqueItems":{"type":"boolean","default":false},"contains":{"$ref":"#"},"maxProperties":{"$ref":"#/definitions/nonNegativeInteger"},"minProperties":{"$ref":"#/definitions/nonNegativeIntegerDefault0"},"required":{"$ref":"#/definitions/stringArray"},"additionalProperties":{"$ref":"#"},"definitions":{"type":"object","additionalProperties":{"$ref":"#"},"default":{}},"properties":{"type":"object","additionalProperties":{"$ref":"#"},"default":{}},"patternProperties":{"type":"object","additionalProperties":{"$ref":"#"},"propertyNames":{"format":"regex"},"default":{}},"dependencies":{"type":"object","additionalProperties":{"anyOf":[{"$ref":"#"},{"$ref":"#/definitions/stringArray"}]}},"propertyNames":{"$ref":"#"},"const":true,"enum":{"type":"array","items":true,"minItems":1,"uniqueItems":true},"type":{"anyOf":[{"$ref":"#/definitions/simpleTypes"},{"type":"array","items":{"$ref":"#/definitions/simpleTypes"},"minItems":1,"uniqueItems":true}]},"format":{"type":"string"},"contentMediaType":{"type":"string"},"contentEncoding":{"type":"string"},"if":{"$ref":"#"},"then":{"$ref":"#"},"else":{"$ref":"#"},"allOf":{"$ref":"#/definitions/schemaArray"},"anyOf":{"$ref":"#/definitions/schemaArray"},"oneOf":{"$ref":"#/definitions/schemaArray"},"not":{"$ref":"#"}},"default":true}')},function(e,t){e.exports=function(){throw new Error("define cannot be used indirect")}},function(e,t,r){var n=r(3),a=r(44),i=r(123),o=r(66);function s(t){var r="function"==typeof Map?new Map:void 0;return e.exports=s=function(e){if(null===e||!i(e))return e;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==r){if(r.has(e))return r.get(e);r.set(e,t)}function t(){return o(e,arguments,n(this).constructor)}return t.prototype=Object.create(e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),a(t,e)},s(t)}e.exports=s},function(e,t){e.exports=function(e){var t;if("undefined"!=typeof Symbol){if(Symbol.asyncIterator&&null!=(t=e[Symbol.asyncIterator]))return t.call(e);if(Symbol.iterator&&null!=(t=e[Symbol.iterator]))return t.call(e)}throw new TypeError("Object is not async iterable")}},function(e,t,r){var n=r(126);e.exports=function(e){return function(){return new n(e.apply(this,arguments))}}},function(e,t,r){var n=r(219),a=r(226)((function(e,t,r){n(e,t,r)}));e.exports=a},function(e){e.exports=JSON.parse('{"both":{"Location":{}},"baseline":{"TargetType":{},"MaxTargetsPerOrgan":{"limit":2},"MaxTargets":{"limit":5},"MeasurementsLength":[{"longAxis":10,"longAxisSliceThicknessMultiplier":2,"modalityIn":["CT","MR"],"locationNotIn":["Lymph Node"],"message":"Extranodal lesions must be >= 10mm long axis AND >= double the acquisition slice thickness by CT and MR"},{"shortAxis":20,"longAxis":20,"modalityIn":["PX","XA"],"locationNotIn":["Lymph Node"],"message":"Extranodal lesions must be >= 20mm on chest x-ray (although x-rays rarely used for clinical trial assessment)"},{"shortAxis":15,"shortAxisSliceThicknessMultiplier":2,"modalityIn":["CT","MR"],"locationIn":["Lymph Node"],"message":"Nodal lesions must be >= 15mm short axis AND >= double the acquisition slice thickness by CT and MR"}]},"followup":{}}')},function(e,t,r){"use strict";var n=r(235),a=r(63),i=r(239),o=r(98),s=r(99),u=r(240),c=r(241),l=r(262),f=r(24);e.exports=y,y.prototype.validate=function(e,t){var r;if("string"==typeof e){if(!(r=this.getSchema(e)))throw new Error('no schema with key or ref "'+e+'"')}else{var n=this._addSchema(e);r=n.validate||this._compile(n)}var a=r(t);!0!==r.$async&&(this.errors=r.errors);return a},y.prototype.compile=function(e,t){var r=this._addSchema(e,void 0,t);return r.validate||this._compile(r)},y.prototype.addSchema=function(e,t,r,n){if(Array.isArray(e)){for(var i=0;i=0;--a){var i=this.tryEntries[a],o=i.completion;if("root"===i.tryLoc)return n("end");if(i.tryLoc<=this.prev){var s=r.call(i,"catchLoc"),u=r.call(i,"finallyLoc");if(s&&u){if(this.prev=0;--n){var a=this.tryEntries[n];if(a.tryLoc<=this.prev&&r.call(a,"finallyLoc")&&this.prev=0;--t){var r=this.tryEntries[t];if(r.finallyLoc===e)return this.complete(r.completion,r.afterLoc),w(r),c}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var r=this.tryEntries[t];if(r.tryLoc===e){var n=r.completion;if("throw"===n.type){var a=n.arg;w(r)}return a}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,r){return this.delegate={iterator:P(e),resultName:t,nextLoc:r},"next"===this.method&&(this.arg=void 0),c}},e}(e.exports);try{regeneratorRuntime=n}catch(e){Function("r","regeneratorRuntime = r")(n)}},function(e,t,r){"use strict";e.exports=e=>encodeURIComponent(e).replace(/[!'()*]/g,e=>"%"+e.charCodeAt(0).toString(16).toUpperCase())},function(e,t,r){"use strict";var n=new RegExp("%[a-f0-9]{2}","gi"),a=new RegExp("(%[a-f0-9]{2})+","gi");function i(e,t){try{return decodeURIComponent(e.join(""))}catch(e){}if(1===e.length)return e;t=t||1;var r=e.slice(0,t),n=e.slice(t);return Array.prototype.concat.call([],i(r),i(n))}function o(e){try{return decodeURIComponent(e)}catch(a){for(var t=e.match(n),r=1;r{if("string"!=typeof e||"string"!=typeof t)throw new TypeError("Expected the arguments to be of type `string`");if(""===t)return[e];const r=e.indexOf(t);return-1===r?[e]:[e.slice(0,r),e.slice(r+t.length)]}},function(e,t){e.exports=function(e){return-1!==Function.toString.call(e).indexOf("[native code]")}},function(e,t){e.exports=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}},function(e,t,r){var n=r(70);e.exports=function(e){return new n(e)}},function(e,t,r){var n=r(70);function a(e){var t,r;function a(t,r){try{var o=e[t](r),s=o.value,u=s instanceof n;Promise.resolve(u?s.wrapped:s).then((function(e){u?a("return"===t?"return":"next",e):i(o.done?"return":"normal",e)}),(function(e){a("throw",e)}))}catch(e){i("throw",e)}}function i(e,n){switch(e){case"return":t.resolve({value:n,done:!0});break;case"throw":t.reject(n);break;default:t.resolve({value:n,done:!1})}(t=t.next)?a(t.key,t.arg):r=null}this._invoke=function(e,n){return new Promise((function(i,o){var s={key:e,arg:n,resolve:i,reject:o,next:null};r?r=r.next=s:(t=r=s,a(e,n))}))},"function"!=typeof e.return&&(this.return=void 0)}"function"==typeof Symbol&&Symbol.asyncIterator&&(a.prototype[Symbol.asyncIterator]=function(){return this}),a.prototype.next=function(e){return this._invoke("next",e)},a.prototype.throw=function(e){return this._invoke("throw",e)},a.prototype.return=function(e){return this._invoke("return",e)},e.exports=a},function(e,t,r){var n=r(29),a=r(157),i=r(73),o=r(158),s=r(165),u=r(77),c=r(78),l=r(168),f=r(170),d=r(82),p=r(171),h=r(39),m=r(175),v=r(176),y=r(87),g=r(15),b=r(35),I=r(181),w=r(16),S=r(183),P=r(34),D={};D["[object Arguments]"]=D["[object Array]"]=D["[object ArrayBuffer]"]=D["[object DataView]"]=D["[object Boolean]"]=D["[object Date]"]=D["[object Float32Array]"]=D["[object Float64Array]"]=D["[object Int8Array]"]=D["[object Int16Array]"]=D["[object Int32Array]"]=D["[object Map]"]=D["[object Number]"]=D["[object Object]"]=D["[object RegExp]"]=D["[object Set]"]=D["[object String]"]=D["[object Symbol]"]=D["[object Uint8Array]"]=D["[object Uint8ClampedArray]"]=D["[object Uint16Array]"]=D["[object Uint32Array]"]=!0,D["[object Error]"]=D["[object Function]"]=D["[object WeakMap]"]=!1,e.exports=function e(t,r,E,O,x,_){var k,j=1&r,T=2&r,A=4&r;if(E&&(k=x?E(t,O,x,_):E(t)),void 0!==k)return k;if(!w(t))return t;var R=g(t);if(R){if(k=m(t),!j)return c(t,k)}else{var M=h(t),U="[object Function]"==M||"[object GeneratorFunction]"==M;if(b(t))return u(t,j);if("[object Object]"==M||"[object Arguments]"==M||U&&!x){if(k=T||U?{}:y(t),!j)return T?f(t,s(k,t)):l(t,o(k,t))}else{if(!D[M])return x?t:{};k=v(t,M,j)}}_||(_=new n);var N=_.get(t);if(N)return N;_.set(t,k),S(t)?t.forEach((function(n){k.add(e(n,r,E,n,t,_))})):I(t)&&t.forEach((function(n,a){k.set(a,e(n,r,E,a,t,_))}));var C=A?T?p:d:T?keysIn:P,F=R?void 0:C(t);return a(F||t,(function(n,a){F&&(n=t[a=n]),i(k,a,e(n,r,E,a,t,_))})),k}},function(e,t){e.exports=function(){this.__data__=[],this.size=0}},function(e,t,r){var n=r(31),a=Array.prototype.splice;e.exports=function(e){var t=this.__data__,r=n(t,e);return!(r<0)&&(r==t.length-1?t.pop():a.call(t,r,1),--this.size,!0)}},function(e,t,r){var n=r(31);e.exports=function(e){var t=this.__data__,r=n(t,e);return r<0?void 0:t[r][1]}},function(e,t,r){var n=r(31);e.exports=function(e){return n(this.__data__,e)>-1}},function(e,t,r){var n=r(31);e.exports=function(e,t){var r=this.__data__,a=n(r,e);return a<0?(++this.size,r.push([e,t])):r[a][1]=t,this}},function(e,t,r){var n=r(30);e.exports=function(){this.__data__=new n,this.size=0}},function(e,t){e.exports=function(e){var t=this.__data__,r=t.delete(e);return this.size=t.size,r}},function(e,t){e.exports=function(e){return this.__data__.get(e)}},function(e,t){e.exports=function(e){return this.__data__.has(e)}},function(e,t,r){var n=r(30),a=r(45),i=r(47);e.exports=function(e,t){var r=this.__data__;if(r instanceof n){var o=r.__data__;if(!a||o.length<199)return o.push([e,t]),this.size=++r.size,this;r=this.__data__=new i(o)}return r.set(e,t),this.size=r.size,this}},function(e,t,r){var n=r(46),a=r(142),i=r(16),o=r(72),s=/^\[object .+?Constructor\]$/,u=Function.prototype,c=Object.prototype,l=u.toString,f=c.hasOwnProperty,d=RegExp("^"+l.call(f).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");e.exports=function(e){return!(!i(e)||a(e))&&(n(e)?d:s).test(o(e))}},function(e,t){var r;r=function(){return this}();try{r=r||new Function("return this")()}catch(e){"object"==typeof window&&(r=window)}e.exports=r},function(e,t,r){var n=r(26),a=Object.prototype,i=a.hasOwnProperty,o=a.toString,s=n?n.toStringTag:void 0;e.exports=function(e){var t=i.call(e,s),r=e[s];try{e[s]=void 0;var n=!0}catch(e){}var a=o.call(e);return n&&(t?e[s]=r:delete e[s]),a}},function(e,t){var r=Object.prototype.toString;e.exports=function(e){return r.call(e)}},function(e,t,r){var n,a=r(143),i=(n=/[^.]+$/.exec(a&&a.keys&&a.keys.IE_PROTO||""))?"Symbol(src)_1."+n:"";e.exports=function(e){return!!i&&i in e}},function(e,t,r){var n=r(14)["__core-js_shared__"];e.exports=n},function(e,t){e.exports=function(e,t){return null==e?void 0:e[t]}},function(e,t,r){var n=r(146),a=r(30),i=r(45);e.exports=function(){this.size=0,this.__data__={hash:new n,map:new(i||a),string:new n}}},function(e,t,r){var n=r(147),a=r(148),i=r(149),o=r(150),s=r(151);function u(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t=200){var m=t?null:s(e);if(m)return u(m);d=!1,l=o,h=new n}else h=t?[]:p;e:for(;++c-1}},function(e,t,r){var n=r(213),a=r(214),i=r(215);e.exports=function(e,t,r){return t==t?i(e,t,r):n(e,a,r)}},function(e,t){e.exports=function(e,t,r,n){for(var a=e.length,i=r+(n?1:-1);n?i--:++i1?r[i-1]:void 0,s=i>2?r[2]:void 0;for(o=e.length>3&&"function"==typeof o?(i--,o):void 0,s&&a(r[0],r[1],s)&&(o=i<3?void 0:o,i=1),t=Object(t);++n0){if(++t>=800)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}},function(e,t,r){var n=r(25),a=r(37),i=r(50),o=r(16);e.exports=function(e,t,r){if(!o(r))return!1;var s=typeof t;return!!("number"==s?a(r)&&i(t,r.length):"string"==s&&t in r)&&n(r[t],e)}},function(e,t,r){"use strict";var n=r(63),a=r(24),i=r(65),o=r(99),s=r(100),u=a.ucs2length,c=r(64),l=i.Validation;function f(e,t,r){var n=p.call(this,e,t,r);return n>=0?{index:n,compiling:!0}:(n=this._compilations.length,this._compilations[n]={schema:e,root:t,baseId:r},{index:n,compiling:!1})}function d(e,t,r){var n=p.call(this,e,t,r);n>=0&&this._compilations.splice(n,1)}function p(e,t,r){for(var n=0;n1){t[0]=t[0].slice(0,-1);for(var n=t.length-1,a=1;a= 0x80 (not a basic code point)","invalid-input":"Invalid input"},h=Math.floor,m=String.fromCharCode;function v(e){throw new RangeError(p[e])}function y(e,t){var r=e.split("@"),n="";r.length>1&&(n=r[0]+"@",e=r[1]);var a=function(e,t){for(var r=[],n=e.length;n--;)r[n]=t(e[n]);return r}((e=e.replace(d,".")).split("."),t).join(".");return n+a}function g(e){for(var t=[],r=0,n=e.length;r=55296&&a<=56319&&r>1,e+=h(e/t);e>455;n+=36)e=h(e/35);return h(n+36*e/(e+38))},w=function(e){var t,r=[],n=e.length,a=0,i=128,o=72,s=e.lastIndexOf("-");s<0&&(s=0);for(var u=0;u=128&&v("not-basic"),r.push(e.charCodeAt(u));for(var l=s>0?s+1:0;l=n&&v("invalid-input");var m=(t=e.charCodeAt(l++))-48<10?t-22:t-65<26?t-65:t-97<26?t-97:36;(m>=36||m>h((c-a)/d))&&v("overflow"),a+=m*d;var y=p<=o?1:p>=o+26?26:p-o;if(mh(c/g)&&v("overflow"),d*=g}var b=r.length+1;o=I(a-f,b,0==f),h(a/b)>c-i&&v("overflow"),i+=h(a/b),a%=b,r.splice(a++,0,i)}return String.fromCodePoint.apply(String,r)},S=function(e){var t=[],r=(e=g(e)).length,n=128,a=0,i=72,o=!0,s=!1,u=void 0;try{for(var l,f=e[Symbol.iterator]();!(o=(l=f.next()).done);o=!0){var d=l.value;d<128&&t.push(m(d))}}catch(e){s=!0,u=e}finally{try{!o&&f.return&&f.return()}finally{if(s)throw u}}var p=t.length,y=p;for(p&&t.push("-");y=n&&xh((c-a)/_)&&v("overflow"),a+=(w-n)*_,n=w;var k=!0,j=!1,T=void 0;try{for(var A,R=e[Symbol.iterator]();!(k=(A=R.next()).done);k=!0){var M=A.value;if(Mc&&v("overflow"),M==n){for(var U=a,N=36;;N+=36){var C=N<=i?1:N>=i+26?26:N-i;if(U>6|192).toString(16).toUpperCase()+"%"+(63&t|128).toString(16).toUpperCase():"%"+(t>>12|224).toString(16).toUpperCase()+"%"+(t>>6&63|128).toString(16).toUpperCase()+"%"+(63&t|128).toString(16).toUpperCase()}function x(e){for(var t="",r=0,n=e.length;r=194&&a<224){if(n-r>=6){var i=parseInt(e.substr(r+4,2),16);t+=String.fromCharCode((31&a)<<6|63&i)}else t+=e.substr(r,6);r+=6}else if(a>=224){if(n-r>=9){var o=parseInt(e.substr(r+4,2),16),s=parseInt(e.substr(r+7,2),16);t+=String.fromCharCode((15&a)<<12|(63&o)<<6|63&s)}else t+=e.substr(r,9);r+=9}else t+=e.substr(r,3),r+=3}return t}function _(e,t){function r(e){var r=x(e);return r.match(t.UNRESERVED)?r:e}return e.scheme&&(e.scheme=String(e.scheme).replace(t.PCT_ENCODED,r).toLowerCase().replace(t.NOT_SCHEME,"")),void 0!==e.userinfo&&(e.userinfo=String(e.userinfo).replace(t.PCT_ENCODED,r).replace(t.NOT_USERINFO,O).replace(t.PCT_ENCODED,a)),void 0!==e.host&&(e.host=String(e.host).replace(t.PCT_ENCODED,r).toLowerCase().replace(t.NOT_HOST,O).replace(t.PCT_ENCODED,a)),void 0!==e.path&&(e.path=String(e.path).replace(t.PCT_ENCODED,r).replace(e.scheme?t.NOT_PATH:t.NOT_PATH_NOSCHEME,O).replace(t.PCT_ENCODED,a)),void 0!==e.query&&(e.query=String(e.query).replace(t.PCT_ENCODED,r).replace(t.NOT_QUERY,O).replace(t.PCT_ENCODED,a)),void 0!==e.fragment&&(e.fragment=String(e.fragment).replace(t.PCT_ENCODED,r).replace(t.NOT_FRAGMENT,O).replace(t.PCT_ENCODED,a)),e}function k(e){return e.replace(/^0*(.*)/,"$1")||"0"}function j(e,t){var r=e.match(t.IPV4ADDRESS)||[],n=u(r,2)[1];return n?n.split(".").map(k).join("."):e}function T(e,t){var r=e.match(t.IPV6ADDRESS)||[],n=u(r,3),a=n[1],i=n[2];if(a){for(var o=a.toLowerCase().split("::").reverse(),s=u(o,2),c=s[0],l=s[1],f=l?l.split(":").map(k):[],d=c.split(":").map(k),p=t.IPV4ADDRESS.test(d[d.length-1]),h=p?7:8,m=d.length-h,v=Array(h),y=0;y1){var I=v.slice(0,g.index),w=v.slice(g.index+g.length);b=I.join(":")+"::"+w.join(":")}else b=v.join(":");return i&&(b+="%"+i),b}return e}var A=/^(?:([^:\/?#]+):)?(?:\/\/((?:([^\/?#@]*)@)?(\[[^\/?#\]]+\]|[^\/?#:]*)(?:\:(\d*))?))?([^?#]*)(?:\?([^#]*))?(?:#((?:.|\n|\r)*))?/i,R=void 0==="".match(/(){0}/)[1];function M(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r={},n=!1!==t.iri?s:o;"suffix"===t.reference&&(e=(t.scheme?t.scheme+":":"")+"//"+e);var a=e.match(A);if(a){R?(r.scheme=a[1],r.userinfo=a[3],r.host=a[4],r.port=parseInt(a[5],10),r.path=a[6]||"",r.query=a[7],r.fragment=a[8],isNaN(r.port)&&(r.port=a[5])):(r.scheme=a[1]||void 0,r.userinfo=-1!==e.indexOf("@")?a[3]:void 0,r.host=-1!==e.indexOf("//")?a[4]:void 0,r.port=parseInt(a[5],10),r.path=a[6]||"",r.query=-1!==e.indexOf("?")?a[7]:void 0,r.fragment=-1!==e.indexOf("#")?a[8]:void 0,isNaN(r.port)&&(r.port=e.match(/\/\/(?:.|\n)*\:(?:\/|\?|\#|$)/)?a[4]:void 0)),r.host&&(r.host=T(j(r.host,n),n)),void 0!==r.scheme||void 0!==r.userinfo||void 0!==r.host||void 0!==r.port||r.path||void 0!==r.query?void 0===r.scheme?r.reference="relative":void 0===r.fragment?r.reference="absolute":r.reference="uri":r.reference="same-document",t.reference&&"suffix"!==t.reference&&t.reference!==r.reference&&(r.error=r.error||"URI is not a "+t.reference+" reference.");var i=E[(t.scheme||r.scheme||"").toLowerCase()];if(t.unicodeSupport||i&&i.unicodeSupport)_(r,n);else{if(r.host&&(t.domainHost||i&&i.domainHost))try{r.host=P(r.host.replace(n.PCT_ENCODED,x).toLowerCase())}catch(e){r.error=r.error||"Host's domain name can not be converted to ASCII via punycode: "+e}_(r,o)}i&&i.parse&&i.parse(r,t)}else r.error=r.error||"URI can not be parsed.";return r}function U(e,t){var r=!1!==t.iri?s:o,n=[];return void 0!==e.userinfo&&(n.push(e.userinfo),n.push("@")),void 0!==e.host&&n.push(T(j(String(e.host),r),r).replace(r.IPV6ADDRESS,(function(e,t,r){return"["+t+(r?"%25"+r:"")+"]"}))),"number"==typeof e.port&&(n.push(":"),n.push(e.port.toString(10))),n.length?n.join(""):void 0}var N=/^\.\.?\//,C=/^\/\.(\/|$)/,F=/^\/\.\.(\/|$)/,L=/^\/?(?:.|\n)*?(?=\/|$)/;function V(e){for(var t=[];e.length;)if(e.match(N))e=e.replace(N,"");else if(e.match(C))e=e.replace(C,"/");else if(e.match(F))e=e.replace(F,"/"),t.pop();else if("."===e||".."===e)e="";else{var r=e.match(L);if(!r)throw new Error("Unexpected dot segment condition");var n=r[0];e=e.slice(n.length),t.push(n)}return t.join("")}function q(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=t.iri?s:o,n=[],a=E[(t.scheme||e.scheme||"").toLowerCase()];if(a&&a.serialize&&a.serialize(e,t),e.host)if(r.IPV6ADDRESS.test(e.host));else if(t.domainHost||a&&a.domainHost)try{e.host=t.iri?D(e.host):P(e.host.replace(r.PCT_ENCODED,x).toLowerCase())}catch(r){e.error=e.error||"Host's domain name can not be converted to "+(t.iri?"Unicode":"ASCII")+" via punycode: "+r}_(e,r),"suffix"!==t.reference&&e.scheme&&(n.push(e.scheme),n.push(":"));var i=U(e,t);if(void 0!==i&&("suffix"!==t.reference&&n.push("//"),n.push(i),e.path&&"/"!==e.path.charAt(0)&&n.push("/")),void 0!==e.path){var u=e.path;t.absolutePath||a&&a.absolutePath||(u=V(u)),void 0===i&&(u=u.replace(/^\/\//,"/%2F")),n.push(u)}return void 0!==e.query&&(n.push("?"),n.push(e.query)),void 0!==e.fragment&&(n.push("#"),n.push(e.fragment)),n.join("")}function $(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=arguments[3],a={};return n||(e=M(q(e,r),r),t=M(q(t,r),r)),!(r=r||{}).tolerant&&t.scheme?(a.scheme=t.scheme,a.userinfo=t.userinfo,a.host=t.host,a.port=t.port,a.path=V(t.path||""),a.query=t.query):(void 0!==t.userinfo||void 0!==t.host||void 0!==t.port?(a.userinfo=t.userinfo,a.host=t.host,a.port=t.port,a.path=V(t.path||""),a.query=t.query):(t.path?("/"===t.path.charAt(0)?a.path=V(t.path):(void 0===e.userinfo&&void 0===e.host&&void 0===e.port||e.path?e.path?a.path=e.path.slice(0,e.path.lastIndexOf("/")+1)+t.path:a.path=t.path:a.path="/"+t.path,a.path=V(a.path)),a.query=t.query):(a.path=e.path,void 0!==t.query?a.query=t.query:a.query=e.query),a.userinfo=e.userinfo,a.host=e.host,a.port=e.port),a.scheme=e.scheme),a.fragment=t.fragment,a}function z(e,t){return e&&e.toString().replace(t&&t.iri?s.PCT_ENCODED:o.PCT_ENCODED,x)}var G={scheme:"http",domainHost:!0,parse:function(e,t){return e.host||(e.error=e.error||"HTTP URIs must have a host."),e},serialize:function(e,t){return e.port!==("https"!==String(e.scheme).toLowerCase()?80:443)&&""!==e.port||(e.port=void 0),e.path||(e.path="/"),e}},B={scheme:"https",domainHost:G.domainHost,parse:G.parse,serialize:G.serialize},H={},W="[A-Za-z0-9\\-\\.\\_\\~\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]",Q="[0-9A-Fa-f]",K=r(r("%[EFef]"+Q+"%"+Q+Q+"%"+Q+Q)+"|"+r("%[89A-Fa-f]"+Q+"%"+Q+Q)+"|"+r("%"+Q+Q)),J=t("[\\!\\$\\%\\'\\(\\)\\*\\+\\,\\-\\.0-9\\<\\>A-Z\\x5E-\\x7E]",'[\\"\\\\]'),Y=new RegExp(W,"g"),X=new RegExp(K,"g"),Z=new RegExp(t("[^]","[A-Za-z0-9\\!\\$\\%\\'\\*\\+\\-\\^\\_\\`\\{\\|\\}\\~]","[\\.]",'[\\"]',J),"g"),ee=new RegExp(t("[^]",W,"[\\!\\$\\'\\(\\)\\*\\+\\,\\;\\:\\@]"),"g"),te=ee;function re(e){var t=x(e);return t.match(Y)?t:e}var ne={scheme:"mailto",parse:function(e,t){var r=e,n=r.to=r.path?r.path.split(","):[];if(r.path=void 0,r.query){for(var a=!1,i={},o=r.query.split("&"),s=0,u=o.length;s=55296&&t<=56319&&a%\\^`{|}]|%[0-9a-f]{2})|\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?)*\})*$/i,l=/^(?:(?:http[s\u017F]?|ftp):\/\/)(?:(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+(?::(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?@)?(?:(?!10(?:\.[0-9]{1,3}){3})(?!127(?:\.[0-9]{1,3}){3})(?!169\.254(?:\.[0-9]{1,3}){2})(?!192\.168(?:\.[0-9]{1,3}){2})(?!172\.(?:1[6-9]|2[0-9]|3[01])(?:\.[0-9]{1,3}){2})(?:[1-9][0-9]?|1[0-9][0-9]|2[01][0-9]|22[0-3])(?:\.(?:1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])){2}(?:\.(?:[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-4]))|(?:(?:(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-?)*(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)(?:\.(?:(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-?)*(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)*(?:\.(?:(?:[KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]){2,})))(?::[0-9]{2,5})?(?:\/(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?$/i,f=/^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i,d=/^(?:\/(?:[^~/]|~0|~1)*)*$/,p=/^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i,h=/^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/;function m(e){return e="full"==e?"full":"fast",n.copy(m[e])}function v(e){var t=e.match(a);if(!t)return!1;var r=+t[1],n=+t[2],o=+t[3];return n>=1&&n<=12&&o>=1&&o<=(2==n&&function(e){return e%4==0&&(e%100!=0||e%400==0)}(r)?29:i[n])}function y(e,t){var r=e.match(o);if(!r)return!1;var n=r[1],a=r[2],i=r[3],s=r[5];return(n<=23&&a<=59&&i<=59||23==n&&59==a&&60==i)&&(!t||s)}e.exports=m,m.fast={date:/^\d\d\d\d-[0-1]\d-[0-3]\d$/,time:/^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i,"date-time":/^\d\d\d\d-[0-1]\d-[0-3]\d[t\s](?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i,uri:/^(?:[a-z][a-z0-9+-.]*:)(?:\/?\/)?[^\s]*$/i,"uri-reference":/^(?:(?:[a-z][a-z0-9+-.]*:)?\/?\/)?(?:[^\\\s#][^\s#]*)?(?:#[^\\\s]*)?$/i,"uri-template":c,url:l,email:/^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i,hostname:s,ipv4:/^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/,ipv6:/^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i,regex:w,uuid:f,"json-pointer":d,"json-pointer-uri-fragment":p,"relative-json-pointer":h},m.full={date:v,time:y,"date-time":function(e){var t=e.split(g);return 2==t.length&&v(t[0])&&y(t[1],!0)},uri:function(e){return b.test(e)&&u.test(e)},"uri-reference":/^(?:[a-z][a-z0-9+\-.]*:)?(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'"()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?(?:\?(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i,"uri-template":c,url:l,email:/^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i,hostname:s,ipv4:/^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/,ipv6:/^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i,regex:w,uuid:f,"json-pointer":d,"json-pointer-uri-fragment":p,"relative-json-pointer":h};var g=/t|\s/i;var b=/\/|:/;var I=/[^\\]\\Z/;function w(e){if(I.test(e))return!1;try{return new RegExp(e),!0}catch(e){return!1}}},function(e,t,r){"use strict";var n=r(242),a=r(24).toHash;e.exports=function(){var e=[{type:"number",rules:[{maximum:["exclusiveMaximum"]},{minimum:["exclusiveMinimum"]},"multipleOf","format"]},{type:"string",rules:["maxLength","minLength","pattern","format"]},{type:"array",rules:["maxItems","minItems","items","contains","uniqueItems"]},{type:"object",rules:["maxProperties","minProperties","required","dependencies","propertyNames",{properties:["additionalProperties","patternProperties"]}]},{rules:["$ref","const","enum","not","anyOf","oneOf","allOf","if"]}],t=["type","$comment"];return e.all=a(t),e.types=a(["number","integer","string","array","object","boolean","null"]),e.forEach((function(r){r.rules=r.rules.map((function(r){var a;if("object"==typeof r){var i=Object.keys(r)[0];a=r[i],r=i,a.forEach((function(r){t.push(r),e.all[r]=!0}))}return t.push(r),e.all[r]={keyword:r,code:n[r],implements:a}})),e.all.$comment={keyword:"$comment",code:n.$comment},r.type&&(e.types[r.type]=r)})),e.keywords=a(t.concat(["$schema","$id","id","$data","$async","title","description","default","definitions","examples","readOnly","writeOnly","contentMediaType","contentEncoding","additionalItems","then","else"])),e.custom={},e}},function(e,t,r){"use strict";e.exports={$ref:r(243),allOf:r(244),anyOf:r(245),$comment:r(246),const:r(247),contains:r(248),dependencies:r(249),enum:r(250),format:r(251),if:r(252),items:r(253),maximum:r(101),minimum:r(101),maxItems:r(102),minItems:r(102),maxLength:r(103),minLength:r(103),maxProperties:r(104),minProperties:r(104),multipleOf:r(254),not:r(255),oneOf:r(256),pattern:r(257),properties:r(258),propertyNames:r(259),required:r(260),uniqueItems:r(261),validate:r(100)}},function(e,t,r){"use strict";e.exports=function(e,t,r){var n,a,i=" ",o=e.level,s=e.dataLevel,u=e.schema[t],c=e.errSchemaPath+"/"+t,l=!e.opts.allErrors,f="data"+(s||""),d="valid"+o;if("#"==u||"#/"==u)e.isRoot?(n=e.async,a="validate"):(n=!0===e.root.schema.$async,a="root.refVal[0]");else{var p=e.resolveRef(e.baseId,u,e.isRoot);if(void 0===p){var h=e.MissingRefError.message(e.baseId,u);if("fail"==e.opts.missingRefs){e.logger.error(h),(g=g||[]).push(i),i="",!1!==e.createErrors?(i+=" { keyword: '$ref' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(c)+" , params: { ref: '"+e.util.escapeQuotes(u)+"' } ",!1!==e.opts.messages&&(i+=" , message: 'can\\'t resolve reference "+e.util.escapeQuotes(u)+"' "),e.opts.verbose&&(i+=" , schema: "+e.util.toQuotedString(u)+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+f+" "),i+=" } "):i+=" {} ";var m=i;i=g.pop(),!e.compositeRule&&l?e.async?i+=" throw new ValidationError(["+m+"]); ":i+=" validate.errors = ["+m+"]; return false; ":i+=" var err = "+m+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",l&&(i+=" if (false) { ")}else{if("ignore"!=e.opts.missingRefs)throw new e.MissingRefError(e.baseId,u,h);e.logger.warn(h),l&&(i+=" if (true) { ")}}else if(p.inline){var v=e.util.copy(e);v.level++;var y="valid"+v.level;v.schema=p.schema,v.schemaPath="",v.errSchemaPath=u,i+=" "+e.validate(v).replace(/validate\.schema/g,p.code)+" ",l&&(i+=" if ("+y+") { ")}else n=!0===p.$async||e.async&&!1!==p.$async,a=p.code}if(a){var g;(g=g||[]).push(i),i="",e.opts.passContext?i+=" "+a+".call(this, ":i+=" "+a+"( ",i+=" "+f+", (dataPath || '')",'""'!=e.errorPath&&(i+=" + "+e.errorPath);var b=i+=" , "+(s?"data"+(s-1||""):"parentData")+" , "+(s?e.dataPathArr[s]:"parentDataProperty")+", rootData) ";if(i=g.pop(),n){if(!e.async)throw new Error("async schema referenced by sync schema");l&&(i+=" var "+d+"; "),i+=" try { await "+b+"; ",l&&(i+=" "+d+" = true; "),i+=" } catch (e) { if (!(e instanceof ValidationError)) throw e; if (vErrors === null) vErrors = e.errors; else vErrors = vErrors.concat(e.errors); errors = vErrors.length; ",l&&(i+=" "+d+" = false; "),i+=" } ",l&&(i+=" if ("+d+") { ")}else i+=" if (!"+b+") { if (vErrors === null) vErrors = "+a+".errors; else vErrors = vErrors.concat("+a+".errors); errors = vErrors.length; } ",l&&(i+=" else { ")}return i}},function(e,t,r){"use strict";e.exports=function(e,t,r){var n=" ",a=e.schema[t],i=e.schemaPath+e.util.getProperty(t),o=e.errSchemaPath+"/"+t,s=!e.opts.allErrors,u=e.util.copy(e),c="";u.level++;var l="valid"+u.level,f=u.baseId,d=!0,p=a;if(p)for(var h,m=-1,v=p.length-1;m0:e.util.schemaHasRules(h,e.RULES.all))&&(d=!1,u.schema=h,u.schemaPath=i+"["+m+"]",u.errSchemaPath=o+"/"+m,n+=" "+e.validate(u)+" ",u.baseId=f,s&&(n+=" if ("+l+") { ",c+="}"));return s&&(n+=d?" if (true) { ":" "+c.slice(0,-1)+" "),n=e.util.cleanUpCode(n)}},function(e,t,r){"use strict";e.exports=function(e,t,r){var n=" ",a=e.level,i=e.dataLevel,o=e.schema[t],s=e.schemaPath+e.util.getProperty(t),u=e.errSchemaPath+"/"+t,c=!e.opts.allErrors,l="data"+(i||""),f="valid"+a,d="errs__"+a,p=e.util.copy(e),h="";p.level++;var m="valid"+p.level;if(o.every((function(t){return e.opts.strictKeywords?"object"==typeof t&&Object.keys(t).length>0:e.util.schemaHasRules(t,e.RULES.all)}))){var v=p.baseId;n+=" var "+d+" = errors; var "+f+" = false; ";var y=e.compositeRule;e.compositeRule=p.compositeRule=!0;var g=o;if(g)for(var b,I=-1,w=g.length-1;I0:e.util.schemaHasRules(o,e.RULES.all);if(n+="var "+d+" = errors;var "+f+";",b){var I=e.compositeRule;e.compositeRule=p.compositeRule=!0,p.schema=o,p.schemaPath=s,p.errSchemaPath=u,n+=" var "+h+" = false; for (var "+m+" = 0; "+m+" < "+l+".length; "+m+"++) { ",p.errorPath=e.util.getPathExpr(e.errorPath,m,e.opts.jsonPointers,!0);var w=l+"["+m+"]";p.dataPathArr[v]=m;var S=e.validate(p);p.baseId=g,e.util.varOccurences(S,y)<2?n+=" "+e.util.varReplace(S,y,w)+" ":n+=" var "+y+" = "+w+"; "+S+" ",n+=" if ("+h+") break; } ",e.compositeRule=p.compositeRule=I,n+=" if (!"+h+") {"}else n+=" if ("+l+".length == 0) {";var P=P||[];P.push(n),n="",!1!==e.createErrors?(n+=" { keyword: 'contains' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(u)+" , params: {} ",!1!==e.opts.messages&&(n+=" , message: 'should contain a valid item' "),e.opts.verbose&&(n+=" , schema: validate.schema"+s+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+l+" "),n+=" } "):n+=" {} ";var D=n;return n=P.pop(),!e.compositeRule&&c?e.async?n+=" throw new ValidationError(["+D+"]); ":n+=" validate.errors = ["+D+"]; return false; ":n+=" var err = "+D+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",n+=" } else { ",b&&(n+=" errors = "+d+"; if (vErrors !== null) { if ("+d+") vErrors.length = "+d+"; else vErrors = null; } "),e.opts.allErrors&&(n+=" } "),n=e.util.cleanUpCode(n)}},function(e,t,r){"use strict";e.exports=function(e,t,r){var n=" ",a=e.level,i=e.dataLevel,o=e.schema[t],s=e.schemaPath+e.util.getProperty(t),u=e.errSchemaPath+"/"+t,c=!e.opts.allErrors,l="data"+(i||""),f="errs__"+a,d=e.util.copy(e),p="";d.level++;var h="valid"+d.level,m={},v={},y=e.opts.ownProperties;for(w in o){var g=o[w],b=Array.isArray(g)?v:m;b[w]=g}n+="var "+f+" = errors;";var I=e.errorPath;for(var w in n+="var missing"+a+";",v)if((b=v[w]).length){if(n+=" if ( "+l+e.util.getProperty(w)+" !== undefined ",y&&(n+=" && Object.prototype.hasOwnProperty.call("+l+", '"+e.util.escapeQuotes(w)+"') "),c){n+=" && ( ";var S=b;if(S)for(var P=-1,D=S.length-1;P0:e.util.schemaHasRules(g,e.RULES.all))&&(n+=" "+h+" = true; if ( "+l+e.util.getProperty(w)+" !== undefined ",y&&(n+=" && Object.prototype.hasOwnProperty.call("+l+", '"+e.util.escapeQuotes(w)+"') "),n+=") { ",d.schema=g,d.schemaPath=s+e.util.getProperty(w),d.errSchemaPath=u+"/"+e.util.escapeFragment(w),n+=" "+e.validate(d)+" ",d.baseId=U,n+=" } ",c&&(n+=" if ("+h+") { ",p+="}"))}return c&&(n+=" "+p+" if ("+f+" == errors) {"),n=e.util.cleanUpCode(n)}},function(e,t,r){"use strict";e.exports=function(e,t,r){var n=" ",a=e.level,i=e.dataLevel,o=e.schema[t],s=e.schemaPath+e.util.getProperty(t),u=e.errSchemaPath+"/"+t,c=!e.opts.allErrors,l="data"+(i||""),f="valid"+a,d=e.opts.$data&&o&&o.$data;d&&(n+=" var schema"+a+" = "+e.util.getData(o.$data,i,e.dataPathArr)+"; ");var p="i"+a,h="schema"+a;d||(n+=" var "+h+" = validate.schema"+s+";"),n+="var "+f+";",d&&(n+=" if (schema"+a+" === undefined) "+f+" = true; else if (!Array.isArray(schema"+a+")) "+f+" = false; else {"),n+=f+" = false;for (var "+p+"=0; "+p+"<"+h+".length; "+p+"++) if (equal("+l+", "+h+"["+p+"])) { "+f+" = true; break; }",d&&(n+=" } "),n+=" if (!"+f+") { ";var m=m||[];m.push(n),n="",!1!==e.createErrors?(n+=" { keyword: 'enum' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(u)+" , params: { allowedValues: schema"+a+" } ",!1!==e.opts.messages&&(n+=" , message: 'should be equal to one of the allowed values' "),e.opts.verbose&&(n+=" , schema: validate.schema"+s+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+l+" "),n+=" } "):n+=" {} ";var v=n;return n=m.pop(),!e.compositeRule&&c?e.async?n+=" throw new ValidationError(["+v+"]); ":n+=" validate.errors = ["+v+"]; return false; ":n+=" var err = "+v+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",n+=" }",c&&(n+=" else { "),n}},function(e,t,r){"use strict";e.exports=function(e,t,r){var n=" ",a=e.level,i=e.dataLevel,o=e.schema[t],s=e.schemaPath+e.util.getProperty(t),u=e.errSchemaPath+"/"+t,c=!e.opts.allErrors,l="data"+(i||"");if(!1===e.opts.format)return c&&(n+=" if (true) { "),n;var f,d=e.opts.$data&&o&&o.$data;d?(n+=" var schema"+a+" = "+e.util.getData(o.$data,i,e.dataPathArr)+"; ",f="schema"+a):f=o;var p=e.opts.unknownFormats,h=Array.isArray(p);if(d){n+=" var "+(m="format"+a)+" = formats["+f+"]; var "+(v="isObject"+a)+" = typeof "+m+" == 'object' && !("+m+" instanceof RegExp) && "+m+".validate; var "+(y="formatType"+a)+" = "+v+" && "+m+".type || 'string'; if ("+v+") { ",e.async&&(n+=" var async"+a+" = "+m+".async; "),n+=" "+m+" = "+m+".validate; } if ( ",d&&(n+=" ("+f+" !== undefined && typeof "+f+" != 'string') || "),n+=" (","ignore"!=p&&(n+=" ("+f+" && !"+m+" ",h&&(n+=" && self._opts.unknownFormats.indexOf("+f+") == -1 "),n+=") || "),n+=" ("+m+" && "+y+" == '"+r+"' && !(typeof "+m+" == 'function' ? ",e.async?n+=" (async"+a+" ? await "+m+"("+l+") : "+m+"("+l+")) ":n+=" "+m+"("+l+") ",n+=" : "+m+".test("+l+"))))) {"}else{var m;if(!(m=e.formats[o])){if("ignore"==p)return e.logger.warn('unknown format "'+o+'" ignored in schema at path "'+e.errSchemaPath+'"'),c&&(n+=" if (true) { "),n;if(h&&p.indexOf(o)>=0)return c&&(n+=" if (true) { "),n;throw new Error('unknown format "'+o+'" is used in schema at path "'+e.errSchemaPath+'"')}var v,y=(v="object"==typeof m&&!(m instanceof RegExp)&&m.validate)&&m.type||"string";if(v){var g=!0===m.async;m=m.validate}if(y!=r)return c&&(n+=" if (true) { "),n;if(g){if(!e.async)throw new Error("async format in sync schema");n+=" if (!(await "+(b="formats"+e.util.getProperty(o)+".validate")+"("+l+"))) { "}else{n+=" if (! ";var b="formats"+e.util.getProperty(o);v&&(b+=".validate"),n+="function"==typeof m?" "+b+"("+l+") ":" "+b+".test("+l+") ",n+=") { "}}var I=I||[];I.push(n),n="",!1!==e.createErrors?(n+=" { keyword: 'format' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(u)+" , params: { format: ",n+=d?""+f:""+e.util.toQuotedString(o),n+=" } ",!1!==e.opts.messages&&(n+=" , message: 'should match format \"",n+=d?"' + "+f+" + '":""+e.util.escapeQuotes(o),n+="\"' "),e.opts.verbose&&(n+=" , schema: ",n+=d?"validate.schema"+s:""+e.util.toQuotedString(o),n+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+l+" "),n+=" } "):n+=" {} ";var w=n;return n=I.pop(),!e.compositeRule&&c?e.async?n+=" throw new ValidationError(["+w+"]); ":n+=" validate.errors = ["+w+"]; return false; ":n+=" var err = "+w+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",n+=" } ",c&&(n+=" else { "),n}},function(e,t,r){"use strict";e.exports=function(e,t,r){var n=" ",a=e.level,i=e.dataLevel,o=e.schema[t],s=e.schemaPath+e.util.getProperty(t),u=e.errSchemaPath+"/"+t,c=!e.opts.allErrors,l="data"+(i||""),f="valid"+a,d="errs__"+a,p=e.util.copy(e);p.level++;var h="valid"+p.level,m=e.schema.then,v=e.schema.else,y=void 0!==m&&(e.opts.strictKeywords?"object"==typeof m&&Object.keys(m).length>0:e.util.schemaHasRules(m,e.RULES.all)),g=void 0!==v&&(e.opts.strictKeywords?"object"==typeof v&&Object.keys(v).length>0:e.util.schemaHasRules(v,e.RULES.all)),b=p.baseId;if(y||g){var I;p.createErrors=!1,p.schema=o,p.schemaPath=s,p.errSchemaPath=u,n+=" var "+d+" = errors; var "+f+" = true; ";var w=e.compositeRule;e.compositeRule=p.compositeRule=!0,n+=" "+e.validate(p)+" ",p.baseId=b,p.createErrors=!0,n+=" errors = "+d+"; if (vErrors !== null) { if ("+d+") vErrors.length = "+d+"; else vErrors = null; } ",e.compositeRule=p.compositeRule=w,y?(n+=" if ("+h+") { ",p.schema=e.schema.then,p.schemaPath=e.schemaPath+".then",p.errSchemaPath=e.errSchemaPath+"/then",n+=" "+e.validate(p)+" ",p.baseId=b,n+=" "+f+" = "+h+"; ",y&&g?n+=" var "+(I="ifClause"+a)+" = 'then'; ":I="'then'",n+=" } ",g&&(n+=" else { ")):n+=" if (!"+h+") { ",g&&(p.schema=e.schema.else,p.schemaPath=e.schemaPath+".else",p.errSchemaPath=e.errSchemaPath+"/else",n+=" "+e.validate(p)+" ",p.baseId=b,n+=" "+f+" = "+h+"; ",y&&g?n+=" var "+(I="ifClause"+a)+" = 'else'; ":I="'else'",n+=" } "),n+=" if (!"+f+") { var err = ",!1!==e.createErrors?(n+=" { keyword: 'if' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(u)+" , params: { failingKeyword: "+I+" } ",!1!==e.opts.messages&&(n+=" , message: 'should match \"' + "+I+" + '\" schema' "),e.opts.verbose&&(n+=" , schema: validate.schema"+s+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+l+" "),n+=" } "):n+=" {} ",n+="; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",!e.compositeRule&&c&&(e.async?n+=" throw new ValidationError(vErrors); ":n+=" validate.errors = vErrors; return false; "),n+=" } ",c&&(n+=" else { "),n=e.util.cleanUpCode(n)}else c&&(n+=" if (true) { ");return n}},function(e,t,r){"use strict";e.exports=function(e,t,r){var n=" ",a=e.level,i=e.dataLevel,o=e.schema[t],s=e.schemaPath+e.util.getProperty(t),u=e.errSchemaPath+"/"+t,c=!e.opts.allErrors,l="data"+(i||""),f="valid"+a,d="errs__"+a,p=e.util.copy(e),h="";p.level++;var m="valid"+p.level,v="i"+a,y=p.dataLevel=e.dataLevel+1,g="data"+y,b=e.baseId;if(n+="var "+d+" = errors;var "+f+";",Array.isArray(o)){var I=e.schema.additionalItems;if(!1===I){n+=" "+f+" = "+l+".length <= "+o.length+"; ";var w=u;u=e.errSchemaPath+"/additionalItems",n+=" if (!"+f+") { ";var S=S||[];S.push(n),n="",!1!==e.createErrors?(n+=" { keyword: 'additionalItems' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(u)+" , params: { limit: "+o.length+" } ",!1!==e.opts.messages&&(n+=" , message: 'should NOT have more than "+o.length+" items' "),e.opts.verbose&&(n+=" , schema: false , parentSchema: validate.schema"+e.schemaPath+" , data: "+l+" "),n+=" } "):n+=" {} ";var P=n;n=S.pop(),!e.compositeRule&&c?e.async?n+=" throw new ValidationError(["+P+"]); ":n+=" validate.errors = ["+P+"]; return false; ":n+=" var err = "+P+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",n+=" } ",u=w,c&&(h+="}",n+=" else { ")}var D=o;if(D)for(var E,O=-1,x=D.length-1;O0:e.util.schemaHasRules(E,e.RULES.all)){n+=" "+m+" = true; if ("+l+".length > "+O+") { ";var _=l+"["+O+"]";p.schema=E,p.schemaPath=s+"["+O+"]",p.errSchemaPath=u+"/"+O,p.errorPath=e.util.getPathExpr(e.errorPath,O,e.opts.jsonPointers,!0),p.dataPathArr[y]=O;var k=e.validate(p);p.baseId=b,e.util.varOccurences(k,g)<2?n+=" "+e.util.varReplace(k,g,_)+" ":n+=" var "+g+" = "+_+"; "+k+" ",n+=" } ",c&&(n+=" if ("+m+") { ",h+="}")}if("object"==typeof I&&(e.opts.strictKeywords?"object"==typeof I&&Object.keys(I).length>0:e.util.schemaHasRules(I,e.RULES.all))){p.schema=I,p.schemaPath=e.schemaPath+".additionalItems",p.errSchemaPath=e.errSchemaPath+"/additionalItems",n+=" "+m+" = true; if ("+l+".length > "+o.length+") { for (var "+v+" = "+o.length+"; "+v+" < "+l+".length; "+v+"++) { ",p.errorPath=e.util.getPathExpr(e.errorPath,v,e.opts.jsonPointers,!0);_=l+"["+v+"]";p.dataPathArr[y]=v;k=e.validate(p);p.baseId=b,e.util.varOccurences(k,g)<2?n+=" "+e.util.varReplace(k,g,_)+" ":n+=" var "+g+" = "+_+"; "+k+" ",c&&(n+=" if (!"+m+") break; "),n+=" } } ",c&&(n+=" if ("+m+") { ",h+="}")}}else if(e.opts.strictKeywords?"object"==typeof o&&Object.keys(o).length>0:e.util.schemaHasRules(o,e.RULES.all)){p.schema=o,p.schemaPath=s,p.errSchemaPath=u,n+=" for (var "+v+" = 0; "+v+" < "+l+".length; "+v+"++) { ",p.errorPath=e.util.getPathExpr(e.errorPath,v,e.opts.jsonPointers,!0);_=l+"["+v+"]";p.dataPathArr[y]=v;k=e.validate(p);p.baseId=b,e.util.varOccurences(k,g)<2?n+=" "+e.util.varReplace(k,g,_)+" ":n+=" var "+g+" = "+_+"; "+k+" ",c&&(n+=" if (!"+m+") break; "),n+=" }"}return c&&(n+=" "+h+" if ("+d+" == errors) {"),n=e.util.cleanUpCode(n)}},function(e,t,r){"use strict";e.exports=function(e,t,r){var n,a=" ",i=e.level,o=e.dataLevel,s=e.schema[t],u=e.schemaPath+e.util.getProperty(t),c=e.errSchemaPath+"/"+t,l=!e.opts.allErrors,f="data"+(o||""),d=e.opts.$data&&s&&s.$data;d?(a+=" var schema"+i+" = "+e.util.getData(s.$data,o,e.dataPathArr)+"; ",n="schema"+i):n=s,a+="var division"+i+";if (",d&&(a+=" "+n+" !== undefined && ( typeof "+n+" != 'number' || "),a+=" (division"+i+" = "+f+" / "+n+", ",e.opts.multipleOfPrecision?a+=" Math.abs(Math.round(division"+i+") - division"+i+") > 1e-"+e.opts.multipleOfPrecision+" ":a+=" division"+i+" !== parseInt(division"+i+") ",a+=" ) ",d&&(a+=" ) "),a+=" ) { ";var p=p||[];p.push(a),a="",!1!==e.createErrors?(a+=" { keyword: 'multipleOf' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(c)+" , params: { multipleOf: "+n+" } ",!1!==e.opts.messages&&(a+=" , message: 'should be multiple of ",a+=d?"' + "+n:n+"'"),e.opts.verbose&&(a+=" , schema: ",a+=d?"validate.schema"+u:""+s,a+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+f+" "),a+=" } "):a+=" {} ";var h=a;return a=p.pop(),!e.compositeRule&&l?e.async?a+=" throw new ValidationError(["+h+"]); ":a+=" validate.errors = ["+h+"]; return false; ":a+=" var err = "+h+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+="} ",l&&(a+=" else { "),a}},function(e,t,r){"use strict";e.exports=function(e,t,r){var n=" ",a=e.level,i=e.dataLevel,o=e.schema[t],s=e.schemaPath+e.util.getProperty(t),u=e.errSchemaPath+"/"+t,c=!e.opts.allErrors,l="data"+(i||""),f="errs__"+a,d=e.util.copy(e);d.level++;var p="valid"+d.level;if(e.opts.strictKeywords?"object"==typeof o&&Object.keys(o).length>0:e.util.schemaHasRules(o,e.RULES.all)){d.schema=o,d.schemaPath=s,d.errSchemaPath=u,n+=" var "+f+" = errors; ";var h,m=e.compositeRule;e.compositeRule=d.compositeRule=!0,d.createErrors=!1,d.opts.allErrors&&(h=d.opts.allErrors,d.opts.allErrors=!1),n+=" "+e.validate(d)+" ",d.createErrors=!0,h&&(d.opts.allErrors=h),e.compositeRule=d.compositeRule=m,n+=" if ("+p+") { ";var v=v||[];v.push(n),n="",!1!==e.createErrors?(n+=" { keyword: 'not' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(u)+" , params: {} ",!1!==e.opts.messages&&(n+=" , message: 'should NOT be valid' "),e.opts.verbose&&(n+=" , schema: validate.schema"+s+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+l+" "),n+=" } "):n+=" {} ";var y=n;n=v.pop(),!e.compositeRule&&c?e.async?n+=" throw new ValidationError(["+y+"]); ":n+=" validate.errors = ["+y+"]; return false; ":n+=" var err = "+y+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",n+=" } else { errors = "+f+"; if (vErrors !== null) { if ("+f+") vErrors.length = "+f+"; else vErrors = null; } ",e.opts.allErrors&&(n+=" } ")}else n+=" var err = ",!1!==e.createErrors?(n+=" { keyword: 'not' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(u)+" , params: {} ",!1!==e.opts.messages&&(n+=" , message: 'should NOT be valid' "),e.opts.verbose&&(n+=" , schema: validate.schema"+s+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+l+" "),n+=" } "):n+=" {} ",n+="; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",c&&(n+=" if (false) { ");return n}},function(e,t,r){"use strict";e.exports=function(e,t,r){var n=" ",a=e.level,i=e.dataLevel,o=e.schema[t],s=e.schemaPath+e.util.getProperty(t),u=e.errSchemaPath+"/"+t,c=!e.opts.allErrors,l="data"+(i||""),f="valid"+a,d="errs__"+a,p=e.util.copy(e),h="";p.level++;var m="valid"+p.level,v=p.baseId,y="prevValid"+a,g="passingSchemas"+a;n+="var "+d+" = errors , "+y+" = false , "+f+" = false , "+g+" = null; ";var b=e.compositeRule;e.compositeRule=p.compositeRule=!0;var I=o;if(I)for(var w,S=-1,P=I.length-1;S0:e.util.schemaHasRules(w,e.RULES.all))?(p.schema=w,p.schemaPath=s+"["+S+"]",p.errSchemaPath=u+"/"+S,n+=" "+e.validate(p)+" ",p.baseId=v):n+=" var "+m+" = true; ",S&&(n+=" if ("+m+" && "+y+") { "+f+" = false; "+g+" = ["+g+", "+S+"]; } else { ",h+="}"),n+=" if ("+m+") { "+f+" = "+y+" = true; "+g+" = "+S+"; }";return e.compositeRule=p.compositeRule=b,n+=h+"if (!"+f+") { var err = ",!1!==e.createErrors?(n+=" { keyword: 'oneOf' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(u)+" , params: { passingSchemas: "+g+" } ",!1!==e.opts.messages&&(n+=" , message: 'should match exactly one schema in oneOf' "),e.opts.verbose&&(n+=" , schema: validate.schema"+s+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+l+" "),n+=" } "):n+=" {} ",n+="; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",!e.compositeRule&&c&&(e.async?n+=" throw new ValidationError(vErrors); ":n+=" validate.errors = vErrors; return false; "),n+="} else { errors = "+d+"; if (vErrors !== null) { if ("+d+") vErrors.length = "+d+"; else vErrors = null; }",e.opts.allErrors&&(n+=" } "),n}},function(e,t,r){"use strict";e.exports=function(e,t,r){var n,a=" ",i=e.level,o=e.dataLevel,s=e.schema[t],u=e.schemaPath+e.util.getProperty(t),c=e.errSchemaPath+"/"+t,l=!e.opts.allErrors,f="data"+(o||""),d=e.opts.$data&&s&&s.$data;d?(a+=" var schema"+i+" = "+e.util.getData(s.$data,o,e.dataPathArr)+"; ",n="schema"+i):n=s,a+="if ( ",d&&(a+=" ("+n+" !== undefined && typeof "+n+" != 'string') || "),a+=" !"+(d?"(new RegExp("+n+"))":e.usePattern(s))+".test("+f+") ) { ";var p=p||[];p.push(a),a="",!1!==e.createErrors?(a+=" { keyword: 'pattern' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(c)+" , params: { pattern: ",a+=d?""+n:""+e.util.toQuotedString(s),a+=" } ",!1!==e.opts.messages&&(a+=" , message: 'should match pattern \"",a+=d?"' + "+n+" + '":""+e.util.escapeQuotes(s),a+="\"' "),e.opts.verbose&&(a+=" , schema: ",a+=d?"validate.schema"+u:""+e.util.toQuotedString(s),a+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+f+" "),a+=" } "):a+=" {} ";var h=a;return a=p.pop(),!e.compositeRule&&l?e.async?a+=" throw new ValidationError(["+h+"]); ":a+=" validate.errors = ["+h+"]; return false; ":a+=" var err = "+h+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+="} ",l&&(a+=" else { "),a}},function(e,t,r){"use strict";e.exports=function(e,t,r){var n=" ",a=e.level,i=e.dataLevel,o=e.schema[t],s=e.schemaPath+e.util.getProperty(t),u=e.errSchemaPath+"/"+t,c=!e.opts.allErrors,l="data"+(i||""),f="errs__"+a,d=e.util.copy(e),p="";d.level++;var h="valid"+d.level,m="key"+a,v="idx"+a,y=d.dataLevel=e.dataLevel+1,g="data"+y,b="dataProperties"+a,I=Object.keys(o||{}),w=e.schema.patternProperties||{},S=Object.keys(w),P=e.schema.additionalProperties,D=I.length||S.length,E=!1===P,O="object"==typeof P&&Object.keys(P).length,x=e.opts.removeAdditional,_=E||O||x,k=e.opts.ownProperties,j=e.baseId,T=e.schema.required;if(T&&(!e.opts.$data||!T.$data)&&T.length8)n+=" || validate.schema"+s+".hasOwnProperty("+m+") ";else{var R=I;if(R)for(var M=-1,U=R.length-1;M0:e.util.schemaHasRules(Y,e.RULES.all)){var X=e.util.getProperty(Q),Z=(G=l+X,H&&void 0!==Y.default);d.schema=Y,d.schemaPath=s+X,d.errSchemaPath=u+"/"+e.util.escapeFragment(Q),d.errorPath=e.util.getPath(e.errorPath,Q,e.opts.jsonPointers),d.dataPathArr[y]=e.util.toQuotedString(Q);B=e.validate(d);if(d.baseId=j,e.util.varOccurences(B,g)<2){B=e.util.varReplace(B,g,G);var ee=G}else{ee=g;n+=" var "+g+" = "+G+"; "}if(Z)n+=" "+B+" ";else{if(A&&A[Q]){n+=" if ( "+ee+" === undefined ",k&&(n+=" || ! Object.prototype.hasOwnProperty.call("+l+", '"+e.util.escapeQuotes(Q)+"') "),n+=") { "+h+" = false; ";L=e.errorPath,q=u;var te,re=e.util.escapeQuotes(Q);e.opts._errorDataPathProperty&&(e.errorPath=e.util.getPath(L,Q,e.opts.jsonPointers)),u=e.errSchemaPath+"/required",(te=te||[]).push(n),n="",!1!==e.createErrors?(n+=" { keyword: 'required' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(u)+" , params: { missingProperty: '"+re+"' } ",!1!==e.opts.messages&&(n+=" , message: '",e.opts._errorDataPathProperty?n+="is a required property":n+="should have required property \\'"+re+"\\'",n+="' "),e.opts.verbose&&(n+=" , schema: validate.schema"+s+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+l+" "),n+=" } "):n+=" {} ";$=n;n=te.pop(),!e.compositeRule&&c?e.async?n+=" throw new ValidationError(["+$+"]); ":n+=" validate.errors = ["+$+"]; return false; ":n+=" var err = "+$+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",u=q,e.errorPath=L,n+=" } else { "}else c?(n+=" if ( "+ee+" === undefined ",k&&(n+=" || ! Object.prototype.hasOwnProperty.call("+l+", '"+e.util.escapeQuotes(Q)+"') "),n+=") { "+h+" = true; } else { "):(n+=" if ("+ee+" !== undefined ",k&&(n+=" && Object.prototype.hasOwnProperty.call("+l+", '"+e.util.escapeQuotes(Q)+"') "),n+=" ) { ");n+=" "+B+" } "}}c&&(n+=" if ("+h+") { ",p+="}")}}if(S.length){var ne=S;if(ne)for(var ae,ie=-1,oe=ne.length-1;ie0:e.util.schemaHasRules(Y,e.RULES.all)){d.schema=Y,d.schemaPath=e.schemaPath+".patternProperties"+e.util.getProperty(ae),d.errSchemaPath=e.errSchemaPath+"/patternProperties/"+e.util.escapeFragment(ae),n+=k?" "+b+" = "+b+" || Object.keys("+l+"); for (var "+v+"=0; "+v+"<"+b+".length; "+v+"++) { var "+m+" = "+b+"["+v+"]; ":" for (var "+m+" in "+l+") { ",n+=" if ("+e.usePattern(ae)+".test("+m+")) { ",d.errorPath=e.util.getPathExpr(e.errorPath,m,e.opts.jsonPointers);G=l+"["+m+"]";d.dataPathArr[y]=m;B=e.validate(d);d.baseId=j,e.util.varOccurences(B,g)<2?n+=" "+e.util.varReplace(B,g,G)+" ":n+=" var "+g+" = "+G+"; "+B+" ",c&&(n+=" if (!"+h+") break; "),n+=" } ",c&&(n+=" else "+h+" = true; "),n+=" } ",c&&(n+=" if ("+h+") { ",p+="}")}}}return c&&(n+=" "+p+" if ("+f+" == errors) {"),n=e.util.cleanUpCode(n)}},function(e,t,r){"use strict";e.exports=function(e,t,r){var n=" ",a=e.level,i=e.dataLevel,o=e.schema[t],s=e.schemaPath+e.util.getProperty(t),u=e.errSchemaPath+"/"+t,c=!e.opts.allErrors,l="data"+(i||""),f="errs__"+a,d=e.util.copy(e);d.level++;var p="valid"+d.level;if(n+="var "+f+" = errors;",e.opts.strictKeywords?"object"==typeof o&&Object.keys(o).length>0:e.util.schemaHasRules(o,e.RULES.all)){d.schema=o,d.schemaPath=s,d.errSchemaPath=u;var h="key"+a,m="idx"+a,v="i"+a,y="' + "+h+" + '",g="data"+(d.dataLevel=e.dataLevel+1),b="dataProperties"+a,I=e.opts.ownProperties,w=e.baseId;I&&(n+=" var "+b+" = undefined; "),n+=I?" "+b+" = "+b+" || Object.keys("+l+"); for (var "+m+"=0; "+m+"<"+b+".length; "+m+"++) { var "+h+" = "+b+"["+m+"]; ":" for (var "+h+" in "+l+") { ",n+=" var startErrs"+a+" = errors; ";var S=h,P=e.compositeRule;e.compositeRule=d.compositeRule=!0;var D=e.validate(d);d.baseId=w,e.util.varOccurences(D,g)<2?n+=" "+e.util.varReplace(D,g,S)+" ":n+=" var "+g+" = "+S+"; "+D+" ",e.compositeRule=d.compositeRule=P,n+=" if (!"+p+") { for (var "+v+"=startErrs"+a+"; "+v+"0:e.util.schemaHasRules(b,e.RULES.all))||(h[h.length]=v)}}else h=o;if(d||h.length){var I=e.errorPath,w=d||h.length>=e.opts.loopRequired,S=e.opts.ownProperties;if(c)if(n+=" var missing"+a+"; ",w){d||(n+=" var "+p+" = validate.schema"+s+"; ");var P="' + "+(k="schema"+a+"["+(O="i"+a)+"]")+" + '";e.opts._errorDataPathProperty&&(e.errorPath=e.util.getPathExpr(I,k,e.opts.jsonPointers)),n+=" var "+f+" = true; ",d&&(n+=" if (schema"+a+" === undefined) "+f+" = true; else if (!Array.isArray(schema"+a+")) "+f+" = false; else {"),n+=" for (var "+O+" = 0; "+O+" < "+p+".length; "+O+"++) { "+f+" = "+l+"["+p+"["+O+"]] !== undefined ",S&&(n+=" && Object.prototype.hasOwnProperty.call("+l+", "+p+"["+O+"]) "),n+="; if (!"+f+") break; } ",d&&(n+=" } "),n+=" if (!"+f+") { ",(_=_||[]).push(n),n="",!1!==e.createErrors?(n+=" { keyword: 'required' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(u)+" , params: { missingProperty: '"+P+"' } ",!1!==e.opts.messages&&(n+=" , message: '",e.opts._errorDataPathProperty?n+="is a required property":n+="should have required property \\'"+P+"\\'",n+="' "),e.opts.verbose&&(n+=" , schema: validate.schema"+s+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+l+" "),n+=" } "):n+=" {} ";var D=n;n=_.pop(),!e.compositeRule&&c?e.async?n+=" throw new ValidationError(["+D+"]); ":n+=" validate.errors = ["+D+"]; return false; ":n+=" var err = "+D+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",n+=" } else { "}else{n+=" if ( ";var E=h;if(E)for(var O=-1,x=E.length-1;O 1) { ";var h=e.schema.items&&e.schema.items.type,m=Array.isArray(h);if(!h||"object"==h||"array"==h||m&&(h.indexOf("object")>=0||h.indexOf("array")>=0))a+=" outer: for (;i--;) { for (j = i; j--;) { if (equal("+f+"[i], "+f+"[j])) { "+d+" = false; break outer; } } } ";else{a+=" var itemIndices = {}, item; for (;i--;) { var item = "+f+"[i]; ";var v="checkDataType"+(m?"s":"");a+=" if ("+e.util[v](h,"item",!0)+") continue; ",m&&(a+=" if (typeof item == 'string') item = '\"' + item; "),a+=" if (typeof itemIndices[item] == 'number') { "+d+" = false; j = itemIndices[item]; break; } itemIndices[item] = i; } "}a+=" } ",p&&(a+=" } "),a+=" if (!"+d+") { ";var y=y||[];y.push(a),a="",!1!==e.createErrors?(a+=" { keyword: 'uniqueItems' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(c)+" , params: { i: i, j: j } ",!1!==e.opts.messages&&(a+=" , message: 'should NOT have duplicate items (items ## ' + j + ' and ' + i + ' are identical)' "),e.opts.verbose&&(a+=" , schema: ",a+=p?"validate.schema"+u:""+s,a+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+f+" "),a+=" } "):a+=" {} ";var g=a;a=y.pop(),!e.compositeRule&&l?e.async?a+=" throw new ValidationError(["+g+"]); ":a+=" validate.errors = ["+g+"]; return false; ":a+=" var err = "+g+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+=" } ",l&&(a+=" else { ")}else l&&(a+=" if (true) { ");return a}},function(e,t,r){"use strict";var n=["multipleOf","maximum","exclusiveMaximum","minimum","exclusiveMinimum","maxLength","minLength","pattern","additionalItems","maxItems","minItems","uniqueItems","maxProperties","minProperties","required","additionalProperties","enum","format","const"];e.exports=function(e,t){for(var r=0;r1&&void 0!==arguments[1]?arguments[1]:{};if(e){var n=e.id;n||(n=Math.random().toString(36).substr(2,5),h.warn("Extension ID not set. Using random string ID: ".concat(n))),this.registeredExtensionIds.includes(n)?h.warn("Extension ID ".concat(n," has already been registered. Exiting before duplicating modules.")):(e.preRegistration&&e.preRegistration({servicesManager:this._servicesManager,commandsManager:this._commandsManager,appConfig:this._appConfig,configuration:r}),this.moduleTypeNames.forEach((function(a){var i=t._getExtensionModule(a,e,n,r);i&&(t._initSpecialModuleTypes(a,i),t.modules[a].push({extensionId:n,module:i}))})),this.registeredExtensionIds.push(n))}else h.warn("Attempting to register a null/undefined extension. Exiting early.")}},{key:"_getExtensionModule",value:function(e,t,r,n){var a,i="get".concat((a=e).charAt(0).toUpperCase()+a.substr(1)),o=t[i];if(o)try{var s=o({servicesManager:this._servicesManager,commandsManager:this._commandsManager,appConfig:this._appConfig,configuration:n});return s||h.warn("Null or undefined returned when registering the ".concat(i," module for the ").concat(r," extension")),s}catch(e){h.error("Exception thrown while trying to call ".concat(i," for the ").concat(r," extension"))}}},{key:"_initSpecialModuleTypes",value:function(e,t){switch(e){case"commandsModule":var r=t.definitions,n=t.defaultContext;if(!r||0===Object.keys(r).length)return void h.warn("Commands Module contains no command definitions");this._initCommandsModule(r,n)}}},{key:"_initCommandsModule",value:function(e){var t=this,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"VIEWER";this._commandsManager.getContext(r)||this._commandsManager.createContext(r),Object.keys(e).forEach((function(n){var a=e[n];a.context&&!t._commandsManager.getContext(a.context)&&t._commandsManager.createContext(a.context),t._commandsManager.registerCommand(a.context||r,n,a)}))}}]),e}();var v=function(){function e(){f()(this,e),this.services={},this.registeredServiceNames=[]}return p()(e,[{key:"registerService",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};e?e.name?this.registeredServiceNames.includes(e.name)?h.warn("Service name ".concat(e.name," has already been registered. Exiting before duplicating services.")):e.create?(this.services[e.name]=e.create({configuration:t}),this.registeredServiceNames.push(e.name)):h.warn("Service create factory function not defined. Exiting early."):h.warn("Service name not set. Exiting early."):h.warn("Attempting to register a null/undefined service. Exiting early.")}},{key:"registerServices",value:function(e){var t=this;e.forEach((function(e){if(Array.isArray(e)){var r=c()(e,2),n=r[0],a=r[1];t.registerService(n,a)}else t.registerService(e)}))}}]),e}(),y=[],g={name:"UINotificationService",hide:function(e){return b._hide({id:e})},show:function(e){var t=e.title,r=e.message,n=e.duration,a=void 0===n?5e3:n,i=e.position,o=void 0===i?"bottomRight":i,s=e.type,u=void 0===s?"info":s,c=e.autoClose,l=void 0===c||c;return b._show({title:t,message:r,duration:a,position:o,type:u,autoClose:l})},setServiceImplementation:function(e){var t=e.hide,r=e.show;t&&(b._hide=t);if(r)for(b._show=r;y.length>0;){var n=y.pop();b._show(n)}}},b={_hide:function(){return console.warn("hide() NOT IMPLEMENTED")},_show:function(e){y.push(e),console.warn("show() NOT IMPLEMENTED")}};var I={name:"UINotificationService",create:function(e){e.configuration;return g}},w={name:"UIModalService",hide:function(){return S._hide()},show:function(e){var t=e.content,r=void 0===t?null:t,n=e.contentProps,a=void 0===n?null:n,i=e.shouldCloseOnEsc,o=void 0!==i&&i,s=e.isOpen,u=void 0===s||s,c=e.closeButton,l=void 0===c||c,f=e.title,d=void 0===f?null:f,p=e.customClassName,h=void 0===p?null:p;return S._show({content:r,contentProps:a,shouldCloseOnEsc:o,isOpen:u,closeButton:l,title:d,customClassName:h})},setServiceImplementation:function(e){var t=e.hide,r=e.show;t&&(S._hide=t);r&&(S._show=r)}},S={_hide:function(){return console.warn("hide() NOT IMPLEMENTED")},_show:function(){return console.warn("show() NOT IMPLEMENTED")}};var P={name:"UIModalService",create:function(e){e.configuration;return w}},D={name:"UIDialogService",dismiss:function(e){var t=e.id;return E._dismiss({id:t})},dismissAll:function(){return E._dismissAll()},create:function(e){var t=e.id,r=e.content,n=e.contentProps,a=e.onStart,i=e.onDrag,o=e.onStop,s=e.centralize,u=void 0!==s&&s,c=e.preservePosition,l=void 0===c||c,f=e.isDraggable,d=void 0===f||f,p=e.showOverlay,h=void 0!==p&&p,m=e.defaultPosition;return E._create({id:t,content:r,contentProps:n,onStart:a,onDrag:i,onStop:o,centralize:u,preservePosition:l,isDraggable:d,showOverlay:h,defaultPosition:m})},setServiceImplementation:function(e){var t=e.dismiss,r=e.dismissAll,n=e.create;t&&(E._dismiss=t);r&&(E._dismissAll=r);n&&(E._create=n)}},E={_dismiss:function(){return console.warn("dismiss() NOT IMPLEMENTED")},_dismissAll:function(){return console.warn("dismissAll() NOT IMPLEMENTED")},_create:function(){return console.warn("create() NOT IMPLEMENTED")}};var O={name:"UIDialogService",create:function(e){e.configuration;return D}},x=r(4),_=r.n(x),k=function(){var e=function(){return Math.floor(65536*(1+Math.random())).toString(16).substring(1)};return e()+e()+"-"+e()+"-"+e()+"-"+e()+"-"+e()+e()+e()};function j(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}var T,A,R=["id","SOPInstanceUID","FrameOfReferenceUID","referenceSeriesUID","label","description","type","unit","area","points","source"],M={MEASUREMENT_UPDATED:"event::measurement_updated",MEASUREMENT_ADDED:"event::measurement_added"},U={POLYLINE:"value_type::polyline",POINT:"value_type::point",ELLIPSE:"value_type::ellipse",MULTIPOINT:"value_type::multipoint",CIRCLE:"value_type::circle"},N=function(){function e(){f()(this,e),this._arrayOfObjects=function(e){return Object.entries(e).map((function(e){return _()({},e[0],e[1])}))},this.sources={},this.mappings={},this.measurements={},this.listeners={},Object.defineProperty(this,"EVENTS",{value:M,writable:!1,enumerable:!0,configurable:!1}),Object.defineProperty(this,"VALUE_TYPES",{value:U,writable:!1,enumerable:!0,configurable:!1})}return p()(e,[{key:"getMeasurements",value:function(){var e=this,t=this._arrayOfObjects(this.measurements);return t&&t.map((function(t){return e.measurements[Object.keys(t)[0]]}))}},{key:"getMeasurement",value:function(e){var t=null,r=this.measurements[e];return r&&Object.keys(r).length>0&&(t=this.measurements[e]),t}},{key:"createSource",value:function(e,t){var r=this;if(e){if(t){var n=k(),a={id:n,name:e,version:t,addOrUpdate:function(e,t){return r.addOrUpdate(a,e,t)},getAnnotation:function(e,t){return r.getAnnotation(a,e,t)}};return h.info("New '".concat(e,"@").concat(t,"' source added.")),this.sources[n]=a,a}h.warn("Source version not provided. Exiting early.")}else h.warn("Source name not provided. Exiting early.")}},{key:"addMapping",value:function(e,t,r,n,a){if(this._isValidSource(e))if(r)if(t)if(n)if(a){var i={matchingCriteria:r,definition:t,toSourceSchema:n,toMeasurementSchema:a};Array.isArray(this.mappings[e.id])?this.mappings[e.id].push(i):this.mappings[e.id]=[i],h.info("New measurement mapping added to source '".concat(this._getSourceInfo(e),"'."))}else h.warn("Measurement mapping function not provided. Exiting early.");else h.warn("Source mapping function not provided. Exiting early.");else h.warn("Definition not provided. Exiting early.");else h.warn("Matching criteria not provided. Exiting early.");else h.warn("Invalid source. Exiting early.")}},{key:"getAnnotation",value:function(e,t,r){if(this._isValidSource(e))if(t){var n=this._getMappingByMeasurementSource(r,t);if(n)return n.toSourceSchema(a,t);var a=this.getMeasurement(r),i=this._getMatchingMapping(e,t,a);if(i)return h.info("Matching mapping found:",i),(0,i.toSourceSchema)(a,i.definition)}else h.warn("No source definition provided. Exiting early.");else h.warn("Invalid source. Exiting early.")}},{key:"addOrUpdate",value:function(e,t,r){if(this._isValidSource(e)){var n=this._getSourceInfo(e);if(!t)return console.log("TEST"),void h.warn("No source definition provided. Exiting early.");if(this._sourceHasMappings(e)){var a={};try{(a=(0,this.mappings[e.id].find((function(e){return e.definition===t})).toMeasurementSchema)(r)).source=e}catch(e){return void h.warn("Failed to map '".concat(n,"' measurement for definition ").concat(t,":"),e.message)}if(this._isValidMeasurement(a)){var i=r.id;i||(i=k(),h.warn("Measurement ID not found. Generating UID: ".concat(i)));var o=function(e){for(var t=1;t0,a=Array.isArray(this.listeners[e]);n&&a&&this.listeners[e].forEach((function(e){e.callback({source:t,measurement:r})}))}},{key:"_unsubscribe",value:function(e,t){if(this.listeners[e]){var r=this.listeners[e];Array.isArray(r)?this.listeners[e]=r.filter((function(e){return e.id!==t})):this.listeners[e]=void 0}}},{key:"_isValidMeasurement",value:function(e){return Object.keys(e).forEach((function(e){if(!R.includes(e))return h.warn("Invalid measurement key: ".concat(e)),!1})),!0}},{key:"_isValidEvent",value:function(e){return Object.values(this.EVENTS).includes(e)}}]),e}(),C={name:"MeasurementService",create:function(e){e.configuration;return new N}},F=r(9),L=r.n(F),V=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=t.getAppState,n=t.getActiveContexts;f()(this,e),this.contexts={},r&&n||h.warn("CommandsManager was instantiated without getAppState() or getActiveContexts()"),this._getAppState=r,this._getActiveContexts=n}return p()(e,[{key:"createContext",value:function(e){if(e)return this.contexts[e]?this.clearContext(e):void(this.contexts[e]={})}},{key:"getContext",value:function(e){var t=this.contexts[e];if(t)return t}},{key:"clearContext",value:function(e){e&&(this.contexts[e]={})}},{key:"registerCommand",value:function(e,t,r){if("object"===L()(r)){var n=this.getContext(e);n&&(n[t]=r)}}},{key:"getCommand",value:function(e,t){var r,n=this,a=[];if(t){var i=this.getContext(t);i&&a.push(i)}else{this._getActiveContexts().forEach((function(e){var t=n.getContext(e);t&&a.push(t)}))}if(0!==a.length)return a.forEach((function(t){t[e]&&(r=t[e])})),r}},{key:"runCommand",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2?arguments[2]:void 0,n=this.getCommand(e,r);if(n){var a=n.commandFn,i=n.storeContexts,o=void 0===i?[]:i,s=n.options,u={},c=this._getAppState();if(o.forEach((function(e){u[e]=c[e]})),u=Object.assign({},u,s,t),"function"==typeof a)return a(u);h.warn('No commandFn was defined for command "'.concat(e,'"'))}else h.warn('Command "'.concat(e,'" not found in current context'))}}]),e}(),q=r(10),$=r.n(q),z=r(42),G=r.n(z);!function(e){var t=[],r=null,n=[],a=!1,i=e.prototype.handleKey;function o(e,t,r){var o=this;if(o.recording)if("keydown"===r.type){1===e.length&&a&&u();for(var c=0;c0&&u();else i.apply(o,arguments)}function s(e){for(var t=0;t1&&1===t.length?-1:1===e.length&&t.length>1||e>t?1:-1})),e[t]=e[t].join("+")}(t),r(t)),t=[],r=null,n=[]}e.prototype.record=function(e){var t=this;t.recording=!0,r=function(){t.recording=!1,e.apply(t,arguments)}},e.prototype.stopRecord=function(){this.recording=!1},e.prototype.startRecording=function(){this.recording=!0},e.prototype.handleKey=function(){var e=this;o.apply(e,arguments)},e.init()}(G.a),T=G.a,A=T.prototype.stopCallback,T.prototype.stopCallback=function(e,t,r){return!!this.paused||A.call(this,e,t,r)},T.prototype.pause=function(){this.paused=!0},T.prototype.unpause=function(){this.paused=!1},T.init();var B=G.a;function H(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function W(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:[];try{var r=this._getValidDefinitions(t);r.forEach((function(t){return e.registerHotkeys(t)}))}catch(e){var n=this._servicesManager.services.UINotificationService;n.show({title:"Hotkeys Manager",message:"Erro while setting hotkeys",type:"error"})}}},{key:"setDefaultHotKeys",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=this._getValidDefinitions(e);this.hotkeyDefaults=t}},{key:"_getValidDefinitions",value:function(e){return Array.isArray(e)?$()(e):this._parseToArrayLike(e)}},{key:"_parseToArrayLike",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=W({},t);return Object.entries(r).map((function(t){return e._parseToHotKeyObj(t[0],t[1])}))}},{key:"_parseToHotKeyObj",value:function(e,t){return W({commandName:e},t)}},{key:"registerHotkeys",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.commandName,r=e.keys,n=e.label;if(t){var a=this.hotkeyDefinitions[t];if(a){var i=a.keys;this._unbindHotkeys(t,i),h.info("Unbinding ".concat(t," from ").concat(i))}this.hotkeyDefinitions[t]={keys:r,label:n},this._bindHotkeys(t,r),h.info("Binding ".concat(t," to ").concat(r))}else h.warn('No command was defined for hotkey "'.concat(r,'"'))}},{key:"restoreDefaultBindings",value:function(){this.setHotkeys(this.hotkeyDefaults)}},{key:"destroy",value:function(){this.hotkeyDefaults=[],this.hotkeyDefinitions={},B.reset()}},{key:"_bindHotkeys",value:function(e,t){var r=this;""===t||void 0===t||(t instanceof Array?t:[t]).forEach((function(t){return B.bind(t,(function(t){t.preventDefault(),t.stopPropagation(),r._commandsManager.runCommand(e,{evt:t})}))}))}},{key:"_unbindHotkeys",value:function(e,t){""!==t&&void 0!==t&&(t instanceof Array?t:[t]).forEach((function(e){return B.unbind(e)}))}}]),e}(),K=r(22),J=r.n(K),Y=r(6),X=r.n(Y),Z=r(8),ee=r.n(Z),te=r(3),re=r.n(te);var ne={userLoggedIn:function(){return!1},getUserId:function(){return null},getName:function(){return null},getAccessToken:function(){return null},login:function(){return new Promise((function(e,t){return t()}))},logout:function(){return new Promise((function(e,t){return t()}))},getData:function(e){return null},setData:function(e,t){return null}};var ae={getAttribute:function(e,t){return e&&e.Value&&e.Value.length?function(e){function t(e){var t=e.length;return 0==t?"0000":1==t?"000".concat(e):2==t?"00".concat(e):3==t?"0".concat(e):e}for(var r="",n=0;n0&&void 0!==arguments[0]?arguments[0]:{},t=e.requestOptions,r={},n=ne&&ne.getAccessToken&&ne.getAccessToken();return t&&t.auth?"function"==typeof t.auth?r.Authorization=t.auth(t):r.Authorization="Basic ".concat(btoa(t.auth)):n&&(r.Authorization=n),r},getModalities:function(e,t){if(!e&&!t)return{};var r=e||{vr:"CS",Value:[]};if(t){if(!r.vr||r.vr!==t.vr)return t;for(var n=0;n0}},{key:"isValidIndex",value:function(e){return"number"===L()(e)&&e>=0&&(0|e)===e}},{key:"isValidCallback",value:function(e){return"function"===L()(e)}}]),e}();function he(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}var me=function(e){X()(n,e);var t,r=(t=n,function(){var e,r=re()(t);if(he()){var n=re()(this).constructor;e=Reflect.construct(r,arguments,n)}else e=r.apply(this,arguments);return ee()(this,e)});function n(e,t){var a;return f()(this,n),a=r.call(this,e,t),Object.defineProperties(J()(a),{_imageId:{configurable:!0,enumerable:!1,writable:!0,value:null}}),a._definePublicProperties(),a}return p()(n,[{key:"_definePublicProperties",value:function(){Object.defineProperty(this,"SOPInstanceUID",{configurable:!1,enumerable:!1,get:function(){return this.getSOPInstanceUID()}})}},{key:"getStudyInstanceUID",value:function(){return this.getTagValue("StudyInstanceUID",null)}},{key:"getSeriesInstanceUID",value:function(){return this.getTagValue("SeriesInstanceUID",null)}},{key:"getSOPInstanceUID",value:function(){return this.getTagValue("SOPInstanceUID",null)}},{key:"getStringValue",value:function(e,t,r){var a=this.getTagValue(e,r);return"string"!==L()(a)&&"undefined"!==L()(a)&&(a=a.toString()),n.getIndexedValue(a,t,r)}},{key:"getFloatValue",value:function(e,t,r){var a=this.getTagValue(e,r);return(a=n.getIndexedValue(a,t,r))instanceof Array?(a.forEach((function(e,t){a[t]=parseFloat(e)})),a):"string"===L()(a)?parseFloat(a):a}},{key:"getIntValue",value:function(e,t,r){var a=this.getTagValue(e,r);return(a=n.getIndexedValue(a,t,r))instanceof Array?(a.forEach((function(e,t){a[t]=parseFloat(e)})),a):"string"===L()(a)?parseInt(a):a}},{key:"getTagValue",value:function(e,t){throw new ce("InstanceMetadata::getTagValue is not overriden. Please, override it in a specialized class. See OHIFInstanceMetadata for example")}},{key:"equals",value:function(e){return e===this||e instanceof n&&e.getSOPInstanceUID()===this.getSOPInstanceUID()}},{key:"tagExists",value:function(e){throw new ce("InstanceMetadata::tagExists is not overriden. Please, override it in a specialized class. See OHIFInstanceMetadata for example")}},{key:"getImageId",value:function(e){throw new ce("InstanceMetadata::getImageId is not overriden. Please, override it in a specialized class. See OHIFInstanceMetadata for example")}}],[{key:"getIndexedValue",value:function(e,t,r){var n=r;if("string"===L()(e)){var a=-1!==e.indexOf("\\");if(n=e,a){var i=e.split("\\");if(pe.isValidIndex(t)){var o=i[t];n="string"!==L()(o)?r:o}else n=i}}return n}}]),n}(pe);function ve(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}var ye=function(e){X()(n,e);var t,r=(t=n,function(){var e,r=re()(t);if(ve()){var n=re()(this).constructor;e=Reflect.construct(r,arguments,n)}else e=r.apply(this,arguments);return ee()(this,e)});function n(e,t){var a;return f()(this,n),a=r.call(this,e,t),Object.defineProperties(J()(a),{_seriesInstanceUID:{configurable:!0,enumerable:!1,writable:!0,value:null},_instances:{configurable:!1,enumerable:!1,writable:!1,value:[]},_firstInstance:{configurable:!1,enumerable:!1,writable:!0,value:null}}),a._definePublicProperties(),a}return p()(n,[{key:"_definePublicProperties",value:function(){Object.defineProperty(this,"seriesInstanceUID",{configurable:!1,enumerable:!1,get:function(){return this.getSeriesInstanceUID()}})}},{key:"getSeriesInstanceUID",value:function(){return this._seriesInstanceUID}},{key:"addInstance",value:function(e){var t=!1;return e instanceof me&&void 0===this.getInstanceByUID(e.getSOPInstanceUID())&&(this._instances.push(e),t=!0),t}},{key:"getFirstInstance",value:function(){var e=this._firstInstance;if(!(e instanceof me)){e=null;var t=this.getInstanceByIndex(0);t instanceof me&&(this._firstInstance=t,e=t)}return e}},{key:"getInstanceByIndex",value:function(e){var t;return pe.isValidIndex(e)&&(t=this._instances[e]),t}},{key:"getInstanceByUID",value:function(e){var t;return pe.isValidUID(e)&&(t=this._instances.find((function(t){return t.getSOPInstanceUID()===e}))),t}},{key:"getInstanceCount",value:function(){return this._instances.length}},{key:"forEachInstance",value:function(e){pe.isValidCallback(e)&&this._instances.forEach((function(t,r){e.call(null,t,r)}))}},{key:"indexOfInstance",value:function(e){return this._instances.indexOf(e)}},{key:"findInstance",value:function(e){if(pe.isValidCallback(e))return this._instances.find((function(t,r){return e.call(null,t,r)}))}},{key:"equals",value:function(e){return e===this||e instanceof n&&e.getSeriesInstanceUID()===this.getSeriesInstanceUID()}}]),n}(pe);function ge(e){return(ge="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function be(e,t){for(var r=0;r2&&void 0!==arguments[2]?arguments[2]:0;if(r+t.length>e.length)return!1;for(var n=r,a=0;a2&&void 0!==arguments[2]?arguments[2]:0,n=arguments.length>3?arguments[3]:void 0,a=e.length;n&&(a=Math.min(r+n,e.length));for(var i=r;i1&&void 0!==arguments[1]?arguments[1]:0,r=arguments.length>2?arguments[2]:void 0,n=r||e.length-t,a="",i=t;i1?e:e[0]},ke="application/dicom",je="application/dicom+json",Te="application/octet-stream",Ae="application/pdf";var Re={DICOMwebClient:function(){function e(t){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.baseURL=t.url,this.baseURL||console.error("no DICOMweb base url provided - calls will fail"),"username"in t&&(this.username=t.username,"password"in t||console.error("no password provided to authenticate with DICOMweb service"),this.password=t.password),"qidoURLPrefix"in t?(console.log("use URL prefix for QIDO-RS: ".concat(t.qidoURLPrefix)),this.qidoURL="".concat(this.baseURL,"/").concat(t.qidoURLPrefix)):this.qidoURL=this.baseURL,"wadoURLPrefix"in t?(console.log("use URL prefix for WADO-RS: ".concat(t.wadoURLPrefix)),this.wadoURL="".concat(this.baseURL,"/").concat(t.wadoURLPrefix)):this.wadoURL=this.baseURL,"stowURLPrefix"in t?(console.log("use URL prefix for STOW-RS: ".concat(t.stowURLPrefix)),this.stowURL="".concat(this.baseURL,"/").concat(t.stowURLPrefix)):this.stowURL=this.baseURL,this.headers=t.headers||{}}var t,r,n;return t=e,n=[{key:"_parseQueryParameters",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t="?";return Object.keys(e).forEach((function(r,n){0!==n&&(t+="&"),t+="".concat(r,"=").concat(encodeURIComponent(e[r]))})),t}},{key:"_assertMediaTypeIsValid",value:function(e){if(!e)throw new Error("Not a valid media type: ".concat(e));var t=e.indexOf("/");if(-1===t)throw new Error("Not a valid media type: ".concat(e));var r=e.slice(0,t);if(!["application","image","text","video"].includes(r))throw new Error("Not a valid media type: ".concat(e));if(e.slice(t+1).includes("/"))throw new Error("Not a valid media type: ".concat(e))}},{key:"_parseMediaType",value:function(t){return e._assertMediaTypeIsValid(t),t.split("/")}},{key:"_buildAcceptHeaderFieldValue",value:function(t,r){if(!Array.isArray(t))throw new Error("Acceptable media types must be provided as an Array");return t.map((function(t){var n=t.mediaType;if(e._assertMediaTypeIsValid(n),!r.includes(n))throw new Error("Media type ".concat(n," is not supported for requested resource"));return n})).join(", ")}},{key:"_buildMultipartAcceptHeaderFieldValue",value:function(t,r){if(!Array.isArray(t))throw new Error("Acceptable media types must be provided as an Array");if(!Array.isArray(r)&&!Ee(r))throw new Error("Supported media types must be provided as an Array or an Object");var n=[];return t.forEach((function(t){var a=t.transferSyntaxUID,i=t.mediaType;e._assertMediaTypeIsValid(i);var o='multipart/related; type="'.concat(i,'"');if(Ee(r)){if(!(Object.values(r).flat(1).includes(i)||i.endsWith("/*")&&i.endsWith("/")))throw new Error("Media type ".concat(i," is not supported for requested resource"));if(a){if("*"!==a){if(!Object.keys(r).includes(a))throw new Error("Transfer syntax ".concat(a," is not supported for requested resource"));var s=r[a];if(!s.includes(i)){var u=e._parseMediaType(i)[0];s.map((function(t){var r=e._parseMediaType(t)[0];if(u!==r||!i.endsWith("/*")&&!i.endsWith("/"))throw new Error("Transfer syntax ".concat(a," is not supported for requested resource"))}))}}o+="; transfer-syntax=".concat(a)}}else if(Array.isArray(r)&&!r.includes(i))throw new Error("Media type ".concat(i," is not supported for requested resource"));n.push(o)})),n.join(", ")}},{key:"_buildRangeHeaderFieldValue",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return 1===e.length?"bytes=".concat(e[0],"-"):2===e.length?"bytes=".concat(e[0],"-").concat(e[1]):"bytes=0-"}},{key:"_getCommonMediaType",value:function(t){if(!t||!t.length)throw new Error("No acceptable media types provided");var r=new Set;if(t.forEach((function(t){var n=t.mediaType;if(n.startsWith("application"))r.add(n);else{var a=e._parseMediaType(n)[0];r.add("".concat(a,"/"))}})),0===r.size)throw new Error("No common acceptable media type could be identified.");if(r.size>1)throw new Error("Acceptable media types must have the same type.");return Array.from(r)[0]}}],(r=[{key:"_httpRequest",value:function(e,t,r){var n=this,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};return new Promise((function(i,o){var s=new XMLHttpRequest;s.open(t,e,!0),"responseType"in a&&(s.responseType=a.responseType),"object"===ge(r)&&Object.keys(r).forEach((function(e){s.setRequestHeader(e,r[e])}));var u=n.headers;Object.keys(u).forEach((function(e){s.setRequestHeader(e,u[e])})),s.onloadstart=function(){},s.onloadend=function(){},s.onreadystatechange=function(){if(4===s.readyState)if(200===s.status)i(s.response);else if(202===s.status)console.warn("some resources already existed: ",s),i(s.response);else if(204===s.status)console.warn("empty response for request: ",s),i([]);else{console.error("request failed: ",s);var e=new Error("request failed");e.request=s,e.response=s.response,e.status=s.status,console.error(e),console.error(e.response),o(e)}},"progressCallback"in a&&"function"==typeof a.progressCallback&&(s.onprogress=a.progressCallback),"data"in a?s.send(a.data):s.send()}))}},{key:"_httpGet",value:function(e,t,r,n){return this._httpRequest(e,"get",t,{responseType:r,progressCallback:n})}},{key:"_httpGetApplicationJson",value:function(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2?arguments[2]:void 0,a=t;"object"===ge(r)&&(Oe(r)||(a+=e._parseQueryParameters(r)));var i={Accept:je},o="json";return this._httpGet(a,i,o,n)}},{key:"_httpGetApplicationPdf",value:function(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2?arguments[2]:void 0,a=t;"object"===ge(r)&&(Oe(r)||(a+=e._parseQueryParameters(r)));var i={Accept:Ae},o="json";return this._httpGet(a,i,o,n)}},{key:"_httpGetImage",value:function(t,r){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},a=arguments.length>3?arguments[3]:void 0,i=t;"object"===ge(n)&&(Oe(n)||(i+=e._parseQueryParameters(n)));var o=["image/","image/*","image/jpeg","image/jp2","image/gif","image/png"],s=e._buildAcceptHeaderFieldValue(r,o),u={Accept:s},c="arraybuffer";return this._httpGet(i,u,c,a)}},{key:"_httpGetText",value:function(t,r){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},a=arguments.length>3?arguments[3]:void 0,i=t;"object"===ge(n)&&(Oe(n)||(i+=e._parseQueryParameters(n)));var o=["text/","text/*","text/html","text/plain","text/rtf","text/xml"],s=e._buildAcceptHeaderFieldValue(r,o),u={Accept:s},c="arraybuffer";return this._httpGet(i,u,c,a)}},{key:"_httpGetVideo",value:function(t,r){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},a=arguments.length>3?arguments[3]:void 0,i=t;"object"===ge(n)&&(Oe(n)||(i+=e._parseQueryParameters(n)));var o=["video/","video/*","video/mpeg","video/mp4","video/H265"],s=e._buildAcceptHeaderFieldValue(r,o),u={Accept:s},c="arraybuffer";return this._httpGet(i,u,c,a)}},{key:"_httpGetMultipartImage",value:function(t,r,n,a){var i,o=arguments.length>4&&void 0!==arguments[4]&&arguments[4],s=arguments.length>5?arguments[5]:void 0,u={};return o?i=["image/jpeg","image/gif","image/png","image/jp2"]:(i={"1.2.840.10008.1.2.5":["image/x-dicom-rle"],"1.2.840.10008.1.2.4.50":["image/jpeg"],"1.2.840.10008.1.2.4.51":["image/jpeg"],"1.2.840.10008.1.2.4.57":["image/jpeg"],"1.2.840.10008.1.2.4.70":["image/jpeg"],"1.2.840.10008.1.2.4.80":["image/x-jls","image/jls"],"1.2.840.10008.1.2.4.81":["image/x-jls","image/jls"],"1.2.840.10008.1.2.4.90":["image/jp2"],"1.2.840.10008.1.2.4.91":["image/jp2"],"1.2.840.10008.1.2.4.92":["image/jpx"],"1.2.840.10008.1.2.4.93":["image/jpx"]},n&&(u.Range=e._buildRangeHeaderFieldValue(n))),u.Accept=e._buildMultipartAcceptHeaderFieldValue(r,i),this._httpGet(t,u,"arraybuffer",s).then(De)}},{key:"_httpGetMultipartVideo",value:function(t,r,n,a){var i,o=arguments.length>4&&void 0!==arguments[4]&&arguments[4],s=arguments.length>5?arguments[5]:void 0,u={};return o?i=["video/","video/*","video/mpeg2","video/mp4","video/H265"]:(i={"1.2.840.10008.1.2.4.100":["video/mpeg2"],"1.2.840.10008.1.2.4.101":["video/mpeg2"],"1.2.840.10008.1.2.4.102":["video/mp4"],"1.2.840.10008.1.2.4.103":["video/mp4"],"1.2.840.10008.1.2.4.104":["video/mp4"],"1.2.840.10008.1.2.4.105":["video/mp4"],"1.2.840.10008.1.2.4.106":["video/mp4"]},n&&(u.Range=e._buildRangeHeaderFieldValue(n))),u.Accept=e._buildMultipartAcceptHeaderFieldValue(r,i),this._httpGet(t,u,"arraybuffer",s).then(De)}},{key:"_httpGetMultipartApplicationDicom",value:function(t,r,n,a){var i={},o="application/dicom",s={"1.2.840.10008.1.2.1":[o],"1.2.840.10008.1.2.5":[o],"1.2.840.10008.1.2.4.50":[o],"1.2.840.10008.1.2.4.51":[o],"1.2.840.10008.1.2.4.57":[o],"1.2.840.10008.1.2.4.70":[o],"1.2.840.10008.1.2.4.80":[o],"1.2.840.10008.1.2.4.81":[o],"1.2.840.10008.1.2.4.90":[o],"1.2.840.10008.1.2.4.91":[o],"1.2.840.10008.1.2.4.92":[o],"1.2.840.10008.1.2.4.93":[o],"1.2.840.10008.1.2.4.100":[o],"1.2.840.10008.1.2.4.101":[o],"1.2.840.10008.1.2.4.102":[o],"1.2.840.10008.1.2.4.103":[o],"1.2.840.10008.1.2.4.104":[o],"1.2.840.10008.1.2.4.105":[o],"1.2.840.10008.1.2.4.106":[o]},u=r;return r||(u=[{mediaType:o}]),i.Accept=e._buildMultipartAcceptHeaderFieldValue(u,s),this._httpGet(t,i,"arraybuffer",a).then(De)}},{key:"_httpGetMultipartApplicationOctetStream",value:function(t,r,n,a,i){var o={},s={"1.2.840.10008.1.2.1":["application/octet-stream"]},u=r;return r||(u=[{mediaType:"application/octet-stream"}]),n&&(o.Range=e._buildRangeHeaderFieldValue(n)),o.Accept=e._buildMultipartAcceptHeaderFieldValue(u,s),this._httpGet(t,o,"arraybuffer",i).then(De)}},{key:"_httpPost",value:function(e,t,r,n){return this._httpRequest(e,"post",t,{data:r,progressCallback:n})}},{key:"_httpPostApplicationJson",value:function(e,t,r){var n={"Content-Type":je};return this._httpPost(e,n,t,r)}},{key:"searchForStudies",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};console.log("search for studies");var r="".concat(this.qidoURL,"/studies");return"queryParams"in t&&(r+=e._parseQueryParameters(t.queryParams)),this._httpGetApplicationJson(r)}},{key:"retrieveStudyMetadata",value:function(e){if(!("studyInstanceUID"in e))throw new Error("Study Instance UID is required for retrieval of study metadata");console.log("retrieve metadata of study ".concat(e.studyInstanceUID));var t="".concat(this.wadoURL,"/studies/").concat(e.studyInstanceUID,"/metadata");return this._httpGetApplicationJson(t)}},{key:"searchForSeries",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=this.qidoURL;return"studyInstanceUID"in t&&(console.log("search series of study ".concat(t.studyInstanceUID)),r+="/studies/".concat(t.studyInstanceUID)),r+="/series","queryParams"in t&&(r+=e._parseQueryParameters(t.queryParams)),this._httpGetApplicationJson(r)}},{key:"retrieveSeriesMetadata",value:function(e){if(!("studyInstanceUID"in e))throw new Error("Study Instance UID is required for retrieval of series metadata");if(!("seriesInstanceUID"in e))throw new Error("Series Instance UID is required for retrieval of series metadata");console.log("retrieve metadata of series ".concat(e.seriesInstanceUID));var t="".concat(this.wadoURL,"/studies/").concat(e.studyInstanceUID,"/series/").concat(e.seriesInstanceUID,"/metadata");return this._httpGetApplicationJson(t)}},{key:"searchForInstances",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=this.qidoURL;return"studyInstanceUID"in t?(r+="/studies/".concat(t.studyInstanceUID),"seriesInstanceUID"in t?(console.log("search for instances of series ".concat(t.seriesInstanceUID)),r+="/series/".concat(t.seriesInstanceUID)):console.log("search for instances of study ".concat(t.studyInstanceUID))):console.log("search for instances"),r+="/instances","queryParams"in t&&(r+=e._parseQueryParameters(t.queryParams)),this._httpGetApplicationJson(r)}},{key:"buildInstanceWadoURIUrl",value:function(e){if(!("studyInstanceUID"in e))throw new Error("Study Instance UID is required.");if(!("seriesInstanceUID"in e))throw new Error("Series Instance UID is required.");if(!("sopInstanceUID"in e))throw new Error("SOP Instance UID is required.");var t=e.contentType||ke,r=e.transferSyntax||"*",n=[];n.push("requestType=WADO"),n.push("studyUID=".concat(e.studyInstanceUID)),n.push("seriesUID=".concat(e.seriesInstanceUID)),n.push("objectUID=".concat(e.sopInstanceUID)),n.push("contentType=".concat(t)),n.push("transferSyntax=".concat(r));var a=n.join("&");return"".concat(this.wadoURL,"?").concat(a)}},{key:"retrieveInstanceMetadata",value:function(e){if(!("studyInstanceUID"in e))throw new Error("Study Instance UID is required for retrieval of instance metadata");if(!("seriesInstanceUID"in e))throw new Error("Series Instance UID is required for retrieval of instance metadata");if(!("sopInstanceUID"in e))throw new Error("SOP Instance UID is required for retrieval of instance metadata");console.log("retrieve metadata of instance ".concat(e.sopInstanceUID));var t="".concat(this.wadoURL,"/studies/").concat(e.studyInstanceUID,"/series/").concat(e.seriesInstanceUID,"/instances/").concat(e.sopInstanceUID,"/metadata");return this._httpGetApplicationJson(t)}},{key:"retrieveInstanceFrames",value:function(t){if(!("studyInstanceUID"in t))throw new Error("Study Instance UID is required for retrieval of instance frames");if(!("seriesInstanceUID"in t))throw new Error("Series Instance UID is required for retrieval of instance frames");if(!("sopInstanceUID"in t))throw new Error("SOP Instance UID is required for retrieval of instance frames");if(!("frameNumbers"in t))throw new Error("frame numbers are required for retrieval of instance frames");console.log("retrieve frames ".concat(t.frameNumbers.toString()," of instance ").concat(t.sopInstanceUID));var r="".concat(this.wadoURL,"/studies/").concat(t.studyInstanceUID,"/series/").concat(t.seriesInstanceUID,"/instances/").concat(t.sopInstanceUID,"/frames/").concat(t.frameNumbers.toString()),n=t.mediaTypes;if(!n)return this._httpGetMultipartApplicationOctetStream(r);var a=e._getCommonMediaType(n);if(a===Te)return this._httpGetMultipartApplicationOctetStream(r,n);if(a.startsWith("image"))return this._httpGetMultipartImage(r,n);if(a.startsWith("video"))return this._httpGetMultipartVideo(r,n);throw new Error("Media type ".concat(a," is not supported for retrieval of frames."))}},{key:"retrieveInstanceRendered",value:function(t){if(!("studyInstanceUID"in t))throw new Error("Study Instance UID is required for retrieval of rendered instance");if(!("seriesInstanceUID"in t))throw new Error("Series Instance UID is required for retrieval of rendered instance");if(!("sopInstanceUID"in t))throw new Error("SOP Instance UID is required for retrieval of rendered instance");var r="".concat(this.wadoURL,"/studies/").concat(t.studyInstanceUID,"/series/").concat(t.seriesInstanceUID,"/instances/").concat(t.sopInstanceUID,"/rendered"),n=t.mediaTypes,a=t.params;if(!n)return this._httpGet(r,{},"arraybuffer");var i=e._getCommonMediaType(n);if(i.startsWith("image"))return this._httpGetImage(r,n,a);if(i.startsWith("video"))return this._httpGetVideo(r,n,a);if(i.startsWith("text"))return this._httpGetText(r,n,a);if(i===Ae)return this._httpGetApplicationPdf(r,a);throw new Error("Media type ".concat(i," is not supported for retrieval of rendered instance."))}},{key:"retrieveInstanceFramesRendered",value:function(t){if(!("studyInstanceUID"in t))throw new Error("Study Instance UID is required for retrieval of rendered instance frames");if(!("seriesInstanceUID"in t))throw new Error("Series Instance UID is required for retrieval of rendered instance frames");if(!("sopInstanceUID"in t))throw new Error("SOP Instance UID is required for retrieval of rendered instance frames");if(!("frameNumbers"in t))throw new Error("frame numbers are required for retrieval of rendered instance frames");console.debug("retrieve rendered frames ".concat(t.frameNumbers.toString()," of instance ").concat(t.sopInstanceUID));var r="".concat(this.wadoURL,"/studies/").concat(t.studyInstanceUID,"/series/").concat(t.seriesInstanceUID,"/instances/").concat(t.sopInstanceUID,"/frames/").concat(t.frameNumbers.toString(),"/rendered"),n=t.mediaTypes;if(!n)return this._httpGet(r,{},"arraybuffer");var a=e._getCommonMediaType(n);if(a.startsWith("image"))return this._httpGetImage(r,n);if(a.startsWith("video"))return this._httpGetVideo(r,n);throw new Error("Media type ".concat(a," is not supported for retrieval of rendered frame."))}},{key:"retrieveInstance",value:function(t){if(!("studyInstanceUID"in t))throw new Error("Study Instance UID is required");if(!("seriesInstanceUID"in t))throw new Error("Series Instance UID is required");if(!("sopInstanceUID"in t))throw new Error("SOP Instance UID is required");var r="".concat(this.wadoURL,"/studies/").concat(t.studyInstanceUID,"/series/").concat(t.seriesInstanceUID,"/instances/").concat(t.sopInstanceUID),n=t.mediaTypes;if(!n)return this._httpGetMultipartApplicationDicom(r).then(xe);var a=e._getCommonMediaType(n);if(a===ke)return this._httpGetMultipartApplicationDicom(r,n).then(xe);if(a===Te)return this._httpGetMultipartApplicationOctetStream(r,n).then(xe);if(a.startsWith("image"))return this._httpGetMultipartImage(r,n).then(_e);if(a.startsWith("video"))return this._httpGetMultipartVideo(r,n).then(_e);throw new Error("Media type ".concat(a," is not supported for retrieval of instance."))}},{key:"retrieveSeries",value:function(t){if(!("studyInstanceUID"in t))throw new Error("Study Instance UID is required");if(!("seriesInstanceUID"in t))throw new Error("Series Instance UID is required");var r="".concat(this.wadoURL,"/studies/").concat(t.studyInstanceUID,"/series/").concat(t.seriesInstanceUID),n=t.mediaTypes;if(!n)return this._httpGetMultipartApplicationDicom(r);var a=e._getCommonMediaType(n);if(a===ke)return this._httpGetMultipartApplicationDicom(r,n);if(a===Te)return this._httpGetMultipartApplicationOctetStream(r,n);if(a.startsWith("image"))return this._httpGetMultipartImage(r,n);if(a.startsWith("video"))return this._httpGetMultipartVideo(r,n);throw new Error("Media type ".concat(a," is not supported for retrieval of series."))}},{key:"retrieveStudy",value:function(t){if(!("studyInstanceUID"in t))throw new Error("Study Instance UID is required");var r="".concat(this.wadoURL,"/studies/").concat(t.studyInstanceUID),n=t.mediaTypes;if(!n)return this._httpGetMultipartApplicationDicom(r);var a=e._getCommonMediaType(n);if(a===ke)return this._httpGetMultipartApplicationDicom(r,n);if(a===Te)return this._httpGetMultipartApplicationOctetStream(r,n);if(a.startsWith("image"))return this._httpGetMultipartImage(r,n);if(a.startsWith("video"))return this._httpGetMultipartVideo(r,n);throw new Error("Media type ".concat(a," is not supported for retrieval of study."))}},{key:"retrieveBulkData",value:function(t){if(!("BulkDataURI"in t))throw new Error("BulkDataURI is required.");var r=t.BulkDataURI,n=t.mediaTypes,a=t.byteRange;if(!n)return this._httpGetMultipartApplicationOctetStream(r,n,a);var i=e._getCommonMediaType(n);if(i===Te)return this._httpGetMultipartApplicationOctetStream(r,n,a);if(i.startsWith("image"))return this._httpGetMultipartImage(r,n,a);throw new Error("Media type ".concat(i," is not supported for retrieval of bulk data."))}},{key:"storeInstances",value:function(e){if(!("datasets"in e))throw new Error("datasets are required for storing");var t="".concat(this.stowURL,"/studies");"studyInstanceUID"in e&&(t+="/".concat(e.studyInstanceUID));var r=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Pe(),r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"application/dicom",n="Content-Type: ".concat(r),a="\r\n--".concat(t,"\r\n").concat(n,"\r\n\r\n"),i="\r\n--".concat(t,"--"),o=Ie(a),s=Ie(i),u=o.length,c=s.length,l=0,f=e.map((function(e){var t=new Uint8Array(e),r=t.length;return l+=u+r+c,t})),d=new Uint8Array(l);d.set(o,0);var p=0;return f.forEach((function(e){d.set(o,p),d.set(e,p+u),p+=u+e.length})),d.set(s,p),{data:d.buffer,boundary:t}}(e.datasets),n=r.data,a=r.boundary,i={"Content-Type":"multipart/related; type=application/dicom; boundary=".concat(a)};return this._httpPost(t,i,n,e.progressCallback)}}])&&be(t.prototype,r),n&&be(t,n),e}()};function Me(e){if(!e.length)return{value:!1};var t=e[0].getData().metadata,r=t.Modality,n=t.NumberOfFrames>1;return Ce.includes(r)&&(n||1!==e.length)?n?(e[0],{value:!1}):function(e){for(var t=e[0].getData().metadata,r=t.Rows,n=t.Columns,a=t.SamplesPerPixel,i=t.ImageOrientationPatient,o=t.ImagePositionPatient,s=1;s2){var p=e[e.length-1].getData().metadata.ImagePositionPatient;if(!o||!p)return{value:!1}}return{value:!0,missingFrames:0}}(e):{value:!1}}function Ue(e,t){if(void 0!==e&&void 0!==!t)return Math.abs(e[0]-t[0])0?(d!==e.length-1&&(f[d]=v),f[d-1]=(t=Math.abs(v-f[d-1]),+(Math.round(t+"e+2")+"e-2"))):f.push(v)}var y=function(e){var t=$()(new Set(e)),r=new Array(t.length).fill(0),n=0,a=1/0;e.forEach((function(e){e>n&&(n=e),e0)){var a=new de([]),i=t.getData();return a.setAttributes({displaySetInstanceUID:a.uid,SeriesInstanceUID:i.SeriesInstanceUID,SeriesDescription:i.SeriesDescription,SeriesNumber:i.SeriesNumber,Modality:i.Modality,combinedId:t.combinedId}),n.push(a),n}var o=function(e){var t=new Set;return e.forEachInstance((function(e){var r=e.getTagValue("SOPClassUID");t.add(r)})),Array.from(t)}(t);if(e&&e.length>0){var s=function(e,t,r,n){if(1!==n.length)return void console.warn("getDisplaySetFromSopClassPlugin: More than one SOPClassUID in the same series is not yet supported.");var a=n[0],i=e.map((function(e){return e.module})).filter((function(e){return e.sopClassUIDs.includes(a)}));if(!i||!i.length)return;var o=i[0],s=ae.getAuthorizationHeader(),u=Ve.getHTTPErrorHandler(),c=new Ge({url:r.getData().wadoRoot,headers:s,errorInterceptor:u}),l=o.getDisplaySetFromSeries(t,r,c,s);if(l&&!l.Modality){var f=t.getFirstInstance();l.Modality=f.getTagValue("Modality")}return l}(e,t,r,o);if(s)return s.sopClassModule=!0,s.isDerived?this._addDerivedDisplaySet(s):n.push(s),s.combinedId=t.combinedId,n}var u=[];if(t.forEachInstance((function(e){var a;Be(e)?((a=He(t,[e])).setAttributes({sopClassUIDs:o,isClip:!0,SeriesInstanceUID:t.getSeriesInstanceUID(),StudyInstanceUID:r.getStudyInstanceUID(),numImageFrames:e.getTagValue("NumberOfFrames"),InstanceNumber:e.getTagValue("InstanceNumber"),AcquisitionDatetime:e.getTagValue("AcquisitionDateTime")}),n.push(a)):We(e.Modality)?((a=He(t,[e])).setAttributes({sopClassUIDs:o,StudyInstanceUID:r.getStudyInstanceUID(),SeriesInstanceUID:t.getSeriesInstanceUID(),InstanceNumber:e.getTagValue("InstanceNumber"),AcquisitionDatetime:e.getTagValue("AcquisitionDateTime")}),n.push(a)):u.push(e)})),u.length){var c=He(t,u);c.setAttribute("StudyInstanceUID",r.getStudyInstanceUID()),c.setAttributes({sopClassUIDs:o}),n.push(c)}return n}},{key:"_addDerivedDisplaySet",value:function(e){this._derivedDisplaySets.push(e)}},{key:"_addDerivedDisplaySets",value:function(e){var t=this;e.map((function(e){return t._derivedDisplaySets.push(e)}))}},{key:"getDerivedDatasets",value:function(e){var t=e.Modality,r=e.referencedSeriesInstanceUID,n=e.referencedFrameOfReferenceUID,a=this._derivedDisplaySets;return t&&(a=a.filter((function(e){return e.Modality===t}))),r&&(a=a.filter((function(e){return!!e.metadata.ReferencedSeriesSequence&&(Array.isArray(e.metadata.ReferencedSeriesSequence)?e.metadata.ReferencedSeriesSequence:[e.metadata.ReferencedSeriesSequence]).some((function(e){return e.SeriesInstanceUID===r}))}))),n&&(a=a.filter((function(e){return e.ReferencedFrameOfReferenceUID===n}))),a}},{key:"createDisplaySets",value:function(e){var t=this,r=[];return this.getSeriesCount()?(this.forEachSeries((function(n){var a=t._createDisplaySetsForSeries(e,n);r.push.apply(r,$()(a))})),Ke(r)):r}},{key:"sortDisplaySets",value:function(){Ke(this._displaySets)}},{key:"createAndAddDisplaySetsForSeries",value:function(e,t){var r=this;if(!this.containsSeries(t))return!1;for(var n=this._createDisplaySetsForSeries(e,t),a=this._displaySets.length-1;a>=0;a--){this._displaySets[a].combinedId===t.combinedId&&this._displaySets.splice(a,1)}return n.forEach((function(e){r.addDisplaySet(e)})),this.sortDisplaySets(),!0}},{key:"setDisplaySets",value:function(e){var t=this;Array.isArray(e)&&e.length>0&&(this._displaySets.splice(0),e.forEach((function(e){return t.addDisplaySet(e)})),this.sortDisplaySets())}},{key:"addDisplaySet",value:function(e){return!!(e instanceof de||e.sopClassModule)&&(this._displaySets.push(e),!0)}},{key:"forEachDisplaySet",value:function(e){pe.isValidCallback(e)&&this._displaySets.forEach((function(t,r){e.call(null,t,r)}))}},{key:"findDisplaySet",value:function(e){if(pe.isValidCallback(e))return this._displaySets.find((function(t,r){return e.call(null,t,r)}))}},{key:"getDisplaySetCount",value:function(){return this._displaySets.length}},{key:"getStudyInstanceUID",value:function(){return this._studyInstanceUID}},{key:"getSeries",value:function(){return this._series.slice()}},{key:"addSeries",value:function(e){var t=!1;return e instanceof ye&&(void 0===this.getSeriesByUID(e.getSeriesInstanceUID())||e.isSubSeries())&&(this._series.push(e),t=!0),t}},{key:"updateSeries",value:function(e,t){var r=this.getSeriesIndexByCustomId(t.getCustomSeriesInstanceUID());if(!(t instanceof ye))throw new Error("Series must be an instance of SeriesMetadata");return this._series[r]=t,!0}},{key:"getSeriesByIndex",value:function(e){var t;return pe.isValidIndex(e)&&(t=this._series[e]),t}},{key:"getSeriesByUID",value:function(e){var t;return pe.isValidUID(e)&&(t=this._series.find((function(t){return t.getSeriesInstanceUID()===e}))),t}},{key:"containsSeries",value:function(e){return e instanceof ye&&this._series.indexOf(e)>=0}},{key:"getSeriesCount",value:function(){return this._series.length}},{key:"getInstanceCount",value:function(){return this._series.reduce((function(e,t){return e+t.getInstanceCount()}),0)}},{key:"forEachSeries",value:function(e){pe.isValidCallback(e)&&this._series.forEach((function(t,r){e.call(null,t,r)}))}},{key:"indexOfSeries",value:function(e){return this._series.indexOf(e)}},{key:"sortSeriesByDisplaySets",value:function(){var e=this,t={};this.forEachDisplaySet((function(e,r){if(!(e instanceof de))throw new ce("StudyMetadata::sortSeriesByDisplaySets display set at index ".concat(r," is not an instance of ImageSet"));void 0===t[e.SeriesInstanceUID]&&(t[e.SeriesInstanceUID]=r)})),this.getSeries().forEach((function(r,n){if(!(r instanceof ye))throw new ce("StudyMetadata::sortSeriesByDisplaySets series at index ".concat(n," is not an instance of SeriesMetadata"));var a=t[r.getSeriesInstanceUID()];e._series[a]=r}))}},{key:"equals",value:function(e){return e===this||e instanceof n&&e.getStudyInstanceUID()===this.getStudyInstanceUID()}},{key:"getFirstSeries",value:function(){var e=this._firstSeries;if(!(e instanceof ye)){e=null;var t=this.getSeriesByIndex(0);t instanceof ye&&(this._firstSeries=t,e=t)}return e}},{key:"getFirstImageId",value:function(e){try{return this.findDisplaySet((function(t){return t.displaySetInstanceUID===e})).images[0].getImageId()}catch(e){return console.error("Failed to retrieve image metadata"),null}}},{key:"getFirstInstance",value:function(){var e=this._firstInstance;if(!(e instanceof me)){e=null;var t=this.getFirstSeries();if(t instanceof ye){var r=t.getFirstInstance();r instanceof me&&(this._firstInstance=r,e=r)}}return e}},{key:"findSeriesAndInstanceByInstance",value:function(e){var t;if(pe.isValidCallback(e)){var r,n=this._series.find((function(t){return(r=t.findInstance(e))instanceof me}));n instanceof ye&&(t={series:n,instance:r})}return t||{}}},{key:"findSeriesByInstance",value:function(e){return this.findSeriesAndInstanceByInstance(e).series}},{key:"findInstance",value:function(e){return this.findSeriesAndInstanceByInstance(e).instance}},{key:"getSeriesIndexByCustomId",value:function(e){var t=this._series.findIndex((function(t){return t.combinedId===e}));return t<0?null:t}}]),n}(pe),Ge=Re.DICOMwebClient,Be=function(e){return e.getTagValue("NumberOfFrames")>1},He=function(e,t){var r=t[0],n=new de(t),a=e.getData();n.setAttributes({displaySetInstanceUID:n.uid,SeriesDate:a.SeriesDate,SeriesTime:a.SeriesTime,SeriesInstanceUID:e.getSeriesInstanceUID(),SeriesNumber:e.getSeriesNumber(),SeriesDescription:e.getSeriesDescription(),numImageFrames:t.length,frameRate:r.getTagValue("FrameTime"),Modality:r.getTagValue("Modality"),isMultiFrame:Be(r)});n.sortBy((function(e,t){return(parseInt(e.getTagValue("InstanceNumber",0))||0)-(parseInt(t.getTagValue("InstanceNumber",0))||0)})),n.setAttribute("InstanceNumber",n.getImage(0).getTagValue("InstanceNumber"));var i=Me(t);n.isReconstructable=i.value,n.isReconstructable&&n.sortByImagePositionPatient(),i.missingFrames&&(n.missingFrames=i.missingFrames);var o=qe(t);return n.calculatedSpacings=o,n},We=function(e){return"CR"===e||"MG"===e||"DX"===e};function Qe(e,t){var r=Le(e.Modality),n=Le(t.Modality);return!r&&n?-1:r&&!n?1:function(e,t){return e.SeriesNumber>t.SeriesNumber||!e.SeriesNumber&&t.SeriesNumber?1:-1}(e,t)}function Ke(e){return e.sort(Qe)}var Je=r(2),Ye=r.n(Je),Xe=r(5),Ze=r.n(Xe),et=r(7),tt=r.n(et);function rt(){return Promise.resolve().then(r.t.bind(null,275,7))}function nt(e,t){var r=function(e,t){var r=e.wadorsuri;if(r)return null===t?r=r.replace(/frames\/(\d+)/,""):(t=t?parseInt(t)+1:1,r=r.replace(/frames\/(\d+)/,"frames/".concat(t))),r}(e,t);if(r)return"wadors:".concat(r)}function at(e,t,r){var n=new RegExp("([?&])"+t+"=.*?(&|$)","i"),a=-1!==e.indexOf("?")?"&":"?";return e.match(n)?e.replace(n,"$1"+t+"="+r+"$2"):e+a+t+"="+r}function it(e,t){var r=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(e){if("function"==typeof e.getImageId)return e.getImageId();if(e.url)return void 0!==t&&(e.url=at(e.url,"frame",t)),e.url;var n=r?"thumbnailRendering":"imageRendering";if(!e[n]||"wadouri"===e[n]||!e.wadorsuri){var a="dicomweb:"+e.wadouri;return void 0!==t&&(a+="&frame="+t),a}return nt(e,t)}}var ot=r(12),st=r.n(ot),ut=r(41),ct=r.n(ut),lt=r(43),ft=r.n(lt);function dt(e){for(var t=e.length,r=new Uint8Array(t),n=0;n0},get:function(e){var t=null;return Object.prototype.hasOwnProperty.call(this.entries,e)&&(t=this.entries[e],Date.now()-t.time>this.maxAge&&(delete this.entries[e],this.count--,t=null)),t},add:function(e){if(this.isValidUID(e.uid)){var t=e.uid;!0!==Object.prototype.hasOwnProperty.call(this.entries,t)&&this.count++,e.time=Date.now(),this.entries[t]=e}}};function vt(e,t,r){var n=r[0],a=r[2],i=function(e,t){return e[t]+256*e[t+1]},o=function(e){var t=new Uint8Array(e),r=[];if(16===a)for(var o=0;o>a)}return r}function gt(e,t){return bt.apply(this,arguments)}function bt(){return(bt=Ze()(Ye.a.mark((function e(t,r){var n,a;return Ye.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=[],a=[],e.abrupt("return",new Promise((function(e){for(var i=0;i<=30;i+=2){var o="60".concat(i.toString(16));3===o.length&&(o="600".concat(i.toString(16)));var s="".concat(o,"3000");if(t[s]&&t[s].InlineBinary){var u=dt(atob(t[s].InlineBinary));t[s]=yt(u)}else t[s]&&t[s].BulkDataURI?(n.push(It(t[s],r)),a.push(s)):t[s]&&t[s]instanceof ArrayBuffer&&(t[s]=yt(t[s]))}n.length?Promise.all(n).then((function(r){for(var n=0;n1&&void 0!==p[1]?p[1]:{},t instanceof ArrayBuffer?(a=ot.data.DicomMessage.readFile(t),n=a.dict):n=t,i=void 0===n.SeriesInstanceUID?ot.data.DicomMetaDictionary.naturalizeDataset(n):n,r.StudyInstanceUID&&(i.StudyInstanceUID=r.StudyInstanceUID),s=(o=i).StudyInstanceUID,u=o.SeriesInstanceUID,c=o.SOPInstanceUID,l=this._getAndCacheStudy(s),f=this._getAndCacheSeriesFromStudy(l,u),d=this._getAndCacheInstanceFromStudy(f,c),Object.assign(d,i),!r.server){e.next=12;break}return e.next=12,this._checkBulkDataAndInlineBinaries(d,r.server);case 12:return e.abrupt("return",d);case 13:case"end":return e.stop()}}),e,this)}))),function(e){return r.apply(this,arguments)})},{key:"addImageIdToUIDs",value:function(e,t){this.imageIdToUIDs.set(e,t)}},{key:"_getAndCacheStudy",value:function(e){var t=this.studies,r=t.get(e);return r||(r={series:new Map},t.set(e,r)),r}},{key:"_getAndCacheSeriesFromStudy",value:function(e,t){var r=e.series.get(t);return r||(r={instances:new Map},e.series.set(t,r)),r}},{key:"_getAndCacheInstanceFromStudy",value:function(e,t){var r=e.instances.get(t);return r||(r={},e.instances.set(t,r)),r}},{key:"_checkBulkDataAndInlineBinaries",value:(t=Ze()(Ye.a.mark((function e(t,r){return Ye.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,gt(t,r);case 2:if("PALETTE COLOR"!==t.PhotometricInterpretation){e.next=5;break}return e.next=5,pt(t,r);case 5:case"end":return e.stop()}}),e)}))),function(e,r){return t.apply(this,arguments)})},{key:"_getInstance",value:function(e){var t=this._getUIDsFromImageID(e);if(t){var r=t.StudyInstanceUID,n=t.SeriesInstanceUID,a=t.SOPInstanceUID;return this._getInstanceData(r,n,a)}}},{key:"get",value:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{fallback:!1},n=this._getInstance(t);return e===Dt?n:this.getTagFromInstance(e,n,r)}},{key:"getTag",value:function(e,t,r){return this.get(e,t,r)}},{key:"getInstance",value:function(e){return this.get(Dt,e)}},{key:"getTagFromInstance",value:function(e,t){if(t)return t[e]?t[e]:this._getCornerstoneWADOImageLoaderTag(e,t)}},{key:"_getCornerstoneWADOImageLoaderTag",value:function(e,t){var r;switch(e){case Pt.GENERAL_SERIES_MODULE:var n,a,i=t.SeriesDate,o=t.SeriesTime;i&&(n=ft.a.parseDA(i)),o&&(a=ft.a.parseTM(o)),r={modality:t.Modality,seriesInstanceUID:t.SeriesInstanceUID,seriesNumber:t.SeriesNumber,studyInstanceUID:t.StudyInstanceUID,seriesDate:n,seriesTime:a,seriesDescription:t.SeriesDescription};break;case Pt.PATIENT_STUDY_MODULE:r={patientAge:t.PatientAge,patientSize:t.PatientSize,patientWeight:t.PatientWeight};break;case Pt.IMAGE_PLANE_MODULE:var s,u,c,l,f=t.ImageOrientationPatient,d=function(e){var t=e.PixelSpacing,r=e.ImagerPixelSpacing,n=e.SOPClassUID,a=e.PixelSpacingCalibrationType,i=e.PixelSpacingCalibrationDescription,o=e.EstimatedRadiographicMagnificationFactor,s=e.SequenceOfUltrasoundRegions,u=["1.2.840.10008.5.1.4.1.1.1","1.2.840.10008.5.1.4.1.1.1.1","1.2.840.10008.5.1.4.1.1.1.1.1","1.2.840.10008.5.1.4.1.1.1.2","1.2.840.10008.5.1.4.1.1.1.2.1","1.2.840.10008.5.1.4.1.1.1.3","1.2.840.10008.5.1.4.1.1.1.3.1","1.2.840.10008.5.1.4.1.1.12.1","1.2.840.10008.5.1.4.1.1.12.1.1","1.2.840.10008.5.1.4.1.1.12.2","1.2.840.10008.5.1.4.1.1.12.2.1","1.2.840.10008.5.1.4.1.1.12.3"].includes(n),c="NOT_APPLICABLE";if(u&&!r)return{PixelSpacing:t,type:"UNKNOWN",isProjection:u};if(t&&r&&t===r)return{PixelSpacing:t,type:"DETECTOR",isProjection:u};if(t&&r&&t!==r)return{PixelSpacing:t,type:"CALIBRATED",isProjection:u,PixelSpacingCalibrationType:a,PixelSpacingCalibrationDescription:i};if(!t&&r){var l=r;return o?l=r.map((function(e){return e/o})):h.info("EstimatedRadiographicMagnificationFactor was not present. Unable to correct ImagerPixelSpacing."),{PixelSpacing:l,isProjection:u}}if(s&&"object"===L()(s))return{PixelSpacing:[10*s.PhysicalDeltaX,10*s.PhysicalDeltaY]};if(s&&Array.isArray(s)&&s.length>1)h.warn("Sequence of Ultrasound Regions > one entry. This is not yet implemented, all measurements will be shown in pixels.");else if(!1===u&&!r)return{PixelSpacing:t,type:c,isProjection:u};h.info("Unknown combination of PixelSpacing and ImagerPixelSpacing identified. Unable to determine spacing.")}(t).PixelSpacing;d&&(s=d[0],u=d[1]),f&&(c=f.slice(0,3),l=f.slice(3,6)),r={frameOfReferenceUID:t.FrameOfReferenceUID,rows:t.Rows,columns:t.Columns,imageOrientationPatient:f,rowCosines:c,columnCosines:l,imagePositionPatient:t.ImagePositionPatient,sliceThickness:t.SliceThickness,sliceLocation:t.SliceLocation,pixelSpacing:d,rowPixelSpacing:s,columnPixelSpacing:u};break;case Pt.IMAGE_PIXEL_MODULE:r={samplesPerPixel:t.SamplesPerPixel,photometricInterpretation:t.PhotometricInterpretation,rows:t.Rows,columns:t.Columns,bitsAllocated:t.BitsAllocated,bitsStored:t.BitsStored,highBit:t.HighBit,pixelRepresentation:t.PixelRepresentation,planarConfiguration:t.PlanarConfiguration,pixelAspectRatio:t.PixelAspectRatio,smallestPixelValue:t.SmallestPixelValue,largestPixelValue:t.LargestPixelValue,redPaletteColorLookupTableDescriptor:t.RedPaletteColorLookupTableDescriptor,greenPaletteColorLookupTableDescriptor:t.GreenPaletteColorLookupTableDescriptor,bluePaletteColorLookupTableDescriptor:t.BluePaletteColorLookupTableDescriptor,redPaletteColorLookupTableData:t.RedPaletteColorLookupTableData,greenPaletteColorLookupTableData:t.GreenPaletteColorLookupTableData,bluePaletteColorLookupTableData:t.BluePaletteColorLookupTableData};break;case Pt.VOI_LUT_MODULE:var p=t.WindowCenter,m=t.WindowWidth;r={windowCenter:Array.isArray(p)?p:[p],windowWidth:Array.isArray(m)?m:[m]};break;case Pt.MODALITY_LUT_MODULE:r={rescaleIntercept:t.RescaleIntercept,rescaleSlope:t.RescaleSlope,rescaleType:t.RescaleType};break;case Pt.SOP_COMMON_MODULE:r={sopClassUID:t.SOPClassUID,sopInstanceUID:t.SOPInstanceUID};break;case Pt.PET_ISOTOPE_MODULE:var v=t.RadiopharmaceuticalInformationSequence;if(v){var y=Array.isArray(v)?v[0]:v,g=y.RadiopharmaceuticalStartTime,b=y.RadionuclideTotalDose,I=y.RadionuclideHalfLife;r={radiopharmaceuticalInfo:{radiopharmaceuticalStartTime:ft.a.parseTM(g),radionuclideTotalDose:b,radionuclideHalfLife:I}}}break;case Pt.OVERLAY_PLANE_MODULE:for(var w=[],S=0;S<=30;S+=2){var P="60".concat(S.toString(16));3===P.length&&(P="600".concat(S.toString(16)));var D=t["".concat(P,"3000")];if(D){var E="".concat(P,"0010"),O="".concat(P,"0011"),x="".concat(P,"0040"),_="".concat(P,"0050"),k="".concat(P,"0022"),j="".concat(P,"1500"),T="".concat(P,"1301"),A="".concat(P,"1302"),R="".concat(P,"1303"),M=t[_],U={rows:t[E],columns:t[O],type:t[x],x:M[0],y:M[1],pixelData:D,description:t[k],label:t[j],roiArea:t[T],roiMean:t[A],roiStandardDeviation:t[R]};w.push(U)}}r={overlays:w};break;case Pt.PATIENT_MODULE:var N,C=t.PatientName;C&&(N=C.Alphabetic),r={patientName:N,patientId:t.PatientID};break;case Pt.GENERAL_IMAGE_MODULE:r={instanceNumber:t.InstanceNumber,lossyImageCompression:t.LossyImageCompression,lossyImageCompressionRatio:t.LossyImageCompressionRatio,lossyImageCompressionMethod:t.LossyImageCompressionMethod};break;case Pt.GENERAL_STUDY_MODULE:r={studyDescription:t.StudyDescription,studyDate:t.StudyDate,studyTime:t.StudyTime,accessionNumber:t.AccessionNumber};break;case Pt.CINE_MODULE:r={frameTime:t.FrameTime}}return r}},{key:"_getInstanceData",value:function(e,t,r){var n=this.studies.get(e);if(n){var a=n.series.get(t);if(a)return a.instances.get(r)}}},{key:"_getUIDsFromImageID",value:function(e){if(e.includes("wadors:")){var t=e.split("studies/")[1].split("/");return{StudyInstanceUID:t[0],SeriesInstanceUID:t[2],SOPInstanceUID:t[4]}}if(e.includes("wado?requestType=WADO")){var r=ct.a.parse(e);return{StudyInstanceUID:r.studyUID,SeriesInstanceUID:r.seriesUID,SOPInstanceUID:r.objectUID}}return this.imageIdToUIDs.get(e)}}]),e}()),Pt={GENERAL_SERIES_MODULE:"generalSeriesModule",PATIENT_STUDY_MODULE:"patientStudyModule",IMAGE_PLANE_MODULE:"imagePlaneModule",IMAGE_PIXEL_MODULE:"imagePixelModule",VOI_LUT_MODULE:"voiLutModule",MODALITY_LUT_MODULE:"modalityLutModule",SOP_COMMON_MODULE:"sopCommonModule",PET_ISOTOPE_MODULE:"petIsotopeModule",OVERLAY_PLANE_MODULE:"overlayPlaneModule",PATIENT_MODULE:"patientModule",GENERAL_IMAGE_MODULE:"generalImageModule",GENERAL_STUDY_MODULE:"generalStudyModule",CINE_MODULE:"cineModule"},Dt="instance",Et={},Ot={},xt=[];Ot={createAndAddStack:function(e,t,r,n){var a=r.images;if(a){var i,o=a.length,s=[];r.images.forEach((function(e,n){var a=e.getData(),u={instance:a,series:r,study:t,numImages:o,imageIndex:n+1},c=e.getData().metadata,l=c.NumberOfFrames;if(l>1)for(var f=0;f1&&void 0!==arguments[1]?arguments[1]:{};f()(this,e),this.id=e.getNewId(),this.stack=t,this.startListening(),this.statsItemsLimit=r.statsItemsLimit||2,this.stats={items:[],total:0,elapsedTime:0,speed:0},this._setProgressData=r._setProgressData,this._clearProgressById=r._clearProgressById,this._addStatsData(0),this._updateProgress()}return p()(e,[{key:"_addStatsData",value:function(e){var t=new Date,r=this.stats,n=r.items,a={value:e,date:t};for(n.push(a),r.total+=a.value;n.length>this.statsItemsLimit;){var i=n.shift();r.total-=i.value}if(n.length>1){var o=n[0];r.elapsedTime=(a.date.getTime()-o.date.getTime())/1e3,r.speed=(r.total-o.value)/r.elapsedTime}}},{key:"_getProgressId",value:function(){return"StackProgress:"+this.stack.displaySetInstanceUID}},{key:"_clearProgress",value:function(){var e=this._getProgressId();this._clearProgressById(e)}},{key:"startListening",value:function(){throw new Error("`startListening` must be implemented by child classes")}},{key:"stopListening",value:function(){throw new Error("`stopListening` must be implemented by child classes")}},{key:"destroy",value:function(){this.stopListening(),this._clearProgress()}}],[{key:"getNewId",value:function(){var e=(new Date).getTime().toString().slice(-8),t=parseInt(1e9*Math.random());return e.toString()+t.toString()}}]),e}(),At=function(e){X()(n,e);var t,r=kt(n);function n(e,t){var a;return f()(this,n),(a=r.call(this,e,t))._imageLoadProgressEventHandler=function(e){var t=e.detail,r=a._convertImageIdToDataSetUrl(t.imageId),n=t.loaded-a._lastLoaded;!a._dataSetUrl!==r&&(a._addStatsData(n),a._updateProgress(t),a._lastLoaded=t.loaded)},a._dataSetUrl=a._getDataSetUrl(e),a._lastLoaded=0,a._checkCachedData(),a}return p()(n,[{key:"_checkCachedData",value:(t=Ze()(Ye.a.mark((function e(){var t,r,n;return Ye.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,rt();case 2:t=e.sent,(r=t.wadouri.dataSetCacheManager.get(this._dataSetUrl))&&(n=r.byteArray.length,this._updateProgress({percentComplete:100,loaded:n,total:n}));case 5:case"end":return e.stop()}}),e,this)}))),function(){return t.apply(this,arguments)})},{key:"_getImageLoadProgressEventName",value:function(){return"cornerstoneimageloadprogress."+this.id}},{key:"startListening",value:function(){var e=this._getImageLoadProgressEventName();this.imageLoadProgressEventHandler=this._imageLoadProgressEventHandle.bind(this),this.stopListening(),tt.a.events.addEventListener(e,this.imageLoadProgressEventHandle)}},{key:"stopListening",value:function(){var e=this._getImageLoadProgressEventName();tt.a.events.removeEventListener(e,this.imageLoadProgressEventHandle)}},{key:"_updateProgress",value:function(e){var t=this._getProgressId(),r={multiFrame:!1,percentComplete:(e=e||{}).percentComplete,bytesLoaded:e.loaded,bytesTotal:e.total,bytesPerSecond:this.stats.speed};this._setProgressData(t,r)}},{key:"_convertImageIdToDataSetUrl",value:function(e){return e=(e=(e=e.replace(/^(dicomweb:|wadouri:)/i,"")).replace(/frame=\d+&?/i,"")).replace(/&$/,"")}},{key:"_getDataSetUrl",value:function(e){var t=e.imageIds[0];return this._convertImageIdToDataSetUrl(t)}}]),n}(Tt),Rt=function(e){X()(r,e);var t=kt(r);function r(e){var n,a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return f()(this,r),a.statsItemsLimit=20,(n=t.call(this,e,a)).imageDataMap=n._convertImageIdsArrayToMap(e.imageIds),n.framesStatus=n._createArray(e.imageIds.length,!1),n.loadedCount=0,n._checkCachedData(),n}return p()(r,[{key:"_convertImageIdsArrayToMap",value:function(e){for(var t=new Map,r=0;r=0;r--){var n=e[r];delete n.id,delete n.payload,e[r]=null}e.splice(0,t),this._invalidate()}},{key:"remove",value:function(e){var t=this.findAllEntriesBy(e),r=t.length,n=[];if(r>0){for(var a=this._elements(!0),i=r-1;i>=0;i--){var o=t[i];a.splice(o[2],1),n.push(o[0])}this._invalidate()}return n}},{key:"getElementId",value:function(e){var t=this._elementWithPayload(e);return t&&t.id}},{key:"findById",value:function(e){var t=this._elementWithId(e);return t&&t.payload}},{key:"indexOfElement",value:function(e){return this._elements().indexOf(this._elementWithPayload(e,!0))}},{key:"indexOfId",value:function(e){return this._elements().indexOf(this._elementWithId(e,!0))}},{key:"getElementByIndex",value:function(e){var t=this._elements()[e>=0?e:-1];return t&&t.payload}},{key:"find",value:function(e){var t,r=this;return Ft(e)&&(t=this._elements().find((function(t,n){return e.call(r,t.payload,t.id,n)}))),t&&t.payload}},{key:"findBy",value:function(e,t){var r;if(Nt(t)){var n=this.all(t);n.length>0&&(r=Nt(e)?n.find((function(t){return Vt(e,t)})):n[0])}else Nt(e)&&(r=this._elements().find((function(t){return Vt(e,t.payload)})))&&(r=r.payload);return r}},{key:"findAllEntriesBy",value:function(e){var t=[];return Nt(e)&&this._elements().forEach((function(r,n){Vt(e,r.payload)&&t.push([r.payload,r.id,n])})),t}},{key:"findAllBy",value:function(e,t){var r=this.findAllEntriesBy(e).map((function(e){return e[0]}));return Nt(t)&&"sort"in t&&qt(r,t.sort),r}},{key:"forEach",value:function(e){var t=this;Ft(e)&&this._elements().forEach((function(r,n){e.call(t,r.payload,r.id,n)}))}},{key:"count",value:function(){return this._elements().length}},{key:"all",value:function(e){var t=this._elements().map((function(e){return e.payload}));return Nt(e)&&"sort"in e&&qt(t,e.sort),t}}]),e}();function Nt(e){return e instanceof Object||"object"===L()(e)&&null!==e}function Ct(e){return"string"==typeof e}function Ft(e){return"function"==typeof e}function Lt(e,t){var r;if(Nt(e)&&Ct(t)){var n=t.split("."),a=n.length;if(a>0){var i=n[0],o=a>1?n.slice(1).join("."):null;r=e[i],null!==o&&(r=Lt(r,o))}}return r}function Vt(e,t){var r=!1;for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){if(e[n]!==Lt(t,n)){r=!1;break}!0!==r&&(r=!0)}return r}function qt(e,t){if(!(e instanceof Array&&function(e){var t=!0;if(e instanceof Array&&e.length>0)for(var r=e.length-1;r>=0;r--){var n=e[r];if(n instanceof Array){var a=n[0],i=n[1];if(Ct(a)&&("asc"===i||"desc"===i))continue}t=!1;break}return t}(t)))throw new Error("Invalid Arguments");var r=t.length;e.sort((function(e,n){for(var a=0;ac)return 1*s;if(++a>=r)return 0}}))}var $t=new Ut;var zt={add:function(e){$t.insert(e)},get:function(e){return $t.findBy({studyInstanceUID:e})},all:function(e){return $t.all(e)},remove:function(e){$t.remove({studyInstanceUID:e})},purge:function(){$t.removeAll()}},Gt=function(){function e(){f()(this,e)}return p()(e,[{key:"getByInstanceUID",value:function(e){throw new ce("StudyMetadataSource::getByInstanceUID is not overriden. Please, override it in a specialized class. See OHIFStudyMetadataSource for example")}},{key:"loadStudy",value:function(e){throw new ce("StudyMetadataSource::loadStudy is not overriden. Please, override it in a specialized class. See OHIFStudyMetadataSource for example")}}]),e}(),Bt=function(e){var t=e["00081115"],r=[];return t&&t.Value&&t.Value.forEach((function(e){var t=ae.getString(e["0020000E"]),n=e["0008114A"],a=[];n.Value.forEach((function(e){a.push({referencedSOPClassUID:ae.getString(e["00081150"]),referencedSOPInstanceUID:ae.getString(e["00081155"])})})),r.push({referencedSeriesInstanceUID:t,referencedInstanceSequence:a})})),r};function Ht(e,t,r){return{series:[],seriesMap:Object.create(null),seriesLoader:null,wadoUriRoot:e.wadoUriRoot,wadoRoot:e.wadoRoot,qidoRoot:e.qidoRoot,PatientName:ae.getName(t["00100010"]),PatientID:ae.getString(t["00100020"]),PatientAge:ae.getNumber(t["00101010"]),PatientSize:ae.getNumber(t["00101020"]),PatientWeight:ae.getNumber(t["00101030"]),AccessionNumber:ae.getString(t["00080050"]),StudyTime:ae.getString(t["00080030"]),StudyDate:ae.getString(t["00080020"]),FrameOfReferenceUID:ae.getString(t["00200052"]),ReferencedSeriesSequence:Bt(t),modalities:ae.getString(t["00080061"]),StudyDescription:ae.getString(t["00081030"]),NumberOfStudyRelatedInstances:ae.getString(t["00201208"]),StudyInstanceUID:r||ae.getString(t["0020000D"]),InstitutionName:ae.getString(t["00080080"])}}function Wt(e,t,r,n){var a=[];a.push("requestType=WADO"),a.push("studyUID=".concat(t)),a.push("seriesUID=".concat(r)),a.push("objectUID=".concat(n)),a.push("contentType=application/dicom"),a.push("transferSyntax=*");var i=a.join("&");return"".concat(e.wadoUriRoot,"?").concat(i)}function Qt(e,t,r,n){return"".concat(e.wadoRoot,"/studies/").concat(t,"/series/").concat(r,"/instances/").concat(n)}function Kt(e,t,r,n,a){var i=Qt(e,t,r,n);return a=null!=a||1,"".concat(i,"/frames/").concat(a)}function Jt(e,t,r){return Yt.apply(this,arguments)}function Yt(){return(Yt=Ze()(Ye.a.mark((function e(t,r,n){var a,i,o,s,u,c,l,f,d,p,h,m,v,y,g;return Ye.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,St.addInstance(n,{server:t,StudyInstanceUID:r.StudyInstanceUID});case 2:if(a=e.sent,i=a.StudyInstanceUID,o=a.SeriesInstanceUID,s=a.SOPInstanceUID,(u=r.seriesMap[o])||(u={SeriesInstanceUID:o,SeriesDescription:a.SeriesDescription,Modality:a.Modality,SeriesNumber:a.SeriesNumber,SeriesDate:a.SeriesDate,SeriesTime:a.SeriesTime,instances:[]},r.seriesMap[o]=u,r.series.push(u)),c=Wt(t,i,o,s),l=Qt(t,i,o,s),f=Kt(t,i,o,s),d={metadata:a,baseWadoRsUri:l,wadouri:c,wadorsuri:f,wadoRoot:t.wadoRoot,imageRendering:t.imageRendering,thumbnailRendering:t.thumbnailRendering},u.instances.push(d),"wadors"!==d.thumbnailRendering&&"wadors"!==d.imageRendering){e.next=18;break}return p=Object.assign(n),e.next=15,rt();case 15:if(h=e.sent,m=d.metadata.NumberOfFrames)for(v=0;v0)){e.next=6;break}return a=r[0],i=Ht(t,a,n),e.next=5,Xt(t,i,r);case 5:return e.abrupt("return",i);case 6:throw new Error("Failed to create study out of provided SOP instance list");case 7:case"end":return e.stop()}}),e)})));return function(t,r,n){return e.apply(this,arguments)}}();function tr(e){if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(e=function(e,t){if(!e)return;if("string"==typeof e)return rr(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(r);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return rr(e,t)}(e))){var t=0,r=function(){};return{s:r,n:function(){return t>=e.length?{done:!0}:{done:!1,value:e[t++]}},e:function(e){throw e},f:r}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var n,a,i=!0,o=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return i=e.done,e},e:function(e){o=!0,a=e},f:function(){try{i||null==n.return||n.return()}finally{if(o)throw a}}}}function rr(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r2&&void 0!==arguments[2]?arguments[2]:{};f()(this,e),this.server=t,this.studyInstanceUID=r,this.filters=n}var t,r,n,a,i,o;return p()(e,[{key:"execLoad",value:(o=Ze()(Ye.a.mark((function e(){var t,r,n;return Ye.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,this.configLoad();case 2:return e.next=4,this.preLoad();case 4:return t=e.sent,e.next=7,this.load(t);case 7:return r=e.sent,e.next=10,this.posLoad(r);case 10:return n=e.sent,e.abrupt("return",n);case 12:case"end":return e.stop()}}),e,this)}))),function(){return o.apply(this,arguments)})},{key:"runLoaders",value:(i=Ze()(Ye.a.mark((function e(t){var r,n,a,i;return Ye.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n=tr(t),e.prev=1,n.s();case 3:if((a=n.n()).done){e.next=12;break}return i=a.value,e.next=7,i();case 7:if(!(r=e.sent)||!r.length){e.next=10;break}return e.abrupt("break",12);case 10:e.next=3;break;case 12:e.next=17;break;case 14:e.prev=14,e.t0=e.catch(1),n.e(e.t0);case 17:return e.prev=17,n.f(),e.finish(17);case 20:if(!t.next().done||r){e.next=22;break}throw new Error("RetrieveMetadataLoader failed");case 22:return e.abrupt("return",r);case 23:case"end":return e.stop()}}),e,null,[[1,14,17,20]])}))),function(e){return i.apply(this,arguments)})},{key:"configLoad",value:(a=Ze()(Ye.a.mark((function e(){return Ye.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:case"end":return e.stop()}}),e)}))),function(){return a.apply(this,arguments)})},{key:"preLoad",value:(n=Ze()(Ye.a.mark((function e(){return Ye.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:case"end":return e.stop()}}),e)}))),function(){return n.apply(this,arguments)})},{key:"load",value:(r=Ze()(Ye.a.mark((function e(t){return Ye.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:case"end":return e.stop()}}),e)}))),function(e){return r.apply(this,arguments)})},{key:"posLoad",value:(t=Ze()(Ye.a.mark((function e(t){return Ye.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:case"end":return e.stop()}}),e)}))),function(e){return t.apply(this,arguments)})}]),e}();function ar(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}var ir=function(e){X()(i,e);var t,r,n,a=(t=i,function(){var e,r=re()(t);if(ar()){var n=re()(this).constructor;e=Reflect.construct(r,arguments,n)}else e=r.apply(this,arguments);return ee()(this,e)});function i(){return f()(this,i),a.apply(this,arguments)}return p()(i,[{key:"getOptions",value:function(){var e={studyInstanceUID:this.studyInstanceUID},t=this.filters.seriesInstanceUID;return t&&(e.seriesInstanceUID=t),e}},{key:"getLoaders",value:Ye.a.mark((function e(){var t,r,n,a,i;return Ye.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=[],r=this.studyInstanceUID,n=this.filters,a=(n=void 0===n?{}:n).seriesInstanceUID,i=this.client,a&&t.push(i.retrieveSeriesMetadata.bind(i,{studyInstanceUID:r,seriesInstanceUID:a})),t.push(i.retrieveStudyMetadata.bind(i,{studyInstanceUID:r})),e.delegateYield(t,"t0",7);case 7:case"end":return e.stop()}}),e,this)}))},{key:"configLoad",value:function(){var e=this.server,t=new Re.DICOMwebClient({url:e.wadoRoot,headers:ae.getAuthorizationHeader(e)});this.client=t}},{key:"load",value:(n=Ze()(Ye.a.mark((function e(t){var r,n;return Ye.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=this.getLoaders(),n=this.runLoaders(r),e.abrupt("return",n);case 3:case"end":return e.stop()}}),e,this)}))),function(e){return n.apply(this,arguments)})},{key:"posLoad",value:(r=Ze()(Ye.a.mark((function e(t){var r,n;return Ye.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=this.server,n=this.studyInstanceUID,e.abrupt("return",er(r,t,n));case 2:case"end":return e.stop()}}),e,this)}))),function(e){return r.apply(this,arguments)})}]),i}(nr),or=Symbol("INFO");function sr(e){var t=e[or];if(!t){var r=ae.getString(e["00080060"],"").toUpperCase();t=Object.freeze({Modality:r,isLowPriority:Le(r),SeriesInstanceUID:ae.getString(e["0020000E"]),SeriesNumber:ae.getNumber(e["00200011"],0)||0}),e[or]=t}return t}var ur={default:function(e,t){return e.SeriesNumber-t.SeriesNumber},seriesInfoSortingCriteria:function(e,t){var r=sr(e),n=sr(t);return!r.isLowPriority&&n.isLowPriority?-1:r.isLowPriority&&!n.isLowPriority?1:r.SeriesNumber-n.SeriesNumber}},cr={default:function(e,t){return e.InstanceNumber-t.InstanceNumber}},lr=ur,fr=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:ur.default;return e.sort(t)},dr=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:cr.default;return e.sort(t)};function pr(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}var hr=st.a.data.DicomMetaDictionary.naturalizeDataset;function mr(e,t,r){t.seriesLoader=Object.freeze({hasNext:function(){return r.hasNext()},next:function(){return Ze()(Ye.a.mark((function n(){var a;return Ye.a.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return n.next=2,r.next();case 2:return a=n.sent,n.next=5,Xt(e,t,a.sopInstances,t.StudyInstanceUID);case 5:return n.abrupt("return",t.seriesMap[a.seriesInstanceUID]);case 6:case"end":return n.stop()}}),n)})))()}})}function vr(e,t,r){return Object.freeze({hasNext:function(){return r.length>0},next:function(){return Ze()(Ye.a.mark((function n(){var a,i;return Ye.a.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return a=r.shift(),n.next=3,e.retrieveSeriesMetadata({studyInstanceUID:t,seriesInstanceUID:a});case 3:return i=n.sent,n.abrupt("return",{studyInstanceUID:t,seriesInstanceUID:a,sopInstances:i});case 5:case"end":return n.stop()}}),n)})))()}})}var yr=function(e){X()(o,e);var t,r,n,a,i=(t=o,function(){var e,r=re()(t);if(pr()){var n=re()(this).constructor;e=Reflect.construct(r,arguments,n)}else e=r.apply(this,arguments);return ee()(this,e)});function o(){return f()(this,o),i.apply(this,arguments)}return p()(o,[{key:"configLoad",value:function(){var e=this.server,t=new Re.DICOMwebClient({url:e.qidoRoot,headers:ae.getAuthorizationHeader(e),errorInterceptor:Ve.getHTTPErrorHandler()});this.client=t}},{key:"getPreLoaders",value:Ye.a.mark((function e(){var t,r,n,a,i,o;return Ye.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=[],r=this.studyInstanceUID,n=this.filters,a=(n=void 0===n?{}:n).seriesInstanceUID,i=this.client,a&&(o={studyInstanceUID:r,queryParams:{SeriesInstanceUID:a}},t.push(i.searchForSeries.bind(i,o))),t.push(i.searchForSeries.bind(i,{studyInstanceUID:r})),e.delegateYield(t,"t0",7);case 7:case"end":return e.stop()}}),e,this)}))},{key:"preLoad",value:(a=Ze()(Ye.a.mark((function e(){var t,r,n,a;return Ye.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.getPreLoaders(),e.next=3,this.runLoaders(t);case 3:return r=e.sent,n=fr(r,lr.seriesInfoSortingCriteria),a=n.map((function(e){return sr(e).SeriesInstanceUID})),e.abrupt("return",{seriesInstanceUIDsMap:a,seriesData:r});case 7:case"end":return e.stop()}}),e,this)}))),function(){return a.apply(this,arguments)})},{key:"load",value:(n=Ze()(Ye.a.mark((function e(t){var r,n,a,i;return Ye.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=this.client,n=this.studyInstanceUID,a=vr(r,n,t.seriesInstanceUIDsMap),e.next=4,a.next();case 4:return i=e.sent,e.abrupt("return",{sopInstances:i.sopInstances,asyncLoader:a,seriesData:t.seriesData});case 6:case"end":return e.stop()}}),e,this)}))),function(e){return n.apply(this,arguments)})},{key:"posLoad",value:(r=Ze()(Ye.a.mark((function e(t){var r,n,a,i,o,s;return Ye.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=this.server,n=this.studyInstanceUID,a=t.sopInstances,i=t.asyncLoader,o=t.seriesData,e.next=4,er(r,a,n);case 4:return s=e.sent,o.map(hr).forEach((function(e,t){var r={SeriesInstanceUID:e.SeriesInstanceUID,SeriesDescription:e.SeriesDescription,SeriesNumber:e.SeriesNumber,Modality:e.Modality,instances:[]};s.series[t]?s.series[t]=Object.assign(r,s.series[t]):s.series[t]=r,s.seriesMap[e.SeriesInstanceUID]=s.series[t]})),i.hasNext()&&mr(r,s,i),e.abrupt("return",s);case 9:case"end":return e.stop()}}),e,this)}))),function(e){return r.apply(this,arguments)})}]),o}(nr);function gr(){return(gr=Ze()(Ye.a.mark((function e(t,r){var n,a,i,o,s=arguments;return Ye.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=s.length>2&&void 0!==s[2]?s[2]:{},a=!1!==t.enableStudyLazyLoad?yr:ir,i=new a(t,r,n),o=i.execLoad(),e.abrupt("return",o);case 5:case"end":return e.stop()}}),e)})))).apply(this,arguments)}var br=function(e,t){return gr.apply(this,arguments)},Ir=new Map;function wr(e,t,r){if(!e)throw new Error("".concat("RetrieveStudyMetadata",": Required 'server' parameter not provided."));if(!t)throw new Error("".concat("RetrieveStudyMetadata",": Required 'StudyInstanceUID' parameter not provided."));if(Ir.has(t))return Ir.get(t);var n=new Promise((function(n,a){br(e,t,r).then((function(e){n(e)}),a)}));return Ir.set(t,n),n}function Sr(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}var Pr=function(e){X()(n,e);var t,r=(t=n,function(){var e,r=re()(t);if(Sr()){var n=re()(this).constructor;e=Reflect.construct(r,arguments,n)}else e=r.apply(this,arguments);return ee()(this,e)});function n(){return f()(this,n),r.apply(this,arguments)}return p()(n,[{key:"getByInstanceUID",value:function(e,t){return wr(e,t)}},{key:"loadStudy",value:function(e){var t=this;if(!(e instanceof ze))throw new ce("OHIFStudyMetadataSource::loadStudy study is not an instance of StudyMetadata");return new Promise((function(r,a){var i=e.getStudyInstanceUID();if(e instanceof ze)return OHIF.viewer.Studies.findBy({StudyInstanceUID:i})||n._updateStudyCollections(e),void r(e);t.getByInstanceUID(i).then((function(e){var t=new ze(e,e.StudyInstanceUID),a=t.createDisplaySets();t.setDisplaySets(a),n._updateStudyCollections(t),r(t)})).catch(a)}))}}],[{key:"_updateStudyCollections",value:function(e){var t=e.getData();t.selected=!0,t.displaySets=e.getDisplaySets(),zt.add(e)}}]),n}(Gt),Dr=r(18),Er=r.n(Dr),Or={OHIFStudyMetadataSource:Pr,MetadataProvider:St,CommandsManager:V,HotkeysManager:Q,ImageSet:de,StudyPrefetcher:function(){function e(t){f()(this,e),this.studies=t||[],this.prefetchDisplaySetsTimeout=300,this.lastActiveViewportElement=null,tt.a.events.addEventListener("cornerstoneimagecachefull.StudyPrefetcher",this.cacheFullHandler.bind(this))}return p()(e,[{key:"destroy",value:function(){this.stopPrefetching(),tt.a.events.removeEventListener("cornerstoneimagecachefull.StudyPrefetcher",this.cacheFullHandler.bind(this))}},{key:"setStudies",value:function(e){this.stopPrefetching(),this.studies=e}},{key:"prefetch",value:function(){this.studies&&this.studies.length&&(this.stopPrefetching(),this.prefetchDisplaySets())}},{key:"stopPrefetching",value:function(){Er.a.requestPoolManager.clearRequestStack("prefetch")}},{key:"prefetchDisplaySetsAsync",value:function(e){var t=this;e=e||this.prefetchDisplaySetsTimeout,clearTimeout(this.prefetchDisplaySetsHandler),this.prefetchDisplaySetsHandler=setTimeout((function(){t.prefetchDisplaySets()}),e)}},{key:"prefetchDisplaySets",value:function(){var e=this.getDisplaySetsToPrefetch({order:"closest",displaySetCount:1}),t=this.getImageIdsFromDisplaySets(e);this.prefetchImageIds(t)}},{key:"prefetchImageIds",value:function(e){var t=this.filterCachedImageIds(e),r=Er.a.requestPoolManager,n=function(){};t.forEach((function(e){r.addRequest({},e,"prefetch",!1,n,n)})),r.startGrabbing()}},{key:"getInstance",value:function(e,t){var r=tt.a.metaData.get("instance",t.imageId);return e.getInstanceByUID(r.SOPInstanceUID)}},{key:"getActiveDisplaySet",value:function(e,t){return e.find((function(e){return e.images.some((function(e){return e.SOPInstanceUID===t.SOPInstanceUID}))}))}},{key:"getDisplaySetsToPrefetch",value:function(e){var t=this.getActiveViewportImage();if(!t||!e||!e.displaySetCount)return[];var r=this.getStudy(t).displaySets,n=e.order,a=this[{topdown:"getFirstDisplaySets",downward:"getNextDisplaySets",closest:"getClosestDisplaySets"}[n]];return a?a.call(this,r,null,e.displaySetCount):(n&&h.warn("Invalid prefetch order configuration (".concat(n,")")),[])}},{key:"getFirstDisplaySets",value:function(e,t,r){for(var n=e.length,a=[],i=0;i=0||s=0&&(i.push(e[o]),r--,o--),s1)for(var n=0;n1&&void 0!==arguments[1])||arguments[1],r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:ur.default,n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:cr.default;if(!e||!e.series)throw new Error("Insufficient study data was provided to sortStudy");return fr(e.series,r),t&&e.series.forEach((function(e){dr(e.instances,n)})),e}},Ur=function(e){var t="/";if(!e)return t;var r=window.location.origin,n=r.split("/");if(n.length>4){var a=r.indexOf(n[3]);t+=r.substring(a)+e}else t+=e;return t.replace(/\/\/+/g,"/")},Nr=function(e,t){if(!e||!t)throw new Error("The servers and store must be defined");Object.keys(e).forEach((function(r){e[r].forEach((function(e){var n=Object.assign({},e);n.type=r,t.dispatch({type:"ADD_SERVER",server:n})}))}))},Cr=function(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:512,n=atob(e),a=[],i=0;i1&&void 0!==arguments[1]?arguments[1]:ae.getAuthorizationHeader();return fetch(e,t).then((function(e){return e.arrayBuffer()}))},Qr=function(e){return tt.a.loadAndCacheImage(e).then((function(e){return e&&e.data&&e.data.byteArray.buffer}))},Kr=function(e,t,r,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:ae.getAuthorizationHeader(),i={url:e,headers:a},o=new Re.DICOMwebClient(i);return o.retrieveInstance({studyInstanceUID:t,seriesInstanceUID:r,sopInstanceUID:n})},Jr=new(function(){function e(){f()(this,e)}var t,r;return p()(e,[{key:"getLocalData",value:(r=Ze()(Ye.a.mark((function e(t,r){var n,a,i;return Ye.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!t||!t.localFile){e.next=9;break}if(n=Br(t),a=Hr(n),Gr(a)&&(a=zr(r,t.displaySetInstanceUID)),Gr(a)){e.next=9;break}return e.next=7,rt();case 7:return i=e.sent,e.abrupt("return",i.wadouri.loadFileRequest(a));case 9:case"end":return e.stop()}}),e)}))),function(e,t){return r.apply(this,arguments)})},{key:"getDataByImageType",value:function(e){var t=Br(e);if(t){var r=Hr(t),n=Wr;switch(function(e){var t=/^\w+:/,r=t.exec(e);return 0===t.lastIndex&&r&&r[0]&&r[0].replace(":","")||""}(r)){case"dicomfile":n=Qr.bind(this,r);break;case"wadors":var a=t.getData().wadoRoot,i=t.getStudyInstanceUID(),o=t.getSeriesInstanceUID(),s=t.getSOPInstanceUID();if(Gr([a,i,o,s]))return;n=Kr.bind(this,a,i,o,s);break;case"wadouri":if(r=r.substring(r.indexOf(":")+1),Gr(r))return;n=Wr.bind(this,r)}return n()}}},{key:"getDataByDatasetType",value:function(e){var t=e.StudyInstanceUID,r=e.SeriesInstanceUID,n=e.SOPInstanceUID,a=e.authorizationHeaders,i=e.wadoRoot,o=e.wadoUri;return Gr(i)?Gr(o)?void 0:Wr(o,{headers:a}):Kr(i,t,r,n,a)}},{key:"getLoaderIterator",value:function(e,t){var r=this;return qr()(Ye.a.mark((function n(){return Ye.a.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return n.next=2,r.getLocalData(e,t);case 2:return n.next=4,r.getDataByImageType(e);case 4:return n.next=6,r.getDataByDatasetType(e);case 6:case"end":return n.stop()}}),n)})))()}},{key:"findDicomDataPromise",value:(t=Ze()(Ye.a.mark((function e(t,r){var n,a,i,o,s,u,c,l;return Ye.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n=this.getLoaderIterator(t,r),a=!0,i=!1,e.prev=3,s=Lr()(n);case 5:return e.next=7,s.next();case 7:return u=e.sent,a=u.done,e.next=11,u.value;case 11:if(c=e.sent,a){e.next=19;break}if(!(l=c)){e.next=16;break}return e.abrupt("return",l);case 16:a=!0,e.next=5;break;case 19:e.next=25;break;case 21:e.prev=21,e.t0=e.catch(3),i=!0,o=e.t0;case 25:if(e.prev=25,e.prev=26,a||null==s.return){e.next=30;break}return e.next=30,s.return();case 30:if(e.prev=30,!i){e.next=33;break}throw o;case 33:return e.finish(30);case 34:return e.finish(25);case 35:throw new Error("Invalid dicom data loader");case 36:case"end":return e.stop()}}),e,this,[[3,21,25,35],[26,,30,34]])}))),function(e,r){return t.apply(this,arguments)})}]),e}()),Yr=function(e,t){var r=e.StudyInstanceUID,n=e.SeriesInstanceUID,a=zt.get(r);if(a){var i=a.getDerivedDatasets({referencedSeriesInstanceUID:n});if(i.length){var o={};i.forEach((function(e){var t=e.Modality;void 0===o[t]&&(o[t]=[]),o[t].push(e)})),Object.keys(o).forEach((function(r){var n=o[r];if(!n.some((function(e){return e.isLoaded}))){var a,i=0;n.forEach((function(e){var t=Number("".concat(e.SeriesDate).concat(e.SeriesTime));t>i&&(i=t,a=e)})),a.load(e,t)}}))}}};function Xr(){var e=[].slice.call(arguments),t=e.length;return function(r,n){var a,i,o,s,u,c,l;for(l=0;li&&(c=1*u),0===c);l++);return c}}function Zr(e){return e[0].toLowerCase()+e.slice(1)}var en=function(e){return e?ct.a.parse(e):{}},tn={getQueryFilters:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.search;if(t){var r=en(t),n={};return Object.entries(r).forEach((function(e){var t=c()(e,2),r=t[0],a=t[1];n[Zr(r)]=a})),n}}},rn={isValidPath:function(e){var t="/".concat(":");return e.indexOf(t)<0},parseParam:function(e){var t=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";try{var t=window.atob(e);return t}catch(t){return e}}(e);if(t&&"string"==typeof t)return t.split(";")},replaceParam:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1?arguments[1]:void 0,r=arguments.length>2?arguments[2]:void 0,n="".concat(":").concat(t);return r?e.replace(n,r):e}};function nn(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}var an=function(e){var t=e.instances,r=e.Modality;if(!t||!t.length)return[e];switch(r){case"MR":return on(e);default:return[e]}},on=function(e){var t,r,n,a,i=sn(e.instances,(n=e.instances[0],a=n.metadata,t=a.Manufacturer||a["00080070"]||"",r=t.toLowerCase(),r.indexOf("siemens")>-1?{MR:["ImageType","SequenceName","0019100C","EchoTime","RepetitionTime"]}:r.indexOf("philips")>-1?{MR:["ImageType","20011020","20011003","EchoTime","RepetitionTime"]}:{MR:["ImageType","SequenceName","DiffusionBValue","EchoTime","RepetitionTime"]}).MR);delete e.instance;var o,s=0,u=!1;return i.length>1&&(u=!0,o=" - Subseries "),i.map((function(t){return s++,function(e){for(var t=1;t0&&e.isValidObject(t)){for(var s=0,u=i-1,c=t;s0&&e.isValidObject(t)){for(var o=0,s=i-1,u=t;o1&&void 0!==arguments[1]?arguments[1]:{};if(f()(this,e),e.Instance)return e.Instance.initialize(t,r),e.Instance;this.initialize(t,r),e.Instance=this}return p()(e,null,[{key:"setConfiguration",value:function(e){Object.assign(Rn,e)}},{key:"getConfiguration",value:function(){return Rn}}]),p()(e,[{key:"initialize",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.currentTimepointId=e,this.comparisonTimepointKey=t.comparisonTimepointKey||"baseline",this.options=t,this.timepoints=[]}},{key:"onTimepointsUpdated",value:function(){"function"==typeof this.options.onTimepointsUpdated?this.options.onTimepointsUpdated(Object.assign([],this.timepoints)):h.warn("Timepoints update callback is not defined")}},{key:"calculateVisitNumber",value:function(e){var t=this.timepoints.sort((function(e,t){return e.visitDate>t.visitDate?1:-1})).find((function(t){return t.PatientID===e.PatientID&&t.timepointType===e.timepointType})).map((function(e){return e.timepointId})).indexOf(e.timepointId)+1;if(!t)throw new Error("Current timepoint was not in the list of relevant timepoints?");return t}},{key:"retrieveTimepoints",value:function(e){var t=this,r=Rn.dataExchange.retrieve;if("function"==typeof r)return new Promise((function(n,a){r(e).then((function(e){h.info("Timepoint data retrieval"),e.forEach((function(e){var r=t.timepoints.findIndex((function(t){return t.timepointId===e.timepointId}));r<0?t.timepoints.push(e):t.timepoints[r]=e})),t.onTimepointsUpdated(),n()})).catch((function(e){h.error("Timepoint retrieval function failed: ".concat(e)),a(e)}))}));h.error("Timepoint retrieval function has not been configured.")}},{key:"storeTimepoints",value:function(){var e=Rn.dataExchange.store;if("function"==typeof e)return h.info("Preparing to store timepoints"),h.info(JSON.stringify(this.timepoints,null,2)),e(this.timepoints);h.error("Timepoint store function has not been configured.")}},{key:"disassociateStudy",value:function(e,t){var r=this,n=Rn.dataExchange.disassociate;"function"==typeof n?n(e,t).then((function(){h.info("Disassociation completed"),r.timepoints=[],r.retrieveTimepoints({})})):h.error("Study disassociate function has not been configured.")}},{key:"removeTimepoint",value:function(e){var t=this,r=Rn.dataExchange.remove;if("function"==typeof r){var n={timepointId:e};h.info("Preparing to remove timepoint"),h.info(JSON.stringify(n,null,2)),r(n).then((function(){h.info("Timepoint removal completed");var r=t.timepoints.findIndex((function(t){return t.timepointId===e}));r>-1&&t.timepoints.splice(r,1),t.onTimepointsUpdated()}))}else h.error("Timepoint remove function has not been configured.")}},{key:"updateTimepoint",value:function(e,t){var r=this,n=Rn.dataExchange.update;if("function"==typeof n){var a={timepointId:e};h.info("Preparing to update timepoint"),h.info(JSON.stringify(a,null,2)),h.info(JSON.stringify(t,null,2)),n(a,t).then((function(){h.info("Timepoint updated completed");var n=r.timepoints.findIndex((function(t){return t.timepointId===e}));n>-1&&(r.timepoints[n]=An({},r.timepoints[n],{},t)),r.onTimepointsUpdated()}))}else h.error("Timepoint update function has not been configured.")}},{key:"all",value:function(e){return(e?this.timepoints.filter(e):this.timepoints).sort((function(e,t){return e.visitDate0&&void 0!==arguments[0]?arguments[0]:this.comparisonTimepointKey,t=this.current(),r=this.comparison(e),n=[t];return r&&!n.find((function(e){return e.timepointId===r.timepointId}))&&n.push(r),n}},{key:"isRebaseline",value:function(e){var t=e?this.timepoints.find((function(t){return t.timepointId===e})):this.current();return!!t&&this.timepoints.filter((function(e){return"baseline"===e.timepointType&&e.visitDate<=t.visitDate})).length>1}},{key:"nextBaselineAfterCurrent",value:function(){var e=this.current();return this.timepoints.sort((function(e,t){return e.visitDate>t.visitDate?1:-1})).find((function(t){return t.visitDate>e.visitDate&&"baseline"===t.timepointType}))}},{key:"setCurrentTimepointId",value:function(e){this.currentTimepointId=e}},{key:"setUserComparison",value:function(e){this.userComparison=e}},{key:"comparison",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.comparisonTimepointKey;if(this.userComparison)return this.userComparison;var t=this.current();if(t){if("prebaseline"===t.timepointType){var r=this.nextBaselineAfterCurrent();if(r)return r}if("baseline"===t.timepointType){var n=this.prior();if(n)return n}var a=this[e]();if(!a||a.timepointId!==t.timepointId)return a}}},{key:"latestInitialTimepointAfterCurrent",value:function(){var e=this.current();if("followup"!==e.timepointType){var t=this.timepoints.sort((function(e,t){return e.visitDate>t.visitDate?1:-1})).filter((function(t){return t.visitDate>e.visitDate})),r=t.findIndex((function(e){return"followup"===e.timepointType}))-1;return r<0?t[t.length-1]:t[r]}}},{key:"initialTimepointIds",value:function(){var e=this.current();"prebaseline"!==e.timepointType&&"baseline"!==e.timepointType||(e=this.latestInitialTimepointAfterCurrent()||e);var t=e.visitDate,r=(this.timepoints.filter((function(e){return"prebaseline"===e.timepointType&&e.visitDate<=t}))||[]).map((function(e){return e.timepointId})),n=(this.timepoints.filter((function(e){return"baseline"===e.timepointType&&e.visitDate<=t}))||[]).map((function(e){return e.timepointId}));return r.concat(n)}},{key:"baseline",value:function(){var e=this.current().visitDate;return this.all().find((function(t){return"baseline"===t.timepointType&&t.visitDate<=e}))}},{key:"nadir",value:function(){var e=this.current(),t=this.all().find((function(t){return t.timepointId!==e.timepointId&&"nadir"===t.timepointKey&&t.visitDate<=e.visitDate}));return t||this.baseline()}},{key:"key",value:function(){var e=[this.current()],t=this.prior(),r=this.nadir(),n=this.baseline(),a=function(t){return!!e.find((function(e){return e.timepointId===t.timepointId}))};return t&&!1===a(t)&&e.push(t),r&&!1===a(r)&&e.push(r),n&&!1===a(n)&&e.push(n),e}},{key:"study",value:function(e){return this.all().filter((function(t){return t.studyInstanceUIDs.includes(e)}))}},{key:"name",value:function(e){var t=Mn[e.timepointType];if("baseline"===e.timepointType)return"Baseline";if(e.visitNumber)return"".concat(t," ").concat(e.visitNumber);var r=this.calculateVisitNumber(e);return"".concat(t," ").concat(r)}},{key:"title",value:function(e){for(var t=this.name(e),r=this.all(),n=-1,a=null,i=0;i1&&void 0!==arguments[1]&&arguments[1],r=e.split("_"),n=c()(r,4),a=n[0],i=n[1],o=n[2],s=n[3],u=zt.get(a),l=u.getSeriesByUID(i),f=l.getInstanceByUID(o);return f.getImageId(s,t)};function Ln(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function Vn(e){for(var t=1;t1&&void 0!==arguments[1]?arguments[1]:{};if(f()(this,e),this.temporaryDeletedMeasurement={},this.getTemporaryDeletedMeasurements=function(e){return r.temporaryDeletedMeasurement[e]||[]},this.addTemporaryDeletedMeasurements=function(e){var t=e.StudyInstanceUID,n=r.getTemporaryDeletedMeasurements(t);0!==n.length&&-1!==n.findIndex((function(t){return t.id===e.id}))||(h.info("add measurement to temporary deleted list",e),n.push(e),r.temporaryDeletedMeasurement[t]=n)},this.clearTemporaryDeletedMeasurement=function(e){delete r.temporaryDeletedMeasurement[e]},e.Instance)return e.Instance.initialize(t,n),e.Instance;this.initialize(t,n),e.Instance=this}return p()(e,null,[{key:"setConfiguration",value:function(e){Object.assign(qn,e)}},{key:"getConfiguration",value:function(){return qn}},{key:"getToolsGroupsMap",value:function(){var e={};return qn.measurementTools.forEach((function(t){t.childTools.forEach((function(r){return e[r.id]=t.id}))})),e}},{key:"getToolGroupTools",value:function(e){var t={};return Object.keys(e).forEach((function(r){var n=e[r];t[n]||(t[n]=[]),t[n].push(r)})),t}},{key:"getToolConfiguration",value:function(t){var r,n=e.getConfiguration(),a=e.getToolsGroupsMap()[t],i=n.measurementTools.find((function(e){return e.id===a}));return i&&(r=i.childTools.find((function(e){return e.id===t}))),{toolGroupId:a,toolGroup:i,tool:r}}},{key:"syncMeasurementAndToolData",value:function(t){h.info("syncMeasurementAndToolData",t);var r=Nn(t);r&&(t.labels=[r]);var n=Er.a.globalImageIdSpecificToolStateManager.saveToolState(),a=t.StudyInstanceUID;if(zt.get(a)){var i=t.toolType,o=e.getToolConfiguration(i).tool;if(Array.isArray(o.childTools))o.childTools.forEach((function(r){var n=t[r];n&&(n._id=t._id,n.measurementNumber=t.measurementNumber,n.lesionNamingNumber=t.lesionNamingNumber,e.syncMeasurementAndToolData(n))}));else{var s=Fn(t.imagePath);n[s]||(n[s]={});var u=n[s][i],c=u&&u.data;if(c&&c.length){var l=n[s][i].data,f=!1;if(l.forEach((function(e){if(e._id===t._id)return f=!0,Object.assign(e,t),!1})),!0===f)return}else n[s][i]={data:[]};n[s][i].data.push(t),Er.a.globalImageIdSpecificToolStateManager.restoreToolState(n)}}}},{key:"isToolIncluded",value:function(e){return e.options&&e.options.caseProgress&&e.options.caseProgress.include}}]),p()(e,[{key:"initialize",value:function(t){var r=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.timepointApi=t,this.options=n,this.toolGroups={},this.tools={},this.toolsGroupsMap=e.getToolsGroupsMap(),this.toolGroupTools=e.getToolGroupTools(this.toolsGroupsMap),qn.measurementTools.forEach((function(e){r.toolGroups[e.id]=[],e.childTools.forEach((function(e){r.tools[e.id]=[]}))}))}},{key:"onMeasurementsUpdated",value:function(){"function"==typeof this.options.onMeasurementsUpdated?this.options.onMeasurementsUpdated(Vn({},this.tools)):h.warn("Measurements update callback is not defined")}},{key:"processMeasurementData",value:function(e){var t=this;e&&(h.info("Measurement data retrieval"),h.info(e),Object.keys(e).forEach((function(r){e[r].forEach((function(e){var r=e.toolType;t.addMeasurement(r,e)}))}))),this.syncMeasurementsAndToolData();try{tt.a.getEnabledElements().forEach((function(e){tt.a.updateImage(e.element)}))}catch(e){h.error(e)}this.onMeasurementsUpdated()}},{key:"retrieveMeasurements",value:function(e){var t=this,r=qn.dataExchange.retrieve,n=qn.server;if("function"==typeof r)return new Promise((function(a,i){r(n,e).then((function(e){t.processMeasurementData(e),a()}),i)}));h.error("Measurement retrieval function has not been configured.")}},{key:"storeMeasurements",value:function(t,r){var n=this,a=qn.server,i=qn.dataExchange.store;if("function"==typeof i){var o={};qn.measurementTools.forEach((function(t){e.isToolIncluded(t)&&t.childTools.forEach((function(r){e.isToolIncluded(r)&&(o[t.id]||(o[t.id]=[]),o[t.id]=o[t.id].concat(n.tools[r.id]))}))}));var s=t?function(e){return e.timepointId===t}:null,u=this.timepointApi.all(s),c=u.map((function(e){return e.timepointId})),l={PatientID:u[0].PatientID,timepointIds:c};return h.info("Saving Measurements for timepoints:",u),i(o,l,a,r).then((function(e){return h.info("Measurement storage completed",e),n.processMeasurementData(e),e}))}h.error("Measurement store function has not been configured.")}},{key:"calculateLesionNamingNumber",value:function(e){var t,r=e.sort((function(e,t){return e.lesionNamingNumber>t.lesionNamingNumber?1:e.lesionNamingNumber=e.measurementNumber};qn.measurementTools.filter((function(e){return"temp"!==e.id})).forEach((function(e){r.updateNumbering(r.toolGroups[e.id],n,"measurementNumber",t),e.childTools.forEach((function(e){r.updateNumbering(r.tools[e.id],n,"measurementNumber",t)}))}))}},{key:"addMeasurement",value:function(e,t){var r,n=this.toolsGroupsMap[e],a=this.toolGroups[n],i=this.tools[e],o=i.find((function(e){return e.lesionNamingNumber===t.lesionNamingNumber&&e.toolType===t.toolType}));if(o&&o.location&&(t.location=o.location),o&&o.description&&(t.description=o.description),t._id||(t._id=k()),t.StudyInstanceUID)r=this.timepointApi.study(t.StudyInstanceUID)[0];else{var s=t.timepointId;r=this.timepointApi.timepoints.find((function(e){return e.timepointId===s}))}if(r){var u=a.find((function(e){return e.toolItemId===t._id&&e.timepointId===r.timepointId}));if(t.timepointId=r.timepointId,u)t.lesionNamingNumber=u.lesionNamingNumber,t.measurementNumber=u.measurementNumber,a.filter((function(e){return e.timepointId===r.timepointId&&e.lesionNamingNumber===t.lesionNamingNumber})).forEach((function(e){e.toolId=t.toolType,e.toolItemId=t._id,e.createdAt=t.createdAt,e.measurementNumber=t.measurementNumber,e.id=t.id}));else{h.info("handle measurement not added by cornerstone tool",t);var c=a.filter((function(e){return e.timepointId===r.timepointId}));t.lesionNamingNumber=t.lesionNamingNumber||this.calculateLesionNamingNumber(c),t.measurementNumber=t.measurementNumber||this.calculateMeasurementNumber(t)+1}var l,f={timepointId:r.timepointId,lesionNamingNumber:t.lesionNamingNumber,measurementNumber:t.measurementNumber,id:t.id},d=this.getPreviousMeasurement(t);if(d){h.info("previous measurement",d),t.lesionNamingNumber=d.lesionNamingNumber,t.measurementNumber=d.measurementNumber,f.lesionNamingNumber=d.lesionNamingNumber,f.measurementNumber=d.measurementNumber,f.additionalData=t.additionalData||{},f.additionalData.TrialPatientLocationUID=d.additionalData&&d.additionalData.TrialPatientLocationUID,f.location=d.location,f.label=d.label,f.description=d.description,f.isSplitLesion=d.isSplitLesion,f.isNodal=d.isNodal;var p=Cn(d);p&&(f.description=p)}else this.hasDuplicateMeasurementNumber(t);var m=i.findIndex((function(e){return e._id===t._id}));return m>-1?(l=Vn({},i[m],{},f),i[m]=l):(l=Vn({},t,{},f),i.push(l)),u||a.push({toolId:e,toolItemId:l._id,timepointId:r.timepointId,StudyInstanceUID:l.StudyInstanceUID,createdAt:l.createdAt,lesionNamingNumber:l.lesionNamingNumber,measurementNumber:l.measurementNumber,id:l.id}),this.onMeasurementsUpdated(),l}}},{key:"updateMeasurement",value:function(e,t){var r=this.tools[e],n=r.findIndex((function(e){return e._id===t._id}));n<0||(r[n]=Vn({},t,{updated:!0}),this.onMeasurementsUpdated())}},{key:"onMeasurementRemoved",value:function(e,t){var r=this,n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],a=t.lesionNamingNumber,i=t.measurementNumber,o=this.toolsGroupsMap[e],s=this.toolGroups[o],u=s.findIndex((function(e){return e.toolItemId===t._id}));if(h.info("onMeasurementRemoved",t,s,u),!(u<0)){s.splice(u,1);var c=s.filter((function(e){return e.measurementNumber===i})).map((function(e){return e.timepointId}));if(c.length<1){var l=function(e){return e.lesionNamingNumber>=a};this.updateNumbering(s,l,"lesionNamingNumber",-1);var f=qn.measurementTools.find((function(e){return e.id===o}));f&&f.childTools&&f.childTools.forEach((function(e){var t=r.tools[e.id];r.updateNumbering(t,l,"lesionNamingNumber",-1)})),this.updateMeasurementNumberForAllMeasurements(t,-1)}this.syncMeasurementsAndToolData(),this.onMeasurementsUpdated();var d=t.id;d&&n&&this.addTemporaryDeletedMeasurements(t)}}},{key:"syncMeasurementsAndToolData",value:function(){var t=this;qn.measurementTools.forEach((function(r){e.isToolIncluded(r)&&r.childTools.forEach((function(r){e.isToolIncluded(r)&&t.tools[r.id].forEach((function(t){e.syncMeasurementAndToolData(t)}))}))}))}},{key:"deleteMeasurements",value:function(t,r,n,a){var i=this,o={lesionNamingNumber:n.lesionNamingNumber,timepointId:n.timepointId},s=Object.keys(o),u=this.toolGroups[r];if(u){var c=u.filter((function(e){return s.every((function(t){return e[t]===o[t]}))})),l=[];if(c.forEach((function(e){if(e.toolId){var t=i.tools[e.toolId],r=t.findIndex((function(t){return t._id===e.toolItemId}));r>-1&&(l.push(t[r]),t.splice(r,1))}})),l.length){var f=o.lesionNamingNumber||l[0].lesionNamingNumber,d=Er.a.globalImageIdSpecificToolStateManager.saveToolState();l.forEach((function(r){var n=[],o=e.getToolConfiguration(r.toolType).tool;Array.isArray(o.childTools)?o.childTools.forEach((function(e){var t=r[e];t&&n.push(t)})):n.push(r),n.forEach((function(e){var t=e.imagePath,n=e.toolType,a=Fn(t);if(a&&d[a]){var i=d[a][n],o=i&&i.data,s=o.find((function(e){return e._id===r._id}));if(s){var u=o.indexOf(s);o.splice(u,1)}}})),i.onMeasurementRemoved(t,r,a)})),Er.a.globalImageIdSpecificToolStateManager.restoreToolState(d);var p=Vn({},o);delete p.timepointId,delete p.lesionNamingNumber;var h=Object.keys(p);$()(new Set(l.map((function(e){return e.toolType})))).forEach((function(t){i.tools[t].filter((function(e){return e.lesionNamingNumber>f-1&&h.every((function(t){return e[t]===o[t]}))})).forEach((function(t){e.syncMeasurementAndToolData(t)}))}))}}}}],[{key:"getInstance",value:function(){return this.Instance||(this.Instance=new e),this.Instance}}]),e}();$n.Instance=void 0;var zn=r(112),Gn=r.n(zn),Bn=function(){function e(t,r){f()(this,e),this.options=t,this.criterionName=r}return p()(e,[{key:"generateResponse",value:function(e,t){return{passed:!e,isGlobal:!t||!t.length,message:e,measurements:t,criterionName:this.criterionName}}},{key:"getNewTargetNumbers",value:function(e){var t=this.options,r=[],n=new Set;return t.newTarget&&(e.targets.forEach((function(e){var t=e.measurement.measurementNumber;"baseline"===e.timepoint.timepointType&&r.push(t)})),e.targets.forEach((function(e){var t=e.measurement.measurementNumber;"followup"===e.timepoint.timepointType&&(r.includes(t)||n.add(t))}))),n}}]),e}();function Hn(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}var Wn={type:"object"},Qn=function(e){X()(n,e);var t,r=(t=n,function(){var e,r=re()(t);if(Hn()){var n=re()(this).constructor;e=Reflect.construct(r,arguments,n)}else e=r.apply(this,arguments);return ee()(this,e)});function n(){f()(this,n);for(var e=arguments.length,t=new Array(e),a=0;ar.limit&&a.push(t))})),a.length){var o=r.newTarget?"new ":"";t=r.message||"Each organ should not have more than ".concat(r.limit," ").concat(o,"targets.")}return this.generateResponse(t,a)}}]),n}(Bn);function Xn(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}var Zn={type:"object",properties:{limit:{label:"Max targets allowed in study",type:"integer",minimum:0},newTarget:{label:"Flag to evaluate only new targets",type:"boolean"},locationIn:{label:"Filter to evaluate only measurements with the specified locations",type:"array",items:{type:"string"},minItems:1,uniqueItems:!0},locationNotIn:{label:"Filter to evaluate only measurements without the specified locations",type:"array",items:{type:"string"},minItems:1,uniqueItems:!0},isNodal:{label:"Filter to evaluate only nodal or extranodal measurements",type:"boolean"},message:{label:"Message to be displayed in case of nonconformity",type:"string"}},required:["limit"]},ea=function(e){X()(n,e);var t,r=(t=n,function(){var e,r=re()(t);if(Xn()){var n=re()(this).constructor;e=Reflect.construct(r,arguments,n)}else e=r.apply(this,arguments);return ee()(this,e)});function n(){f()(this,n);for(var e=arguments.length,t=new Array(e),a=0;a-1||n.push(o)}));var a,i="";if("boolean"==typeof t.isNodal&&(i=t.isNodal?"nodal ":"extranodal "),n.length>t.limit){var o=t.newTarget?"new ":"",s=1===t.limit?"":"s",u=0===t.limit?"":"more than ".concat(t.limit);a=t.message||"The study should not have ".concat(u," ").concat(o).concat(i,"target").concat(s,".")}return this.generateResponse(a)}}]),n}(Bn);function ta(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}var ra={type:"object",properties:{longAxis:{label:"Minimum length of long axis",type:"number",minimum:0},shortAxis:{label:"Minimum length of short axis",type:"number",minimum:0},longAxisSliceThicknessMultiplier:{label:"Length of long axis multiplier",type:"number",minimum:0},shortAxisSliceThicknessMultiplier:{label:"Length of short axis multiplier",type:"number",minimum:0},modalityIn:{label:"Filter to evaluate only measurements with the specified modalities",type:"array",items:{type:"string"},minItems:1,uniqueItems:!0},modalityNotIn:{label:"Filter to evaluate only measurements without the specified modalities",type:"array",items:{type:"string"},minItems:1,uniqueItems:!0},locationIn:{label:"Filter to evaluate only measurements with the specified locations",type:"array",items:{type:"string"},minItems:1,uniqueItems:!0},locationNotIn:{label:"Filter to evaluate only measurements without the specified locations",type:"array",items:{type:"string"},minItems:1,uniqueItems:!0},isNodal:{label:"Filter to evaluate only nodal or extranodal measurements",type:"boolean"},message:{label:"Message to be displayed in case of nonconformity",type:"string"}},anyOf:[{required:["message","longAxis"]},{required:["message","shortAxis"]},{required:["message","longAxisSliceThicknessMultiplier"]},{required:["message","shortAxisSliceThicknessMultiplier"]}]},na=function(e){X()(n,e);var t,r=(t=n,function(){var e,r=re()(t);if(ta()){var n=re()(this).constructor;e=Reflect.construct(r,arguments,n)}else e=r.apply(this,arguments);return ee()(this,e)});function n(){f()(this,n);for(var e=arguments.length,t=new Array(e),a=0;a-1||n.modalityNotIn&&n.modalityNotIn.indexOf(p)>-1||(n.longAxis&&u1?"modalities":"Modality";t="The ".concat(c," ").concat(u," should not be used as a method of measurement")}return this.generateResponse(t,i)}}]),n}(Bn);function sa(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}var ua={type:"object"},ca=function(e){X()(n,e);var t,r=(t=n,function(){var e,r=re()(t);if(sa()){var n=re()(this).constructor;e=Reflect.construct(r,arguments,n)}else e=r.apply(this,arguments);return ee()(this,e)});function n(){f()(this,n);for(var e=arguments.length,t=new Array(e),a=0;a0&&void 0!==arguments[0]&&arguments[0],t=0;return this.criteria.forEach((function(r){var n=e===!!r.options.newTarget;if(r instanceof ha.MaxTargetsCriterion&&n){var a=r.options.limit;a>t&&(t=a)}})),t}},{key:"getCriteriaValidator",value:function(){if(e.criteriaValidator)return e.criteriaValidator;var t={properties:{},definitions:{}};return Object.keys(ha).forEach((function(e){if(ha[e].prototype instanceof Bn){var r=e.replace(/Criterion$/,""),n="#/definitions/".concat(r);t.definitions[r]=ha["".concat(r,"Schema")],t.properties[r]={oneOf:[{$ref:n},{type:"array",items:{$ref:n}}]}}})),e.criteriaValidator=(new Gn.a).compile(t),e.criteriaValidator}},{key:"evaluate",value:function(e){var t=[];return this.criteria.forEach((function(r){var n=r.evaluate(e);n.passed||t.push(n)})),t}}],[{key:"setCriterion",value:function(e,t){ha[e]=t}}]),e}(),va=r(111),ya=r.t(va,2);function ga(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}var ba=function(e){for(var t=1;t2&&void 0!==arguments[2]?arguments[2]:{};f()(this,e),this.measurementApi=t,this.timepointApi=r,this.nonconformities=[],this.groupedNonConformities=[],this.maxTargets=null,this.maxNewTargets=null,this.options=n}var t,r;return p()(e,[{key:"loadStudy",value:function(e){if("function"!=typeof this.options.loadStudy)throw new Error("loadStudy callback is not defined");return this.options.loadStudy(null,e)}},{key:"validate",value:(r=Ze()(Ye.a.mark((function e(t){var r,n,a,i,o,s,u,l,f,d,p,h;return Ye.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=this.getData("baseline"),n=this.getData("followup"),e.next=4,Promise.all([r,n]);case 4:return a=e.sent,i=c()(a,2),o=i[0],s=i[1],(u={targets:[],nonTargets:[]}).targets=u.targets.concat(o.targets),u.targets=u.targets.concat(s.targets),u.nonTargets=u.nonTargets.concat(o.nonTargets),u.nonTargets=u.nonTargets.concat(s.nonTargets),this.maxTargets=null,this.maxNewTargets=null,l=this.validateTimepoint("both",t,u),f=this.validateTimepoint("baseline",t,o),d=this.validateTimepoint("followup",t,s),p=f.concat(d).concat(l),h=this.groupNonConformities(p),this.nonconformities=p,this.groupedNonConformities=h,console.warn("nonconformities"),console.warn(p),console.warn("groupedNonConformities"),console.warn(h),e.abrupt("return",p);case 27:case"end":return e.stop()}}),e,this)}))),function(e){return r.apply(this,arguments)})},{key:"groupNonConformities",value:function(e){var t={},r=this.measurementApi.toolsGroupsMap;return e.forEach((function(e){if(e.isGlobal)return t.globals=t.globals||{messages:[]},void t.globals.messages.push(e.message);e.measurements.forEach((function(n){var a=r[n.toolType];t[a]=t[a]||{measurementNumbers:{}};var i=t[a],o=n.measurementNumber,s=i.measurementNumbers[o];s||(s=i.measurementNumbers[o]={messages:[],measurements:[]}),s.messages.push(e.message),s.measurements.push(n)}))})),t}},{key:"validateTimepoint",value:function(e,t,r){var n=this,a=this.getEvaluators(e,t),i=[];return a.forEach((function(t){var a=t.getMaxTargets(!1),o=t.getMaxTargets(!0);a&&(n.maxTargets=a),o&&(n.maxNewTargets=o);var s=t.evaluate(r);s.length>0&&s.forEach((function(t){t.timepointType=e})),i=i.concat(s)})),i}},{key:"getEvaluators",value:function(e,t){var r=[];console.warn(ba);var n=t.id.toLowerCase(),a=ba[n];if(a){var i=a[e];i&&r.push(new ma(i))}return r}},{key:"getData",value:(t=Ze()(Ye.a.mark((function e(t){var r,n,a,i=this;return Ye.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r={targets:[],nonTargets:[]},n=[],(a=function(e){i.measurementApi.fetch(e).forEach((function(a){var o=a.StudyInstanceUID,s=a.timepointId,u=s&&i.timepointApi.timepoints.find((function(e){return e.timepointId===s}));if(u&&("both"===t||u.timepointType===t)){var c=i.loadStudy(o);c.then((function(t){r[e].push({measurement:a,metadata:t.getFirstInstance(),timepoint:u})}),(function(e){throw new Error(e)})),n.push(c)}}))})("targets"),a("nonTargets"),e.next=7,Promise.all(n);case 7:return e.abrupt("return",r);case 8:case"end":return e.stop()}}),e)}))),function(e){return t.apply(this,arguments)})}],[{key:"setEvaluationDefinitions",value:function(e,t){ba[e]=t}}]),e}(),wa=function(e){var t=tt.a.getEnabledElement(e).image.imageId,r=tt.a.metaData.get("instance",t),n=r.StudyInstanceUID,a=r.PatientID,i=r.SeriesInstanceUID,o=r.SOPInstanceUID,s=t.split("&frame"),u=void 0!==s[1]?Number(s[1]):0,c=[n,i,o,u].join("_");return{PatientID:a,StudyInstanceUID:n,SeriesInstanceUID:i,SOPInstanceUID:o,frameIndex:u,imagePath:c}};function Sa(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function Pa(e){var t=e.eventData,r=e.tool,n=$n.Instance;n||h.warn("Measurement API is not initialized");var a=t.measurementData,i=t.toolType;if(n.tools[i]&&a&&!a.cancelled){h.info("CornerstoneToolsMeasurementAdded");var o=function(e){for(var t=1;t-1?o[s]:null;u&&(1===u.childToolsCount?(o.splice(s,1),i.onMeasurementRemoved(r.parentTool,u,a)):(u[r.attribute]=null,u.childToolsCount=(u.childToolsCount||0)-1,i.updateMeasurement(r.parentTool,u)),tt.a.getEnabledElements().forEach((function(e){tt.a.updateImage(e.element)})),$n.isToolIncluded(r))}},Ta=function(e){var t=e.detail;return t.toolName&&(t.toolType=t.toolName),t},Aa={handleSingleMeasurementAdded:Pa,handleChildMeasurementAdded:Oa,handleSingleMeasurementModified:xa,handleChildMeasurementModified:_a,handleSingleMeasurementRemoved:ka,handleChildMeasurementRemoved:ja,onAdded:function(e){var t=Ta(e),r=t.toolType,n=$n.getToolConfiguration(r),a=n.toolGroupId,i=n.toolGroup,o=n.tool,s=Un.getInstance().current();s&&(t.measurementData.timepointId=s.timepointId);var u={eventData:t,tool:o,toolGroupId:a,toolGroup:i};o&&(o.parentTool?Oa(u):Pa(u))},onModified:function(e){var t=Ta(e),r=t.toolType,n=$n.getToolConfiguration(r),a=n.toolGroupId,i=n.toolGroup,o=n.tool,s={eventData:t,tool:o,toolGroupId:a,toolGroup:i};o&&(o.parentTool?_a(s):xa(s))},onRemoved:function(e){var t=Ta(e),r=t.toolType,n=$n.getToolConfiguration(r),a=n.toolGroupId,i=n.toolGroup,o=n.tool,s={eventData:t,tool:o,toolGroupId:a,toolGroup:i};o&&(o.parentTool?ja(s):ka(s))}},Ra=r(11),Ma=r.n(Ra),Ua={id:"targets",name:"Targets",childTools:[vn,Dn,On,En],options:{caseProgress:{include:!0,evaluate:!0}}},Na={id:"nonTargets",name:"Non-Targets",childTools:[wn],options:{caseProgress:{include:!0,evaluate:!0}}};function Ca(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}var Fa=Ma()([In,yn]);Fa.forEach((function(e){e.options=function(e){for(var t=1;t0&&h.warn("[DICOMSR] Tooltypes not supported: ".concat(a.join(", "))),{dataset:t.generateReport(n,tt.a.metaData).dataset}},Ga=function(e){var t=[];return e.forEach((function(e){e.getDisplaySets&&(t=t.concat(e.getDisplaySets()))})),t},Ba=function(){var e=Ze()(Ye.a.mark((function e(t,r,n){var a,i,o,s,u,c,l;return Ye.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return a={url:n,headers:ae.getAuthorizationHeader()},i=new Re.DICOMwebClient(a),o=t.getFirstInstance(),s={studyInstanceUID:o.getStudyInstanceUID(),seriesInstanceUID:o.getSeriesInstanceUID(),sopInstanceUID:o.getSOPInstanceUID()},e.next=6,i.retrieveInstance(s);case 6:return u=e.sent,c=Ga(r),l=hn(u,c),e.abrupt("return",l);case 10:case"end":return e.stop()}}),e)})));return function(t,r,n){return e.apply(this,arguments)}}(),Ha=function(){var e=Ze()(Ye.a.mark((function e(t,r){var n,a,i,o,s,u,c,l,f,d,p,h;return Ye.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=za(t),a=n.dataset,i=ot.data,o=i.DicomMetaDictionary,s=i.DicomDict,u={FileMetaInformationVersion:a._meta.FileMetaInformationVersion.Value,MediaStorageSOPClassUID:a.SOPClassUID,MediaStorageSOPInstanceUID:a.SOPInstanceUID,TransferSyntaxUID:"1.2.840.10008.1.2.1",ImplementationClassUID:o.uid(),ImplementationVersionName:"dcmjs-0.0"},c=o.denaturalizeDataset(u),(l=new s(c)).dict=o.denaturalizeDataset(a),f=l.write(),d={url:r,headers:ae.getAuthorizationHeader()},p=new Re.DICOMwebClient(d),h={datasets:[f]},e.next=12,p.storeInstances(h);case 12:case"end":return e.stop()}}),e)})));return function(t,r){return e.apply(this,arguments)}}(),Wa=function(e){var t=e.getFirstInstance().getData().metadata.SOPClassUID;return["1.2.840.10008.5.1.4.1.1.88.22","1.2.840.10008.5.1.4.1.1.11.1"].includes(t)},Qa=function(e,t){return e._data.SeriesDate>t._data.SeriesDate||e._data.SeriesDate===t._data.SeriesDate&&e._data.SeriesTime>t._data.SeriesTime},Ka=function(e){var t;return e.forEach((function(e){(e.getSeries?e.getSeries():[]).forEach((function(e){e.instances&&e.instances.length&&Wa(e)&&(t&&!Qa(e,t)||(t=e))}))})),t},Ja={retrieveMeasurements:function(e){if(h.info("[DICOMSR] retrieveMeasurements"),!e||"dicomWeb"!==e.type)return h.error("[DICOMSR] DicomWeb server is required!"),Promise.reject({});var t=e.wadoRoot,r=ln.studyMetadataManager.all(),n=Ka(r);return n?Ba(n,r,t):Promise.resolve({})},storeMeasurements:function(){var e=Ze()(Ye.a.mark((function e(t,r,n){var a,i,o,s;return Ye.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(h.info("[DICOMSR] storeMeasurements"),n&&"dicomWeb"===n.type){e.next=4;break}return h.error("[DICOMSR] DicomWeb server is required!"),e.abrupt("return",Promise.reject({}));case 4:return a=n.wadoRoot,i=Object.keys(t)[0],o=t[i][0],s=o&&o.StudyInstanceUID,e.prev=8,e.next=11,Ha(t,a);case 11:return s&&Mr.deleteStudyMetadataPromise(s),e.abrupt("return",{message:"Measurements saved successfully"});case 15:throw e.prev=15,e.t0=e.catch(8),h.error("[DICOMSR] Error while saving the measurements: ".concat(e.t0.message)),new Error("Error while saving the measurements.");case 19:case"end":return e.stop()}}),e,null,[[8,15]])})));return function(t,r,n){return e.apply(this,arguments)}}(),isToolSupported:$a},Ya={metadataProvider:St};function Xa(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}var Za=function(e){X()(n,e);var t,r=(t=n,function(){var e,r=re()(t);if(Xa()){var n=re()(this).constructor;e=Reflect.construct(r,arguments,n)}else e=r.apply(this,arguments);return ee()(this,e)});function n(e,t,a,i){var o;return f()(this,n),(o=r.call(this,e,i)).init(t,a),o}return p()(n,[{key:"init",value:function(e,t){var r=this.getData();Object.defineProperties(this,{_sopInstanceUID:{configurable:!1,enumerable:!1,writable:!1,value:r.SOPInstanceUID},_study:{configurable:!1,enumerable:!1,writable:!1,value:t},_series:{configurable:!1,enumerable:!1,writable:!1,value:e},_instance:{configurable:!1,enumerable:!1,writable:!1,value:r},_cache:{configurable:!1,enumerable:!1,writable:!1,value:Object.create(null)}})}},{key:"getTagValue",value:function(e,t,r){if(e in this._cache&&!0!==r)return this._cache[e];var n,a=this._instance.metadata;return e in a?n=a[e]:e in this._series?n=this._series[e]:e in this._study&&(n=this._study[e]),void 0!==n?(this._cache[e]=n,n):t}},{key:"tagExists",value:function(e){return e in this._instance.metadata||e in this._series||e in this._study}},{key:"getImageId",value:function(e,t){return null===this._imageId&&(this._imageId=it(this.getData(),e,t)),this._imageId}}]),n}(me);function ei(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}var ti=function(e){X()(n,e);var t,r=(t=n,function(){var e,r=re()(t);if(ei()){var n=re()(this).constructor;e=Reflect.construct(r,arguments,n)}else e=r.apply(this,arguments);return ee()(this,e)});function n(e,t,a){var i;return f()(this,n),(i=r.call(this,e,a)).init(t),i}return p()(n,[{key:"init",value:function(e){var t=this,r=this.getData();Object.defineProperty(this,"_seriesInstanceUID",{configurable:!1,enumerable:!1,writable:!1,value:r.SeriesInstanceUID}),r.instances.forEach((function(n){t.addInstance(new Za(n,r,e))})),this.combinedId=r.SeriesInstanceUID+(r.SubSeriesIndex||"")}},{key:"isSubSeries",value:function(){return this._data.isSubSeries}},{key:"getSeriesDescription",value:function(){return this._data.SeriesDescription}},{key:"getSeriesNumber",value:function(){return this._data.SeriesNumber}},{key:"getCustomSeriesInstanceUID",value:function(){return this.combinedId}}]),n}(ye);function ri(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}var ni={Metadata:pe,StudyMetadata:ze,SeriesMetadata:ye,InstanceMetadata:me,OHIFStudyMetadata:function(e){X()(n,e);var t,r=(t=n,function(){var e,r=re()(t);if(ri()){var n=re()(this).constructor;e=Reflect.construct(r,arguments,n)}else e=r.apply(this,arguments);return ee()(this,e)});function n(e,t){var a;return f()(this,n),(a=r.call(this,e,t)).init(),a}return p()(n,[{key:"init",value:function(){var e=this,t=this.getData();Object.defineProperty(this,"_studyInstanceUID",{configurable:!1,enumerable:!1,writable:!1,value:t.StudyInstanceUID}),t.series.forEach((function(r){an(r).forEach((function(r){e.addSeries(new ti(r,t))}))}))}}]),n}(ze),OHIFSeriesMetadata:ti,OHIFInstanceMetadata:Za},ai=["1.2.840.10008.5.1.4.1.1.1","1.2.840.10008.5.1.4.1.1.1.1","1.2.840.10008.5.1.4.1.1.1.1.1","1.2.840.10008.5.1.4.1.1.1.2","1.2.840.10008.5.1.4.1.1.1.2.1","1.2.840.10008.5.1.4.1.1.1.3","1.2.840.10008.5.1.4.1.1.1.3.1","1.2.840.10008.5.1.4.1.1.2","1.2.840.10008.5.1.4.1.1.2.1","1.2.840.10008.5.1.4.1.1.2.2","1.2.840.10008.5.1.4.1.1.3.1","1.2.840.10008.5.1.4.1.1.4","1.2.840.10008.5.1.4.1.1.4.1","1.2.840.10008.5.1.4.1.1.4.3","1.2.840.10008.5.1.4.1.1.4.4","1.2.840.10008.5.1.4.1.1.6.1","1.2.840.10008.5.1.4.1.1.7","1.2.840.10008.5.1.4.1.1.7.1","1.2.840.10008.5.1.4.1.1.7.2","1.2.840.10008.5.1.4.1.1.7.3","1.2.840.10008.5.1.4.1.1.7.4","1.2.840.10008.5.1.4.1.1.12.1","1.2.840.10008.5.1.4.1.1.12.1.1","1.2.840.10008.5.1.4.1.1.12.2","1.2.840.10008.5.1.4.1.1.12.2.1","1.2.840.10008.5.1.4.1.1.13.1.1","1.2.840.10008.5.1.4.1.1.13.1.2","1.2.840.10008.5.1.4.1.1.13.1.3","1.2.840.10008.5.1.4.1.1.13.1.4","1.2.840.10008.5.1.4.1.1.13.1.5","1.2.840.10008.5.1.4.1.1.14.1","1.2.840.10008.5.1.4.1.1.14.2","1.2.840.10008.5.1.4.1.1.20","1.2.840.10008.5.1.4.1.1.77.1.1","1.2.840.10008.5.1.4.1.1.77.1.1.1","1.2.840.10008.5.1.4.1.1.77.1.2","1.2.840.10008.5.1.4.1.1.77.1.2.1","1.2.840.10008.5.1.4.1.1.77.1.3","1.2.840.10008.5.1.4.1.1.77.1.4","1.2.840.10008.5.1.4.1.1.77.1.4.1","1.2.840.10008.5.1.4.1.1.77.1.5.1","1.2.840.10008.5.1.4.1.1.77.1.5.2","1.2.840.10008.5.1.4.1.1.77.1.5.4","1.2.840.10008.5.1.4.1.1.77.1.6","1.2.840.10008.5.1.4.1.1.128","1.2.840.10008.5.1.4.1.1.130","1.2.840.10008.5.1.4.1.1.128.1","1.2.840.10008.5.1.4.1.1.481.1"],ii=r(19),oi=r.n(ii);oi.a.validators.equals=function(e,t,r,n){if(t&&e!==t.value)return"".concat(r,"must equal ").concat(t.value)},oi.a.validators.doesNotEqual=function(e,t,r){if(t&&e===t.value)return"".concat(r,"cannot equal ").concat(t.value)},oi.a.validators.contains=function(e,t,r){if(t&&e.indexOf&&-1===e.indexOf(t.value))return"".concat(r,"must contain ").concat(t.value)},oi.a.validators.doesNotContain=function(e,t,r){if(t&&e.indexOf&&-1!==e.indexOf(t.value))return"".concat(r,"cannot contain ").concat(t.value)},oi.a.validators.startsWith=function(e,t,r){if(t&&e.startsWith&&!e.startsWith(t.value))return"".concat(r,"must start with ").concat(t.value)},oi.a.validators.endsWith=function(e,t,r){if(t&&e.endsWith&&!e.endsWith(t.value))return"".concat(r,"must end with ").concat(t.value)};var si={};var ui=ni.InstanceMetadata,ci=function(e,t){if(!(e instanceof ui))throw new ce("HPMatcher::match metadataInstance must be an instance of InstanceMetadata");var r={format:"grouped"},n={passed:[],failed:[]},a=!1,i=0;return t.forEach((function(t){var o=t.attribute;if(Object.prototype.hasOwnProperty.call(si,o)){var s=si[o];e.setCustomAttribute(o,s.callback(e))}var u,c=_()({},o,t.constraint),l=e.customAttributeExists(o)?e.getCustomAttribute(o):e.getTagValue(o),f=_()({},o,l);try{u=oi()(f,c,[r])}catch(e){u=["Something went wrong during validation.",e]}u?(t.required&&(a=!0),n.failed.push({rule:t,errorMessages:u})):(i+=parseInt(t.weight,10),n.passed.push({rule:t}))})),a&&(i=0),{score:i,details:n,requiredFailed:a}},li={};var fi=[{id:"equals",name:"= (Equals)",validator:"equals",validatorOption:"value",description:"The attribute must equal this value."},{id:"doesNotEqual",name:"!= (Does not equal)",validator:"doesNotEqual",validatorOption:"value",description:"The attribute must not equal this value."},{id:"contains",name:"Contains",validator:"contains",validatorOption:"value",description:"The attribute must contain this value."},{id:"doesNotContain",name:"Does not contain",validator:"doesNotContain",validatorOption:"value",description:"The attribute must not contain this value."},{id:"startsWith",name:"Starts with",validator:"startsWith",validatorOption:"value",description:"The attribute must start with this value."},{id:"endsWith",name:"Ends with",validator:"endsWith",validatorOption:"value",description:"The attribute must end with this value."},{id:"onlyInteger",name:"Only Integers",validator:"numericality",validatorOption:"onlyInteger",description:"Real numbers won't be allowed."},{id:"greaterThan",name:"> (Greater than)",validator:"numericality",validatorOption:"greaterThan",description:"The attribute has to be greater than this value."},{id:"greaterThanOrEqualTo",name:">= (Greater than or equal to)",validator:"numericality",validatorOption:"greaterThanOrEqualTo",description:"The attribute has to be at least this value."},{id:"lessThanOrEqualTo",name:"<= (Less than or equal to)",validator:"numericality",validatorOption:"lessThanOrEqualTo",description:"The attribute can be this value at the most."},{id:"lessThan",name:"< (Less than)",validator:"numericality",validatorOption:"lessThan",description:"The attribute has to be less than this value."},{id:"odd",name:"Odd",validator:"numericality",validatorOption:"odd",description:"The attribute has to be odd."},{id:"even",name:"Even",validator:"numericality",validatorOption:"even",description:"The attribute has to be even."}];Object.freeze(fi);var di=/^equals$/,pi=function(){function e(t,r,n,a){f()(this,e),this.id=k(),this.weight=a||1,t&&(this.attribute=t),r&&(this.constraint=r),this.required=void 0!==n&&n,this._constraintInfo=void 0,this._validatorAndValue=void 0}return p()(e,[{key:"fromObject",value:function(e){this.id=e.id||k(),this.required=e.required,this.weight=e.weight,this.attribute=e.attribute,this.constraint=e.constraint}},{key:"getConstraintInfo",value:function(){var e=this._constraintInfo;if(void 0!==e)return e;var t=Object.keys(this.constraint)[0];return void 0!==t&&(e=fi.find((function(e){return t===e.id}))),this._constraintInfo=e,e}},{key:"isRuleForPrior",value:function(){return"abstractPriorValue"===this.attribute}},{key:"getNumberOfPriorsReferenced",value:function(){if(!this.isRuleForPrior())return-1;var e=this.getConstraintValidatorAndValue(),t=e.value,r=e.validator,n=parseInt(t,10)||0;return di.test(r)?n<0?1:n:0}},{key:"getConstraintValidatorAndValue",value:function(){var e=this._validatorAndValue;if(void 0!==e)return e;var t=this.getConstraintInfo();if(void 0!==t){var r=t.validator,n=this.constraint[r];if(n)e={value:n[t.validatorOption],validator:t.id},this._validatorAndValue=e}return e}}]),e}();function hi(e){return function(){var t,r=re()(e);if(mi()){var n=re()(this).constructor;t=Reflect.construct(r,arguments,n)}else t=r.apply(this,arguments);return ee()(this,t)}}function mi(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}var vi=function(e){X()(r,e);var t=hi(r);function r(){return f()(this,r),t.apply(this,arguments)}return r}(pi),yi=function(e){X()(r,e);var t=hi(r);function r(){return f()(this,r),t.apply(this,arguments)}return r}(pi),gi=function(e){X()(r,e);var t=hi(r);function r(){return f()(this,r),t.apply(this,arguments)}return r}(pi),bi=function(e){X()(r,e);var t=hi(r);function r(){return f()(this,r),t.apply(this,arguments)}return r}(pi),Ii=function(e,t){return!(!e||!e.length)&&(e.forEach((function(e,n){if(e===t)return r=n,!1})),!!r&&(e.splice(r,1),!0));var r},wi=function(){function e(t,r){f()(this,e),this.type=t,this.properties=r}return p()(e,[{key:"fromObject",value:function(e){this.type=e.type,this.properties=e.properties}},{key:"getLayoutTemplateName",value:function(){switch(this.type){case"grid":return"gridLayout"}}},{key:"getNumViewports",value:function(){switch(this.type){case"grid":return this.properties.Rows*this.properties.Columns}}}]),e}(),Si=function(){function e(){f()(this,e),this.viewportSettings={},this.imageMatchingRules=[],this.seriesMatchingRules=[],this.studyMatchingRules=[]}return p()(e,[{key:"fromObject",value:function(e){var t=this;e.imageMatchingRules&&e.imageMatchingRules.forEach((function(e){var r=new bi;r.fromObject(e),t.imageMatchingRules.push(r)})),e.seriesMatchingRules&&e.seriesMatchingRules.forEach((function(e){var r=new gi;r.fromObject(e),t.seriesMatchingRules.push(r)})),e.studyMatchingRules&&e.studyMatchingRules.forEach((function(e){var r=new yi;r.fromObject(e),t.studyMatchingRules.push(r)})),e.viewportSettings&&(this.viewportSettings=e.viewportSettings)}},{key:"removeRule",value:function(e){var t;e instanceof yi?t=this.studyMatchingRules:e instanceof gi?t=this.seriesMatchingRules:e instanceof bi&&(t=this.imageMatchingRules),Ii(t,e)}}]),e}();function Pi(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}var Di=function(){function e(t,r){f()(this,e),this.id=k(),this.name=r,this.viewportStructure=t,this.viewports=[],this.createdDate=new Date}return p()(e,[{key:"createClone",value:function(t){var r=function(e){for(var t=1;t0&&void 0!==arguments[0]&&arguments[0],t=!0!==e?this.numberOfPriorsReferenced:-1;return t>-1||(t=0,this.stages.forEach((function(e){e.viewports&&e.viewports.forEach((function(e){e.studyMatchingRules&&e.studyMatchingRules.forEach((function(e){var r=e.getNumberOfPriorsReferenced();r>t&&(t=r)}))}))})),this.numberOfPriorsReferenced=t),t}},{key:"updateNumberOfPriorsReferenced",value:function(){this.getNumberOfPriorsReferenced(!0)}},{key:"protocolWasModified",value:function(){ne.userLoggedIn&&ne.userLoggedIn()&&(this.modifiedBy=ne.getUserId()),this.hasUpdatedPriorsInformation=!1,this.updateNumberOfPriorsReferenced(),this.modifiedDate=new Date}},{key:"fromObject",value:function(e){var t=this;this.id=e.id||k(),this.name=e.name,this.locked=!!e.locked,e.protocolMatchingRules&&e.protocolMatchingRules.forEach((function(e){var r=new vi;r.fromObject(e),t.protocolMatchingRules.push(r)})),e.stages&&e.stages.forEach((function(e){var r=new Di;r.fromObject(e),t.stages.push(r)}))}},{key:"createClone",value:function(t){var r=function(e){for(var t=1;t4&&void 0!==arguments[4]?arguments[4]:{};if(f()(this,e),this.matchedProtocols=new Map,this.matchedProtocolScores={},!(a instanceof Gt))throw new ce("ProtocolEngine::constructor studyMetadataSource is not an instance of StudyMetadataSource");if(!(r instanceof Array||r.every((function(e){return e instanceof _i}))))throw new ce("ProtocolEngine::constructor studies is not an array or it's items are not instances of StudyMetadata");this.protocolStore=t,this.studies=r,this.priorStudies=n instanceof Map?n:new Map,this.studyMetadataSource=a,this.options=i,this.reset(),this.newStageIds=[]}return p()(e,[{key:"reset",value:function(){var e=this.getBestProtocolMatch();this.setHangingProtocol(e)}},{key:"getCurrentStageModel",value:function(){return this.protocol.stages[this.stage]}},{key:"findMatchByStudy",value:function(e){h.trace("ProtocolEngine::findMatchByStudy");var t=[],r=e.getFirstInstance(),n=this.getNumberOfAvailablePriors(e.getObjectID());return this.protocolStore.getProtocol().forEach((function(e){var a=e.protocolMatchingRules.slice();if(a&&!(e.getNumberOfPriorsReferenced()>n)){var i=ci(r,a).score;i>0&&t.push({score:i,protocol:e})}})),t.length?(t.sort((function(e,t){return t.score-e.score})),h.trace("ProtocolEngine::findMatchByStudy matched",t),t):[{score:1,protocol:this.protocolStore.getProtocol("defaultProtocol")}]}},{key:"_clearMatchedProtocols",value:function(){this.matchedProtocols.clear(),this.matchedProtocolScores={}}},{key:"updateProtocolMatches",value:function(){var e=this;h.trace("ProtocolEngine::updateProtocolMatches"),this._clearMatchedProtocols(),this.studies.forEach((function(t){e.findMatchByStudy(t).forEach((function(t){var r=t.protocol;r&&(e.matchedProtocols.has(r.id)||(h.trace("ProtocolEngine::updateProtocolMatches inserting protocol match",t),e.matchedProtocols.set(r.id,r),e.matchedProtocolScores[r.id]=t.score))}))}))}},{key:"_largestKeyByValue",value:function(e){return Object.keys(e).reduce((function(t,r){return e[t]>e[r]?t:r}))}},{key:"_getHighestScoringProtocol",value:function(){if(!Object.keys(this.matchedProtocolScores).length)return this.protocolStore.getProtocol("defaultProtocol");var e=this._largestKeyByValue(this.matchedProtocolScores);return this.matchedProtocols.get(e)}},{key:"getBestProtocolMatch",value:function(){this.updateProtocolMatches();var e=this._getHighestScoringProtocol();return h.trace("ProtocolEngine::getBestProtocolMatch bestMatch",e),e}},{key:"getNumberOfAvailablePriors",value:function(e){return this.getAvailableStudyPriors(e).length}},{key:"getAvailableStudyPriors",value:function(e){var t=this.priorStudies.get(e);return t instanceof Array?t:[]}},{key:"matchImages",value:function(e,t){var r=this;h.trace("ProtocolEngine::matchImages");var n,a=e.studyMatchingRules,i=e.seriesMatchingRules,o=e.imageMatchingRules,s=[],u=this.studies[0],c=u.getFirstInstance(),l=0,f=0;u.setCustomAttribute("abstractPriorValue",0),c instanceof ki&&c.setCustomAttribute("abstractPriorValue",0),a.forEach((function(e){if("abstractPriorValue"===e.attribute){var a,i=Object.keys(e.constraint)[0],o=Object.keys(e.constraint[i])[0],s=e.constraint[i][o];if(s=parseInt(s,10),n||(n=r.getAvailableStudyPriors(u.getObjectID())),-1===s)a=n[n.length-1];else{var c=Math.max(s-1,0);a=n[c]}if(!(a instanceof _i))return;var l=a.getObjectID();if(r.studies.find((function(e){return e.getObjectID()===l})))return;r.studyMetadataSource.loadStudy(a).then((function(e){e.setCustomAttribute("abstractPriorValue",s);var n=e.getFirstInstance();n instanceof ki&&n.setCustomAttribute("abstractPriorValue",s),r.studies.push(e),r.updateViewports(t)}),(function(e){throw h.warn(e),new ce("ProtocolEngine::matchImages could not get study metadata for the Study with the following ObjectID: ".concat(l))}))}})),this.studies.forEach((function(e){var t=ci(e.getFirstInstance(),a);!0===t.requiredFailed||t.score1&&void 0!==arguments[1])||arguments[1];h.trace("ProtocolEngine::setHangingProtocol newProtocol",e),h.trace("ProtocolEngine::setHangingProtocol updateViewports = ".concat(t)),this.newStageIds=[],Object.prototype.isPrototypeOf.call(e,Oi)?this.protocol=e:(this.protocol=new Oi,this.protocol.fromObject(e)),this.stage=0,t&&this.updateViewports()}},{key:"isNextStageAvailable",value:function(){var e=this.getNumProtocolStages();return this.stage+1=0}},{key:"setCurrentProtocolStage",value:function(e){return!(-1===e&&!this.isPreviousStageAvailable())&&(!(1===e&&!this.isNextStageAvailable())&&(this.stage+=e,h.trace("ProtocolEngine::setCurrentProtocolStage stage = ".concat(this.stage)),this.updateViewports(),!0))}},{key:"getNumProtocolStages",value:function(){if(this.protocol&&this.protocol.stages&&this.protocol.stages.length)return this.protocol.stages.length}},{key:"nextProtocolStage",value:function(){h.trace("ProtocolEngine::nextProtocolStage"),this.setCurrentProtocolStage(1)||h.trace("ProtocolEngine::nextProtocolStage failed")}},{key:"previousProtocolStage",value:function(){h.trace("ProtocolEngine::previousProtocolStage"),this.setCurrentProtocolStage(-1)||h.trace("ProtocolEngine::previousProtocolStage failed")}}]),e}(),Ti=function(){function e(t){f()(this,e),this.strategy=t}return p()(e,[{key:"onReady",value:function(e){this.strategy.onReady(e)}},{key:"getProtocol",value:function(t){var r=this.strategy.getProtocol(t);return e.getProtocolInstance(r)}},{key:"addProtocol",value:function(e){this.strategy.addProtocol(e)}},{key:"updateProtocol",value:function(e,t){this.strategy.updateProtocol(e,t)}},{key:"removeProtocol",value:function(e){this.strategy.removeProtocol(e)}}],[{key:"getProtocolInstance",value:function(e){var t=e;if(t instanceof Array)t.forEach((function(e,r){if(!(e instanceof Oi)){var n=new Oi;n.fromObject(e),t[r]=n}}));else if(void 0!==t&&!(t instanceof Oi)){var r=new Oi;r.fromObject(t),t=r}return t}}]),e}();var Ai=function(){var e=new Oi("Default");e.id="defaultProtocol",e.locked=!0;var t=new wi("grid",{Rows:1,Columns:1}),r=new Si,n=new Di(t,"oneByOne");return n.viewports.push(r),e.stages.push(n),e}(),Ri={ProtocolEngine:ji,ProtocolStore:Ti,ProtocolStrategy:function(){function e(){f()(this,e),this.hangingProtocols=new Map,this.defaultsAdded=!1}return p()(e,[{key:"onReady",value:function(e){this.defaultsAdded||(h.info("Inserting the default hanging protocol..."),this.addProtocol(Ai),this.defaultsAdded=!0),e()}},{key:"getProtocol",value:function(e){return e?this.hangingProtocols.get(e):Array.from(this.hangingProtocols.values())}},{key:"addProtocol",value:function(e){this.hangingProtocols.set(e.id,e)}},{key:"updateProtocol",value:function(e,t){this.hangingProtocols.has(e)&&this.hangingProtocols.set(e,t)}},{key:"removeProtocol",value:function(e){this.hangingProtocols.has(e)&&this.hangingProtocols.delete(e)}}]),e}(),addCustomAttribute:function(e,t,r){si[e]={name:t,callback:r}},addCustomViewportSetting:function(e,t,r,n){li[e]={id:e,text:t,options:r,callback:n}}},Mi={};var Ui={getNestedObject:function(e){var t={};for(var r in e)if(Object.prototype.hasOwnProperty.call(e,r))for(var n=e[r],a=r.split("."),i=t;a.length;){var o=a.shift();a.length?(i[o]||(i[o]={}),i=i[o]):i[o]=n}return t},getShallowObject:function(e){var t={};return function e(t,r,n){for(var a in r)if(Object.prototype.hasOwnProperty.call(r,a)){var i=t?"".concat(t,".").concat(a):a,o=r[a];"object"===L()(o)?(o instanceof Array&&(i+="[]"),e(i,o,n)):n[i]=o}}("",e,t),t}},Ni={setViewportActive:function(e){return{type:"VIEWPORT::SET_ACTIVE",viewportIndex:e}},setViewportSpecificData:function(e,t){return{type:"VIEWPORT::SET",viewportIndex:e,viewportSpecificData:t}},setViewportLayoutAndData:function(e,t){return{type:"VIEWPORT::SET_VIEWPORT_LAYOUT_AND_DATA",numRows:e.numRows,numColumns:e.numColumns,viewports:e.viewports,viewportSpecificData:t}},setLayout:function(e){return{type:"VIEWPORT::SET_LAYOUT",numRows:e.numRows,numColumns:e.numColumns,viewports:e.viewports}},clearViewportSpecificData:function(e){return{type:"VIEWPORT::CLEAR",viewportIndex:e}},setActiveViewportSpecificData:function(e){return{type:"VIEWPORT::SET_ACTIVE_SPECIFIC_DATA",viewportSpecificData:e}},setStudyLoadingProgress:function(e,t){return{type:"SET_STUDY_LOADING_PROGRESS",progressId:e,progressData:t}},clearStudyLoadingProgress:function(e){return{type:"CLEAR_STUDY_LOADING_PROGRESS",progressId:e}},setUserPreferences:function(e){return{type:"SET_USER_PREFERENCES",state:e}},setExtensionData:function(e,t){return{type:"SET_EXTENSION_DATA",extension:e,data:t}},setTimepoints:function(e){return{type:"SET_TIMEPOINTS",state:e}},setMeasurements:function(e){return{type:"SET_MEASUREMENTS",state:e}},setStudyData:function(e,t){return{type:"SET_STUDY_DATA",StudyInstanceUID:e,data:t}},setServers:function(e){return{type:"SET_SERVERS",servers:e}}};function Ci(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function Fi(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:Li,t=arguments.length>1?arguments[1]:void 0;switch(t.type){case"SET_EXTENSION_DATA":var r=t.extension,n=e[r]||{},a=t.data,i=_()({},r,Fi({},n,{},a));return Fi({},e,{},i);default:return e}};function qi(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function $i(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:zi,r=arguments.length>1?arguments[1]:void 0;switch(r.type){case"SET_STUDY_LOADING_PROGRESS":return(e=Ma()(t).progress)[r.progressId]=r.progressData,$i({},t,{progress:e,lastUpdated:(new Date).getTime()});case"CLEAR_STUDY_LOADING_PROGRESS":return delete(e=Ma()(t).progress)[r.progressId],$i({},t,{progress:e,lastUpdated:(new Date).getTime()});default:return t}};function Bi(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function Hi(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:Wi,t=arguments.length>1?arguments[1]:void 0;switch(t.type){case"SET_USER_PREFERENCES":return Hi({},e,{},t.state);default:return e}},Ki=r(67),Ji=r.n(Ki);function Yi(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function Xi(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:Zi,t=arguments.length>1?arguments[1]:void 0;switch(t.type){case"ADD_SERVER":var r=Ji()([].concat($()(e.servers),[t.server]),"id");return r.forEach((function(e){return e.active=!0})),Xi({},e,{servers:r});case"ACTIVATE_SERVER":var n=Xi({},t.server,{active:!0}),a=e.servers;return a.forEach((function(e){return e.active=!1})),Xi({},e,{servers:Ji()([].concat($()(a),[n]),"wadoRoot")});case"SET_SERVERS":return Xi({},e,{servers:t.servers});default:return e}};function to(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function ro(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:no,t=arguments.length>1?arguments[1]:void 0;switch(t.type){case"SET_STUDY_DATA":var r=Ma()(e).studyData;return r[t.StudyInstanceUID]=t.data,ro({},e,{studyData:r});default:return e}};function io(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function oo(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:so,t=arguments.length>1?arguments[1]:void 0;switch(t.type){case"SET_TIMEPOINTS":return oo({},e,{timepoints:t.state});case"SET_MEASUREMENTS":return oo({},e,{measurements:t.state});default:return e}},co=r(110),lo=r.n(co);function fo(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function po(e){for(var t=1;t2&&void 0!==arguments[2]?arguments[2]:{},n=e*t,a=Ma()(r);return nn-1&&delete a[e]})),a},vo=function(e,t,r){return r>e*t-1?ho.activeViewportIndex:r},yo={reducers:{extensions:Vi,loading:Gi,preferences:Qi,servers:eo,studies:ao,timepointManager:uo,viewports:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:ho,t=arguments.length>1?arguments[1]:void 0,r=!1;switch(t.type){case"VIEWPORT::SET_ACTIVE":var n=vo(e.numRows,e.numColumns,t.viewportIndex);return po({},e,{activeViewportIndex:n});case"VIEWPORT::SET_LAYOUT":var a=t.numRows,i=t.numColumns,o=mo(a,i,e.viewportSpecificData),s=vo(a,i,e.activeViewportIndex);return po({},e,{numRows:t.numRows,numColumns:t.numColumns,layout:{viewports:$()(t.viewports)},viewportSpecificData:o,activeViewportIndex:s});case"VIEWPORT::SET_VIEWPORT_LAYOUT_AND_DATA":var u=t.numRows,c=t.numColumns,l=mo(u,c,t.viewportSpecificData),f=vo(u,c,e.activeViewportIndex);return po({},e,{numRows:t.numRows,numColumns:t.numColumns,layout:{viewports:$()(t.viewports)},viewportSpecificData:l,activeViewportIndex:f});case"VIEWPORT::SET":var d=Ma()(e.layout),p=Ma()(e.viewportSpecificData);return p[t.viewportIndex]=lo()({},p[t.viewportIndex],t.viewportSpecificData),t.viewportSpecificData&&t.viewportSpecificData.plugin&&!d.viewports[t.viewportIndex].plugin&&(d.viewports[t.viewportIndex].plugin=t.viewportSpecificData.plugin),po({},e,{layout:d,viewportSpecificData:p});case"VIEWPORT::SET_ACTIVE_SPECIFIC_DATA":r=!0;case"VIEWPORT::SET_SPECIFIC_DATA":var h=Ma()(e.layout),m=r?e.activeViewportIndex:t.viewportIndex,v=Ma()(e.viewportSpecificData);return v[m]=po({},t.viewportSpecificData),t.viewportSpecificData&&t.viewportSpecificData.plugin&&(h.viewports[m].plugin=t.viewportSpecificData.plugin),po({},e,{layout:h,viewportSpecificData:v});case"VIEWPORT::CLEAR":var y=Ma()(e.viewportSpecificData);return t.viewportIndex?(y[t.viewportIndex]={},po({},e,{viewportSpecificData:y})):ho;default:return e}}},actions:Ni};function go(e){return e instanceof Object||"object"===L()(e)&&null!==e}function bo(e){return"string"==typeof e}var Io={search:function e(t,r){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[],i=new RegExp(r.trim(),"i");return Object.keys(t).forEach((function(o){var s=t[o];if(s){var u=bo(n)?s[n]:s;bo(u)&&i.test(u)&&a.push(s),go(s)&&e(s,r,n,a)}})),a},encodeId:function(e){var t=e&&e.toString?e.toString():e;return""===t||"string"!=typeof t?"_":t.replace(/[^a-zA-Z0-9-]/g,(function(e){return"_".concat(e[0].charCodeAt(0).toString(16),"_")}))}};function wo(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}var So={getScrollbarSize:function(){var e=document.createElement("p");e.style.width="100%",e.style.height="100%";var t=document.createElement("div");t.style.position="absolute",t.style.top="0px",t.style.left="0px",t.style.visibility="hidden",t.style.width="100px",t.style.height="100px",t.style.overflow="hidden",t.appendChild(e),document.body.appendChild(t);var r=e.offsetWidth,n=e.offsetHeight;t.style.overflow="scroll";var a=e.offsetWidth,i=e.offsetHeight;return r===a&&(a=t.clientWidth),n===i&&(i=t.clientHeight),document.body.removeChild(t),[r-a,n-i]},getOffset:function(e){var t=0,r=0;if(e.offsetParent)do{r+=e.offsetLeft,t+=e.offsetTop}while(e=e.offsetParent);return{left:r,top:t}},isCharacterKeyPress:function(e){return void 0===e.which||"number"==typeof e.which&&e.which>0&&(!e.ctrlKey&&!e.metaKey&&!e.altKey&&8!==e.which)},handleError:function(e){var t=e.title,r=e.message;t||e instanceof Error&&(t=e.name),r||e instanceof Error&&(r=e.message),function(e){for(var t=1;t false\n */\nfunction cloneDeep(value) {\n return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n}\n\nmodule.exports = cloneDeep;\n","module.exports = __WEBPACK_EXTERNAL_MODULE__12__;","var arrayWithHoles = require(\"./arrayWithHoles\");\n\nvar iterableToArrayLimit = require(\"./iterableToArrayLimit\");\n\nvar unsupportedIterableToArray = require(\"./unsupportedIterableToArray\");\n\nvar nonIterableRest = require(\"./nonIterableRest\");\n\nfunction _slicedToArray(arr, i) {\n return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();\n}\n\nmodule.exports = _slicedToArray;","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","module.exports = __WEBPACK_EXTERNAL_MODULE__18__;","/*!\n * validate.js 0.12.0\n *\n * (c) 2013-2017 Nicklas Ansman, 2013 Wrapp\n * Validate.js may be freely distributed under the MIT license.\n * For all details and documentation:\n * http://validatejs.org/\n */\n\n(function(exports, module, define) {\n \"use strict\";\n\n // The main function that calls the validators specified by the constraints.\n // The options are the following:\n // - format (string) - An option that controls how the returned value is formatted\n // * flat - Returns a flat array of just the error messages\n // * grouped - Returns the messages grouped by attribute (default)\n // * detailed - Returns an array of the raw validation data\n // - fullMessages (boolean) - If `true` (default) the attribute name is prepended to the error.\n //\n // Please note that the options are also passed to each validator.\n var validate = function(attributes, constraints, options) {\n options = v.extend({}, v.options, options);\n\n var results = v.runValidations(attributes, constraints, options)\n , attr\n , validator;\n\n if (results.some(function(r) { return v.isPromise(r.error); })) {\n throw new Error(\"Use validate.async if you want support for promises\");\n }\n return validate.processValidationResults(results, options);\n };\n\n var v = validate;\n\n // Copies over attributes from one or more sources to a single destination.\n // Very much similar to underscore's extend.\n // The first argument is the target object and the remaining arguments will be\n // used as sources.\n v.extend = function(obj) {\n [].slice.call(arguments, 1).forEach(function(source) {\n for (var attr in source) {\n obj[attr] = source[attr];\n }\n });\n return obj;\n };\n\n v.extend(validate, {\n // This is the version of the library as a semver.\n // The toString function will allow it to be coerced into a string\n version: {\n major: 0,\n minor: 12,\n patch: 0,\n metadata: null,\n toString: function() {\n var version = v.format(\"%{major}.%{minor}.%{patch}\", v.version);\n if (!v.isEmpty(v.version.metadata)) {\n version += \"+\" + v.version.metadata;\n }\n return version;\n }\n },\n\n // Below is the dependencies that are used in validate.js\n\n // The constructor of the Promise implementation.\n // If you are using Q.js, RSVP or any other A+ compatible implementation\n // override this attribute to be the constructor of that promise.\n // Since jQuery promises aren't A+ compatible they won't work.\n Promise: typeof Promise !== \"undefined\" ? Promise : /* istanbul ignore next */ null,\n\n EMPTY_STRING_REGEXP: /^\\s*$/,\n\n // Runs the validators specified by the constraints object.\n // Will return an array of the format:\n // [{attribute: \"\", error: \"\"}, ...]\n runValidations: function(attributes, constraints, options) {\n var results = []\n , attr\n , validatorName\n , value\n , validators\n , validator\n , validatorOptions\n , error;\n\n if (v.isDomElement(attributes) || v.isJqueryElement(attributes)) {\n attributes = v.collectFormValues(attributes);\n }\n\n // Loops through each constraints, finds the correct validator and run it.\n for (attr in constraints) {\n value = v.getDeepObjectValue(attributes, attr);\n // This allows the constraints for an attribute to be a function.\n // The function will be called with the value, attribute name, the complete dict of\n // attributes as well as the options and constraints passed in.\n // This is useful when you want to have different\n // validations depending on the attribute value.\n validators = v.result(constraints[attr], value, attributes, attr, options, constraints);\n\n for (validatorName in validators) {\n validator = v.validators[validatorName];\n\n if (!validator) {\n error = v.format(\"Unknown validator %{name}\", {name: validatorName});\n throw new Error(error);\n }\n\n validatorOptions = validators[validatorName];\n // This allows the options to be a function. The function will be\n // called with the value, attribute name, the complete dict of\n // attributes as well as the options and constraints passed in.\n // This is useful when you want to have different\n // validations depending on the attribute value.\n validatorOptions = v.result(validatorOptions, value, attributes, attr, options, constraints);\n if (!validatorOptions) {\n continue;\n }\n results.push({\n attribute: attr,\n value: value,\n validator: validatorName,\n globalOptions: options,\n attributes: attributes,\n options: validatorOptions,\n error: validator.call(validator,\n value,\n validatorOptions,\n attr,\n attributes,\n options)\n });\n }\n }\n\n return results;\n },\n\n // Takes the output from runValidations and converts it to the correct\n // output format.\n processValidationResults: function(errors, options) {\n errors = v.pruneEmptyErrors(errors, options);\n errors = v.expandMultipleErrors(errors, options);\n errors = v.convertErrorMessages(errors, options);\n\n var format = options.format || \"grouped\";\n\n if (typeof v.formatters[format] === 'function') {\n errors = v.formatters[format](errors);\n } else {\n throw new Error(v.format(\"Unknown format %{format}\", options));\n }\n\n return v.isEmpty(errors) ? undefined : errors;\n },\n\n // Runs the validations with support for promises.\n // This function will return a promise that is settled when all the\n // validation promises have been completed.\n // It can be called even if no validations returned a promise.\n async: function(attributes, constraints, options) {\n options = v.extend({}, v.async.options, options);\n\n var WrapErrors = options.wrapErrors || function(errors) {\n return errors;\n };\n\n // Removes unknown attributes\n if (options.cleanAttributes !== false) {\n attributes = v.cleanAttributes(attributes, constraints);\n }\n\n var results = v.runValidations(attributes, constraints, options);\n\n return new v.Promise(function(resolve, reject) {\n v.waitForResults(results).then(function() {\n var errors = v.processValidationResults(results, options);\n if (errors) {\n reject(new WrapErrors(errors, options, attributes, constraints));\n } else {\n resolve(attributes);\n }\n }, function(err) {\n reject(err);\n });\n });\n },\n\n single: function(value, constraints, options) {\n options = v.extend({}, v.single.options, options, {\n format: \"flat\",\n fullMessages: false\n });\n return v({single: value}, {single: constraints}, options);\n },\n\n // Returns a promise that is resolved when all promises in the results array\n // are settled. The promise returned from this function is always resolved,\n // never rejected.\n // This function modifies the input argument, it replaces the promises\n // with the value returned from the promise.\n waitForResults: function(results) {\n // Create a sequence of all the results starting with a resolved promise.\n return results.reduce(function(memo, result) {\n // If this result isn't a promise skip it in the sequence.\n if (!v.isPromise(result.error)) {\n return memo;\n }\n\n return memo.then(function() {\n return result.error.then(function(error) {\n result.error = error || null;\n });\n });\n }, new v.Promise(function(r) { r(); })); // A resolved promise\n },\n\n // If the given argument is a call: function the and: function return the value\n // otherwise just return the value. Additional arguments will be passed as\n // arguments to the function.\n // Example:\n // ```\n // result('foo') // 'foo'\n // result(Math.max, 1, 2) // 2\n // ```\n result: function(value) {\n var args = [].slice.call(arguments, 1);\n if (typeof value === 'function') {\n value = value.apply(null, args);\n }\n return value;\n },\n\n // Checks if the value is a number. This function does not consider NaN a\n // number like many other `isNumber` functions do.\n isNumber: function(value) {\n return typeof value === 'number' && !isNaN(value);\n },\n\n // Returns false if the object is not a function\n isFunction: function(value) {\n return typeof value === 'function';\n },\n\n // A simple check to verify that the value is an integer. Uses `isNumber`\n // and a simple modulo check.\n isInteger: function(value) {\n return v.isNumber(value) && value % 1 === 0;\n },\n\n // Checks if the value is a boolean\n isBoolean: function(value) {\n return typeof value === 'boolean';\n },\n\n // Uses the `Object` function to check if the given argument is an object.\n isObject: function(obj) {\n return obj === Object(obj);\n },\n\n // Simply checks if the object is an instance of a date\n isDate: function(obj) {\n return obj instanceof Date;\n },\n\n // Returns false if the object is `null` of `undefined`\n isDefined: function(obj) {\n return obj !== null && obj !== undefined;\n },\n\n // Checks if the given argument is a promise. Anything with a `then`\n // function is considered a promise.\n isPromise: function(p) {\n return !!p && v.isFunction(p.then);\n },\n\n isJqueryElement: function(o) {\n return o && v.isString(o.jquery);\n },\n\n isDomElement: function(o) {\n if (!o) {\n return false;\n }\n\n if (!o.querySelectorAll || !o.querySelector) {\n return false;\n }\n\n if (v.isObject(document) && o === document) {\n return true;\n }\n\n // http://stackoverflow.com/a/384380/699304\n /* istanbul ignore else */\n if (typeof HTMLElement === \"object\") {\n return o instanceof HTMLElement;\n } else {\n return o &&\n typeof o === \"object\" &&\n o !== null &&\n o.nodeType === 1 &&\n typeof o.nodeName === \"string\";\n }\n },\n\n isEmpty: function(value) {\n var attr;\n\n // Null and undefined are empty\n if (!v.isDefined(value)) {\n return true;\n }\n\n // functions are non empty\n if (v.isFunction(value)) {\n return false;\n }\n\n // Whitespace only strings are empty\n if (v.isString(value)) {\n return v.EMPTY_STRING_REGEXP.test(value);\n }\n\n // For arrays we use the length property\n if (v.isArray(value)) {\n return value.length === 0;\n }\n\n // Dates have no attributes but aren't empty\n if (v.isDate(value)) {\n return false;\n }\n\n // If we find at least one property we consider it non empty\n if (v.isObject(value)) {\n for (attr in value) {\n return false;\n }\n return true;\n }\n\n return false;\n },\n\n // Formats the specified strings with the given values like so:\n // ```\n // format(\"Foo: %{foo}\", {foo: \"bar\"}) // \"Foo bar\"\n // ```\n // If you want to write %{...} without having it replaced simply\n // prefix it with % like this `Foo: %%{foo}` and it will be returned\n // as `\"Foo: %{foo}\"`\n format: v.extend(function(str, vals) {\n if (!v.isString(str)) {\n return str;\n }\n return str.replace(v.format.FORMAT_REGEXP, function(m0, m1, m2) {\n if (m1 === '%') {\n return \"%{\" + m2 + \"}\";\n } else {\n return String(vals[m2]);\n }\n });\n }, {\n // Finds %{key} style patterns in the given string\n FORMAT_REGEXP: /(%?)%\\{([^\\}]+)\\}/g\n }),\n\n // \"Prettifies\" the given string.\n // Prettifying means replacing [.\\_-] with spaces as well as splitting\n // camel case words.\n prettify: function(str) {\n if (v.isNumber(str)) {\n // If there are more than 2 decimals round it to two\n if ((str * 100) % 1 === 0) {\n return \"\" + str;\n } else {\n return parseFloat(Math.round(str * 100) / 100).toFixed(2);\n }\n }\n\n if (v.isArray(str)) {\n return str.map(function(s) { return v.prettify(s); }).join(\", \");\n }\n\n if (v.isObject(str)) {\n return str.toString();\n }\n\n // Ensure the string is actually a string\n str = \"\" + str;\n\n return str\n // Splits keys separated by periods\n .replace(/([^\\s])\\.([^\\s])/g, '$1 $2')\n // Removes backslashes\n .replace(/\\\\+/g, '')\n // Replaces - and - with space\n .replace(/[_-]/g, ' ')\n // Splits camel cased words\n .replace(/([a-z])([A-Z])/g, function(m0, m1, m2) {\n return \"\" + m1 + \" \" + m2.toLowerCase();\n })\n .toLowerCase();\n },\n\n stringifyValue: function(value, options) {\n var prettify = options && options.prettify || v.prettify;\n return prettify(value);\n },\n\n isString: function(value) {\n return typeof value === 'string';\n },\n\n isArray: function(value) {\n return {}.toString.call(value) === '[object Array]';\n },\n\n // Checks if the object is a hash, which is equivalent to an object that\n // is neither an array nor a function.\n isHash: function(value) {\n return v.isObject(value) && !v.isArray(value) && !v.isFunction(value);\n },\n\n contains: function(obj, value) {\n if (!v.isDefined(obj)) {\n return false;\n }\n if (v.isArray(obj)) {\n return obj.indexOf(value) !== -1;\n }\n return value in obj;\n },\n\n unique: function(array) {\n if (!v.isArray(array)) {\n return array;\n }\n return array.filter(function(el, index, array) {\n return array.indexOf(el) == index;\n });\n },\n\n forEachKeyInKeypath: function(object, keypath, callback) {\n if (!v.isString(keypath)) {\n return undefined;\n }\n\n var key = \"\"\n , i\n , escape = false;\n\n for (i = 0; i < keypath.length; ++i) {\n switch (keypath[i]) {\n case '.':\n if (escape) {\n escape = false;\n key += '.';\n } else {\n object = callback(object, key, false);\n key = \"\";\n }\n break;\n\n case '\\\\':\n if (escape) {\n escape = false;\n key += '\\\\';\n } else {\n escape = true;\n }\n break;\n\n default:\n escape = false;\n key += keypath[i];\n break;\n }\n }\n\n return callback(object, key, true);\n },\n\n getDeepObjectValue: function(obj, keypath) {\n if (!v.isObject(obj)) {\n return undefined;\n }\n\n return v.forEachKeyInKeypath(obj, keypath, function(obj, key) {\n if (v.isObject(obj)) {\n return obj[key];\n }\n });\n },\n\n // This returns an object with all the values of the form.\n // It uses the input name as key and the value as value\n // So for example this:\n // \n // would return:\n // {email: \"foo@bar.com\"}\n collectFormValues: function(form, options) {\n var values = {}\n , i\n , j\n , input\n , inputs\n , option\n , value;\n\n if (v.isJqueryElement(form)) {\n form = form[0];\n }\n\n if (!form) {\n return values;\n }\n\n options = options || {};\n\n inputs = form.querySelectorAll(\"input[name], textarea[name]\");\n for (i = 0; i < inputs.length; ++i) {\n input = inputs.item(i);\n\n if (v.isDefined(input.getAttribute(\"data-ignored\"))) {\n continue;\n }\n\n name = input.name.replace(/\\./g, \"\\\\\\\\.\");\n value = v.sanitizeFormValue(input.value, options);\n if (input.type === \"number\") {\n value = value ? +value : null;\n } else if (input.type === \"checkbox\") {\n if (input.attributes.value) {\n if (!input.checked) {\n value = values[name] || null;\n }\n } else {\n value = input.checked;\n }\n } else if (input.type === \"radio\") {\n if (!input.checked) {\n value = values[name] || null;\n }\n }\n values[name] = value;\n }\n\n inputs = form.querySelectorAll(\"select[name]\");\n for (i = 0; i < inputs.length; ++i) {\n input = inputs.item(i);\n if (v.isDefined(input.getAttribute(\"data-ignored\"))) {\n continue;\n }\n\n if (input.multiple) {\n value = [];\n for (j in input.options) {\n option = input.options[j];\n if (option && option.selected) {\n value.push(v.sanitizeFormValue(option.value, options));\n }\n }\n } else {\n var _val = typeof input.options[input.selectedIndex] !== 'undefined' ? input.options[input.selectedIndex].value : '';\n value = v.sanitizeFormValue(_val, options);\n }\n values[input.name] = value;\n }\n\n return values;\n },\n\n sanitizeFormValue: function(value, options) {\n if (options.trim && v.isString(value)) {\n value = value.trim();\n }\n\n if (options.nullify !== false && value === \"\") {\n return null;\n }\n return value;\n },\n\n capitalize: function(str) {\n if (!v.isString(str)) {\n return str;\n }\n return str[0].toUpperCase() + str.slice(1);\n },\n\n // Remove all errors who's error attribute is empty (null or undefined)\n pruneEmptyErrors: function(errors) {\n return errors.filter(function(error) {\n return !v.isEmpty(error.error);\n });\n },\n\n // In\n // [{error: [\"err1\", \"err2\"], ...}]\n // Out\n // [{error: \"err1\", ...}, {error: \"err2\", ...}]\n //\n // All attributes in an error with multiple messages are duplicated\n // when expanding the errors.\n expandMultipleErrors: function(errors) {\n var ret = [];\n errors.forEach(function(error) {\n // Removes errors without a message\n if (v.isArray(error.error)) {\n error.error.forEach(function(msg) {\n ret.push(v.extend({}, error, {error: msg}));\n });\n } else {\n ret.push(error);\n }\n });\n return ret;\n },\n\n // Converts the error mesages by prepending the attribute name unless the\n // message is prefixed by ^\n convertErrorMessages: function(errors, options) {\n options = options || {};\n\n var ret = []\n , prettify = options.prettify || v.prettify;\n errors.forEach(function(errorInfo) {\n var error = v.result(errorInfo.error,\n errorInfo.value,\n errorInfo.attribute,\n errorInfo.options,\n errorInfo.attributes,\n errorInfo.globalOptions);\n\n if (!v.isString(error)) {\n ret.push(errorInfo);\n return;\n }\n\n if (error[0] === '^') {\n error = error.slice(1);\n } else if (options.fullMessages !== false) {\n error = v.capitalize(prettify(errorInfo.attribute)) + \" \" + error;\n }\n error = error.replace(/\\\\\\^/g, \"^\");\n error = v.format(error, {\n value: v.stringifyValue(errorInfo.value, options)\n });\n ret.push(v.extend({}, errorInfo, {error: error}));\n });\n return ret;\n },\n\n // In:\n // [{attribute: \"\", ...}]\n // Out:\n // {\"\": [{attribute: \"\", ...}]}\n groupErrorsByAttribute: function(errors) {\n var ret = {};\n errors.forEach(function(error) {\n var list = ret[error.attribute];\n if (list) {\n list.push(error);\n } else {\n ret[error.attribute] = [error];\n }\n });\n return ret;\n },\n\n // In:\n // [{error: \"\", ...}, {error: \"\", ...}]\n // Out:\n // [\"\", \"\"]\n flattenErrorsToArray: function(errors) {\n return errors\n .map(function(error) { return error.error; })\n .filter(function(value, index, self) {\n return self.indexOf(value) === index;\n });\n },\n\n cleanAttributes: function(attributes, whitelist) {\n function whitelistCreator(obj, key, last) {\n if (v.isObject(obj[key])) {\n return obj[key];\n }\n return (obj[key] = last ? true : {});\n }\n\n function buildObjectWhitelist(whitelist) {\n var ow = {}\n , lastObject\n , attr;\n for (attr in whitelist) {\n if (!whitelist[attr]) {\n continue;\n }\n v.forEachKeyInKeypath(ow, attr, whitelistCreator);\n }\n return ow;\n }\n\n function cleanRecursive(attributes, whitelist) {\n if (!v.isObject(attributes)) {\n return attributes;\n }\n\n var ret = v.extend({}, attributes)\n , w\n , attribute;\n\n for (attribute in attributes) {\n w = whitelist[attribute];\n\n if (v.isObject(w)) {\n ret[attribute] = cleanRecursive(ret[attribute], w);\n } else if (!w) {\n delete ret[attribute];\n }\n }\n return ret;\n }\n\n if (!v.isObject(whitelist) || !v.isObject(attributes)) {\n return {};\n }\n\n whitelist = buildObjectWhitelist(whitelist);\n return cleanRecursive(attributes, whitelist);\n },\n\n exposeModule: function(validate, root, exports, module, define) {\n if (exports) {\n if (module && module.exports) {\n exports = module.exports = validate;\n }\n exports.validate = validate;\n } else {\n root.validate = validate;\n if (validate.isFunction(define) && define.amd) {\n define([], function () { return validate; });\n }\n }\n },\n\n warn: function(msg) {\n if (typeof console !== \"undefined\" && console.warn) {\n console.warn(\"[validate.js] \" + msg);\n }\n },\n\n error: function(msg) {\n if (typeof console !== \"undefined\" && console.error) {\n console.error(\"[validate.js] \" + msg);\n }\n }\n });\n\n validate.validators = {\n // Presence validates that the value isn't empty\n presence: function(value, options) {\n options = v.extend({}, this.options, options);\n if (options.allowEmpty !== false ? !v.isDefined(value) : v.isEmpty(value)) {\n return options.message || this.message || \"can't be blank\";\n }\n },\n length: function(value, options, attribute) {\n // Empty values are allowed\n if (!v.isDefined(value)) {\n return;\n }\n\n options = v.extend({}, this.options, options);\n\n var is = options.is\n , maximum = options.maximum\n , minimum = options.minimum\n , tokenizer = options.tokenizer || function(val) { return val; }\n , err\n , errors = [];\n\n value = tokenizer(value);\n var length = value.length;\n if(!v.isNumber(length)) {\n v.error(v.format(\"Attribute %{attr} has a non numeric value for `length`\", {attr: attribute}));\n return options.message || this.notValid || \"has an incorrect length\";\n }\n\n // Is checks\n if (v.isNumber(is) && length !== is) {\n err = options.wrongLength ||\n this.wrongLength ||\n \"is the wrong length (should be %{count} characters)\";\n errors.push(v.format(err, {count: is}));\n }\n\n if (v.isNumber(minimum) && length < minimum) {\n err = options.tooShort ||\n this.tooShort ||\n \"is too short (minimum is %{count} characters)\";\n errors.push(v.format(err, {count: minimum}));\n }\n\n if (v.isNumber(maximum) && length > maximum) {\n err = options.tooLong ||\n this.tooLong ||\n \"is too long (maximum is %{count} characters)\";\n errors.push(v.format(err, {count: maximum}));\n }\n\n if (errors.length > 0) {\n return options.message || errors;\n }\n },\n numericality: function(value, options, attribute, attributes, globalOptions) {\n // Empty values are fine\n if (!v.isDefined(value)) {\n return;\n }\n\n options = v.extend({}, this.options, options);\n\n var errors = []\n , name\n , count\n , checks = {\n greaterThan: function(v, c) { return v > c; },\n greaterThanOrEqualTo: function(v, c) { return v >= c; },\n equalTo: function(v, c) { return v === c; },\n lessThan: function(v, c) { return v < c; },\n lessThanOrEqualTo: function(v, c) { return v <= c; },\n divisibleBy: function(v, c) { return v % c === 0; }\n }\n , prettify = options.prettify ||\n (globalOptions && globalOptions.prettify) ||\n v.prettify;\n\n // Strict will check that it is a valid looking number\n if (v.isString(value) && options.strict) {\n var pattern = \"^-?(0|[1-9]\\\\d*)\";\n if (!options.onlyInteger) {\n pattern += \"(\\\\.\\\\d+)?\";\n }\n pattern += \"$\";\n\n if (!(new RegExp(pattern).test(value))) {\n return options.message ||\n options.notValid ||\n this.notValid ||\n this.message ||\n \"must be a valid number\";\n }\n }\n\n // Coerce the value to a number unless we're being strict.\n if (options.noStrings !== true && v.isString(value) && !v.isEmpty(value)) {\n value = +value;\n }\n\n // If it's not a number we shouldn't continue since it will compare it.\n if (!v.isNumber(value)) {\n return options.message ||\n options.notValid ||\n this.notValid ||\n this.message ||\n \"is not a number\";\n }\n\n // Same logic as above, sort of. Don't bother with comparisons if this\n // doesn't pass.\n if (options.onlyInteger && !v.isInteger(value)) {\n return options.message ||\n options.notInteger ||\n this.notInteger ||\n this.message ||\n \"must be an integer\";\n }\n\n for (name in checks) {\n count = options[name];\n if (v.isNumber(count) && !checks[name](value, count)) {\n // This picks the default message if specified\n // For example the greaterThan check uses the message from\n // this.notGreaterThan so we capitalize the name and prepend \"not\"\n var key = \"not\" + v.capitalize(name);\n var msg = options[key] ||\n this[key] ||\n this.message ||\n \"must be %{type} %{count}\";\n\n errors.push(v.format(msg, {\n count: count,\n type: prettify(name)\n }));\n }\n }\n\n if (options.odd && value % 2 !== 1) {\n errors.push(options.notOdd ||\n this.notOdd ||\n this.message ||\n \"must be odd\");\n }\n if (options.even && value % 2 !== 0) {\n errors.push(options.notEven ||\n this.notEven ||\n this.message ||\n \"must be even\");\n }\n\n if (errors.length) {\n return options.message || errors;\n }\n },\n datetime: v.extend(function(value, options) {\n if (!v.isFunction(this.parse) || !v.isFunction(this.format)) {\n throw new Error(\"Both the parse and format functions needs to be set to use the datetime/date validator\");\n }\n\n // Empty values are fine\n if (!v.isDefined(value)) {\n return;\n }\n\n options = v.extend({}, this.options, options);\n\n var err\n , errors = []\n , earliest = options.earliest ? this.parse(options.earliest, options) : NaN\n , latest = options.latest ? this.parse(options.latest, options) : NaN;\n\n value = this.parse(value, options);\n\n // 86400000 is the number of milliseconds in a day, this is used to remove\n // the time from the date\n if (isNaN(value) || options.dateOnly && value % 86400000 !== 0) {\n err = options.notValid ||\n options.message ||\n this.notValid ||\n \"must be a valid date\";\n return v.format(err, {value: arguments[0]});\n }\n\n if (!isNaN(earliest) && value < earliest) {\n err = options.tooEarly ||\n options.message ||\n this.tooEarly ||\n \"must be no earlier than %{date}\";\n err = v.format(err, {\n value: this.format(value, options),\n date: this.format(earliest, options)\n });\n errors.push(err);\n }\n\n if (!isNaN(latest) && value > latest) {\n err = options.tooLate ||\n options.message ||\n this.tooLate ||\n \"must be no later than %{date}\";\n err = v.format(err, {\n date: this.format(latest, options),\n value: this.format(value, options)\n });\n errors.push(err);\n }\n\n if (errors.length) {\n return v.unique(errors);\n }\n }, {\n parse: null,\n format: null\n }),\n date: function(value, options) {\n options = v.extend({}, options, {dateOnly: true});\n return v.validators.datetime.call(v.validators.datetime, value, options);\n },\n format: function(value, options) {\n if (v.isString(options) || (options instanceof RegExp)) {\n options = {pattern: options};\n }\n\n options = v.extend({}, this.options, options);\n\n var message = options.message || this.message || \"is invalid\"\n , pattern = options.pattern\n , match;\n\n // Empty values are allowed\n if (!v.isDefined(value)) {\n return;\n }\n if (!v.isString(value)) {\n return message;\n }\n\n if (v.isString(pattern)) {\n pattern = new RegExp(options.pattern, options.flags);\n }\n match = pattern.exec(value);\n if (!match || match[0].length != value.length) {\n return message;\n }\n },\n inclusion: function(value, options) {\n // Empty values are fine\n if (!v.isDefined(value)) {\n return;\n }\n if (v.isArray(options)) {\n options = {within: options};\n }\n options = v.extend({}, this.options, options);\n if (v.contains(options.within, value)) {\n return;\n }\n var message = options.message ||\n this.message ||\n \"^%{value} is not included in the list\";\n return v.format(message, {value: value});\n },\n exclusion: function(value, options) {\n // Empty values are fine\n if (!v.isDefined(value)) {\n return;\n }\n if (v.isArray(options)) {\n options = {within: options};\n }\n options = v.extend({}, this.options, options);\n if (!v.contains(options.within, value)) {\n return;\n }\n var message = options.message || this.message || \"^%{value} is restricted\";\n return v.format(message, {value: value});\n },\n email: v.extend(function(value, options) {\n options = v.extend({}, this.options, options);\n var message = options.message || this.message || \"is not a valid email\";\n // Empty values are fine\n if (!v.isDefined(value)) {\n return;\n }\n if (!v.isString(value)) {\n return message;\n }\n if (!this.PATTERN.exec(value)) {\n return message;\n }\n }, {\n PATTERN: /^[a-z0-9\\u007F-\\uffff!#$%&'*+\\/=?^_`{|}~-]+(?:\\.[a-z0-9\\u007F-\\uffff!#$%&'*+\\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z]{2,}$/i\n }),\n equality: function(value, options, attribute, attributes, globalOptions) {\n if (!v.isDefined(value)) {\n return;\n }\n\n if (v.isString(options)) {\n options = {attribute: options};\n }\n options = v.extend({}, this.options, options);\n var message = options.message ||\n this.message ||\n \"is not equal to %{attribute}\";\n\n if (v.isEmpty(options.attribute) || !v.isString(options.attribute)) {\n throw new Error(\"The attribute must be a non empty string\");\n }\n\n var otherValue = v.getDeepObjectValue(attributes, options.attribute)\n , comparator = options.comparator || function(v1, v2) {\n return v1 === v2;\n }\n , prettify = options.prettify ||\n (globalOptions && globalOptions.prettify) ||\n v.prettify;\n\n if (!comparator(value, otherValue, options, attribute, attributes)) {\n return v.format(message, {attribute: prettify(options.attribute)});\n }\n },\n\n // A URL validator that is used to validate URLs with the ability to\n // restrict schemes and some domains.\n url: function(value, options) {\n if (!v.isDefined(value)) {\n return;\n }\n\n options = v.extend({}, this.options, options);\n\n var message = options.message || this.message || \"is not a valid url\"\n , schemes = options.schemes || this.schemes || ['http', 'https']\n , allowLocal = options.allowLocal || this.allowLocal || false;\n\n if (!v.isString(value)) {\n return message;\n }\n\n // https://gist.github.com/dperini/729294\n var regex =\n \"^\" +\n // protocol identifier\n \"(?:(?:\" + schemes.join(\"|\") + \")://)\" +\n // user:pass authentication\n \"(?:\\\\S+(?::\\\\S*)?@)?\" +\n \"(?:\";\n\n var tld = \"(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff]{2,}))\";\n\n if (allowLocal) {\n tld += \"?\";\n } else {\n regex +=\n // IP address exclusion\n // private & local networks\n \"(?!(?:10|127)(?:\\\\.\\\\d{1,3}){3})\" +\n \"(?!(?:169\\\\.254|192\\\\.168)(?:\\\\.\\\\d{1,3}){2})\" +\n \"(?!172\\\\.(?:1[6-9]|2\\\\d|3[0-1])(?:\\\\.\\\\d{1,3}){2})\";\n }\n\n regex +=\n // IP address dotted notation octets\n // excludes loopback network 0.0.0.0\n // excludes reserved space >= 224.0.0.0\n // excludes network & broacast addresses\n // (first & last IP address of each class)\n \"(?:[1-9]\\\\d?|1\\\\d\\\\d|2[01]\\\\d|22[0-3])\" +\n \"(?:\\\\.(?:1?\\\\d{1,2}|2[0-4]\\\\d|25[0-5])){2}\" +\n \"(?:\\\\.(?:[1-9]\\\\d?|1\\\\d\\\\d|2[0-4]\\\\d|25[0-4]))\" +\n \"|\" +\n // host name\n \"(?:(?:[a-z\\\\u00a1-\\\\uffff0-9]-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)\" +\n // domain name\n \"(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff0-9]-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)*\" +\n tld +\n \")\" +\n // port number\n \"(?::\\\\d{2,5})?\" +\n // resource path\n \"(?:[/?#]\\\\S*)?\" +\n \"$\";\n\n var PATTERN = new RegExp(regex, 'i');\n if (!PATTERN.exec(value)) {\n return message;\n }\n }\n };\n\n validate.formatters = {\n detailed: function(errors) {return errors;},\n flat: v.flattenErrorsToArray,\n grouped: function(errors) {\n var attr;\n\n errors = v.groupErrorsByAttribute(errors);\n for (attr in errors) {\n errors[attr] = v.flattenErrorsToArray(errors[attr]);\n }\n return errors;\n },\n constraint: function(errors) {\n var attr;\n errors = v.groupErrorsByAttribute(errors);\n for (attr in errors) {\n errors[attr] = errors[attr].map(function(result) {\n return result.validator;\n }).sort();\n }\n return errors;\n }\n };\n\n validate.exposeModule(validate, this, exports, module, define);\n}).call(this,\n typeof exports !== 'undefined' ? /* istanbul ignore next */ exports : null,\n typeof module !== 'undefined' ? /* istanbul ignore next */ module : null,\n typeof define !== 'undefined' ? /* istanbul ignore next */ define : null);\n","var baseIsNative = require('./_baseIsNative'),\n getValue = require('./_getValue');\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n","function _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return self;\n}\n\nmodule.exports = _assertThisInitialized;","var Symbol = require('./_Symbol'),\n getRawTag = require('./_getRawTag'),\n objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n","'use strict';\n\n\nmodule.exports = {\n copy: copy,\n checkDataType: checkDataType,\n checkDataTypes: checkDataTypes,\n coerceToTypes: coerceToTypes,\n toHash: toHash,\n getProperty: getProperty,\n escapeQuotes: escapeQuotes,\n equal: require('fast-deep-equal'),\n ucs2length: require('./ucs2length'),\n varOccurences: varOccurences,\n varReplace: varReplace,\n cleanUpCode: cleanUpCode,\n finalCleanUpCode: finalCleanUpCode,\n schemaHasRules: schemaHasRules,\n schemaHasRulesExcept: schemaHasRulesExcept,\n schemaUnknownRules: schemaUnknownRules,\n toQuotedString: toQuotedString,\n getPathExpr: getPathExpr,\n getPath: getPath,\n getData: getData,\n unescapeFragment: unescapeFragment,\n unescapeJsonPointer: unescapeJsonPointer,\n escapeFragment: escapeFragment,\n escapeJsonPointer: escapeJsonPointer\n};\n\n\nfunction copy(o, to) {\n to = to || {};\n for (var key in o) to[key] = o[key];\n return to;\n}\n\n\nfunction checkDataType(dataType, data, negate) {\n var EQUAL = negate ? ' !== ' : ' === '\n , AND = negate ? ' || ' : ' && '\n , OK = negate ? '!' : ''\n , NOT = negate ? '' : '!';\n switch (dataType) {\n case 'null': return data + EQUAL + 'null';\n case 'array': return OK + 'Array.isArray(' + data + ')';\n case 'object': return '(' + OK + data + AND +\n 'typeof ' + data + EQUAL + '\"object\"' + AND +\n NOT + 'Array.isArray(' + data + '))';\n case 'integer': return '(typeof ' + data + EQUAL + '\"number\"' + AND +\n NOT + '(' + data + ' % 1)' +\n AND + data + EQUAL + data + ')';\n default: return 'typeof ' + data + EQUAL + '\"' + dataType + '\"';\n }\n}\n\n\nfunction checkDataTypes(dataTypes, data) {\n switch (dataTypes.length) {\n case 1: return checkDataType(dataTypes[0], data, true);\n default:\n var code = '';\n var types = toHash(dataTypes);\n if (types.array && types.object) {\n code = types.null ? '(': '(!' + data + ' || ';\n code += 'typeof ' + data + ' !== \"object\")';\n delete types.null;\n delete types.array;\n delete types.object;\n }\n if (types.number) delete types.integer;\n for (var t in types)\n code += (code ? ' && ' : '' ) + checkDataType(t, data, true);\n\n return code;\n }\n}\n\n\nvar COERCE_TO_TYPES = toHash([ 'string', 'number', 'integer', 'boolean', 'null' ]);\nfunction coerceToTypes(optionCoerceTypes, dataTypes) {\n if (Array.isArray(dataTypes)) {\n var types = [];\n for (var i=0; i= lvl) throw new Error('Cannot access property/index ' + up + ' levels up, current level is ' + lvl);\n return paths[lvl - up];\n }\n\n if (up > lvl) throw new Error('Cannot access data ' + up + ' levels up, current level is ' + lvl);\n data = 'data' + ((lvl - up) || '');\n if (!jsonPointer) return data;\n }\n\n var expr = data;\n var segments = jsonPointer.split('/');\n for (var i=0; i true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nmodule.exports = eq;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n","var assignValue = require('./_assignValue'),\n baseAssignValue = require('./_baseAssignValue');\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object, customizer) {\n var isNew = !object;\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n\n var newValue = customizer\n ? customizer(object[key], source[key], key, object, source)\n : undefined;\n\n if (newValue === undefined) {\n newValue = source[key];\n }\n if (isNew) {\n baseAssignValue(object, key, newValue);\n } else {\n assignValue(object, key, newValue);\n }\n }\n return object;\n}\n\nmodule.exports = copyObject;\n","module.exports = __WEBPACK_EXTERNAL_MODULE__28__;","var ListCache = require('./_ListCache'),\n stackClear = require('./_stackClear'),\n stackDelete = require('./_stackDelete'),\n stackGet = require('./_stackGet'),\n stackHas = require('./_stackHas'),\n stackSet = require('./_stackSet');\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nmodule.exports = Stack;\n","var listCacheClear = require('./_listCacheClear'),\n listCacheDelete = require('./_listCacheDelete'),\n listCacheGet = require('./_listCacheGet'),\n listCacheHas = require('./_listCacheHas'),\n listCacheSet = require('./_listCacheSet');\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nmodule.exports = ListCache;\n","var eq = require('./eq');\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\nmodule.exports = assocIndexOf;\n","var getNative = require('./_getNative');\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nmodule.exports = nativeCreate;\n","var isKeyable = require('./_isKeyable');\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\nmodule.exports = getMapData;\n","var arrayLikeKeys = require('./_arrayLikeKeys'),\n baseKeys = require('./_baseKeys'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nmodule.exports = keys;\n","var root = require('./_root'),\n stubFalse = require('./stubFalse');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nmodule.exports = isBuffer;\n","module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n","var isFunction = require('./isFunction'),\n isLength = require('./isLength');\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nmodule.exports = isArrayLike;\n","var arrayLikeKeys = require('./_arrayLikeKeys'),\n baseKeysIn = require('./_baseKeysIn'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\nmodule.exports = keysIn;\n","var DataView = require('./_DataView'),\n Map = require('./_Map'),\n Promise = require('./_Promise'),\n Set = require('./_Set'),\n WeakMap = require('./_WeakMap'),\n baseGetTag = require('./_baseGetTag'),\n toSource = require('./_toSource');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n setTag = '[object Set]',\n weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = baseGetTag(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : '';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n}\n\nmodule.exports = getTag;\n","var isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = toKey;\n","'use strict';\nconst strictUriEncode = require('strict-uri-encode');\nconst decodeComponent = require('decode-uri-component');\nconst splitOnFirst = require('split-on-first');\n\nconst isNullOrUndefined = value => value === null || value === undefined;\n\nfunction encoderForArrayFormat(options) {\n\tswitch (options.arrayFormat) {\n\t\tcase 'index':\n\t\t\treturn key => (result, value) => {\n\t\t\t\tconst index = result.length;\n\n\t\t\t\tif (\n\t\t\t\t\tvalue === undefined ||\n\t\t\t\t\t(options.skipNull && value === null) ||\n\t\t\t\t\t(options.skipEmptyString && value === '')\n\t\t\t\t) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\n\t\t\t\tif (value === null) {\n\t\t\t\t\treturn [...result, [encode(key, options), '[', index, ']'].join('')];\n\t\t\t\t}\n\n\t\t\t\treturn [\n\t\t\t\t\t...result,\n\t\t\t\t\t[encode(key, options), '[', encode(index, options), ']=', encode(value, options)].join('')\n\t\t\t\t];\n\t\t\t};\n\n\t\tcase 'bracket':\n\t\t\treturn key => (result, value) => {\n\t\t\t\tif (\n\t\t\t\t\tvalue === undefined ||\n\t\t\t\t\t(options.skipNull && value === null) ||\n\t\t\t\t\t(options.skipEmptyString && value === '')\n\t\t\t\t) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\n\t\t\t\tif (value === null) {\n\t\t\t\t\treturn [...result, [encode(key, options), '[]'].join('')];\n\t\t\t\t}\n\n\t\t\t\treturn [...result, [encode(key, options), '[]=', encode(value, options)].join('')];\n\t\t\t};\n\n\t\tcase 'comma':\n\t\tcase 'separator':\n\t\t\treturn key => (result, value) => {\n\t\t\t\tif (value === null || value === undefined || value.length === 0) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\n\t\t\t\tif (result.length === 0) {\n\t\t\t\t\treturn [[encode(key, options), '=', encode(value, options)].join('')];\n\t\t\t\t}\n\n\t\t\t\treturn [[result, encode(value, options)].join(options.arrayFormatSeparator)];\n\t\t\t};\n\n\t\tdefault:\n\t\t\treturn key => (result, value) => {\n\t\t\t\tif (\n\t\t\t\t\tvalue === undefined ||\n\t\t\t\t\t(options.skipNull && value === null) ||\n\t\t\t\t\t(options.skipEmptyString && value === '')\n\t\t\t\t) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\n\t\t\t\tif (value === null) {\n\t\t\t\t\treturn [...result, encode(key, options)];\n\t\t\t\t}\n\n\t\t\t\treturn [...result, [encode(key, options), '=', encode(value, options)].join('')];\n\t\t\t};\n\t}\n}\n\nfunction parserForArrayFormat(options) {\n\tlet result;\n\n\tswitch (options.arrayFormat) {\n\t\tcase 'index':\n\t\t\treturn (key, value, accumulator) => {\n\t\t\t\tresult = /\\[(\\d*)\\]$/.exec(key);\n\n\t\t\t\tkey = key.replace(/\\[\\d*\\]$/, '');\n\n\t\t\t\tif (!result) {\n\t\t\t\t\taccumulator[key] = value;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (accumulator[key] === undefined) {\n\t\t\t\t\taccumulator[key] = {};\n\t\t\t\t}\n\n\t\t\t\taccumulator[key][result[1]] = value;\n\t\t\t};\n\n\t\tcase 'bracket':\n\t\t\treturn (key, value, accumulator) => {\n\t\t\t\tresult = /(\\[\\])$/.exec(key);\n\t\t\t\tkey = key.replace(/\\[\\]$/, '');\n\n\t\t\t\tif (!result) {\n\t\t\t\t\taccumulator[key] = value;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (accumulator[key] === undefined) {\n\t\t\t\t\taccumulator[key] = [value];\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\taccumulator[key] = [].concat(accumulator[key], value);\n\t\t\t};\n\n\t\tcase 'comma':\n\t\tcase 'separator':\n\t\t\treturn (key, value, accumulator) => {\n\t\t\t\tconst isArray = typeof value === 'string' && value.split('').indexOf(options.arrayFormatSeparator) > -1;\n\t\t\t\tconst newValue = isArray ? value.split(options.arrayFormatSeparator).map(item => decode(item, options)) : value === null ? value : decode(value, options);\n\t\t\t\taccumulator[key] = newValue;\n\t\t\t};\n\n\t\tdefault:\n\t\t\treturn (key, value, accumulator) => {\n\t\t\t\tif (accumulator[key] === undefined) {\n\t\t\t\t\taccumulator[key] = value;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\taccumulator[key] = [].concat(accumulator[key], value);\n\t\t\t};\n\t}\n}\n\nfunction validateArrayFormatSeparator(value) {\n\tif (typeof value !== 'string' || value.length !== 1) {\n\t\tthrow new TypeError('arrayFormatSeparator must be single character string');\n\t}\n}\n\nfunction encode(value, options) {\n\tif (options.encode) {\n\t\treturn options.strict ? strictUriEncode(value) : encodeURIComponent(value);\n\t}\n\n\treturn value;\n}\n\nfunction decode(value, options) {\n\tif (options.decode) {\n\t\treturn decodeComponent(value);\n\t}\n\n\treturn value;\n}\n\nfunction keysSorter(input) {\n\tif (Array.isArray(input)) {\n\t\treturn input.sort();\n\t}\n\n\tif (typeof input === 'object') {\n\t\treturn keysSorter(Object.keys(input))\n\t\t\t.sort((a, b) => Number(a) - Number(b))\n\t\t\t.map(key => input[key]);\n\t}\n\n\treturn input;\n}\n\nfunction removeHash(input) {\n\tconst hashStart = input.indexOf('#');\n\tif (hashStart !== -1) {\n\t\tinput = input.slice(0, hashStart);\n\t}\n\n\treturn input;\n}\n\nfunction getHash(url) {\n\tlet hash = '';\n\tconst hashStart = url.indexOf('#');\n\tif (hashStart !== -1) {\n\t\thash = url.slice(hashStart);\n\t}\n\n\treturn hash;\n}\n\nfunction extract(input) {\n\tinput = removeHash(input);\n\tconst queryStart = input.indexOf('?');\n\tif (queryStart === -1) {\n\t\treturn '';\n\t}\n\n\treturn input.slice(queryStart + 1);\n}\n\nfunction parseValue(value, options) {\n\tif (options.parseNumbers && !Number.isNaN(Number(value)) && (typeof value === 'string' && value.trim() !== '')) {\n\t\tvalue = Number(value);\n\t} else if (options.parseBooleans && value !== null && (value.toLowerCase() === 'true' || value.toLowerCase() === 'false')) {\n\t\tvalue = value.toLowerCase() === 'true';\n\t}\n\n\treturn value;\n}\n\nfunction parse(input, options) {\n\toptions = Object.assign({\n\t\tdecode: true,\n\t\tsort: true,\n\t\tarrayFormat: 'none',\n\t\tarrayFormatSeparator: ',',\n\t\tparseNumbers: false,\n\t\tparseBooleans: false\n\t}, options);\n\n\tvalidateArrayFormatSeparator(options.arrayFormatSeparator);\n\n\tconst formatter = parserForArrayFormat(options);\n\n\t// Create an object with no prototype\n\tconst ret = Object.create(null);\n\n\tif (typeof input !== 'string') {\n\t\treturn ret;\n\t}\n\n\tinput = input.trim().replace(/^[?#&]/, '');\n\n\tif (!input) {\n\t\treturn ret;\n\t}\n\n\tfor (const param of input.split('&')) {\n\t\tlet [key, value] = splitOnFirst(options.decode ? param.replace(/\\+/g, ' ') : param, '=');\n\n\t\t// Missing `=` should be `null`:\n\t\t// http://w3.org/TR/2012/WD-url-20120524/#collect-url-parameters\n\t\tvalue = value === undefined ? null : ['comma', 'separator'].includes(options.arrayFormat) ? value : decode(value, options);\n\t\tformatter(decode(key, options), value, ret);\n\t}\n\n\tfor (const key of Object.keys(ret)) {\n\t\tconst value = ret[key];\n\t\tif (typeof value === 'object' && value !== null) {\n\t\t\tfor (const k of Object.keys(value)) {\n\t\t\t\tvalue[k] = parseValue(value[k], options);\n\t\t\t}\n\t\t} else {\n\t\t\tret[key] = parseValue(value, options);\n\t\t}\n\t}\n\n\tif (options.sort === false) {\n\t\treturn ret;\n\t}\n\n\treturn (options.sort === true ? Object.keys(ret).sort() : Object.keys(ret).sort(options.sort)).reduce((result, key) => {\n\t\tconst value = ret[key];\n\t\tif (Boolean(value) && typeof value === 'object' && !Array.isArray(value)) {\n\t\t\t// Sort object keys, not values\n\t\t\tresult[key] = keysSorter(value);\n\t\t} else {\n\t\t\tresult[key] = value;\n\t\t}\n\n\t\treturn result;\n\t}, Object.create(null));\n}\n\nexports.extract = extract;\nexports.parse = parse;\n\nexports.stringify = (object, options) => {\n\tif (!object) {\n\t\treturn '';\n\t}\n\n\toptions = Object.assign({\n\t\tencode: true,\n\t\tstrict: true,\n\t\tarrayFormat: 'none',\n\t\tarrayFormatSeparator: ','\n\t}, options);\n\n\tvalidateArrayFormatSeparator(options.arrayFormatSeparator);\n\n\tconst shouldFilter = key => (\n\t\t(options.skipNull && isNullOrUndefined(object[key])) ||\n\t\t(options.skipEmptyString && object[key] === '')\n\t);\n\n\tconst formatter = encoderForArrayFormat(options);\n\n\tconst objectCopy = {};\n\n\tfor (const key of Object.keys(object)) {\n\t\tif (!shouldFilter(key)) {\n\t\t\tobjectCopy[key] = object[key];\n\t\t}\n\t}\n\n\tconst keys = Object.keys(objectCopy);\n\n\tif (options.sort !== false) {\n\t\tkeys.sort(options.sort);\n\t}\n\n\treturn keys.map(key => {\n\t\tconst value = object[key];\n\n\t\tif (value === undefined) {\n\t\t\treturn '';\n\t\t}\n\n\t\tif (value === null) {\n\t\t\treturn encode(key, options);\n\t\t}\n\n\t\tif (Array.isArray(value)) {\n\t\t\treturn value\n\t\t\t\t.reduce(formatter(key), [])\n\t\t\t\t.join('&');\n\t\t}\n\n\t\treturn encode(key, options) + '=' + encode(value, options);\n\t}).filter(x => x.length > 0).join('&');\n};\n\nexports.parseUrl = (input, options) => {\n\treturn {\n\t\turl: removeHash(input).split('?')[0] || '',\n\t\tquery: parse(extract(input), options)\n\t};\n};\n\nexports.stringifyUrl = (input, options) => {\n\tconst url = removeHash(input.url).split('?')[0] || '';\n\tconst queryFromUrl = exports.extract(input.url);\n\tconst parsedQueryFromUrl = exports.parse(queryFromUrl);\n\tconst hash = getHash(input.url);\n\tconst query = Object.assign(parsedQueryFromUrl, input.query);\n\tlet queryString = exports.stringify(query, options);\n\tif (queryString) {\n\t\tqueryString = `?${queryString}`;\n\t}\n\n\treturn `${url}${queryString}${hash}`;\n};\n","/*global define:false */\n/**\n * Copyright 2012-2017 Craig Campbell\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Mousetrap is a simple keyboard shortcut library for Javascript with\n * no external dependencies\n *\n * @version 1.6.5\n * @url craig.is/killing/mice\n */\n(function(window, document, undefined) {\n\n // Check if mousetrap is used inside browser, if not, return\n if (!window) {\n return;\n }\n\n /**\n * mapping of special keycodes to their corresponding keys\n *\n * everything in this dictionary cannot use keypress events\n * so it has to be here to map to the correct keycodes for\n * keyup/keydown events\n *\n * @type {Object}\n */\n var _MAP = {\n 8: 'backspace',\n 9: 'tab',\n 13: 'enter',\n 16: 'shift',\n 17: 'ctrl',\n 18: 'alt',\n 20: 'capslock',\n 27: 'esc',\n 32: 'space',\n 33: 'pageup',\n 34: 'pagedown',\n 35: 'end',\n 36: 'home',\n 37: 'left',\n 38: 'up',\n 39: 'right',\n 40: 'down',\n 45: 'ins',\n 46: 'del',\n 91: 'meta',\n 93: 'meta',\n 224: 'meta'\n };\n\n /**\n * mapping for special characters so they can support\n *\n * this dictionary is only used incase you want to bind a\n * keyup or keydown event to one of these keys\n *\n * @type {Object}\n */\n var _KEYCODE_MAP = {\n 106: '*',\n 107: '+',\n 109: '-',\n 110: '.',\n 111 : '/',\n 186: ';',\n 187: '=',\n 188: ',',\n 189: '-',\n 190: '.',\n 191: '/',\n 192: '`',\n 219: '[',\n 220: '\\\\',\n 221: ']',\n 222: '\\''\n };\n\n /**\n * this is a mapping of keys that require shift on a US keypad\n * back to the non shift equivelents\n *\n * this is so you can use keyup events with these keys\n *\n * note that this will only work reliably on US keyboards\n *\n * @type {Object}\n */\n var _SHIFT_MAP = {\n '~': '`',\n '!': '1',\n '@': '2',\n '#': '3',\n '$': '4',\n '%': '5',\n '^': '6',\n '&': '7',\n '*': '8',\n '(': '9',\n ')': '0',\n '_': '-',\n '+': '=',\n ':': ';',\n '\\\"': '\\'',\n '<': ',',\n '>': '.',\n '?': '/',\n '|': '\\\\'\n };\n\n /**\n * this is a list of special strings you can use to map\n * to modifier keys when you specify your keyboard shortcuts\n *\n * @type {Object}\n */\n var _SPECIAL_ALIASES = {\n 'option': 'alt',\n 'command': 'meta',\n 'return': 'enter',\n 'escape': 'esc',\n 'plus': '+',\n 'mod': /Mac|iPod|iPhone|iPad/.test(navigator.platform) ? 'meta' : 'ctrl'\n };\n\n /**\n * variable to store the flipped version of _MAP from above\n * needed to check if we should use keypress or not when no action\n * is specified\n *\n * @type {Object|undefined}\n */\n var _REVERSE_MAP;\n\n /**\n * loop through the f keys, f1 to f19 and add them to the map\n * programatically\n */\n for (var i = 1; i < 20; ++i) {\n _MAP[111 + i] = 'f' + i;\n }\n\n /**\n * loop through to map numbers on the numeric keypad\n */\n for (i = 0; i <= 9; ++i) {\n\n // This needs to use a string cause otherwise since 0 is falsey\n // mousetrap will never fire for numpad 0 pressed as part of a keydown\n // event.\n //\n // @see https://github.com/ccampbell/mousetrap/pull/258\n _MAP[i + 96] = i.toString();\n }\n\n /**\n * cross browser add event method\n *\n * @param {Element|HTMLDocument} object\n * @param {string} type\n * @param {Function} callback\n * @returns void\n */\n function _addEvent(object, type, callback) {\n if (object.addEventListener) {\n object.addEventListener(type, callback, false);\n return;\n }\n\n object.attachEvent('on' + type, callback);\n }\n\n /**\n * takes the event and returns the key character\n *\n * @param {Event} e\n * @return {string}\n */\n function _characterFromEvent(e) {\n\n // for keypress events we should return the character as is\n if (e.type == 'keypress') {\n var character = String.fromCharCode(e.which);\n\n // if the shift key is not pressed then it is safe to assume\n // that we want the character to be lowercase. this means if\n // you accidentally have caps lock on then your key bindings\n // will continue to work\n //\n // the only side effect that might not be desired is if you\n // bind something like 'A' cause you want to trigger an\n // event when capital A is pressed caps lock will no longer\n // trigger the event. shift+a will though.\n if (!e.shiftKey) {\n character = character.toLowerCase();\n }\n\n return character;\n }\n\n // for non keypress events the special maps are needed\n if (_MAP[e.which]) {\n return _MAP[e.which];\n }\n\n if (_KEYCODE_MAP[e.which]) {\n return _KEYCODE_MAP[e.which];\n }\n\n // if it is not in the special map\n\n // with keydown and keyup events the character seems to always\n // come in as an uppercase character whether you are pressing shift\n // or not. we should make sure it is always lowercase for comparisons\n return String.fromCharCode(e.which).toLowerCase();\n }\n\n /**\n * checks if two arrays are equal\n *\n * @param {Array} modifiers1\n * @param {Array} modifiers2\n * @returns {boolean}\n */\n function _modifiersMatch(modifiers1, modifiers2) {\n return modifiers1.sort().join(',') === modifiers2.sort().join(',');\n }\n\n /**\n * takes a key event and figures out what the modifiers are\n *\n * @param {Event} e\n * @returns {Array}\n */\n function _eventModifiers(e) {\n var modifiers = [];\n\n if (e.shiftKey) {\n modifiers.push('shift');\n }\n\n if (e.altKey) {\n modifiers.push('alt');\n }\n\n if (e.ctrlKey) {\n modifiers.push('ctrl');\n }\n\n if (e.metaKey) {\n modifiers.push('meta');\n }\n\n return modifiers;\n }\n\n /**\n * prevents default for this event\n *\n * @param {Event} e\n * @returns void\n */\n function _preventDefault(e) {\n if (e.preventDefault) {\n e.preventDefault();\n return;\n }\n\n e.returnValue = false;\n }\n\n /**\n * stops propogation for this event\n *\n * @param {Event} e\n * @returns void\n */\n function _stopPropagation(e) {\n if (e.stopPropagation) {\n e.stopPropagation();\n return;\n }\n\n e.cancelBubble = true;\n }\n\n /**\n * determines if the keycode specified is a modifier key or not\n *\n * @param {string} key\n * @returns {boolean}\n */\n function _isModifier(key) {\n return key == 'shift' || key == 'ctrl' || key == 'alt' || key == 'meta';\n }\n\n /**\n * reverses the map lookup so that we can look for specific keys\n * to see what can and can't use keypress\n *\n * @return {Object}\n */\n function _getReverseMap() {\n if (!_REVERSE_MAP) {\n _REVERSE_MAP = {};\n for (var key in _MAP) {\n\n // pull out the numeric keypad from here cause keypress should\n // be able to detect the keys from the character\n if (key > 95 && key < 112) {\n continue;\n }\n\n if (_MAP.hasOwnProperty(key)) {\n _REVERSE_MAP[_MAP[key]] = key;\n }\n }\n }\n return _REVERSE_MAP;\n }\n\n /**\n * picks the best action based on the key combination\n *\n * @param {string} key - character for key\n * @param {Array} modifiers\n * @param {string=} action passed in\n */\n function _pickBestAction(key, modifiers, action) {\n\n // if no action was picked in we should try to pick the one\n // that we think would work best for this key\n if (!action) {\n action = _getReverseMap()[key] ? 'keydown' : 'keypress';\n }\n\n // modifier keys don't work as expected with keypress,\n // switch to keydown\n if (action == 'keypress' && modifiers.length) {\n action = 'keydown';\n }\n\n return action;\n }\n\n /**\n * Converts from a string key combination to an array\n *\n * @param {string} combination like \"command+shift+l\"\n * @return {Array}\n */\n function _keysFromString(combination) {\n if (combination === '+') {\n return ['+'];\n }\n\n combination = combination.replace(/\\+{2}/g, '+plus');\n return combination.split('+');\n }\n\n /**\n * Gets info for a specific key combination\n *\n * @param {string} combination key combination (\"command+s\" or \"a\" or \"*\")\n * @param {string=} action\n * @returns {Object}\n */\n function _getKeyInfo(combination, action) {\n var keys;\n var key;\n var i;\n var modifiers = [];\n\n // take the keys from this pattern and figure out what the actual\n // pattern is all about\n keys = _keysFromString(combination);\n\n for (i = 0; i < keys.length; ++i) {\n key = keys[i];\n\n // normalize key names\n if (_SPECIAL_ALIASES[key]) {\n key = _SPECIAL_ALIASES[key];\n }\n\n // if this is not a keypress event then we should\n // be smart about using shift keys\n // this will only work for US keyboards however\n if (action && action != 'keypress' && _SHIFT_MAP[key]) {\n key = _SHIFT_MAP[key];\n modifiers.push('shift');\n }\n\n // if this key is a modifier then add it to the list of modifiers\n if (_isModifier(key)) {\n modifiers.push(key);\n }\n }\n\n // depending on what the key combination is\n // we will try to pick the best event for it\n action = _pickBestAction(key, modifiers, action);\n\n return {\n key: key,\n modifiers: modifiers,\n action: action\n };\n }\n\n function _belongsTo(element, ancestor) {\n if (element === null || element === document) {\n return false;\n }\n\n if (element === ancestor) {\n return true;\n }\n\n return _belongsTo(element.parentNode, ancestor);\n }\n\n function Mousetrap(targetElement) {\n var self = this;\n\n targetElement = targetElement || document;\n\n if (!(self instanceof Mousetrap)) {\n return new Mousetrap(targetElement);\n }\n\n /**\n * element to attach key events to\n *\n * @type {Element}\n */\n self.target = targetElement;\n\n /**\n * a list of all the callbacks setup via Mousetrap.bind()\n *\n * @type {Object}\n */\n self._callbacks = {};\n\n /**\n * direct map of string combinations to callbacks used for trigger()\n *\n * @type {Object}\n */\n self._directMap = {};\n\n /**\n * keeps track of what level each sequence is at since multiple\n * sequences can start out with the same sequence\n *\n * @type {Object}\n */\n var _sequenceLevels = {};\n\n /**\n * variable to store the setTimeout call\n *\n * @type {null|number}\n */\n var _resetTimer;\n\n /**\n * temporary state where we will ignore the next keyup\n *\n * @type {boolean|string}\n */\n var _ignoreNextKeyup = false;\n\n /**\n * temporary state where we will ignore the next keypress\n *\n * @type {boolean}\n */\n var _ignoreNextKeypress = false;\n\n /**\n * are we currently inside of a sequence?\n * type of action (\"keyup\" or \"keydown\" or \"keypress\") or false\n *\n * @type {boolean|string}\n */\n var _nextExpectedAction = false;\n\n /**\n * resets all sequence counters except for the ones passed in\n *\n * @param {Object} doNotReset\n * @returns void\n */\n function _resetSequences(doNotReset) {\n doNotReset = doNotReset || {};\n\n var activeSequences = false,\n key;\n\n for (key in _sequenceLevels) {\n if (doNotReset[key]) {\n activeSequences = true;\n continue;\n }\n _sequenceLevels[key] = 0;\n }\n\n if (!activeSequences) {\n _nextExpectedAction = false;\n }\n }\n\n /**\n * finds all callbacks that match based on the keycode, modifiers,\n * and action\n *\n * @param {string} character\n * @param {Array} modifiers\n * @param {Event|Object} e\n * @param {string=} sequenceName - name of the sequence we are looking for\n * @param {string=} combination\n * @param {number=} level\n * @returns {Array}\n */\n function _getMatches(character, modifiers, e, sequenceName, combination, level) {\n var i;\n var callback;\n var matches = [];\n var action = e.type;\n\n // if there are no events related to this keycode\n if (!self._callbacks[character]) {\n return [];\n }\n\n // if a modifier key is coming up on its own we should allow it\n if (action == 'keyup' && _isModifier(character)) {\n modifiers = [character];\n }\n\n // loop through all callbacks for the key that was pressed\n // and see if any of them match\n for (i = 0; i < self._callbacks[character].length; ++i) {\n callback = self._callbacks[character][i];\n\n // if a sequence name is not specified, but this is a sequence at\n // the wrong level then move onto the next match\n if (!sequenceName && callback.seq && _sequenceLevels[callback.seq] != callback.level) {\n continue;\n }\n\n // if the action we are looking for doesn't match the action we got\n // then we should keep going\n if (action != callback.action) {\n continue;\n }\n\n // if this is a keypress event and the meta key and control key\n // are not pressed that means that we need to only look at the\n // character, otherwise check the modifiers as well\n //\n // chrome will not fire a keypress if meta or control is down\n // safari will fire a keypress if meta or meta+shift is down\n // firefox will fire a keypress if meta or control is down\n if ((action == 'keypress' && !e.metaKey && !e.ctrlKey) || _modifiersMatch(modifiers, callback.modifiers)) {\n\n // when you bind a combination or sequence a second time it\n // should overwrite the first one. if a sequenceName or\n // combination is specified in this call it does just that\n //\n // @todo make deleting its own method?\n var deleteCombo = !sequenceName && callback.combo == combination;\n var deleteSequence = sequenceName && callback.seq == sequenceName && callback.level == level;\n if (deleteCombo || deleteSequence) {\n self._callbacks[character].splice(i, 1);\n }\n\n matches.push(callback);\n }\n }\n\n return matches;\n }\n\n /**\n * actually calls the callback function\n *\n * if your callback function returns false this will use the jquery\n * convention - prevent default and stop propogation on the event\n *\n * @param {Function} callback\n * @param {Event} e\n * @returns void\n */\n function _fireCallback(callback, e, combo, sequence) {\n\n // if this event should not happen stop here\n if (self.stopCallback(e, e.target || e.srcElement, combo, sequence)) {\n return;\n }\n\n if (callback(e, combo) === false) {\n _preventDefault(e);\n _stopPropagation(e);\n }\n }\n\n /**\n * handles a character key event\n *\n * @param {string} character\n * @param {Array} modifiers\n * @param {Event} e\n * @returns void\n */\n self._handleKey = function(character, modifiers, e) {\n var callbacks = _getMatches(character, modifiers, e);\n var i;\n var doNotReset = {};\n var maxLevel = 0;\n var processedSequenceCallback = false;\n\n // Calculate the maxLevel for sequences so we can only execute the longest callback sequence\n for (i = 0; i < callbacks.length; ++i) {\n if (callbacks[i].seq) {\n maxLevel = Math.max(maxLevel, callbacks[i].level);\n }\n }\n\n // loop through matching callbacks for this key event\n for (i = 0; i < callbacks.length; ++i) {\n\n // fire for all sequence callbacks\n // this is because if for example you have multiple sequences\n // bound such as \"g i\" and \"g t\" they both need to fire the\n // callback for matching g cause otherwise you can only ever\n // match the first one\n if (callbacks[i].seq) {\n\n // only fire callbacks for the maxLevel to prevent\n // subsequences from also firing\n //\n // for example 'a option b' should not cause 'option b' to fire\n // even though 'option b' is part of the other sequence\n //\n // any sequences that do not match here will be discarded\n // below by the _resetSequences call\n if (callbacks[i].level != maxLevel) {\n continue;\n }\n\n processedSequenceCallback = true;\n\n // keep a list of which sequences were matches for later\n doNotReset[callbacks[i].seq] = 1;\n _fireCallback(callbacks[i].callback, e, callbacks[i].combo, callbacks[i].seq);\n continue;\n }\n\n // if there were no sequence matches but we are still here\n // that means this is a regular match so we should fire that\n if (!processedSequenceCallback) {\n _fireCallback(callbacks[i].callback, e, callbacks[i].combo);\n }\n }\n\n // if the key you pressed matches the type of sequence without\n // being a modifier (ie \"keyup\" or \"keypress\") then we should\n // reset all sequences that were not matched by this event\n //\n // this is so, for example, if you have the sequence \"h a t\" and you\n // type \"h e a r t\" it does not match. in this case the \"e\" will\n // cause the sequence to reset\n //\n // modifier keys are ignored because you can have a sequence\n // that contains modifiers such as \"enter ctrl+space\" and in most\n // cases the modifier key will be pressed before the next key\n //\n // also if you have a sequence such as \"ctrl+b a\" then pressing the\n // \"b\" key will trigger a \"keypress\" and a \"keydown\"\n //\n // the \"keydown\" is expected when there is a modifier, but the\n // \"keypress\" ends up matching the _nextExpectedAction since it occurs\n // after and that causes the sequence to reset\n //\n // we ignore keypresses in a sequence that directly follow a keydown\n // for the same character\n var ignoreThisKeypress = e.type == 'keypress' && _ignoreNextKeypress;\n if (e.type == _nextExpectedAction && !_isModifier(character) && !ignoreThisKeypress) {\n _resetSequences(doNotReset);\n }\n\n _ignoreNextKeypress = processedSequenceCallback && e.type == 'keydown';\n };\n\n /**\n * handles a keydown event\n *\n * @param {Event} e\n * @returns void\n */\n function _handleKeyEvent(e) {\n\n // normalize e.which for key events\n // @see http://stackoverflow.com/questions/4285627/javascript-keycode-vs-charcode-utter-confusion\n if (typeof e.which !== 'number') {\n e.which = e.keyCode;\n }\n\n var character = _characterFromEvent(e);\n\n // no character found then stop\n if (!character) {\n return;\n }\n\n // need to use === for the character check because the character can be 0\n if (e.type == 'keyup' && _ignoreNextKeyup === character) {\n _ignoreNextKeyup = false;\n return;\n }\n\n self.handleKey(character, _eventModifiers(e), e);\n }\n\n /**\n * called to set a 1 second timeout on the specified sequence\n *\n * this is so after each key press in the sequence you have 1 second\n * to press the next key before you have to start over\n *\n * @returns void\n */\n function _resetSequenceTimer() {\n clearTimeout(_resetTimer);\n _resetTimer = setTimeout(_resetSequences, 1000);\n }\n\n /**\n * binds a key sequence to an event\n *\n * @param {string} combo - combo specified in bind call\n * @param {Array} keys\n * @param {Function} callback\n * @param {string=} action\n * @returns void\n */\n function _bindSequence(combo, keys, callback, action) {\n\n // start off by adding a sequence level record for this combination\n // and setting the level to 0\n _sequenceLevels[combo] = 0;\n\n /**\n * callback to increase the sequence level for this sequence and reset\n * all other sequences that were active\n *\n * @param {string} nextAction\n * @returns {Function}\n */\n function _increaseSequence(nextAction) {\n return function() {\n _nextExpectedAction = nextAction;\n ++_sequenceLevels[combo];\n _resetSequenceTimer();\n };\n }\n\n /**\n * wraps the specified callback inside of another function in order\n * to reset all sequence counters as soon as this sequence is done\n *\n * @param {Event} e\n * @returns void\n */\n function _callbackAndReset(e) {\n _fireCallback(callback, e, combo);\n\n // we should ignore the next key up if the action is key down\n // or keypress. this is so if you finish a sequence and\n // release the key the final key will not trigger a keyup\n if (action !== 'keyup') {\n _ignoreNextKeyup = _characterFromEvent(e);\n }\n\n // weird race condition if a sequence ends with the key\n // another sequence begins with\n setTimeout(_resetSequences, 10);\n }\n\n // loop through keys one at a time and bind the appropriate callback\n // function. for any key leading up to the final one it should\n // increase the sequence. after the final, it should reset all sequences\n //\n // if an action is specified in the original bind call then that will\n // be used throughout. otherwise we will pass the action that the\n // next key in the sequence should match. this allows a sequence\n // to mix and match keypress and keydown events depending on which\n // ones are better suited to the key provided\n for (var i = 0; i < keys.length; ++i) {\n var isFinal = i + 1 === keys.length;\n var wrappedCallback = isFinal ? _callbackAndReset : _increaseSequence(action || _getKeyInfo(keys[i + 1]).action);\n _bindSingle(keys[i], wrappedCallback, action, combo, i);\n }\n }\n\n /**\n * binds a single keyboard combination\n *\n * @param {string} combination\n * @param {Function} callback\n * @param {string=} action\n * @param {string=} sequenceName - name of sequence if part of sequence\n * @param {number=} level - what part of the sequence the command is\n * @returns void\n */\n function _bindSingle(combination, callback, action, sequenceName, level) {\n\n // store a direct mapped reference for use with Mousetrap.trigger\n self._directMap[combination + ':' + action] = callback;\n\n // make sure multiple spaces in a row become a single space\n combination = combination.replace(/\\s+/g, ' ');\n\n var sequence = combination.split(' ');\n var info;\n\n // if this pattern is a sequence of keys then run through this method\n // to reprocess each pattern one key at a time\n if (sequence.length > 1) {\n _bindSequence(combination, sequence, callback, action);\n return;\n }\n\n info = _getKeyInfo(combination, action);\n\n // make sure to initialize array if this is the first time\n // a callback is added for this key\n self._callbacks[info.key] = self._callbacks[info.key] || [];\n\n // remove an existing match if there is one\n _getMatches(info.key, info.modifiers, {type: info.action}, sequenceName, combination, level);\n\n // add this call back to the array\n // if it is a sequence put it at the beginning\n // if not put it at the end\n //\n // this is important because the way these are processed expects\n // the sequence ones to come first\n self._callbacks[info.key][sequenceName ? 'unshift' : 'push']({\n callback: callback,\n modifiers: info.modifiers,\n action: info.action,\n seq: sequenceName,\n level: level,\n combo: combination\n });\n }\n\n /**\n * binds multiple combinations to the same callback\n *\n * @param {Array} combinations\n * @param {Function} callback\n * @param {string|undefined} action\n * @returns void\n */\n self._bindMultiple = function(combinations, callback, action) {\n for (var i = 0; i < combinations.length; ++i) {\n _bindSingle(combinations[i], callback, action);\n }\n };\n\n // start!\n _addEvent(targetElement, 'keypress', _handleKeyEvent);\n _addEvent(targetElement, 'keydown', _handleKeyEvent);\n _addEvent(targetElement, 'keyup', _handleKeyEvent);\n }\n\n /**\n * binds an event to mousetrap\n *\n * can be a single key, a combination of keys separated with +,\n * an array of keys, or a sequence of keys separated by spaces\n *\n * be sure to list the modifier keys first to make sure that the\n * correct key ends up getting bound (the last key in the pattern)\n *\n * @param {string|Array} keys\n * @param {Function} callback\n * @param {string=} action - 'keypress', 'keydown', or 'keyup'\n * @returns void\n */\n Mousetrap.prototype.bind = function(keys, callback, action) {\n var self = this;\n keys = keys instanceof Array ? keys : [keys];\n self._bindMultiple.call(self, keys, callback, action);\n return self;\n };\n\n /**\n * unbinds an event to mousetrap\n *\n * the unbinding sets the callback function of the specified key combo\n * to an empty function and deletes the corresponding key in the\n * _directMap dict.\n *\n * TODO: actually remove this from the _callbacks dictionary instead\n * of binding an empty function\n *\n * the keycombo+action has to be exactly the same as\n * it was defined in the bind method\n *\n * @param {string|Array} keys\n * @param {string} action\n * @returns void\n */\n Mousetrap.prototype.unbind = function(keys, action) {\n var self = this;\n return self.bind.call(self, keys, function() {}, action);\n };\n\n /**\n * triggers an event that has already been bound\n *\n * @param {string} keys\n * @param {string=} action\n * @returns void\n */\n Mousetrap.prototype.trigger = function(keys, action) {\n var self = this;\n if (self._directMap[keys + ':' + action]) {\n self._directMap[keys + ':' + action]({}, keys);\n }\n return self;\n };\n\n /**\n * resets the library back to its initial state. this is useful\n * if you want to clear out the current keyboard shortcuts and bind\n * new ones - for example if you switch to another page\n *\n * @returns void\n */\n Mousetrap.prototype.reset = function() {\n var self = this;\n self._callbacks = {};\n self._directMap = {};\n return self;\n };\n\n /**\n * should we stop this event before firing off callbacks\n *\n * @param {Event} e\n * @param {Element} element\n * @return {boolean}\n */\n Mousetrap.prototype.stopCallback = function(e, element) {\n var self = this;\n\n // if the element has the class \"mousetrap\" then no need to stop\n if ((' ' + element.className + ' ').indexOf(' mousetrap ') > -1) {\n return false;\n }\n\n if (_belongsTo(element, self.target)) {\n return false;\n }\n\n // Events originating from a shadow DOM are re-targetted and `e.target` is the shadow host,\n // not the initial event target in the shadow tree. Note that not all events cross the\n // shadow boundary.\n // For shadow trees with `mode: 'open'`, the initial event target is the first element in\n // the event’s composed path. For shadow trees with `mode: 'closed'`, the initial event\n // target cannot be obtained.\n if ('composedPath' in e && typeof e.composedPath === 'function') {\n // For open shadow trees, update `element` so that the following check works.\n var initialEventTarget = e.composedPath()[0];\n if (initialEventTarget !== e.target) {\n element = initialEventTarget;\n }\n }\n\n // stop for input, select, and textarea\n return element.tagName == 'INPUT' || element.tagName == 'SELECT' || element.tagName == 'TEXTAREA' || element.isContentEditable;\n };\n\n /**\n * exposes _handleKey publicly so it can be overwritten by extensions\n */\n Mousetrap.prototype.handleKey = function() {\n var self = this;\n return self._handleKey.apply(self, arguments);\n };\n\n /**\n * allow custom key mappings\n */\n Mousetrap.addKeycodes = function(object) {\n for (var key in object) {\n if (object.hasOwnProperty(key)) {\n _MAP[key] = object[key];\n }\n }\n _REVERSE_MAP = null;\n };\n\n /**\n * Init the global mousetrap functions\n *\n * This method is needed to allow the global mousetrap functions to work\n * now that mousetrap is a constructor function.\n */\n Mousetrap.init = function() {\n var documentMousetrap = Mousetrap(document);\n for (var method in documentMousetrap) {\n if (method.charAt(0) !== '_') {\n Mousetrap[method] = (function(method) {\n return function() {\n return documentMousetrap[method].apply(documentMousetrap, arguments);\n };\n } (method));\n }\n }\n };\n\n Mousetrap.init();\n\n // expose mousetrap to the global object\n window.Mousetrap = Mousetrap;\n\n // expose as a common js module\n if (typeof module !== 'undefined' && module.exports) {\n module.exports = Mousetrap;\n }\n\n // expose mousetrap as an AMD module\n if (typeof define === 'function' && define.amd) {\n define(function() {\n return Mousetrap;\n });\n }\n}) (typeof window !== 'undefined' ? window : null, typeof window !== 'undefined' ? document : null);\n","module.exports = __WEBPACK_EXTERNAL_MODULE__43__;","function _setPrototypeOf(o, p) {\n module.exports = _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n}\n\nmodule.exports = _setPrototypeOf;","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nmodule.exports = Map;\n","var baseGetTag = require('./_baseGetTag'),\n isObject = require('./isObject');\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;\n","var mapCacheClear = require('./_mapCacheClear'),\n mapCacheDelete = require('./_mapCacheDelete'),\n mapCacheGet = require('./_mapCacheGet'),\n mapCacheHas = require('./_mapCacheHas'),\n mapCacheSet = require('./_mapCacheSet');\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nmodule.exports = MapCache;\n","var defineProperty = require('./_defineProperty');\n\n/**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n if (key == '__proto__' && defineProperty) {\n defineProperty(object, key, {\n 'configurable': true,\n 'enumerable': true,\n 'value': value,\n 'writable': true\n });\n } else {\n object[key] = value;\n }\n}\n\nmodule.exports = baseAssignValue;\n","var baseIsArguments = require('./_baseIsArguments'),\n isObjectLike = require('./isObjectLike');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\nmodule.exports = isArguments;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\nmodule.exports = isIndex;\n","var baseIsTypedArray = require('./_baseIsTypedArray'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nmodule.exports = isTypedArray;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isLength;\n","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\nmodule.exports = baseUnary;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\nmodule.exports = nodeUtil;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\nmodule.exports = isPrototype;\n","var arrayFilter = require('./_arrayFilter'),\n stubArray = require('./stubArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n if (object == null) {\n return [];\n }\n object = Object(object);\n return arrayFilter(nativeGetSymbols(object), function(symbol) {\n return propertyIsEnumerable.call(object, symbol);\n });\n};\n\nmodule.exports = getSymbols;\n","var overArg = require('./_overArg');\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\nmodule.exports = getPrototype;\n","var Uint8Array = require('./_Uint8Array');\n\n/**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\nfunction cloneArrayBuffer(arrayBuffer) {\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n return result;\n}\n\nmodule.exports = cloneArrayBuffer;\n","/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n}\n\nmodule.exports = setToArray;\n","var isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\nmodule.exports = isKey;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nmodule.exports = identity;\n","'use strict';\n\nvar URI = require('uri-js')\n , equal = require('fast-deep-equal')\n , util = require('./util')\n , SchemaObject = require('./schema_obj')\n , traverse = require('json-schema-traverse');\n\nmodule.exports = resolve;\n\nresolve.normalizeId = normalizeId;\nresolve.fullPath = getFullPath;\nresolve.url = resolveUrl;\nresolve.ids = resolveIds;\nresolve.inlineRef = inlineRef;\nresolve.schema = resolveSchema;\n\n/**\n * [resolve and compile the references ($ref)]\n * @this Ajv\n * @param {Function} compile reference to schema compilation funciton (localCompile)\n * @param {Object} root object with information about the root schema for the current schema\n * @param {String} ref reference to resolve\n * @return {Object|Function} schema object (if the schema can be inlined) or validation function\n */\nfunction resolve(compile, root, ref) {\n /* jshint validthis: true */\n var refVal = this._refs[ref];\n if (typeof refVal == 'string') {\n if (this._refs[refVal]) refVal = this._refs[refVal];\n else return resolve.call(this, compile, root, refVal);\n }\n\n refVal = refVal || this._schemas[ref];\n if (refVal instanceof SchemaObject) {\n return inlineRef(refVal.schema, this._opts.inlineRefs)\n ? refVal.schema\n : refVal.validate || this._compile(refVal);\n }\n\n var res = resolveSchema.call(this, root, ref);\n var schema, v, baseId;\n if (res) {\n schema = res.schema;\n root = res.root;\n baseId = res.baseId;\n }\n\n if (schema instanceof SchemaObject) {\n v = schema.validate || compile.call(this, schema.schema, root, undefined, baseId);\n } else if (schema !== undefined) {\n v = inlineRef(schema, this._opts.inlineRefs)\n ? schema\n : compile.call(this, schema, root, undefined, baseId);\n }\n\n return v;\n}\n\n\n/**\n * Resolve schema, its root and baseId\n * @this Ajv\n * @param {Object} root root object with properties schema, refVal, refs\n * @param {String} ref reference to resolve\n * @return {Object} object with properties schema, root, baseId\n */\nfunction resolveSchema(root, ref) {\n /* jshint validthis: true */\n var p = URI.parse(ref)\n , refPath = _getFullPath(p)\n , baseId = getFullPath(this._getId(root.schema));\n if (Object.keys(root.schema).length === 0 || refPath !== baseId) {\n var id = normalizeId(refPath);\n var refVal = this._refs[id];\n if (typeof refVal == 'string') {\n return resolveRecursive.call(this, root, refVal, p);\n } else if (refVal instanceof SchemaObject) {\n if (!refVal.validate) this._compile(refVal);\n root = refVal;\n } else {\n refVal = this._schemas[id];\n if (refVal instanceof SchemaObject) {\n if (!refVal.validate) this._compile(refVal);\n if (id == normalizeId(ref))\n return { schema: refVal, root: root, baseId: baseId };\n root = refVal;\n } else {\n return;\n }\n }\n if (!root.schema) return;\n baseId = getFullPath(this._getId(root.schema));\n }\n return getJsonPointer.call(this, p, baseId, root.schema, root);\n}\n\n\n/* @this Ajv */\nfunction resolveRecursive(root, ref, parsedRef) {\n /* jshint validthis: true */\n var res = resolveSchema.call(this, root, ref);\n if (res) {\n var schema = res.schema;\n var baseId = res.baseId;\n root = res.root;\n var id = this._getId(schema);\n if (id) baseId = resolveUrl(baseId, id);\n return getJsonPointer.call(this, parsedRef, baseId, schema, root);\n }\n}\n\n\nvar PREVENT_SCOPE_CHANGE = util.toHash(['properties', 'patternProperties', 'enum', 'dependencies', 'definitions']);\n/* @this Ajv */\nfunction getJsonPointer(parsedRef, baseId, schema, root) {\n /* jshint validthis: true */\n parsedRef.fragment = parsedRef.fragment || '';\n if (parsedRef.fragment.slice(0,1) != '/') return;\n var parts = parsedRef.fragment.split('/');\n\n for (var i = 1; i < parts.length; i++) {\n var part = parts[i];\n if (part) {\n part = util.unescapeFragment(part);\n schema = schema[part];\n if (schema === undefined) break;\n var id;\n if (!PREVENT_SCOPE_CHANGE[part]) {\n id = this._getId(schema);\n if (id) baseId = resolveUrl(baseId, id);\n if (schema.$ref) {\n var $ref = resolveUrl(baseId, schema.$ref);\n var res = resolveSchema.call(this, root, $ref);\n if (res) {\n schema = res.schema;\n root = res.root;\n baseId = res.baseId;\n }\n }\n }\n }\n }\n if (schema !== undefined && schema !== root.schema)\n return { schema: schema, root: root, baseId: baseId };\n}\n\n\nvar SIMPLE_INLINED = util.toHash([\n 'type', 'format', 'pattern',\n 'maxLength', 'minLength',\n 'maxProperties', 'minProperties',\n 'maxItems', 'minItems',\n 'maximum', 'minimum',\n 'uniqueItems', 'multipleOf',\n 'required', 'enum'\n]);\nfunction inlineRef(schema, limit) {\n if (limit === false) return false;\n if (limit === undefined || limit === true) return checkNoRef(schema);\n else if (limit) return countKeys(schema) <= limit;\n}\n\n\nfunction checkNoRef(schema) {\n var item;\n if (Array.isArray(schema)) {\n for (var i=0; i [2.1, 1.2]\n *\n * // The `_.property` iteratee shorthand.\n * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 1 }, { 'x': 2 }]\n */\nfunction uniqBy(array, iteratee) {\n return (array && array.length) ? baseUniq(array, baseIteratee(iteratee, 2)) : [];\n}\n\nmodule.exports = uniqBy;\n","var arrayLikeToArray = require(\"./arrayLikeToArray\");\n\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(n);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}\n\nmodule.exports = _unsupportedIterableToArray;","function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n\n return arr2;\n}\n\nmodule.exports = _arrayLikeToArray;","function _AwaitValue(value) {\n this.wrapped = value;\n}\n\nmodule.exports = _AwaitValue;","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nmodule.exports = toSource;\n","var baseAssignValue = require('./_baseAssignValue'),\n eq = require('./eq');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\nmodule.exports = assignValue;\n","var getNative = require('./_getNative');\n\nvar defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n}());\n\nmodule.exports = defineProperty;\n","var baseTimes = require('./_baseTimes'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isIndex = require('./_isIndex'),\n isTypedArray = require('./isTypedArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = arrayLikeKeys;\n","/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\nmodule.exports = overArg;\n","var root = require('./_root');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined,\n allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined;\n\n/**\n * Creates a clone of `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\nfunction cloneBuffer(buffer, isDeep) {\n if (isDeep) {\n return buffer.slice();\n }\n var length = buffer.length,\n result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n buffer.copy(result);\n return result;\n}\n\nmodule.exports = cloneBuffer;\n","/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction copyArray(source, array) {\n var index = -1,\n length = source.length;\n\n array || (array = Array(length));\n while (++index < length) {\n array[index] = source[index];\n }\n return array;\n}\n\nmodule.exports = copyArray;\n","/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n return [];\n}\n\nmodule.exports = stubArray;\n","var arrayPush = require('./_arrayPush'),\n getPrototype = require('./_getPrototype'),\n getSymbols = require('./_getSymbols'),\n stubArray = require('./stubArray');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own and inherited enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n var result = [];\n while (object) {\n arrayPush(result, getSymbols(object));\n object = getPrototype(object);\n }\n return result;\n};\n\nmodule.exports = getSymbolsIn;\n","/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n}\n\nmodule.exports = arrayPush;\n","var baseGetAllKeys = require('./_baseGetAllKeys'),\n getSymbols = require('./_getSymbols'),\n keys = require('./keys');\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n return baseGetAllKeys(object, keys, getSymbols);\n}\n\nmodule.exports = getAllKeys;\n","var arrayPush = require('./_arrayPush'),\n isArray = require('./isArray');\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\nmodule.exports = baseGetAllKeys;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nmodule.exports = Set;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nmodule.exports = Uint8Array;\n","var cloneArrayBuffer = require('./_cloneArrayBuffer');\n\n/**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\nfunction cloneTypedArray(typedArray, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n}\n\nmodule.exports = cloneTypedArray;\n","var baseCreate = require('./_baseCreate'),\n getPrototype = require('./_getPrototype'),\n isPrototype = require('./_isPrototype');\n\n/**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneObject(object) {\n return (typeof object.constructor == 'function' && !isPrototype(object))\n ? baseCreate(getPrototype(object))\n : {};\n}\n\nmodule.exports = initCloneObject;\n","var baseIsEqualDeep = require('./_baseIsEqualDeep'),\n isObjectLike = require('./isObjectLike');\n\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Unordered comparison\n * 2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, bitmask, customizer, stack) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n}\n\nmodule.exports = baseIsEqual;\n","var SetCache = require('./_SetCache'),\n arraySome = require('./_arraySome'),\n cacheHas = require('./_cacheHas');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(array);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var index = -1,\n result = true,\n seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n stack.set(array, other);\n stack.set(other, array);\n\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, arrValue, index, other, array, stack)\n : customizer(arrValue, othValue, index, array, other, stack);\n }\n if (compared !== undefined) {\n if (compared) {\n continue;\n }\n result = false;\n break;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (seen) {\n if (!arraySome(other, function(othValue, othIndex) {\n if (!cacheHas(seen, othIndex) &&\n (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n return seen.push(othIndex);\n }\n })) {\n result = false;\n break;\n }\n } else if (!(\n arrValue === othValue ||\n equalFunc(arrValue, othValue, bitmask, customizer, stack)\n )) {\n result = false;\n break;\n }\n }\n stack['delete'](array);\n stack['delete'](other);\n return result;\n}\n\nmodule.exports = equalArrays;\n","var MapCache = require('./_MapCache'),\n setCacheAdd = require('./_setCacheAdd'),\n setCacheHas = require('./_setCacheHas');\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\nmodule.exports = SetCache;\n","/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n return cache.has(key);\n}\n\nmodule.exports = cacheHas;\n","var isObject = require('./isObject');\n\n/**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n * equality comparisons, else `false`.\n */\nfunction isStrictComparable(value) {\n return value === value && !isObject(value);\n}\n\nmodule.exports = isStrictComparable;\n","/**\n * A specialized version of `matchesProperty` for source values suitable\n * for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction matchesStrictComparable(key, srcValue) {\n return function(object) {\n if (object == null) {\n return false;\n }\n return object[key] === srcValue &&\n (srcValue !== undefined || (key in Object(object)));\n };\n}\n\nmodule.exports = matchesStrictComparable;\n","var castPath = require('./_castPath'),\n toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\nmodule.exports = baseGet;\n","var isArray = require('./isArray'),\n isKey = require('./_isKey'),\n stringToPath = require('./_stringToPath'),\n toString = require('./toString');\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value, object) {\n if (isArray(value)) {\n return value;\n }\n return isKey(value, object) ? [value] : stringToPath(toString(value));\n}\n\nmodule.exports = castPath;\n","var baseAssignValue = require('./_baseAssignValue'),\n eq = require('./eq');\n\n/**\n * This function is like `assignValue` except that it doesn't assign\n * `undefined` values.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignMergeValue(object, key, value) {\n if ((value !== undefined && !eq(object[key], value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\nmodule.exports = assignMergeValue;\n","/**\n * Gets the value at `key`, unless `key` is \"__proto__\" or \"constructor\".\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction safeGet(object, key) {\n if (key === 'constructor' && typeof object[key] === 'function') {\n return;\n }\n\n if (key == '__proto__') {\n return;\n }\n\n return object[key];\n}\n\nmodule.exports = safeGet;\n","'use strict';\n\nvar util = require('./util');\n\nmodule.exports = SchemaObject;\n\nfunction SchemaObject(obj) {\n util.copy(obj, this);\n}\n","'use strict';\n\nmodule.exports = function (data, opts) {\n if (!opts) opts = {};\n if (typeof opts === 'function') opts = { cmp: opts };\n var cycles = (typeof opts.cycles === 'boolean') ? opts.cycles : false;\n\n var cmp = opts.cmp && (function (f) {\n return function (node) {\n return function (a, b) {\n var aobj = { key: a, value: node[a] };\n var bobj = { key: b, value: node[b] };\n return f(aobj, bobj);\n };\n };\n })(opts.cmp);\n\n var seen = [];\n return (function stringify (node) {\n if (node && node.toJSON && typeof node.toJSON === 'function') {\n node = node.toJSON();\n }\n\n if (node === undefined) return;\n if (typeof node == 'number') return isFinite(node) ? '' + node : 'null';\n if (typeof node !== 'object') return JSON.stringify(node);\n\n var i, out;\n if (Array.isArray(node)) {\n out = '[';\n for (i = 0; i < node.length; i++) {\n if (i) out += ',';\n out += stringify(node[i]) || 'null';\n }\n return out + ']';\n }\n\n if (node === null) return 'null';\n\n if (seen.indexOf(node) !== -1) {\n if (cycles) return JSON.stringify('__cycle__');\n throw new TypeError('Converting circular structure to JSON');\n }\n\n var seenIndex = seen.push(node) - 1;\n var keys = Object.keys(node).sort(cmp && cmp(node));\n out = '';\n for (i = 0; i < keys.length; i++) {\n var key = keys[i];\n var value = stringify(node[key]);\n\n if (!value) continue;\n if (out) out += ',';\n out += JSON.stringify(key) + ':' + value;\n }\n seen.splice(seenIndex, 1);\n return '{' + out + '}';\n })(data);\n};\n","'use strict';\nmodule.exports = function generate_validate(it, $keyword, $ruleType) {\n var out = '';\n var $async = it.schema.$async === true,\n $refKeywords = it.util.schemaHasRulesExcept(it.schema, it.RULES.all, '$ref'),\n $id = it.self._getId(it.schema);\n if (it.opts.strictKeywords) {\n var $unknownKwd = it.util.schemaUnknownRules(it.schema, it.RULES.keywords);\n if ($unknownKwd) {\n var $keywordsMsg = 'unknown keyword: ' + $unknownKwd;\n if (it.opts.strictKeywords === 'log') it.logger.warn($keywordsMsg);\n else throw new Error($keywordsMsg);\n }\n }\n if (it.isTop) {\n out += ' var validate = ';\n if ($async) {\n it.async = true;\n out += 'async ';\n }\n out += 'function(data, dataPath, parentData, parentDataProperty, rootData) { \\'use strict\\'; ';\n if ($id && (it.opts.sourceCode || it.opts.processCode)) {\n out += ' ' + ('/\\*# sourceURL=' + $id + ' */') + ' ';\n }\n }\n if (typeof it.schema == 'boolean' || !($refKeywords || it.schema.$ref)) {\n var $keyword = 'false schema';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $errorKeyword;\n var $data = 'data' + ($dataLvl || '');\n var $valid = 'valid' + $lvl;\n if (it.schema === false) {\n if (it.isTop) {\n $breakOnError = true;\n } else {\n out += ' var ' + ($valid) + ' = false; ';\n }\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ($errorKeyword || 'false schema') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'boolean schema is false\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n } else {\n if (it.isTop) {\n if ($async) {\n out += ' return data; ';\n } else {\n out += ' validate.errors = null; return true; ';\n }\n } else {\n out += ' var ' + ($valid) + ' = true; ';\n }\n }\n if (it.isTop) {\n out += ' }; return validate; ';\n }\n return out;\n }\n if (it.isTop) {\n var $top = it.isTop,\n $lvl = it.level = 0,\n $dataLvl = it.dataLevel = 0,\n $data = 'data';\n it.rootId = it.resolve.fullPath(it.self._getId(it.root.schema));\n it.baseId = it.baseId || it.rootId;\n delete it.isTop;\n it.dataPathArr = [undefined];\n if (it.schema.default !== undefined && it.opts.useDefaults && it.opts.strictDefaults) {\n var $defaultMsg = 'default is ignored in the schema root';\n if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg);\n else throw new Error($defaultMsg);\n }\n out += ' var vErrors = null; ';\n out += ' var errors = 0; ';\n out += ' if (rootData === undefined) rootData = data; ';\n } else {\n var $lvl = it.level,\n $dataLvl = it.dataLevel,\n $data = 'data' + ($dataLvl || '');\n if ($id) it.baseId = it.resolve.url(it.baseId, $id);\n if ($async && !it.async) throw new Error('async schema in sync schema');\n out += ' var errs_' + ($lvl) + ' = errors;';\n }\n var $valid = 'valid' + $lvl,\n $breakOnError = !it.opts.allErrors,\n $closingBraces1 = '',\n $closingBraces2 = '';\n var $errorKeyword;\n var $typeSchema = it.schema.type,\n $typeIsArray = Array.isArray($typeSchema);\n if ($typeSchema && it.opts.nullable && it.schema.nullable === true) {\n if ($typeIsArray) {\n if ($typeSchema.indexOf('null') == -1) $typeSchema = $typeSchema.concat('null');\n } else if ($typeSchema != 'null') {\n $typeSchema = [$typeSchema, 'null'];\n $typeIsArray = true;\n }\n }\n if ($typeIsArray && $typeSchema.length == 1) {\n $typeSchema = $typeSchema[0];\n $typeIsArray = false;\n }\n if (it.schema.$ref && $refKeywords) {\n if (it.opts.extendRefs == 'fail') {\n throw new Error('$ref: validation keywords used in schema at path \"' + it.errSchemaPath + '\" (see option extendRefs)');\n } else if (it.opts.extendRefs !== true) {\n $refKeywords = false;\n it.logger.warn('$ref: keywords ignored in schema at path \"' + it.errSchemaPath + '\"');\n }\n }\n if (it.schema.$comment && it.opts.$comment) {\n out += ' ' + (it.RULES.all.$comment.code(it, '$comment'));\n }\n if ($typeSchema) {\n if (it.opts.coerceTypes) {\n var $coerceToTypes = it.util.coerceToTypes(it.opts.coerceTypes, $typeSchema);\n }\n var $rulesGroup = it.RULES.types[$typeSchema];\n if ($coerceToTypes || $typeIsArray || $rulesGroup === true || ($rulesGroup && !$shouldUseGroup($rulesGroup))) {\n var $schemaPath = it.schemaPath + '.type',\n $errSchemaPath = it.errSchemaPath + '/type';\n var $schemaPath = it.schemaPath + '.type',\n $errSchemaPath = it.errSchemaPath + '/type',\n $method = $typeIsArray ? 'checkDataTypes' : 'checkDataType';\n out += ' if (' + (it.util[$method]($typeSchema, $data, true)) + ') { ';\n if ($coerceToTypes) {\n var $dataType = 'dataType' + $lvl,\n $coerced = 'coerced' + $lvl;\n out += ' var ' + ($dataType) + ' = typeof ' + ($data) + '; ';\n if (it.opts.coerceTypes == 'array') {\n out += ' if (' + ($dataType) + ' == \\'object\\' && Array.isArray(' + ($data) + ')) ' + ($dataType) + ' = \\'array\\'; ';\n }\n out += ' var ' + ($coerced) + ' = undefined; ';\n var $bracesCoercion = '';\n var arr1 = $coerceToTypes;\n if (arr1) {\n var $type, $i = -1,\n l1 = arr1.length - 1;\n while ($i < l1) {\n $type = arr1[$i += 1];\n if ($i) {\n out += ' if (' + ($coerced) + ' === undefined) { ';\n $bracesCoercion += '}';\n }\n if (it.opts.coerceTypes == 'array' && $type != 'array') {\n out += ' if (' + ($dataType) + ' == \\'array\\' && ' + ($data) + '.length == 1) { ' + ($coerced) + ' = ' + ($data) + ' = ' + ($data) + '[0]; ' + ($dataType) + ' = typeof ' + ($data) + '; } ';\n }\n if ($type == 'string') {\n out += ' if (' + ($dataType) + ' == \\'number\\' || ' + ($dataType) + ' == \\'boolean\\') ' + ($coerced) + ' = \\'\\' + ' + ($data) + '; else if (' + ($data) + ' === null) ' + ($coerced) + ' = \\'\\'; ';\n } else if ($type == 'number' || $type == 'integer') {\n out += ' if (' + ($dataType) + ' == \\'boolean\\' || ' + ($data) + ' === null || (' + ($dataType) + ' == \\'string\\' && ' + ($data) + ' && ' + ($data) + ' == +' + ($data) + ' ';\n if ($type == 'integer') {\n out += ' && !(' + ($data) + ' % 1)';\n }\n out += ')) ' + ($coerced) + ' = +' + ($data) + '; ';\n } else if ($type == 'boolean') {\n out += ' if (' + ($data) + ' === \\'false\\' || ' + ($data) + ' === 0 || ' + ($data) + ' === null) ' + ($coerced) + ' = false; else if (' + ($data) + ' === \\'true\\' || ' + ($data) + ' === 1) ' + ($coerced) + ' = true; ';\n } else if ($type == 'null') {\n out += ' if (' + ($data) + ' === \\'\\' || ' + ($data) + ' === 0 || ' + ($data) + ' === false) ' + ($coerced) + ' = null; ';\n } else if (it.opts.coerceTypes == 'array' && $type == 'array') {\n out += ' if (' + ($dataType) + ' == \\'string\\' || ' + ($dataType) + ' == \\'number\\' || ' + ($dataType) + ' == \\'boolean\\' || ' + ($data) + ' == null) ' + ($coerced) + ' = [' + ($data) + ']; ';\n }\n }\n }\n out += ' ' + ($bracesCoercion) + ' if (' + ($coerced) + ' === undefined) { ';\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ($errorKeyword || 'type') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \\'';\n if ($typeIsArray) {\n out += '' + ($typeSchema.join(\",\"));\n } else {\n out += '' + ($typeSchema);\n }\n out += '\\' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should be ';\n if ($typeIsArray) {\n out += '' + ($typeSchema.join(\",\"));\n } else {\n out += '' + ($typeSchema);\n }\n out += '\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += ' } else { ';\n var $parentData = $dataLvl ? 'data' + (($dataLvl - 1) || '') : 'parentData',\n $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty';\n out += ' ' + ($data) + ' = ' + ($coerced) + '; ';\n if (!$dataLvl) {\n out += 'if (' + ($parentData) + ' !== undefined)';\n }\n out += ' ' + ($parentData) + '[' + ($parentDataProperty) + '] = ' + ($coerced) + '; } ';\n } else {\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ($errorKeyword || 'type') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \\'';\n if ($typeIsArray) {\n out += '' + ($typeSchema.join(\",\"));\n } else {\n out += '' + ($typeSchema);\n }\n out += '\\' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should be ';\n if ($typeIsArray) {\n out += '' + ($typeSchema.join(\",\"));\n } else {\n out += '' + ($typeSchema);\n }\n out += '\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n }\n out += ' } ';\n }\n }\n if (it.schema.$ref && !$refKeywords) {\n out += ' ' + (it.RULES.all.$ref.code(it, '$ref')) + ' ';\n if ($breakOnError) {\n out += ' } if (errors === ';\n if ($top) {\n out += '0';\n } else {\n out += 'errs_' + ($lvl);\n }\n out += ') { ';\n $closingBraces2 += '}';\n }\n } else {\n var arr2 = it.RULES;\n if (arr2) {\n var $rulesGroup, i2 = -1,\n l2 = arr2.length - 1;\n while (i2 < l2) {\n $rulesGroup = arr2[i2 += 1];\n if ($shouldUseGroup($rulesGroup)) {\n if ($rulesGroup.type) {\n out += ' if (' + (it.util.checkDataType($rulesGroup.type, $data)) + ') { ';\n }\n if (it.opts.useDefaults) {\n if ($rulesGroup.type == 'object' && it.schema.properties) {\n var $schema = it.schema.properties,\n $schemaKeys = Object.keys($schema);\n var arr3 = $schemaKeys;\n if (arr3) {\n var $propertyKey, i3 = -1,\n l3 = arr3.length - 1;\n while (i3 < l3) {\n $propertyKey = arr3[i3 += 1];\n var $sch = $schema[$propertyKey];\n if ($sch.default !== undefined) {\n var $passData = $data + it.util.getProperty($propertyKey);\n if (it.compositeRule) {\n if (it.opts.strictDefaults) {\n var $defaultMsg = 'default is ignored for: ' + $passData;\n if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg);\n else throw new Error($defaultMsg);\n }\n } else {\n out += ' if (' + ($passData) + ' === undefined ';\n if (it.opts.useDefaults == 'empty') {\n out += ' || ' + ($passData) + ' === null || ' + ($passData) + ' === \\'\\' ';\n }\n out += ' ) ' + ($passData) + ' = ';\n if (it.opts.useDefaults == 'shared') {\n out += ' ' + (it.useDefault($sch.default)) + ' ';\n } else {\n out += ' ' + (JSON.stringify($sch.default)) + ' ';\n }\n out += '; ';\n }\n }\n }\n }\n } else if ($rulesGroup.type == 'array' && Array.isArray(it.schema.items)) {\n var arr4 = it.schema.items;\n if (arr4) {\n var $sch, $i = -1,\n l4 = arr4.length - 1;\n while ($i < l4) {\n $sch = arr4[$i += 1];\n if ($sch.default !== undefined) {\n var $passData = $data + '[' + $i + ']';\n if (it.compositeRule) {\n if (it.opts.strictDefaults) {\n var $defaultMsg = 'default is ignored for: ' + $passData;\n if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg);\n else throw new Error($defaultMsg);\n }\n } else {\n out += ' if (' + ($passData) + ' === undefined ';\n if (it.opts.useDefaults == 'empty') {\n out += ' || ' + ($passData) + ' === null || ' + ($passData) + ' === \\'\\' ';\n }\n out += ' ) ' + ($passData) + ' = ';\n if (it.opts.useDefaults == 'shared') {\n out += ' ' + (it.useDefault($sch.default)) + ' ';\n } else {\n out += ' ' + (JSON.stringify($sch.default)) + ' ';\n }\n out += '; ';\n }\n }\n }\n }\n }\n }\n var arr5 = $rulesGroup.rules;\n if (arr5) {\n var $rule, i5 = -1,\n l5 = arr5.length - 1;\n while (i5 < l5) {\n $rule = arr5[i5 += 1];\n if ($shouldUseRule($rule)) {\n var $code = $rule.code(it, $rule.keyword, $rulesGroup.type);\n if ($code) {\n out += ' ' + ($code) + ' ';\n if ($breakOnError) {\n $closingBraces1 += '}';\n }\n }\n }\n }\n }\n if ($breakOnError) {\n out += ' ' + ($closingBraces1) + ' ';\n $closingBraces1 = '';\n }\n if ($rulesGroup.type) {\n out += ' } ';\n if ($typeSchema && $typeSchema === $rulesGroup.type && !$coerceToTypes) {\n out += ' else { ';\n var $schemaPath = it.schemaPath + '.type',\n $errSchemaPath = it.errSchemaPath + '/type';\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ($errorKeyword || 'type') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \\'';\n if ($typeIsArray) {\n out += '' + ($typeSchema.join(\",\"));\n } else {\n out += '' + ($typeSchema);\n }\n out += '\\' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should be ';\n if ($typeIsArray) {\n out += '' + ($typeSchema.join(\",\"));\n } else {\n out += '' + ($typeSchema);\n }\n out += '\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += ' } ';\n }\n }\n if ($breakOnError) {\n out += ' if (errors === ';\n if ($top) {\n out += '0';\n } else {\n out += 'errs_' + ($lvl);\n }\n out += ') { ';\n $closingBraces2 += '}';\n }\n }\n }\n }\n }\n if ($breakOnError) {\n out += ' ' + ($closingBraces2) + ' ';\n }\n if ($top) {\n if ($async) {\n out += ' if (errors === 0) return data; ';\n out += ' else throw new ValidationError(vErrors); ';\n } else {\n out += ' validate.errors = vErrors; ';\n out += ' return errors === 0; ';\n }\n out += ' }; return validate;';\n } else {\n out += ' var ' + ($valid) + ' = errors === errs_' + ($lvl) + ';';\n }\n out = it.util.cleanUpCode(out);\n if ($top) {\n out = it.util.finalCleanUpCode(out, $async);\n }\n\n function $shouldUseGroup($rulesGroup) {\n var rules = $rulesGroup.rules;\n for (var i = 0; i < rules.length; i++)\n if ($shouldUseRule(rules[i])) return true;\n }\n\n function $shouldUseRule($rule) {\n return it.schema[$rule.keyword] !== undefined || ($rule.implements && $ruleImplementsSomeKeyword($rule));\n }\n\n function $ruleImplementsSomeKeyword($rule) {\n var impl = $rule.implements;\n for (var i = 0; i < impl.length; i++)\n if (it.schema[impl[i]] !== undefined) return true;\n }\n return out;\n}\n","'use strict';\nmodule.exports = function generate__limit(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $errorKeyword;\n var $data = 'data' + ($dataLvl || '');\n var $isData = it.opts.$data && $schema && $schema.$data,\n $schemaValue;\n if ($isData) {\n out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';\n $schemaValue = 'schema' + $lvl;\n } else {\n $schemaValue = $schema;\n }\n var $isMax = $keyword == 'maximum',\n $exclusiveKeyword = $isMax ? 'exclusiveMaximum' : 'exclusiveMinimum',\n $schemaExcl = it.schema[$exclusiveKeyword],\n $isDataExcl = it.opts.$data && $schemaExcl && $schemaExcl.$data,\n $op = $isMax ? '<' : '>',\n $notOp = $isMax ? '>' : '<',\n $errorKeyword = undefined;\n if ($isDataExcl) {\n var $schemaValueExcl = it.util.getData($schemaExcl.$data, $dataLvl, it.dataPathArr),\n $exclusive = 'exclusive' + $lvl,\n $exclType = 'exclType' + $lvl,\n $exclIsNumber = 'exclIsNumber' + $lvl,\n $opExpr = 'op' + $lvl,\n $opStr = '\\' + ' + $opExpr + ' + \\'';\n out += ' var schemaExcl' + ($lvl) + ' = ' + ($schemaValueExcl) + '; ';\n $schemaValueExcl = 'schemaExcl' + $lvl;\n out += ' var ' + ($exclusive) + '; var ' + ($exclType) + ' = typeof ' + ($schemaValueExcl) + '; if (' + ($exclType) + ' != \\'boolean\\' && ' + ($exclType) + ' != \\'undefined\\' && ' + ($exclType) + ' != \\'number\\') { ';\n var $errorKeyword = $exclusiveKeyword;\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ($errorKeyword || '_exclusiveLimit') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'' + ($exclusiveKeyword) + ' should be boolean\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += ' } else if ( ';\n if ($isData) {\n out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \\'number\\') || ';\n }\n out += ' ' + ($exclType) + ' == \\'number\\' ? ( (' + ($exclusive) + ' = ' + ($schemaValue) + ' === undefined || ' + ($schemaValueExcl) + ' ' + ($op) + '= ' + ($schemaValue) + ') ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaValueExcl) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) : ( (' + ($exclusive) + ' = ' + ($schemaValueExcl) + ' === true) ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaValue) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) || ' + ($data) + ' !== ' + ($data) + ') { var op' + ($lvl) + ' = ' + ($exclusive) + ' ? \\'' + ($op) + '\\' : \\'' + ($op) + '=\\'; ';\n if ($schema === undefined) {\n $errorKeyword = $exclusiveKeyword;\n $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword;\n $schemaValue = $schemaValueExcl;\n $isData = $isDataExcl;\n }\n } else {\n var $exclIsNumber = typeof $schemaExcl == 'number',\n $opStr = $op;\n if ($exclIsNumber && $isData) {\n var $opExpr = '\\'' + $opStr + '\\'';\n out += ' if ( ';\n if ($isData) {\n out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \\'number\\') || ';\n }\n out += ' ( ' + ($schemaValue) + ' === undefined || ' + ($schemaExcl) + ' ' + ($op) + '= ' + ($schemaValue) + ' ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaExcl) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) || ' + ($data) + ' !== ' + ($data) + ') { ';\n } else {\n if ($exclIsNumber && $schema === undefined) {\n $exclusive = true;\n $errorKeyword = $exclusiveKeyword;\n $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword;\n $schemaValue = $schemaExcl;\n $notOp += '=';\n } else {\n if ($exclIsNumber) $schemaValue = Math[$isMax ? 'min' : 'max']($schemaExcl, $schema);\n if ($schemaExcl === ($exclIsNumber ? $schemaValue : true)) {\n $exclusive = true;\n $errorKeyword = $exclusiveKeyword;\n $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword;\n $notOp += '=';\n } else {\n $exclusive = false;\n $opStr += '=';\n }\n }\n var $opExpr = '\\'' + $opStr + '\\'';\n out += ' if ( ';\n if ($isData) {\n out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \\'number\\') || ';\n }\n out += ' ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' || ' + ($data) + ' !== ' + ($data) + ') { ';\n }\n }\n $errorKeyword = $errorKeyword || $keyword;\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ($errorKeyword || '_limit') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { comparison: ' + ($opExpr) + ', limit: ' + ($schemaValue) + ', exclusive: ' + ($exclusive) + ' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should be ' + ($opStr) + ' ';\n if ($isData) {\n out += '\\' + ' + ($schemaValue);\n } else {\n out += '' + ($schemaValue) + '\\'';\n }\n }\n if (it.opts.verbose) {\n out += ' , schema: ';\n if ($isData) {\n out += 'validate.schema' + ($schemaPath);\n } else {\n out += '' + ($schema);\n }\n out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += ' } ';\n if ($breakOnError) {\n out += ' else { ';\n }\n return out;\n}\n","'use strict';\nmodule.exports = function generate__limitItems(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $errorKeyword;\n var $data = 'data' + ($dataLvl || '');\n var $isData = it.opts.$data && $schema && $schema.$data,\n $schemaValue;\n if ($isData) {\n out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';\n $schemaValue = 'schema' + $lvl;\n } else {\n $schemaValue = $schema;\n }\n var $op = $keyword == 'maxItems' ? '>' : '<';\n out += 'if ( ';\n if ($isData) {\n out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \\'number\\') || ';\n }\n out += ' ' + ($data) + '.length ' + ($op) + ' ' + ($schemaValue) + ') { ';\n var $errorKeyword = $keyword;\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ($errorKeyword || '_limitItems') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should NOT have ';\n if ($keyword == 'maxItems') {\n out += 'more';\n } else {\n out += 'fewer';\n }\n out += ' than ';\n if ($isData) {\n out += '\\' + ' + ($schemaValue) + ' + \\'';\n } else {\n out += '' + ($schema);\n }\n out += ' items\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: ';\n if ($isData) {\n out += 'validate.schema' + ($schemaPath);\n } else {\n out += '' + ($schema);\n }\n out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += '} ';\n if ($breakOnError) {\n out += ' else { ';\n }\n return out;\n}\n","'use strict';\nmodule.exports = function generate__limitLength(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $errorKeyword;\n var $data = 'data' + ($dataLvl || '');\n var $isData = it.opts.$data && $schema && $schema.$data,\n $schemaValue;\n if ($isData) {\n out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';\n $schemaValue = 'schema' + $lvl;\n } else {\n $schemaValue = $schema;\n }\n var $op = $keyword == 'maxLength' ? '>' : '<';\n out += 'if ( ';\n if ($isData) {\n out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \\'number\\') || ';\n }\n if (it.opts.unicode === false) {\n out += ' ' + ($data) + '.length ';\n } else {\n out += ' ucs2length(' + ($data) + ') ';\n }\n out += ' ' + ($op) + ' ' + ($schemaValue) + ') { ';\n var $errorKeyword = $keyword;\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ($errorKeyword || '_limitLength') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should NOT be ';\n if ($keyword == 'maxLength') {\n out += 'longer';\n } else {\n out += 'shorter';\n }\n out += ' than ';\n if ($isData) {\n out += '\\' + ' + ($schemaValue) + ' + \\'';\n } else {\n out += '' + ($schema);\n }\n out += ' characters\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: ';\n if ($isData) {\n out += 'validate.schema' + ($schemaPath);\n } else {\n out += '' + ($schema);\n }\n out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += '} ';\n if ($breakOnError) {\n out += ' else { ';\n }\n return out;\n}\n","'use strict';\nmodule.exports = function generate__limitProperties(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $errorKeyword;\n var $data = 'data' + ($dataLvl || '');\n var $isData = it.opts.$data && $schema && $schema.$data,\n $schemaValue;\n if ($isData) {\n out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';\n $schemaValue = 'schema' + $lvl;\n } else {\n $schemaValue = $schema;\n }\n var $op = $keyword == 'maxProperties' ? '>' : '<';\n out += 'if ( ';\n if ($isData) {\n out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \\'number\\') || ';\n }\n out += ' Object.keys(' + ($data) + ').length ' + ($op) + ' ' + ($schemaValue) + ') { ';\n var $errorKeyword = $keyword;\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ($errorKeyword || '_limitProperties') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should NOT have ';\n if ($keyword == 'maxProperties') {\n out += 'more';\n } else {\n out += 'fewer';\n }\n out += ' than ';\n if ($isData) {\n out += '\\' + ' + ($schemaValue) + ' + \\'';\n } else {\n out += '' + ($schema);\n }\n out += ' properties\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: ';\n if ($isData) {\n out += 'validate.schema' + ($schemaPath);\n } else {\n out += '' + ($schema);\n }\n out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += '} ';\n if ($breakOnError) {\n out += ' else { ';\n }\n return out;\n}\n","module.exports = function() {\n\tthrow new Error(\"define cannot be used indirect\");\n};\n","var getPrototypeOf = require(\"./getPrototypeOf\");\n\nvar setPrototypeOf = require(\"./setPrototypeOf\");\n\nvar isNativeFunction = require(\"./isNativeFunction\");\n\nvar construct = require(\"./construct\");\n\nfunction _wrapNativeSuper(Class) {\n var _cache = typeof Map === \"function\" ? new Map() : undefined;\n\n module.exports = _wrapNativeSuper = function _wrapNativeSuper(Class) {\n if (Class === null || !isNativeFunction(Class)) return Class;\n\n if (typeof Class !== \"function\") {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n if (typeof _cache !== \"undefined\") {\n if (_cache.has(Class)) return _cache.get(Class);\n\n _cache.set(Class, Wrapper);\n }\n\n function Wrapper() {\n return construct(Class, arguments, getPrototypeOf(this).constructor);\n }\n\n Wrapper.prototype = Object.create(Class.prototype, {\n constructor: {\n value: Wrapper,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n return setPrototypeOf(Wrapper, Class);\n };\n\n return _wrapNativeSuper(Class);\n}\n\nmodule.exports = _wrapNativeSuper;","function _asyncIterator(iterable) {\n var method;\n\n if (typeof Symbol !== \"undefined\") {\n if (Symbol.asyncIterator) {\n method = iterable[Symbol.asyncIterator];\n if (method != null) return method.call(iterable);\n }\n\n if (Symbol.iterator) {\n method = iterable[Symbol.iterator];\n if (method != null) return method.call(iterable);\n }\n }\n\n throw new TypeError(\"Object is not async iterable\");\n}\n\nmodule.exports = _asyncIterator;","var AsyncGenerator = require(\"./AsyncGenerator\");\n\nfunction _wrapAsyncGenerator(fn) {\n return function () {\n return new AsyncGenerator(fn.apply(this, arguments));\n };\n}\n\nmodule.exports = _wrapAsyncGenerator;","var baseMerge = require('./_baseMerge'),\n createAssigner = require('./_createAssigner');\n\n/**\n * This method is like `_.assign` except that it recursively merges own and\n * inherited enumerable string keyed properties of source objects into the\n * destination object. Source properties that resolve to `undefined` are\n * skipped if a destination value exists. Array and plain object properties\n * are merged recursively. Other objects and value types are overridden by\n * assignment. Source objects are applied from left to right. Subsequent\n * sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {\n * 'a': [{ 'b': 2 }, { 'd': 4 }]\n * };\n *\n * var other = {\n * 'a': [{ 'c': 3 }, { 'e': 5 }]\n * };\n *\n * _.merge(object, other);\n * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n */\nvar merge = createAssigner(function(object, source, srcIndex) {\n baseMerge(object, source, srcIndex);\n});\n\nmodule.exports = merge;\n","'use strict';\n\nvar compileSchema = require('./compile')\n , resolve = require('./compile/resolve')\n , Cache = require('./cache')\n , SchemaObject = require('./compile/schema_obj')\n , stableStringify = require('fast-json-stable-stringify')\n , formats = require('./compile/formats')\n , rules = require('./compile/rules')\n , $dataMetaSchema = require('./data')\n , util = require('./compile/util');\n\nmodule.exports = Ajv;\n\nAjv.prototype.validate = validate;\nAjv.prototype.compile = compile;\nAjv.prototype.addSchema = addSchema;\nAjv.prototype.addMetaSchema = addMetaSchema;\nAjv.prototype.validateSchema = validateSchema;\nAjv.prototype.getSchema = getSchema;\nAjv.prototype.removeSchema = removeSchema;\nAjv.prototype.addFormat = addFormat;\nAjv.prototype.errorsText = errorsText;\n\nAjv.prototype._addSchema = _addSchema;\nAjv.prototype._compile = _compile;\n\nAjv.prototype.compileAsync = require('./compile/async');\nvar customKeyword = require('./keyword');\nAjv.prototype.addKeyword = customKeyword.add;\nAjv.prototype.getKeyword = customKeyword.get;\nAjv.prototype.removeKeyword = customKeyword.remove;\nAjv.prototype.validateKeyword = customKeyword.validate;\n\nvar errorClasses = require('./compile/error_classes');\nAjv.ValidationError = errorClasses.Validation;\nAjv.MissingRefError = errorClasses.MissingRef;\nAjv.$dataMetaSchema = $dataMetaSchema;\n\nvar META_SCHEMA_ID = 'http://json-schema.org/draft-07/schema';\n\nvar META_IGNORE_OPTIONS = [ 'removeAdditional', 'useDefaults', 'coerceTypes', 'strictDefaults' ];\nvar META_SUPPORT_DATA = ['/properties'];\n\n/**\n * Creates validator instance.\n * Usage: `Ajv(opts)`\n * @param {Object} opts optional options\n * @return {Object} ajv instance\n */\nfunction Ajv(opts) {\n if (!(this instanceof Ajv)) return new Ajv(opts);\n opts = this._opts = util.copy(opts) || {};\n setLogger(this);\n this._schemas = {};\n this._refs = {};\n this._fragments = {};\n this._formats = formats(opts.format);\n\n this._cache = opts.cache || new Cache;\n this._loadingSchemas = {};\n this._compilations = [];\n this.RULES = rules();\n this._getId = chooseGetId(opts);\n\n opts.loopRequired = opts.loopRequired || Infinity;\n if (opts.errorDataPath == 'property') opts._errorDataPathProperty = true;\n if (opts.serialize === undefined) opts.serialize = stableStringify;\n this._metaOpts = getMetaSchemaOptions(this);\n\n if (opts.formats) addInitialFormats(this);\n if (opts.keywords) addInitialKeywords(this);\n addDefaultMetaSchema(this);\n if (typeof opts.meta == 'object') this.addMetaSchema(opts.meta);\n if (opts.nullable) this.addKeyword('nullable', {metaSchema: {type: 'boolean'}});\n addInitialSchemas(this);\n}\n\n\n\n/**\n * Validate data using schema\n * Schema will be compiled and cached (using serialized JSON as key. [fast-json-stable-stringify](https://github.com/epoberezkin/fast-json-stable-stringify) is used to serialize.\n * @this Ajv\n * @param {String|Object} schemaKeyRef key, ref or schema object\n * @param {Any} data to be validated\n * @return {Boolean} validation result. Errors from the last validation will be available in `ajv.errors` (and also in compiled schema: `schema.errors`).\n */\nfunction validate(schemaKeyRef, data) {\n var v;\n if (typeof schemaKeyRef == 'string') {\n v = this.getSchema(schemaKeyRef);\n if (!v) throw new Error('no schema with key or ref \"' + schemaKeyRef + '\"');\n } else {\n var schemaObj = this._addSchema(schemaKeyRef);\n v = schemaObj.validate || this._compile(schemaObj);\n }\n\n var valid = v(data);\n if (v.$async !== true) this.errors = v.errors;\n return valid;\n}\n\n\n/**\n * Create validating function for passed schema.\n * @this Ajv\n * @param {Object} schema schema object\n * @param {Boolean} _meta true if schema is a meta-schema. Used internally to compile meta schemas of custom keywords.\n * @return {Function} validating function\n */\nfunction compile(schema, _meta) {\n var schemaObj = this._addSchema(schema, undefined, _meta);\n return schemaObj.validate || this._compile(schemaObj);\n}\n\n\n/**\n * Adds schema to the instance.\n * @this Ajv\n * @param {Object|Array} schema schema or array of schemas. If array is passed, `key` and other parameters will be ignored.\n * @param {String} key Optional schema key. Can be passed to `validate` method instead of schema object or id/ref. One schema per instance can have empty `id` and `key`.\n * @param {Boolean} _skipValidation true to skip schema validation. Used internally, option validateSchema should be used instead.\n * @param {Boolean} _meta true if schema is a meta-schema. Used internally, addMetaSchema should be used instead.\n * @return {Ajv} this for method chaining\n */\nfunction addSchema(schema, key, _skipValidation, _meta) {\n if (Array.isArray(schema)){\n for (var i=0; i} errors optional array of validation errors, if not passed errors from the instance are used.\n * @param {Object} options optional options with properties `separator` and `dataVar`.\n * @return {String} human readable string with all errors descriptions\n */\nfunction errorsText(errors, options) {\n errors = errors || this.errors;\n if (!errors) return 'No errors';\n options = options || {};\n var separator = options.separator === undefined ? ', ' : options.separator;\n var dataVar = options.dataVar === undefined ? 'data' : options.dataVar;\n\n var text = '';\n for (var i=0; i result for the\n // current iteration.\n result.value = unwrapped;\n resolve(result);\n }, function(error) {\n // If a rejected Promise was yielded, throw the rejection back\n // into the async generator function so it can be handled there.\n return invoke(\"throw\", error, resolve, reject);\n });\n }\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new PromiseImpl(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n return this;\n };\n exports.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n exports.async = function(innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n if (PromiseImpl === void 0) PromiseImpl = Promise;\n\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList),\n PromiseImpl\n );\n\n return exports.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n // Note: [\"return\"] must be used for ES3 parsing compatibility.\n if (delegate.iterator[\"return\"]) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n Gp[toStringTagSymbol] = \"Generator\";\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n Gp[iteratorSymbol] = function() {\n return this;\n };\n\n Gp.toString = function() {\n return \"[object Generator]\";\n };\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n exports.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n exports.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n\n // Regardless of whether this script is executing as a CommonJS module\n // or not, return the runtime object so that we can declare the variable\n // regeneratorRuntime in the outer scope, which allows this module to be\n // injected easily by `bin/regenerator --include-runtime script.js`.\n return exports;\n\n}(\n // If this script is executing as a CommonJS module, use module.exports\n // as the regeneratorRuntime namespace. Otherwise create a new empty\n // object. Either way, the resulting object will be used to initialize\n // the regeneratorRuntime variable at the top of this file.\n typeof module === \"object\" ? module.exports : {}\n));\n\ntry {\n regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n // This module should not be running in strict mode, so the above\n // assignment should always work unless something is misconfigured. Just\n // in case runtime.js accidentally runs in strict mode, we can escape\n // strict mode using a global Function call. This could conceivably fail\n // if a Content Security Policy forbids using Function, but in that case\n // the proper solution is to fix the accidental strict mode problem. If\n // you've misconfigured your bundler to force strict mode and applied a\n // CSP to forbid Function, and you're not willing to fix either of those\n // problems, please detail your unique predicament in a GitHub issue.\n Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n}\n","'use strict';\nmodule.exports = str => encodeURIComponent(str).replace(/[!'()*]/g, x => `%${x.charCodeAt(0).toString(16).toUpperCase()}`);\n","'use strict';\nvar token = '%[a-f0-9]{2}';\nvar singleMatcher = new RegExp(token, 'gi');\nvar multiMatcher = new RegExp('(' + token + ')+', 'gi');\n\nfunction decodeComponents(components, split) {\n\ttry {\n\t\t// Try to decode the entire string first\n\t\treturn decodeURIComponent(components.join(''));\n\t} catch (err) {\n\t\t// Do nothing\n\t}\n\n\tif (components.length === 1) {\n\t\treturn components;\n\t}\n\n\tsplit = split || 1;\n\n\t// Split the array in 2 parts\n\tvar left = components.slice(0, split);\n\tvar right = components.slice(split);\n\n\treturn Array.prototype.concat.call([], decodeComponents(left), decodeComponents(right));\n}\n\nfunction decode(input) {\n\ttry {\n\t\treturn decodeURIComponent(input);\n\t} catch (err) {\n\t\tvar tokens = input.match(singleMatcher);\n\n\t\tfor (var i = 1; i < tokens.length; i++) {\n\t\t\tinput = decodeComponents(tokens, i).join('');\n\n\t\t\ttokens = input.match(singleMatcher);\n\t\t}\n\n\t\treturn input;\n\t}\n}\n\nfunction customDecodeURIComponent(input) {\n\t// Keep track of all the replacements and prefill the map with the `BOM`\n\tvar replaceMap = {\n\t\t'%FE%FF': '\\uFFFD\\uFFFD',\n\t\t'%FF%FE': '\\uFFFD\\uFFFD'\n\t};\n\n\tvar match = multiMatcher.exec(input);\n\twhile (match) {\n\t\ttry {\n\t\t\t// Decode as big chunks as possible\n\t\t\treplaceMap[match[0]] = decodeURIComponent(match[0]);\n\t\t} catch (err) {\n\t\t\tvar result = decode(match[0]);\n\n\t\t\tif (result !== match[0]) {\n\t\t\t\treplaceMap[match[0]] = result;\n\t\t\t}\n\t\t}\n\n\t\tmatch = multiMatcher.exec(input);\n\t}\n\n\t// Add `%C2` at the end of the map to make sure it does not replace the combinator before everything else\n\treplaceMap['%C2'] = '\\uFFFD';\n\n\tvar entries = Object.keys(replaceMap);\n\n\tfor (var i = 0; i < entries.length; i++) {\n\t\t// Replace all decoded components\n\t\tvar key = entries[i];\n\t\tinput = input.replace(new RegExp(key, 'g'), replaceMap[key]);\n\t}\n\n\treturn input;\n}\n\nmodule.exports = function (encodedURI) {\n\tif (typeof encodedURI !== 'string') {\n\t\tthrow new TypeError('Expected `encodedURI` to be of type `string`, got `' + typeof encodedURI + '`');\n\t}\n\n\ttry {\n\t\tencodedURI = encodedURI.replace(/\\+/g, ' ');\n\n\t\t// Try the built in decoder first\n\t\treturn decodeURIComponent(encodedURI);\n\t} catch (err) {\n\t\t// Fallback to a more advanced decoder\n\t\treturn customDecodeURIComponent(encodedURI);\n\t}\n};\n","'use strict';\n\nmodule.exports = (string, separator) => {\n\tif (!(typeof string === 'string' && typeof separator === 'string')) {\n\t\tthrow new TypeError('Expected the arguments to be of type `string`');\n\t}\n\n\tif (separator === '') {\n\t\treturn [string];\n\t}\n\n\tconst separatorIndex = string.indexOf(separator);\n\n\tif (separatorIndex === -1) {\n\t\treturn [string];\n\t}\n\n\treturn [\n\t\tstring.slice(0, separatorIndex),\n\t\tstring.slice(separatorIndex + separator.length)\n\t];\n};\n","function _isNativeFunction(fn) {\n return Function.toString.call(fn).indexOf(\"[native code]\") !== -1;\n}\n\nmodule.exports = _isNativeFunction;","function _isNativeReflectConstruct() {\n if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === \"function\") return true;\n\n try {\n Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n}\n\nmodule.exports = _isNativeReflectConstruct;","var AwaitValue = require(\"./AwaitValue\");\n\nfunction _awaitAsyncGenerator(value) {\n return new AwaitValue(value);\n}\n\nmodule.exports = _awaitAsyncGenerator;","var AwaitValue = require(\"./AwaitValue\");\n\nfunction AsyncGenerator(gen) {\n var front, back;\n\n function send(key, arg) {\n return new Promise(function (resolve, reject) {\n var request = {\n key: key,\n arg: arg,\n resolve: resolve,\n reject: reject,\n next: null\n };\n\n if (back) {\n back = back.next = request;\n } else {\n front = back = request;\n resume(key, arg);\n }\n });\n }\n\n function resume(key, arg) {\n try {\n var result = gen[key](arg);\n var value = result.value;\n var wrappedAwait = value instanceof AwaitValue;\n Promise.resolve(wrappedAwait ? value.wrapped : value).then(function (arg) {\n if (wrappedAwait) {\n resume(key === \"return\" ? \"return\" : \"next\", arg);\n return;\n }\n\n settle(result.done ? \"return\" : \"normal\", arg);\n }, function (err) {\n resume(\"throw\", err);\n });\n } catch (err) {\n settle(\"throw\", err);\n }\n }\n\n function settle(type, value) {\n switch (type) {\n case \"return\":\n front.resolve({\n value: value,\n done: true\n });\n break;\n\n case \"throw\":\n front.reject(value);\n break;\n\n default:\n front.resolve({\n value: value,\n done: false\n });\n break;\n }\n\n front = front.next;\n\n if (front) {\n resume(front.key, front.arg);\n } else {\n back = null;\n }\n }\n\n this._invoke = send;\n\n if (typeof gen[\"return\"] !== \"function\") {\n this[\"return\"] = undefined;\n }\n}\n\nif (typeof Symbol === \"function\" && Symbol.asyncIterator) {\n AsyncGenerator.prototype[Symbol.asyncIterator] = function () {\n return this;\n };\n}\n\nAsyncGenerator.prototype.next = function (arg) {\n return this._invoke(\"next\", arg);\n};\n\nAsyncGenerator.prototype[\"throw\"] = function (arg) {\n return this._invoke(\"throw\", arg);\n};\n\nAsyncGenerator.prototype[\"return\"] = function (arg) {\n return this._invoke(\"return\", arg);\n};\n\nmodule.exports = AsyncGenerator;","var Stack = require('./_Stack'),\n arrayEach = require('./_arrayEach'),\n assignValue = require('./_assignValue'),\n baseAssign = require('./_baseAssign'),\n baseAssignIn = require('./_baseAssignIn'),\n cloneBuffer = require('./_cloneBuffer'),\n copyArray = require('./_copyArray'),\n copySymbols = require('./_copySymbols'),\n copySymbolsIn = require('./_copySymbolsIn'),\n getAllKeys = require('./_getAllKeys'),\n getAllKeysIn = require('./_getAllKeysIn'),\n getTag = require('./_getTag'),\n initCloneArray = require('./_initCloneArray'),\n initCloneByTag = require('./_initCloneByTag'),\n initCloneObject = require('./_initCloneObject'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isMap = require('./isMap'),\n isObject = require('./isObject'),\n isSet = require('./isSet'),\n keys = require('./keys');\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n CLONE_FLAT_FLAG = 2,\n CLONE_SYMBOLS_FLAG = 4;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values supported by `_.clone`. */\nvar cloneableTags = {};\ncloneableTags[argsTag] = cloneableTags[arrayTag] =\ncloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\ncloneableTags[boolTag] = cloneableTags[dateTag] =\ncloneableTags[float32Tag] = cloneableTags[float64Tag] =\ncloneableTags[int8Tag] = cloneableTags[int16Tag] =\ncloneableTags[int32Tag] = cloneableTags[mapTag] =\ncloneableTags[numberTag] = cloneableTags[objectTag] =\ncloneableTags[regexpTag] = cloneableTags[setTag] =\ncloneableTags[stringTag] = cloneableTags[symbolTag] =\ncloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\ncloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\ncloneableTags[errorTag] = cloneableTags[funcTag] =\ncloneableTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n * traversed objects.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Deep clone\n * 2 - Flatten inherited properties\n * 4 - Clone symbols\n * @param {Function} [customizer] The function to customize cloning.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The parent object of `value`.\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n * @returns {*} Returns the cloned value.\n */\nfunction baseClone(value, bitmask, customizer, key, object, stack) {\n var result,\n isDeep = bitmask & CLONE_DEEP_FLAG,\n isFlat = bitmask & CLONE_FLAT_FLAG,\n isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n if (customizer) {\n result = object ? customizer(value, key, object, stack) : customizer(value);\n }\n if (result !== undefined) {\n return result;\n }\n if (!isObject(value)) {\n return value;\n }\n var isArr = isArray(value);\n if (isArr) {\n result = initCloneArray(value);\n if (!isDeep) {\n return copyArray(value, result);\n }\n } else {\n var tag = getTag(value),\n isFunc = tag == funcTag || tag == genTag;\n\n if (isBuffer(value)) {\n return cloneBuffer(value, isDeep);\n }\n if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n result = (isFlat || isFunc) ? {} : initCloneObject(value);\n if (!isDeep) {\n return isFlat\n ? copySymbolsIn(value, baseAssignIn(result, value))\n : copySymbols(value, baseAssign(result, value));\n }\n } else {\n if (!cloneableTags[tag]) {\n return object ? value : {};\n }\n result = initCloneByTag(value, tag, isDeep);\n }\n }\n // Check for circular references and return its corresponding clone.\n stack || (stack = new Stack);\n var stacked = stack.get(value);\n if (stacked) {\n return stacked;\n }\n stack.set(value, result);\n\n if (isSet(value)) {\n value.forEach(function(subValue) {\n result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n });\n } else if (isMap(value)) {\n value.forEach(function(subValue, key) {\n result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n }\n\n var keysFunc = isFull\n ? (isFlat ? getAllKeysIn : getAllKeys)\n : (isFlat ? keysIn : keys);\n\n var props = isArr ? undefined : keysFunc(value);\n arrayEach(props || value, function(subValue, key) {\n if (props) {\n key = subValue;\n subValue = value[key];\n }\n // Recursively populate clone (susceptible to call stack limits).\n assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n return result;\n}\n\nmodule.exports = baseClone;\n","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\nmodule.exports = listCacheClear;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\nmodule.exports = listCacheDelete;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\nmodule.exports = listCacheGet;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\nmodule.exports = listCacheSet;\n","var ListCache = require('./_ListCache');\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache;\n this.size = 0;\n}\n\nmodule.exports = stackClear;\n","/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n\n this.size = data.size;\n return result;\n}\n\nmodule.exports = stackDelete;\n","/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\nmodule.exports = stackGet;\n","/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\nmodule.exports = stackHas;\n","var ListCache = require('./_ListCache'),\n Map = require('./_Map'),\n MapCache = require('./_MapCache');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n}\n\nmodule.exports = stackSet;\n","var isFunction = require('./isFunction'),\n isMasked = require('./_isMasked'),\n isObject = require('./isObject'),\n toSource = require('./_toSource');\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","var coreJsData = require('./_coreJsData');\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n","var root = require('./_root');\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nmodule.exports = coreJsData;\n","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n","var Hash = require('./_Hash'),\n ListCache = require('./_ListCache'),\n Map = require('./_Map');\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\nmodule.exports = mapCacheClear;\n","var hashClear = require('./_hashClear'),\n hashDelete = require('./_hashDelete'),\n hashGet = require('./_hashGet'),\n hashHas = require('./_hashHas'),\n hashSet = require('./_hashSet');\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nmodule.exports = Hash;\n","var nativeCreate = require('./_nativeCreate');\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\nmodule.exports = hashClear;\n","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = hashDelete;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nmodule.exports = hashGet;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nmodule.exports = hashHas;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\nmodule.exports = hashSet;\n","var getMapData = require('./_getMapData');\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = mapCacheDelete;\n","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\nmodule.exports = isKeyable;\n","var getMapData = require('./_getMapData');\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\nmodule.exports = mapCacheGet;\n","var getMapData = require('./_getMapData');\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\nmodule.exports = mapCacheHas;\n","var getMapData = require('./_getMapData');\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\nmodule.exports = mapCacheSet;\n","/**\n * A specialized version of `_.forEach` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\nfunction arrayEach(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (iteratee(array[index], index, array) === false) {\n break;\n }\n }\n return array;\n}\n\nmodule.exports = arrayEach;\n","var copyObject = require('./_copyObject'),\n keys = require('./keys');\n\n/**\n * The base implementation of `_.assign` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssign(object, source) {\n return object && copyObject(source, keys(source), object);\n}\n\nmodule.exports = baseAssign;\n","/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\nmodule.exports = baseTimes;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nmodule.exports = baseIsArguments;\n","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nmodule.exports = stubFalse;\n","var baseGetTag = require('./_baseGetTag'),\n isLength = require('./isLength'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nmodule.exports = baseIsTypedArray;\n","var isPrototype = require('./_isPrototype'),\n nativeKeys = require('./_nativeKeys');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = baseKeys;\n","var overArg = require('./_overArg');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\nmodule.exports = nativeKeys;\n","var copyObject = require('./_copyObject'),\n keysIn = require('./keysIn');\n\n/**\n * The base implementation of `_.assignIn` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssignIn(object, source) {\n return object && copyObject(source, keysIn(source), object);\n}\n\nmodule.exports = baseAssignIn;\n","var isObject = require('./isObject'),\n isPrototype = require('./_isPrototype'),\n nativeKeysIn = require('./_nativeKeysIn');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeysIn(object) {\n if (!isObject(object)) {\n return nativeKeysIn(object);\n }\n var isProto = isPrototype(object),\n result = [];\n\n for (var key in object) {\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = baseKeysIn;\n","/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction nativeKeysIn(object) {\n var result = [];\n if (object != null) {\n for (var key in Object(object)) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = nativeKeysIn;\n","var copyObject = require('./_copyObject'),\n getSymbols = require('./_getSymbols');\n\n/**\n * Copies own symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbols(source, object) {\n return copyObject(source, getSymbols(source), object);\n}\n\nmodule.exports = copySymbols;\n","/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\n\nmodule.exports = arrayFilter;\n","var copyObject = require('./_copyObject'),\n getSymbolsIn = require('./_getSymbolsIn');\n\n/**\n * Copies own and inherited symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbolsIn(source, object) {\n return copyObject(source, getSymbolsIn(source), object);\n}\n\nmodule.exports = copySymbolsIn;\n","var baseGetAllKeys = require('./_baseGetAllKeys'),\n getSymbolsIn = require('./_getSymbolsIn'),\n keysIn = require('./keysIn');\n\n/**\n * Creates an array of own and inherited enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeysIn(object) {\n return baseGetAllKeys(object, keysIn, getSymbolsIn);\n}\n\nmodule.exports = getAllKeysIn;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView');\n\nmodule.exports = DataView;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Promise = getNative(root, 'Promise');\n\nmodule.exports = Promise;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nmodule.exports = WeakMap;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */\nfunction initCloneArray(array) {\n var length = array.length,\n result = new array.constructor(length);\n\n // Add properties assigned by `RegExp#exec`.\n if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n result.index = array.index;\n result.input = array.input;\n }\n return result;\n}\n\nmodule.exports = initCloneArray;\n","var cloneArrayBuffer = require('./_cloneArrayBuffer'),\n cloneDataView = require('./_cloneDataView'),\n cloneRegExp = require('./_cloneRegExp'),\n cloneSymbol = require('./_cloneSymbol'),\n cloneTypedArray = require('./_cloneTypedArray');\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneByTag(object, tag, isDeep) {\n var Ctor = object.constructor;\n switch (tag) {\n case arrayBufferTag:\n return cloneArrayBuffer(object);\n\n case boolTag:\n case dateTag:\n return new Ctor(+object);\n\n case dataViewTag:\n return cloneDataView(object, isDeep);\n\n case float32Tag: case float64Tag:\n case int8Tag: case int16Tag: case int32Tag:\n case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n return cloneTypedArray(object, isDeep);\n\n case mapTag:\n return new Ctor;\n\n case numberTag:\n case stringTag:\n return new Ctor(object);\n\n case regexpTag:\n return cloneRegExp(object);\n\n case setTag:\n return new Ctor;\n\n case symbolTag:\n return cloneSymbol(object);\n }\n}\n\nmodule.exports = initCloneByTag;\n","var cloneArrayBuffer = require('./_cloneArrayBuffer');\n\n/**\n * Creates a clone of `dataView`.\n *\n * @private\n * @param {Object} dataView The data view to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned data view.\n */\nfunction cloneDataView(dataView, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n}\n\nmodule.exports = cloneDataView;\n","/** Used to match `RegExp` flags from their coerced string values. */\nvar reFlags = /\\w*$/;\n\n/**\n * Creates a clone of `regexp`.\n *\n * @private\n * @param {Object} regexp The regexp to clone.\n * @returns {Object} Returns the cloned regexp.\n */\nfunction cloneRegExp(regexp) {\n var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n result.lastIndex = regexp.lastIndex;\n return result;\n}\n\nmodule.exports = cloneRegExp;\n","var Symbol = require('./_Symbol');\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * Creates a clone of the `symbol` object.\n *\n * @private\n * @param {Object} symbol The symbol object to clone.\n * @returns {Object} Returns the cloned symbol object.\n */\nfunction cloneSymbol(symbol) {\n return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n}\n\nmodule.exports = cloneSymbol;\n","var isObject = require('./isObject');\n\n/** Built-in value references. */\nvar objectCreate = Object.create;\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nvar baseCreate = (function() {\n function object() {}\n return function(proto) {\n if (!isObject(proto)) {\n return {};\n }\n if (objectCreate) {\n return objectCreate(proto);\n }\n object.prototype = proto;\n var result = new object;\n object.prototype = undefined;\n return result;\n };\n}());\n\nmodule.exports = baseCreate;\n","var baseIsMap = require('./_baseIsMap'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsMap = nodeUtil && nodeUtil.isMap;\n\n/**\n * Checks if `value` is classified as a `Map` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n * @example\n *\n * _.isMap(new Map);\n * // => true\n *\n * _.isMap(new WeakMap);\n * // => false\n */\nvar isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\nmodule.exports = isMap;\n","var getTag = require('./_getTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]';\n\n/**\n * The base implementation of `_.isMap` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n */\nfunction baseIsMap(value) {\n return isObjectLike(value) && getTag(value) == mapTag;\n}\n\nmodule.exports = baseIsMap;\n","var baseIsSet = require('./_baseIsSet'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsSet = nodeUtil && nodeUtil.isSet;\n\n/**\n * Checks if `value` is classified as a `Set` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n * @example\n *\n * _.isSet(new Set);\n * // => true\n *\n * _.isSet(new WeakSet);\n * // => false\n */\nvar isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\nmodule.exports = isSet;\n","var getTag = require('./_getTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar setTag = '[object Set]';\n\n/**\n * The base implementation of `_.isSet` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n */\nfunction baseIsSet(value) {\n return isObjectLike(value) && getTag(value) == setTag;\n}\n\nmodule.exports = baseIsSet;\n","var baseMatches = require('./_baseMatches'),\n baseMatchesProperty = require('./_baseMatchesProperty'),\n identity = require('./identity'),\n isArray = require('./isArray'),\n property = require('./property');\n\n/**\n * The base implementation of `_.iteratee`.\n *\n * @private\n * @param {*} [value=_.identity] The value to convert to an iteratee.\n * @returns {Function} Returns the iteratee.\n */\nfunction baseIteratee(value) {\n // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n if (typeof value == 'function') {\n return value;\n }\n if (value == null) {\n return identity;\n }\n if (typeof value == 'object') {\n return isArray(value)\n ? baseMatchesProperty(value[0], value[1])\n : baseMatches(value);\n }\n return property(value);\n}\n\nmodule.exports = baseIteratee;\n","var baseIsMatch = require('./_baseIsMatch'),\n getMatchData = require('./_getMatchData'),\n matchesStrictComparable = require('./_matchesStrictComparable');\n\n/**\n * The base implementation of `_.matches` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatches(source) {\n var matchData = getMatchData(source);\n if (matchData.length == 1 && matchData[0][2]) {\n return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n }\n return function(object) {\n return object === source || baseIsMatch(object, source, matchData);\n };\n}\n\nmodule.exports = baseMatches;\n","var Stack = require('./_Stack'),\n baseIsEqual = require('./_baseIsEqual');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Array} matchData The property names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\nfunction baseIsMatch(object, source, matchData, customizer) {\n var index = matchData.length,\n length = index,\n noCustomizer = !customizer;\n\n if (object == null) {\n return !length;\n }\n object = Object(object);\n while (index--) {\n var data = matchData[index];\n if ((noCustomizer && data[2])\n ? data[1] !== object[data[0]]\n : !(data[0] in object)\n ) {\n return false;\n }\n }\n while (++index < length) {\n data = matchData[index];\n var key = data[0],\n objValue = object[key],\n srcValue = data[1];\n\n if (noCustomizer && data[2]) {\n if (objValue === undefined && !(key in object)) {\n return false;\n }\n } else {\n var stack = new Stack;\n if (customizer) {\n var result = customizer(objValue, srcValue, key, object, source, stack);\n }\n if (!(result === undefined\n ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n : result\n )) {\n return false;\n }\n }\n }\n return true;\n}\n\nmodule.exports = baseIsMatch;\n","var Stack = require('./_Stack'),\n equalArrays = require('./_equalArrays'),\n equalByTag = require('./_equalByTag'),\n equalObjects = require('./_equalObjects'),\n getTag = require('./_getTag'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isTypedArray = require('./isTypedArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = objIsArr ? arrayTag : getTag(object),\n othTag = othIsArr ? arrayTag : getTag(other);\n\n objTag = objTag == argsTag ? objectTag : objTag;\n othTag = othTag == argsTag ? objectTag : othTag;\n\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && isBuffer(object)) {\n if (!isBuffer(other)) {\n return false;\n }\n objIsArr = true;\n objIsObj = false;\n }\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack);\n return (objIsArr || isTypedArray(object))\n ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n }\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n\n stack || (stack = new Stack);\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n }\n }\n if (!isSameTag) {\n return false;\n }\n stack || (stack = new Stack);\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n}\n\nmodule.exports = baseIsEqualDeep;\n","/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n}\n\nmodule.exports = setCacheAdd;\n","/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n return this.__data__.has(value);\n}\n\nmodule.exports = setCacheHas;\n","/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\nfunction arraySome(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n}\n\nmodule.exports = arraySome;\n","var Symbol = require('./_Symbol'),\n Uint8Array = require('./_Uint8Array'),\n eq = require('./eq'),\n equalArrays = require('./_equalArrays'),\n mapToArray = require('./_mapToArray'),\n setToArray = require('./_setToArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]';\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n switch (tag) {\n case dataViewTag:\n if ((object.byteLength != other.byteLength) ||\n (object.byteOffset != other.byteOffset)) {\n return false;\n }\n object = object.buffer;\n other = other.buffer;\n\n case arrayBufferTag:\n if ((object.byteLength != other.byteLength) ||\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n return false;\n }\n return true;\n\n case boolTag:\n case dateTag:\n case numberTag:\n // Coerce booleans to `1` or `0` and dates to milliseconds.\n // Invalid dates are coerced to `NaN`.\n return eq(+object, +other);\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings, primitives and objects,\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n // for more details.\n return object == (other + '');\n\n case mapTag:\n var convert = mapToArray;\n\n case setTag:\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n convert || (convert = setToArray);\n\n if (object.size != other.size && !isPartial) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked) {\n return stacked == other;\n }\n bitmask |= COMPARE_UNORDERED_FLAG;\n\n // Recursively compare objects (susceptible to call stack limits).\n stack.set(object, other);\n var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n stack['delete'](object);\n return result;\n\n case symbolTag:\n if (symbolValueOf) {\n return symbolValueOf.call(object) == symbolValueOf.call(other);\n }\n }\n return false;\n}\n\nmodule.exports = equalByTag;\n","/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n\n map.forEach(function(value, key) {\n result[++index] = [key, value];\n });\n return result;\n}\n\nmodule.exports = mapToArray;\n","var getAllKeys = require('./_getAllKeys');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n objProps = getAllKeys(object),\n objLength = objProps.length,\n othProps = getAllKeys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isPartial) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var result = true;\n stack.set(object, other);\n stack.set(other, object);\n\n var skipCtor = isPartial;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, objValue, key, other, object, stack)\n : customizer(objValue, othValue, key, object, other, stack);\n }\n // Recursively compare objects (susceptible to call stack limits).\n if (!(compared === undefined\n ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n : compared\n )) {\n result = false;\n break;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (result && !skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `Object` object instances with different constructors are not equal.\n if (objCtor != othCtor &&\n ('constructor' in object && 'constructor' in other) &&\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n result = false;\n }\n }\n stack['delete'](object);\n stack['delete'](other);\n return result;\n}\n\nmodule.exports = equalObjects;\n","var isStrictComparable = require('./_isStrictComparable'),\n keys = require('./keys');\n\n/**\n * Gets the property names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\nfunction getMatchData(object) {\n var result = keys(object),\n length = result.length;\n\n while (length--) {\n var key = result[length],\n value = object[key];\n\n result[length] = [key, value, isStrictComparable(value)];\n }\n return result;\n}\n\nmodule.exports = getMatchData;\n","var baseIsEqual = require('./_baseIsEqual'),\n get = require('./get'),\n hasIn = require('./hasIn'),\n isKey = require('./_isKey'),\n isStrictComparable = require('./_isStrictComparable'),\n matchesStrictComparable = require('./_matchesStrictComparable'),\n toKey = require('./_toKey');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatchesProperty(path, srcValue) {\n if (isKey(path) && isStrictComparable(srcValue)) {\n return matchesStrictComparable(toKey(path), srcValue);\n }\n return function(object) {\n var objValue = get(object, path);\n return (objValue === undefined && objValue === srcValue)\n ? hasIn(object, path)\n : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n };\n}\n\nmodule.exports = baseMatchesProperty;\n","var baseGet = require('./_baseGet');\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n}\n\nmodule.exports = get;\n","var memoizeCapped = require('./_memoizeCapped');\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n var result = [];\n if (string.charCodeAt(0) === 46 /* . */) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, subString) {\n result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n});\n\nmodule.exports = stringToPath;\n","var memoize = require('./memoize');\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n var result = memoize(func, function(key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n return key;\n });\n\n var cache = result.cache;\n return result;\n}\n\nmodule.exports = memoizeCapped;\n","var MapCache = require('./_MapCache');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nmodule.exports = memoize;\n","var baseToString = require('./_baseToString');\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\nmodule.exports = toString;\n","var Symbol = require('./_Symbol'),\n arrayMap = require('./_arrayMap'),\n isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = baseToString;\n","/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\nmodule.exports = arrayMap;\n","var baseHasIn = require('./_baseHasIn'),\n hasPath = require('./_hasPath');\n\n/**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\nfunction hasIn(object, path) {\n return object != null && hasPath(object, path, baseHasIn);\n}\n\nmodule.exports = hasIn;\n","/**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHasIn(object, key) {\n return object != null && key in Object(object);\n}\n\nmodule.exports = baseHasIn;\n","var castPath = require('./_castPath'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isIndex = require('./_isIndex'),\n isLength = require('./isLength'),\n toKey = require('./_toKey');\n\n/**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\nfunction hasPath(object, path, hasFunc) {\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n result = false;\n\n while (++index < length) {\n var key = toKey(path[index]);\n if (!(result = object != null && hasFunc(object, key))) {\n break;\n }\n object = object[key];\n }\n if (result || ++index != length) {\n return result;\n }\n length = object == null ? 0 : object.length;\n return !!length && isLength(length) && isIndex(key, length) &&\n (isArray(object) || isArguments(object));\n}\n\nmodule.exports = hasPath;\n","var baseProperty = require('./_baseProperty'),\n basePropertyDeep = require('./_basePropertyDeep'),\n isKey = require('./_isKey'),\n toKey = require('./_toKey');\n\n/**\n * Creates a function that returns the value at `path` of a given object.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var objects = [\n * { 'a': { 'b': 2 } },\n * { 'a': { 'b': 1 } }\n * ];\n *\n * _.map(objects, _.property('a.b'));\n * // => [2, 1]\n *\n * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n * // => [1, 2]\n */\nfunction property(path) {\n return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n}\n\nmodule.exports = property;\n","/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\nmodule.exports = baseProperty;\n","var baseGet = require('./_baseGet');\n\n/**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyDeep(path) {\n return function(object) {\n return baseGet(object, path);\n };\n}\n\nmodule.exports = basePropertyDeep;\n","var SetCache = require('./_SetCache'),\n arrayIncludes = require('./_arrayIncludes'),\n arrayIncludesWith = require('./_arrayIncludesWith'),\n cacheHas = require('./_cacheHas'),\n createSet = require('./_createSet'),\n setToArray = require('./_setToArray');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\nfunction baseUniq(array, iteratee, comparator) {\n var index = -1,\n includes = arrayIncludes,\n length = array.length,\n isCommon = true,\n result = [],\n seen = result;\n\n if (comparator) {\n isCommon = false;\n includes = arrayIncludesWith;\n }\n else if (length >= LARGE_ARRAY_SIZE) {\n var set = iteratee ? null : createSet(array);\n if (set) {\n return setToArray(set);\n }\n isCommon = false;\n includes = cacheHas;\n seen = new SetCache;\n }\n else {\n seen = iteratee ? [] : result;\n }\n outer:\n while (++index < length) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n value = (comparator || value !== 0) ? value : 0;\n if (isCommon && computed === computed) {\n var seenIndex = seen.length;\n while (seenIndex--) {\n if (seen[seenIndex] === computed) {\n continue outer;\n }\n }\n if (iteratee) {\n seen.push(computed);\n }\n result.push(value);\n }\n else if (!includes(seen, computed, comparator)) {\n if (seen !== result) {\n seen.push(computed);\n }\n result.push(value);\n }\n }\n return result;\n}\n\nmodule.exports = baseUniq;\n","var baseIndexOf = require('./_baseIndexOf');\n\n/**\n * A specialized version of `_.includes` for arrays without support for\n * specifying an index to search from.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludes(array, value) {\n var length = array == null ? 0 : array.length;\n return !!length && baseIndexOf(array, value, 0) > -1;\n}\n\nmodule.exports = arrayIncludes;\n","var baseFindIndex = require('./_baseFindIndex'),\n baseIsNaN = require('./_baseIsNaN'),\n strictIndexOf = require('./_strictIndexOf');\n\n/**\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseIndexOf(array, value, fromIndex) {\n return value === value\n ? strictIndexOf(array, value, fromIndex)\n : baseFindIndex(array, baseIsNaN, fromIndex);\n}\n\nmodule.exports = baseIndexOf;\n","/**\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseFindIndex(array, predicate, fromIndex, fromRight) {\n var length = array.length,\n index = fromIndex + (fromRight ? 1 : -1);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (predicate(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n}\n\nmodule.exports = baseFindIndex;\n","/**\n * The base implementation of `_.isNaN` without support for number objects.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n */\nfunction baseIsNaN(value) {\n return value !== value;\n}\n\nmodule.exports = baseIsNaN;\n","/**\n * A specialized version of `_.indexOf` which performs strict equality\n * comparisons of values, i.e. `===`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction strictIndexOf(array, value, fromIndex) {\n var index = fromIndex - 1,\n length = array.length;\n\n while (++index < length) {\n if (array[index] === value) {\n return index;\n }\n }\n return -1;\n}\n\nmodule.exports = strictIndexOf;\n","/**\n * This function is like `arrayIncludes` except that it accepts a comparator.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludesWith(array, value, comparator) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (comparator(value, array[index])) {\n return true;\n }\n }\n return false;\n}\n\nmodule.exports = arrayIncludesWith;\n","var Set = require('./_Set'),\n noop = require('./noop'),\n setToArray = require('./_setToArray');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Creates a set object of `values`.\n *\n * @private\n * @param {Array} values The values to add to the set.\n * @returns {Object} Returns the new set.\n */\nvar createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n return new Set(values);\n};\n\nmodule.exports = createSet;\n","/**\n * This method returns `undefined`.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Util\n * @example\n *\n * _.times(2, _.noop);\n * // => [undefined, undefined]\n */\nfunction noop() {\n // No operation performed.\n}\n\nmodule.exports = noop;\n","var Stack = require('./_Stack'),\n assignMergeValue = require('./_assignMergeValue'),\n baseFor = require('./_baseFor'),\n baseMergeDeep = require('./_baseMergeDeep'),\n isObject = require('./isObject'),\n keysIn = require('./keysIn'),\n safeGet = require('./_safeGet');\n\n/**\n * The base implementation of `_.merge` without support for multiple sources.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} [customizer] The function to customize merged values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\nfunction baseMerge(object, source, srcIndex, customizer, stack) {\n if (object === source) {\n return;\n }\n baseFor(source, function(srcValue, key) {\n stack || (stack = new Stack);\n if (isObject(srcValue)) {\n baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n }\n else {\n var newValue = customizer\n ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)\n : undefined;\n\n if (newValue === undefined) {\n newValue = srcValue;\n }\n assignMergeValue(object, key, newValue);\n }\n }, keysIn);\n}\n\nmodule.exports = baseMerge;\n","var createBaseFor = require('./_createBaseFor');\n\n/**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\nmodule.exports = baseFor;\n","/**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n return function(object, iteratee, keysFunc) {\n var index = -1,\n iterable = Object(object),\n props = keysFunc(object),\n length = props.length;\n\n while (length--) {\n var key = props[fromRight ? length : ++index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n}\n\nmodule.exports = createBaseFor;\n","var assignMergeValue = require('./_assignMergeValue'),\n cloneBuffer = require('./_cloneBuffer'),\n cloneTypedArray = require('./_cloneTypedArray'),\n copyArray = require('./_copyArray'),\n initCloneObject = require('./_initCloneObject'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isArrayLikeObject = require('./isArrayLikeObject'),\n isBuffer = require('./isBuffer'),\n isFunction = require('./isFunction'),\n isObject = require('./isObject'),\n isPlainObject = require('./isPlainObject'),\n isTypedArray = require('./isTypedArray'),\n safeGet = require('./_safeGet'),\n toPlainObject = require('./toPlainObject');\n\n/**\n * A specialized version of `baseMerge` for arrays and objects which performs\n * deep merges and tracks traversed objects enabling objects with circular\n * references to be merged.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {string} key The key of the value to merge.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} mergeFunc The function to merge values.\n * @param {Function} [customizer] The function to customize assigned values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\nfunction baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\n var objValue = safeGet(object, key),\n srcValue = safeGet(source, key),\n stacked = stack.get(srcValue);\n\n if (stacked) {\n assignMergeValue(object, key, stacked);\n return;\n }\n var newValue = customizer\n ? customizer(objValue, srcValue, (key + ''), object, source, stack)\n : undefined;\n\n var isCommon = newValue === undefined;\n\n if (isCommon) {\n var isArr = isArray(srcValue),\n isBuff = !isArr && isBuffer(srcValue),\n isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n newValue = srcValue;\n if (isArr || isBuff || isTyped) {\n if (isArray(objValue)) {\n newValue = objValue;\n }\n else if (isArrayLikeObject(objValue)) {\n newValue = copyArray(objValue);\n }\n else if (isBuff) {\n isCommon = false;\n newValue = cloneBuffer(srcValue, true);\n }\n else if (isTyped) {\n isCommon = false;\n newValue = cloneTypedArray(srcValue, true);\n }\n else {\n newValue = [];\n }\n }\n else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n newValue = objValue;\n if (isArguments(objValue)) {\n newValue = toPlainObject(objValue);\n }\n else if (!isObject(objValue) || isFunction(objValue)) {\n newValue = initCloneObject(srcValue);\n }\n }\n else {\n isCommon = false;\n }\n }\n if (isCommon) {\n // Recursively merge objects and arrays (susceptible to call stack limits).\n stack.set(srcValue, newValue);\n mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n stack['delete'](srcValue);\n }\n assignMergeValue(object, key, newValue);\n}\n\nmodule.exports = baseMergeDeep;\n","var isArrayLike = require('./isArrayLike'),\n isObjectLike = require('./isObjectLike');\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\nmodule.exports = isArrayLikeObject;\n","var baseGetTag = require('./_baseGetTag'),\n getPrototype = require('./_getPrototype'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to infer the `Object` constructor. */\nvar objectCtorString = funcToString.call(Object);\n\n/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n return false;\n }\n var proto = getPrototype(value);\n if (proto === null) {\n return true;\n }\n var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n funcToString.call(Ctor) == objectCtorString;\n}\n\nmodule.exports = isPlainObject;\n","var copyObject = require('./_copyObject'),\n keysIn = require('./keysIn');\n\n/**\n * Converts `value` to a plain object flattening inherited enumerable string\n * keyed properties of `value` to own properties of the plain object.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Object} Returns the converted plain object.\n * @example\n *\n * function Foo() {\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.assign({ 'a': 1 }, new Foo);\n * // => { 'a': 1, 'b': 2 }\n *\n * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n * // => { 'a': 1, 'b': 2, 'c': 3 }\n */\nfunction toPlainObject(value) {\n return copyObject(value, keysIn(value));\n}\n\nmodule.exports = toPlainObject;\n","var baseRest = require('./_baseRest'),\n isIterateeCall = require('./_isIterateeCall');\n\n/**\n * Creates a function like `_.assign`.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\nfunction createAssigner(assigner) {\n return baseRest(function(object, sources) {\n var index = -1,\n length = sources.length,\n customizer = length > 1 ? sources[length - 1] : undefined,\n guard = length > 2 ? sources[2] : undefined;\n\n customizer = (assigner.length > 3 && typeof customizer == 'function')\n ? (length--, customizer)\n : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n customizer = length < 3 ? undefined : customizer;\n length = 1;\n }\n object = Object(object);\n while (++index < length) {\n var source = sources[index];\n if (source) {\n assigner(object, source, index, customizer);\n }\n }\n return object;\n });\n}\n\nmodule.exports = createAssigner;\n","var identity = require('./identity'),\n overRest = require('./_overRest'),\n setToString = require('./_setToString');\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\n}\n\nmodule.exports = baseRest;\n","var apply = require('./_apply');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n}\n\nmodule.exports = overRest;\n","/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\nmodule.exports = apply;\n","var baseSetToString = require('./_baseSetToString'),\n shortOut = require('./_shortOut');\n\n/**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar setToString = shortOut(baseSetToString);\n\nmodule.exports = setToString;\n","var constant = require('./constant'),\n defineProperty = require('./_defineProperty'),\n identity = require('./identity');\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n};\n\nmodule.exports = baseSetToString;\n","/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n return function() {\n return value;\n };\n}\n\nmodule.exports = constant;\n","/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n HOT_SPAN = 16;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeNow = Date.now;\n\n/**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n var count = 0,\n lastCalled = 0;\n\n return function() {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n return func.apply(undefined, arguments);\n };\n}\n\nmodule.exports = shortOut;\n","var eq = require('./eq'),\n isArrayLike = require('./isArrayLike'),\n isIndex = require('./_isIndex'),\n isObject = require('./isObject');\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n}\n\nmodule.exports = isIterateeCall;\n","'use strict';\n\nvar resolve = require('./resolve')\n , util = require('./util')\n , errorClasses = require('./error_classes')\n , stableStringify = require('fast-json-stable-stringify');\n\nvar validateGenerator = require('../dotjs/validate');\n\n/**\n * Functions below are used inside compiled validations function\n */\n\nvar ucs2length = util.ucs2length;\nvar equal = require('fast-deep-equal');\n\n// this error is thrown by async schemas to return validation errors via exception\nvar ValidationError = errorClasses.Validation;\n\nmodule.exports = compile;\n\n\n/**\n * Compiles schema to validation function\n * @this Ajv\n * @param {Object} schema schema object\n * @param {Object} root object with information about the root schema for this schema\n * @param {Object} localRefs the hash of local references inside the schema (created by resolve.id), used for inline resolution\n * @param {String} baseId base ID for IDs in the schema\n * @return {Function} validation function\n */\nfunction compile(schema, root, localRefs, baseId) {\n /* jshint validthis: true, evil: true */\n /* eslint no-shadow: 0 */\n var self = this\n , opts = this._opts\n , refVal = [ undefined ]\n , refs = {}\n , patterns = []\n , patternsHash = {}\n , defaults = []\n , defaultsHash = {}\n , customRules = [];\n\n root = root || { schema: schema, refVal: refVal, refs: refs };\n\n var c = checkCompiling.call(this, schema, root, baseId);\n var compilation = this._compilations[c.index];\n if (c.compiling) return (compilation.callValidate = callValidate);\n\n var formats = this._formats;\n var RULES = this.RULES;\n\n try {\n var v = localCompile(schema, root, localRefs, baseId);\n compilation.validate = v;\n var cv = compilation.callValidate;\n if (cv) {\n cv.schema = v.schema;\n cv.errors = null;\n cv.refs = v.refs;\n cv.refVal = v.refVal;\n cv.root = v.root;\n cv.$async = v.$async;\n if (opts.sourceCode) cv.source = v.source;\n }\n return v;\n } finally {\n endCompiling.call(this, schema, root, baseId);\n }\n\n /* @this {*} - custom context, see passContext option */\n function callValidate() {\n /* jshint validthis: true */\n var validate = compilation.validate;\n var result = validate.apply(this, arguments);\n callValidate.errors = validate.errors;\n return result;\n }\n\n function localCompile(_schema, _root, localRefs, baseId) {\n var isRoot = !_root || (_root && _root.schema == _schema);\n if (_root.schema != root.schema)\n return compile.call(self, _schema, _root, localRefs, baseId);\n\n var $async = _schema.$async === true;\n\n var sourceCode = validateGenerator({\n isTop: true,\n schema: _schema,\n isRoot: isRoot,\n baseId: baseId,\n root: _root,\n schemaPath: '',\n errSchemaPath: '#',\n errorPath: '\"\"',\n MissingRefError: errorClasses.MissingRef,\n RULES: RULES,\n validate: validateGenerator,\n util: util,\n resolve: resolve,\n resolveRef: resolveRef,\n usePattern: usePattern,\n useDefault: useDefault,\n useCustomRule: useCustomRule,\n opts: opts,\n formats: formats,\n logger: self.logger,\n self: self\n });\n\n sourceCode = vars(refVal, refValCode) + vars(patterns, patternCode)\n + vars(defaults, defaultCode) + vars(customRules, customRuleCode)\n + sourceCode;\n\n if (opts.processCode) sourceCode = opts.processCode(sourceCode);\n // console.log('\\n\\n\\n *** \\n', JSON.stringify(sourceCode));\n var validate;\n try {\n var makeValidate = new Function(\n 'self',\n 'RULES',\n 'formats',\n 'root',\n 'refVal',\n 'defaults',\n 'customRules',\n 'equal',\n 'ucs2length',\n 'ValidationError',\n sourceCode\n );\n\n validate = makeValidate(\n self,\n RULES,\n formats,\n root,\n refVal,\n defaults,\n customRules,\n equal,\n ucs2length,\n ValidationError\n );\n\n refVal[0] = validate;\n } catch(e) {\n self.logger.error('Error compiling schema, function code:', sourceCode);\n throw e;\n }\n\n validate.schema = _schema;\n validate.errors = null;\n validate.refs = refs;\n validate.refVal = refVal;\n validate.root = isRoot ? validate : _root;\n if ($async) validate.$async = true;\n if (opts.sourceCode === true) {\n validate.source = {\n code: sourceCode,\n patterns: patterns,\n defaults: defaults\n };\n }\n\n return validate;\n }\n\n function resolveRef(baseId, ref, isRoot) {\n ref = resolve.url(baseId, ref);\n var refIndex = refs[ref];\n var _refVal, refCode;\n if (refIndex !== undefined) {\n _refVal = refVal[refIndex];\n refCode = 'refVal[' + refIndex + ']';\n return resolvedRef(_refVal, refCode);\n }\n if (!isRoot && root.refs) {\n var rootRefId = root.refs[ref];\n if (rootRefId !== undefined) {\n _refVal = root.refVal[rootRefId];\n refCode = addLocalRef(ref, _refVal);\n return resolvedRef(_refVal, refCode);\n }\n }\n\n refCode = addLocalRef(ref);\n var v = resolve.call(self, localCompile, root, ref);\n if (v === undefined) {\n var localSchema = localRefs && localRefs[ref];\n if (localSchema) {\n v = resolve.inlineRef(localSchema, opts.inlineRefs)\n ? localSchema\n : compile.call(self, localSchema, root, localRefs, baseId);\n }\n }\n\n if (v === undefined) {\n removeLocalRef(ref);\n } else {\n replaceLocalRef(ref, v);\n return resolvedRef(v, refCode);\n }\n }\n\n function addLocalRef(ref, v) {\n var refId = refVal.length;\n refVal[refId] = v;\n refs[ref] = refId;\n return 'refVal' + refId;\n }\n\n function removeLocalRef(ref) {\n delete refs[ref];\n }\n\n function replaceLocalRef(ref, v) {\n var refId = refs[ref];\n refVal[refId] = v;\n }\n\n function resolvedRef(refVal, code) {\n return typeof refVal == 'object' || typeof refVal == 'boolean'\n ? { code: code, schema: refVal, inline: true }\n : { code: code, $async: refVal && !!refVal.$async };\n }\n\n function usePattern(regexStr) {\n var index = patternsHash[regexStr];\n if (index === undefined) {\n index = patternsHash[regexStr] = patterns.length;\n patterns[index] = regexStr;\n }\n return 'pattern' + index;\n }\n\n function useDefault(value) {\n switch (typeof value) {\n case 'boolean':\n case 'number':\n return '' + value;\n case 'string':\n return util.toQuotedString(value);\n case 'object':\n if (value === null) return 'null';\n var valueStr = stableStringify(value);\n var index = defaultsHash[valueStr];\n if (index === undefined) {\n index = defaultsHash[valueStr] = defaults.length;\n defaults[index] = value;\n }\n return 'default' + index;\n }\n }\n\n function useCustomRule(rule, schema, parentSchema, it) {\n if (self._opts.validateSchema !== false) {\n var deps = rule.definition.dependencies;\n if (deps && !deps.every(function(keyword) {\n return Object.prototype.hasOwnProperty.call(parentSchema, keyword);\n }))\n throw new Error('parent schema must have all required keywords: ' + deps.join(','));\n\n var validateSchema = rule.definition.validateSchema;\n if (validateSchema) {\n var valid = validateSchema(schema);\n if (!valid) {\n var message = 'keyword schema is invalid: ' + self.errorsText(validateSchema.errors);\n if (self._opts.validateSchema == 'log') self.logger.error(message);\n else throw new Error(message);\n }\n }\n }\n\n var compile = rule.definition.compile\n , inline = rule.definition.inline\n , macro = rule.definition.macro;\n\n var validate;\n if (compile) {\n validate = compile.call(self, schema, parentSchema, it);\n } else if (macro) {\n validate = macro.call(self, schema, parentSchema, it);\n if (opts.validateSchema !== false) self.validateSchema(validate, true);\n } else if (inline) {\n validate = inline.call(self, it, rule.keyword, schema, parentSchema);\n } else {\n validate = rule.definition.validate;\n if (!validate) return;\n }\n\n if (validate === undefined)\n throw new Error('custom keyword \"' + rule.keyword + '\"failed to compile');\n\n var index = customRules.length;\n customRules[index] = validate;\n\n return {\n code: 'customRule' + index,\n validate: validate\n };\n }\n}\n\n\n/**\n * Checks if the schema is currently compiled\n * @this Ajv\n * @param {Object} schema schema to compile\n * @param {Object} root root object\n * @param {String} baseId base schema ID\n * @return {Object} object with properties \"index\" (compilation index) and \"compiling\" (boolean)\n */\nfunction checkCompiling(schema, root, baseId) {\n /* jshint validthis: true */\n var index = compIndex.call(this, schema, root, baseId);\n if (index >= 0) return { index: index, compiling: true };\n index = this._compilations.length;\n this._compilations[index] = {\n schema: schema,\n root: root,\n baseId: baseId\n };\n return { index: index, compiling: false };\n}\n\n\n/**\n * Removes the schema from the currently compiled list\n * @this Ajv\n * @param {Object} schema schema to compile\n * @param {Object} root root object\n * @param {String} baseId base schema ID\n */\nfunction endCompiling(schema, root, baseId) {\n /* jshint validthis: true */\n var i = compIndex.call(this, schema, root, baseId);\n if (i >= 0) this._compilations.splice(i, 1);\n}\n\n\n/**\n * Index of schema compilation in the currently compiled list\n * @this Ajv\n * @param {Object} schema schema to compile\n * @param {Object} root root object\n * @param {String} baseId base schema ID\n * @return {Integer} compilation index\n */\nfunction compIndex(schema, root, baseId) {\n /* jshint validthis: true */\n for (var i=0; i 1) {\n sets[0] = sets[0].slice(0, -1);\n var xl = sets.length - 1;\n for (var x = 1; x < xl; ++x) {\n sets[x] = sets[x].slice(1, -1);\n }\n sets[xl] = sets[xl].slice(1);\n return sets.join('');\n } else {\n return sets[0];\n }\n}\nfunction subexp(str) {\n return \"(?:\" + str + \")\";\n}\nfunction typeOf(o) {\n return o === undefined ? \"undefined\" : o === null ? \"null\" : Object.prototype.toString.call(o).split(\" \").pop().split(\"]\").shift().toLowerCase();\n}\nfunction toUpperCase(str) {\n return str.toUpperCase();\n}\nfunction toArray(obj) {\n return obj !== undefined && obj !== null ? obj instanceof Array ? obj : typeof obj.length !== \"number\" || obj.split || obj.setInterval || obj.call ? [obj] : Array.prototype.slice.call(obj) : [];\n}\nfunction assign(target, source) {\n var obj = target;\n if (source) {\n for (var key in source) {\n obj[key] = source[key];\n }\n }\n return obj;\n}\n\nfunction buildExps(isIRI) {\n var ALPHA$$ = \"[A-Za-z]\",\n CR$ = \"[\\\\x0D]\",\n DIGIT$$ = \"[0-9]\",\n DQUOTE$$ = \"[\\\\x22]\",\n HEXDIG$$ = merge(DIGIT$$, \"[A-Fa-f]\"),\n //case-insensitive\n LF$$ = \"[\\\\x0A]\",\n SP$$ = \"[\\\\x20]\",\n PCT_ENCODED$ = subexp(subexp(\"%[EFef]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%[89A-Fa-f]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%\" + HEXDIG$$ + HEXDIG$$)),\n //expanded\n GEN_DELIMS$$ = \"[\\\\:\\\\/\\\\?\\\\#\\\\[\\\\]\\\\@]\",\n SUB_DELIMS$$ = \"[\\\\!\\\\$\\\\&\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\;\\\\=]\",\n RESERVED$$ = merge(GEN_DELIMS$$, SUB_DELIMS$$),\n UCSCHAR$$ = isIRI ? \"[\\\\xA0-\\\\u200D\\\\u2010-\\\\u2029\\\\u202F-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFEF]\" : \"[]\",\n //subset, excludes bidi control characters\n IPRIVATE$$ = isIRI ? \"[\\\\uE000-\\\\uF8FF]\" : \"[]\",\n //subset\n UNRESERVED$$ = merge(ALPHA$$, DIGIT$$, \"[\\\\-\\\\.\\\\_\\\\~]\", UCSCHAR$$),\n SCHEME$ = subexp(ALPHA$$ + merge(ALPHA$$, DIGIT$$, \"[\\\\+\\\\-\\\\.]\") + \"*\"),\n USERINFO$ = subexp(subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:]\")) + \"*\"),\n DEC_OCTET$ = subexp(subexp(\"25[0-5]\") + \"|\" + subexp(\"2[0-4]\" + DIGIT$$) + \"|\" + subexp(\"1\" + DIGIT$$ + DIGIT$$) + \"|\" + subexp(\"[1-9]\" + DIGIT$$) + \"|\" + DIGIT$$),\n DEC_OCTET_RELAXED$ = subexp(subexp(\"25[0-5]\") + \"|\" + subexp(\"2[0-4]\" + DIGIT$$) + \"|\" + subexp(\"1\" + DIGIT$$ + DIGIT$$) + \"|\" + subexp(\"0?[1-9]\" + DIGIT$$) + \"|0?0?\" + DIGIT$$),\n //relaxed parsing rules\n IPV4ADDRESS$ = subexp(DEC_OCTET_RELAXED$ + \"\\\\.\" + DEC_OCTET_RELAXED$ + \"\\\\.\" + DEC_OCTET_RELAXED$ + \"\\\\.\" + DEC_OCTET_RELAXED$),\n H16$ = subexp(HEXDIG$$ + \"{1,4}\"),\n LS32$ = subexp(subexp(H16$ + \"\\\\:\" + H16$) + \"|\" + IPV4ADDRESS$),\n IPV6ADDRESS1$ = subexp(subexp(H16$ + \"\\\\:\") + \"{6}\" + LS32$),\n // 6( h16 \":\" ) ls32\n IPV6ADDRESS2$ = subexp(\"\\\\:\\\\:\" + subexp(H16$ + \"\\\\:\") + \"{5}\" + LS32$),\n // \"::\" 5( h16 \":\" ) ls32\n IPV6ADDRESS3$ = subexp(subexp(H16$) + \"?\\\\:\\\\:\" + subexp(H16$ + \"\\\\:\") + \"{4}\" + LS32$),\n //[ h16 ] \"::\" 4( h16 \":\" ) ls32\n IPV6ADDRESS4$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,1}\" + H16$) + \"?\\\\:\\\\:\" + subexp(H16$ + \"\\\\:\") + \"{3}\" + LS32$),\n //[ *1( h16 \":\" ) h16 ] \"::\" 3( h16 \":\" ) ls32\n IPV6ADDRESS5$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,2}\" + H16$) + \"?\\\\:\\\\:\" + subexp(H16$ + \"\\\\:\") + \"{2}\" + LS32$),\n //[ *2( h16 \":\" ) h16 ] \"::\" 2( h16 \":\" ) ls32\n IPV6ADDRESS6$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,3}\" + H16$) + \"?\\\\:\\\\:\" + H16$ + \"\\\\:\" + LS32$),\n //[ *3( h16 \":\" ) h16 ] \"::\" h16 \":\" ls32\n IPV6ADDRESS7$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,4}\" + H16$) + \"?\\\\:\\\\:\" + LS32$),\n //[ *4( h16 \":\" ) h16 ] \"::\" ls32\n IPV6ADDRESS8$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,5}\" + H16$) + \"?\\\\:\\\\:\" + H16$),\n //[ *5( h16 \":\" ) h16 ] \"::\" h16\n IPV6ADDRESS9$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,6}\" + H16$) + \"?\\\\:\\\\:\"),\n //[ *6( h16 \":\" ) h16 ] \"::\"\n IPV6ADDRESS$ = subexp([IPV6ADDRESS1$, IPV6ADDRESS2$, IPV6ADDRESS3$, IPV6ADDRESS4$, IPV6ADDRESS5$, IPV6ADDRESS6$, IPV6ADDRESS7$, IPV6ADDRESS8$, IPV6ADDRESS9$].join(\"|\")),\n ZONEID$ = subexp(subexp(UNRESERVED$$ + \"|\" + PCT_ENCODED$) + \"+\"),\n //RFC 6874\n IPV6ADDRZ$ = subexp(IPV6ADDRESS$ + \"\\\\%25\" + ZONEID$),\n //RFC 6874\n IPV6ADDRZ_RELAXED$ = subexp(IPV6ADDRESS$ + subexp(\"\\\\%25|\\\\%(?!\" + HEXDIG$$ + \"{2})\") + ZONEID$),\n //RFC 6874, with relaxed parsing rules\n IPVFUTURE$ = subexp(\"[vV]\" + HEXDIG$$ + \"+\\\\.\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:]\") + \"+\"),\n IP_LITERAL$ = subexp(\"\\\\[\" + subexp(IPV6ADDRZ_RELAXED$ + \"|\" + IPV6ADDRESS$ + \"|\" + IPVFUTURE$) + \"\\\\]\"),\n //RFC 6874\n REG_NAME$ = subexp(subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$)) + \"*\"),\n HOST$ = subexp(IP_LITERAL$ + \"|\" + IPV4ADDRESS$ + \"(?!\" + REG_NAME$ + \")\" + \"|\" + REG_NAME$),\n PORT$ = subexp(DIGIT$$ + \"*\"),\n AUTHORITY$ = subexp(subexp(USERINFO$ + \"@\") + \"?\" + HOST$ + subexp(\"\\\\:\" + PORT$) + \"?\"),\n PCHAR$ = subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:\\\\@]\")),\n SEGMENT$ = subexp(PCHAR$ + \"*\"),\n SEGMENT_NZ$ = subexp(PCHAR$ + \"+\"),\n SEGMENT_NZ_NC$ = subexp(subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\@]\")) + \"+\"),\n PATH_ABEMPTY$ = subexp(subexp(\"\\\\/\" + SEGMENT$) + \"*\"),\n PATH_ABSOLUTE$ = subexp(\"\\\\/\" + subexp(SEGMENT_NZ$ + PATH_ABEMPTY$) + \"?\"),\n //simplified\n PATH_NOSCHEME$ = subexp(SEGMENT_NZ_NC$ + PATH_ABEMPTY$),\n //simplified\n PATH_ROOTLESS$ = subexp(SEGMENT_NZ$ + PATH_ABEMPTY$),\n //simplified\n PATH_EMPTY$ = \"(?!\" + PCHAR$ + \")\",\n PATH$ = subexp(PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_NOSCHEME$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$),\n QUERY$ = subexp(subexp(PCHAR$ + \"|\" + merge(\"[\\\\/\\\\?]\", IPRIVATE$$)) + \"*\"),\n FRAGMENT$ = subexp(subexp(PCHAR$ + \"|[\\\\/\\\\?]\") + \"*\"),\n HIER_PART$ = subexp(subexp(\"\\\\/\\\\/\" + AUTHORITY$ + PATH_ABEMPTY$) + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$),\n URI$ = subexp(SCHEME$ + \"\\\\:\" + HIER_PART$ + subexp(\"\\\\?\" + QUERY$) + \"?\" + subexp(\"\\\\#\" + FRAGMENT$) + \"?\"),\n RELATIVE_PART$ = subexp(subexp(\"\\\\/\\\\/\" + AUTHORITY$ + PATH_ABEMPTY$) + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_NOSCHEME$ + \"|\" + PATH_EMPTY$),\n RELATIVE$ = subexp(RELATIVE_PART$ + subexp(\"\\\\?\" + QUERY$) + \"?\" + subexp(\"\\\\#\" + FRAGMENT$) + \"?\"),\n URI_REFERENCE$ = subexp(URI$ + \"|\" + RELATIVE$),\n ABSOLUTE_URI$ = subexp(SCHEME$ + \"\\\\:\" + HIER_PART$ + subexp(\"\\\\?\" + QUERY$) + \"?\"),\n GENERIC_REF$ = \"^(\" + SCHEME$ + \")\\\\:\" + subexp(subexp(\"\\\\/\\\\/(\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?)\") + \"?(\" + PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$ + \")\") + subexp(\"\\\\?(\" + QUERY$ + \")\") + \"?\" + subexp(\"\\\\#(\" + FRAGMENT$ + \")\") + \"?$\",\n RELATIVE_REF$ = \"^(){0}\" + subexp(subexp(\"\\\\/\\\\/(\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?)\") + \"?(\" + PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_NOSCHEME$ + \"|\" + PATH_EMPTY$ + \")\") + subexp(\"\\\\?(\" + QUERY$ + \")\") + \"?\" + subexp(\"\\\\#(\" + FRAGMENT$ + \")\") + \"?$\",\n ABSOLUTE_REF$ = \"^(\" + SCHEME$ + \")\\\\:\" + subexp(subexp(\"\\\\/\\\\/(\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?)\") + \"?(\" + PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$ + \")\") + subexp(\"\\\\?(\" + QUERY$ + \")\") + \"?$\",\n SAMEDOC_REF$ = \"^\" + subexp(\"\\\\#(\" + FRAGMENT$ + \")\") + \"?$\",\n AUTHORITY_REF$ = \"^\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?$\";\n return {\n NOT_SCHEME: new RegExp(merge(\"[^]\", ALPHA$$, DIGIT$$, \"[\\\\+\\\\-\\\\.]\"), \"g\"),\n NOT_USERINFO: new RegExp(merge(\"[^\\\\%\\\\:]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n NOT_HOST: new RegExp(merge(\"[^\\\\%\\\\[\\\\]\\\\:]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n NOT_PATH: new RegExp(merge(\"[^\\\\%\\\\/\\\\:\\\\@]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n NOT_PATH_NOSCHEME: new RegExp(merge(\"[^\\\\%\\\\/\\\\@]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n NOT_QUERY: new RegExp(merge(\"[^\\\\%]\", UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:\\\\@\\\\/\\\\?]\", IPRIVATE$$), \"g\"),\n NOT_FRAGMENT: new RegExp(merge(\"[^\\\\%]\", UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:\\\\@\\\\/\\\\?]\"), \"g\"),\n ESCAPE: new RegExp(merge(\"[^]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n UNRESERVED: new RegExp(UNRESERVED$$, \"g\"),\n OTHER_CHARS: new RegExp(merge(\"[^\\\\%]\", UNRESERVED$$, RESERVED$$), \"g\"),\n PCT_ENCODED: new RegExp(PCT_ENCODED$, \"g\"),\n IPV4ADDRESS: new RegExp(\"^(\" + IPV4ADDRESS$ + \")$\"),\n IPV6ADDRESS: new RegExp(\"^\\\\[?(\" + IPV6ADDRESS$ + \")\" + subexp(subexp(\"\\\\%25|\\\\%(?!\" + HEXDIG$$ + \"{2})\") + \"(\" + ZONEID$ + \")\") + \"?\\\\]?$\") //RFC 6874, with relaxed parsing rules\n };\n}\nvar URI_PROTOCOL = buildExps(false);\n\nvar IRI_PROTOCOL = buildExps(true);\n\nvar slicedToArray = function () {\n function sliceIterator(arr, i) {\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"]) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n }\n\n return function (arr, i) {\n if (Array.isArray(arr)) {\n return arr;\n } else if (Symbol.iterator in Object(arr)) {\n return sliceIterator(arr, i);\n } else {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n }\n };\n}();\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar toConsumableArray = function (arr) {\n if (Array.isArray(arr)) {\n for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n\n return arr2;\n } else {\n return Array.from(arr);\n }\n};\n\n/** Highest positive signed 32-bit float value */\n\nvar maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\n\n/** Bootstring parameters */\nvar base = 36;\nvar tMin = 1;\nvar tMax = 26;\nvar skew = 38;\nvar damp = 700;\nvar initialBias = 72;\nvar initialN = 128; // 0x80\nvar delimiter = '-'; // '\\x2D'\n\n/** Regular expressions */\nvar regexPunycode = /^xn--/;\nvar regexNonASCII = /[^\\0-\\x7E]/; // non-ASCII chars\nvar regexSeparators = /[\\x2E\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\n\n/** Error messages */\nvar errors = {\n\t'overflow': 'Overflow: input needs wider integers to process',\n\t'not-basic': 'Illegal input >= 0x80 (not a basic code point)',\n\t'invalid-input': 'Invalid input'\n};\n\n/** Convenience shortcuts */\nvar baseMinusTMin = base - tMin;\nvar floor = Math.floor;\nvar stringFromCharCode = String.fromCharCode;\n\n/*--------------------------------------------------------------------------*/\n\n/**\n * A generic error utility function.\n * @private\n * @param {String} type The error type.\n * @returns {Error} Throws a `RangeError` with the applicable error message.\n */\nfunction error$1(type) {\n\tthrow new RangeError(errors[type]);\n}\n\n/**\n * A generic `Array#map` utility function.\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} callback The function that gets called for every array\n * item.\n * @returns {Array} A new array of values returned by the callback function.\n */\nfunction map(array, fn) {\n\tvar result = [];\n\tvar length = array.length;\n\twhile (length--) {\n\t\tresult[length] = fn(array[length]);\n\t}\n\treturn result;\n}\n\n/**\n * A simple `Array#map`-like wrapper to work with domain name strings or email\n * addresses.\n * @private\n * @param {String} domain The domain name or email address.\n * @param {Function} callback The function that gets called for every\n * character.\n * @returns {Array} A new string of characters returned by the callback\n * function.\n */\nfunction mapDomain(string, fn) {\n\tvar parts = string.split('@');\n\tvar result = '';\n\tif (parts.length > 1) {\n\t\t// In email addresses, only the domain name should be punycoded. Leave\n\t\t// the local part (i.e. everything up to `@`) intact.\n\t\tresult = parts[0] + '@';\n\t\tstring = parts[1];\n\t}\n\t// Avoid `split(regex)` for IE8 compatibility. See #17.\n\tstring = string.replace(regexSeparators, '\\x2E');\n\tvar labels = string.split('.');\n\tvar encoded = map(labels, fn).join('.');\n\treturn result + encoded;\n}\n\n/**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n * @see `punycode.ucs2.encode`\n * @see \n * @memberOf punycode.ucs2\n * @name decode\n * @param {String} string The Unicode input string (UCS-2).\n * @returns {Array} The new array of code points.\n */\nfunction ucs2decode(string) {\n\tvar output = [];\n\tvar counter = 0;\n\tvar length = string.length;\n\twhile (counter < length) {\n\t\tvar value = string.charCodeAt(counter++);\n\t\tif (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t\t\t// It's a high surrogate, and there is a next character.\n\t\t\tvar extra = string.charCodeAt(counter++);\n\t\t\tif ((extra & 0xFC00) == 0xDC00) {\n\t\t\t\t// Low surrogate.\n\t\t\t\toutput.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t\t\t} else {\n\t\t\t\t// It's an unmatched surrogate; only append this code unit, in case the\n\t\t\t\t// next code unit is the high surrogate of a surrogate pair.\n\t\t\t\toutput.push(value);\n\t\t\t\tcounter--;\n\t\t\t}\n\t\t} else {\n\t\t\toutput.push(value);\n\t\t}\n\t}\n\treturn output;\n}\n\n/**\n * Creates a string based on an array of numeric code points.\n * @see `punycode.ucs2.decode`\n * @memberOf punycode.ucs2\n * @name encode\n * @param {Array} codePoints The array of numeric code points.\n * @returns {String} The new Unicode string (UCS-2).\n */\nvar ucs2encode = function ucs2encode(array) {\n\treturn String.fromCodePoint.apply(String, toConsumableArray(array));\n};\n\n/**\n * Converts a basic code point into a digit/integer.\n * @see `digitToBasic()`\n * @private\n * @param {Number} codePoint The basic numeric code point value.\n * @returns {Number} The numeric value of a basic code point (for use in\n * representing integers) in the range `0` to `base - 1`, or `base` if\n * the code point does not represent a value.\n */\nvar basicToDigit = function basicToDigit(codePoint) {\n\tif (codePoint - 0x30 < 0x0A) {\n\t\treturn codePoint - 0x16;\n\t}\n\tif (codePoint - 0x41 < 0x1A) {\n\t\treturn codePoint - 0x41;\n\t}\n\tif (codePoint - 0x61 < 0x1A) {\n\t\treturn codePoint - 0x61;\n\t}\n\treturn base;\n};\n\n/**\n * Converts a digit/integer into a basic code point.\n * @see `basicToDigit()`\n * @private\n * @param {Number} digit The numeric value of a basic code point.\n * @returns {Number} The basic code point whose value (when used for\n * representing integers) is `digit`, which needs to be in the range\n * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is\n * used; else, the lowercase form is used. The behavior is undefined\n * if `flag` is non-zero and `digit` has no uppercase form.\n */\nvar digitToBasic = function digitToBasic(digit, flag) {\n\t// 0..25 map to ASCII a..z or A..Z\n\t// 26..35 map to ASCII 0..9\n\treturn digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);\n};\n\n/**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * https://tools.ietf.org/html/rfc3492#section-3.4\n * @private\n */\nvar adapt = function adapt(delta, numPoints, firstTime) {\n\tvar k = 0;\n\tdelta = firstTime ? floor(delta / damp) : delta >> 1;\n\tdelta += floor(delta / numPoints);\n\tfor (; /* no initialization */delta > baseMinusTMin * tMax >> 1; k += base) {\n\t\tdelta = floor(delta / baseMinusTMin);\n\t}\n\treturn floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n};\n\n/**\n * Converts a Punycode string of ASCII-only symbols to a string of Unicode\n * symbols.\n * @memberOf punycode\n * @param {String} input The Punycode string of ASCII-only symbols.\n * @returns {String} The resulting string of Unicode symbols.\n */\nvar decode = function decode(input) {\n\t// Don't use UCS-2.\n\tvar output = [];\n\tvar inputLength = input.length;\n\tvar i = 0;\n\tvar n = initialN;\n\tvar bias = initialBias;\n\n\t// Handle the basic code points: let `basic` be the number of input code\n\t// points before the last delimiter, or `0` if there is none, then copy\n\t// the first basic code points to the output.\n\n\tvar basic = input.lastIndexOf(delimiter);\n\tif (basic < 0) {\n\t\tbasic = 0;\n\t}\n\n\tfor (var j = 0; j < basic; ++j) {\n\t\t// if it's not a basic code point\n\t\tif (input.charCodeAt(j) >= 0x80) {\n\t\t\terror$1('not-basic');\n\t\t}\n\t\toutput.push(input.charCodeAt(j));\n\t}\n\n\t// Main decoding loop: start just after the last delimiter if any basic code\n\t// points were copied; start at the beginning otherwise.\n\n\tfor (var index = basic > 0 ? basic + 1 : 0; index < inputLength;) /* no final expression */{\n\n\t\t// `index` is the index of the next character to be consumed.\n\t\t// Decode a generalized variable-length integer into `delta`,\n\t\t// which gets added to `i`. The overflow checking is easier\n\t\t// if we increase `i` as we go, then subtract off its starting\n\t\t// value at the end to obtain `delta`.\n\t\tvar oldi = i;\n\t\tfor (var w = 1, k = base;; /* no condition */k += base) {\n\n\t\t\tif (index >= inputLength) {\n\t\t\t\terror$1('invalid-input');\n\t\t\t}\n\n\t\t\tvar digit = basicToDigit(input.charCodeAt(index++));\n\n\t\t\tif (digit >= base || digit > floor((maxInt - i) / w)) {\n\t\t\t\terror$1('overflow');\n\t\t\t}\n\n\t\t\ti += digit * w;\n\t\t\tvar t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;\n\n\t\t\tif (digit < t) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tvar baseMinusT = base - t;\n\t\t\tif (w > floor(maxInt / baseMinusT)) {\n\t\t\t\terror$1('overflow');\n\t\t\t}\n\n\t\t\tw *= baseMinusT;\n\t\t}\n\n\t\tvar out = output.length + 1;\n\t\tbias = adapt(i - oldi, out, oldi == 0);\n\n\t\t// `i` was supposed to wrap around from `out` to `0`,\n\t\t// incrementing `n` each time, so we'll fix that now:\n\t\tif (floor(i / out) > maxInt - n) {\n\t\t\terror$1('overflow');\n\t\t}\n\n\t\tn += floor(i / out);\n\t\ti %= out;\n\n\t\t// Insert `n` at position `i` of the output.\n\t\toutput.splice(i++, 0, n);\n\t}\n\n\treturn String.fromCodePoint.apply(String, output);\n};\n\n/**\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\n * Punycode string of ASCII-only symbols.\n * @memberOf punycode\n * @param {String} input The string of Unicode symbols.\n * @returns {String} The resulting Punycode string of ASCII-only symbols.\n */\nvar encode = function encode(input) {\n\tvar output = [];\n\n\t// Convert the input in UCS-2 to an array of Unicode code points.\n\tinput = ucs2decode(input);\n\n\t// Cache the length.\n\tvar inputLength = input.length;\n\n\t// Initialize the state.\n\tvar n = initialN;\n\tvar delta = 0;\n\tvar bias = initialBias;\n\n\t// Handle the basic code points.\n\tvar _iteratorNormalCompletion = true;\n\tvar _didIteratorError = false;\n\tvar _iteratorError = undefined;\n\n\ttry {\n\t\tfor (var _iterator = input[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n\t\t\tvar _currentValue2 = _step.value;\n\n\t\t\tif (_currentValue2 < 0x80) {\n\t\t\t\toutput.push(stringFromCharCode(_currentValue2));\n\t\t\t}\n\t\t}\n\t} catch (err) {\n\t\t_didIteratorError = true;\n\t\t_iteratorError = err;\n\t} finally {\n\t\ttry {\n\t\t\tif (!_iteratorNormalCompletion && _iterator.return) {\n\t\t\t\t_iterator.return();\n\t\t\t}\n\t\t} finally {\n\t\t\tif (_didIteratorError) {\n\t\t\t\tthrow _iteratorError;\n\t\t\t}\n\t\t}\n\t}\n\n\tvar basicLength = output.length;\n\tvar handledCPCount = basicLength;\n\n\t// `handledCPCount` is the number of code points that have been handled;\n\t// `basicLength` is the number of basic code points.\n\n\t// Finish the basic string with a delimiter unless it's empty.\n\tif (basicLength) {\n\t\toutput.push(delimiter);\n\t}\n\n\t// Main encoding loop:\n\twhile (handledCPCount < inputLength) {\n\n\t\t// All non-basic code points < n have been handled already. Find the next\n\t\t// larger one:\n\t\tvar m = maxInt;\n\t\tvar _iteratorNormalCompletion2 = true;\n\t\tvar _didIteratorError2 = false;\n\t\tvar _iteratorError2 = undefined;\n\n\t\ttry {\n\t\t\tfor (var _iterator2 = input[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n\t\t\t\tvar currentValue = _step2.value;\n\n\t\t\t\tif (currentValue >= n && currentValue < m) {\n\t\t\t\t\tm = currentValue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Increase `delta` enough to advance the decoder's state to ,\n\t\t\t// but guard against overflow.\n\t\t} catch (err) {\n\t\t\t_didIteratorError2 = true;\n\t\t\t_iteratorError2 = err;\n\t\t} finally {\n\t\t\ttry {\n\t\t\t\tif (!_iteratorNormalCompletion2 && _iterator2.return) {\n\t\t\t\t\t_iterator2.return();\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tif (_didIteratorError2) {\n\t\t\t\t\tthrow _iteratorError2;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tvar handledCPCountPlusOne = handledCPCount + 1;\n\t\tif (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n\t\t\terror$1('overflow');\n\t\t}\n\n\t\tdelta += (m - n) * handledCPCountPlusOne;\n\t\tn = m;\n\n\t\tvar _iteratorNormalCompletion3 = true;\n\t\tvar _didIteratorError3 = false;\n\t\tvar _iteratorError3 = undefined;\n\n\t\ttry {\n\t\t\tfor (var _iterator3 = input[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {\n\t\t\t\tvar _currentValue = _step3.value;\n\n\t\t\t\tif (_currentValue < n && ++delta > maxInt) {\n\t\t\t\t\terror$1('overflow');\n\t\t\t\t}\n\t\t\t\tif (_currentValue == n) {\n\t\t\t\t\t// Represent delta as a generalized variable-length integer.\n\t\t\t\t\tvar q = delta;\n\t\t\t\t\tfor (var k = base;; /* no condition */k += base) {\n\t\t\t\t\t\tvar t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;\n\t\t\t\t\t\tif (q < t) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvar qMinusT = q - t;\n\t\t\t\t\t\tvar baseMinusT = base - t;\n\t\t\t\t\t\toutput.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0)));\n\t\t\t\t\t\tq = floor(qMinusT / baseMinusT);\n\t\t\t\t\t}\n\n\t\t\t\t\toutput.push(stringFromCharCode(digitToBasic(q, 0)));\n\t\t\t\t\tbias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n\t\t\t\t\tdelta = 0;\n\t\t\t\t\t++handledCPCount;\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (err) {\n\t\t\t_didIteratorError3 = true;\n\t\t\t_iteratorError3 = err;\n\t\t} finally {\n\t\t\ttry {\n\t\t\t\tif (!_iteratorNormalCompletion3 && _iterator3.return) {\n\t\t\t\t\t_iterator3.return();\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tif (_didIteratorError3) {\n\t\t\t\t\tthrow _iteratorError3;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t++delta;\n\t\t++n;\n\t}\n\treturn output.join('');\n};\n\n/**\n * Converts a Punycode string representing a domain name or an email address\n * to Unicode. Only the Punycoded parts of the input will be converted, i.e.\n * it doesn't matter if you call it on a string that has already been\n * converted to Unicode.\n * @memberOf punycode\n * @param {String} input The Punycoded domain name or email address to\n * convert to Unicode.\n * @returns {String} The Unicode representation of the given Punycode\n * string.\n */\nvar toUnicode = function toUnicode(input) {\n\treturn mapDomain(input, function (string) {\n\t\treturn regexPunycode.test(string) ? decode(string.slice(4).toLowerCase()) : string;\n\t});\n};\n\n/**\n * Converts a Unicode string representing a domain name or an email address to\n * Punycode. Only the non-ASCII parts of the domain name will be converted,\n * i.e. it doesn't matter if you call it with a domain that's already in\n * ASCII.\n * @memberOf punycode\n * @param {String} input The domain name or email address to convert, as a\n * Unicode string.\n * @returns {String} The Punycode representation of the given domain name or\n * email address.\n */\nvar toASCII = function toASCII(input) {\n\treturn mapDomain(input, function (string) {\n\t\treturn regexNonASCII.test(string) ? 'xn--' + encode(string) : string;\n\t});\n};\n\n/*--------------------------------------------------------------------------*/\n\n/** Define the public API */\nvar punycode = {\n\t/**\n * A string representing the current Punycode.js version number.\n * @memberOf punycode\n * @type String\n */\n\t'version': '2.1.0',\n\t/**\n * An object of methods to convert from JavaScript's internal character\n * representation (UCS-2) to Unicode code points, and back.\n * @see \n * @memberOf punycode\n * @type Object\n */\n\t'ucs2': {\n\t\t'decode': ucs2decode,\n\t\t'encode': ucs2encode\n\t},\n\t'decode': decode,\n\t'encode': encode,\n\t'toASCII': toASCII,\n\t'toUnicode': toUnicode\n};\n\n/**\n * URI.js\n *\n * @fileoverview An RFC 3986 compliant, scheme extendable URI parsing/validating/resolving library for JavaScript.\n * @author Gary Court\n * @see http://github.com/garycourt/uri-js\n */\n/**\n * Copyright 2011 Gary Court. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY GARY COURT ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND\n * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GARY COURT OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * The views and conclusions contained in the software and documentation are those of the\n * authors and should not be interpreted as representing official policies, either expressed\n * or implied, of Gary Court.\n */\nvar SCHEMES = {};\nfunction pctEncChar(chr) {\n var c = chr.charCodeAt(0);\n var e = void 0;\n if (c < 16) e = \"%0\" + c.toString(16).toUpperCase();else if (c < 128) e = \"%\" + c.toString(16).toUpperCase();else if (c < 2048) e = \"%\" + (c >> 6 | 192).toString(16).toUpperCase() + \"%\" + (c & 63 | 128).toString(16).toUpperCase();else e = \"%\" + (c >> 12 | 224).toString(16).toUpperCase() + \"%\" + (c >> 6 & 63 | 128).toString(16).toUpperCase() + \"%\" + (c & 63 | 128).toString(16).toUpperCase();\n return e;\n}\nfunction pctDecChars(str) {\n var newStr = \"\";\n var i = 0;\n var il = str.length;\n while (i < il) {\n var c = parseInt(str.substr(i + 1, 2), 16);\n if (c < 128) {\n newStr += String.fromCharCode(c);\n i += 3;\n } else if (c >= 194 && c < 224) {\n if (il - i >= 6) {\n var c2 = parseInt(str.substr(i + 4, 2), 16);\n newStr += String.fromCharCode((c & 31) << 6 | c2 & 63);\n } else {\n newStr += str.substr(i, 6);\n }\n i += 6;\n } else if (c >= 224) {\n if (il - i >= 9) {\n var _c = parseInt(str.substr(i + 4, 2), 16);\n var c3 = parseInt(str.substr(i + 7, 2), 16);\n newStr += String.fromCharCode((c & 15) << 12 | (_c & 63) << 6 | c3 & 63);\n } else {\n newStr += str.substr(i, 9);\n }\n i += 9;\n } else {\n newStr += str.substr(i, 3);\n i += 3;\n }\n }\n return newStr;\n}\nfunction _normalizeComponentEncoding(components, protocol) {\n function decodeUnreserved(str) {\n var decStr = pctDecChars(str);\n return !decStr.match(protocol.UNRESERVED) ? str : decStr;\n }\n if (components.scheme) components.scheme = String(components.scheme).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_SCHEME, \"\");\n if (components.userinfo !== undefined) components.userinfo = String(components.userinfo).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_USERINFO, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n if (components.host !== undefined) components.host = String(components.host).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_HOST, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n if (components.path !== undefined) components.path = String(components.path).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(components.scheme ? protocol.NOT_PATH : protocol.NOT_PATH_NOSCHEME, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n if (components.query !== undefined) components.query = String(components.query).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_QUERY, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n if (components.fragment !== undefined) components.fragment = String(components.fragment).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_FRAGMENT, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n return components;\n}\n\nfunction _stripLeadingZeros(str) {\n return str.replace(/^0*(.*)/, \"$1\") || \"0\";\n}\nfunction _normalizeIPv4(host, protocol) {\n var matches = host.match(protocol.IPV4ADDRESS) || [];\n\n var _matches = slicedToArray(matches, 2),\n address = _matches[1];\n\n if (address) {\n return address.split(\".\").map(_stripLeadingZeros).join(\".\");\n } else {\n return host;\n }\n}\nfunction _normalizeIPv6(host, protocol) {\n var matches = host.match(protocol.IPV6ADDRESS) || [];\n\n var _matches2 = slicedToArray(matches, 3),\n address = _matches2[1],\n zone = _matches2[2];\n\n if (address) {\n var _address$toLowerCase$ = address.toLowerCase().split('::').reverse(),\n _address$toLowerCase$2 = slicedToArray(_address$toLowerCase$, 2),\n last = _address$toLowerCase$2[0],\n first = _address$toLowerCase$2[1];\n\n var firstFields = first ? first.split(\":\").map(_stripLeadingZeros) : [];\n var lastFields = last.split(\":\").map(_stripLeadingZeros);\n var isLastFieldIPv4Address = protocol.IPV4ADDRESS.test(lastFields[lastFields.length - 1]);\n var fieldCount = isLastFieldIPv4Address ? 7 : 8;\n var lastFieldsStart = lastFields.length - fieldCount;\n var fields = Array(fieldCount);\n for (var x = 0; x < fieldCount; ++x) {\n fields[x] = firstFields[x] || lastFields[lastFieldsStart + x] || '';\n }\n if (isLastFieldIPv4Address) {\n fields[fieldCount - 1] = _normalizeIPv4(fields[fieldCount - 1], protocol);\n }\n var allZeroFields = fields.reduce(function (acc, field, index) {\n if (!field || field === \"0\") {\n var lastLongest = acc[acc.length - 1];\n if (lastLongest && lastLongest.index + lastLongest.length === index) {\n lastLongest.length++;\n } else {\n acc.push({ index: index, length: 1 });\n }\n }\n return acc;\n }, []);\n var longestZeroFields = allZeroFields.sort(function (a, b) {\n return b.length - a.length;\n })[0];\n var newHost = void 0;\n if (longestZeroFields && longestZeroFields.length > 1) {\n var newFirst = fields.slice(0, longestZeroFields.index);\n var newLast = fields.slice(longestZeroFields.index + longestZeroFields.length);\n newHost = newFirst.join(\":\") + \"::\" + newLast.join(\":\");\n } else {\n newHost = fields.join(\":\");\n }\n if (zone) {\n newHost += \"%\" + zone;\n }\n return newHost;\n } else {\n return host;\n }\n}\nvar URI_PARSE = /^(?:([^:\\/?#]+):)?(?:\\/\\/((?:([^\\/?#@]*)@)?(\\[[^\\/?#\\]]+\\]|[^\\/?#:]*)(?:\\:(\\d*))?))?([^?#]*)(?:\\?([^#]*))?(?:#((?:.|\\n|\\r)*))?/i;\nvar NO_MATCH_IS_UNDEFINED = \"\".match(/(){0}/)[1] === undefined;\nfunction parse(uriString) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n var components = {};\n var protocol = options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL;\n if (options.reference === \"suffix\") uriString = (options.scheme ? options.scheme + \":\" : \"\") + \"//\" + uriString;\n var matches = uriString.match(URI_PARSE);\n if (matches) {\n if (NO_MATCH_IS_UNDEFINED) {\n //store each component\n components.scheme = matches[1];\n components.userinfo = matches[3];\n components.host = matches[4];\n components.port = parseInt(matches[5], 10);\n components.path = matches[6] || \"\";\n components.query = matches[7];\n components.fragment = matches[8];\n //fix port number\n if (isNaN(components.port)) {\n components.port = matches[5];\n }\n } else {\n //IE FIX for improper RegExp matching\n //store each component\n components.scheme = matches[1] || undefined;\n components.userinfo = uriString.indexOf(\"@\") !== -1 ? matches[3] : undefined;\n components.host = uriString.indexOf(\"//\") !== -1 ? matches[4] : undefined;\n components.port = parseInt(matches[5], 10);\n components.path = matches[6] || \"\";\n components.query = uriString.indexOf(\"?\") !== -1 ? matches[7] : undefined;\n components.fragment = uriString.indexOf(\"#\") !== -1 ? matches[8] : undefined;\n //fix port number\n if (isNaN(components.port)) {\n components.port = uriString.match(/\\/\\/(?:.|\\n)*\\:(?:\\/|\\?|\\#|$)/) ? matches[4] : undefined;\n }\n }\n if (components.host) {\n //normalize IP hosts\n components.host = _normalizeIPv6(_normalizeIPv4(components.host, protocol), protocol);\n }\n //determine reference type\n if (components.scheme === undefined && components.userinfo === undefined && components.host === undefined && components.port === undefined && !components.path && components.query === undefined) {\n components.reference = \"same-document\";\n } else if (components.scheme === undefined) {\n components.reference = \"relative\";\n } else if (components.fragment === undefined) {\n components.reference = \"absolute\";\n } else {\n components.reference = \"uri\";\n }\n //check for reference errors\n if (options.reference && options.reference !== \"suffix\" && options.reference !== components.reference) {\n components.error = components.error || \"URI is not a \" + options.reference + \" reference.\";\n }\n //find scheme handler\n var schemeHandler = SCHEMES[(options.scheme || components.scheme || \"\").toLowerCase()];\n //check if scheme can't handle IRIs\n if (!options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport)) {\n //if host component is a domain name\n if (components.host && (options.domainHost || schemeHandler && schemeHandler.domainHost)) {\n //convert Unicode IDN -> ASCII IDN\n try {\n components.host = punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase());\n } catch (e) {\n components.error = components.error || \"Host's domain name can not be converted to ASCII via punycode: \" + e;\n }\n }\n //convert IRI -> URI\n _normalizeComponentEncoding(components, URI_PROTOCOL);\n } else {\n //normalize encodings\n _normalizeComponentEncoding(components, protocol);\n }\n //perform scheme specific parsing\n if (schemeHandler && schemeHandler.parse) {\n schemeHandler.parse(components, options);\n }\n } else {\n components.error = components.error || \"URI can not be parsed.\";\n }\n return components;\n}\n\nfunction _recomposeAuthority(components, options) {\n var protocol = options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL;\n var uriTokens = [];\n if (components.userinfo !== undefined) {\n uriTokens.push(components.userinfo);\n uriTokens.push(\"@\");\n }\n if (components.host !== undefined) {\n //normalize IP hosts, add brackets and escape zone separator for IPv6\n uriTokens.push(_normalizeIPv6(_normalizeIPv4(String(components.host), protocol), protocol).replace(protocol.IPV6ADDRESS, function (_, $1, $2) {\n return \"[\" + $1 + ($2 ? \"%25\" + $2 : \"\") + \"]\";\n }));\n }\n if (typeof components.port === \"number\") {\n uriTokens.push(\":\");\n uriTokens.push(components.port.toString(10));\n }\n return uriTokens.length ? uriTokens.join(\"\") : undefined;\n}\n\nvar RDS1 = /^\\.\\.?\\//;\nvar RDS2 = /^\\/\\.(\\/|$)/;\nvar RDS3 = /^\\/\\.\\.(\\/|$)/;\nvar RDS5 = /^\\/?(?:.|\\n)*?(?=\\/|$)/;\nfunction removeDotSegments(input) {\n var output = [];\n while (input.length) {\n if (input.match(RDS1)) {\n input = input.replace(RDS1, \"\");\n } else if (input.match(RDS2)) {\n input = input.replace(RDS2, \"/\");\n } else if (input.match(RDS3)) {\n input = input.replace(RDS3, \"/\");\n output.pop();\n } else if (input === \".\" || input === \"..\") {\n input = \"\";\n } else {\n var im = input.match(RDS5);\n if (im) {\n var s = im[0];\n input = input.slice(s.length);\n output.push(s);\n } else {\n throw new Error(\"Unexpected dot segment condition\");\n }\n }\n }\n return output.join(\"\");\n}\n\nfunction serialize(components) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n var protocol = options.iri ? IRI_PROTOCOL : URI_PROTOCOL;\n var uriTokens = [];\n //find scheme handler\n var schemeHandler = SCHEMES[(options.scheme || components.scheme || \"\").toLowerCase()];\n //perform scheme specific serialization\n if (schemeHandler && schemeHandler.serialize) schemeHandler.serialize(components, options);\n if (components.host) {\n //if host component is an IPv6 address\n if (protocol.IPV6ADDRESS.test(components.host)) {}\n //TODO: normalize IPv6 address as per RFC 5952\n\n //if host component is a domain name\n else if (options.domainHost || schemeHandler && schemeHandler.domainHost) {\n //convert IDN via punycode\n try {\n components.host = !options.iri ? punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase()) : punycode.toUnicode(components.host);\n } catch (e) {\n components.error = components.error || \"Host's domain name can not be converted to \" + (!options.iri ? \"ASCII\" : \"Unicode\") + \" via punycode: \" + e;\n }\n }\n }\n //normalize encoding\n _normalizeComponentEncoding(components, protocol);\n if (options.reference !== \"suffix\" && components.scheme) {\n uriTokens.push(components.scheme);\n uriTokens.push(\":\");\n }\n var authority = _recomposeAuthority(components, options);\n if (authority !== undefined) {\n if (options.reference !== \"suffix\") {\n uriTokens.push(\"//\");\n }\n uriTokens.push(authority);\n if (components.path && components.path.charAt(0) !== \"/\") {\n uriTokens.push(\"/\");\n }\n }\n if (components.path !== undefined) {\n var s = components.path;\n if (!options.absolutePath && (!schemeHandler || !schemeHandler.absolutePath)) {\n s = removeDotSegments(s);\n }\n if (authority === undefined) {\n s = s.replace(/^\\/\\//, \"/%2F\"); //don't allow the path to start with \"//\"\n }\n uriTokens.push(s);\n }\n if (components.query !== undefined) {\n uriTokens.push(\"?\");\n uriTokens.push(components.query);\n }\n if (components.fragment !== undefined) {\n uriTokens.push(\"#\");\n uriTokens.push(components.fragment);\n }\n return uriTokens.join(\"\"); //merge tokens into a string\n}\n\nfunction resolveComponents(base, relative) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var skipNormalization = arguments[3];\n\n var target = {};\n if (!skipNormalization) {\n base = parse(serialize(base, options), options); //normalize base components\n relative = parse(serialize(relative, options), options); //normalize relative components\n }\n options = options || {};\n if (!options.tolerant && relative.scheme) {\n target.scheme = relative.scheme;\n //target.authority = relative.authority;\n target.userinfo = relative.userinfo;\n target.host = relative.host;\n target.port = relative.port;\n target.path = removeDotSegments(relative.path || \"\");\n target.query = relative.query;\n } else {\n if (relative.userinfo !== undefined || relative.host !== undefined || relative.port !== undefined) {\n //target.authority = relative.authority;\n target.userinfo = relative.userinfo;\n target.host = relative.host;\n target.port = relative.port;\n target.path = removeDotSegments(relative.path || \"\");\n target.query = relative.query;\n } else {\n if (!relative.path) {\n target.path = base.path;\n if (relative.query !== undefined) {\n target.query = relative.query;\n } else {\n target.query = base.query;\n }\n } else {\n if (relative.path.charAt(0) === \"/\") {\n target.path = removeDotSegments(relative.path);\n } else {\n if ((base.userinfo !== undefined || base.host !== undefined || base.port !== undefined) && !base.path) {\n target.path = \"/\" + relative.path;\n } else if (!base.path) {\n target.path = relative.path;\n } else {\n target.path = base.path.slice(0, base.path.lastIndexOf(\"/\") + 1) + relative.path;\n }\n target.path = removeDotSegments(target.path);\n }\n target.query = relative.query;\n }\n //target.authority = base.authority;\n target.userinfo = base.userinfo;\n target.host = base.host;\n target.port = base.port;\n }\n target.scheme = base.scheme;\n }\n target.fragment = relative.fragment;\n return target;\n}\n\nfunction resolve(baseURI, relativeURI, options) {\n var schemelessOptions = assign({ scheme: 'null' }, options);\n return serialize(resolveComponents(parse(baseURI, schemelessOptions), parse(relativeURI, schemelessOptions), schemelessOptions, true), schemelessOptions);\n}\n\nfunction normalize(uri, options) {\n if (typeof uri === \"string\") {\n uri = serialize(parse(uri, options), options);\n } else if (typeOf(uri) === \"object\") {\n uri = parse(serialize(uri, options), options);\n }\n return uri;\n}\n\nfunction equal(uriA, uriB, options) {\n if (typeof uriA === \"string\") {\n uriA = serialize(parse(uriA, options), options);\n } else if (typeOf(uriA) === \"object\") {\n uriA = serialize(uriA, options);\n }\n if (typeof uriB === \"string\") {\n uriB = serialize(parse(uriB, options), options);\n } else if (typeOf(uriB) === \"object\") {\n uriB = serialize(uriB, options);\n }\n return uriA === uriB;\n}\n\nfunction escapeComponent(str, options) {\n return str && str.toString().replace(!options || !options.iri ? URI_PROTOCOL.ESCAPE : IRI_PROTOCOL.ESCAPE, pctEncChar);\n}\n\nfunction unescapeComponent(str, options) {\n return str && str.toString().replace(!options || !options.iri ? URI_PROTOCOL.PCT_ENCODED : IRI_PROTOCOL.PCT_ENCODED, pctDecChars);\n}\n\nvar handler = {\n scheme: \"http\",\n domainHost: true,\n parse: function parse(components, options) {\n //report missing host\n if (!components.host) {\n components.error = components.error || \"HTTP URIs must have a host.\";\n }\n return components;\n },\n serialize: function serialize(components, options) {\n //normalize the default port\n if (components.port === (String(components.scheme).toLowerCase() !== \"https\" ? 80 : 443) || components.port === \"\") {\n components.port = undefined;\n }\n //normalize the empty path\n if (!components.path) {\n components.path = \"/\";\n }\n //NOTE: We do not parse query strings for HTTP URIs\n //as WWW Form Url Encoded query strings are part of the HTML4+ spec,\n //and not the HTTP spec.\n return components;\n }\n};\n\nvar handler$1 = {\n scheme: \"https\",\n domainHost: handler.domainHost,\n parse: handler.parse,\n serialize: handler.serialize\n};\n\nvar O = {};\nvar isIRI = true;\n//RFC 3986\nvar UNRESERVED$$ = \"[A-Za-z0-9\\\\-\\\\.\\\\_\\\\~\" + (isIRI ? \"\\\\xA0-\\\\u200D\\\\u2010-\\\\u2029\\\\u202F-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFEF\" : \"\") + \"]\";\nvar HEXDIG$$ = \"[0-9A-Fa-f]\"; //case-insensitive\nvar PCT_ENCODED$ = subexp(subexp(\"%[EFef]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%[89A-Fa-f]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%\" + HEXDIG$$ + HEXDIG$$)); //expanded\n//RFC 5322, except these symbols as per RFC 6068: @ : / ? # [ ] & ; =\n//const ATEXT$$ = \"[A-Za-z0-9\\\\!\\\\#\\\\$\\\\%\\\\&\\\\'\\\\*\\\\+\\\\-\\\\/\\\\=\\\\?\\\\^\\\\_\\\\`\\\\{\\\\|\\\\}\\\\~]\";\n//const WSP$$ = \"[\\\\x20\\\\x09]\";\n//const OBS_QTEXT$$ = \"[\\\\x01-\\\\x08\\\\x0B\\\\x0C\\\\x0E-\\\\x1F\\\\x7F]\"; //(%d1-8 / %d11-12 / %d14-31 / %d127)\n//const QTEXT$$ = merge(\"[\\\\x21\\\\x23-\\\\x5B\\\\x5D-\\\\x7E]\", OBS_QTEXT$$); //%d33 / %d35-91 / %d93-126 / obs-qtext\n//const VCHAR$$ = \"[\\\\x21-\\\\x7E]\";\n//const WSP$$ = \"[\\\\x20\\\\x09]\";\n//const OBS_QP$ = subexp(\"\\\\\\\\\" + merge(\"[\\\\x00\\\\x0D\\\\x0A]\", OBS_QTEXT$$)); //%d0 / CR / LF / obs-qtext\n//const FWS$ = subexp(subexp(WSP$$ + \"*\" + \"\\\\x0D\\\\x0A\") + \"?\" + WSP$$ + \"+\");\n//const QUOTED_PAIR$ = subexp(subexp(\"\\\\\\\\\" + subexp(VCHAR$$ + \"|\" + WSP$$)) + \"|\" + OBS_QP$);\n//const QUOTED_STRING$ = subexp('\\\\\"' + subexp(FWS$ + \"?\" + QCONTENT$) + \"*\" + FWS$ + \"?\" + '\\\\\"');\nvar ATEXT$$ = \"[A-Za-z0-9\\\\!\\\\$\\\\%\\\\'\\\\*\\\\+\\\\-\\\\^\\\\_\\\\`\\\\{\\\\|\\\\}\\\\~]\";\nvar QTEXT$$ = \"[\\\\!\\\\$\\\\%\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\-\\\\.0-9\\\\<\\\\>A-Z\\\\x5E-\\\\x7E]\";\nvar VCHAR$$ = merge(QTEXT$$, \"[\\\\\\\"\\\\\\\\]\");\nvar SOME_DELIMS$$ = \"[\\\\!\\\\$\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\;\\\\:\\\\@]\";\nvar UNRESERVED = new RegExp(UNRESERVED$$, \"g\");\nvar PCT_ENCODED = new RegExp(PCT_ENCODED$, \"g\");\nvar NOT_LOCAL_PART = new RegExp(merge(\"[^]\", ATEXT$$, \"[\\\\.]\", '[\\\\\"]', VCHAR$$), \"g\");\nvar NOT_HFNAME = new RegExp(merge(\"[^]\", UNRESERVED$$, SOME_DELIMS$$), \"g\");\nvar NOT_HFVALUE = NOT_HFNAME;\nfunction decodeUnreserved(str) {\n var decStr = pctDecChars(str);\n return !decStr.match(UNRESERVED) ? str : decStr;\n}\nvar handler$2 = {\n scheme: \"mailto\",\n parse: function parse$$1(components, options) {\n var mailtoComponents = components;\n var to = mailtoComponents.to = mailtoComponents.path ? mailtoComponents.path.split(\",\") : [];\n mailtoComponents.path = undefined;\n if (mailtoComponents.query) {\n var unknownHeaders = false;\n var headers = {};\n var hfields = mailtoComponents.query.split(\"&\");\n for (var x = 0, xl = hfields.length; x < xl; ++x) {\n var hfield = hfields[x].split(\"=\");\n switch (hfield[0]) {\n case \"to\":\n var toAddrs = hfield[1].split(\",\");\n for (var _x = 0, _xl = toAddrs.length; _x < _xl; ++_x) {\n to.push(toAddrs[_x]);\n }\n break;\n case \"subject\":\n mailtoComponents.subject = unescapeComponent(hfield[1], options);\n break;\n case \"body\":\n mailtoComponents.body = unescapeComponent(hfield[1], options);\n break;\n default:\n unknownHeaders = true;\n headers[unescapeComponent(hfield[0], options)] = unescapeComponent(hfield[1], options);\n break;\n }\n }\n if (unknownHeaders) mailtoComponents.headers = headers;\n }\n mailtoComponents.query = undefined;\n for (var _x2 = 0, _xl2 = to.length; _x2 < _xl2; ++_x2) {\n var addr = to[_x2].split(\"@\");\n addr[0] = unescapeComponent(addr[0]);\n if (!options.unicodeSupport) {\n //convert Unicode IDN -> ASCII IDN\n try {\n addr[1] = punycode.toASCII(unescapeComponent(addr[1], options).toLowerCase());\n } catch (e) {\n mailtoComponents.error = mailtoComponents.error || \"Email address's domain name can not be converted to ASCII via punycode: \" + e;\n }\n } else {\n addr[1] = unescapeComponent(addr[1], options).toLowerCase();\n }\n to[_x2] = addr.join(\"@\");\n }\n return mailtoComponents;\n },\n serialize: function serialize$$1(mailtoComponents, options) {\n var components = mailtoComponents;\n var to = toArray(mailtoComponents.to);\n if (to) {\n for (var x = 0, xl = to.length; x < xl; ++x) {\n var toAddr = String(to[x]);\n var atIdx = toAddr.lastIndexOf(\"@\");\n var localPart = toAddr.slice(0, atIdx).replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_LOCAL_PART, pctEncChar);\n var domain = toAddr.slice(atIdx + 1);\n //convert IDN via punycode\n try {\n domain = !options.iri ? punycode.toASCII(unescapeComponent(domain, options).toLowerCase()) : punycode.toUnicode(domain);\n } catch (e) {\n components.error = components.error || \"Email address's domain name can not be converted to \" + (!options.iri ? \"ASCII\" : \"Unicode\") + \" via punycode: \" + e;\n }\n to[x] = localPart + \"@\" + domain;\n }\n components.path = to.join(\",\");\n }\n var headers = mailtoComponents.headers = mailtoComponents.headers || {};\n if (mailtoComponents.subject) headers[\"subject\"] = mailtoComponents.subject;\n if (mailtoComponents.body) headers[\"body\"] = mailtoComponents.body;\n var fields = [];\n for (var name in headers) {\n if (headers[name] !== O[name]) {\n fields.push(name.replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFNAME, pctEncChar) + \"=\" + headers[name].replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFVALUE, pctEncChar));\n }\n }\n if (fields.length) {\n components.query = fields.join(\"&\");\n }\n return components;\n }\n};\n\nvar URN_PARSE = /^([^\\:]+)\\:(.*)/;\n//RFC 2141\nvar handler$3 = {\n scheme: \"urn\",\n parse: function parse$$1(components, options) {\n var matches = components.path && components.path.match(URN_PARSE);\n var urnComponents = components;\n if (matches) {\n var scheme = options.scheme || urnComponents.scheme || \"urn\";\n var nid = matches[1].toLowerCase();\n var nss = matches[2];\n var urnScheme = scheme + \":\" + (options.nid || nid);\n var schemeHandler = SCHEMES[urnScheme];\n urnComponents.nid = nid;\n urnComponents.nss = nss;\n urnComponents.path = undefined;\n if (schemeHandler) {\n urnComponents = schemeHandler.parse(urnComponents, options);\n }\n } else {\n urnComponents.error = urnComponents.error || \"URN can not be parsed.\";\n }\n return urnComponents;\n },\n serialize: function serialize$$1(urnComponents, options) {\n var scheme = options.scheme || urnComponents.scheme || \"urn\";\n var nid = urnComponents.nid;\n var urnScheme = scheme + \":\" + (options.nid || nid);\n var schemeHandler = SCHEMES[urnScheme];\n if (schemeHandler) {\n urnComponents = schemeHandler.serialize(urnComponents, options);\n }\n var uriComponents = urnComponents;\n var nss = urnComponents.nss;\n uriComponents.path = (nid || options.nid) + \":\" + nss;\n return uriComponents;\n }\n};\n\nvar UUID = /^[0-9A-Fa-f]{8}(?:\\-[0-9A-Fa-f]{4}){3}\\-[0-9A-Fa-f]{12}$/;\n//RFC 4122\nvar handler$4 = {\n scheme: \"urn:uuid\",\n parse: function parse(urnComponents, options) {\n var uuidComponents = urnComponents;\n uuidComponents.uuid = uuidComponents.nss;\n uuidComponents.nss = undefined;\n if (!options.tolerant && (!uuidComponents.uuid || !uuidComponents.uuid.match(UUID))) {\n uuidComponents.error = uuidComponents.error || \"UUID is not valid.\";\n }\n return uuidComponents;\n },\n serialize: function serialize(uuidComponents, options) {\n var urnComponents = uuidComponents;\n //normalize UUID\n urnComponents.nss = (uuidComponents.uuid || \"\").toLowerCase();\n return urnComponents;\n }\n};\n\nSCHEMES[handler.scheme] = handler;\nSCHEMES[handler$1.scheme] = handler$1;\nSCHEMES[handler$2.scheme] = handler$2;\nSCHEMES[handler$3.scheme] = handler$3;\nSCHEMES[handler$4.scheme] = handler$4;\n\nexports.SCHEMES = SCHEMES;\nexports.pctEncChar = pctEncChar;\nexports.pctDecChars = pctDecChars;\nexports.parse = parse;\nexports.removeDotSegments = removeDotSegments;\nexports.serialize = serialize;\nexports.resolveComponents = resolveComponents;\nexports.resolve = resolve;\nexports.normalize = normalize;\nexports.equal = equal;\nexports.escapeComponent = escapeComponent;\nexports.unescapeComponent = unescapeComponent;\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n//# sourceMappingURL=uri.all.js.map\n","'use strict';\n\n// https://mathiasbynens.be/notes/javascript-encoding\n// https://github.com/bestiejs/punycode.js - punycode.ucs2.decode\nmodule.exports = function ucs2length(str) {\n var length = 0\n , len = str.length\n , pos = 0\n , value;\n while (pos < len) {\n length++;\n value = str.charCodeAt(pos++);\n if (value >= 0xD800 && value <= 0xDBFF && pos < len) {\n // high surrogate, and there is a next character\n value = str.charCodeAt(pos);\n if ((value & 0xFC00) == 0xDC00) pos++; // low surrogate\n }\n }\n return length;\n};\n","'use strict';\n\nvar traverse = module.exports = function (schema, opts, cb) {\n // Legacy support for v0.3.1 and earlier.\n if (typeof opts == 'function') {\n cb = opts;\n opts = {};\n }\n\n cb = opts.cb || cb;\n var pre = (typeof cb == 'function') ? cb : cb.pre || function() {};\n var post = cb.post || function() {};\n\n _traverse(opts, pre, post, schema, '', schema);\n};\n\n\ntraverse.keywords = {\n additionalItems: true,\n items: true,\n contains: true,\n additionalProperties: true,\n propertyNames: true,\n not: true\n};\n\ntraverse.arrayKeywords = {\n items: true,\n allOf: true,\n anyOf: true,\n oneOf: true\n};\n\ntraverse.propsKeywords = {\n definitions: true,\n properties: true,\n patternProperties: true,\n dependencies: true\n};\n\ntraverse.skipKeywords = {\n default: true,\n enum: true,\n const: true,\n required: true,\n maximum: true,\n minimum: true,\n exclusiveMaximum: true,\n exclusiveMinimum: true,\n multipleOf: true,\n maxLength: true,\n minLength: true,\n pattern: true,\n format: true,\n maxItems: true,\n minItems: true,\n uniqueItems: true,\n maxProperties: true,\n minProperties: true\n};\n\n\nfunction _traverse(opts, pre, post, schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex) {\n if (schema && typeof schema == 'object' && !Array.isArray(schema)) {\n pre(schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex);\n for (var key in schema) {\n var sch = schema[key];\n if (Array.isArray(sch)) {\n if (key in traverse.arrayKeywords) {\n for (var i=0; i%\\\\^`{|}]|%[0-9a-f]{2})|\\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\\*)?)*\\})*$/i;\n// For the source: https://gist.github.com/dperini/729294\n// For test cases: https://mathiasbynens.be/demo/url-regex\n// @todo Delete current URL in favour of the commented out URL rule when this issue is fixed https://github.com/eslint/eslint/issues/7983.\n// var URL = /^(?:(?:https?|ftp):\\/\\/)(?:\\S+(?::\\S*)?@)?(?:(?!10(?:\\.\\d{1,3}){3})(?!127(?:\\.\\d{1,3}){3})(?!169\\.254(?:\\.\\d{1,3}){2})(?!192\\.168(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u{00a1}-\\u{ffff}0-9]+-?)*[a-z\\u{00a1}-\\u{ffff}0-9]+)(?:\\.(?:[a-z\\u{00a1}-\\u{ffff}0-9]+-?)*[a-z\\u{00a1}-\\u{ffff}0-9]+)*(?:\\.(?:[a-z\\u{00a1}-\\u{ffff}]{2,})))(?::\\d{2,5})?(?:\\/[^\\s]*)?$/iu;\nvar URL = /^(?:(?:http[s\\u017F]?|ftp):\\/\\/)(?:(?:[\\0-\\x08\\x0E-\\x1F!-\\x9F\\xA1-\\u167F\\u1681-\\u1FFF\\u200B-\\u2027\\u202A-\\u202E\\u2030-\\u205E\\u2060-\\u2FFF\\u3001-\\uD7FF\\uE000-\\uFEFE\\uFF00-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF])+(?::(?:[\\0-\\x08\\x0E-\\x1F!-\\x9F\\xA1-\\u167F\\u1681-\\u1FFF\\u200B-\\u2027\\u202A-\\u202E\\u2030-\\u205E\\u2060-\\u2FFF\\u3001-\\uD7FF\\uE000-\\uFEFE\\uFF00-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF])*)?@)?(?:(?!10(?:\\.[0-9]{1,3}){3})(?!127(?:\\.[0-9]{1,3}){3})(?!169\\.254(?:\\.[0-9]{1,3}){2})(?!192\\.168(?:\\.[0-9]{1,3}){2})(?!172\\.(?:1[6-9]|2[0-9]|3[01])(?:\\.[0-9]{1,3}){2})(?:[1-9][0-9]?|1[0-9][0-9]|2[01][0-9]|22[0-3])(?:\\.(?:1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])){2}(?:\\.(?:[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-4]))|(?:(?:(?:[0-9KSa-z\\xA1-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF])+-?)*(?:[0-9KSa-z\\xA1-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF])+)(?:\\.(?:(?:[0-9KSa-z\\xA1-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF])+-?)*(?:[0-9KSa-z\\xA1-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF])+)*(?:\\.(?:(?:[KSa-z\\xA1-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]){2,})))(?::[0-9]{2,5})?(?:\\/(?:[\\0-\\x08\\x0E-\\x1F!-\\x9F\\xA1-\\u167F\\u1681-\\u1FFF\\u200B-\\u2027\\u202A-\\u202E\\u2030-\\u205E\\u2060-\\u2FFF\\u3001-\\uD7FF\\uE000-\\uFEFE\\uFF00-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF])*)?$/i;\nvar UUID = /^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i;\nvar JSON_POINTER = /^(?:\\/(?:[^~/]|~0|~1)*)*$/;\nvar JSON_POINTER_URI_FRAGMENT = /^#(?:\\/(?:[a-z0-9_\\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i;\nvar RELATIVE_JSON_POINTER = /^(?:0|[1-9][0-9]*)(?:#|(?:\\/(?:[^~/]|~0|~1)*)*)$/;\n\n\nmodule.exports = formats;\n\nfunction formats(mode) {\n mode = mode == 'full' ? 'full' : 'fast';\n return util.copy(formats[mode]);\n}\n\n\nformats.fast = {\n // date: http://tools.ietf.org/html/rfc3339#section-5.6\n date: /^\\d\\d\\d\\d-[0-1]\\d-[0-3]\\d$/,\n // date-time: http://tools.ietf.org/html/rfc3339#section-5.6\n time: /^(?:[0-2]\\d:[0-5]\\d:[0-5]\\d|23:59:60)(?:\\.\\d+)?(?:z|[+-]\\d\\d(?::?\\d\\d)?)?$/i,\n 'date-time': /^\\d\\d\\d\\d-[0-1]\\d-[0-3]\\d[t\\s](?:[0-2]\\d:[0-5]\\d:[0-5]\\d|23:59:60)(?:\\.\\d+)?(?:z|[+-]\\d\\d(?::?\\d\\d)?)$/i,\n // uri: https://github.com/mafintosh/is-my-json-valid/blob/master/formats.js\n uri: /^(?:[a-z][a-z0-9+-.]*:)(?:\\/?\\/)?[^\\s]*$/i,\n 'uri-reference': /^(?:(?:[a-z][a-z0-9+-.]*:)?\\/?\\/)?(?:[^\\\\\\s#][^\\s#]*)?(?:#[^\\\\\\s]*)?$/i,\n 'uri-template': URITEMPLATE,\n url: URL,\n // email (sources from jsen validator):\n // http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address#answer-8829363\n // http://www.w3.org/TR/html5/forms.html#valid-e-mail-address (search for 'willful violation')\n email: /^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i,\n hostname: HOSTNAME,\n // optimized https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html\n ipv4: /^(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$/,\n // optimized http://stackoverflow.com/questions/53497/regular-expression-that-matches-valid-ipv6-addresses\n ipv6: /^\\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(?:%.+)?\\s*$/i,\n regex: regex,\n // uuid: http://tools.ietf.org/html/rfc4122\n uuid: UUID,\n // JSON-pointer: https://tools.ietf.org/html/rfc6901\n // uri fragment: https://tools.ietf.org/html/rfc3986#appendix-A\n 'json-pointer': JSON_POINTER,\n 'json-pointer-uri-fragment': JSON_POINTER_URI_FRAGMENT,\n // relative JSON-pointer: http://tools.ietf.org/html/draft-luff-relative-json-pointer-00\n 'relative-json-pointer': RELATIVE_JSON_POINTER\n};\n\n\nformats.full = {\n date: date,\n time: time,\n 'date-time': date_time,\n uri: uri,\n 'uri-reference': URIREF,\n 'uri-template': URITEMPLATE,\n url: URL,\n email: /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i,\n hostname: HOSTNAME,\n ipv4: /^(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$/,\n ipv6: /^\\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(?:%.+)?\\s*$/i,\n regex: regex,\n uuid: UUID,\n 'json-pointer': JSON_POINTER,\n 'json-pointer-uri-fragment': JSON_POINTER_URI_FRAGMENT,\n 'relative-json-pointer': RELATIVE_JSON_POINTER\n};\n\n\nfunction isLeapYear(year) {\n // https://tools.ietf.org/html/rfc3339#appendix-C\n return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);\n}\n\n\nfunction date(str) {\n // full-date from http://tools.ietf.org/html/rfc3339#section-5.6\n var matches = str.match(DATE);\n if (!matches) return false;\n\n var year = +matches[1];\n var month = +matches[2];\n var day = +matches[3];\n\n return month >= 1 && month <= 12 && day >= 1 &&\n day <= (month == 2 && isLeapYear(year) ? 29 : DAYS[month]);\n}\n\n\nfunction time(str, full) {\n var matches = str.match(TIME);\n if (!matches) return false;\n\n var hour = matches[1];\n var minute = matches[2];\n var second = matches[3];\n var timeZone = matches[5];\n return ((hour <= 23 && minute <= 59 && second <= 59) ||\n (hour == 23 && minute == 59 && second == 60)) &&\n (!full || timeZone);\n}\n\n\nvar DATE_TIME_SEPARATOR = /t|\\s/i;\nfunction date_time(str) {\n // http://tools.ietf.org/html/rfc3339#section-5.6\n var dateTime = str.split(DATE_TIME_SEPARATOR);\n return dateTime.length == 2 && date(dateTime[0]) && time(dateTime[1], true);\n}\n\n\nvar NOT_URI_FRAGMENT = /\\/|:/;\nfunction uri(str) {\n // http://jmrware.com/articles/2009/uri_regexp/URI_regex.html + optional protocol + required \".\"\n return NOT_URI_FRAGMENT.test(str) && URI.test(str);\n}\n\n\nvar Z_ANCHOR = /[^\\\\]\\\\Z/;\nfunction regex(str) {\n if (Z_ANCHOR.test(str)) return false;\n try {\n new RegExp(str);\n return true;\n } catch(e) {\n return false;\n }\n}\n","'use strict';\n\nvar ruleModules = require('../dotjs')\n , toHash = require('./util').toHash;\n\nmodule.exports = function rules() {\n var RULES = [\n { type: 'number',\n rules: [ { 'maximum': ['exclusiveMaximum'] },\n { 'minimum': ['exclusiveMinimum'] }, 'multipleOf', 'format'] },\n { type: 'string',\n rules: [ 'maxLength', 'minLength', 'pattern', 'format' ] },\n { type: 'array',\n rules: [ 'maxItems', 'minItems', 'items', 'contains', 'uniqueItems' ] },\n { type: 'object',\n rules: [ 'maxProperties', 'minProperties', 'required', 'dependencies', 'propertyNames',\n { 'properties': ['additionalProperties', 'patternProperties'] } ] },\n { rules: [ '$ref', 'const', 'enum', 'not', 'anyOf', 'oneOf', 'allOf', 'if' ] }\n ];\n\n var ALL = [ 'type', '$comment' ];\n var KEYWORDS = [\n '$schema', '$id', 'id', '$data', '$async', 'title',\n 'description', 'default', 'definitions',\n 'examples', 'readOnly', 'writeOnly',\n 'contentMediaType', 'contentEncoding',\n 'additionalItems', 'then', 'else'\n ];\n var TYPES = [ 'number', 'integer', 'string', 'array', 'object', 'boolean', 'null' ];\n RULES.all = toHash(ALL);\n RULES.types = toHash(TYPES);\n\n RULES.forEach(function (group) {\n group.rules = group.rules.map(function (keyword) {\n var implKeywords;\n if (typeof keyword == 'object') {\n var key = Object.keys(keyword)[0];\n implKeywords = keyword[key];\n keyword = key;\n implKeywords.forEach(function (k) {\n ALL.push(k);\n RULES.all[k] = true;\n });\n }\n ALL.push(keyword);\n var rule = RULES.all[keyword] = {\n keyword: keyword,\n code: ruleModules[keyword],\n implements: implKeywords\n };\n return rule;\n });\n\n RULES.all.$comment = {\n keyword: '$comment',\n code: ruleModules.$comment\n };\n\n if (group.type) RULES.types[group.type] = group;\n });\n\n RULES.keywords = toHash(ALL.concat(KEYWORDS));\n RULES.custom = {};\n\n return RULES;\n};\n","'use strict';\n\n//all requires must be explicit because browserify won't work with dynamic requires\nmodule.exports = {\n '$ref': require('./ref'),\n allOf: require('./allOf'),\n anyOf: require('./anyOf'),\n '$comment': require('./comment'),\n const: require('./const'),\n contains: require('./contains'),\n dependencies: require('./dependencies'),\n 'enum': require('./enum'),\n format: require('./format'),\n 'if': require('./if'),\n items: require('./items'),\n maximum: require('./_limit'),\n minimum: require('./_limit'),\n maxItems: require('./_limitItems'),\n minItems: require('./_limitItems'),\n maxLength: require('./_limitLength'),\n minLength: require('./_limitLength'),\n maxProperties: require('./_limitProperties'),\n minProperties: require('./_limitProperties'),\n multipleOf: require('./multipleOf'),\n not: require('./not'),\n oneOf: require('./oneOf'),\n pattern: require('./pattern'),\n properties: require('./properties'),\n propertyNames: require('./propertyNames'),\n required: require('./required'),\n uniqueItems: require('./uniqueItems'),\n validate: require('./validate')\n};\n","'use strict';\nmodule.exports = function generate_ref(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $data = 'data' + ($dataLvl || '');\n var $valid = 'valid' + $lvl;\n var $async, $refCode;\n if ($schema == '#' || $schema == '#/') {\n if (it.isRoot) {\n $async = it.async;\n $refCode = 'validate';\n } else {\n $async = it.root.schema.$async === true;\n $refCode = 'root.refVal[0]';\n }\n } else {\n var $refVal = it.resolveRef(it.baseId, $schema, it.isRoot);\n if ($refVal === undefined) {\n var $message = it.MissingRefError.message(it.baseId, $schema);\n if (it.opts.missingRefs == 'fail') {\n it.logger.error($message);\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('$ref') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { ref: \\'' + (it.util.escapeQuotes($schema)) + '\\' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'can\\\\\\'t resolve reference ' + (it.util.escapeQuotes($schema)) + '\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: ' + (it.util.toQuotedString($schema)) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n if ($breakOnError) {\n out += ' if (false) { ';\n }\n } else if (it.opts.missingRefs == 'ignore') {\n it.logger.warn($message);\n if ($breakOnError) {\n out += ' if (true) { ';\n }\n } else {\n throw new it.MissingRefError(it.baseId, $schema, $message);\n }\n } else if ($refVal.inline) {\n var $it = it.util.copy(it);\n $it.level++;\n var $nextValid = 'valid' + $it.level;\n $it.schema = $refVal.schema;\n $it.schemaPath = '';\n $it.errSchemaPath = $schema;\n var $code = it.validate($it).replace(/validate\\.schema/g, $refVal.code);\n out += ' ' + ($code) + ' ';\n if ($breakOnError) {\n out += ' if (' + ($nextValid) + ') { ';\n }\n } else {\n $async = $refVal.$async === true || (it.async && $refVal.$async !== false);\n $refCode = $refVal.code;\n }\n }\n if ($refCode) {\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = '';\n if (it.opts.passContext) {\n out += ' ' + ($refCode) + '.call(this, ';\n } else {\n out += ' ' + ($refCode) + '( ';\n }\n out += ' ' + ($data) + ', (dataPath || \\'\\')';\n if (it.errorPath != '\"\"') {\n out += ' + ' + (it.errorPath);\n }\n var $parentData = $dataLvl ? 'data' + (($dataLvl - 1) || '') : 'parentData',\n $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty';\n out += ' , ' + ($parentData) + ' , ' + ($parentDataProperty) + ', rootData) ';\n var __callValidate = out;\n out = $$outStack.pop();\n if ($async) {\n if (!it.async) throw new Error('async schema referenced by sync schema');\n if ($breakOnError) {\n out += ' var ' + ($valid) + '; ';\n }\n out += ' try { await ' + (__callValidate) + '; ';\n if ($breakOnError) {\n out += ' ' + ($valid) + ' = true; ';\n }\n out += ' } catch (e) { if (!(e instanceof ValidationError)) throw e; if (vErrors === null) vErrors = e.errors; else vErrors = vErrors.concat(e.errors); errors = vErrors.length; ';\n if ($breakOnError) {\n out += ' ' + ($valid) + ' = false; ';\n }\n out += ' } ';\n if ($breakOnError) {\n out += ' if (' + ($valid) + ') { ';\n }\n } else {\n out += ' if (!' + (__callValidate) + ') { if (vErrors === null) vErrors = ' + ($refCode) + '.errors; else vErrors = vErrors.concat(' + ($refCode) + '.errors); errors = vErrors.length; } ';\n if ($breakOnError) {\n out += ' else { ';\n }\n }\n }\n return out;\n}\n","'use strict';\nmodule.exports = function generate_allOf(it, $keyword, $ruleType) {\n var out = ' ';\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $it = it.util.copy(it);\n var $closingBraces = '';\n $it.level++;\n var $nextValid = 'valid' + $it.level;\n var $currentBaseId = $it.baseId,\n $allSchemasEmpty = true;\n var arr1 = $schema;\n if (arr1) {\n var $sch, $i = -1,\n l1 = arr1.length - 1;\n while ($i < l1) {\n $sch = arr1[$i += 1];\n if ((it.opts.strictKeywords ? typeof $sch == 'object' && Object.keys($sch).length > 0 : it.util.schemaHasRules($sch, it.RULES.all))) {\n $allSchemasEmpty = false;\n $it.schema = $sch;\n $it.schemaPath = $schemaPath + '[' + $i + ']';\n $it.errSchemaPath = $errSchemaPath + '/' + $i;\n out += ' ' + (it.validate($it)) + ' ';\n $it.baseId = $currentBaseId;\n if ($breakOnError) {\n out += ' if (' + ($nextValid) + ') { ';\n $closingBraces += '}';\n }\n }\n }\n }\n if ($breakOnError) {\n if ($allSchemasEmpty) {\n out += ' if (true) { ';\n } else {\n out += ' ' + ($closingBraces.slice(0, -1)) + ' ';\n }\n }\n out = it.util.cleanUpCode(out);\n return out;\n}\n","'use strict';\nmodule.exports = function generate_anyOf(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $data = 'data' + ($dataLvl || '');\n var $valid = 'valid' + $lvl;\n var $errs = 'errs__' + $lvl;\n var $it = it.util.copy(it);\n var $closingBraces = '';\n $it.level++;\n var $nextValid = 'valid' + $it.level;\n var $noEmptySchema = $schema.every(function($sch) {\n return (it.opts.strictKeywords ? typeof $sch == 'object' && Object.keys($sch).length > 0 : it.util.schemaHasRules($sch, it.RULES.all));\n });\n if ($noEmptySchema) {\n var $currentBaseId = $it.baseId;\n out += ' var ' + ($errs) + ' = errors; var ' + ($valid) + ' = false; ';\n var $wasComposite = it.compositeRule;\n it.compositeRule = $it.compositeRule = true;\n var arr1 = $schema;\n if (arr1) {\n var $sch, $i = -1,\n l1 = arr1.length - 1;\n while ($i < l1) {\n $sch = arr1[$i += 1];\n $it.schema = $sch;\n $it.schemaPath = $schemaPath + '[' + $i + ']';\n $it.errSchemaPath = $errSchemaPath + '/' + $i;\n out += ' ' + (it.validate($it)) + ' ';\n $it.baseId = $currentBaseId;\n out += ' ' + ($valid) + ' = ' + ($valid) + ' || ' + ($nextValid) + '; if (!' + ($valid) + ') { ';\n $closingBraces += '}';\n }\n }\n it.compositeRule = $it.compositeRule = $wasComposite;\n out += ' ' + ($closingBraces) + ' if (!' + ($valid) + ') { var err = '; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('anyOf') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should match some schema in anyOf\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError(vErrors); ';\n } else {\n out += ' validate.errors = vErrors; return false; ';\n }\n }\n out += ' } else { errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } ';\n if (it.opts.allErrors) {\n out += ' } ';\n }\n out = it.util.cleanUpCode(out);\n } else {\n if ($breakOnError) {\n out += ' if (true) { ';\n }\n }\n return out;\n}\n","'use strict';\nmodule.exports = function generate_comment(it, $keyword, $ruleType) {\n var out = ' ';\n var $schema = it.schema[$keyword];\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $comment = it.util.toQuotedString($schema);\n if (it.opts.$comment === true) {\n out += ' console.log(' + ($comment) + ');';\n } else if (typeof it.opts.$comment == 'function') {\n out += ' self._opts.$comment(' + ($comment) + ', ' + (it.util.toQuotedString($errSchemaPath)) + ', validate.root.schema);';\n }\n return out;\n}\n","'use strict';\nmodule.exports = function generate_const(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $data = 'data' + ($dataLvl || '');\n var $valid = 'valid' + $lvl;\n var $isData = it.opts.$data && $schema && $schema.$data,\n $schemaValue;\n if ($isData) {\n out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';\n $schemaValue = 'schema' + $lvl;\n } else {\n $schemaValue = $schema;\n }\n if (!$isData) {\n out += ' var schema' + ($lvl) + ' = validate.schema' + ($schemaPath) + ';';\n }\n out += 'var ' + ($valid) + ' = equal(' + ($data) + ', schema' + ($lvl) + '); if (!' + ($valid) + ') { ';\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('const') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { allowedValue: schema' + ($lvl) + ' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should be equal to constant\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += ' }';\n if ($breakOnError) {\n out += ' else { ';\n }\n return out;\n}\n","'use strict';\nmodule.exports = function generate_contains(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $data = 'data' + ($dataLvl || '');\n var $valid = 'valid' + $lvl;\n var $errs = 'errs__' + $lvl;\n var $it = it.util.copy(it);\n var $closingBraces = '';\n $it.level++;\n var $nextValid = 'valid' + $it.level;\n var $idx = 'i' + $lvl,\n $dataNxt = $it.dataLevel = it.dataLevel + 1,\n $nextData = 'data' + $dataNxt,\n $currentBaseId = it.baseId,\n $nonEmptySchema = (it.opts.strictKeywords ? typeof $schema == 'object' && Object.keys($schema).length > 0 : it.util.schemaHasRules($schema, it.RULES.all));\n out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';';\n if ($nonEmptySchema) {\n var $wasComposite = it.compositeRule;\n it.compositeRule = $it.compositeRule = true;\n $it.schema = $schema;\n $it.schemaPath = $schemaPath;\n $it.errSchemaPath = $errSchemaPath;\n out += ' var ' + ($nextValid) + ' = false; for (var ' + ($idx) + ' = 0; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { ';\n $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true);\n var $passData = $data + '[' + $idx + ']';\n $it.dataPathArr[$dataNxt] = $idx;\n var $code = it.validate($it);\n $it.baseId = $currentBaseId;\n if (it.util.varOccurences($code, $nextData) < 2) {\n out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';\n } else {\n out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';\n }\n out += ' if (' + ($nextValid) + ') break; } ';\n it.compositeRule = $it.compositeRule = $wasComposite;\n out += ' ' + ($closingBraces) + ' if (!' + ($nextValid) + ') {';\n } else {\n out += ' if (' + ($data) + '.length == 0) {';\n }\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('contains') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should contain a valid item\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += ' } else { ';\n if ($nonEmptySchema) {\n out += ' errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } ';\n }\n if (it.opts.allErrors) {\n out += ' } ';\n }\n out = it.util.cleanUpCode(out);\n return out;\n}\n","'use strict';\nmodule.exports = function generate_dependencies(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $data = 'data' + ($dataLvl || '');\n var $errs = 'errs__' + $lvl;\n var $it = it.util.copy(it);\n var $closingBraces = '';\n $it.level++;\n var $nextValid = 'valid' + $it.level;\n var $schemaDeps = {},\n $propertyDeps = {},\n $ownProperties = it.opts.ownProperties;\n for ($property in $schema) {\n var $sch = $schema[$property];\n var $deps = Array.isArray($sch) ? $propertyDeps : $schemaDeps;\n $deps[$property] = $sch;\n }\n out += 'var ' + ($errs) + ' = errors;';\n var $currentErrorPath = it.errorPath;\n out += 'var missing' + ($lvl) + ';';\n for (var $property in $propertyDeps) {\n $deps = $propertyDeps[$property];\n if ($deps.length) {\n out += ' if ( ' + ($data) + (it.util.getProperty($property)) + ' !== undefined ';\n if ($ownProperties) {\n out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', \\'' + (it.util.escapeQuotes($property)) + '\\') ';\n }\n if ($breakOnError) {\n out += ' && ( ';\n var arr1 = $deps;\n if (arr1) {\n var $propertyKey, $i = -1,\n l1 = arr1.length - 1;\n while ($i < l1) {\n $propertyKey = arr1[$i += 1];\n if ($i) {\n out += ' || ';\n }\n var $prop = it.util.getProperty($propertyKey),\n $useData = $data + $prop;\n out += ' ( ( ' + ($useData) + ' === undefined ';\n if ($ownProperties) {\n out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \\'' + (it.util.escapeQuotes($propertyKey)) + '\\') ';\n }\n out += ') && (missing' + ($lvl) + ' = ' + (it.util.toQuotedString(it.opts.jsonPointers ? $propertyKey : $prop)) + ') ) ';\n }\n }\n out += ')) { ';\n var $propertyPath = 'missing' + $lvl,\n $missingProperty = '\\' + ' + $propertyPath + ' + \\'';\n if (it.opts._errorDataPathProperty) {\n it.errorPath = it.opts.jsonPointers ? it.util.getPathExpr($currentErrorPath, $propertyPath, true) : $currentErrorPath + ' + ' + $propertyPath;\n }\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('dependencies') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { property: \\'' + (it.util.escapeQuotes($property)) + '\\', missingProperty: \\'' + ($missingProperty) + '\\', depsCount: ' + ($deps.length) + ', deps: \\'' + (it.util.escapeQuotes($deps.length == 1 ? $deps[0] : $deps.join(\", \"))) + '\\' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should have ';\n if ($deps.length == 1) {\n out += 'property ' + (it.util.escapeQuotes($deps[0]));\n } else {\n out += 'properties ' + (it.util.escapeQuotes($deps.join(\", \")));\n }\n out += ' when property ' + (it.util.escapeQuotes($property)) + ' is present\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n } else {\n out += ' ) { ';\n var arr2 = $deps;\n if (arr2) {\n var $propertyKey, i2 = -1,\n l2 = arr2.length - 1;\n while (i2 < l2) {\n $propertyKey = arr2[i2 += 1];\n var $prop = it.util.getProperty($propertyKey),\n $missingProperty = it.util.escapeQuotes($propertyKey),\n $useData = $data + $prop;\n if (it.opts._errorDataPathProperty) {\n it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers);\n }\n out += ' if ( ' + ($useData) + ' === undefined ';\n if ($ownProperties) {\n out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \\'' + (it.util.escapeQuotes($propertyKey)) + '\\') ';\n }\n out += ') { var err = '; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('dependencies') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { property: \\'' + (it.util.escapeQuotes($property)) + '\\', missingProperty: \\'' + ($missingProperty) + '\\', depsCount: ' + ($deps.length) + ', deps: \\'' + (it.util.escapeQuotes($deps.length == 1 ? $deps[0] : $deps.join(\", \"))) + '\\' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should have ';\n if ($deps.length == 1) {\n out += 'property ' + (it.util.escapeQuotes($deps[0]));\n } else {\n out += 'properties ' + (it.util.escapeQuotes($deps.join(\", \")));\n }\n out += ' when property ' + (it.util.escapeQuotes($property)) + ' is present\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } ';\n }\n }\n }\n out += ' } ';\n if ($breakOnError) {\n $closingBraces += '}';\n out += ' else { ';\n }\n }\n }\n it.errorPath = $currentErrorPath;\n var $currentBaseId = $it.baseId;\n for (var $property in $schemaDeps) {\n var $sch = $schemaDeps[$property];\n if ((it.opts.strictKeywords ? typeof $sch == 'object' && Object.keys($sch).length > 0 : it.util.schemaHasRules($sch, it.RULES.all))) {\n out += ' ' + ($nextValid) + ' = true; if ( ' + ($data) + (it.util.getProperty($property)) + ' !== undefined ';\n if ($ownProperties) {\n out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', \\'' + (it.util.escapeQuotes($property)) + '\\') ';\n }\n out += ') { ';\n $it.schema = $sch;\n $it.schemaPath = $schemaPath + it.util.getProperty($property);\n $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($property);\n out += ' ' + (it.validate($it)) + ' ';\n $it.baseId = $currentBaseId;\n out += ' } ';\n if ($breakOnError) {\n out += ' if (' + ($nextValid) + ') { ';\n $closingBraces += '}';\n }\n }\n }\n if ($breakOnError) {\n out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {';\n }\n out = it.util.cleanUpCode(out);\n return out;\n}\n","'use strict';\nmodule.exports = function generate_enum(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $data = 'data' + ($dataLvl || '');\n var $valid = 'valid' + $lvl;\n var $isData = it.opts.$data && $schema && $schema.$data,\n $schemaValue;\n if ($isData) {\n out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';\n $schemaValue = 'schema' + $lvl;\n } else {\n $schemaValue = $schema;\n }\n var $i = 'i' + $lvl,\n $vSchema = 'schema' + $lvl;\n if (!$isData) {\n out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + ';';\n }\n out += 'var ' + ($valid) + ';';\n if ($isData) {\n out += ' if (schema' + ($lvl) + ' === undefined) ' + ($valid) + ' = true; else if (!Array.isArray(schema' + ($lvl) + ')) ' + ($valid) + ' = false; else {';\n }\n out += '' + ($valid) + ' = false;for (var ' + ($i) + '=0; ' + ($i) + '<' + ($vSchema) + '.length; ' + ($i) + '++) if (equal(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + '])) { ' + ($valid) + ' = true; break; }';\n if ($isData) {\n out += ' } ';\n }\n out += ' if (!' + ($valid) + ') { ';\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('enum') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { allowedValues: schema' + ($lvl) + ' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should be equal to one of the allowed values\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += ' }';\n if ($breakOnError) {\n out += ' else { ';\n }\n return out;\n}\n","'use strict';\nmodule.exports = function generate_format(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $data = 'data' + ($dataLvl || '');\n if (it.opts.format === false) {\n if ($breakOnError) {\n out += ' if (true) { ';\n }\n return out;\n }\n var $isData = it.opts.$data && $schema && $schema.$data,\n $schemaValue;\n if ($isData) {\n out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';\n $schemaValue = 'schema' + $lvl;\n } else {\n $schemaValue = $schema;\n }\n var $unknownFormats = it.opts.unknownFormats,\n $allowUnknown = Array.isArray($unknownFormats);\n if ($isData) {\n var $format = 'format' + $lvl,\n $isObject = 'isObject' + $lvl,\n $formatType = 'formatType' + $lvl;\n out += ' var ' + ($format) + ' = formats[' + ($schemaValue) + ']; var ' + ($isObject) + ' = typeof ' + ($format) + ' == \\'object\\' && !(' + ($format) + ' instanceof RegExp) && ' + ($format) + '.validate; var ' + ($formatType) + ' = ' + ($isObject) + ' && ' + ($format) + '.type || \\'string\\'; if (' + ($isObject) + ') { ';\n if (it.async) {\n out += ' var async' + ($lvl) + ' = ' + ($format) + '.async; ';\n }\n out += ' ' + ($format) + ' = ' + ($format) + '.validate; } if ( ';\n if ($isData) {\n out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \\'string\\') || ';\n }\n out += ' (';\n if ($unknownFormats != 'ignore') {\n out += ' (' + ($schemaValue) + ' && !' + ($format) + ' ';\n if ($allowUnknown) {\n out += ' && self._opts.unknownFormats.indexOf(' + ($schemaValue) + ') == -1 ';\n }\n out += ') || ';\n }\n out += ' (' + ($format) + ' && ' + ($formatType) + ' == \\'' + ($ruleType) + '\\' && !(typeof ' + ($format) + ' == \\'function\\' ? ';\n if (it.async) {\n out += ' (async' + ($lvl) + ' ? await ' + ($format) + '(' + ($data) + ') : ' + ($format) + '(' + ($data) + ')) ';\n } else {\n out += ' ' + ($format) + '(' + ($data) + ') ';\n }\n out += ' : ' + ($format) + '.test(' + ($data) + '))))) {';\n } else {\n var $format = it.formats[$schema];\n if (!$format) {\n if ($unknownFormats == 'ignore') {\n it.logger.warn('unknown format \"' + $schema + '\" ignored in schema at path \"' + it.errSchemaPath + '\"');\n if ($breakOnError) {\n out += ' if (true) { ';\n }\n return out;\n } else if ($allowUnknown && $unknownFormats.indexOf($schema) >= 0) {\n if ($breakOnError) {\n out += ' if (true) { ';\n }\n return out;\n } else {\n throw new Error('unknown format \"' + $schema + '\" is used in schema at path \"' + it.errSchemaPath + '\"');\n }\n }\n var $isObject = typeof $format == 'object' && !($format instanceof RegExp) && $format.validate;\n var $formatType = $isObject && $format.type || 'string';\n if ($isObject) {\n var $async = $format.async === true;\n $format = $format.validate;\n }\n if ($formatType != $ruleType) {\n if ($breakOnError) {\n out += ' if (true) { ';\n }\n return out;\n }\n if ($async) {\n if (!it.async) throw new Error('async format in sync schema');\n var $formatRef = 'formats' + it.util.getProperty($schema) + '.validate';\n out += ' if (!(await ' + ($formatRef) + '(' + ($data) + '))) { ';\n } else {\n out += ' if (! ';\n var $formatRef = 'formats' + it.util.getProperty($schema);\n if ($isObject) $formatRef += '.validate';\n if (typeof $format == 'function') {\n out += ' ' + ($formatRef) + '(' + ($data) + ') ';\n } else {\n out += ' ' + ($formatRef) + '.test(' + ($data) + ') ';\n }\n out += ') { ';\n }\n }\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('format') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { format: ';\n if ($isData) {\n out += '' + ($schemaValue);\n } else {\n out += '' + (it.util.toQuotedString($schema));\n }\n out += ' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should match format \"';\n if ($isData) {\n out += '\\' + ' + ($schemaValue) + ' + \\'';\n } else {\n out += '' + (it.util.escapeQuotes($schema));\n }\n out += '\"\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: ';\n if ($isData) {\n out += 'validate.schema' + ($schemaPath);\n } else {\n out += '' + (it.util.toQuotedString($schema));\n }\n out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += ' } ';\n if ($breakOnError) {\n out += ' else { ';\n }\n return out;\n}\n","'use strict';\nmodule.exports = function generate_if(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $data = 'data' + ($dataLvl || '');\n var $valid = 'valid' + $lvl;\n var $errs = 'errs__' + $lvl;\n var $it = it.util.copy(it);\n $it.level++;\n var $nextValid = 'valid' + $it.level;\n var $thenSch = it.schema['then'],\n $elseSch = it.schema['else'],\n $thenPresent = $thenSch !== undefined && (it.opts.strictKeywords ? typeof $thenSch == 'object' && Object.keys($thenSch).length > 0 : it.util.schemaHasRules($thenSch, it.RULES.all)),\n $elsePresent = $elseSch !== undefined && (it.opts.strictKeywords ? typeof $elseSch == 'object' && Object.keys($elseSch).length > 0 : it.util.schemaHasRules($elseSch, it.RULES.all)),\n $currentBaseId = $it.baseId;\n if ($thenPresent || $elsePresent) {\n var $ifClause;\n $it.createErrors = false;\n $it.schema = $schema;\n $it.schemaPath = $schemaPath;\n $it.errSchemaPath = $errSchemaPath;\n out += ' var ' + ($errs) + ' = errors; var ' + ($valid) + ' = true; ';\n var $wasComposite = it.compositeRule;\n it.compositeRule = $it.compositeRule = true;\n out += ' ' + (it.validate($it)) + ' ';\n $it.baseId = $currentBaseId;\n $it.createErrors = true;\n out += ' errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } ';\n it.compositeRule = $it.compositeRule = $wasComposite;\n if ($thenPresent) {\n out += ' if (' + ($nextValid) + ') { ';\n $it.schema = it.schema['then'];\n $it.schemaPath = it.schemaPath + '.then';\n $it.errSchemaPath = it.errSchemaPath + '/then';\n out += ' ' + (it.validate($it)) + ' ';\n $it.baseId = $currentBaseId;\n out += ' ' + ($valid) + ' = ' + ($nextValid) + '; ';\n if ($thenPresent && $elsePresent) {\n $ifClause = 'ifClause' + $lvl;\n out += ' var ' + ($ifClause) + ' = \\'then\\'; ';\n } else {\n $ifClause = '\\'then\\'';\n }\n out += ' } ';\n if ($elsePresent) {\n out += ' else { ';\n }\n } else {\n out += ' if (!' + ($nextValid) + ') { ';\n }\n if ($elsePresent) {\n $it.schema = it.schema['else'];\n $it.schemaPath = it.schemaPath + '.else';\n $it.errSchemaPath = it.errSchemaPath + '/else';\n out += ' ' + (it.validate($it)) + ' ';\n $it.baseId = $currentBaseId;\n out += ' ' + ($valid) + ' = ' + ($nextValid) + '; ';\n if ($thenPresent && $elsePresent) {\n $ifClause = 'ifClause' + $lvl;\n out += ' var ' + ($ifClause) + ' = \\'else\\'; ';\n } else {\n $ifClause = '\\'else\\'';\n }\n out += ' } ';\n }\n out += ' if (!' + ($valid) + ') { var err = '; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('if') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { failingKeyword: ' + ($ifClause) + ' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should match \"\\' + ' + ($ifClause) + ' + \\'\" schema\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError(vErrors); ';\n } else {\n out += ' validate.errors = vErrors; return false; ';\n }\n }\n out += ' } ';\n if ($breakOnError) {\n out += ' else { ';\n }\n out = it.util.cleanUpCode(out);\n } else {\n if ($breakOnError) {\n out += ' if (true) { ';\n }\n }\n return out;\n}\n","'use strict';\nmodule.exports = function generate_items(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $data = 'data' + ($dataLvl || '');\n var $valid = 'valid' + $lvl;\n var $errs = 'errs__' + $lvl;\n var $it = it.util.copy(it);\n var $closingBraces = '';\n $it.level++;\n var $nextValid = 'valid' + $it.level;\n var $idx = 'i' + $lvl,\n $dataNxt = $it.dataLevel = it.dataLevel + 1,\n $nextData = 'data' + $dataNxt,\n $currentBaseId = it.baseId;\n out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';';\n if (Array.isArray($schema)) {\n var $additionalItems = it.schema.additionalItems;\n if ($additionalItems === false) {\n out += ' ' + ($valid) + ' = ' + ($data) + '.length <= ' + ($schema.length) + '; ';\n var $currErrSchemaPath = $errSchemaPath;\n $errSchemaPath = it.errSchemaPath + '/additionalItems';\n out += ' if (!' + ($valid) + ') { ';\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('additionalItems') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schema.length) + ' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should NOT have more than ' + ($schema.length) + ' items\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += ' } ';\n $errSchemaPath = $currErrSchemaPath;\n if ($breakOnError) {\n $closingBraces += '}';\n out += ' else { ';\n }\n }\n var arr1 = $schema;\n if (arr1) {\n var $sch, $i = -1,\n l1 = arr1.length - 1;\n while ($i < l1) {\n $sch = arr1[$i += 1];\n if ((it.opts.strictKeywords ? typeof $sch == 'object' && Object.keys($sch).length > 0 : it.util.schemaHasRules($sch, it.RULES.all))) {\n out += ' ' + ($nextValid) + ' = true; if (' + ($data) + '.length > ' + ($i) + ') { ';\n var $passData = $data + '[' + $i + ']';\n $it.schema = $sch;\n $it.schemaPath = $schemaPath + '[' + $i + ']';\n $it.errSchemaPath = $errSchemaPath + '/' + $i;\n $it.errorPath = it.util.getPathExpr(it.errorPath, $i, it.opts.jsonPointers, true);\n $it.dataPathArr[$dataNxt] = $i;\n var $code = it.validate($it);\n $it.baseId = $currentBaseId;\n if (it.util.varOccurences($code, $nextData) < 2) {\n out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';\n } else {\n out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';\n }\n out += ' } ';\n if ($breakOnError) {\n out += ' if (' + ($nextValid) + ') { ';\n $closingBraces += '}';\n }\n }\n }\n }\n if (typeof $additionalItems == 'object' && (it.opts.strictKeywords ? typeof $additionalItems == 'object' && Object.keys($additionalItems).length > 0 : it.util.schemaHasRules($additionalItems, it.RULES.all))) {\n $it.schema = $additionalItems;\n $it.schemaPath = it.schemaPath + '.additionalItems';\n $it.errSchemaPath = it.errSchemaPath + '/additionalItems';\n out += ' ' + ($nextValid) + ' = true; if (' + ($data) + '.length > ' + ($schema.length) + ') { for (var ' + ($idx) + ' = ' + ($schema.length) + '; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { ';\n $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true);\n var $passData = $data + '[' + $idx + ']';\n $it.dataPathArr[$dataNxt] = $idx;\n var $code = it.validate($it);\n $it.baseId = $currentBaseId;\n if (it.util.varOccurences($code, $nextData) < 2) {\n out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';\n } else {\n out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';\n }\n if ($breakOnError) {\n out += ' if (!' + ($nextValid) + ') break; ';\n }\n out += ' } } ';\n if ($breakOnError) {\n out += ' if (' + ($nextValid) + ') { ';\n $closingBraces += '}';\n }\n }\n } else if ((it.opts.strictKeywords ? typeof $schema == 'object' && Object.keys($schema).length > 0 : it.util.schemaHasRules($schema, it.RULES.all))) {\n $it.schema = $schema;\n $it.schemaPath = $schemaPath;\n $it.errSchemaPath = $errSchemaPath;\n out += ' for (var ' + ($idx) + ' = ' + (0) + '; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { ';\n $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true);\n var $passData = $data + '[' + $idx + ']';\n $it.dataPathArr[$dataNxt] = $idx;\n var $code = it.validate($it);\n $it.baseId = $currentBaseId;\n if (it.util.varOccurences($code, $nextData) < 2) {\n out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';\n } else {\n out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';\n }\n if ($breakOnError) {\n out += ' if (!' + ($nextValid) + ') break; ';\n }\n out += ' }';\n }\n if ($breakOnError) {\n out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {';\n }\n out = it.util.cleanUpCode(out);\n return out;\n}\n","'use strict';\nmodule.exports = function generate_multipleOf(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $data = 'data' + ($dataLvl || '');\n var $isData = it.opts.$data && $schema && $schema.$data,\n $schemaValue;\n if ($isData) {\n out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';\n $schemaValue = 'schema' + $lvl;\n } else {\n $schemaValue = $schema;\n }\n out += 'var division' + ($lvl) + ';if (';\n if ($isData) {\n out += ' ' + ($schemaValue) + ' !== undefined && ( typeof ' + ($schemaValue) + ' != \\'number\\' || ';\n }\n out += ' (division' + ($lvl) + ' = ' + ($data) + ' / ' + ($schemaValue) + ', ';\n if (it.opts.multipleOfPrecision) {\n out += ' Math.abs(Math.round(division' + ($lvl) + ') - division' + ($lvl) + ') > 1e-' + (it.opts.multipleOfPrecision) + ' ';\n } else {\n out += ' division' + ($lvl) + ' !== parseInt(division' + ($lvl) + ') ';\n }\n out += ' ) ';\n if ($isData) {\n out += ' ) ';\n }\n out += ' ) { ';\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('multipleOf') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { multipleOf: ' + ($schemaValue) + ' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should be multiple of ';\n if ($isData) {\n out += '\\' + ' + ($schemaValue);\n } else {\n out += '' + ($schemaValue) + '\\'';\n }\n }\n if (it.opts.verbose) {\n out += ' , schema: ';\n if ($isData) {\n out += 'validate.schema' + ($schemaPath);\n } else {\n out += '' + ($schema);\n }\n out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += '} ';\n if ($breakOnError) {\n out += ' else { ';\n }\n return out;\n}\n","'use strict';\nmodule.exports = function generate_not(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $data = 'data' + ($dataLvl || '');\n var $errs = 'errs__' + $lvl;\n var $it = it.util.copy(it);\n $it.level++;\n var $nextValid = 'valid' + $it.level;\n if ((it.opts.strictKeywords ? typeof $schema == 'object' && Object.keys($schema).length > 0 : it.util.schemaHasRules($schema, it.RULES.all))) {\n $it.schema = $schema;\n $it.schemaPath = $schemaPath;\n $it.errSchemaPath = $errSchemaPath;\n out += ' var ' + ($errs) + ' = errors; ';\n var $wasComposite = it.compositeRule;\n it.compositeRule = $it.compositeRule = true;\n $it.createErrors = false;\n var $allErrorsOption;\n if ($it.opts.allErrors) {\n $allErrorsOption = $it.opts.allErrors;\n $it.opts.allErrors = false;\n }\n out += ' ' + (it.validate($it)) + ' ';\n $it.createErrors = true;\n if ($allErrorsOption) $it.opts.allErrors = $allErrorsOption;\n it.compositeRule = $it.compositeRule = $wasComposite;\n out += ' if (' + ($nextValid) + ') { ';\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('not') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should NOT be valid\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += ' } else { errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } ';\n if (it.opts.allErrors) {\n out += ' } ';\n }\n } else {\n out += ' var err = '; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('not') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should NOT be valid\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n if ($breakOnError) {\n out += ' if (false) { ';\n }\n }\n return out;\n}\n","'use strict';\nmodule.exports = function generate_oneOf(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $data = 'data' + ($dataLvl || '');\n var $valid = 'valid' + $lvl;\n var $errs = 'errs__' + $lvl;\n var $it = it.util.copy(it);\n var $closingBraces = '';\n $it.level++;\n var $nextValid = 'valid' + $it.level;\n var $currentBaseId = $it.baseId,\n $prevValid = 'prevValid' + $lvl,\n $passingSchemas = 'passingSchemas' + $lvl;\n out += 'var ' + ($errs) + ' = errors , ' + ($prevValid) + ' = false , ' + ($valid) + ' = false , ' + ($passingSchemas) + ' = null; ';\n var $wasComposite = it.compositeRule;\n it.compositeRule = $it.compositeRule = true;\n var arr1 = $schema;\n if (arr1) {\n var $sch, $i = -1,\n l1 = arr1.length - 1;\n while ($i < l1) {\n $sch = arr1[$i += 1];\n if ((it.opts.strictKeywords ? typeof $sch == 'object' && Object.keys($sch).length > 0 : it.util.schemaHasRules($sch, it.RULES.all))) {\n $it.schema = $sch;\n $it.schemaPath = $schemaPath + '[' + $i + ']';\n $it.errSchemaPath = $errSchemaPath + '/' + $i;\n out += ' ' + (it.validate($it)) + ' ';\n $it.baseId = $currentBaseId;\n } else {\n out += ' var ' + ($nextValid) + ' = true; ';\n }\n if ($i) {\n out += ' if (' + ($nextValid) + ' && ' + ($prevValid) + ') { ' + ($valid) + ' = false; ' + ($passingSchemas) + ' = [' + ($passingSchemas) + ', ' + ($i) + ']; } else { ';\n $closingBraces += '}';\n }\n out += ' if (' + ($nextValid) + ') { ' + ($valid) + ' = ' + ($prevValid) + ' = true; ' + ($passingSchemas) + ' = ' + ($i) + '; }';\n }\n }\n it.compositeRule = $it.compositeRule = $wasComposite;\n out += '' + ($closingBraces) + 'if (!' + ($valid) + ') { var err = '; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('oneOf') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { passingSchemas: ' + ($passingSchemas) + ' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should match exactly one schema in oneOf\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError(vErrors); ';\n } else {\n out += ' validate.errors = vErrors; return false; ';\n }\n }\n out += '} else { errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; }';\n if (it.opts.allErrors) {\n out += ' } ';\n }\n return out;\n}\n","'use strict';\nmodule.exports = function generate_pattern(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $data = 'data' + ($dataLvl || '');\n var $isData = it.opts.$data && $schema && $schema.$data,\n $schemaValue;\n if ($isData) {\n out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';\n $schemaValue = 'schema' + $lvl;\n } else {\n $schemaValue = $schema;\n }\n var $regexp = $isData ? '(new RegExp(' + $schemaValue + '))' : it.usePattern($schema);\n out += 'if ( ';\n if ($isData) {\n out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \\'string\\') || ';\n }\n out += ' !' + ($regexp) + '.test(' + ($data) + ') ) { ';\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('pattern') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { pattern: ';\n if ($isData) {\n out += '' + ($schemaValue);\n } else {\n out += '' + (it.util.toQuotedString($schema));\n }\n out += ' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should match pattern \"';\n if ($isData) {\n out += '\\' + ' + ($schemaValue) + ' + \\'';\n } else {\n out += '' + (it.util.escapeQuotes($schema));\n }\n out += '\"\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: ';\n if ($isData) {\n out += 'validate.schema' + ($schemaPath);\n } else {\n out += '' + (it.util.toQuotedString($schema));\n }\n out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += '} ';\n if ($breakOnError) {\n out += ' else { ';\n }\n return out;\n}\n","'use strict';\nmodule.exports = function generate_properties(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $data = 'data' + ($dataLvl || '');\n var $errs = 'errs__' + $lvl;\n var $it = it.util.copy(it);\n var $closingBraces = '';\n $it.level++;\n var $nextValid = 'valid' + $it.level;\n var $key = 'key' + $lvl,\n $idx = 'idx' + $lvl,\n $dataNxt = $it.dataLevel = it.dataLevel + 1,\n $nextData = 'data' + $dataNxt,\n $dataProperties = 'dataProperties' + $lvl;\n var $schemaKeys = Object.keys($schema || {}),\n $pProperties = it.schema.patternProperties || {},\n $pPropertyKeys = Object.keys($pProperties),\n $aProperties = it.schema.additionalProperties,\n $someProperties = $schemaKeys.length || $pPropertyKeys.length,\n $noAdditional = $aProperties === false,\n $additionalIsSchema = typeof $aProperties == 'object' && Object.keys($aProperties).length,\n $removeAdditional = it.opts.removeAdditional,\n $checkAdditional = $noAdditional || $additionalIsSchema || $removeAdditional,\n $ownProperties = it.opts.ownProperties,\n $currentBaseId = it.baseId;\n var $required = it.schema.required;\n if ($required && !(it.opts.$data && $required.$data) && $required.length < it.opts.loopRequired) var $requiredHash = it.util.toHash($required);\n out += 'var ' + ($errs) + ' = errors;var ' + ($nextValid) + ' = true;';\n if ($ownProperties) {\n out += ' var ' + ($dataProperties) + ' = undefined;';\n }\n if ($checkAdditional) {\n if ($ownProperties) {\n out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; ';\n } else {\n out += ' for (var ' + ($key) + ' in ' + ($data) + ') { ';\n }\n if ($someProperties) {\n out += ' var isAdditional' + ($lvl) + ' = !(false ';\n if ($schemaKeys.length) {\n if ($schemaKeys.length > 8) {\n out += ' || validate.schema' + ($schemaPath) + '.hasOwnProperty(' + ($key) + ') ';\n } else {\n var arr1 = $schemaKeys;\n if (arr1) {\n var $propertyKey, i1 = -1,\n l1 = arr1.length - 1;\n while (i1 < l1) {\n $propertyKey = arr1[i1 += 1];\n out += ' || ' + ($key) + ' == ' + (it.util.toQuotedString($propertyKey)) + ' ';\n }\n }\n }\n }\n if ($pPropertyKeys.length) {\n var arr2 = $pPropertyKeys;\n if (arr2) {\n var $pProperty, $i = -1,\n l2 = arr2.length - 1;\n while ($i < l2) {\n $pProperty = arr2[$i += 1];\n out += ' || ' + (it.usePattern($pProperty)) + '.test(' + ($key) + ') ';\n }\n }\n }\n out += ' ); if (isAdditional' + ($lvl) + ') { ';\n }\n if ($removeAdditional == 'all') {\n out += ' delete ' + ($data) + '[' + ($key) + ']; ';\n } else {\n var $currentErrorPath = it.errorPath;\n var $additionalProperty = '\\' + ' + $key + ' + \\'';\n if (it.opts._errorDataPathProperty) {\n it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers);\n }\n if ($noAdditional) {\n if ($removeAdditional) {\n out += ' delete ' + ($data) + '[' + ($key) + ']; ';\n } else {\n out += ' ' + ($nextValid) + ' = false; ';\n var $currErrSchemaPath = $errSchemaPath;\n $errSchemaPath = it.errSchemaPath + '/additionalProperties';\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('additionalProperties') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { additionalProperty: \\'' + ($additionalProperty) + '\\' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'';\n if (it.opts._errorDataPathProperty) {\n out += 'is an invalid additional property';\n } else {\n out += 'should NOT have additional properties';\n }\n out += '\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n $errSchemaPath = $currErrSchemaPath;\n if ($breakOnError) {\n out += ' break; ';\n }\n }\n } else if ($additionalIsSchema) {\n if ($removeAdditional == 'failing') {\n out += ' var ' + ($errs) + ' = errors; ';\n var $wasComposite = it.compositeRule;\n it.compositeRule = $it.compositeRule = true;\n $it.schema = $aProperties;\n $it.schemaPath = it.schemaPath + '.additionalProperties';\n $it.errSchemaPath = it.errSchemaPath + '/additionalProperties';\n $it.errorPath = it.opts._errorDataPathProperty ? it.errorPath : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers);\n var $passData = $data + '[' + $key + ']';\n $it.dataPathArr[$dataNxt] = $key;\n var $code = it.validate($it);\n $it.baseId = $currentBaseId;\n if (it.util.varOccurences($code, $nextData) < 2) {\n out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';\n } else {\n out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';\n }\n out += ' if (!' + ($nextValid) + ') { errors = ' + ($errs) + '; if (validate.errors !== null) { if (errors) validate.errors.length = errors; else validate.errors = null; } delete ' + ($data) + '[' + ($key) + ']; } ';\n it.compositeRule = $it.compositeRule = $wasComposite;\n } else {\n $it.schema = $aProperties;\n $it.schemaPath = it.schemaPath + '.additionalProperties';\n $it.errSchemaPath = it.errSchemaPath + '/additionalProperties';\n $it.errorPath = it.opts._errorDataPathProperty ? it.errorPath : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers);\n var $passData = $data + '[' + $key + ']';\n $it.dataPathArr[$dataNxt] = $key;\n var $code = it.validate($it);\n $it.baseId = $currentBaseId;\n if (it.util.varOccurences($code, $nextData) < 2) {\n out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';\n } else {\n out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';\n }\n if ($breakOnError) {\n out += ' if (!' + ($nextValid) + ') break; ';\n }\n }\n }\n it.errorPath = $currentErrorPath;\n }\n if ($someProperties) {\n out += ' } ';\n }\n out += ' } ';\n if ($breakOnError) {\n out += ' if (' + ($nextValid) + ') { ';\n $closingBraces += '}';\n }\n }\n var $useDefaults = it.opts.useDefaults && !it.compositeRule;\n if ($schemaKeys.length) {\n var arr3 = $schemaKeys;\n if (arr3) {\n var $propertyKey, i3 = -1,\n l3 = arr3.length - 1;\n while (i3 < l3) {\n $propertyKey = arr3[i3 += 1];\n var $sch = $schema[$propertyKey];\n if ((it.opts.strictKeywords ? typeof $sch == 'object' && Object.keys($sch).length > 0 : it.util.schemaHasRules($sch, it.RULES.all))) {\n var $prop = it.util.getProperty($propertyKey),\n $passData = $data + $prop,\n $hasDefault = $useDefaults && $sch.default !== undefined;\n $it.schema = $sch;\n $it.schemaPath = $schemaPath + $prop;\n $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($propertyKey);\n $it.errorPath = it.util.getPath(it.errorPath, $propertyKey, it.opts.jsonPointers);\n $it.dataPathArr[$dataNxt] = it.util.toQuotedString($propertyKey);\n var $code = it.validate($it);\n $it.baseId = $currentBaseId;\n if (it.util.varOccurences($code, $nextData) < 2) {\n $code = it.util.varReplace($code, $nextData, $passData);\n var $useData = $passData;\n } else {\n var $useData = $nextData;\n out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ';\n }\n if ($hasDefault) {\n out += ' ' + ($code) + ' ';\n } else {\n if ($requiredHash && $requiredHash[$propertyKey]) {\n out += ' if ( ' + ($useData) + ' === undefined ';\n if ($ownProperties) {\n out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \\'' + (it.util.escapeQuotes($propertyKey)) + '\\') ';\n }\n out += ') { ' + ($nextValid) + ' = false; ';\n var $currentErrorPath = it.errorPath,\n $currErrSchemaPath = $errSchemaPath,\n $missingProperty = it.util.escapeQuotes($propertyKey);\n if (it.opts._errorDataPathProperty) {\n it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers);\n }\n $errSchemaPath = it.errSchemaPath + '/required';\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('required') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \\'' + ($missingProperty) + '\\' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'';\n if (it.opts._errorDataPathProperty) {\n out += 'is a required property';\n } else {\n out += 'should have required property \\\\\\'' + ($missingProperty) + '\\\\\\'';\n }\n out += '\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n $errSchemaPath = $currErrSchemaPath;\n it.errorPath = $currentErrorPath;\n out += ' } else { ';\n } else {\n if ($breakOnError) {\n out += ' if ( ' + ($useData) + ' === undefined ';\n if ($ownProperties) {\n out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \\'' + (it.util.escapeQuotes($propertyKey)) + '\\') ';\n }\n out += ') { ' + ($nextValid) + ' = true; } else { ';\n } else {\n out += ' if (' + ($useData) + ' !== undefined ';\n if ($ownProperties) {\n out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', \\'' + (it.util.escapeQuotes($propertyKey)) + '\\') ';\n }\n out += ' ) { ';\n }\n }\n out += ' ' + ($code) + ' } ';\n }\n }\n if ($breakOnError) {\n out += ' if (' + ($nextValid) + ') { ';\n $closingBraces += '}';\n }\n }\n }\n }\n if ($pPropertyKeys.length) {\n var arr4 = $pPropertyKeys;\n if (arr4) {\n var $pProperty, i4 = -1,\n l4 = arr4.length - 1;\n while (i4 < l4) {\n $pProperty = arr4[i4 += 1];\n var $sch = $pProperties[$pProperty];\n if ((it.opts.strictKeywords ? typeof $sch == 'object' && Object.keys($sch).length > 0 : it.util.schemaHasRules($sch, it.RULES.all))) {\n $it.schema = $sch;\n $it.schemaPath = it.schemaPath + '.patternProperties' + it.util.getProperty($pProperty);\n $it.errSchemaPath = it.errSchemaPath + '/patternProperties/' + it.util.escapeFragment($pProperty);\n if ($ownProperties) {\n out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; ';\n } else {\n out += ' for (var ' + ($key) + ' in ' + ($data) + ') { ';\n }\n out += ' if (' + (it.usePattern($pProperty)) + '.test(' + ($key) + ')) { ';\n $it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers);\n var $passData = $data + '[' + $key + ']';\n $it.dataPathArr[$dataNxt] = $key;\n var $code = it.validate($it);\n $it.baseId = $currentBaseId;\n if (it.util.varOccurences($code, $nextData) < 2) {\n out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';\n } else {\n out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';\n }\n if ($breakOnError) {\n out += ' if (!' + ($nextValid) + ') break; ';\n }\n out += ' } ';\n if ($breakOnError) {\n out += ' else ' + ($nextValid) + ' = true; ';\n }\n out += ' } ';\n if ($breakOnError) {\n out += ' if (' + ($nextValid) + ') { ';\n $closingBraces += '}';\n }\n }\n }\n }\n }\n if ($breakOnError) {\n out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {';\n }\n out = it.util.cleanUpCode(out);\n return out;\n}\n","'use strict';\nmodule.exports = function generate_propertyNames(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $data = 'data' + ($dataLvl || '');\n var $errs = 'errs__' + $lvl;\n var $it = it.util.copy(it);\n var $closingBraces = '';\n $it.level++;\n var $nextValid = 'valid' + $it.level;\n out += 'var ' + ($errs) + ' = errors;';\n if ((it.opts.strictKeywords ? typeof $schema == 'object' && Object.keys($schema).length > 0 : it.util.schemaHasRules($schema, it.RULES.all))) {\n $it.schema = $schema;\n $it.schemaPath = $schemaPath;\n $it.errSchemaPath = $errSchemaPath;\n var $key = 'key' + $lvl,\n $idx = 'idx' + $lvl,\n $i = 'i' + $lvl,\n $invalidName = '\\' + ' + $key + ' + \\'',\n $dataNxt = $it.dataLevel = it.dataLevel + 1,\n $nextData = 'data' + $dataNxt,\n $dataProperties = 'dataProperties' + $lvl,\n $ownProperties = it.opts.ownProperties,\n $currentBaseId = it.baseId;\n if ($ownProperties) {\n out += ' var ' + ($dataProperties) + ' = undefined; ';\n }\n if ($ownProperties) {\n out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; ';\n } else {\n out += ' for (var ' + ($key) + ' in ' + ($data) + ') { ';\n }\n out += ' var startErrs' + ($lvl) + ' = errors; ';\n var $passData = $key;\n var $wasComposite = it.compositeRule;\n it.compositeRule = $it.compositeRule = true;\n var $code = it.validate($it);\n $it.baseId = $currentBaseId;\n if (it.util.varOccurences($code, $nextData) < 2) {\n out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';\n } else {\n out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';\n }\n it.compositeRule = $it.compositeRule = $wasComposite;\n out += ' if (!' + ($nextValid) + ') { for (var ' + ($i) + '=startErrs' + ($lvl) + '; ' + ($i) + ' 0 : it.util.schemaHasRules($propertySch, it.RULES.all)))) {\n $required[$required.length] = $property;\n }\n }\n }\n } else {\n var $required = $schema;\n }\n }\n if ($isData || $required.length) {\n var $currentErrorPath = it.errorPath,\n $loopRequired = $isData || $required.length >= it.opts.loopRequired,\n $ownProperties = it.opts.ownProperties;\n if ($breakOnError) {\n out += ' var missing' + ($lvl) + '; ';\n if ($loopRequired) {\n if (!$isData) {\n out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + '; ';\n }\n var $i = 'i' + $lvl,\n $propertyPath = 'schema' + $lvl + '[' + $i + ']',\n $missingProperty = '\\' + ' + $propertyPath + ' + \\'';\n if (it.opts._errorDataPathProperty) {\n it.errorPath = it.util.getPathExpr($currentErrorPath, $propertyPath, it.opts.jsonPointers);\n }\n out += ' var ' + ($valid) + ' = true; ';\n if ($isData) {\n out += ' if (schema' + ($lvl) + ' === undefined) ' + ($valid) + ' = true; else if (!Array.isArray(schema' + ($lvl) + ')) ' + ($valid) + ' = false; else {';\n }\n out += ' for (var ' + ($i) + ' = 0; ' + ($i) + ' < ' + ($vSchema) + '.length; ' + ($i) + '++) { ' + ($valid) + ' = ' + ($data) + '[' + ($vSchema) + '[' + ($i) + ']] !== undefined ';\n if ($ownProperties) {\n out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + ']) ';\n }\n out += '; if (!' + ($valid) + ') break; } ';\n if ($isData) {\n out += ' } ';\n }\n out += ' if (!' + ($valid) + ') { ';\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('required') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \\'' + ($missingProperty) + '\\' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'';\n if (it.opts._errorDataPathProperty) {\n out += 'is a required property';\n } else {\n out += 'should have required property \\\\\\'' + ($missingProperty) + '\\\\\\'';\n }\n out += '\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += ' } else { ';\n } else {\n out += ' if ( ';\n var arr2 = $required;\n if (arr2) {\n var $propertyKey, $i = -1,\n l2 = arr2.length - 1;\n while ($i < l2) {\n $propertyKey = arr2[$i += 1];\n if ($i) {\n out += ' || ';\n }\n var $prop = it.util.getProperty($propertyKey),\n $useData = $data + $prop;\n out += ' ( ( ' + ($useData) + ' === undefined ';\n if ($ownProperties) {\n out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \\'' + (it.util.escapeQuotes($propertyKey)) + '\\') ';\n }\n out += ') && (missing' + ($lvl) + ' = ' + (it.util.toQuotedString(it.opts.jsonPointers ? $propertyKey : $prop)) + ') ) ';\n }\n }\n out += ') { ';\n var $propertyPath = 'missing' + $lvl,\n $missingProperty = '\\' + ' + $propertyPath + ' + \\'';\n if (it.opts._errorDataPathProperty) {\n it.errorPath = it.opts.jsonPointers ? it.util.getPathExpr($currentErrorPath, $propertyPath, true) : $currentErrorPath + ' + ' + $propertyPath;\n }\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('required') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \\'' + ($missingProperty) + '\\' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'';\n if (it.opts._errorDataPathProperty) {\n out += 'is a required property';\n } else {\n out += 'should have required property \\\\\\'' + ($missingProperty) + '\\\\\\'';\n }\n out += '\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += ' } else { ';\n }\n } else {\n if ($loopRequired) {\n if (!$isData) {\n out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + '; ';\n }\n var $i = 'i' + $lvl,\n $propertyPath = 'schema' + $lvl + '[' + $i + ']',\n $missingProperty = '\\' + ' + $propertyPath + ' + \\'';\n if (it.opts._errorDataPathProperty) {\n it.errorPath = it.util.getPathExpr($currentErrorPath, $propertyPath, it.opts.jsonPointers);\n }\n if ($isData) {\n out += ' if (' + ($vSchema) + ' && !Array.isArray(' + ($vSchema) + ')) { var err = '; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('required') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \\'' + ($missingProperty) + '\\' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'';\n if (it.opts._errorDataPathProperty) {\n out += 'is a required property';\n } else {\n out += 'should have required property \\\\\\'' + ($missingProperty) + '\\\\\\'';\n }\n out += '\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else if (' + ($vSchema) + ' !== undefined) { ';\n }\n out += ' for (var ' + ($i) + ' = 0; ' + ($i) + ' < ' + ($vSchema) + '.length; ' + ($i) + '++) { if (' + ($data) + '[' + ($vSchema) + '[' + ($i) + ']] === undefined ';\n if ($ownProperties) {\n out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + ']) ';\n }\n out += ') { var err = '; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('required') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \\'' + ($missingProperty) + '\\' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'';\n if (it.opts._errorDataPathProperty) {\n out += 'is a required property';\n } else {\n out += 'should have required property \\\\\\'' + ($missingProperty) + '\\\\\\'';\n }\n out += '\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } ';\n if ($isData) {\n out += ' } ';\n }\n } else {\n var arr3 = $required;\n if (arr3) {\n var $propertyKey, i3 = -1,\n l3 = arr3.length - 1;\n while (i3 < l3) {\n $propertyKey = arr3[i3 += 1];\n var $prop = it.util.getProperty($propertyKey),\n $missingProperty = it.util.escapeQuotes($propertyKey),\n $useData = $data + $prop;\n if (it.opts._errorDataPathProperty) {\n it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers);\n }\n out += ' if ( ' + ($useData) + ' === undefined ';\n if ($ownProperties) {\n out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \\'' + (it.util.escapeQuotes($propertyKey)) + '\\') ';\n }\n out += ') { var err = '; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('required') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \\'' + ($missingProperty) + '\\' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'';\n if (it.opts._errorDataPathProperty) {\n out += 'is a required property';\n } else {\n out += 'should have required property \\\\\\'' + ($missingProperty) + '\\\\\\'';\n }\n out += '\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } ';\n }\n }\n }\n }\n it.errorPath = $currentErrorPath;\n } else if ($breakOnError) {\n out += ' if (true) {';\n }\n return out;\n}\n","'use strict';\nmodule.exports = function generate_uniqueItems(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $data = 'data' + ($dataLvl || '');\n var $valid = 'valid' + $lvl;\n var $isData = it.opts.$data && $schema && $schema.$data,\n $schemaValue;\n if ($isData) {\n out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';\n $schemaValue = 'schema' + $lvl;\n } else {\n $schemaValue = $schema;\n }\n if (($schema || $isData) && it.opts.uniqueItems !== false) {\n if ($isData) {\n out += ' var ' + ($valid) + '; if (' + ($schemaValue) + ' === false || ' + ($schemaValue) + ' === undefined) ' + ($valid) + ' = true; else if (typeof ' + ($schemaValue) + ' != \\'boolean\\') ' + ($valid) + ' = false; else { ';\n }\n out += ' var i = ' + ($data) + '.length , ' + ($valid) + ' = true , j; if (i > 1) { ';\n var $itemType = it.schema.items && it.schema.items.type,\n $typeIsArray = Array.isArray($itemType);\n if (!$itemType || $itemType == 'object' || $itemType == 'array' || ($typeIsArray && ($itemType.indexOf('object') >= 0 || $itemType.indexOf('array') >= 0))) {\n out += ' outer: for (;i--;) { for (j = i; j--;) { if (equal(' + ($data) + '[i], ' + ($data) + '[j])) { ' + ($valid) + ' = false; break outer; } } } ';\n } else {\n out += ' var itemIndices = {}, item; for (;i--;) { var item = ' + ($data) + '[i]; ';\n var $method = 'checkDataType' + ($typeIsArray ? 's' : '');\n out += ' if (' + (it.util[$method]($itemType, 'item', true)) + ') continue; ';\n if ($typeIsArray) {\n out += ' if (typeof item == \\'string\\') item = \\'\"\\' + item; ';\n }\n out += ' if (typeof itemIndices[item] == \\'number\\') { ' + ($valid) + ' = false; j = itemIndices[item]; break; } itemIndices[item] = i; } ';\n }\n out += ' } ';\n if ($isData) {\n out += ' } ';\n }\n out += ' if (!' + ($valid) + ') { ';\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('uniqueItems') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { i: i, j: j } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should NOT have duplicate items (items ## \\' + j + \\' and \\' + i + \\' are identical)\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: ';\n if ($isData) {\n out += 'validate.schema' + ($schemaPath);\n } else {\n out += '' + ($schema);\n }\n out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += ' } ';\n if ($breakOnError) {\n out += ' else { ';\n }\n } else {\n if ($breakOnError) {\n out += ' if (true) { ';\n }\n }\n return out;\n}\n","'use strict';\n\nvar KEYWORDS = [\n 'multipleOf',\n 'maximum',\n 'exclusiveMaximum',\n 'minimum',\n 'exclusiveMinimum',\n 'maxLength',\n 'minLength',\n 'pattern',\n 'additionalItems',\n 'maxItems',\n 'minItems',\n 'uniqueItems',\n 'maxProperties',\n 'minProperties',\n 'required',\n 'additionalProperties',\n 'enum',\n 'format',\n 'const'\n];\n\nmodule.exports = function (metaSchema, keywordsJsonPointers) {\n for (var i=0; i {\n this.modules[moduleType] = [];\n });\n }\n\n /**\n * An array of extensions, or an array of arrays that contains extension\n * configuration pairs.\n *\n * @param {Object[]} extensions - Array of extensions\n */\n registerExtensions(extensions) {\n extensions.forEach((extension) => {\n const hasConfiguration = Array.isArray(extension);\n\n if (hasConfiguration) {\n const [ohifExtension, configuration] = extension;\n this.registerExtension(ohifExtension, configuration);\n } else {\n this.registerExtension(extension);\n }\n });\n }\n\n /**\n *\n * TODO: Id Management: SopClassHandlers currently refer to viewport module by id; setting the extension id as viewport module id is a workaround for now\n * @param {Object} extension\n * @param {Object} configuration\n */\n registerExtension(extension, configuration = {}) {\n if (!extension) {\n log.warn(\n 'Attempting to register a null/undefined extension. Exiting early.'\n );\n return;\n }\n\n let extensionId = extension.id;\n\n if (!extensionId) {\n extensionId = Math.random()\n .toString(36)\n .substr(2, 5);\n\n log.warn(`Extension ID not set. Using random string ID: ${extensionId}`);\n }\n\n if (this.registeredExtensionIds.includes(extensionId)) {\n log.warn(\n `Extension ID ${extensionId} has already been registered. Exiting before duplicating modules.`\n );\n return;\n }\n\n // preRegistrationHook\n if (extension.preRegistration) {\n extension.preRegistration({\n servicesManager: this._servicesManager,\n commandsManager: this._commandsManager,\n appConfig: this._appConfig,\n configuration\n });\n }\n\n // Register Modules\n this.moduleTypeNames.forEach((moduleType) => {\n const extensionModule = this._getExtensionModule(\n moduleType,\n extension,\n extensionId,\n configuration\n );\n if (extensionModule) {\n this._initSpecialModuleTypes(moduleType, extensionModule);\n\n this.modules[moduleType].push({\n extensionId,\n module: extensionModule\n });\n }\n });\n\n // Track extension registration\n this.registeredExtensionIds.push(extensionId);\n }\n\n /**\n * @private\n * @param {string} moduleType\n * @param {Object} extension\n * @param {string} extensionId - Used for logging warnings\n */\n _getExtensionModule(moduleType, extension, extensionId, configuration) {\n const getModuleFnName = `get${_capitalizeFirstCharacter(moduleType)}`;\n const getModuleFn = extension[getModuleFnName];\n\n if (!getModuleFn) {\n return;\n }\n\n try {\n const extensionModule = getModuleFn({\n servicesManager: this._servicesManager,\n commandsManager: this._commandsManager,\n appConfig: this._appConfig,\n configuration\n });\n\n if (!extensionModule) {\n log.warn(\n `Null or undefined returned when registering the ${getModuleFnName} module for the ${extensionId} extension`\n );\n }\n\n return extensionModule;\n } catch (ex) {\n log.error(\n `Exception thrown while trying to call ${getModuleFnName} for the ${extensionId} extension`\n );\n }\n }\n\n _initSpecialModuleTypes(moduleType, extensionModule) {\n switch (moduleType) {\n case 'commandsModule': {\n const {definitions, defaultContext} = extensionModule;\n if (!definitions || Object.keys(definitions).length === 0) {\n log.warn('Commands Module contains no command definitions');\n return;\n }\n this._initCommandsModule(definitions, defaultContext);\n break;\n }\n default:\n // code block\n }\n }\n\n /**\n *\n * @private\n * @param {Object[]} commandDefinitions\n */\n _initCommandsModule(commandDefinitions, defaultContext = 'VIEWER') {\n if (!this._commandsManager.getContext(defaultContext)) {\n this._commandsManager.createContext(defaultContext);\n }\n\n Object.keys(commandDefinitions).forEach((commandName) => {\n const commandDefinition = commandDefinitions[commandName];\n const commandHasContextThatDoesNotExist =\n commandDefinition.context &&\n !this._commandsManager.getContext(commandDefinition.context);\n\n if (commandHasContextThatDoesNotExist) {\n this._commandsManager.createContext(commandDefinition.context);\n }\n\n this._commandsManager.registerCommand(\n commandDefinition.context || defaultContext,\n commandName,\n commandDefinition\n );\n });\n }\n}\n\n/**\n * @private\n * @param {string} lower\n */\nfunction _capitalizeFirstCharacter(lower) {\n return lower.charAt(0).toUpperCase() + lower.substr(1);\n}\n","import log from '../log';\n\nexport default class ServicesManager {\n constructor() {\n this.services = {};\n this.registeredServiceNames = [];\n }\n\n /**\n * Registers a new service.\n *\n * @param {Object} service\n * @param {Object} configuration\n */\n registerService(service, configuration = {}) {\n if (!service) {\n log.warn(\n 'Attempting to register a null/undefined service. Exiting early.'\n );\n return;\n }\n\n if (!service.name) {\n log.warn('Service name not set. Exiting early.');\n return;\n }\n\n if (this.registeredServiceNames.includes(service.name)) {\n log.warn(\n `Service name ${service.name} has already been registered. Exiting before duplicating services.`\n );\n return;\n }\n\n if (service.create) {\n this.services[service.name] = service.create({\n configuration\n });\n } else {\n log.warn('Service create factory function not defined. Exiting early.');\n return;\n }\n\n /* Track service registration */\n this.registeredServiceNames.push(service.name);\n }\n\n /**\n * An array of services, or an array of arrays that contains service\n * configuration pairs.\n *\n * @param {Object[]} services - Array of services\n */\n registerServices(services) {\n services.forEach((service) => {\n const hasConfiguration = Array.isArray(service);\n\n if (hasConfiguration) {\n const [ohifService, configuration] = service;\n this.registerService(ohifService, configuration);\n } else {\n this.registerService(service);\n }\n });\n }\n}\n","/**\n * A UI Notification\n *\n * @typedef {Object} Notification\n * @property {string} title -\n * @property {string} message -\n * @property {number} [duration=5000] - in ms\n * @property {string} [position=\"bottomRight\"] -\"topLeft\" | \"topCenter | \"topRight\" | \"bottomLeft\" | \"bottomCenter\" | \"bottomRight\"\n * @property {string} [type=\"info\"] - \"info\" | \"error\" | \"warning\" | \"success\"\n * @property {boolean} [autoClose=true]\n */\n\nconst name = 'UINotificationService';\n\nconst serviceShowRequestQueue = [];\n\nconst publicAPI = {\n name,\n hide: _hide,\n show: _show,\n setServiceImplementation\n};\n\nconst serviceImplementation = {\n _hide: () => console.warn('hide() NOT IMPLEMENTED'),\n _show: (showArguments) => {\n serviceShowRequestQueue.push(showArguments);\n\n console.warn('show() NOT IMPLEMENTED');\n }\n};\n\n/**\n * Create and show a new UI notification; returns the\n * ID of the created notification.\n *\n * @param {Notification} notification { title, message, duration, position, type, autoClose}\n * @returns {number} id\n */\nfunction _show({\n title,\n message,\n duration = 5000,\n position = 'bottomRight',\n type = 'info',\n autoClose = true\n}) {\n return serviceImplementation._show({\n title,\n message,\n duration,\n position,\n type,\n autoClose\n });\n}\n\n/**\n * Hides/dismisses the notification, if currently shown\n *\n * @param {number} id - id of the notification to hide/dismiss\n * @returns undefined\n */\nfunction _hide(id) {\n return serviceImplementation._hide({id});\n}\n\n/**\n *\n *\n * @param {*} {\n * hide: hideImplementation,\n * show: showImplementation,\n * }\n */\nfunction setServiceImplementation({\n hide: hideImplementation,\n show: showImplementation\n}) {\n if (hideImplementation) {\n serviceImplementation._hide = hideImplementation;\n }\n if (showImplementation) {\n serviceImplementation._show = showImplementation;\n\n while (serviceShowRequestQueue.length > 0) {\n const showArguments = serviceShowRequestQueue.pop();\n serviceImplementation._show(showArguments);\n }\n }\n}\n\nexport default {\n name,\n create: ({configuration = {}}) => publicAPI\n};\n","/**\n * UI Modal\n *\n * @typedef {Object} ModalProps\n * @property {ReactElement|HTMLElement} [content=null] Modal content.\n * @property {Object} [contentProps=null] Modal content props.\n * @property {boolean} [shouldCloseOnEsc=false] Modal is dismissible via the esc key.\n * @property {boolean} [isOpen=true] Make the Modal visible or hidden.\n * @property {boolean} [closeButton=true] Should the modal body render the close button.\n * @property {string} [title=null] Should the modal render the title independently of the body content.\n * @property {string} [customClassName=null] The custom class to style the modal.\n */\n\nconst name = 'UIModalService';\n\nconst publicAPI = {\n name,\n hide: _hide,\n show: _show,\n setServiceImplementation\n};\n\nconst serviceImplementation = {\n _hide: () => console.warn('hide() NOT IMPLEMENTED'),\n _show: () => console.warn('show() NOT IMPLEMENTED')\n};\n\n/**\n * Show a new UI modal;\n *\n * @param {ModalProps} props { content, contentProps, shouldCloseOnEsc, isOpen, closeButton, title, customClassName }\n */\nfunction _show({\n content = null,\n contentProps = null,\n shouldCloseOnEsc = false,\n isOpen = true,\n closeButton = true,\n title = null,\n customClassName = null\n}) {\n return serviceImplementation._show({\n content,\n contentProps,\n shouldCloseOnEsc,\n isOpen,\n closeButton,\n title,\n customClassName\n });\n}\n\n/**\n * Hides/dismisses the modal, if currently shown\n *\n * @returns void\n */\nfunction _hide() {\n return serviceImplementation._hide();\n}\n\n/**\n *\n *\n * @param {*} {\n * hide: hideImplementation,\n * show: showImplementation,\n * }\n */\nfunction setServiceImplementation({\n hide: hideImplementation,\n show: showImplementation\n}) {\n if (hideImplementation) {\n serviceImplementation._hide = hideImplementation;\n }\n if (showImplementation) {\n serviceImplementation._show = showImplementation;\n }\n}\n\nexport default {\n name,\n create: ({configuration = {}}) => publicAPI\n};\n","/**\n * A UI Element Position\n *\n * @typedef {Object} ElementPosition\n * @property {number} top -\n * @property {number} left -\n * @property {number} right -\n * @property {number} bottom -\n */\n\n/**\n * UI Dialog\n *\n * @typedef {Object} DialogProps\n * @property {string} id The dialog id.\n * @property {ReactElement|HTMLElement} content The dialog content.\n * @property {Object} contentProps The dialog content props.\n * @property {boolean} [isDraggable=true] Controls if dialog content is draggable or not.\n * @property {boolean} [showOverlay=false] Controls dialog overlay.\n * @property {boolean} [centralize=false] Center the dialog on the screen.\n * @property {boolean} [preservePosition=true] Use last position instead of default.\n * @property {ElementPosition} defaultPosition Specifies the `x` and `y` that the dragged item should start at.\n * @property {Function} onStart Called when dragging starts. If `false` is returned any handler, the action will cancel.\n * @property {Function} onStop Called when dragging stops.\n * @property {Function} onDrag Called while dragging.\n */\n\nconst name = 'UIDialogService';\n\nconst publicAPI = {\n name,\n dismiss: _dismiss,\n dismissAll: _dismissAll,\n create: _create,\n setServiceImplementation\n};\n\nconst serviceImplementation = {\n _dismiss: () => console.warn('dismiss() NOT IMPLEMENTED'),\n _dismissAll: () => console.warn('dismissAll() NOT IMPLEMENTED'),\n _create: () => console.warn('create() NOT IMPLEMENTED')\n};\n\n/**\n * Show a new UI dialog;\n *\n * @param {DialogProps} props { id, content, contentProps, onStart, onDrag, onStop, centralize, isDraggable, showOverlay, preservePosition, defaultPosition }\n */\nfunction _create({\n id,\n content,\n contentProps,\n onStart,\n onDrag,\n onStop,\n centralize = false,\n preservePosition = true,\n isDraggable = true,\n showOverlay = false,\n defaultPosition\n}) {\n return serviceImplementation._create({\n id,\n content,\n contentProps,\n onStart,\n onDrag,\n onStop,\n centralize,\n preservePosition,\n isDraggable,\n showOverlay,\n defaultPosition\n });\n}\n\n/**\n * Destroys all dialogs, if any\n *\n * @returns void\n */\nfunction _dismissAll() {\n return serviceImplementation._dismissAll();\n}\n\n/**\n * Destroy the dialog, if currently created\n *\n * @returns void\n */\nfunction _dismiss({id}) {\n return serviceImplementation._dismiss({id});\n}\n\n/**\n *\n *\n * @param {*} {\n * dismiss: dismissImplementation,\n * dismissAll: dismissAllImplementation,\n * create: createImplementation,\n * }\n */\nfunction setServiceImplementation({\n dismiss: dismissImplementation,\n dismissAll: dismissAllImplementation,\n create: createImplementation\n}) {\n if (dismissImplementation) {\n serviceImplementation._dismiss = dismissImplementation;\n }\n if (dismissAllImplementation) {\n serviceImplementation._dismissAll = dismissAllImplementation;\n }\n if (createImplementation) {\n serviceImplementation._create = createImplementation;\n }\n}\n\nexport default {\n name,\n create: ({configuration = {}}) => publicAPI\n};\n","/**\r\n * Create a random GUID\r\n *\r\n * @return {string}\r\n */\r\nconst guid = () => {\r\n const getFourRandomValues = () => {\r\n return Math.floor((1 + Math.random()) * 0x10000)\r\n .toString(16)\r\n .substring(1);\r\n };\r\n return (\r\n getFourRandomValues() +\r\n getFourRandomValues() +\r\n '-' +\r\n getFourRandomValues() +\r\n '-' +\r\n getFourRandomValues() +\r\n '-' +\r\n getFourRandomValues() +\r\n '-' +\r\n getFourRandomValues() +\r\n getFourRandomValues() +\r\n getFourRandomValues()\r\n );\r\n};\r\n\r\nexport default guid;\r\n","import log from '../../log';\nimport guid from '../../utils/guid';\n\n/**\n * Measurement source schema\n *\n * @typedef {Object} MeasurementSource\n * @property {number} id -\n * @property {string} name -\n * @property {string} version -\n */\n\n/**\n * Measurement schema\n *\n * @typedef {Object} Measurement\n * @property {number} id -\n * @property {string} sopInstanceUid -\n * @property {string} FrameOfReferenceUID -\n * @property {string} referenceSeriesUID -\n * @property {string} label -\n * @property {string} description -\n * @property {string} type -\n * @property {string} unit -\n * @property {number} area -\n * @property {Array} points -\n * @property {MeasurementSource} source -\n */\n\n/* Measurement schema keys for object validation. */\nconst MEASUREMENT_SCHEMA_KEYS = [\n 'id',\n 'SOPInstanceUID',\n 'FrameOfReferenceUID',\n 'referenceSeriesUID',\n 'label',\n 'description',\n 'type',\n 'unit',\n 'area', // TODO: Add concept names instead (descriptor)\n 'points',\n 'source'\n];\n\nconst EVENTS = {\n MEASUREMENT_UPDATED: 'event::measurement_updated',\n MEASUREMENT_ADDED: 'event::measurement_added'\n};\n\nconst VALUE_TYPES = {\n POLYLINE: 'value_type::polyline',\n POINT: 'value_type::point',\n ELLIPSE: 'value_type::ellipse',\n MULTIPOINT: 'value_type::multipoint',\n CIRCLE: 'value_type::circle'\n};\n\nclass MeasurementService {\n constructor() {\n this.sources = {};\n this.mappings = {};\n this.measurements = {};\n this.listeners = {};\n Object.defineProperty(this, 'EVENTS', {\n value: EVENTS,\n writable: false,\n enumerable: true,\n configurable: false\n });\n Object.defineProperty(this, 'VALUE_TYPES', {\n value: VALUE_TYPES,\n writable: false,\n enumerable: true,\n configurable: false\n });\n }\n\n /**\n * Get all measurements.\n *\n * @return {Measurement[]} Array of measurements\n */\n getMeasurements() {\n const measurements = this._arrayOfObjects(this.measurements);\n return (\n measurements &&\n measurements.map((m) => this.measurements[Object.keys(m)[0]])\n );\n }\n\n /**\n * Get specific measurement by its id.\n *\n * @param {string} id If of the measurement\n * @return {Measurement} Measurement instance\n */\n getMeasurement(id) {\n let measurement = null;\n const measurements = this.measurements[id];\n\n if (measurements && Object.keys(measurements).length > 0) {\n measurement = this.measurements[id];\n }\n\n return measurement;\n }\n\n /**\n * Create a new source.\n *\n * @param {string} name Name of the source\n * @param {string} version Source name\n * @return {MeasurementSource} Measurement source instance\n */\n createSource(name, version) {\n if (!name) {\n log.warn('Source name not provided. Exiting early.');\n return;\n }\n\n if (!version) {\n log.warn('Source version not provided. Exiting early.');\n return;\n }\n\n const id = guid();\n const source = {\n id,\n name,\n version\n };\n source.addOrUpdate = (definition, measurement) => this.addOrUpdate(source, definition, measurement);\n source.getAnnotation = (definition, measurementId) => this.getAnnotation(source, definition, measurementId);\n\n log.info(`New '${name}@${version}' source added.`);\n this.sources[id] = source;\n\n return source;\n }\n\n /**\n * Add a new measurement matching criteria along with mapping functions.\n *\n * @param {MeasurementSource} source Measurement source instance\n * @param {string} definition Definition of the measurement (Annotation Type)\n * @param {MatchingCriteria} matchingCriteria The matching criteria\n * @param {Function} toSourceSchema Mapping function to source schema\n * @param {Function} toMeasurementSchema Mapping function to measurement schema\n * @return void\n */\n addMapping(\n source,\n definition,\n matchingCriteria,\n toSourceSchema,\n toMeasurementSchema\n ) {\n if (!this._isValidSource(source)) {\n log.warn('Invalid source. Exiting early.');\n return;\n }\n\n if (!matchingCriteria) {\n log.warn('Matching criteria not provided. Exiting early.');\n return;\n }\n\n if (!definition) {\n log.warn('Definition not provided. Exiting early.');\n return;\n }\n\n if (!toSourceSchema) {\n log.warn('Source mapping function not provided. Exiting early.');\n return;\n }\n\n if (!toMeasurementSchema) {\n log.warn('Measurement mapping function not provided. Exiting early.');\n return;\n }\n\n const mapping = {\n matchingCriteria,\n definition,\n toSourceSchema,\n toMeasurementSchema\n };\n\n if (Array.isArray(this.mappings[source.id])) {\n this.mappings[source.id].push(mapping);\n } else {\n this.mappings[source.id] = [mapping];\n }\n\n log.info(\n `New measurement mapping added to source '${this._getSourceInfo(\n source\n )}'.`\n );\n }\n\n /**\n * Get annotation for specific source.\n *\n * @param {MeasurementSource} source Measurement source instance\n * @param {string} definition The source definition\n * @param {string} measurementId The measurement service measurement id\n * @return {Object} Source measurement schema\n */\n getAnnotation(source, definition, measurementId) {\n if (!this._isValidSource(source)) {\n log.warn('Invalid source. Exiting early.');\n return;\n }\n\n if (!definition) {\n log.warn('No source definition provided. Exiting early.');\n return;\n }\n\n const mapping = this._getMappingByMeasurementSource(\n measurementId,\n definition\n );\n if (mapping) return mapping.toSourceSchema(measurement, definition);\n\n const measurement = this.getMeasurement(measurementId);\n const matchingMapping = this._getMatchingMapping(\n source,\n definition,\n measurement\n );\n\n if (matchingMapping) {\n log.info('Matching mapping found:', matchingMapping);\n const {toSourceSchema, definition} = matchingMapping;\n return toSourceSchema(measurement, definition);\n }\n }\n\n /**\n * Adds or update persisted measurements.\n *\n * @param {MeasurementSource} source The measurement source instance\n * @param {string} definition The source definition\n * @param {Measurement} measurement The source measurement\n * @return {string} A measurement id\n */\n addOrUpdate(source, definition, sourceMeasurement) {\n if (!this._isValidSource(source)) {\n log.warn('Invalid source. Exiting early.');\n return;\n }\n\n const sourceInfo = this._getSourceInfo(source);\n\n if (!definition) {\n console.log('TEST');\n log.warn('No source definition provided. Exiting early.');\n return;\n }\n\n if (!this._sourceHasMappings(source)) {\n log.warn(\n `No measurement mappings found for '${sourceInfo}' source. Exiting early.`\n );\n return;\n }\n\n let measurement = {};\n try {\n const sourceMappings = this.mappings[source.id];\n const {toMeasurementSchema} = sourceMappings.find(\n (mapping) => mapping.definition === definition\n );\n\n /* Convert measurement */\n measurement = toMeasurementSchema(sourceMeasurement);\n\n /* Assign measurement source instance */\n measurement.source = source;\n } catch (error) {\n log.warn(\n `Failed to map '${sourceInfo}' measurement for definition ${definition}:`,\n error.message\n );\n return;\n }\n\n if (!this._isValidMeasurement(measurement)) {\n log.warn(\n `Attempting to add or update a invalid measurement provided by '${sourceInfo}'. Exiting early.`\n );\n return;\n }\n\n let internalId = sourceMeasurement.id;\n if (!internalId) {\n internalId = guid();\n log.warn(`Measurement ID not found. Generating UID: ${internalId}`);\n }\n\n const newMeasurement = {\n ...measurement,\n modifiedTimestamp: Math.floor(Date.now() / 1000),\n id: internalId\n };\n\n if (this.measurements[internalId]) {\n log.info(\n 'Measurement already defined. Updating measurement.',\n newMeasurement\n );\n this.measurements[internalId] = newMeasurement;\n this._broadcastChange(\n this.EVENTS.MEASUREMENT_UPDATED,\n source,\n newMeasurement\n );\n } else {\n log.info('Measurement added.', newMeasurement);\n this.measurements[internalId] = newMeasurement;\n this._broadcastChange(\n this.EVENTS.MEASUREMENT_ADDED,\n source,\n newMeasurement\n );\n }\n\n return newMeasurement.id;\n }\n\n /**\n * Subscribe to measurement updates.\n *\n * @param {string} eventName The name of the event\n * @param {Function} callback Events callback\n * @return {Object} Observable object with actions\n */\n subscribe(eventName, callback) {\n if (this._isValidEvent(eventName)) {\n const listenerId = guid();\n const subscription = {id: listenerId, callback};\n\n console.info(`Subscribing to '${eventName}'.`);\n if (Array.isArray(this.listeners[eventName])) {\n this.listeners[eventName].push(subscription);\n } else {\n this.listeners[eventName] = [subscription];\n }\n\n return {\n unsubscribe: () => this._unsubscribe(eventName, listenerId)\n };\n }\n throw new Error(`Event ${eventName} not supported.`);\n }\n\n _getMappingByMeasurementSource(measurementId, definition) {\n const measurement = this.getMeasurement(measurementId);\n if (this._isValidSource(measurement.source)) {\n return this.mappings[measurement.source.id].find(\n (m) => m.definition === definition\n );\n }\n }\n\n /**\n * Get measurement mapping function if matching criteria.\n *\n * @param {MeasurementSource} source Measurement source instance\n * @param {string} definition The source definition\n * @param {string} measurement The measurement serice measurement\n * @return {Object} The mapping based on matched criteria\n */\n _getMatchingMapping(source, definition, measurement) {\n const sourceMappings = this.mappings[source.id];\n\n const sourceMappingsByDefinition = sourceMappings.filter(\n (mapping) => mapping.definition === definition\n );\n\n /* Criteria Matching */\n return sourceMappingsByDefinition.find(({matchingCriteria}) => (\n measurement.points &&\n measurement.points.length === matchingCriteria.points\n ));\n }\n\n /**\n * Returns formatted string with source info.\n *\n * @param {MeasurementSource} source Measurement source\n * @return {string} Source information\n */\n _getSourceInfo(source) {\n return `${source.name}@${source.version}`;\n }\n\n /**\n * Checks if given source is valid.\n *\n * @param {MeasurementSource} source Measurement source\n * @return {boolean} Measurement source validation\n */\n _isValidSource(source) {\n return source && this.sources[source.id];\n }\n\n /**\n * Checks if a given source has mappings.\n *\n * @param {MeasurementSource} source The measurement source\n * @return {boolean} Validation if source has mappings\n */\n _sourceHasMappings(source) {\n return (\n Array.isArray(this.mappings[source.id]) && this.mappings[source.id].length\n );\n }\n\n /**\n * Broadcasts measurement changes.\n *\n * @param {string} measurementId The measurement id\n * @param {MeasurementSource} source The measurement source\n * @param {string} eventName The event name\n * @return void\n */\n _broadcastChange(eventName, source, measurement) {\n const hasListeners = Object.keys(this.listeners).length > 0;\n const hasCallbacks = Array.isArray(this.listeners[eventName]);\n\n if (hasListeners && hasCallbacks) {\n this.listeners[eventName].forEach((listener) => {\n listener.callback({source, measurement});\n });\n }\n }\n\n /**\n * Unsubscribe to measurement updates.\n *\n * @param {string} eventName The name of the event\n * @param {string} listenerId The listeners id\n * @return void\n */\n _unsubscribe(eventName, listenerId) {\n if (!this.listeners[eventName]) {\n return;\n }\n\n const listeners = this.listeners[eventName];\n if (Array.isArray(listeners)) {\n this.listeners[eventName] = listeners.filter(\n ({id}) => id !== listenerId\n );\n } else {\n this.listeners[eventName] = undefined;\n }\n }\n\n /**\n * Check if a given measurement data is valid.\n *\n * @param {Measurement} measurementData Measurement data\n * @return {boolean} Measurement validation\n */\n _isValidMeasurement(measurementData) {\n Object.keys(measurementData).forEach((key) => {\n if (!MEASUREMENT_SCHEMA_KEYS.includes(key)) {\n log.warn(`Invalid measurement key: ${key}`);\n return false;\n }\n });\n\n return true;\n }\n\n /**\n * Check if a given measurement service event is valid.\n *\n * @param {string} eventName The name of the event\n * @return {boolean} Event name validation\n */\n _isValidEvent(eventName) {\n return Object.values(this.EVENTS).includes(eventName);\n }\n\n /**\n * Converts object of objects to array.\n *\n * @return {Array} Array of objects\n */\n _arrayOfObjects = (obj) => Object.entries(obj).map((e) => ({[e[0]]: e[1]}));\n}\n\nexport default MeasurementService;\nexport {EVENTS, VALUE_TYPES};\n","/**\r\n * adds a pause and unpause method to Mousetrap\r\n * this allows you to enable or disable keyboard shortcuts\r\n * without having to reset Mousetrap and rebind everything\r\n *\r\n * https://github.com/ccampbell/mousetrap/blob/master/plugins/pause/mousetrap-pause.js\r\n */\r\nexport default function (Mousetrap) {\r\n const _originalStopCallback = Mousetrap.prototype.stopCallback;\r\n\r\n Mousetrap.prototype.stopCallback = function (e, element, combo) {\r\n const self = this;\r\n\r\n if (self.paused) {\r\n return true;\r\n }\r\n\r\n return _originalStopCallback.call(self, e, element, combo);\r\n };\r\n\r\n Mousetrap.prototype.pause = function () {\r\n const self = this;\r\n self.paused = true;\r\n };\r\n\r\n Mousetrap.prototype.unpause = function () {\r\n const self = this;\r\n self.paused = false;\r\n };\r\n\r\n Mousetrap.init();\r\n}\r\n","import MeasurementService from './MeasurementService';\n\nexport default {\n name: 'MeasurementService',\n create: ({configuration = {}}) => new MeasurementService()\n};\n","import log from '../log.js';\n\n/**\n * The definition of a command\n *\n * @typedef {Object} CommandDefinition\n * @property {Function} commandFn - Command to call\n * @property {Array} storeContexts - Array of string of modules required from store\n * @property {Object} options - Object of params to pass action\n */\n\n/**\n * The Commands Manager tracks named commands (or functions) that are scoped to\n * a context. When we attempt to run a command with a given name, we look for it\n * in our active contexts. If found, we run the command, passing in any application\n * or call specific data specified in the command's definition.\n *\n * NOTE: A more robust version of the CommandsManager lives in v1. If you're looking\n * to extend this class, please check it's source before adding new methods.\n */\nexport class CommandsManager {\n constructor({ getAppState, getActiveContexts } = {}) {\n this.contexts = {};\n\n if (!getAppState || !getActiveContexts) {\n log.warn('CommandsManager was instantiated without getAppState() or getActiveContexts()');\n }\n\n this._getAppState = getAppState;\n this._getActiveContexts = getActiveContexts;\n }\n\n /**\n * Allows us to create commands \"per context\". An example would be the \"Cornerstone\"\n * context having a `SaveImage` command, and the \"VTK\" context having a `SaveImage`\n * command. The distinction of a context allows us to call the command in either\n * context, and have faith that the correct command will be run.\n *\n * @method\n * @param {string} contextName - Namespace for commands\n * @returns {undefined}\n */\n createContext(contextName) {\n if (!contextName) {\n return;\n }\n\n if (this.contexts[contextName]) {\n return this.clearContext(contextName);\n }\n\n this.contexts[contextName] = {};\n }\n\n /**\n * Returns all command definitions for a given context\n *\n * @method\n * @param {string} contextName - Namespace for commands\n * @returns {Object} - the matched context\n */\n getContext(contextName) {\n const context = this.contexts[contextName];\n\n if (!context) {\n return;\n }\n\n return context;\n }\n\n /**\n * Clears all registered commands for a given context.\n *\n * @param {string} contextName - Namespace for commands\n * @returns {undefined}\n */\n clearContext(contextName) {\n if (!contextName) {\n return;\n }\n\n this.contexts[contextName] = {};\n }\n\n /**\n * Register a new command with the command manager. Scoped to a context, and\n * with a definition to assist command callers w/ providing the necessary params\n *\n * @method\n * @param {string} contextName - Namespace for command; often scoped to the extension that added it\n * @param {string} commandName - Unique name identifying the command\n * @param {CommandDefinition} definition - {@link CommandDefinition}\n */\n registerCommand(contextName, commandName, definition) {\n if (typeof definition !== 'object') {\n return;\n }\n\n const context = this.getContext(contextName);\n if (!context) {\n return;\n }\n\n context[commandName] = definition;\n }\n\n /**\n * Finds a command with the provided name if it exists in the specified context,\n * or a currently active context.\n *\n * @method\n * @param {String} commandName - Command to find\n * @param {String} [contextName] - Specific command to look in. Defaults to current activeContexts\n */\n getCommand(commandName, contextName) {\n let contexts = [];\n\n if (contextName) {\n const context = this.getContext(contextName);\n if (context) {\n contexts.push(context);\n }\n } else {\n const activeContexts = this._getActiveContexts();\n activeContexts.forEach((activeContext) => {\n const context = this.getContext(activeContext);\n if (context) {\n contexts.push(context);\n }\n });\n }\n\n if (contexts.length === 0) {\n return;\n }\n\n let foundCommand;\n contexts.forEach((context) => {\n if (context[commandName]) {\n foundCommand = context[commandName];\n }\n });\n\n return foundCommand;\n }\n\n /**\n *\n * @method\n * @param {String} commandName\n * @param {Object} [options={}] - Extra options to pass the command. Like a mousedown event\n * @param {String} [contextName]\n */\n runCommand(commandName, options = {}, contextName) {\n const definition = this.getCommand(commandName, contextName);\n if (!definition) {\n log.warn(`Command \"${commandName}\" not found in current context`);\n return;\n }\n\n const { commandFn, storeContexts = [] } = definition;\n const definitionOptions = definition.options;\n\n let commandParams = {};\n const appState = this._getAppState();\n storeContexts.forEach((context) => {\n commandParams[context] = appState[context];\n });\n\n commandParams = Object.assign(\n {},\n commandParams, // Required store contexts\n definitionOptions, // \"Command configuration\"\n options // \"Time of call\" info\n );\n\n if (typeof commandFn !== 'function') {\n log.warn(`No commandFn was defined for command \"${commandName}\"`);\n return;\n } \n return commandFn(commandParams);\n \n }\n}\n\nexport default CommandsManager;\n","/**\r\n * This extension allows you to record a sequence using Mousetrap.\r\n * {@link https://craig.is/killing/mice}\r\n *\r\n * @author Dan Tao \r\n */\r\nexport default function (Mousetrap) {\r\n /**\r\n * the sequence currently being recorded\r\n *\r\n * @type {Array}\r\n */\r\n let _recordedSequence = [],\r\n /**\r\n * a callback to invoke after recording a sequence\r\n *\r\n * @type {Function|null}\r\n */\r\n _recordedSequenceCallback = null,\r\n /**\r\n * a list of all of the keys currently held down\r\n *\r\n * @type {Array}\r\n */\r\n _currentRecordedKeys = [],\r\n /**\r\n * temporary state where we remember if we've already captured a\r\n * character key in the current combo\r\n *\r\n * @type {boolean}\r\n */\r\n _recordedCharacterKey = false,\r\n /**\r\n * a handle for the timer of the current recording\r\n *\r\n * @type {null|number}\r\n */\r\n _recordTimer = null;\r\n const /**\r\n * the original handleKey method to override when Mousetrap.record() is\r\n * called\r\n *\r\n * @type {Function}\r\n */\r\n _origHandleKey = Mousetrap.prototype.handleKey;\r\n\r\n /**\r\n * handles a character key event\r\n *\r\n * @param {string} character\r\n * @param {Array} modifiers\r\n * @param {Event} e\r\n * @returns void\r\n */\r\n function _handleKey(character, modifiers, e) {\r\n const self = this;\r\n\r\n if (!self.recording) {\r\n _origHandleKey.apply(self, arguments);\r\n return;\r\n }\r\n\r\n // remember this character if we're currently recording a sequence\r\n if (e.type === 'keydown') {\r\n if (character.length === 1 && _recordedCharacterKey) {\r\n _recordCurrentCombo();\r\n }\r\n\r\n for (let i = 0; i < modifiers.length; ++i) {\r\n _recordKey(modifiers[i]);\r\n }\r\n _recordKey(character);\r\n\r\n // once a key is released, all keys that were held down at the time\r\n // count as a keypress\r\n } else if (e.type === 'keyup' && _currentRecordedKeys.length > 0) {\r\n _recordCurrentCombo();\r\n }\r\n }\r\n\r\n /**\r\n * marks a character key as held down while recording a sequence\r\n *\r\n * @param {string} key\r\n * @returns void\r\n */\r\n function _recordKey(key) {\r\n // one-off implementation of Array.indexOf, since IE6-9 don't support it\r\n for (let i = 0; i < _currentRecordedKeys.length; ++i) {\r\n if (_currentRecordedKeys[i] === key) {\r\n return;\r\n }\r\n }\r\n\r\n _currentRecordedKeys.push(key);\r\n\r\n if (key.length === 1) {\r\n _recordedCharacterKey = true;\r\n }\r\n }\r\n\r\n /**\r\n * marks whatever key combination that's been recorded so far as finished\r\n * and gets ready for the next combo\r\n *\r\n * @returns void\r\n */\r\n function _recordCurrentCombo() {\r\n _recordedSequence.push(_currentRecordedKeys);\r\n _currentRecordedKeys = [];\r\n _recordedCharacterKey = false;\r\n _finishRecording();\r\n }\r\n\r\n /**\r\n * ensures each combo in a sequence is in a predictable order and formats\r\n * key combos to be '+'-delimited\r\n *\r\n * modifies the sequence in-place\r\n *\r\n * @param {Array} sequence\r\n * @returns void\r\n */\r\n function _normalizeSequence(sequence) {\r\n for (let i = 0; i < sequence.length; ++i) {\r\n sequence[i].sort(function (x, y) {\r\n // modifier keys always come first, in alphabetical order\r\n if (x.length > 1 && y.length === 1) {\r\n return -1;\r\n } else if (x.length === 1 && y.length > 1) {\r\n return 1;\r\n }\r\n\r\n // character keys come next (list should contain no duplicates,\r\n // so no need for equality check)\r\n return x > y ? 1 : -1;\r\n });\r\n\r\n sequence[i] = sequence[i].join('+');\r\n }\r\n }\r\n\r\n /**\r\n * finishes the current recording, passes the recorded sequence to the stored\r\n * callback, and sets Mousetrap.handleKey back to its original function\r\n *\r\n * @returns void\r\n */\r\n function _finishRecording() {\r\n if (_recordedSequenceCallback) {\r\n _normalizeSequence(_recordedSequence);\r\n _recordedSequenceCallback(_recordedSequence);\r\n }\r\n\r\n // reset all recorded state\r\n _recordedSequence = [];\r\n _recordedSequenceCallback = null;\r\n _currentRecordedKeys = [];\r\n }\r\n\r\n /**\r\n * called to set a 1 second timeout on the current recording\r\n *\r\n * this is so after each key press in the sequence the recording will wait for\r\n * 1 more second before executing the callback\r\n *\r\n * @returns void\r\n */\r\n function _restartRecordTimer() {\r\n clearTimeout(_recordTimer);\r\n _recordTimer = setTimeout(_finishRecording, 1000);\r\n }\r\n\r\n /**\r\n * records the next sequence and passes it to a callback once it's\r\n * completed\r\n *\r\n * @param {Function} callback\r\n * @returns void\r\n */\r\n Mousetrap.prototype.record = function (callback) {\r\n const self = this;\r\n self.recording = true;\r\n _recordedSequenceCallback = function () {\r\n self.recording = false;\r\n callback.apply(self, arguments);\r\n };\r\n };\r\n\r\n /**\r\n * stop recording\r\n *\r\n * @param {Function} callback\r\n * @returns void\r\n */\r\n Mousetrap.prototype.stopRecord = function () {\r\n const self = this;\r\n self.recording = false;\r\n };\r\n\r\n /**\r\n * start recording\r\n *\r\n * @param {Function} callback\r\n * @returns void\r\n */\r\n Mousetrap.prototype.startRecording = function () {\r\n const self = this;\r\n self.recording = true;\r\n };\r\n\r\n Mousetrap.prototype.handleKey = function () {\r\n const self = this;\r\n _handleKey.apply(self, arguments);\r\n };\r\n\r\n Mousetrap.init();\r\n}\r\n","import Mousetrap from 'mousetrap';\r\nimport pausePlugin from './pausePlugin';\r\nimport recordPlugin from './recordPlugin';\r\n\r\nrecordPlugin(Mousetrap);\r\npausePlugin(Mousetrap);\r\n\r\nexport default Mousetrap;\r\n","import hotkeys from './../utils/hotkeys';\nimport log from './../log.js';\n\n/**\n *\n *\n * @typedef {Object} HotkeyDefinition\n * @property {String} commandName - Command to call\n * @property {String} label - Display name for hotkey\n * @property {String[]} keys - Keys to bind; Follows Mousetrap.js binding syntax\n */\n\nexport class HotkeysManager {\n constructor(commandsManager, servicesManager) {\n this.hotkeyDefinitions = {};\n this.hotkeyDefaults = [];\n this.isEnabled = true;\n\n if (!commandsManager) {\n log.warn(\n 'HotkeysManager instantiated without a commandsManager. Hotkeys will be unable to find and run commands.'\n );\n }\n\n this._servicesManager = servicesManager;\n this._commandsManager = commandsManager;\n }\n\n /**\n * Exposes Mousetrap.js's `.record` method, added by the record plugin.\n *\n * @param {*} event\n */\n record(event) {\n return hotkeys.record(event);\n }\n\n /**\n * Disables all hotkeys. Hotkeys added while disabled will not listen for\n * input.\n */\n disable() {\n this.isEnabled = false;\n hotkeys.pause();\n }\n\n /**\n * Enables all hotkeys.\n */\n enable() {\n this.isEnabled = true;\n hotkeys.unpause();\n }\n\n /**\n * Registers a list of hotkeydefinitions.\n *\n * @param {HotkeyDefinition[] | Object} [hotkeyDefinitions=[]] Contains hotkeys definitions\n */\n setHotkeys(hotkeyDefinitions = []) {\n try {\n const definitions = this._getValidDefinitions(hotkeyDefinitions);\n\n definitions.forEach((definition) => this.registerHotkeys(definition));\n } catch (error) {\n const {UINotificationService} = this._servicesManager.services;\n UINotificationService.show({\n title: 'Hotkeys Manager',\n message: 'Erro while setting hotkeys',\n type: 'error'\n });\n }\n }\n\n /**\n * Set default hotkey bindings. These\n * values are used in `this.restoreDefaultBindings`.\n *\n * @param {HotkeyDefinition[] | Object} [hotkeyDefinitions=[]] Contains hotkeys definitions\n */\n setDefaultHotKeys(hotkeyDefinitions = []) {\n const definitions = this._getValidDefinitions(hotkeyDefinitions);\n\n this.hotkeyDefaults = definitions;\n }\n\n /**\n * Take hotkey definitions that can be an array or object and make sure that it\n * returns an array of hotkeys\n *\n * @param {HotkeyDefinition[] | Object} [hotkeyDefinitions=[]] Contains hotkeys definitions\n */\n _getValidDefinitions(hotkeyDefinitions) {\n const definitions = Array.isArray(hotkeyDefinitions)\n ? [...hotkeyDefinitions]\n : this._parseToArrayLike(hotkeyDefinitions);\n\n return definitions;\n }\n\n /**\n * It parses given object containing hotkeyDefinition to array like.\n * Each property of given object will be mapped to an object of an array. And its property name will be the value of a property named as commandName\n *\n * @param {HotkeyDefinition[] | Object} [hotkeyDefinitions={}] Contains hotkeys definitions\n * @returns {HotkeyDefinition[]}\n */\n _parseToArrayLike(hotkeyDefinitionsObj = {}) {\n const copy = {...hotkeyDefinitionsObj};\n return Object.entries(copy).map((entryValue) =>\n this._parseToHotKeyObj(entryValue[0], entryValue[1])\n );\n }\n\n /**\n * Return HotkeyDefinition object like based on given property name and property value\n * @param {string} propertyName property name of hotkey definition object\n * @param {object} propertyValue property value of hotkey definition object\n *\n * @example\n *\n * const hotKeyObj = {hotKeyDefA: {keys:[],....}}\n *\n * const parsed = _parseToHotKeyObj(Object.keys(hotKeyDefA)[0], hotKeyObj[hotKeyDefA]);\n * {\n * commandName: hotKeyDefA,\n * keys: [],\n * ....\n * }\n *\n */\n _parseToHotKeyObj(propertyName, propertyValue) {\n return {\n commandName: propertyName,\n ...propertyValue\n };\n }\n\n /**\n * (unbinds and) binds the specified command to one or more key combinations.\n * When a hotkey combination is triggered, the command name and active contexts\n * are used to locate the correct command to call.\n *\n * @param {HotkeyDefinition} commandName\n * @param {String} extension\n * @returns {undefined}\n */\n registerHotkeys({commandName, keys, label} = {}) {\n if (!commandName) {\n log.warn(`No command was defined for hotkey \"${keys}\"`);\n return;\n }\n\n const previouslyRegisteredDefinition = this.hotkeyDefinitions[commandName];\n\n if (previouslyRegisteredDefinition) {\n const previouslyRegisteredKeys = previouslyRegisteredDefinition.keys;\n this._unbindHotkeys(commandName, previouslyRegisteredKeys);\n log.info(`Unbinding ${commandName} from ${previouslyRegisteredKeys}`);\n }\n\n // Set definition & bind\n this.hotkeyDefinitions[commandName] = {keys, label};\n this._bindHotkeys(commandName, keys);\n log.info(`Binding ${commandName} to ${keys}`);\n }\n\n /**\n * Uses most recent\n *\n * @returns {undefined}\n */\n restoreDefaultBindings() {\n this.setHotkeys(this.hotkeyDefaults);\n }\n\n /**\n *\n */\n destroy() {\n this.hotkeyDefaults = [];\n this.hotkeyDefinitions = {};\n hotkeys.reset();\n }\n\n /**\n * Binds one or more set of hotkey combinations for a given command\n *\n * @private\n * @param {string} commandName - The name of the command to trigger when hotkeys are used\n * @param {string[]} keys - One or more key combinations that should trigger command\n * @returns {undefined}\n */\n _bindHotkeys(commandName, keys) {\n const isKeyDefined = keys === '' || keys === undefined;\n if (isKeyDefined) {\n return;\n }\n\n const isKeyArray = keys instanceof Array;\n // const combinedKeys = isKeyArray ? keys.join('+') : keys;\n // hotkeys.bind(combinedKeys, evt => {\n // evt.preventDefault();\n // evt.stopPropagation();\n // this._commandsManager.runCommand(commandName, { evt });\n // });\n\n // TungLT fix for bind multi key with single command\n const combinedKeys = isKeyArray ? keys : [keys];\n combinedKeys.forEach((combinedKey) => hotkeys.bind(combinedKey, (evt) => {\n evt.preventDefault();\n evt.stopPropagation();\n this._commandsManager.runCommand(commandName, {evt});\n }));\n }\n\n /**\n * unbinds one or more set of hotkey combinations for a given command\n *\n * @private\n * @param {string} commandName - The name of the previously bound command\n * @param {string[]} keys - One or more sets of previously bound keys\n * @returns {undefined}\n */\n _unbindHotkeys(commandName, keys) {\n const isKeyDefined = keys !== '' && keys !== undefined;\n if (!isKeyDefined) {\n return;\n }\n\n const isKeyArray = keys instanceof Array;\n const combinedKeys = isKeyArray ? keys : [keys];\n combinedKeys.forEach((combinedKey) => hotkeys.unbind(combinedKey));\n\n // if (isKeyArray) {\n // const combinedKeys = keys.join('+');\n // this._unbindHotkeys(commandName, combinedKeys);\n // return;\n // }\n //\n // hotkeys.unbind(keys);\n }\n}\n\nexport default HotkeysManager;\n\n// Commands Contexts:\n\n// --> Name and Priority\n// GLOBAL: 0\n// VIEWER::CORNERSTONE: 1\n// VIEWER::VTK: 1\n","// These should be overridden by the implementation\nconst user = {\n userLoggedIn: () => false,\n getUserId: () => null,\n getName: () => null,\n getAccessToken: () => null,\n login: () => new Promise((resolve, reject) => reject()),\n logout: () => new Promise((resolve, reject) => reject()),\n getData: (key) => null,\n setData: (key, value) => null\n};\n\nexport default user;\n","import getAttribute from './getAttribute';\nimport getAuthorizationHeader from './getAuthorizationHeader';\nimport getModalities from './getModalities';\nimport getName from './getName';\nimport getNumber from './getNumber';\nimport getString from './getString';\n\nconst DICOMWeb = {\n getAttribute,\n getAuthorizationHeader,\n getModalities,\n getName,\n getNumber,\n getString\n};\n\nexport default DICOMWeb;\n","/**\n * Returns the specified element as a dicom attribute group/element.\n *\n * @param element - The group/element of the element (e.g. '00280009')\n * @param [defaultValue] - The value to return if the element is not present\n * @returns {*}\n */\nexport default function getAttribute(element, defaultValue) {\n if (!element) {\n return defaultValue;\n }\n // Value is not present if the attribute has a zero length value\n if (!element.Value) {\n return defaultValue;\n }\n // Sanity check to make sure we have at least one entry in the array.\n if (!element.Value.length) {\n return defaultValue;\n }\n\n return convertToInt(element.Value);\n}\n\nfunction convertToInt(input) {\n function padFour(input) {\n const l = input.length;\n\n if (l == 0) return '0000';\n if (l == 1) return `000${input}`;\n if (l == 2) return `00${input}`;\n if (l == 3) return `0${input}`;\n\n return input;\n }\n\n let output = '';\n for (let i = 0; i < input.length; i++) {\n for (let j = 0; j < input[i].length; j++) {\n output += padFour(input[i].charCodeAt(j).toString(16));\n }\n }\n\n return parseInt(output, 16);\n}\n","// Commenting this out for now since it looks like Rollup is pulling in the\n// Node.js version instead of the Browser version of this package\n// import { btoa } from 'isomorphic-base64';\nimport user from '../user';\n\n/**\n * Returns the Authorization header as part of an Object.\n *\n * @export\n * @param {Object} [server={}]\n * @param {Object} [server.requestOptions]\n * @param {string|function} [server.requestOptions.auth]\n * @returns {Object} { Authorization }\n */\nexport default function getAuthorizationHeader({requestOptions} = {}) {\n const headers = {};\n\n // Check for OHIF.user since this can also be run on the server\n const accessToken = user && user.getAccessToken && user.getAccessToken();\n\n if (requestOptions && requestOptions.auth) {\n if (typeof requestOptions.auth === 'function') {\n // Custom Auth Header\n headers.Authorization = requestOptions.auth(requestOptions);\n } else {\n // HTTP Basic Auth (user:password)\n headers.Authorization = `Basic ${btoa(requestOptions.auth)}`;\n }\n } else if (accessToken) {\n headers.Authorization = accessToken;\n }\n\n return headers;\n}\n","export default function getModalities(Modality, ModalitiesInStudy) {\n if (!Modality && !ModalitiesInStudy) {\n return {};\n }\n\n const modalities = Modality || {\n vr: 'CS',\n Value: []\n };\n\n if (ModalitiesInStudy) {\n if (modalities.vr && modalities.vr === ModalitiesInStudy.vr) {\n for (let i = 0; i < ModalitiesInStudy.Value.length; i++) {\n const value = ModalitiesInStudy.Value[i];\n if (modalities.Value.indexOf(value) === -1) {\n modalities.Value.push(value);\n }\n }\n } else {\n return ModalitiesInStudy;\n }\n }\n\n return modalities;\n}\n","/**\n * Returns the Alphabetic version of a PN\n *\n * @param element - The group/element of the element (e.g. '00200013')\n * @param [defaultValue] - The default value to return if the element is not found\n * @returns {*}\n */\nexport default function getName(element, defaultValue) {\n if (!element) {\n return defaultValue;\n }\n // Value is not present if the attribute has a zero length value\n if (!element.Value) {\n return defaultValue;\n }\n // Sanity check to make sure we have at least one entry in the array.\n if (!element.Value.length) {\n return defaultValue;\n }\n // Return the Alphabetic component group\n if (element.Value[0].Alphabetic) {\n return element.Value[0].Alphabetic;\n }\n // Orthanc does not return PN properly so this is a temporary workaround\n return element.Value[0];\n}\n","/**\n * Returns the first string value as a Javascript Number\n * @param element - The group/element of the element (e.g. '00200013')\n * @param [defaultValue] - The default value to return if the element does not exist\n * @returns {*}\n */\nexport default function getNumber(element, defaultValue) {\n if (!element) {\n return defaultValue;\n }\n // Value is not present if the attribute has a zero length value\n if (!element.Value) {\n return defaultValue;\n }\n // Sanity check to make sure we have at least one entry in the array.\n if (!element.Value.length) {\n return defaultValue;\n }\n\n return parseFloat(element.Value[0]);\n}\n","/**\n * Returns the specified element as a string. Multi-valued elements will be separated by a backslash\n *\n * @param element - The group/element of the element (e.g. '00200013')\n * @param [defaultValue] - The value to return if the element is not present\n * @returns {*}\n */\nexport default function getString(element, defaultValue) {\n if (!element) {\n return defaultValue;\n }\n // Value is not present if the attribute has a zero length value\n if (!element.Value) {\n return defaultValue;\n }\n // Sanity check to make sure we have at least one entry in the array.\n if (!element.Value.length) {\n return defaultValue;\n }\n // Join the array together separated by backslash\n // NOTE: Orthanc does not correctly split values into an array so the join is a no-op\n return element.Value.join('\\\\');\n}\n","// @TODO: improve this object\n/**\n * Objects to be used to throw errors\n */\nclass OHIFError extends Error {\n constructor(message) {\n super();\n this.message = message;\n this.stack = new Error().stack;\n this.name = this.constructor.name;\n }\n}\n\nexport default OHIFError;\n","import guid from '../utils/guid.js';\r\nimport OHIFError from './OHIFError';\r\nimport {Vector3} from 'cornerstone-math';\r\n\r\nconst OBJECT = 'object';\r\n\r\n/**\r\n * This class defines an ImageSet object which will be used across the viewer. This object represents\r\n * a list of images that are associated by any arbitrary criteria being thus content agnostic. Besides the\r\n * main attributes (images and uid) it allows additional attributes to be appended to it (currently\r\n * indiscriminately, but this should be changed).\r\n */\r\nclass ImageSet {\r\n constructor(images) {\r\n if (Array.isArray(images) !== true) {\r\n throw new OHIFError('ImageSet expects an array of images');\r\n }\r\n\r\n // @property \"images\"\r\n Object.defineProperty(this, 'images', {\r\n enumerable: false,\r\n configurable: false,\r\n writable: false,\r\n value: images\r\n });\r\n\r\n // @property \"uid\"\r\n Object.defineProperty(this, 'uid', {\r\n enumerable: false,\r\n configurable: false,\r\n writable: false,\r\n value: guid() // Unique ID of the instance\r\n });\r\n }\r\n\r\n getUID() {\r\n return this.uid;\r\n }\r\n\r\n setAttribute(attribute, value) {\r\n this[attribute] = value;\r\n }\r\n\r\n getAttribute(attribute) {\r\n return this[attribute];\r\n }\r\n\r\n setAttributes(attributes) {\r\n if (typeof attributes === OBJECT && attributes !== null) {\r\n const imageSet = this;\r\n for (let attribute in attributes) {\r\n if (Object.prototype.hasOwnProperty.call(attributes, attribute)) {\r\n imageSet[attribute] = attributes[attribute];\r\n }\r\n }\r\n }\r\n }\r\n\r\n getImage(index) {\r\n return this.images[index];\r\n }\r\n\r\n sortBy(sortingCallback) {\r\n return this.images.sort(sortingCallback);\r\n }\r\n\r\n sortByImagePositionPatient() {\r\n const images = this.images;\r\n const referenceImagePositionPatient = _getImagePositionPatient(images[0]);\r\n\r\n const refIppVec = new Vector3(\r\n referenceImagePositionPatient[0],\r\n referenceImagePositionPatient[1],\r\n referenceImagePositionPatient[2]\r\n );\r\n\r\n const ImageOrientationPatient = _getImageOrientationPatient(images[0]);\r\n\r\n const scanAxisNormal = new Vector3(\r\n ImageOrientationPatient[0],\r\n ImageOrientationPatient[1],\r\n ImageOrientationPatient[2]\r\n ).cross(\r\n new Vector3(\r\n ImageOrientationPatient[3],\r\n ImageOrientationPatient[4],\r\n ImageOrientationPatient[5]\r\n )\r\n );\r\n\r\n const distanceImagePairs = images.map(function (image) {\r\n const ippVec = new Vector3(..._getImagePositionPatient(image));\r\n const positionVector = refIppVec.clone().sub(ippVec);\r\n const distance = positionVector.dot(scanAxisNormal);\r\n\r\n return {\r\n distance,\r\n image\r\n };\r\n });\r\n\r\n distanceImagePairs.sort(function (a, b) {\r\n return b.distance - a.distance;\r\n });\r\n\r\n const sortedImages = distanceImagePairs.map((a) => a.image);\r\n\r\n images.sort(function (a, b) {\r\n return sortedImages.indexOf(a) - sortedImages.indexOf(b);\r\n });\r\n }\r\n}\r\n\r\nfunction _getImagePositionPatient(image) {\r\n return image.getData().metadata.ImagePositionPatient;\r\n}\r\n\r\nfunction _getImageOrientationPatient(image) {\r\n return image.getData().metadata.ImageOrientationPatient;\r\n}\r\n\r\nexport default ImageSet;\r\n","/**\r\n * Constants\r\n */\r\n\r\nconst STRING = 'string';\r\nconst NUMBER = 'number';\r\nconst FUNCTION = 'function';\r\nconst OBJECT = 'object';\r\n\r\n/**\r\n * Class Definition\r\n */\r\n\r\nexport class Metadata {\r\n /**\r\n * Constructor and Instance Methods\r\n */\r\n\r\n constructor(data, uid) {\r\n // Define the main \"_data\" private property as an immutable property.\r\n // IMPORTANT: This property can only be set during instance construction.\r\n Object.defineProperty(this, '_data', {\r\n configurable: false,\r\n enumerable: false,\r\n writable: false,\r\n value: data\r\n });\r\n\r\n // Define the main \"_uid\" private property as an immutable property.\r\n // IMPORTANT: This property can only be set during instance construction.\r\n Object.defineProperty(this, '_uid', {\r\n configurable: false,\r\n enumerable: false,\r\n writable: false,\r\n value: uid\r\n });\r\n\r\n // Define \"_custom\" properties as an immutable property.\r\n // IMPORTANT: This property can only be set during instance construction.\r\n Object.defineProperty(this, '_custom', {\r\n configurable: false,\r\n enumerable: false,\r\n writable: false,\r\n value: Object.create(null)\r\n });\r\n }\r\n\r\n getData() {\r\n return this._data;\r\n }\r\n\r\n getDataProperty(propertyName) {\r\n let propertyValue;\r\n const _data = this._data;\r\n if (\r\n _data instanceof Object ||\r\n (typeof _data === OBJECT && _data !== null)\r\n ) {\r\n propertyValue = _data[propertyName];\r\n }\r\n return propertyValue;\r\n }\r\n\r\n /**\r\n * Get unique object ID\r\n */\r\n getObjectID() {\r\n return this._uid;\r\n }\r\n\r\n /**\r\n * Set custom attribute value\r\n * @param {String} attribute Custom attribute name\r\n * @param {Any} value Custom attribute value\r\n */\r\n setCustomAttribute(attribute, value) {\r\n this._custom[attribute] = value;\r\n }\r\n\r\n /**\r\n * Get custom attribute value\r\n * @param {String} attribute Custom attribute name\r\n * @return {Any} Custom attribute value\r\n */\r\n getCustomAttribute(attribute) {\r\n return this._custom[attribute];\r\n }\r\n\r\n /**\r\n * Check if a custom attribute exists\r\n * @param {String} attribute Custom attribute name\r\n * @return {Boolean} True if custom attribute exists or false if not\r\n */\r\n customAttributeExists(attribute) {\r\n return attribute in this._custom;\r\n }\r\n\r\n /**\r\n * Set custom attributes in batch mode.\r\n * @param {Object} attributeMap An object whose own properties will be used as custom attributes.\r\n */\r\n setCustomAttributes(attributeMap) {\r\n const _hasOwn = Object.prototype.hasOwnProperty;\r\n const _custom = this._custom;\r\n for (let attribute in attributeMap) {\r\n if (_hasOwn.call(attributeMap, attribute)) {\r\n _custom[attribute] = attributeMap[attribute];\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Static Methods\r\n */\r\n\r\n static isValidUID(uid) {\r\n return typeof uid === STRING && uid.length > 0;\r\n }\r\n\r\n static isValidIndex(index) {\r\n return typeof index === NUMBER && index >= 0 && (index | 0) === index;\r\n }\r\n\r\n static isValidCallback(callback) {\r\n return typeof callback === FUNCTION;\r\n }\r\n}\r\n","import { Metadata } from './Metadata';\r\nimport OHIFError from '../OHIFError.js';\r\n\r\n/**\r\n * ATTENTION! This class should never depend on StudyMetadata or SeriesMetadata classes as this could\r\n * possibly cause circular dependency issues.\r\n */\r\n\r\nconst UNDEFINED = 'undefined';\r\nconst STRING = 'string';\r\n\r\nexport class InstanceMetadata extends Metadata {\r\n constructor(data, uid) {\r\n super(data, uid);\r\n // Initialize Private Properties\r\n Object.defineProperties(this, {\r\n _imageId: {\r\n configurable: true, // configurable so that it can be redefined in sub-classes...\r\n enumerable: false,\r\n writable: true,\r\n value: null\r\n }\r\n });\r\n // Initialize Public Properties\r\n this._definePublicProperties();\r\n }\r\n\r\n /**\r\n * Private Methods\r\n */\r\n\r\n /**\r\n * Define Public Properties\r\n * This method should only be called during initialization (inside the class constructor)\r\n */\r\n _definePublicProperties() {\r\n /**\r\n * Property: this.SOPInstanceUID\r\n * Same as this.getSOPInstanceUID()\r\n * It's specially useful in contexts where a method call is not suitable like in search criteria. For example:\r\n * sopInstanceCollection.findBy({\r\n * SOPInstanceUID: '1.2.3.4.5.6.77777.8888888.99999999999.0'\r\n * });\r\n */\r\n Object.defineProperty(this, 'SOPInstanceUID', {\r\n configurable: false,\r\n enumerable: false,\r\n get: function () {\r\n return this.getSOPInstanceUID();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Public Methods\r\n */\r\n\r\n /**\r\n * Returns the StudyInstanceUID of the current instance. This method is basically a shorthand the full \"getTagValue\" method call.\r\n */\r\n getStudyInstanceUID() {\r\n return this.getTagValue('StudyInstanceUID', null);\r\n }\r\n\r\n /**\r\n * Returns the SeriesInstanceUID of the current instance. This method is basically a shorthand the full \"getTagValue\" method call.\r\n */\r\n getSeriesInstanceUID() {\r\n return this.getTagValue('SeriesInstanceUID', null);\r\n }\r\n\r\n /**\r\n * Returns the SOPInstanceUID of the current instance.\r\n */\r\n getSOPInstanceUID() {\r\n return this.getTagValue('SOPInstanceUID', null);\r\n }\r\n\r\n // @TODO: Improve this... (E.g.: blob data)\r\n getStringValue(tagOrProperty, index, defaultValue) {\r\n let value = this.getTagValue(tagOrProperty, defaultValue);\r\n\r\n if (typeof value !== STRING && typeof value !== UNDEFINED) {\r\n value = value.toString();\r\n }\r\n\r\n return InstanceMetadata.getIndexedValue(value, index, defaultValue);\r\n }\r\n\r\n // @TODO: Improve this... (E.g.: blob data)\r\n getFloatValue(tagOrProperty, index, defaultValue) {\r\n let value = this.getTagValue(tagOrProperty, defaultValue);\r\n value = InstanceMetadata.getIndexedValue(value, index, defaultValue);\r\n\r\n if (value instanceof Array) {\r\n value.forEach((val, idx) => {\r\n value[idx] = parseFloat(val);\r\n });\r\n\r\n return value;\r\n }\r\n\r\n return typeof value === STRING ? parseFloat(value) : value;\r\n }\r\n\r\n // @TODO: Improve this... (E.g.: blob data)\r\n getIntValue(tagOrProperty, index, defaultValue) {\r\n let value = this.getTagValue(tagOrProperty, defaultValue);\r\n value = InstanceMetadata.getIndexedValue(value, index, defaultValue);\r\n\r\n if (value instanceof Array) {\r\n value.forEach((val, idx) => {\r\n value[idx] = parseFloat(val);\r\n });\r\n\r\n return value;\r\n }\r\n\r\n return typeof value === STRING ? parseInt(value) : value;\r\n }\r\n\r\n /**\r\n * This function should be overriden by specialized classes in order to allow client libraries or viewers to take advantage of the Study Metadata API.\r\n */\r\n getTagValue(tagOrProperty, defaultValue) {\r\n /**\r\n * Please override this method on a specialized class.\r\n */\r\n throw new OHIFError(\r\n 'InstanceMetadata::getTagValue is not overriden. Please, override it in a specialized class. See OHIFInstanceMetadata for example'\r\n );\r\n }\r\n\r\n /**\r\n * Compares the current instance with another one.\r\n * @param {InstanceMetadata} instance An instance of the InstanceMetadata class.\r\n * @returns {boolean} Returns true if both instances refer to the same instance.\r\n */\r\n equals(instance) {\r\n const self = this;\r\n return instance === self || (instance instanceof InstanceMetadata && instance.getSOPInstanceUID() === self.getSOPInstanceUID());\r\n }\r\n\r\n /**\r\n * Check if the tagOrProperty exists\r\n * @param {String} tagOrProperty tag or property be checked\r\n * @return {Boolean} True if the tag or property exists or false if doesn't\r\n */\r\n tagExists(tagOrProperty) {\r\n /**\r\n * Please override this method\r\n */\r\n throw new OHIFError(\r\n 'InstanceMetadata::tagExists is not overriden. Please, override it in a specialized class. See OHIFInstanceMetadata for example'\r\n );\r\n }\r\n\r\n /**\r\n * Get custom image id of a sop instance\r\n * @return {Any} sop instance image id\r\n */\r\n getImageId(frame) {\r\n /**\r\n * Please override this method\r\n */\r\n throw new OHIFError(\r\n 'InstanceMetadata::getImageId is not overriden. Please, override it in a specialized class. See OHIFInstanceMetadata for example'\r\n );\r\n }\r\n\r\n /**\r\n * Static Methods\r\n */\r\n\r\n /**\r\n * Get an value based that can be index based. This function is called by all getters. See above functions.\r\n * - If value is a String and has indexes:\r\n * - If undefined index: returns an array of the split values.\r\n * - If defined index:\r\n * - If invalid: returns defaultValue\r\n * - If valid: returns the indexed value\r\n * - If value is not a String, returns default value.\r\n */\r\n static getIndexedValue(value, index, defaultValue) {\r\n let result = defaultValue;\r\n\r\n if (typeof value === STRING) {\r\n const hasIndexValues = value.indexOf('\\\\') !== -1;\r\n\r\n result = value;\r\n\r\n if (hasIndexValues) {\r\n const splitValues = value.split('\\\\');\r\n if (Metadata.isValidIndex(index)) {\r\n const indexedValue = splitValues[index];\r\n\r\n result = typeof indexedValue !== STRING ? defaultValue : indexedValue;\r\n } else {\r\n result = splitValues;\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n","import { Metadata } from './Metadata';\r\nimport { InstanceMetadata } from './InstanceMetadata';\r\n\r\nexport class SeriesMetadata extends Metadata {\r\n constructor(data, uid) {\r\n super(data, uid);\r\n // Initialize Private Properties\r\n Object.defineProperties(this, {\r\n _seriesInstanceUID: {\r\n configurable: true, // configurable so that it can be redefined in sub-classes...\r\n enumerable: false,\r\n writable: true,\r\n value: null\r\n },\r\n _instances: {\r\n configurable: false,\r\n enumerable: false,\r\n writable: false,\r\n value: []\r\n },\r\n _firstInstance: {\r\n configurable: false,\r\n enumerable: false,\r\n writable: true,\r\n value: null\r\n }\r\n });\r\n // Initialize Public Properties\r\n this._definePublicProperties();\r\n }\r\n\r\n /**\r\n * Private Methods\r\n */\r\n\r\n /**\r\n * Define Public Properties\r\n * This method should only be called during initialization (inside the class constructor)\r\n */\r\n _definePublicProperties() {\r\n /**\r\n * Property: this.seriesInstanceUID\r\n * Same as this.getSeriesInstanceUID()\r\n * It's specially useful in contexts where a method call is not suitable like in search criteria. For example:\r\n * seriesCollection.findBy({\r\n * seriesInstanceUID: '1.2.3.4.5.6.77777.8888888.99999999999.0'\r\n * });\r\n */\r\n Object.defineProperty(this, 'seriesInstanceUID', {\r\n configurable: false,\r\n enumerable: false,\r\n get: function () {\r\n return this.getSeriesInstanceUID();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Public Methods\r\n */\r\n\r\n /**\r\n * Returns the SeriesInstanceUID of the current series.\r\n */\r\n getSeriesInstanceUID() {\r\n return this._seriesInstanceUID;\r\n }\r\n\r\n /**\r\n * Append an instance to the current series.\r\n * @param {InstanceMetadata} instance The instance to be added to the current series.\r\n * @returns {boolean} Returns true on success, false otherwise.\r\n */\r\n addInstance(instance) {\r\n let result = false;\r\n if (instance instanceof InstanceMetadata && this.getInstanceByUID(instance.getSOPInstanceUID()) === void 0) {\r\n this._instances.push(instance);\r\n result = true;\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Get the first instance of the current series retaining a consistent result across multiple calls.\r\n * @return {InstanceMetadata} An instance of the InstanceMetadata class or null if it does not exist.\r\n */\r\n getFirstInstance() {\r\n let instance = this._firstInstance;\r\n if (!(instance instanceof InstanceMetadata)) {\r\n instance = null;\r\n const found = this.getInstanceByIndex(0);\r\n if (found instanceof InstanceMetadata) {\r\n this._firstInstance = found;\r\n instance = found;\r\n }\r\n }\r\n return instance;\r\n }\r\n\r\n /**\r\n * Find an instance by index.\r\n * @param {number} index An integer representing a list index.\r\n * @returns {InstanceMetadata} Returns a InstanceMetadata instance when found or undefined otherwise.\r\n */\r\n getInstanceByIndex(index) {\r\n let found; // undefined by default...\r\n if (Metadata.isValidIndex(index)) {\r\n found = this._instances[index];\r\n }\r\n return found;\r\n }\r\n\r\n /**\r\n * Find an instance by SOPInstanceUID.\r\n * @param {string} uid An UID string.\r\n * @returns {InstanceMetadata} Returns a InstanceMetadata instance when found or undefined otherwise.\r\n */\r\n getInstanceByUID(uid) {\r\n let found; // undefined by default...\r\n if (Metadata.isValidUID(uid)) {\r\n found = this._instances.find((instance) => {\r\n return instance.getSOPInstanceUID() === uid;\r\n });\r\n }\r\n return found;\r\n }\r\n\r\n /**\r\n * Retrieve the number of instances within the current series.\r\n * @returns {number} The number of instances in the current series.\r\n */\r\n getInstanceCount() {\r\n return this._instances.length;\r\n }\r\n\r\n /**\r\n * Invokes the supplied callback for each instance in the current series passing\r\n * two arguments: instance (an InstanceMetadata instance) and index (the integer\r\n * index of the instance within the current series)\r\n * @param {function} callback The callback function which will be invoked for each instance in the series.\r\n * @returns {undefined} Nothing is returned.\r\n */\r\n forEachInstance(callback) {\r\n if (Metadata.isValidCallback(callback)) {\r\n this._instances.forEach((instance, index) => {\r\n callback.call(null, instance, index);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Find the index of an instance inside the series.\r\n * @param {InstanceMetadata} instance An instance of the SeriesMetadata class.\r\n * @returns {number} The index of the instance inside the series or -1 if not found.\r\n */\r\n indexOfInstance(instance) {\r\n return this._instances.indexOf(instance);\r\n }\r\n\r\n /**\r\n * Search the associated instances using the supplied callback as criteria. The callback is passed\r\n * two arguments: instance (a InstanceMetadata instance) and index (the integer\r\n * index of the instance within its series)\r\n * @param {function} callback The callback function which will be invoked for each instance.\r\n * @returns {InstanceMetadata|undefined} If an instance is found based on callback criteria it\r\n * returns a InstanceMetadata. \"undefined\" is returned otherwise\r\n */\r\n findInstance(callback) {\r\n if (Metadata.isValidCallback(callback)) {\r\n return this._instances.find((instance, index) => {\r\n return callback.call(null, instance, index);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Compares the current series with another one.\r\n * @param {SeriesMetadata} series An instance of the SeriesMetadata class.\r\n * @returns {boolean} Returns true if both instances refer to the same series.\r\n */\r\n equals(series) {\r\n const self = this;\r\n return series === self || (series instanceof SeriesMetadata && series.getSeriesInstanceUID() === self.getSeriesInstanceUID());\r\n }\r\n}\r\n","function _typeof(obj) {\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\n/**\n * Converts a Uint8Array to a String.\n * @param {Uint8Array} array that should be converted\n * @param {Number} offset array offset in case only subset of array items should\n be extracted (default: 0)\n * @param {Number} limit maximum number of array items that should be extracted\n (defaults to length of array)\n * @returns {String}\n */\nfunction uint8ArrayToString(arr) {\n var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var limit = arguments.length > 2 ? arguments[2] : undefined;\n var itemLimit = limit || arr.length - offset;\n var str = \"\";\n\n for (var i = offset; i < offset + itemLimit; i++) {\n str += String.fromCharCode(arr[i]);\n }\n\n return str;\n}\n/**\n * Converts a String to a Uint8Array.\n * @param {String} str string that should be converted\n * @returns {Uint8Array}\n */\n\n\nfunction stringToUint8Array(str) {\n var arr = new Uint8Array(str.length);\n\n for (var i = 0, j = str.length; i < j; i++) {\n arr[i] = str.charCodeAt(i);\n }\n\n return arr;\n}\n/**\n * Identifies the boundary in a multipart/related message header.\n * @param {String} header message header\n * @returns {String} boundary\n */\n\n\nfunction identifyBoundary(header) {\n var parts = header.split(\"\\r\\n\");\n\n for (var i = 0; i < parts.length; i++) {\n if (parts[i].substr(0, 2) === \"--\") {\n return parts[i];\n }\n }\n\n return null;\n}\n/**\n * Checks whether a given token is contained by a message at a given offset.\n * @param {Uint8Array} message message content\n * @param {Uint8Array} token substring that should be present\n * @param {Number} offset offset in message content from where search should start\n * @returns {Boolean} whether message contains token at offset\n */\n\n\nfunction containsToken(message, token) {\n var offset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n\n if (offset + token.length > message.length) {\n return false;\n }\n\n var index = offset;\n\n for (var i = 0; i < token.length; i++) {\n if (token[i] !== message[index]) {\n return false;\n }\n\n index += 1;\n }\n\n return true;\n}\n/**\n * Finds a given token in a message at a given offset.\n * @param {Uint8Array} message message content\n * @param {Uint8Array} token substring that should be found\n * @param {String} offset message body offset from where search should start\n * @returns {Boolean} whether message has a part at given offset or not\n */\n\n\nfunction findToken(message, token) {\n var offset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n var maxSearchLength = arguments.length > 3 ? arguments[3] : undefined;\n var searchLength = message.length;\n\n if (maxSearchLength) {\n searchLength = Math.min(offset + maxSearchLength, message.length);\n }\n\n for (var i = offset; i < searchLength; i++) {\n // If the first value of the message matches\n // the first value of the token, check if\n // this is the full token.\n if (message[i] === token[0]) {\n if (containsToken(message, token, i)) {\n return i;\n }\n }\n }\n\n return -1;\n}\n/**\n * Create a random GUID\n *\n * @return {string}\n */\n\n\nfunction guid() {\n function s4() {\n return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);\n }\n\n return \"\".concat(s4() + s4(), \"-\").concat(s4(), \"-\").concat(s4(), \"-\").concat(s4(), \"-\").concat(s4()).concat(s4()).concat(s4());\n}\n/**\n * @typedef {Object} MultipartEncodedData\n * @property {ArrayBuffer} data The encoded Multipart Data\n * @property {String} boundary The boundary used to divide pieces of the encoded data\n */\n\n/**\n * Encode one or more DICOM datasets into a single body so it can be\n * sent using the Multipart Content-Type.\n *\n * @param {ArrayBuffer[]} datasets Array containing each file to be encoded in the\n multipart body, passed as ArrayBuffers.\n * @param {String} [boundary] Optional string to define a boundary between each part\n of the multipart body. If this is not specified, a random\n GUID will be generated.\n * @return {MultipartEncodedData} The Multipart encoded data returned as an Object. This\n contains both the data itself, and the boundary string\n used to divide it.\n */\n\n\nfunction multipartEncode(datasets) {\n var boundary = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : guid();\n var contentType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"application/dicom\";\n var contentTypeString = \"Content-Type: \".concat(contentType);\n var header = \"\\r\\n--\".concat(boundary, \"\\r\\n\").concat(contentTypeString, \"\\r\\n\\r\\n\");\n var footer = \"\\r\\n--\".concat(boundary, \"--\");\n var headerArray = stringToUint8Array(header);\n var footerArray = stringToUint8Array(footer);\n var headerLength = headerArray.length;\n var footerLength = footerArray.length;\n var length = 0; // Calculate the total length for the final array\n\n var contentArrays = datasets.map(function (datasetBuffer) {\n var contentArray = new Uint8Array(datasetBuffer);\n var contentLength = contentArray.length;\n length += headerLength + contentLength + footerLength;\n return contentArray;\n }); // Allocate the array\n\n var multipartArray = new Uint8Array(length); // Set the initial header\n\n multipartArray.set(headerArray, 0); // Write each dataset into the multipart array\n\n var position = 0;\n contentArrays.forEach(function (contentArray) {\n multipartArray.set(headerArray, position);\n multipartArray.set(contentArray, position + headerLength);\n position += headerLength + contentArray.length;\n });\n multipartArray.set(footerArray, position);\n return {\n data: multipartArray.buffer,\n boundary: boundary\n };\n}\n/**\n * Decode a Multipart encoded ArrayBuffer and return the components as an Array.\n *\n * @param {ArrayBuffer} response Data encoded as a 'multipart/related' message\n * @returns {Array} The content\n */\n\n\nfunction multipartDecode(response) {\n var message = new Uint8Array(response);\n /* Set a maximum length to search for the header boundaries, otherwise\n findToken can run for a long time\n */\n\n var maxSearchLength = 1000; // First look for the multipart mime header\n\n var separator = stringToUint8Array(\"\\r\\n\\r\\n\");\n var headerIndex = findToken(message, separator, 0, maxSearchLength);\n\n if (headerIndex === -1) {\n throw new Error(\"Response message has no multipart mime header\");\n }\n\n var header = uint8ArrayToString(message, 0, headerIndex);\n var boundaryString = identifyBoundary(header);\n\n if (!boundaryString) {\n throw new Error(\"Header of response message does not specify boundary\");\n }\n\n var boundary = stringToUint8Array(boundaryString);\n var boundaryLength = boundary.length;\n var components = [];\n var offset = boundaryLength; // Loop until we cannot find any more boundaries\n\n var boundaryIndex;\n\n while (boundaryIndex !== -1) {\n // Search for the next boundary in the message, starting\n // from the current offset position\n boundaryIndex = findToken(message, boundary, offset); // If no further boundaries are found, stop here.\n\n if (boundaryIndex === -1) {\n break;\n }\n\n var headerTokenIndex = findToken(message, separator, offset, maxSearchLength);\n\n if (headerTokenIndex === -1) {\n throw new Error(\"Response message part has no mime header\");\n }\n\n offset = headerTokenIndex + separator.length; // Extract data from response message, excluding \"\\r\\n\"\n\n var spacingLength = 2;\n var data = response.slice(offset, boundaryIndex - spacingLength); // Add the data to the array of results\n\n components.push(data); // Move the offset to the end of the current section,\n // plus the identified boundary\n\n offset = boundaryIndex + boundaryLength;\n }\n\n return components;\n}\n\nfunction isObject(obj) {\n return _typeof(obj) === \"object\" && obj !== null;\n}\n\nfunction isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && obj.constructor === Object;\n}\n\nvar getFirstResult = function getFirstResult(result) {\n return result[0];\n};\n\nvar getFirstResultIfLengthGtOne = function getFirstResultIfLengthGtOne(result) {\n if (result.length > 1) {\n return result;\n }\n\n return result[0];\n};\n\nvar MEDIATYPES = {\n DICOM: \"application/dicom\",\n DICOM_JSON: \"application/dicom+json\",\n OCTET_STREAM: \"application/octet-stream\",\n PDF: \"application/pdf\",\n JPEG: \"image/jpeg\",\n PNG: \"image/png\"\n};\n/**\n * Class for interacting with DICOMweb RESTful services.\n */\n\nvar DICOMwebClient =\n/*#__PURE__*/\nfunction () {\n /**\n * @constructor\n * @param {Object} options (choices: \"url\", \"username\", \"password\", \"headers\")\n */\n function DICOMwebClient(options) {\n _classCallCheck(this, DICOMwebClient);\n\n this.baseURL = options.url;\n\n if (!this.baseURL) {\n console.error(\"no DICOMweb base url provided - calls will fail\");\n }\n\n if (\"username\" in options) {\n this.username = options.username;\n\n if (!(\"password\" in options)) {\n console.error(\"no password provided to authenticate with DICOMweb service\");\n }\n\n this.password = options.password;\n }\n\n if (\"qidoURLPrefix\" in options) {\n console.log(\"use URL prefix for QIDO-RS: \".concat(options.qidoURLPrefix));\n this.qidoURL = \"\".concat(this.baseURL, \"/\").concat(options.qidoURLPrefix);\n } else {\n this.qidoURL = this.baseURL;\n }\n\n if (\"wadoURLPrefix\" in options) {\n console.log(\"use URL prefix for WADO-RS: \".concat(options.wadoURLPrefix));\n this.wadoURL = \"\".concat(this.baseURL, \"/\").concat(options.wadoURLPrefix);\n } else {\n this.wadoURL = this.baseURL;\n }\n\n if (\"stowURLPrefix\" in options) {\n console.log(\"use URL prefix for STOW-RS: \".concat(options.stowURLPrefix));\n this.stowURL = \"\".concat(this.baseURL, \"/\").concat(options.stowURLPrefix);\n } else {\n this.stowURL = this.baseURL;\n }\n\n this.headers = options.headers || {};\n }\n\n _createClass(DICOMwebClient, [{\n key: \"_httpRequest\",\n value: function _httpRequest(url, method, headers) {\n var _this = this;\n\n var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n return new Promise(function (resolve, reject) {\n var request = new XMLHttpRequest();\n request.open(method, url, true);\n\n if (\"responseType\" in options) {\n request.responseType = options.responseType;\n }\n\n if (_typeof(headers) === \"object\") {\n Object.keys(headers).forEach(function (key) {\n request.setRequestHeader(key, headers[key]);\n });\n } // now add custom headers from the user\n // (e.g. access tokens)\n\n\n var userHeaders = _this.headers;\n Object.keys(userHeaders).forEach(function (key) {\n request.setRequestHeader(key, userHeaders[key]);\n }); // Event triggered when upload starts\n\n request.onloadstart = function onloadstart() {// console.log('upload started: ', url)\n }; // Event triggered when upload ends\n\n\n request.onloadend = function onloadend() {// console.log('upload finished')\n }; // Handle response message\n\n\n request.onreadystatechange = function onreadystatechange() {\n if (request.readyState === 4) {\n if (request.status === 200) {\n resolve(request.response);\n } else if (request.status === 202) {\n console.warn(\"some resources already existed: \", request);\n resolve(request.response);\n } else if (request.status === 204) {\n console.warn(\"empty response for request: \", request);\n resolve([]);\n } else {\n console.error(\"request failed: \", request);\n var error = new Error(\"request failed\");\n error.request = request;\n error.response = request.response;\n error.status = request.status;\n console.error(error);\n console.error(error.response);\n reject(error);\n }\n }\n }; // Event triggered while download progresses\n\n\n if (\"progressCallback\" in options) {\n if (typeof options.progressCallback === \"function\") {\n request.onprogress = options.progressCallback;\n }\n } // request.onprogress = function (event) {\n // const loaded = progress.loaded;\n // let total;\n // let percentComplete;\n // if (progress.lengthComputable) {\n // total = progress.total;\n // percentComplete = Math.round((loaded / total) * 100);\n // j\n // // console.log('download progress: ', percentComplete, ' %');\n // return(percentComplete);\n // };\n\n\n if (\"data\" in options) {\n request.send(options.data);\n } else {\n request.send();\n }\n });\n }\n }, {\n key: \"_httpGet\",\n value: function _httpGet(url, headers, responseType, progressCallback) {\n return this._httpRequest(url, \"get\", headers, {\n responseType: responseType,\n progressCallback: progressCallback\n });\n }\n }, {\n key: \"_httpGetApplicationJson\",\n value: function _httpGetApplicationJson(url) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var progressCallback = arguments.length > 2 ? arguments[2] : undefined;\n var urlWithQueryParams = url;\n\n if (_typeof(params) === \"object\") {\n if (!isEmptyObject(params)) {\n urlWithQueryParams += DICOMwebClient._parseQueryParameters(params);\n }\n }\n\n var headers = {\n Accept: MEDIATYPES.DICOM_JSON\n };\n var responseType = \"json\";\n return this._httpGet(urlWithQueryParams, headers, responseType, progressCallback);\n }\n /**\n * Performs an HTTP GET request that accepts a message with\n \"application/pdf\" media type.\n * @param {String} url\n * @param {Object[]} mediaTypes\n * @param {Object} params\n * @param {Function} progressCallback\n * @return {*}\n * @private\n */\n\n }, {\n key: \"_httpGetApplicationPdf\",\n value: function _httpGetApplicationPdf(url) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var progressCallback = arguments.length > 2 ? arguments[2] : undefined;\n var urlWithQueryParams = url;\n\n if (_typeof(params) === \"object\") {\n if (!isEmptyObject(params)) {\n urlWithQueryParams += DICOMwebClient._parseQueryParameters(params);\n }\n }\n\n var headers = {\n Accept: MEDIATYPES.PDF\n };\n var responseType = \"json\";\n return this._httpGet(urlWithQueryParams, headers, responseType, progressCallback);\n }\n /**\n * Performs an HTTP GET request that accepts a message with an image\n media type.\n *\n * @param {String} url\n * @param {Object[]} mediaTypes\n * @param {Object} params\n * @param {Function} progressCallback\n * @return {*}\n * @private\n */\n\n }, {\n key: \"_httpGetImage\",\n value: function _httpGetImage(url, mediaTypes) {\n var params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var progressCallback = arguments.length > 3 ? arguments[3] : undefined;\n var urlWithQueryParams = url;\n\n if (_typeof(params) === \"object\") {\n if (!isEmptyObject(params)) {\n urlWithQueryParams += DICOMwebClient._parseQueryParameters(params);\n }\n }\n\n var supportedMediaTypes = [\"image/\", \"image/*\", \"image/jpeg\", \"image/jp2\", \"image/gif\", \"image/png\"];\n\n var acceptHeaderFieldValue = DICOMwebClient._buildAcceptHeaderFieldValue(mediaTypes, supportedMediaTypes);\n\n var headers = {\n Accept: acceptHeaderFieldValue\n };\n var responseType = \"arraybuffer\";\n return this._httpGet(urlWithQueryParams, headers, responseType, progressCallback);\n }\n /**\n * Performs an HTTP GET request that accepts a message with a text\n media type.\n *\n * @param {String} url\n * @param {Object[]} mediaTypes\n * @param {Object} params\n * @param {Function} progressCallback\n * @return {*}\n * @private\n */\n\n }, {\n key: \"_httpGetText\",\n value: function _httpGetText(url, mediaTypes) {\n var params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var progressCallback = arguments.length > 3 ? arguments[3] : undefined;\n var urlWithQueryParams = url;\n\n if (_typeof(params) === \"object\") {\n if (!isEmptyObject(params)) {\n urlWithQueryParams += DICOMwebClient._parseQueryParameters(params);\n }\n }\n\n var supportedMediaTypes = [\"text/\", \"text/*\", \"text/html\", \"text/plain\", \"text/rtf\", \"text/xml\"];\n\n var acceptHeaderFieldValue = DICOMwebClient._buildAcceptHeaderFieldValue(mediaTypes, supportedMediaTypes);\n\n var headers = {\n Accept: acceptHeaderFieldValue\n };\n var responseType = \"arraybuffer\";\n return this._httpGet(urlWithQueryParams, headers, responseType, progressCallback);\n }\n /**\n * Performs an HTTP GET request that accepts a message with a video\n media type.\n *\n * @param {String} url\n * @param {Object[]} mediaTypes\n * @param {Object} params\n * @param {Function} progressCallback\n * @return {*}\n * @private\n */\n\n }, {\n key: \"_httpGetVideo\",\n value: function _httpGetVideo(url, mediaTypes) {\n var params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var progressCallback = arguments.length > 3 ? arguments[3] : undefined;\n var urlWithQueryParams = url;\n\n if (_typeof(params) === \"object\") {\n if (!isEmptyObject(params)) {\n urlWithQueryParams += DICOMwebClient._parseQueryParameters(params);\n }\n }\n\n var supportedMediaTypes = [\"video/\", \"video/*\", \"video/mpeg\", \"video/mp4\", \"video/H265\"];\n\n var acceptHeaderFieldValue = DICOMwebClient._buildAcceptHeaderFieldValue(mediaTypes, supportedMediaTypes);\n\n var headers = {\n Accept: acceptHeaderFieldValue\n };\n var responseType = \"arraybuffer\";\n return this._httpGet(urlWithQueryParams, headers, responseType, progressCallback);\n }\n /**\n * Asserts that a given media type is valid.\n *\n * @params {String} mediaType media type\n */\n\n }, {\n key: \"_httpGetMultipartImage\",\n\n /**\n * Performs an HTTP GET request that accepts a multipart message with an image media type.\n *\n * @param {String} url unique resource locator\n * @param {Object[]} mediaTypes acceptable media types and optionally the UIDs of the\n corresponding transfer syntaxes\n * @param {Array} byteRange start and end of byte range\n * @param {Object} params additional HTTP GET query parameters\n * @param {Boolean} rendered whether resource should be requested using rendered media types\n * @param {Function} progressCallback\n * @private\n * @returns {Array} content of HTTP message body parts\n */\n value: function _httpGetMultipartImage(url, mediaTypes, byteRange, params) {\n var rendered = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n var progressCallback = arguments.length > 5 ? arguments[5] : undefined;\n var headers = {};\n var supportedMediaTypes;\n\n if (rendered) {\n supportedMediaTypes = [\"image/jpeg\", \"image/gif\", \"image/png\", \"image/jp2\"];\n } else {\n supportedMediaTypes = {\n \"1.2.840.10008.1.2.5\": [\"image/x-dicom-rle\"],\n \"1.2.840.10008.1.2.4.50\": [\"image/jpeg\"],\n \"1.2.840.10008.1.2.4.51\": [\"image/jpeg\"],\n \"1.2.840.10008.1.2.4.57\": [\"image/jpeg\"],\n \"1.2.840.10008.1.2.4.70\": [\"image/jpeg\"],\n \"1.2.840.10008.1.2.4.80\": [\"image/x-jls\", \"image/jls\"],\n \"1.2.840.10008.1.2.4.81\": [\"image/x-jls\", \"image/jls\"],\n \"1.2.840.10008.1.2.4.90\": [\"image/jp2\"],\n \"1.2.840.10008.1.2.4.91\": [\"image/jp2\"],\n \"1.2.840.10008.1.2.4.92\": [\"image/jpx\"],\n \"1.2.840.10008.1.2.4.93\": [\"image/jpx\"]\n };\n\n if (byteRange) {\n headers.Range = DICOMwebClient._buildRangeHeaderFieldValue(byteRange);\n }\n }\n\n headers.Accept = DICOMwebClient._buildMultipartAcceptHeaderFieldValue(mediaTypes, supportedMediaTypes);\n return this._httpGet(url, headers, \"arraybuffer\", progressCallback).then(multipartDecode);\n }\n /**\n * Performs an HTTP GET request that accepts a multipart message with a video media type.\n *\n * @param {String} url unique resource locator\n * @param {Object[]} mediaTypes acceptable media types and optionally the UIDs of the\n corresponding transfer syntaxes\n * @param {Array} byteRange start and end of byte range\n * @param {Object} params additional HTTP GET query parameters\n * @param {Boolean} rendered whether resource should be requested using rendered media types\n * @param {Function} progressCallback\n * @private\n * @returns {Array} content of HTTP message body parts\n */\n\n }, {\n key: \"_httpGetMultipartVideo\",\n value: function _httpGetMultipartVideo(url, mediaTypes, byteRange, params) {\n var rendered = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n var progressCallback = arguments.length > 5 ? arguments[5] : undefined;\n var headers = {};\n var supportedMediaTypes;\n\n if (rendered) {\n supportedMediaTypes = [\"video/\", \"video/*\", \"video/mpeg2\", \"video/mp4\", \"video/H265\"];\n } else {\n supportedMediaTypes = {\n \"1.2.840.10008.1.2.4.100\": [\"video/mpeg2\"],\n \"1.2.840.10008.1.2.4.101\": [\"video/mpeg2\"],\n \"1.2.840.10008.1.2.4.102\": [\"video/mp4\"],\n \"1.2.840.10008.1.2.4.103\": [\"video/mp4\"],\n \"1.2.840.10008.1.2.4.104\": [\"video/mp4\"],\n \"1.2.840.10008.1.2.4.105\": [\"video/mp4\"],\n \"1.2.840.10008.1.2.4.106\": [\"video/mp4\"]\n };\n\n if (byteRange) {\n headers.Range = DICOMwebClient._buildRangeHeaderFieldValue(byteRange);\n }\n }\n\n headers.Accept = DICOMwebClient._buildMultipartAcceptHeaderFieldValue(mediaTypes, supportedMediaTypes);\n return this._httpGet(url, headers, \"arraybuffer\", progressCallback).then(multipartDecode);\n }\n /**\n * Performs a HTTP GET request that accepts a multipart message with \"application/dicom\" media type\n *\n * @param {String} url unique resource locator\n * @param {Object[]} mediaTypes acceptable media types and optionally the UIDs of the\n corresponding transfer syntaxes\n * @param {Object} params additional HTTP GET query parameters\n * @param {Function} progressCallback\n * @private\n * @returns {Array} content of HTTP message body parts\n */\n\n }, {\n key: \"_httpGetMultipartApplicationDicom\",\n value: function _httpGetMultipartApplicationDicom(url, mediaTypes, params, progressCallback) {\n var headers = {};\n var defaultMediaType = \"application/dicom\";\n var supportedMediaTypes = {\n \"1.2.840.10008.1.2.1\": [defaultMediaType],\n \"1.2.840.10008.1.2.5\": [defaultMediaType],\n \"1.2.840.10008.1.2.4.50\": [defaultMediaType],\n \"1.2.840.10008.1.2.4.51\": [defaultMediaType],\n \"1.2.840.10008.1.2.4.57\": [defaultMediaType],\n \"1.2.840.10008.1.2.4.70\": [defaultMediaType],\n \"1.2.840.10008.1.2.4.80\": [defaultMediaType],\n \"1.2.840.10008.1.2.4.81\": [defaultMediaType],\n \"1.2.840.10008.1.2.4.90\": [defaultMediaType],\n \"1.2.840.10008.1.2.4.91\": [defaultMediaType],\n \"1.2.840.10008.1.2.4.92\": [defaultMediaType],\n \"1.2.840.10008.1.2.4.93\": [defaultMediaType],\n \"1.2.840.10008.1.2.4.100\": [defaultMediaType],\n \"1.2.840.10008.1.2.4.101\": [defaultMediaType],\n \"1.2.840.10008.1.2.4.102\": [defaultMediaType],\n \"1.2.840.10008.1.2.4.103\": [defaultMediaType],\n \"1.2.840.10008.1.2.4.104\": [defaultMediaType],\n \"1.2.840.10008.1.2.4.105\": [defaultMediaType],\n \"1.2.840.10008.1.2.4.106\": [defaultMediaType]\n };\n var acceptableMediaTypes = mediaTypes;\n\n if (!mediaTypes) {\n acceptableMediaTypes = [{\n mediaType: defaultMediaType\n }];\n }\n\n headers.Accept = DICOMwebClient._buildMultipartAcceptHeaderFieldValue(acceptableMediaTypes, supportedMediaTypes);\n return this._httpGet(url, headers, \"arraybuffer\", progressCallback).then(multipartDecode);\n }\n /**\n * Performs a HTTP GET request that accepts a multipart message with \"application/octet-stream\" media type\n *\n * @param {String} url unique resource locator\n * @param {Object[]} mediaTypes acceptable media types and optionally the UIDs of the\n corresponding transfer syntaxes\n * @param {Array} byteRange start and end of byte range\n * @param {Object} params additional HTTP GET query parameters\n * @param {Function} progressCallback\n * @private\n * @returns {Array} content of HTTP message body parts\n */\n\n }, {\n key: \"_httpGetMultipartApplicationOctetStream\",\n value: function _httpGetMultipartApplicationOctetStream(url, mediaTypes, byteRange, params, progressCallback) {\n var headers = {};\n var defaultMediaType = \"application/octet-stream\";\n var supportedMediaTypes = {\n \"1.2.840.10008.1.2.1\": [defaultMediaType]\n };\n var acceptableMediaTypes = mediaTypes;\n\n if (!mediaTypes) {\n acceptableMediaTypes = [{\n mediaType: defaultMediaType\n }];\n }\n\n if (byteRange) {\n headers.Range = DICOMwebClient._buildRangeHeaderFieldValue(byteRange);\n }\n\n headers.Accept = DICOMwebClient._buildMultipartAcceptHeaderFieldValue(acceptableMediaTypes, supportedMediaTypes);\n return this._httpGet(url, headers, \"arraybuffer\", progressCallback).then(multipartDecode);\n }\n }, {\n key: \"_httpPost\",\n value: function _httpPost(url, headers, data, progressCallback) {\n return this._httpRequest(url, \"post\", headers, {\n data: data,\n progressCallback: progressCallback\n });\n }\n }, {\n key: \"_httpPostApplicationJson\",\n value: function _httpPostApplicationJson(url, data, progressCallback) {\n var headers = {\n \"Content-Type\": MEDIATYPES.DICOM_JSON\n };\n return this._httpPost(url, headers, data, progressCallback);\n }\n /**\n * Parses media type and extracts its type and subtype.\n *\n * @param mediaType e.g. image/jpeg\n * @private\n */\n\n }, {\n key: \"searchForStudies\",\n\n /**\n * Searches for DICOM studies.\n * @param {Object} options options object\n * @return {Array} study representations (http://dicom.nema.org/medical/dicom/current/output/chtml/part18/sect_6.7.html#table_6.7.1-2)\n */\n value: function searchForStudies() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n console.log(\"search for studies\");\n var url = \"\".concat(this.qidoURL, \"/studies\");\n\n if (\"queryParams\" in options) {\n url += DICOMwebClient._parseQueryParameters(options.queryParams);\n }\n\n return this._httpGetApplicationJson(url);\n }\n /**\n * Retrieves metadata for a DICOM study.\n * @param {Object} options options object\n * @returns {Array} metadata elements in DICOM JSON format for each instance\n belonging to the study\n */\n\n }, {\n key: \"retrieveStudyMetadata\",\n value: function retrieveStudyMetadata(options) {\n if (!(\"studyInstanceUID\" in options)) {\n throw new Error(\"Study Instance UID is required for retrieval of study metadata\");\n }\n\n console.log(\"retrieve metadata of study \".concat(options.studyInstanceUID));\n var url = \"\".concat(this.wadoURL, \"/studies/\").concat(options.studyInstanceUID, \"/metadata\");\n return this._httpGetApplicationJson(url);\n }\n /**\n * Searches for DICOM series.\n * @param {Object} options options object\n * @returns {Array} series representations (http://dicom.nema.org/medical/dicom/current/output/chtml/part18/sect_6.7.html#table_6.7.1-2a)\n */\n\n }, {\n key: \"searchForSeries\",\n value: function searchForSeries() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var url = this.qidoURL;\n\n if (\"studyInstanceUID\" in options) {\n console.log(\"search series of study \".concat(options.studyInstanceUID));\n url += \"/studies/\".concat(options.studyInstanceUID);\n }\n\n url += \"/series\";\n\n if (\"queryParams\" in options) {\n url += DICOMwebClient._parseQueryParameters(options.queryParams);\n }\n\n return this._httpGetApplicationJson(url);\n }\n /**\n * Retrieves metadata for a DICOM series.\n * @param {Object} options options object\n * @returns {Array} metadata elements in DICOM JSON format for each instance\n belonging to the series\n */\n\n }, {\n key: \"retrieveSeriesMetadata\",\n value: function retrieveSeriesMetadata(options) {\n if (!(\"studyInstanceUID\" in options)) {\n throw new Error(\"Study Instance UID is required for retrieval of series metadata\");\n }\n\n if (!(\"seriesInstanceUID\" in options)) {\n throw new Error(\"Series Instance UID is required for retrieval of series metadata\");\n }\n\n console.log(\"retrieve metadata of series \".concat(options.seriesInstanceUID));\n var url = \"\".concat(this.wadoURL, \"/studies/\").concat(options.studyInstanceUID, \"/series/\").concat(options.seriesInstanceUID, \"/metadata\");\n return this._httpGetApplicationJson(url);\n }\n /**\n * Searches for DICOM instances.\n * @param {Object} options options object\n * @returns {Array} instance representations (http://dicom.nema.org/medical/dicom/current/output/chtml/part18/sect_6.7.html#table_6.7.1-2b)\n */\n\n }, {\n key: \"searchForInstances\",\n value: function searchForInstances() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var url = this.qidoURL;\n\n if (\"studyInstanceUID\" in options) {\n url += \"/studies/\".concat(options.studyInstanceUID);\n\n if (\"seriesInstanceUID\" in options) {\n console.log(\"search for instances of series \".concat(options.seriesInstanceUID));\n url += \"/series/\".concat(options.seriesInstanceUID);\n } else {\n console.log(\"search for instances of study \".concat(options.studyInstanceUID));\n }\n } else {\n console.log(\"search for instances\");\n }\n\n url += \"/instances\";\n\n if (\"queryParams\" in options) {\n url += DICOMwebClient._parseQueryParameters(options.queryParams);\n }\n\n return this._httpGetApplicationJson(url);\n }\n /** Returns a WADO-URI URL for an instance\n * @param {Object} options options object\n * @returns {String} WADO-URI URL\n */\n\n }, {\n key: \"buildInstanceWadoURIUrl\",\n value: function buildInstanceWadoURIUrl(options) {\n if (!(\"studyInstanceUID\" in options)) {\n throw new Error(\"Study Instance UID is required.\");\n }\n\n if (!(\"seriesInstanceUID\" in options)) {\n throw new Error(\"Series Instance UID is required.\");\n }\n\n if (!(\"sopInstanceUID\" in options)) {\n throw new Error(\"SOP Instance UID is required.\");\n }\n\n var contentType = options.contentType || MEDIATYPES.DICOM;\n var transferSyntax = options.transferSyntax || \"*\";\n var params = [];\n params.push(\"requestType=WADO\");\n params.push(\"studyUID=\".concat(options.studyInstanceUID));\n params.push(\"seriesUID=\".concat(options.seriesInstanceUID));\n params.push(\"objectUID=\".concat(options.sopInstanceUID));\n params.push(\"contentType=\".concat(contentType));\n params.push(\"transferSyntax=\".concat(transferSyntax));\n var paramString = params.join(\"&\");\n return \"\".concat(this.wadoURL, \"?\").concat(paramString);\n }\n /**\n * Retrieves metadata for a DICOM instance.\n *\n * @param {Object} options object\n * @returns {Object} metadata elements in DICOM JSON format\n */\n\n }, {\n key: \"retrieveInstanceMetadata\",\n value: function retrieveInstanceMetadata(options) {\n if (!(\"studyInstanceUID\" in options)) {\n throw new Error(\"Study Instance UID is required for retrieval of instance metadata\");\n }\n\n if (!(\"seriesInstanceUID\" in options)) {\n throw new Error(\"Series Instance UID is required for retrieval of instance metadata\");\n }\n\n if (!(\"sopInstanceUID\" in options)) {\n throw new Error(\"SOP Instance UID is required for retrieval of instance metadata\");\n }\n\n console.log(\"retrieve metadata of instance \".concat(options.sopInstanceUID));\n var url = \"\".concat(this.wadoURL, \"/studies/\").concat(options.studyInstanceUID, \"/series/\").concat(options.seriesInstanceUID, \"/instances/\").concat(options.sopInstanceUID, \"/metadata\");\n return this._httpGetApplicationJson(url);\n }\n /**\n * Retrieves frames for a DICOM instance.\n * @param {Object} options options object\n * @returns {Array} frame items as byte arrays of the pixel data element\n */\n\n }, {\n key: \"retrieveInstanceFrames\",\n value: function retrieveInstanceFrames(options) {\n if (!(\"studyInstanceUID\" in options)) {\n throw new Error(\"Study Instance UID is required for retrieval of instance frames\");\n }\n\n if (!(\"seriesInstanceUID\" in options)) {\n throw new Error(\"Series Instance UID is required for retrieval of instance frames\");\n }\n\n if (!(\"sopInstanceUID\" in options)) {\n throw new Error(\"SOP Instance UID is required for retrieval of instance frames\");\n }\n\n if (!(\"frameNumbers\" in options)) {\n throw new Error(\"frame numbers are required for retrieval of instance frames\");\n }\n\n console.log(\"retrieve frames \".concat(options.frameNumbers.toString(), \" of instance \").concat(options.sopInstanceUID));\n var url = \"\".concat(this.wadoURL, \"/studies/\").concat(options.studyInstanceUID, \"/series/\").concat(options.seriesInstanceUID, \"/instances/\").concat(options.sopInstanceUID, \"/frames/\").concat(options.frameNumbers.toString());\n var mediaTypes = options.mediaTypes;\n\n if (!mediaTypes) {\n return this._httpGetMultipartApplicationOctetStream(url);\n }\n\n var commonMediaType = DICOMwebClient._getCommonMediaType(mediaTypes);\n\n if (commonMediaType === MEDIATYPES.OCTET_STREAM) {\n return this._httpGetMultipartApplicationOctetStream(url, mediaTypes);\n } else if (commonMediaType.startsWith(\"image\")) {\n return this._httpGetMultipartImage(url, mediaTypes);\n } else if (commonMediaType.startsWith(\"video\")) {\n return this._httpGetMultipartVideo(url, mediaTypes);\n }\n\n throw new Error(\"Media type \".concat(commonMediaType, \" is not supported for retrieval of frames.\"));\n }\n /**\n * Retrieves an individual, server-side rendered DICOM instance.\n *\n * @param {Object} options options object\n * @returns {Array} frame items as byte arrays of the pixel data element\n */\n\n }, {\n key: \"retrieveInstanceRendered\",\n value: function retrieveInstanceRendered(options) {\n if (!(\"studyInstanceUID\" in options)) {\n throw new Error(\"Study Instance UID is required for retrieval of rendered instance\");\n }\n\n if (!(\"seriesInstanceUID\" in options)) {\n throw new Error(\"Series Instance UID is required for retrieval of rendered instance\");\n }\n\n if (!(\"sopInstanceUID\" in options)) {\n throw new Error(\"SOP Instance UID is required for retrieval of rendered instance\");\n }\n\n var url = \"\".concat(this.wadoURL, \"/studies/\").concat(options.studyInstanceUID, \"/series/\").concat(options.seriesInstanceUID, \"/instances/\").concat(options.sopInstanceUID, \"/rendered\");\n var mediaTypes = options.mediaTypes,\n params = options.params;\n var headers = {};\n\n if (!mediaTypes) {\n var responseType = \"arraybuffer\";\n return this._httpGet(url, headers, responseType);\n }\n\n var commonMediaType = DICOMwebClient._getCommonMediaType(mediaTypes);\n\n if (commonMediaType.startsWith(\"image\")) {\n return this._httpGetImage(url, mediaTypes, params);\n } else if (commonMediaType.startsWith(\"video\")) {\n return this._httpGetVideo(url, mediaTypes, params);\n } else if (commonMediaType.startsWith(\"text\")) {\n return this._httpGetText(url, mediaTypes, params);\n } else if (commonMediaType === MEDIATYPES.PDF) {\n return this._httpGetApplicationPdf(url, params);\n }\n\n throw new Error(\"Media type \".concat(commonMediaType, \" is not supported for retrieval of rendered instance.\"));\n }\n /**\n * Retrieves rendered frames for a DICOM instance.\n * @param {Object} options options object\n * @returns {Array} frame items as byte arrays of the pixel data element\n */\n\n }, {\n key: \"retrieveInstanceFramesRendered\",\n value: function retrieveInstanceFramesRendered(options) {\n if (!(\"studyInstanceUID\" in options)) {\n throw new Error(\"Study Instance UID is required for retrieval of rendered instance frames\");\n }\n\n if (!(\"seriesInstanceUID\" in options)) {\n throw new Error(\"Series Instance UID is required for retrieval of rendered instance frames\");\n }\n\n if (!(\"sopInstanceUID\" in options)) {\n throw new Error(\"SOP Instance UID is required for retrieval of rendered instance frames\");\n }\n\n if (!(\"frameNumbers\" in options)) {\n throw new Error(\"frame numbers are required for retrieval of rendered instance frames\");\n }\n\n console.debug(\"retrieve rendered frames \".concat(options.frameNumbers.toString(), \" of instance \").concat(options.sopInstanceUID));\n var url = \"\".concat(this.wadoURL, \"/studies/\").concat(options.studyInstanceUID, \"/series/\").concat(options.seriesInstanceUID, \"/instances/\").concat(options.sopInstanceUID, \"/frames/\").concat(options.frameNumbers.toString(), \"/rendered\");\n var mediaTypes = options.mediaTypes;\n var headers = {};\n\n if (!mediaTypes) {\n var responseType = \"arraybuffer\";\n return this._httpGet(url, headers, responseType);\n }\n\n var commonMediaType = DICOMwebClient._getCommonMediaType(mediaTypes);\n\n if (commonMediaType.startsWith(\"image\")) {\n return this._httpGetImage(url, mediaTypes);\n } else if (commonMediaType.startsWith(\"video\")) {\n return this._httpGetVideo(url, mediaTypes);\n }\n\n throw new Error(\"Media type \".concat(commonMediaType, \" is not supported for retrieval of rendered frame.\"));\n }\n /**\n * Retrieves a DICOM instance.\n * @param {Object} options options object\n * @returns {ArrayBuffer} DICOM Part 10 file as Arraybuffer\n */\n\n }, {\n key: \"retrieveInstance\",\n value: function retrieveInstance(options) {\n if (!(\"studyInstanceUID\" in options)) {\n throw new Error(\"Study Instance UID is required\");\n }\n\n if (!(\"seriesInstanceUID\" in options)) {\n throw new Error(\"Series Instance UID is required\");\n }\n\n if (!(\"sopInstanceUID\" in options)) {\n throw new Error(\"SOP Instance UID is required\");\n }\n\n var url = \"\".concat(this.wadoURL, \"/studies/\").concat(options.studyInstanceUID, \"/series/\").concat(options.seriesInstanceUID, \"/instances/\").concat(options.sopInstanceUID);\n var mediaTypes = options.mediaTypes;\n\n if (!mediaTypes) {\n return this._httpGetMultipartApplicationDicom(url).then(getFirstResult);\n }\n\n var commonMediaType = DICOMwebClient._getCommonMediaType(mediaTypes);\n\n if (commonMediaType === MEDIATYPES.DICOM) {\n return this._httpGetMultipartApplicationDicom(url, mediaTypes).then(getFirstResult);\n } else if (commonMediaType === MEDIATYPES.OCTET_STREAM) {\n return this._httpGetMultipartApplicationOctetStream(url, mediaTypes).then(getFirstResult);\n } else if (commonMediaType.startsWith(\"image\")) {\n return this._httpGetMultipartImage(url, mediaTypes).then(getFirstResultIfLengthGtOne);\n } else if (commonMediaType.startsWith(\"video\")) {\n return this._httpGetMultipartVideo(url, mediaTypes).then(getFirstResultIfLengthGtOne);\n }\n\n throw new Error(\"Media type \".concat(commonMediaType, \" is not supported for retrieval of instance.\"));\n }\n /**\n * Retrieves a set of DICOM instance for a series.\n * @param {Object} options options object\n * @returns {ArrayBuffer[]} Array of DICOM Part 10 files as Arraybuffers\n */\n\n }, {\n key: \"retrieveSeries\",\n value: function retrieveSeries(options) {\n if (!(\"studyInstanceUID\" in options)) {\n throw new Error(\"Study Instance UID is required\");\n }\n\n if (!(\"seriesInstanceUID\" in options)) {\n throw new Error(\"Series Instance UID is required\");\n }\n\n var url = \"\".concat(this.wadoURL, \"/studies/\").concat(options.studyInstanceUID, \"/series/\").concat(options.seriesInstanceUID);\n var mediaTypes = options.mediaTypes;\n\n if (!mediaTypes) {\n return this._httpGetMultipartApplicationDicom(url);\n }\n\n var commonMediaType = DICOMwebClient._getCommonMediaType(mediaTypes);\n\n if (commonMediaType === MEDIATYPES.DICOM) {\n return this._httpGetMultipartApplicationDicom(url, mediaTypes);\n } else if (commonMediaType === MEDIATYPES.OCTET_STREAM) {\n return this._httpGetMultipartApplicationOctetStream(url, mediaTypes);\n } else if (commonMediaType.startsWith(\"image\")) {\n return this._httpGetMultipartImage(url, mediaTypes);\n } else if (commonMediaType.startsWith(\"video\")) {\n return this._httpGetMultipartVideo(url, mediaTypes);\n }\n\n throw new Error(\"Media type \".concat(commonMediaType, \" is not supported for retrieval of series.\"));\n }\n /**\n * Retrieves a set of DICOM instance for a study.\n * @param {Object} options options object\n * @returns {ArrayBuffer[]} Array of DICOM Part 10 files as Arraybuffers\n */\n\n }, {\n key: \"retrieveStudy\",\n value: function retrieveStudy(options) {\n if (!(\"studyInstanceUID\" in options)) {\n throw new Error(\"Study Instance UID is required\");\n }\n\n var url = \"\".concat(this.wadoURL, \"/studies/\").concat(options.studyInstanceUID);\n var mediaTypes = options.mediaTypes;\n\n if (!mediaTypes) {\n return this._httpGetMultipartApplicationDicom(url);\n }\n\n var commonMediaType = DICOMwebClient._getCommonMediaType(mediaTypes);\n\n if (commonMediaType === MEDIATYPES.DICOM) {\n return this._httpGetMultipartApplicationDicom(url, mediaTypes);\n } else if (commonMediaType === MEDIATYPES.OCTET_STREAM) {\n return this._httpGetMultipartApplicationOctetStream(url, mediaTypes);\n } else if (commonMediaType.startsWith(\"image\")) {\n return this._httpGetMultipartImage(url, mediaTypes);\n } else if (commonMediaType.startsWith(\"video\")) {\n return this._httpGetMultipartVideo(url, mediaTypes);\n }\n\n throw new Error(\"Media type \".concat(commonMediaType, \" is not supported for retrieval of study.\"));\n }\n /**\n * Retrieves and parses BulkData from a BulkDataURI location.\n * Decodes the multipart encoded data and returns the resulting data\n * as an ArrayBuffer.\n *\n * See http://dicom.nema.org/medical/dicom/current/output/chtml/part18/sect_6.5.5.html\n *\n * @param {Object} options options object\n * @return {Promise}\n */\n\n }, {\n key: \"retrieveBulkData\",\n value: function retrieveBulkData(options) {\n if (!(\"BulkDataURI\" in options)) {\n throw new Error(\"BulkDataURI is required.\");\n }\n\n var url = options.BulkDataURI;\n var mediaTypes = options.mediaTypes,\n byteRange = options.byteRange;\n\n if (!mediaTypes) {\n return this._httpGetMultipartApplicationOctetStream(url, mediaTypes, byteRange);\n }\n\n var commonMediaType = DICOMwebClient._getCommonMediaType(mediaTypes);\n\n if (commonMediaType === MEDIATYPES.OCTET_STREAM) {\n return this._httpGetMultipartApplicationOctetStream(url, mediaTypes, byteRange);\n } else if (commonMediaType.startsWith(\"image\")) {\n return this._httpGetMultipartImage(url, mediaTypes, byteRange);\n }\n\n throw new Error(\"Media type \".concat(commonMediaType, \" is not supported for retrieval of bulk data.\"));\n }\n /**\n * Stores DICOM instances.\n *\n * @param {Object} options options object\n */\n\n }, {\n key: \"storeInstances\",\n value: function storeInstances(options) {\n if (!(\"datasets\" in options)) {\n throw new Error(\"datasets are required for storing\");\n }\n\n var url = \"\".concat(this.stowURL, \"/studies\");\n\n if (\"studyInstanceUID\" in options) {\n url += \"/\".concat(options.studyInstanceUID);\n }\n\n var _multipartEncode = multipartEncode(options.datasets),\n data = _multipartEncode.data,\n boundary = _multipartEncode.boundary;\n\n var headers = {\n \"Content-Type\": \"multipart/related; type=application/dicom; boundary=\".concat(boundary)\n };\n return this._httpPost(url, headers, data, options.progressCallback);\n }\n }], [{\n key: \"_parseQueryParameters\",\n value: function _parseQueryParameters() {\n var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var queryString = \"?\";\n Object.keys(params).forEach(function (key, index) {\n if (index !== 0) {\n queryString += \"&\";\n }\n\n queryString += \"\".concat(key, \"=\").concat(encodeURIComponent(params[key]));\n });\n return queryString;\n }\n }, {\n key: \"_assertMediaTypeIsValid\",\n value: function _assertMediaTypeIsValid(mediaType) {\n if (!mediaType) {\n throw new Error(\"Not a valid media type: \".concat(mediaType));\n }\n\n var sepIndex = mediaType.indexOf(\"/\");\n\n if (sepIndex === -1) {\n throw new Error(\"Not a valid media type: \".concat(mediaType));\n }\n\n var mediaTypeType = mediaType.slice(0, sepIndex);\n var types = [\"application\", \"image\", \"text\", \"video\"];\n\n if (!types.includes(mediaTypeType)) {\n throw new Error(\"Not a valid media type: \".concat(mediaType));\n }\n\n if (mediaType.slice(sepIndex + 1).includes(\"/\")) {\n throw new Error(\"Not a valid media type: \".concat(mediaType));\n }\n }\n }, {\n key: \"_parseMediaType\",\n value: function _parseMediaType(mediaType) {\n DICOMwebClient._assertMediaTypeIsValid(mediaType);\n\n return mediaType.split(\"/\");\n }\n /**\n * Builds an accept header field value for HTTP GET request messages.\n *\n * @param {Object[]} mediaTypes Acceptable media types\n * @param {Object[]} supportedMediaTypes Supported media types\n * @return {*}\n * @private\n */\n\n }, {\n key: \"_buildAcceptHeaderFieldValue\",\n value: function _buildAcceptHeaderFieldValue(mediaTypes, supportedMediaTypes) {\n if (!Array.isArray(mediaTypes)) {\n throw new Error(\"Acceptable media types must be provided as an Array\");\n }\n\n var fieldValueParts = mediaTypes.map(function (item) {\n var mediaType = item.mediaType;\n\n DICOMwebClient._assertMediaTypeIsValid(mediaType);\n\n if (!supportedMediaTypes.includes(mediaType)) {\n throw new Error(\"Media type \".concat(mediaType, \" is not supported for requested resource\"));\n }\n\n return mediaType;\n });\n return fieldValueParts.join(\", \");\n }\n /**\n * Builds an accept header field value for HTTP GET multipart request\n messages.\n *\n * @param {Object[]} mediaTypes Acceptable media types\n * @param {Object[]} supportedMediaTypes Supported media types\n * @private\n */\n\n }, {\n key: \"_buildMultipartAcceptHeaderFieldValue\",\n value: function _buildMultipartAcceptHeaderFieldValue(mediaTypes, supportedMediaTypes) {\n if (!Array.isArray(mediaTypes)) {\n throw new Error(\"Acceptable media types must be provided as an Array\");\n }\n\n if (!Array.isArray(supportedMediaTypes) && !isObject(supportedMediaTypes)) {\n throw new Error(\"Supported media types must be provided as an Array or an Object\");\n }\n\n var fieldValueParts = [];\n mediaTypes.forEach(function (item) {\n var transferSyntaxUID = item.transferSyntaxUID,\n mediaType = item.mediaType;\n\n DICOMwebClient._assertMediaTypeIsValid(mediaType);\n\n var fieldValue = \"multipart/related; type=\\\"\".concat(mediaType, \"\\\"\");\n\n if (isObject(supportedMediaTypes)) {\n // SupportedMediaTypes is a lookup table that maps Transfer Syntax UID\n // to one or more Media Types\n if (!Object.values(supportedMediaTypes).flat(1).includes(mediaType)) {\n if (!mediaType.endsWith(\"/*\") || !mediaType.endsWith(\"/\")) {\n throw new Error(\"Media type \".concat(mediaType, \" is not supported for requested resource\"));\n }\n }\n\n if (transferSyntaxUID) {\n if (transferSyntaxUID !== \"*\") {\n if (!Object.keys(supportedMediaTypes).includes(transferSyntaxUID)) {\n throw new Error(\"Transfer syntax \".concat(transferSyntaxUID, \" is not supported for requested resource\"));\n }\n\n var expectedMediaTypes = supportedMediaTypes[transferSyntaxUID];\n\n if (!expectedMediaTypes.includes(mediaType)) {\n var actualType = DICOMwebClient._parseMediaType(mediaType)[0];\n\n expectedMediaTypes.map(function (expectedMediaType) {\n var expectedType = DICOMwebClient._parseMediaType(expectedMediaType)[0];\n\n var haveSameType = actualType === expectedType;\n\n if (haveSameType && (mediaType.endsWith(\"/*\") || mediaType.endsWith(\"/\"))) {\n return;\n }\n\n throw new Error(\"Transfer syntax \".concat(transferSyntaxUID, \" is not supported for requested resource\"));\n });\n }\n }\n\n fieldValue += \"; transfer-syntax=\".concat(transferSyntaxUID);\n }\n } else if (Array.isArray(supportedMediaTypes) && !supportedMediaTypes.includes(mediaType)) {\n throw new Error(\"Media type \".concat(mediaType, \" is not supported for requested resource\"));\n }\n\n fieldValueParts.push(fieldValue);\n });\n return fieldValueParts.join(\", \");\n }\n /**\n * Builds a range header field value for HTTP GET request messages.\n *\n * @param {Array} byteRange start and end of byte range\n * @returns {String} range header field value\n */\n\n }, {\n key: \"_buildRangeHeaderFieldValue\",\n value: function _buildRangeHeaderFieldValue() {\n var byteRange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n\n if (byteRange.length === 1) {\n return \"bytes=\".concat(byteRange[0], \"-\");\n }\n\n if (byteRange.length === 2) {\n return \"bytes=\".concat(byteRange[0], \"-\").concat(byteRange[1]);\n }\n\n return \"bytes=0-\";\n }\n /**\n * Gets common type of acceptable media types and asserts that only\n one type is specified. For example, ``(\"image/jpeg\", \"image/jp2\")``\n will pass, but ``(\"image/jpeg\", \"video/mpeg2\")`` will raise an\n exception.\n * @param {String[]} acceptable media types and optionally the UIDs of the\n corresponding transfer syntaxes\n *\n */\n\n }, {\n key: \"_getCommonMediaType\",\n value: function _getCommonMediaType(mediaTypes) {\n if (!mediaTypes || !mediaTypes.length) {\n throw new Error(\"No acceptable media types provided\");\n }\n\n var commonMediaTypes = new Set();\n mediaTypes.forEach(function (item) {\n var mediaType = item.mediaType;\n\n if (mediaType.startsWith(\"application\")) {\n commonMediaTypes.add(mediaType);\n } else {\n var type = DICOMwebClient._parseMediaType(mediaType)[0];\n\n commonMediaTypes.add(\"\".concat(type, \"/\"));\n }\n });\n\n if (commonMediaTypes.size === 0) {\n throw new Error(\"No common acceptable media type could be identified.\");\n } else if (commonMediaTypes.size > 1) {\n throw new Error(\"Acceptable media types must have the same type.\");\n }\n\n return Array.from(commonMediaTypes)[0];\n }\n }]);\n\n return DICOMwebClient;\n}();\n\nfunction findSubstring(str, before, after) {\n var beforeIndex = str.lastIndexOf(before) + before.length;\n\n if (beforeIndex < before.length) {\n return null;\n }\n\n if (after !== undefined) {\n var afterIndex = str.lastIndexOf(after);\n\n if (afterIndex < 0) {\n return null;\n }\n\n return str.substring(beforeIndex, afterIndex);\n }\n\n return str.substring(beforeIndex);\n}\n\nfunction getStudyInstanceUIDFromUri(uri) {\n var uid = findSubstring(uri, \"studies/\", \"/series\");\n\n if (!uid) {\n uid = findSubstring(uri, \"studies/\");\n }\n\n if (!uid) {\n console.debug(\"Study Instance UID could not be dertermined from URI \\\"\".concat(uri, \"\\\"\"));\n }\n\n return uid;\n}\n\nfunction getSeriesInstanceUIDFromUri(uri) {\n var uid = findSubstring(uri, \"series/\", \"/instances\");\n\n if (!uid) {\n uid = findSubstring(uri, \"series/\");\n }\n\n if (!uid) {\n console.debug(\"Series Instance UID could not be dertermined from URI \\\"\".concat(uri, \"\\\"\"));\n }\n\n return uid;\n}\n\nfunction getSOPInstanceUIDFromUri(uri) {\n var uid = findSubstring(uri, \"/instances/\", \"/frames\");\n\n if (!uid) {\n uid = findSubstring(uri, \"/instances/\", \"/metadata\");\n }\n\n if (!uid) {\n uid = findSubstring(uri, \"/instances/\");\n }\n\n if (!uid) {\n console.debug(\"SOP Instance UID could not be dertermined from URI\\\"\".concat(uri, \"\\\"\"));\n }\n\n return uid;\n}\n\nfunction getFrameNumbersFromUri(uri) {\n var numbers = findSubstring(uri, \"/frames/\", \"/rendered\");\n\n if (!numbers) {\n numbers = findSubstring(uri, \"/frames/\");\n }\n\n if (numbers === undefined) {\n console.debug(\"Frames Numbers could not be dertermined from URI\\\"\".concat(uri, \"\\\"\"));\n }\n\n return numbers.split(\",\");\n}\n\nvar version = \"0.5.2\";\n\nvar api = {\n DICOMwebClient: DICOMwebClient\n};\nvar utils = {\n getStudyInstanceUIDFromUri: getStudyInstanceUIDFromUri,\n getSeriesInstanceUIDFromUri: getSeriesInstanceUIDFromUri,\n getSOPInstanceUIDFromUri: getSOPInstanceUIDFromUri,\n getFrameNumbersFromUri: getFrameNumbersFromUri\n};\n\nexport { api, utils, version };\n//# sourceMappingURL=dicomweb-client.es.js.map\n","import {sopClassDictionary} from './sopClassDictionary';\r\n\r\nconst imagesTypes = [\r\n sopClassDictionary.ComputedRadiographyImageStorage,\r\n sopClassDictionary.DigitalXRayImageStorageForPresentation,\r\n sopClassDictionary.DigitalXRayImageStorageForProcessing,\r\n sopClassDictionary.DigitalMammographyXRayImageStorageForPresentation,\r\n sopClassDictionary.DigitalMammographyXRayImageStorageForProcessing,\r\n sopClassDictionary.DigitalIntraOralXRayImageStorageForPresentation,\r\n sopClassDictionary.DigitalIntraOralXRayImageStorageForProcessing,\r\n sopClassDictionary.CTImageStorage,\r\n sopClassDictionary.EnhancedCTImageStorage,\r\n sopClassDictionary.LegacyConvertedEnhancedCTImageStorage,\r\n sopClassDictionary.UltrasoundMultiframeImageStorage,\r\n sopClassDictionary.MRImageStorage,\r\n sopClassDictionary.EnhancedMRImageStorage,\r\n sopClassDictionary.EnhancedMRColorImageStorage,\r\n sopClassDictionary.LegacyConvertedEnhancedMRImageStorage,\r\n sopClassDictionary.UltrasoundImageStorage,\r\n sopClassDictionary.SecondaryCaptureImageStorage,\r\n sopClassDictionary.MultiframeSingleBitSecondaryCaptureImageStorage,\r\n sopClassDictionary.MultiframeGrayscaleByteSecondaryCaptureImageStorage,\r\n sopClassDictionary.MultiframeGrayscaleWordSecondaryCaptureImageStorage,\r\n sopClassDictionary.MultiframeTrueColorSecondaryCaptureImageStorage,\r\n sopClassDictionary.XRayAngiographicImageStorage,\r\n sopClassDictionary.EnhancedXAImageStorage,\r\n sopClassDictionary.XRayRadiofluoroscopicImageStorage,\r\n sopClassDictionary.EnhancedXRFImageStorage,\r\n sopClassDictionary.XRay3DAngiographicImageStorage,\r\n sopClassDictionary.XRay3DCraniofacialImageStorage,\r\n sopClassDictionary.BreastTomosynthesisImageStorage,\r\n sopClassDictionary.BreastProjectionXRayImageStorageForPresentation,\r\n sopClassDictionary.BreastProjectionXRayImageStorageForProcessing,\r\n sopClassDictionary.IntravascularOpticalCoherenceTomographyImageStorageForPresentation,\r\n sopClassDictionary.IntravascularOpticalCoherenceTomographyImageStorageForProcessing,\r\n sopClassDictionary.NuclearMedicineImageStorage,\r\n sopClassDictionary.VLEndoscopicImageStorage,\r\n sopClassDictionary.VideoEndoscopicImageStorage,\r\n sopClassDictionary.VLMicroscopicImageStorage,\r\n sopClassDictionary.VideoMicroscopicImageStorage,\r\n sopClassDictionary.VLSlideCoordinatesMicroscopicImageStorage,\r\n sopClassDictionary.VLPhotographicImageStorage,\r\n sopClassDictionary.VideoPhotographicImageStorage,\r\n sopClassDictionary.OphthalmicPhotography8BitImageStorage,\r\n sopClassDictionary.OphthalmicPhotography16BitImageStorage,\r\n sopClassDictionary.OphthalmicTomographyImageStorage,\r\n sopClassDictionary.VLWholeSlideMicroscopyImageStorage,\r\n sopClassDictionary.PositronEmissionTomographyImageStorage,\r\n sopClassDictionary.EnhancedPETImageStorage,\r\n sopClassDictionary.LegacyConvertedEnhancedPETImageStorage,\r\n sopClassDictionary.RTImageStorage\r\n];\r\n\r\n/**\r\n * Checks whether dicom files with specified SOP Class UID have image data\r\n * @param {string} SOPClassUID - SOP Class UID to be checked\r\n * @returns {boolean} - true if it has image data\r\n */\r\nexport const isImage = (SOPClassUID) => {\r\n if (!SOPClassUID) return false;\r\n return imagesTypes.indexOf(SOPClassUID) !== -1;\r\n};\r\n","// TODO: Deprecate since we have the same thing in dcmjs?\r\nexport const sopClassDictionary = {\r\n ComputedRadiographyImageStorage: '1.2.840.10008.5.1.4.1.1.1',\r\n DigitalXRayImageStorageForPresentation: '1.2.840.10008.5.1.4.1.1.1.1',\r\n DigitalXRayImageStorageForProcessing: '1.2.840.10008.5.1.4.1.1.1.1.1',\r\n DigitalMammographyXRayImageStorageForPresentation:\r\n '1.2.840.10008.5.1.4.1.1.1.2',\r\n DigitalMammographyXRayImageStorageForProcessing:\r\n '1.2.840.10008.5.1.4.1.1.1.2.1',\r\n DigitalIntraOralXRayImageStorageForPresentation:\r\n '1.2.840.10008.5.1.4.1.1.1.3',\r\n DigitalIntraOralXRayImageStorageForProcessing:\r\n '1.2.840.10008.5.1.4.1.1.1.3.1',\r\n CTImageStorage: '1.2.840.10008.5.1.4.1.1.2',\r\n EnhancedCTImageStorage: '1.2.840.10008.5.1.4.1.1.2.1',\r\n LegacyConvertedEnhancedCTImageStorage: '1.2.840.10008.5.1.4.1.1.2.2',\r\n UltrasoundMultiframeImageStorage: '1.2.840.10008.5.1.4.1.1.3.1',\r\n MRImageStorage: '1.2.840.10008.5.1.4.1.1.4',\r\n EnhancedMRImageStorage: '1.2.840.10008.5.1.4.1.1.4.1',\r\n MRSpectroscopyStorage: '1.2.840.10008.5.1.4.1.1.4.2',\r\n EnhancedMRColorImageStorage: '1.2.840.10008.5.1.4.1.1.4.3',\r\n LegacyConvertedEnhancedMRImageStorage: '1.2.840.10008.5.1.4.1.1.4.4',\r\n UltrasoundImageStorage: '1.2.840.10008.5.1.4.1.1.6.1',\r\n EnhancedUSVolumeStorage: '1.2.840.10008.5.1.4.1.1.6.2',\r\n SecondaryCaptureImageStorage: '1.2.840.10008.5.1.4.1.1.7',\r\n MultiframeSingleBitSecondaryCaptureImageStorage:\r\n '1.2.840.10008.5.1.4.1.1.7.1',\r\n MultiframeGrayscaleByteSecondaryCaptureImageStorage:\r\n '1.2.840.10008.5.1.4.1.1.7.2',\r\n MultiframeGrayscaleWordSecondaryCaptureImageStorage:\r\n '1.2.840.10008.5.1.4.1.1.7.3',\r\n MultiframeTrueColorSecondaryCaptureImageStorage:\r\n '1.2.840.10008.5.1.4.1.1.7.4',\r\n Sop12LeadECGWaveformStorage: '1.2.840.10008.5.1.4.1.1.9.1.1',\r\n GeneralECGWaveformStorage: '1.2.840.10008.5.1.4.1.1.9.1.2',\r\n AmbulatoryECGWaveformStorage: '1.2.840.10008.5.1.4.1.1.9.1.3',\r\n HemodynamicWaveformStorage: '1.2.840.10008.5.1.4.1.1.9.2.1',\r\n CardiacElectrophysiologyWaveformStorage: '1.2.840.10008.5.1.4.1.1.9.3.1',\r\n BasicVoiceAudioWaveformStorage: '1.2.840.10008.5.1.4.1.1.9.4.1',\r\n GeneralAudioWaveformStorage: '1.2.840.10008.5.1.4.1.1.9.4.2',\r\n ArterialPulseWaveformStorage: '1.2.840.10008.5.1.4.1.1.9.5.1',\r\n RespiratoryWaveformStorage: '1.2.840.10008.5.1.4.1.1.9.6.1',\r\n GrayscaleSoftcopyPresentationStateStorage: '1.2.840.10008.5.1.4.1.1.11.1',\r\n ColorSoftcopyPresentationStateStorage: '1.2.840.10008.5.1.4.1.1.11.2',\r\n PseudoColorSoftcopyPresentationStateStorage: '1.2.840.10008.5.1.4.1.1.11.3',\r\n BlendingSoftcopyPresentationStateStorage: '1.2.840.10008.5.1.4.1.1.11.4',\r\n XAXRFGrayscaleSoftcopyPresentationStateStorage:\r\n '1.2.840.10008.5.1.4.1.1.11.5',\r\n XRayAngiographicImageStorage: '1.2.840.10008.5.1.4.1.1.12.1',\r\n EnhancedXAImageStorage: '1.2.840.10008.5.1.4.1.1.12.1.1',\r\n XRayRadiofluoroscopicImageStorage: '1.2.840.10008.5.1.4.1.1.12.2',\r\n EnhancedXRFImageStorage: '1.2.840.10008.5.1.4.1.1.12.2.1',\r\n XRay3DAngiographicImageStorage: '1.2.840.10008.5.1.4.1.1.13.1.1',\r\n XRay3DCraniofacialImageStorage: '1.2.840.10008.5.1.4.1.1.13.1.2',\r\n BreastTomosynthesisImageStorage: '1.2.840.10008.5.1.4.1.1.13.1.3',\r\n BreastProjectionXRayImageStorageForPresentation:\r\n '1.2.840.10008.5.1.4.1.1.13.1.4',\r\n BreastProjectionXRayImageStorageForProcessing:\r\n '1.2.840.10008.5.1.4.1.1.13.1.5',\r\n IntravascularOpticalCoherenceTomographyImageStorageForPresentation:\r\n '1.2.840.10008.5.1.4.1.1.14.1',\r\n IntravascularOpticalCoherenceTomographyImageStorageForProcessing:\r\n '1.2.840.10008.5.1.4.1.1.14.2',\r\n NuclearMedicineImageStorage: '1.2.840.10008.5.1.4.1.1.20',\r\n RawDataStorage: '1.2.840.10008.5.1.4.1.1.66',\r\n SpatialRegistrationStorage: '1.2.840.10008.5.1.4.1.1.66.1',\r\n SpatialFiducialsStorage: '1.2.840.10008.5.1.4.1.1.66.2',\r\n DeformableSpatialRegistrationStorage: '1.2.840.10008.5.1.4.1.1.66.3',\r\n SegmentationStorage: '1.2.840.10008.5.1.4.1.1.66.4',\r\n SurfaceSegmentationStorage: '1.2.840.10008.5.1.4.1.1.66.5',\r\n RealWorldValueMappingStorage: '1.2.840.10008.5.1.4.1.1.67',\r\n SurfaceScanMeshStorage: '1.2.840.10008.5.1.4.1.1.68.1',\r\n SurfaceScanPointCloudStorage: '1.2.840.10008.5.1.4.1.1.68.2',\r\n VLEndoscopicImageStorage: '1.2.840.10008.5.1.4.1.1.77.1.1',\r\n VideoEndoscopicImageStorage: '1.2.840.10008.5.1.4.1.1.77.1.1.1',\r\n VLMicroscopicImageStorage: '1.2.840.10008.5.1.4.1.1.77.1.2',\r\n VideoMicroscopicImageStorage: '1.2.840.10008.5.1.4.1.1.77.1.2.1',\r\n VLSlideCoordinatesMicroscopicImageStorage: '1.2.840.10008.5.1.4.1.1.77.1.3',\r\n VLPhotographicImageStorage: '1.2.840.10008.5.1.4.1.1.77.1.4',\r\n VideoPhotographicImageStorage: '1.2.840.10008.5.1.4.1.1.77.1.4.1',\r\n OphthalmicPhotography8BitImageStorage: '1.2.840.10008.5.1.4.1.1.77.1.5.1',\r\n OphthalmicPhotography16BitImageStorage: '1.2.840.10008.5.1.4.1.1.77.1.5.2',\r\n StereometricRelationshipStorage: '1.2.840.10008.5.1.4.1.1.77.1.5.3',\r\n OphthalmicTomographyImageStorage: '1.2.840.10008.5.1.4.1.1.77.1.5.4',\r\n VLWholeSlideMicroscopyImageStorage: '1.2.840.10008.5.1.4.1.1.77.1.6',\r\n LensometryMeasurementsStorage: '1.2.840.10008.5.1.4.1.1.78.1',\r\n AutorefractionMeasurementsStorage: '1.2.840.10008.5.1.4.1.1.78.2',\r\n KeratometryMeasurementsStorage: '1.2.840.10008.5.1.4.1.1.78.3',\r\n SubjectiveRefractionMeasurementsStorage: '1.2.840.10008.5.1.4.1.1.78.4',\r\n VisualAcuityMeasurementsStorage: '1.2.840.10008.5.1.4.1.1.78.5',\r\n SpectaclePrescriptionReportStorage: '1.2.840.10008.5.1.4.1.1.78.6',\r\n OphthalmicAxialMeasurementsStorage: '1.2.840.10008.5.1.4.1.1.78.7',\r\n IntraocularLensCalculationsStorage: '1.2.840.10008.5.1.4.1.1.78.8',\r\n MacularGridThicknessandVolumeReport: '1.2.840.10008.5.1.4.1.1.79.1',\r\n OphthalmicVisualFieldStaticPerimetryMeasurementsStorage:\r\n '1.2.840.10008.5.1.4.1.1.80.1',\r\n OphthalmicThicknessMapStorage: '1.2.840.10008.5.1.4.1.1.81.1',\r\n CornealTopographyMapStorage: '1.2.840.10008.5.1.4.1.1.82.1',\r\n BasicTextSR: '1.2.840.10008.5.1.4.1.1.88.11',\r\n EnhancedSR: '1.2.840.10008.5.1.4.1.1.88.22',\r\n ComprehensiveSR: '1.2.840.10008.5.1.4.1.1.88.33',\r\n Comprehensive3DSR: '1.2.840.10008.5.1.4.1.1.88.34',\r\n ProcedureLog: '1.2.840.10008.5.1.4.1.1.88.40',\r\n MammographyCADSR: '1.2.840.10008.5.1.4.1.1.88.50',\r\n KeyObjectSelection: '1.2.840.10008.5.1.4.1.1.88.59',\r\n ChestCADSR: '1.2.840.10008.5.1.4.1.1.88.65',\r\n XRayRadiationDoseSR: '1.2.840.10008.5.1.4.1.1.88.67',\r\n RadiopharmaceuticalRadiationDoseSR: '1.2.840.10008.5.1.4.1.1.88.68',\r\n ColonCADSR: '1.2.840.10008.5.1.4.1.1.88.69',\r\n ImplantationPlanSRDocumentStorage: '1.2.840.10008.5.1.4.1.1.88.70',\r\n EncapsulatedPDFStorage: '1.2.840.10008.5.1.4.1.1.104.1',\r\n EncapsulatedCDAStorage: '1.2.840.10008.5.1.4.1.1.104.2',\r\n PositronEmissionTomographyImageStorage: '1.2.840.10008.5.1.4.1.1.128',\r\n EnhancedPETImageStorage: '1.2.840.10008.5.1.4.1.1.130',\r\n LegacyConvertedEnhancedPETImageStorage: '1.2.840.10008.5.1.4.1.1.128.1',\r\n BasicStructuredDisplayStorage: '1.2.840.10008.5.1.4.1.1.131',\r\n RTImageStorage: '1.2.840.10008.5.1.4.1.1.481.1',\r\n RTDoseStorage: '1.2.840.10008.5.1.4.1.1.481.2',\r\n RTStructureSetStorage: '1.2.840.10008.5.1.4.1.1.481.3',\r\n RTBeamsTreatmentRecordStorage: '1.2.840.10008.5.1.4.1.1.481.4',\r\n RTPlanStorage: '1.2.840.10008.5.1.4.1.1.481.5',\r\n RTBrachyTreatmentRecordStorage: '1.2.840.10008.5.1.4.1.1.481.6',\r\n RTTreatmentSummaryRecordStorage: '1.2.840.10008.5.1.4.1.1.481.7',\r\n RTIonPlanStorage: '1.2.840.10008.5.1.4.1.1.481.8',\r\n RTIonBeamsTreatmentRecordStorage: '1.2.840.10008.5.1.4.1.1.481.9',\r\n RTBeamsDeliveryInstructionStorage: '1.2.840.10008.5.1.4.34.7',\r\n GenericImplantTemplateStorage: '1.2.840.10008.5.1.4.43.1',\r\n ImplantAssemblyTemplateStorage: '1.2.840.10008.5.1.4.44.1',\r\n ImplantTemplateGroupStorage: '1.2.840.10008.5.1.4.45.1'\r\n};\r\n","/**\r\n * Checks if a series is reconstructable to a 3D volume.\r\n *\r\n * @param {Object[]} instances An array of `OHIFInstanceMetadata` objects.\r\n */\r\nexport default function isDisplaySetReconstructable(instances) {\r\n if (!instances.length) {\r\n return {value: false};\r\n }\r\n\r\n const firstInstance = instances[0].getData().metadata;\r\n\r\n const Modality = firstInstance.Modality;\r\n const isMultiframe = firstInstance.NumberOfFrames > 1;\r\n\r\n if (!constructableModalities.includes(Modality)) {\r\n return {value: false};\r\n }\r\n\r\n // Can't reconstruct if we only have one image.\r\n if (!isMultiframe && instances.length === 1) {\r\n return {value: false};\r\n }\r\n\r\n if (isMultiframe) {\r\n return processMultiframe(instances[0]);\r\n } \r\n return processSingleframe(instances);\r\n \r\n}\r\n\r\nfunction processMultiframe(instance) {\r\n //TODO: deal with multriframe checks! return false for now as can't reconstruct.\r\n return {value: false};\r\n}\r\n\r\nfunction processSingleframe(instances) {\r\n const firstImage = instances[0].getData().metadata;\r\n const firstImageRows = firstImage.Rows;\r\n const firstImageColumns = firstImage.Columns;\r\n const firstImageSamplesPerPixel = firstImage.SamplesPerPixel;\r\n const firstImageOrientationPatient = firstImage.ImageOrientationPatient;\r\n const firstImagePositionPatient = firstImage.ImagePositionPatient;\r\n\r\n // Can't reconstruct if we:\r\n // -- Have a different dimensions within a displaySet.\r\n // -- Have a different number of components within a displaySet.\r\n // -- Have different orientations within a displaySet.\r\n for (let i = 1; i < instances.length; i++) {\r\n const instance = instances[i].getData().metadata;\r\n const {\r\n Rows,\r\n Columns,\r\n SamplesPerPixel,\r\n ImageOrientationPatient\r\n } = instance;\r\n\r\n if (\r\n Rows !== firstImageRows ||\r\n Columns !== firstImageColumns ||\r\n SamplesPerPixel !== firstImageSamplesPerPixel ||\r\n !_isSameOrientation(ImageOrientationPatient, firstImageOrientationPatient)\r\n ) {\r\n return {value: false};\r\n }\r\n }\r\n\r\n let missingFrames = 0;\r\n\r\n // Check if frame spacing is approximately equal within a spacingTolerance.\r\n // If spacing is on a uniform grid but we are missing frames,\r\n // Allow reconstruction, but pass back the number of missing frames.\r\n if (instances.length > 2) {\r\n const lastIpp = instances[instances.length - 1].getData().metadata\r\n .ImagePositionPatient;\r\n\r\n // We can't reconstruct if we are missing ImagePositionPatient values\r\n if (!firstImagePositionPatient || !lastIpp) {\r\n return {value: false};\r\n }\r\n\r\n // const averageSpacingBetweenFrames = _getPerpendicularDistance(firstImagePositionPatient, lastIpp) / (instances.length - 1);\r\n\r\n // let previousImagePositionPatient = firstImagePositionPatient;\r\n // for (let i = 0; i < instances.length; i++) {\r\n // const instance = instances[i].getData().metadata;\r\n // const {ImagePositionPatient} = instance;\r\n // Temporary disable slice spacing issues, will assume a spacing value calculated from ImagePositionPatient and ImageOrientationPatient\r\n // const spacingBetweenFrames = _getPerpendicularDistance(\r\n // ImagePositionPatient,\r\n // previousImagePositionPatient\r\n // );\r\n // const spacingIssue = _getSpacingIssue(\r\n // spacingBetweenFrames,\r\n // averageSpacingBetweenFrames\r\n // );\r\n\r\n // if (spacingIssue) {\r\n // const issue = spacingIssue.issue;\r\n\r\n // if (issue === reconstructionIssues.MISSING_FRAMES) {\r\n // missingFrames += spacingIssue.missingFrames;\r\n // } else if (issue === reconstructionIssues.IRREGULAR_SPACING) {\r\n // return {value: false};\r\n // }\r\n // }\r\n\r\n // previousImagePositionPatient = ImagePositionPatient;\r\n // }\r\n }\r\n\r\n return {value: true, missingFrames};\r\n}\r\n\r\nfunction _isSameOrientation(iop1, iop2) {\r\n if (iop1 === undefined || !iop2 === undefined) {\r\n return;\r\n }\r\n\r\n return (\r\n Math.abs(iop1[0] - iop2[0]) < iopTolerance &&\r\n Math.abs(iop1[1] - iop2[1]) < iopTolerance &&\r\n Math.abs(iop1[2] - iop2[2]) < iopTolerance\r\n );\r\n}\r\n\r\n// TODO: Is 10% a reasonable spacingTolerance for spacing?\r\nconst spacingTolerance = 0.1;\r\nconst iopTolerance = 0.01;\r\n\r\n/**\r\n * Checks for spacing issues.\r\n *\r\n * @param {number} spacing The spacing between two frames.\r\n * @param {number} averageSpacing The average spacing between all frames.\r\n *\r\n * @returns {Object} An object containing the issue and extra information if necessary.\r\n */\r\nfunction _getSpacingIssue(spacing, averageSpacing) {\r\n const equalWithinTolerance =\r\n Math.abs(spacing - averageSpacing) < averageSpacing * spacingTolerance;\r\n\r\n if (equalWithinTolerance) {\r\n return;\r\n }\r\n\r\n const multipleOfAverageSpacing = spacing / averageSpacing;\r\n\r\n const numberOfSpacings = Math.round(multipleOfAverageSpacing);\r\n\r\n const errorForEachSpacing =\r\n Math.abs(spacing - numberOfSpacings * averageSpacing) / numberOfSpacings;\r\n\r\n if (errorForEachSpacing < spacingTolerance * averageSpacing) {\r\n return {\r\n issue: reconstructionIssues.MISSING_FRAMES,\r\n missingFrames: numberOfSpacings - 1\r\n };\r\n }\r\n\r\n return {issue: reconstructionIssues.IRREGULAR_SPACING};\r\n}\r\n\r\nfunction _getPerpendicularDistance(a, b) {\r\n return Math.sqrt(\r\n Math.pow(a[0] - b[0], 2) +\r\n Math.pow(a[1] - b[1], 2) +\r\n Math.pow(a[2] - b[2], 2)\r\n );\r\n}\r\n\r\nconst constructableModalities = ['MR', 'CT', 'PT', 'NM'];\r\nconst reconstructionIssues = {\r\n MISSING_FRAMES: 'missingframes',\r\n IRREGULAR_SPACING: 'irregularspacing'\r\n};\r\n","const LOW_PRIORITY_MODALITIES = Object.freeze(['SEG', 'KO', 'PR']);\r\n\r\nexport default function isLowPriorityModality(Modality) {\r\n return LOW_PRIORITY_MODALITIES.includes(Modality);\r\n}\r\n","// These should be overridden by the implementation\nconst errorHandler = {\n getHTTPErrorHandler: () => null\n};\n\nexport default errorHandler;\n","export default function getImageSetCalculatedSpacings(imageSet) {\n // console.log('getImageSetCalculatedSpacings', imageSet);\n const calculatedSpacings = {\n mostUnique: 0,\n max: 0,\n min: 0 \n };\n\n const spacings = [];\n for (let i = 0; i < imageSet.length; i++) {\n const metadata = imageSet[i].getData().metadata;\n const { ImagePositionPatient, ImageOrientationPatient } = metadata;\n if (!ImagePositionPatient || !ImageOrientationPatient) return;\n const thisPosition = _getZPosAlongPlaneDirection(ImagePositionPatient, ImageOrientationPatient);\n if (i > 0) {\n if (i !== imageSet.length - 1) spacings[i] = thisPosition;\n spacings[i-1] = _roundToTwo(Math.abs(thisPosition - spacings[i-1]));\n } else spacings.push(thisPosition);\n }\n\n // \n const { mostUnique, max, min } = _getImageSetCalculatedSpacings(spacings);\n calculatedSpacings.mostUnique = mostUnique;\n calculatedSpacings.max = max;\n calculatedSpacings.min = min;\n return calculatedSpacings;\n}\n\n// Compute true zPos along Plane normals from Image Position Patient (0020,0032) and Image Orientation Patient (0020,0037)\n// https://github.com/horosproject/horosplugins/blob/767f630607094e3ba3b814f788fc49736c70367d/VoxelVolume/VoxelVolumeFilter.m\nfunction _getZPosAlongPlaneDirection(imagePos, imageOrient) {\n // console.log('getZPosAlongPlaneDirection', imagePos, imageOrient);\n // image positions, normally this is the top-left coordinate of the image\n const xPos = imagePos[0];\n const yPos = imagePos[1];\n const zPos = imagePos[2];\n // normal vectors along X, Y, Z of the image\n /*\n \"C.7.6.2.1.1 Image Position And Image Orientation. The Image Position (0020,0032) specifies the x, y,\n and z coordinates of the upper left hand corner of the image; it is the center of the first voxel transmitted.\n Image Orientation (0020,0037) specifies the direction cosines of the first row and the first column with respect to the patient.\n These Attributes shall be provide as a pair. Row value for the x, y, and z axes respectively followed by the Column value for the x,\n y, and z axes respectively. The direction of the axes is defined fully by the patient's orientation. The x-axis is increasing to the\n left hand side of the patient. The y-axis is increasing to the posterior side of the patient.\n The z-axis is increasing toward the head of the patient. The patient based coordinate system is a right handed system,%\n i.e. the vector cross product of a unit vector along the positive x-axis and a unit vector along the positive y-axis is equal to a unit vector%\n along the positive z-axis.\"\n \n dst_nrm_dircos_x = dircos(2) * dircos(6) - dircos(3) * dircos(5);\n dst_nrm_dircos_y = dircos(3) * dircos(4) - dircos(1) * dircos(6);\n dst_nrm_dircos_z = dircos(1) * dircos(5) - dircos(2) * dircos(4);\n \n newx = dircos(1) * xpos + dircos(2)* ypos + dircos(3) * zpos;\n newy = dircos(4)* xpos + dircos(5)* ypos + dircos(6) * zpos;\n newz = dst_nrm_dircos_x * xpos + dst_nrm_dircos_y * ypos+ dst_nrm_dircos_z * zpos;\n */\n const dst_normal_IOP_x = imageOrient[2-1] * imageOrient[6-1] - imageOrient[3-1] * imageOrient[5-1];\n const dst_normal_IOP_y = imageOrient[3-1] * imageOrient[4-1] - imageOrient[1-1] * imageOrient[6-1];\n const dst_normal_IOP_z = imageOrient[1-1] * imageOrient[5-1] - imageOrient[2-1] * imageOrient[4-1];\n\n const newZ = dst_normal_IOP_x * xPos + dst_normal_IOP_y * yPos + dst_normal_IOP_z * zPos;\n return newZ;\n}\n\nfunction _roundToTwo(num) { \n return +(Math.round(num + 'e+2') + 'e-2');\n}\n// return an array of spacing between instances in the set\nfunction _getImageSetCalculatedSpacings(spacings) {\n // console.time('_getImageSetCalculatedSpacings');\n const unique_values = [...new Set(spacings)];\n const count = new Array(unique_values.length).fill(0);\n let max = 0;\n let min = Infinity;\n // console.log('_getImageSetCalculatedSpacings uniques', unique_values);\n spacings.forEach((spacing) => {\n if (spacing > max) max = spacing;\n if (spacing < min) min = spacing;\n unique_values.forEach((val, index) => {\n if (val === spacing) count[index]++;\n });\n });\n // console.log('_getImageSetCalculatedSpacings count', count);\n const maxCountIndex = count.indexOf(Math.max(...count));\n // console.timeEnd('_getImageSetCalculatedSpacings');\n return { mostUnique: unique_values[maxCountIndex], max: max, min: min };\n}","// - createStacks\r\nimport DICOMWeb from './../../DICOMWeb';\r\nimport ImageSet from './../ImageSet';\r\nimport { InstanceMetadata } from './InstanceMetadata';\r\nimport { Metadata } from './Metadata';\r\nimport OHIFError from '../OHIFError';\r\nimport { SeriesMetadata } from './SeriesMetadata';\r\n// - createStacks\r\nimport { api } from 'dicomweb-client';\r\n// - createStacks\r\nimport { isImage } from '../../utils/isImage';\r\nimport isDisplaySetReconstructable from '../../utils/isDisplaySetReconstructable';\r\nimport isLowPriorityModality from '../../utils/isLowPriorityModality';\r\nimport errorHandler from '../../errorHandler';\r\n// Mod by Triet\r\nimport getImageSetCalculatedSpacings from '../../utils/getImageSetCalculatedSpacings';\r\n\r\nexport class StudyMetadata extends Metadata {\r\n constructor(data, uid) {\r\n super(data, uid);\r\n // Initialize Private Properties\r\n Object.defineProperties(this, {\r\n _studyInstanceUID: {\r\n configurable: true, // configurable so that it can be redefined in sub-classes...\r\n enumerable: false,\r\n writable: true,\r\n value: null\r\n },\r\n _series: {\r\n configurable: false,\r\n enumerable: false,\r\n writable: false,\r\n value: []\r\n },\r\n _displaySets: {\r\n configurable: false,\r\n enumerable: false,\r\n writable: false,\r\n value: []\r\n },\r\n _derivedDisplaySets: {\r\n configurable: false,\r\n enumerable: false,\r\n writable: false,\r\n value: []\r\n },\r\n _firstSeries: {\r\n configurable: false,\r\n enumerable: false,\r\n writable: true,\r\n value: null\r\n },\r\n _firstInstance: {\r\n configurable: false,\r\n enumerable: false,\r\n writable: true,\r\n value: null\r\n }\r\n });\r\n // Initialize Public Properties\r\n this._definePublicProperties();\r\n }\r\n\r\n /**\r\n * Private Methods\r\n */\r\n\r\n /**\r\n * Define Public Properties\r\n * This method should only be called during initialization (inside the class constructor)\r\n */\r\n _definePublicProperties() {\r\n /**\r\n * Property: this.studyInstanceUID\r\n * Same as this.getStudyInstanceUID()\r\n * It's specially useful in contexts where a method call is not suitable like in search criteria. For example:\r\n * studyCollection.findBy({\r\n * studyInstanceUID: '1.2.3.4.5.6.77777.8888888.99999999999.0'\r\n * });\r\n */\r\n Object.defineProperty(this, 'studyInstanceUID', {\r\n configurable: false,\r\n enumerable: false,\r\n get: function () {\r\n return this.getStudyInstanceUID();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Public Methods\r\n */\r\n\r\n /**\r\n * Getter for displaySets\r\n * @return {Array} Array of display set object\r\n */\r\n getDisplaySets() {\r\n return this._displaySets.slice();\r\n }\r\n\r\n /**\r\n * Split a series metadata object into display sets\r\n * @param {Array} sopClassHandlerModules List of SOP Class Modules\r\n * @param {SeriesMetadata} series The series metadata object from which the display sets will be created\r\n * @returns {Array} The list of display sets created for the given series object\r\n */\r\n _createDisplaySetsForSeries(sopClassHandlerModules, series) {\r\n const study = this;\r\n const displaySets = [];\r\n const anyInstances = series.getInstanceCount() > 0;\r\n\r\n if (!anyInstances) {\r\n const displaySet = new ImageSet([]);\r\n const seriesData = series.getData();\r\n\r\n displaySet.setAttributes({\r\n displaySetInstanceUID: displaySet.uid,\r\n SeriesInstanceUID: seriesData.SeriesInstanceUID,\r\n SeriesDescription: seriesData.SeriesDescription,\r\n SeriesNumber: seriesData.SeriesNumber,\r\n Modality: seriesData.Modality,\r\n combinedId: series.combinedId\r\n });\r\n\r\n displaySets.push(displaySet);\r\n return displaySets;\r\n }\r\n\r\n const sopClassUIDs = getSopClassUIDs(series);\r\n\r\n if (sopClassHandlerModules && sopClassHandlerModules.length > 0) {\r\n const displaySet = _getDisplaySetFromSopClassModule(sopClassHandlerModules, series, study, sopClassUIDs);\r\n\r\n if (displaySet) {\r\n displaySet.sopClassModule = true;\r\n\r\n displaySet.isDerived ? this._addDerivedDisplaySet(displaySet) : displaySets.push(displaySet);\r\n displaySet.combinedId = series.combinedId;\r\n return displaySets;\r\n }\r\n }\r\n\r\n // WE NEED A BETTER WAY TO NOTE THAT THIS IS THE DEFAULT BEHAVIOR FOR LOADING\r\n // A DISPLAY SET IF THERE IS NO MATCHING SOP CLASS PLUGIN\r\n\r\n // Search through the instances (InstanceMetadata object) of this series\r\n // Split Multi-frame instances and Single-image modalities\r\n // into their own specific display sets. Place the rest of each\r\n // series into another display set.\r\n const stackableInstances = [];\r\n series.forEachInstance((instance) => {\r\n // All imaging modalities must have a valid value for SOPClassUID (x00080016) or Rows (x00280010)\r\n if (!isImage(instance.getTagValue('SOPClassUID')) && !instance.getTagValue('Rows')) {\r\n return;\r\n }\r\n\r\n let displaySet;\r\n\r\n if (isMultiFrame(instance)) {\r\n displaySet = makeDisplaySet(series, [instance]);\r\n\r\n displaySet.setAttributes({\r\n sopClassUIDs,\r\n isClip: true,\r\n SeriesInstanceUID: series.getSeriesInstanceUID(),\r\n StudyInstanceUID: study.getStudyInstanceUID(), // Include the study instance UID for drag/drop purposes\r\n numImageFrames: instance.getTagValue('NumberOfFrames'), // Override the default value of instances.length\r\n InstanceNumber: instance.getTagValue('InstanceNumber'), // Include the instance number\r\n AcquisitionDatetime: instance.getTagValue('AcquisitionDateTime') // Include the acquisition datetime\r\n });\r\n displaySets.push(displaySet);\r\n } else if (isSingleImageModality(instance.Modality)) {\r\n displaySet = makeDisplaySet(series, [instance]);\r\n displaySet.setAttributes({\r\n sopClassUIDs,\r\n StudyInstanceUID: study.getStudyInstanceUID(), // Include the study instance UID\r\n SeriesInstanceUID: series.getSeriesInstanceUID(),\r\n InstanceNumber: instance.getTagValue('InstanceNumber'), // Include the instance number\r\n AcquisitionDatetime: instance.getTagValue('AcquisitionDateTime') // Include the acquisition datetime\r\n });\r\n displaySets.push(displaySet);\r\n } else {\r\n stackableInstances.push(instance);\r\n }\r\n });\r\n\r\n if (stackableInstances.length) {\r\n const displaySet = makeDisplaySet(series, stackableInstances);\r\n displaySet.setAttribute('StudyInstanceUID', study.getStudyInstanceUID());\r\n displaySet.setAttributes({\r\n sopClassUIDs\r\n });\r\n displaySets.push(displaySet);\r\n }\r\n\r\n return displaySets;\r\n }\r\n\r\n /**\r\n * Adds the displaySets to the studies list of derived displaySets.\r\n * @param {object} displaySet The displaySet to append to the derived displaysets list.\r\n */\r\n _addDerivedDisplaySet(displaySet) {\r\n this._derivedDisplaySets.push(displaySet);\r\n // --> Perhaps that logic should exist in the extension sop class handler and this be a dumb list.\r\n // TODO -> Get x Modality by referencedSeriesInstanceUid, FoR, etc.\r\n }\r\n\r\n /**\r\n * Adds the displaySets to the studies list of derived displaySets.\r\n * @param {array} displaySets The displaySets array to append to the derived displaysets list.\r\n */\r\n _addDerivedDisplaySets(displaySets) {\r\n displaySets.map((displaySet) => this._derivedDisplaySets.push(displaySet));\r\n }\r\n\r\n /**\r\n * Returns a list of derived datasets in the study, filtered by the given filter.\r\n * @param {object} filter An object containing search filters\r\n * @param {object} filter.Modality\r\n * @param {object} filter.referencedSeriesInstanceUID\r\n * @param {object} filter.referencedFrameOfReferenceUID\r\n * @return {Array} filtered derived display sets\r\n */\r\n getDerivedDatasets(filter) {\r\n const { Modality, referencedSeriesInstanceUID, referencedFrameOfReferenceUID } = filter;\r\n\r\n let filteredDerivedDisplaySets = this._derivedDisplaySets;\r\n\r\n if (Modality) {\r\n filteredDerivedDisplaySets = filteredDerivedDisplaySets.filter((displaySet) => displaySet.Modality === Modality);\r\n }\r\n\r\n if (referencedSeriesInstanceUID) {\r\n filteredDerivedDisplaySets = filteredDerivedDisplaySets.filter((displaySet) => {\r\n if (!displaySet.metadata.ReferencedSeriesSequence) {\r\n return false;\r\n }\r\n\r\n const ReferencedSeriesSequence = Array.isArray(displaySet.metadata.ReferencedSeriesSequence)\r\n ? displaySet.metadata.ReferencedSeriesSequence\r\n : [displaySet.metadata.ReferencedSeriesSequence];\r\n\r\n return ReferencedSeriesSequence.some(\r\n (ReferencedSeries) => ReferencedSeries.SeriesInstanceUID === referencedSeriesInstanceUID\r\n );\r\n });\r\n }\r\n\r\n if (referencedFrameOfReferenceUID) {\r\n filteredDerivedDisplaySets = filteredDerivedDisplaySets.filter(\r\n (displaySet) => displaySet.ReferencedFrameOfReferenceUID === referencedFrameOfReferenceUID\r\n );\r\n }\r\n\r\n return filteredDerivedDisplaySets;\r\n }\r\n\r\n /**\r\n * Creates a set of displaySets to be placed in the Study Metadata\r\n * The displaySets that appear in the Study Metadata must represent\r\n * imaging modalities. A series may be split into one or more displaySets.\r\n *\r\n * Furthermore, for drag/drop functionality,\r\n * it is easiest if the stack objects also contain information about\r\n * which study they are linked to.\r\n *\r\n * @param {StudyMetadata} study The study instance metadata to be used\r\n * @returns {Array} An array of series to be placed in the Study Metadata\r\n */\r\n createDisplaySets(sopClassHandlerModules) {\r\n const displaySets = [];\r\n const anyDisplaySets = this.getSeriesCount();\r\n\r\n if (!anyDisplaySets) {\r\n return displaySets;\r\n }\r\n\r\n // Loop through the series (SeriesMetadata)\r\n this.forEachSeries((series) => {\r\n const displaySetsForSeries = this._createDisplaySetsForSeries(sopClassHandlerModules, series);\r\n\r\n displaySets.push(...displaySetsForSeries);\r\n });\r\n\r\n return sortDisplaySetList(displaySets);\r\n }\r\n\r\n sortDisplaySets() {\r\n sortDisplaySetList(this._displaySets);\r\n }\r\n\r\n /**\r\n * Method to append display sets from a given series to the internal list of display sets\r\n * @param {Array} sopClassHandlerModules A list of SOP Class Handler Modules\r\n * @param {SeriesMetadata} series The series metadata object from which the display sets will be created\r\n * @returns {boolean} Returns true on success or false on failure (e.g., the series does not belong to this study)\r\n */\r\n createAndAddDisplaySetsForSeries(sopClassHandlerModules, series) {\r\n if (!this.containsSeries(series)) {\r\n return false;\r\n }\r\n\r\n const displaySets = this._createDisplaySetsForSeries(sopClassHandlerModules, series);\r\n // Note: filtering in place because this._displaySets has writable: false\r\n // Mod: check for combined id instead of SeriesUID\r\n for (let i = this._displaySets.length - 1; i >= 0; i--) {\r\n const displaySet = this._displaySets[i];\r\n if (displaySet.combinedId === series.combinedId) {\r\n this._displaySets.splice(i, 1);\r\n }\r\n }\r\n\r\n displaySets.forEach((displaySet) => {\r\n this.addDisplaySet(displaySet);\r\n });\r\n\r\n this.sortDisplaySets();\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Set display sets\r\n * @param {Array} displaySets Array of display sets (ImageSet[])\r\n */\r\n setDisplaySets(displaySets) {\r\n if (Array.isArray(displaySets) && displaySets.length > 0) {\r\n // TODO: This is weird, can we just switch it to writable: true?\r\n this._displaySets.splice(0);\r\n\r\n displaySets.forEach((displaySet) => this.addDisplaySet(displaySet));\r\n this.sortDisplaySets();\r\n }\r\n }\r\n\r\n /**\r\n * Add a single display set to the list\r\n * @param {Object} displaySet Display set object\r\n * @returns {boolean} True on success, false on failure.\r\n */\r\n addDisplaySet(displaySet) {\r\n if (displaySet instanceof ImageSet || displaySet.sopClassModule) {\r\n this._displaySets.push(displaySet);\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Invokes the supplied callback for each display set in the current study passing\r\n * two arguments: display set (a ImageSet instance) and index (the integer\r\n * index of the display set within the current study)\r\n * @param {function} callback The callback function which will be invoked for each display set instance.\r\n * @returns {undefined} Nothing is returned.\r\n */\r\n forEachDisplaySet(callback) {\r\n if (Metadata.isValidCallback(callback)) {\r\n this._displaySets.forEach((displaySet, index) => {\r\n callback.call(null, displaySet, index);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Search the associated display sets using the supplied callback as criteria. The callback is passed\r\n * two arguments: display set (an ImageSet instance) and index (the integer\r\n * index of the display set within the current study)\r\n * @param {function} callback The callback function which will be invoked for each display set instance.\r\n * @returns {undefined} Nothing is returned.\r\n */\r\n findDisplaySet(callback) {\r\n if (Metadata.isValidCallback(callback)) {\r\n return this._displaySets.find((displaySet, index) => {\r\n return callback.call(null, displaySet, index);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Retrieve the number of display sets within the current study.\r\n * @returns {number} The number of display sets in the current study.\r\n */\r\n getDisplaySetCount() {\r\n return this._displaySets.length;\r\n }\r\n\r\n /**\r\n * Returns the StudyInstanceUID of the current study.\r\n */\r\n getStudyInstanceUID() {\r\n return this._studyInstanceUID;\r\n }\r\n\r\n /**\r\n * Getter for series\r\n * @return {Array} Array of SeriesMetadata object\r\n */\r\n getSeries() {\r\n return this._series.slice();\r\n }\r\n\r\n /**\r\n * Append a series to the current study.\r\n * @param {SeriesMetadata} series The series to be added to the current study.\r\n * @returns {boolean} Returns true on success, false otherwise.\r\n */\r\n addSeries(series) {\r\n let result = false;\r\n // Mod by Triet\r\n if (series instanceof SeriesMetadata && (this.getSeriesByUID(series.getSeriesInstanceUID()) === void 0 || series.isSubSeries())) {\r\n this._series.push(series);\r\n result = true;\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Update a series in the current study by SeriesInstanceUID.\r\n * @param {String} SeriesInstanceUID The SeriesInstanceUID to be updated\r\n * @param {SeriesMetadata} series The series to be added to the current study.\r\n * @returns {boolean} Returns true on success, false otherwise.\r\n */\r\n updateSeries(SeriesInstanceUID, series) {\r\n // const index = this._series.findIndex((series) => {\r\n // return series.getSeriesInstanceUID() === SeriesInstanceUID;\r\n // });\r\n\r\n // if (index < 0) {\r\n // return false;\r\n // }\r\n const index = this.getSeriesIndexByCustomId(series.getCustomSeriesInstanceUID());\r\n if (!(series instanceof SeriesMetadata)) {\r\n throw new Error('Series must be an instance of SeriesMetadata');\r\n }\r\n\r\n this._series[index] = series;\r\n return true;\r\n }\r\n\r\n /**\r\n * Find a series by index.\r\n * @param {number} index An integer representing a list index.\r\n * @returns {SeriesMetadata} Returns a SeriesMetadata instance when found or undefined otherwise.\r\n */\r\n getSeriesByIndex(index) {\r\n let found; // undefined by default...\r\n if (Metadata.isValidIndex(index)) {\r\n found = this._series[index];\r\n }\r\n return found;\r\n }\r\n\r\n /**\r\n * Find a series by SeriesInstanceUID.\r\n * @param {string} uid An UID string.\r\n * @returns {SeriesMetadata} Returns a SeriesMetadata instance when found or undefined otherwise.\r\n */\r\n getSeriesByUID(uid) {\r\n let found; // undefined by default...\r\n if (Metadata.isValidUID(uid)) {\r\n found = this._series.find((series) => {\r\n return series.getSeriesInstanceUID() === uid;\r\n });\r\n }\r\n return found;\r\n }\r\n\r\n containsSeries(series) {\r\n return series instanceof SeriesMetadata && this._series.indexOf(series) >= 0;\r\n }\r\n\r\n /**\r\n * Retrieve the number of series within the current study.\r\n * @returns {number} The number of series in the current study.\r\n */\r\n getSeriesCount() {\r\n return this._series.length;\r\n }\r\n\r\n /**\r\n * Retrieve the number of instances within the current study.\r\n * @returns {number} The number of instances in the current study.\r\n */\r\n getInstanceCount() {\r\n return this._series.reduce((sum, series) => {\r\n return sum + series.getInstanceCount();\r\n }, 0);\r\n }\r\n\r\n /**\r\n * Invokes the supplied callback for each series in the current study passing\r\n * two arguments: series (a SeriesMetadata instance) and index (the integer\r\n * index of the series within the current study)\r\n * @param {function} callback The callback function which will be invoked for each series instance.\r\n * @returns {undefined} Nothing is returned.\r\n */\r\n forEachSeries(callback) {\r\n if (Metadata.isValidCallback(callback)) {\r\n this._series.forEach((series, index) => {\r\n callback.call(null, series, index);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Find the index of a series inside the study.\r\n * @param {SeriesMetadata} series An instance of the SeriesMetadata class.\r\n * @returns {number} The index of the series inside the study or -1 if not found.\r\n */\r\n indexOfSeries(series) {\r\n return this._series.indexOf(series);\r\n }\r\n\r\n /**\r\n * It sorts the series based on display sets order. Each series must be an instance\r\n * of SeriesMetadata and each display sets must be an instance of ImageSet.\r\n * Useful example of usage:\r\n * Study data provided by backend does not sort series at all and client-side\r\n * needs series sorted by the same criteria used for sorting display sets.\r\n */\r\n sortSeriesByDisplaySets() {\r\n // Object for mapping display sets' index by SeriesInstanceUID\r\n const displaySetsMapping = {};\r\n\r\n // Loop through each display set to create the mapping\r\n this.forEachDisplaySet((displaySet, index) => {\r\n if (!(displaySet instanceof ImageSet)) {\r\n throw new OHIFError(`StudyMetadata::sortSeriesByDisplaySets display set at index ${index} is not an instance of ImageSet`);\r\n }\r\n\r\n // In case of multiframe studies, just get the first index occurence\r\n if (displaySetsMapping[displaySet.SeriesInstanceUID] === void 0) {\r\n displaySetsMapping[displaySet.SeriesInstanceUID] = index;\r\n }\r\n });\r\n\r\n // Clone of actual series\r\n const actualSeries = this.getSeries();\r\n\r\n actualSeries.forEach((series, index) => {\r\n if (!(series instanceof SeriesMetadata)) {\r\n throw new OHIFError(`StudyMetadata::sortSeriesByDisplaySets series at index ${index} is not an instance of SeriesMetadata`);\r\n }\r\n\r\n // Get the new series index\r\n const seriesIndex = displaySetsMapping[series.getSeriesInstanceUID()];\r\n\r\n // Update the series object with the new series position\r\n this._series[seriesIndex] = series;\r\n });\r\n }\r\n\r\n /**\r\n * Compares the current study instance with another one.\r\n * @param {StudyMetadata} study An instance of the StudyMetadata class.\r\n * @returns {boolean} Returns true if both instances refer to the same study.\r\n */\r\n equals(study) {\r\n const self = this;\r\n return study === self || (study instanceof StudyMetadata && study.getStudyInstanceUID() === self.getStudyInstanceUID());\r\n }\r\n\r\n /**\r\n * Get the first series of the current study retaining a consistent result across multiple calls.\r\n * @return {SeriesMetadata} An instance of the SeriesMetadata class or null if it does not exist.\r\n */\r\n getFirstSeries() {\r\n let series = this._firstSeries;\r\n if (!(series instanceof SeriesMetadata)) {\r\n series = null;\r\n const found = this.getSeriesByIndex(0);\r\n if (found instanceof SeriesMetadata) {\r\n this._firstSeries = found;\r\n series = found;\r\n }\r\n }\r\n return series;\r\n }\r\n\r\n /**\r\n * Get the first image id given display instance uid.\r\n * @return {string} The image id.\r\n */\r\n getFirstImageId(displaySetInstanceUID) {\r\n try {\r\n const displaySet = this.findDisplaySet((displaySet) => displaySet.displaySetInstanceUID === displaySetInstanceUID);\r\n return displaySet.images[0].getImageId();\r\n } catch (error) {\r\n console.error('Failed to retrieve image metadata');\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Get the first instance of the current study retaining a consistent result across multiple calls.\r\n * @return {InstanceMetadata} An instance of the InstanceMetadata class or null if it does not exist.\r\n */\r\n getFirstInstance() {\r\n let instance = this._firstInstance;\r\n if (!(instance instanceof InstanceMetadata)) {\r\n instance = null;\r\n const firstSeries = this.getFirstSeries();\r\n if (firstSeries instanceof SeriesMetadata) {\r\n const found = firstSeries.getFirstInstance();\r\n if (found instanceof InstanceMetadata) {\r\n this._firstInstance = found;\r\n instance = found;\r\n }\r\n }\r\n }\r\n return instance;\r\n }\r\n\r\n /**\r\n * Search the associated series to find an specific instance using the supplied callback as criteria.\r\n * The callback is passed two arguments: instance (a InstanceMetadata instance) and index (the integer\r\n * index of the instance within the current series)\r\n * @param {function} callback The callback function which will be invoked for each instance instance.\r\n * @returns {Object} Result object containing series (SeriesMetadata) and instance (InstanceMetadata)\r\n * objects or an empty object if not found.\r\n */\r\n findSeriesAndInstanceByInstance(callback) {\r\n let result;\r\n\r\n if (Metadata.isValidCallback(callback)) {\r\n let instance;\r\n\r\n const series = this._series.find((series) => {\r\n instance = series.findInstance(callback);\r\n return instance instanceof InstanceMetadata;\r\n });\r\n\r\n // No series found\r\n if (series instanceof SeriesMetadata) {\r\n result = {\r\n series,\r\n instance\r\n };\r\n }\r\n }\r\n\r\n return result || {};\r\n }\r\n\r\n /**\r\n * Find series by instance using the supplied callback as criteria. The callback is passed\r\n * two arguments: instance (a InstanceMetadata instance) and index (the integer index of\r\n * the instance within its series)\r\n * @param {function} callback The callback function which will be invoked for each instance.\r\n * @returns {SeriesMetadata|undefined} If a series is found based on callback criteria it\r\n * returns a SeriesMetadata. \"undefined\" is returned otherwise\r\n */\r\n findSeriesByInstance(callback) {\r\n const result = this.findSeriesAndInstanceByInstance(callback);\r\n\r\n return result.series;\r\n }\r\n\r\n /**\r\n * Find an instance using the supplied callback as criteria. The callback is passed\r\n * two arguments: instance (a InstanceMetadata instance) and index (the integer index of\r\n * the instance within its series)\r\n * @param {function} callback The callback function which will be invoked for each instance.\r\n * @returns {InstanceMetadata|undefined} If an instance is found based on callback criteria it\r\n * returns a InstanceMetadata. \"undefined\" is returned otherwise\r\n */\r\n findInstance(callback) {\r\n const result = this.findSeriesAndInstanceByInstance(callback);\r\n\r\n return result.instance;\r\n }\r\n\r\n // Mod by Triet\r\n /**\r\n * Check if the series with subseries exists under the custom id\r\n * @param {string} customId, SeriesUID + '_' + SubSeriesId\r\n */\r\n getSeriesIndexByCustomId(customId) {\r\n const index = this._series.findIndex((series) => {\r\n return series.combinedId === customId;\r\n });\r\n\r\n if (index < 0) {\r\n return null;\r\n }\r\n return index;\r\n }\r\n}\r\n\r\n/**\r\n *\r\n * @typedef StudyMetadata\r\n * @property {function} getSeriesCount - returns the number of series in the study\r\n * @property {function} forEachSeries - function that invokes callback with each series and index\r\n * @property {function} getStudyInstanceUID - returns the study's instance UID\r\n *\r\n */\r\n\r\n/**\r\n * @typedef SeriesMetadata\r\n * @property {function} getSeriesInstanceUID - returns the series's instance UID\r\n * @property {function} getData - ???\r\n * @property {function} forEachInstance - ???\r\n */\r\n\r\nconst dwc = api.DICOMwebClient;\r\n\r\nconst isMultiFrame = (instance) => {\r\n return instance.getTagValue('NumberOfFrames') > 1;\r\n};\r\n\r\nconst makeDisplaySet = (series, instances) => {\r\n const instance = instances[0];\r\n const imageSet = new ImageSet(instances);\r\n const seriesData = series.getData();\r\n\r\n // set appropriate attributes to image set...\r\n imageSet.setAttributes({\r\n displaySetInstanceUID: imageSet.uid, // create a local alias for the imageSet UID\r\n SeriesDate: seriesData.SeriesDate,\r\n SeriesTime: seriesData.SeriesTime,\r\n SeriesInstanceUID: series.getSeriesInstanceUID(),\r\n // SeriesNumber: instance.getTagValue('SeriesNumber'),\r\n // SeriesDescription: instance.getTagValue('SeriesDescription'),\r\n SeriesNumber: series.getSeriesNumber(),\r\n SeriesDescription: series.getSeriesDescription(),\r\n numImageFrames: instances.length,\r\n frameRate: instance.getTagValue('FrameTime'),\r\n Modality: instance.getTagValue('Modality'),\r\n isMultiFrame: isMultiFrame(instance)\r\n });\r\n\r\n // Sort the images in this series if needed\r\n const shallSort = true; //!OHIF.utils.ObjectPath.get(Meteor, 'settings.public.ui.sortSeriesByIncomingOrder');\r\n if (shallSort) {\r\n imageSet.sortBy((a, b) => {\r\n // Sort by InstanceNumber (0020,0013)\r\n return (parseInt(a.getTagValue('InstanceNumber', 0)) || 0) - (parseInt(b.getTagValue('InstanceNumber', 0)) || 0);\r\n });\r\n }\r\n\r\n // Include the first image instance number (after sorted)\r\n imageSet.setAttribute('InstanceNumber', imageSet.getImage(0).getTagValue('InstanceNumber'));\r\n\r\n const isReconstructable = isDisplaySetReconstructable(instances);\r\n\r\n imageSet.isReconstructable = isReconstructable.value;\r\n\r\n if (shallSort && imageSet.isReconstructable) {\r\n imageSet.sortByImagePositionPatient();\r\n }\r\n\r\n if (isReconstructable.missingFrames) {\r\n // TODO -> This is currently unused, but may be used for reconstructing\r\n // Volumes with gaps later on.\r\n imageSet.missingFrames = isReconstructable.missingFrames;\r\n }\r\n\r\n // Mod by Triet\r\n //Get calculated spacings between slices in the set\r\n const calculatedSpacings = getImageSetCalculatedSpacings(instances);\r\n imageSet.calculatedSpacings = calculatedSpacings;\r\n // console.log('Make Displayset', imageSet);\r\n\r\n return imageSet;\r\n};\r\n\r\nconst isSingleImageModality = (Modality) => {\r\n return Modality === 'CR' || Modality === 'MG' || Modality === 'DX';\r\n};\r\n\r\nfunction getSopClassUIDs(series) {\r\n const uniqueSopClassUIDsInSeries = new Set();\r\n series.forEachInstance((instance) => {\r\n const instanceSopClassUID = instance.getTagValue('SOPClassUID');\r\n\r\n uniqueSopClassUIDsInSeries.add(instanceSopClassUID);\r\n });\r\n const sopClassUIDs = Array.from(uniqueSopClassUIDsInSeries);\r\n\r\n return sopClassUIDs;\r\n}\r\n\r\n/**\r\n * @private\r\n * @param {SeriesMetadata} series\r\n * @param {StudyMetadata} study\r\n * @param {string[]} sopClassUIDs\r\n */\r\nfunction _getDisplaySetFromSopClassModule(\r\n sopClassHandlerExtensions, // TODO: Update Usage\r\n series,\r\n study,\r\n sopClassUIDs\r\n) {\r\n // TODO: For now only use the plugins if all instances have the same SOPClassUID\r\n if (sopClassUIDs.length !== 1) {\r\n console.warn('getDisplaySetFromSopClassPlugin: More than one SOPClassUID in the same series is not yet supported.');\r\n return;\r\n }\r\n\r\n const SOPClassUID = sopClassUIDs[0];\r\n const sopClassHandlerModules = sopClassHandlerExtensions.map((extension) => {\r\n return extension.module;\r\n });\r\n\r\n const handlersForSopClassUID = sopClassHandlerModules.filter((module) => {\r\n return module.sopClassUIDs.includes(SOPClassUID);\r\n });\r\n\r\n // TODO: Sort by something, so we can determine which plugin to use\r\n if (!handlersForSopClassUID || !handlersForSopClassUID.length) {\r\n return;\r\n }\r\n\r\n const plugin = handlersForSopClassUID[0];\r\n const headers = DICOMWeb.getAuthorizationHeader();\r\n const errorInterceptor = errorHandler.getHTTPErrorHandler();\r\n const dicomWebClient = new dwc({\r\n url: study.getData().wadoRoot,\r\n headers,\r\n errorInterceptor\r\n });\r\n\r\n let displaySet = plugin.getDisplaySetFromSeries(series, study, dicomWebClient, headers);\r\n if (displaySet && !displaySet.Modality) {\r\n const instance = series.getFirstInstance();\r\n displaySet.Modality = instance.getTagValue('Modality');\r\n }\r\n return displaySet;\r\n}\r\n\r\n/**\r\n * Sort series primarily by Modality (i.e., series with references to other\r\n * series like SEG, KO or PR are grouped in the end of the list) and then by\r\n * series number:\r\n *\r\n * --------\r\n * | CT #3 |\r\n * | CT #4 |\r\n * | CT #5 |\r\n * --------\r\n * | SEG #1 |\r\n * | SEG #2 |\r\n * --------\r\n *\r\n * @param {*} a - DisplaySet\r\n * @param {*} b - DisplaySet\r\n */\r\n\r\nfunction seriesSortingCriteria(a, b) {\r\n const isLowPriorityA = isLowPriorityModality(a.Modality);\r\n const isLowPriorityB = isLowPriorityModality(b.Modality);\r\n if (!isLowPriorityA && isLowPriorityB) {\r\n return -1;\r\n }\r\n if (isLowPriorityA && !isLowPriorityB) {\r\n return 1;\r\n }\r\n return sortBySeriesNumber(a, b);\r\n}\r\n\r\n/**\r\n * Sort series by series number. Series with low\r\n * @param {*} a - DisplaySet\r\n * @param {*} b - DisplaySet\r\n */\r\nfunction sortBySeriesNumber(a, b) {\r\n const seriesNumberAIsGreaterOrUndefined = a.SeriesNumber > b.SeriesNumber || (!a.SeriesNumber && b.SeriesNumber);\r\n\r\n return seriesNumberAIsGreaterOrUndefined ? 1 : -1;\r\n}\r\n\r\n/**\r\n * Sorts a list of display set objects\r\n * @param {Array} list A list of display sets to be sorted\r\n */\r\nfunction sortDisplaySetList(list) {\r\n return list.sort(seriesSortingCriteria);\r\n}\r\n","export function getCornerstoneWADOImageLoader() {\r\n return import(\r\n /* webpackChunkName: \"CornerstoneWADOImageLoader\" */ 'cornerstone-wado-image-loader'\r\n );\r\n}\r\n","function getWADORSImageUrl(instance, frame) {\r\n let wadorsuri = instance.wadorsuri;\r\n\r\n if (!wadorsuri) {\r\n return;\r\n }\r\n\r\n // Use null to obtain an imageId which represents the instance\r\n if (frame === null) {\r\n wadorsuri = wadorsuri.replace(/frames\\/(\\d+)/, '');\r\n } else {\r\n // We need to sum 1 because WADO-RS frame number is 1-based\r\n frame = frame ? parseInt(frame) + 1 : 1;\r\n\r\n // Replaces /frame/1 by /frame/{frame}\r\n wadorsuri = wadorsuri.replace(/frames\\/(\\d+)/, `frames/${frame}`);\r\n }\r\n\r\n return wadorsuri;\r\n}\r\n\r\n/**\r\n * Obtain an imageId for Cornerstone based on the WADO-RS scheme\r\n *\r\n * @param {object} instanceMetada metadata object (InstanceMetadata)\r\n * @param {(string\\|number)} [frame] the frame number\r\n * @returns {string} The imageId to be used by Cornerstone\r\n */\r\nexport default function getWADORSImageId(instance, frame) {\r\n const uri = getWADORSImageUrl(instance, frame);\r\n\r\n if (!uri) {\r\n return;\r\n }\r\n\r\n return `wadors:${uri}`;\r\n}\r\n","import getWADORSImageId from './getWADORSImageId';\r\n\r\n// https://stackoverflow.com/a/6021027/3895126\r\nfunction updateQueryStringParameter(uri, key, value) {\r\n const regex = new RegExp('([?&])' + key + '=.*?(&|$)', 'i');\r\n const separator = uri.indexOf('?') !== -1 ? '&' : '?';\r\n if (uri.match(regex)) {\r\n return uri.replace(regex, '$1' + key + '=' + value + '$2');\r\n } \r\n return uri + separator + key + '=' + value;\r\n \r\n}\r\n\r\n/**\r\n * Obtain an imageId for Cornerstone from an image instance\r\n *\r\n * @param instance\r\n * @param frame\r\n * @param thumbnail\r\n * @returns {string} The imageId to be used by Cornerstone\r\n */\r\nexport default function getImageId(instance, frame, thumbnail = false) {\r\n if (!instance) {\r\n return;\r\n }\r\n\r\n if (typeof instance.getImageId === 'function') {\r\n return instance.getImageId();\r\n }\r\n\r\n if (instance.url) {\r\n if (frame !== undefined) {\r\n instance.url = updateQueryStringParameter(instance.url, 'frame', frame);\r\n }\r\n\r\n return instance.url;\r\n }\r\n\r\n const renderingAttr = thumbnail ? 'thumbnailRendering' : 'imageRendering';\r\n\r\n if (\r\n !instance[renderingAttr] ||\r\n instance[renderingAttr] === 'wadouri' ||\r\n !instance.wadorsuri\r\n ) {\r\n let imageId = 'dicomweb:' + instance.wadouri;\r\n if (frame !== undefined) {\r\n imageId += '&frame=' + frame;\r\n }\r\n\r\n return imageId;\r\n } \r\n return getWADORSImageId(instance, frame, thumbnail); // WADO-RS Retrieve Frame\r\n \r\n}\r\n","/**\r\n * Convert String to ArrayBuffer\r\n *\r\n * @param {String} str Input String\r\n * @return {ArrayBuffer} Output converted ArrayBuffer\r\n */\r\nexport default function str2ab(str) {\r\n const strLen = str.length;\r\n const bytes = new Uint8Array(strLen);\r\n\r\n for (let i = 0; i < strLen; i++) {\r\n bytes[i] = str.charCodeAt(i);\r\n }\r\n\r\n return bytes.buffer;\r\n}\r\n","import {api} from 'dicomweb-client';\r\nimport DICOMWeb from '../../DICOMWeb';\r\nimport str2ab from '../str2ab';\r\n\r\nexport default async function fetchPaletteColorLookupTableData(\r\n instance,\r\n server\r\n) {\r\n const {\r\n PaletteColorLookupTableUID,\r\n RedPaletteColorLookupTableDescriptor,\r\n GreenPaletteColorLookupTableDescriptor,\r\n BluePaletteColorLookupTableDescriptor,\r\n RedPaletteColorLookupTableData,\r\n GreenPaletteColorLookupTableData,\r\n BluePaletteColorLookupTableData\r\n } = instance;\r\n\r\n return new Promise((resolve) => {\r\n let entry;\r\n if (_paletteColorCache.isValidUID(PaletteColorLookupTableUID)) {\r\n entry = _paletteColorCache.get(PaletteColorLookupTableUID);\r\n\r\n if (entry) {\r\n return resolve(entry);\r\n }\r\n }\r\n\r\n // no entry in cache... Fetch remote data.\r\n const promises = [\r\n _getPaletteColor(\r\n server,\r\n RedPaletteColorLookupTableData,\r\n RedPaletteColorLookupTableDescriptor\r\n ),\r\n _getPaletteColor(\r\n server,\r\n GreenPaletteColorLookupTableData,\r\n GreenPaletteColorLookupTableDescriptor\r\n ),\r\n _getPaletteColor(\r\n server,\r\n BluePaletteColorLookupTableData,\r\n BluePaletteColorLookupTableDescriptor\r\n )\r\n ];\r\n\r\n Promise.all(promises).then(\r\n ([\r\n RedPaletteColorLookupTableData,\r\n GreenPaletteColorLookupTableData,\r\n BluePaletteColorLookupTableData\r\n ]) => {\r\n // when PaletteColorLookupTableUID is present, the entry can be cached...\r\n _paletteColorCache.add({\r\n RedPaletteColorLookupTableData,\r\n GreenPaletteColorLookupTableData,\r\n BluePaletteColorLookupTableData,\r\n PaletteColorLookupTableUID\r\n });\r\n\r\n instance.RedPaletteColorLookupTableData = RedPaletteColorLookupTableData;\r\n instance.GreenPaletteColorLookupTableData = GreenPaletteColorLookupTableData;\r\n instance.BluePaletteColorLookupTableData = BluePaletteColorLookupTableData;\r\n\r\n resolve();\r\n }\r\n );\r\n });\r\n}\r\n\r\n/**\r\n * Simple cache schema for retrieved color palettes.\r\n */\r\nconst _paletteColorCache = {\r\n count: 0,\r\n maxAge: 24 * 60 * 60 * 1000, // 24h cache?\r\n entries: {},\r\n isValidUID: function(PaletteColorLookupTableUID) {\r\n return (\r\n typeof PaletteColorLookupTableUID === 'string' &&\r\n PaletteColorLookupTableUID.length > 0\r\n );\r\n },\r\n get: function(PaletteColorLookupTableUID) {\r\n let entry = null;\r\n if (Object.prototype.hasOwnProperty.call(this.entries, PaletteColorLookupTableUID)) {\r\n entry = this.entries[PaletteColorLookupTableUID];\r\n // check how the entry is...\r\n if (Date.now() - entry.time > this.maxAge) {\r\n // entry is too old... remove entry.\r\n delete this.entries[PaletteColorLookupTableUID];\r\n this.count--;\r\n entry = null;\r\n }\r\n }\r\n return entry;\r\n },\r\n add: function(entry) {\r\n if (this.isValidUID(entry.uid)) {\r\n let PaletteColorLookupTableUID = entry.uid;\r\n if (Object.prototype.hasOwnProperty.call(this.entries, PaletteColorLookupTableUID) !== true) {\r\n this.count++; // increment cache entry count...\r\n }\r\n entry.time = Date.now();\r\n this.entries[PaletteColorLookupTableUID] = entry;\r\n // @TODO: Add logic to get rid of old entries and reduce memory usage...\r\n }\r\n }\r\n};\r\n\r\nfunction _getPaletteColor(server, paletteColorLookupTableData, lutDescriptor) {\r\n const numLutEntries = lutDescriptor[0];\r\n const bits = lutDescriptor[2];\r\n\r\n const readUInt16 = (byteArray, position) => {\r\n return byteArray[position] + byteArray[position + 1] * 256;\r\n };\r\n\r\n const arrayBufferToPaletteColorLUT = (arraybuffer) => {\r\n const byteArray = new Uint8Array(arraybuffer);\r\n const lut = [];\r\n\r\n if (bits === 16) {\r\n for (let i = 0; i < numLutEntries; i++) {\r\n lut[i] = readUInt16(byteArray, i * 2);\r\n }\r\n } else {\r\n for (let i = 0; i < numLutEntries; i++) {\r\n lut[i] = byteArray[i];\r\n }\r\n }\r\n\r\n return lut;\r\n };\r\n\r\n if (paletteColorLookupTableData.BulkDataURI) {\r\n let uri = paletteColorLookupTableData.BulkDataURI;\r\n\r\n // TODO: Workaround for dcm4chee behind SSL-terminating proxy returning\r\n // incorrect bulk data URIs\r\n if (server.wadoRoot.indexOf('https') === 0 && !uri.includes('https')) {\r\n uri = uri.replace('http', 'https');\r\n }\r\n\r\n const config = {\r\n url: server.wadoRoot, //BulkDataURI is absolute, so this isn't used\r\n headers: DICOMWeb.getAuthorizationHeader(server)\r\n };\r\n const dicomWeb = new api.DICOMwebClient(config);\r\n const options = {\r\n BulkDataURI: uri\r\n };\r\n\r\n return dicomWeb\r\n .retrieveBulkData(options)\r\n .then((result) => result[0])\r\n .then(arrayBufferToPaletteColorLUT);\r\n } else if (paletteColorLookupTableData.InlineBinary) {\r\n const inlineBinaryData = atob(paletteColorLookupTableData.InlineBinary);\r\n const arraybuffer = str2ab(inlineBinaryData);\r\n\r\n return new Promise((resolve) => {\r\n resolve(arrayBufferToPaletteColorLUT(arraybuffer));\r\n });\r\n } \r\n return Promise.resolve(arrayBufferToPaletteColorLUT(paletteColorLookupTableData));\r\n \r\n}\r\n","export default function unpackOverlay(arrayBuffer) {\r\n const bitArray = new Uint8Array(arrayBuffer);\r\n const byteArray = new Uint8Array(8 * bitArray.length);\r\n\r\n for (let byteIndex = 0; byteIndex < byteArray.length; byteIndex++) {\r\n const bitIndex = byteIndex % 8;\r\n const bitByteIndex = Math.floor(byteIndex / 8);\r\n byteArray[byteIndex] =\r\n 1 * ((bitArray[bitByteIndex] & (1 << bitIndex)) >> bitIndex);\r\n }\r\n\r\n return byteArray;\r\n}\r\n","import {api} from 'dicomweb-client';\r\nimport DICOMWeb from '../../DICOMWeb';\r\nimport str2ab from '../str2ab';\r\nimport unpackOverlay from './unpackOverlay';\r\n\r\nexport default async function fetchOverlayData(instance, server) {\r\n const OverlayDataPromises = [];\r\n const OverlayDataTags = [];\r\n\r\n return new Promise((resolve) => {\r\n for (let overlayGroup = 0x00; overlayGroup <= 0x1e; overlayGroup += 0x02) {\r\n let groupStr = `60${overlayGroup.toString(16)}`;\r\n\r\n if (groupStr.length === 3) {\r\n groupStr = `600${overlayGroup.toString(16)}`;\r\n }\r\n\r\n const OverlayDataTag = `${groupStr}3000`;\r\n\r\n if (instance[OverlayDataTag] && instance[OverlayDataTag].InlineBinary) {\r\n const inlineBinaryData = atob(instance[OverlayDataTag].InlineBinary);\r\n const arraybuffer = str2ab(inlineBinaryData);\r\n\r\n instance[OverlayDataTag] = unpackOverlay(arraybuffer);\r\n } else if (instance[OverlayDataTag] && instance[OverlayDataTag].BulkDataURI) {\r\n OverlayDataPromises.push(\r\n _getOverlayData(instance[OverlayDataTag], server)\r\n );\r\n OverlayDataTags.push(OverlayDataTag);\r\n } else if (instance[OverlayDataTag] && instance[OverlayDataTag] instanceof ArrayBuffer) {\r\n instance[OverlayDataTag] = unpackOverlay(instance[OverlayDataTag]);\r\n }\r\n }\r\n\r\n if (OverlayDataPromises.length) {\r\n Promise.all(OverlayDataPromises).then((results) => {\r\n for (let i = 0; i < results.length; i++) {\r\n instance[OverlayDataTags[i]] = results[i];\r\n }\r\n\r\n resolve();\r\n });\r\n } else {\r\n resolve();\r\n }\r\n });\r\n}\r\n\r\nasync function _getOverlayData(tag, server) {\r\n const {BulkDataURI} = tag;\r\n\r\n let uri = BulkDataURI;\r\n\r\n // TODO: Workaround for dcm4chee behind SSL-terminating proxy returning\r\n // incorrect bulk data URIs\r\n if (server.wadoRoot.indexOf('https') === 0 && !uri.includes('https')) {\r\n uri = uri.replace('http', 'https');\r\n }\r\n\r\n const config = {\r\n url: server.wadoRoot, //BulkDataURI is absolute, so this isn't used\r\n headers: DICOMWeb.getAuthorizationHeader(server)\r\n };\r\n const dicomWeb = new api.DICOMwebClient(config);\r\n const options = {\r\n BulkDataURI: uri\r\n };\r\n\r\n return dicomWeb\r\n .retrieveBulkData(options)\r\n .then((result) => result[0])\r\n .then(unpackOverlay);\r\n}\r\n\r\n\r\n","import * as dcmjs from 'dcmjs';\r\nimport queryString from 'query-string';\r\nimport dicomParser from 'dicom-parser';\r\nimport getPixelSpacingInformation from '../utils/metadataProvider/getPixelSpacingInformation';\r\nimport fetchPaletteColorLookupTableData from '../utils/metadataProvider/fetchPaletteColorLookupTableData';\r\nimport fetchOverlayData from '../utils/metadataProvider/fetchOverlayData';\r\n\r\nclass MetadataProvider {\r\n constructor() {\r\n // Define the main \"metadataLookup\" private property as an immutable property.\r\n Object.defineProperty(this, 'studies', {\r\n configurable: false,\r\n enumerable: false,\r\n writable: false,\r\n value: new Map()\r\n });\r\n Object.defineProperty(this, 'imageIdToUIDs', {\r\n configurable: false,\r\n enumerable: false,\r\n writable: false,\r\n value: new Map()\r\n });\r\n }\r\n\r\n async addInstance(dicomJSONDatasetOrP10ArrayBuffer, options = {}) {\r\n let dicomJSONDataset;\r\n\r\n // If Arraybuffer, parse to DICOMJSON before naturalizing.\r\n if (dicomJSONDatasetOrP10ArrayBuffer instanceof ArrayBuffer) {\r\n const dicomData = dcmjs.data.DicomMessage.readFile(dicomJSONDatasetOrP10ArrayBuffer);\r\n\r\n dicomJSONDataset = dicomData.dict;\r\n } else {\r\n dicomJSONDataset = dicomJSONDatasetOrP10ArrayBuffer;\r\n }\r\n\r\n // Check if dataset is already naturalized.\r\n\r\n let naturalizedDataset;\r\n\r\n if (dicomJSONDataset['SeriesInstanceUID'] === undefined) {\r\n naturalizedDataset = dcmjs.data.DicomMetaDictionary.naturalizeDataset(\r\n dicomJSONDataset\r\n );\r\n } else {\r\n naturalizedDataset = dicomJSONDataset;\r\n }\r\n\r\n // fix for iTech protocol\r\n if (options.StudyInstanceUID) naturalizedDataset.StudyInstanceUID = options.StudyInstanceUID;\r\n\r\n const {\r\n StudyInstanceUID,\r\n SeriesInstanceUID,\r\n SOPInstanceUID\r\n } = naturalizedDataset;\r\n\r\n const study = this._getAndCacheStudy(StudyInstanceUID);\r\n const series = this._getAndCacheSeriesFromStudy(study, SeriesInstanceUID);\r\n const instance = this._getAndCacheInstanceFromStudy(series, SOPInstanceUID);\r\n\r\n Object.assign(instance, naturalizedDataset);\r\n\r\n // TODO: comment by TungLT\r\n // if (options.server) {\r\n // await this._checkBulkDataAndInlineBinaries(instance, options.server);\r\n // }\r\n\r\n return instance;\r\n }\r\n\r\n addImageIdToUIDs(imageId, uids) {\r\n // This method is a fallback for when you don't have WADO-URI or WADO-RS.\r\n // You can add instances fetched by any method by calling addInstance, and hook an imageId to point at it here.\r\n // An example would be dicom hosted at some random site.\r\n\r\n this.imageIdToUIDs.set(imageId, uids);\r\n }\r\n\r\n _getAndCacheStudy(StudyInstanceUID) {\r\n const studies = this.studies;\r\n\r\n let study = studies.get(StudyInstanceUID);\r\n\r\n if (!study) {\r\n study = {series: new Map()};\r\n studies.set(StudyInstanceUID, study);\r\n }\r\n\r\n return study;\r\n }\r\n\r\n _getAndCacheSeriesFromStudy(study, SeriesInstanceUID) {\r\n let series = study.series.get(SeriesInstanceUID);\r\n\r\n if (!series) {\r\n series = {instances: new Map()};\r\n study.series.set(SeriesInstanceUID, series);\r\n }\r\n\r\n return series;\r\n }\r\n\r\n _getAndCacheInstanceFromStudy(series, SOPInstanceUID) {\r\n let instance = series.instances.get(SOPInstanceUID);\r\n\r\n if (!instance) {\r\n instance = {};\r\n series.instances.set(SOPInstanceUID, instance);\r\n }\r\n\r\n return instance;\r\n }\r\n\r\n async _checkBulkDataAndInlineBinaries(instance, server) {\r\n await fetchOverlayData(instance, server);\r\n\r\n if (instance.PhotometricInterpretation === 'PALETTE COLOR') {\r\n await fetchPaletteColorLookupTableData(instance, server);\r\n }\r\n }\r\n\r\n _getInstance(imageId) {\r\n const uids = this._getUIDsFromImageID(imageId);\r\n\r\n if (!uids) {\r\n return;\r\n }\r\n\r\n const {StudyInstanceUID, SeriesInstanceUID, SOPInstanceUID} = uids;\r\n\r\n return this._getInstanceData(\r\n StudyInstanceUID,\r\n SeriesInstanceUID,\r\n SOPInstanceUID\r\n );\r\n }\r\n\r\n get(query, imageId, options = {fallback: false}) {\r\n const instance = this._getInstance(imageId);\r\n\r\n if (query === INSTANCE) {\r\n return instance;\r\n }\r\n\r\n return this.getTagFromInstance(query, instance, options);\r\n }\r\n\r\n getTag(query, imageId, options) {\r\n return this.get(query, imageId, options);\r\n }\r\n\r\n getInstance(imageId) {\r\n return this.get(INSTANCE, imageId);\r\n }\r\n\r\n getTagFromInstance(\r\n naturalizedTagOrWADOImageLoaderTag,\r\n instance\r\n ) {\r\n if (!instance) {\r\n return;\r\n }\r\n\r\n // If its a naturalized dcmjs tag present on the instance, return.\r\n if (instance[naturalizedTagOrWADOImageLoaderTag]) {\r\n return instance[naturalizedTagOrWADOImageLoaderTag];\r\n }\r\n\r\n // Maybe its a legacy CornerstoneWADOImageLoader tag then:\r\n return this._getCornerstoneWADOImageLoaderTag(\r\n naturalizedTagOrWADOImageLoaderTag,\r\n instance\r\n );\r\n }\r\n\r\n _getCornerstoneWADOImageLoaderTag(wadoImageLoaderTag, instance) {\r\n let metadata;\r\n\r\n switch (wadoImageLoaderTag) {\r\n case WADO_IMAGE_LOADER_TAGS.GENERAL_SERIES_MODULE:\r\n const {SeriesDate, SeriesTime} = instance;\r\n\r\n let seriesDate;\r\n let seriesTime;\r\n\r\n if (SeriesDate) {\r\n seriesDate = dicomParser.parseDA(SeriesDate);\r\n }\r\n\r\n if (SeriesTime) {\r\n seriesTime = dicomParser.parseTM(SeriesTime);\r\n }\r\n\r\n metadata = {\r\n modality: instance.Modality,\r\n seriesInstanceUID: instance.SeriesInstanceUID,\r\n seriesNumber: instance.SeriesNumber,\r\n studyInstanceUID: instance.StudyInstanceUID,\r\n seriesDate,\r\n seriesTime,\r\n seriesDescription: instance.SeriesDescription\r\n };\r\n break;\r\n case WADO_IMAGE_LOADER_TAGS.PATIENT_STUDY_MODULE:\r\n metadata = {\r\n patientAge: instance.PatientAge,\r\n patientSize: instance.PatientSize,\r\n patientWeight: instance.PatientWeight\r\n };\r\n break;\r\n case WADO_IMAGE_LOADER_TAGS.IMAGE_PLANE_MODULE:\r\n const {ImageOrientationPatient} = instance;\r\n\r\n // Fallback for DX images.\r\n // TODO: We should use the rest of the results of this function\r\n // to update the UI somehow\r\n const {PixelSpacing} = getPixelSpacingInformation(instance);\r\n\r\n let rowPixelSpacing;\r\n let columnPixelSpacing;\r\n\r\n let rowCosines;\r\n let columnCosines;\r\n\r\n if (PixelSpacing) {\r\n rowPixelSpacing = PixelSpacing[0];\r\n columnPixelSpacing = PixelSpacing[1];\r\n }\r\n\r\n if (ImageOrientationPatient) {\r\n rowCosines = ImageOrientationPatient.slice(0, 3);\r\n columnCosines = ImageOrientationPatient.slice(3, 6);\r\n }\r\n\r\n metadata = {\r\n frameOfReferenceUID: instance.FrameOfReferenceUID,\r\n rows: instance.Rows,\r\n columns: instance.Columns,\r\n imageOrientationPatient: ImageOrientationPatient,\r\n rowCosines,\r\n columnCosines,\r\n imagePositionPatient: instance.ImagePositionPatient,\r\n sliceThickness: instance.SliceThickness,\r\n sliceLocation: instance.SliceLocation,\r\n pixelSpacing: PixelSpacing,\r\n rowPixelSpacing,\r\n columnPixelSpacing\r\n };\r\n break;\r\n case WADO_IMAGE_LOADER_TAGS.IMAGE_PIXEL_MODULE:\r\n metadata = {\r\n samplesPerPixel: instance.SamplesPerPixel,\r\n photometricInterpretation: instance.PhotometricInterpretation,\r\n rows: instance.Rows,\r\n columns: instance.Columns,\r\n bitsAllocated: instance.BitsAllocated,\r\n bitsStored: instance.BitsStored,\r\n highBit: instance.HighBit,\r\n pixelRepresentation: instance.PixelRepresentation,\r\n planarConfiguration: instance.PlanarConfiguration,\r\n pixelAspectRatio: instance.PixelAspectRatio,\r\n smallestPixelValue: instance.SmallestPixelValue,\r\n largestPixelValue: instance.LargestPixelValue,\r\n redPaletteColorLookupTableDescriptor:\r\n instance.RedPaletteColorLookupTableDescriptor,\r\n greenPaletteColorLookupTableDescriptor:\r\n instance.GreenPaletteColorLookupTableDescriptor,\r\n bluePaletteColorLookupTableDescriptor:\r\n instance.BluePaletteColorLookupTableDescriptor,\r\n redPaletteColorLookupTableData:\r\n instance.RedPaletteColorLookupTableData,\r\n greenPaletteColorLookupTableData:\r\n instance.GreenPaletteColorLookupTableData,\r\n bluePaletteColorLookupTableData:\r\n instance.BluePaletteColorLookupTableData\r\n };\r\n\r\n break;\r\n case WADO_IMAGE_LOADER_TAGS.VOI_LUT_MODULE:\r\n const {WindowCenter, WindowWidth} = instance;\r\n\r\n const windowCenter = Array.isArray(WindowCenter)\r\n ? WindowCenter\r\n : [WindowCenter];\r\n const windowWidth = Array.isArray(WindowWidth)\r\n ? WindowWidth\r\n : [WindowWidth];\r\n\r\n metadata = {\r\n windowCenter,\r\n windowWidth\r\n };\r\n\r\n break;\r\n case WADO_IMAGE_LOADER_TAGS.MODALITY_LUT_MODULE:\r\n metadata = {\r\n rescaleIntercept: instance.RescaleIntercept,\r\n rescaleSlope: instance.RescaleSlope,\r\n rescaleType: instance.RescaleType\r\n };\r\n break;\r\n case WADO_IMAGE_LOADER_TAGS.SOP_COMMON_MODULE:\r\n metadata = {\r\n sopClassUID: instance.SOPClassUID,\r\n sopInstanceUID: instance.SOPInstanceUID\r\n };\r\n break;\r\n case WADO_IMAGE_LOADER_TAGS.PET_ISOTOPE_MODULE:\r\n const {RadiopharmaceuticalInformationSequence} = instance;\r\n\r\n if (RadiopharmaceuticalInformationSequence) {\r\n const RadiopharmaceuticalInformation = Array.isArray(\r\n RadiopharmaceuticalInformationSequence\r\n )\r\n ? RadiopharmaceuticalInformationSequence[0]\r\n : RadiopharmaceuticalInformationSequence;\r\n\r\n const {\r\n RadiopharmaceuticalStartTime,\r\n RadionuclideTotalDose,\r\n RadionuclideHalfLife\r\n } = RadiopharmaceuticalInformation;\r\n\r\n const radiopharmaceuticalInfo = {\r\n radiopharmaceuticalStartTime: dicomParser.parseTM(\r\n RadiopharmaceuticalStartTime\r\n ),\r\n radionuclideTotalDose: RadionuclideTotalDose,\r\n radionuclideHalfLife: RadionuclideHalfLife\r\n };\r\n metadata = {\r\n radiopharmaceuticalInfo\r\n };\r\n }\r\n\r\n break;\r\n case WADO_IMAGE_LOADER_TAGS.OVERLAY_PLANE_MODULE:\r\n metadata = {};\r\n\r\n for (\r\n let overlayGroup = 0x00;\r\n overlayGroup <= 0x1e;\r\n overlayGroup += 0x02\r\n ) {\r\n let groupStr = `60${overlayGroup.toString(16)}`;\r\n\r\n if (groupStr.length === 3) {\r\n groupStr = `600${overlayGroup.toString(16)}`;\r\n }\r\n\r\n const OverlayDataTag = `${groupStr}3000`;\r\n const OverlayData = instance[OverlayDataTag];\r\n\r\n if (!OverlayData) {\r\n continue;\r\n }\r\n\r\n const OverlayRowsTag = `${groupStr}0010`;\r\n const OverlayColumnsTag = `${groupStr}0011`;\r\n const OverlayType = `${groupStr}0040`;\r\n const OverlayOriginTag = `${groupStr}0050`;\r\n const OverlayDescriptionTag = `${groupStr}0022`;\r\n const OverlayLabelTag = `${groupStr}1500`;\r\n const ROIAreaTag = `${groupStr}1301`;\r\n const ROIMeanTag = `${groupStr}1302`;\r\n const ROIStandardDeviationTag = `${groupStr}1303`;\r\n const OverlayOrigin = instance[OverlayOriginTag];\r\n\r\n metadata.overlay = {\r\n rows: instance[OverlayRowsTag],\r\n columns: instance[OverlayColumnsTag],\r\n type: instance[OverlayType],\r\n x: OverlayOrigin[0],\r\n y: OverlayOrigin[1],\r\n pixelData: OverlayData,\r\n description: instance[OverlayDescriptionTag],\r\n label: instance[OverlayLabelTag],\r\n roiArea: instance[ROIAreaTag],\r\n roiMean: instance[ROIMeanTag],\r\n roiStandardDeviation: instance[ROIStandardDeviationTag]\r\n };\r\n }\r\n\r\n break;\r\n\r\n case WADO_IMAGE_LOADER_TAGS.PATIENT_MODULE:\r\n const {PatientName} = instance;\r\n\r\n let patientName;\r\n if (PatientName) {\r\n patientName = PatientName.Alphabetic;\r\n }\r\n\r\n metadata = {\r\n patientName,\r\n patientId: instance.PatientID\r\n };\r\n\r\n break;\r\n\r\n case WADO_IMAGE_LOADER_TAGS.GENERAL_IMAGE_MODULE:\r\n metadata = {\r\n instanceNumber: instance.InstanceNumber,\r\n lossyImageCompression: instance.LossyImageCompression,\r\n lossyImageCompressionRatio: instance.LossyImageCompressionRatio,\r\n lossyImageCompressionMethod: instance.LossyImageCompressionMethod\r\n };\r\n\r\n break;\r\n case WADO_IMAGE_LOADER_TAGS.GENERAL_STUDY_MODULE:\r\n metadata = {\r\n studyDescription: instance.StudyDescription,\r\n studyDate: instance.StudyDate,\r\n studyTime: instance.StudyTime,\r\n accessionNumber: instance.AccessionNumber\r\n };\r\n\r\n break;\r\n case WADO_IMAGE_LOADER_TAGS.CINE_MODULE:\r\n metadata = {\r\n frameTime: instance.FrameTime\r\n };\r\n\r\n break;\r\n }\r\n\r\n return metadata;\r\n }\r\n\r\n _getInstanceData(StudyInstanceUID, SeriesInstanceUID, SOPInstanceUID) {\r\n const study = this.studies.get(StudyInstanceUID);\r\n\r\n if (!study) {\r\n return;\r\n }\r\n\r\n const series = study.series.get(SeriesInstanceUID);\r\n\r\n if (!series) {\r\n return;\r\n }\r\n\r\n const instance = series.instances.get(SOPInstanceUID);\r\n\r\n return instance;\r\n }\r\n\r\n _getUIDsFromImageID(imageId) {\r\n if (imageId.includes('wadors:')) {\r\n const strippedImageId = imageId.split('studies/')[1];\r\n const splitImageId = strippedImageId.split('/');\r\n\r\n return {\r\n StudyInstanceUID: splitImageId[0], // Note: splitImageId[1] === 'series'\r\n SeriesInstanceUID: splitImageId[2], // Note: splitImageId[3] === 'instances'\r\n SOPInstanceUID: splitImageId[4]\r\n };\r\n }\r\n if (imageId.includes('wado?requestType=WADO')) {\r\n const qs = queryString.parse(imageId);\r\n\r\n return {\r\n StudyInstanceUID: qs.studyUID,\r\n SeriesInstanceUID: qs.seriesUID,\r\n SOPInstanceUID: qs.objectUID\r\n };\r\n } \r\n // Maybe its a non-standard imageId\r\n return this.imageIdToUIDs.get(imageId);\r\n \r\n }\r\n}\r\n\r\nconst metadataProvider = new MetadataProvider();\r\n\r\nexport default metadataProvider;\r\n\r\nconst WADO_IMAGE_LOADER_TAGS = {\r\n // CornerstoneWADOImageLoader specific\r\n GENERAL_SERIES_MODULE: 'generalSeriesModule',\r\n PATIENT_STUDY_MODULE: 'patientStudyModule',\r\n IMAGE_PLANE_MODULE: 'imagePlaneModule',\r\n IMAGE_PIXEL_MODULE: 'imagePixelModule',\r\n VOI_LUT_MODULE: 'voiLutModule',\r\n MODALITY_LUT_MODULE: 'modalityLutModule',\r\n SOP_COMMON_MODULE: 'sopCommonModule',\r\n PET_ISOTOPE_MODULE: 'petIsotopeModule',\r\n OVERLAY_PLANE_MODULE: 'overlayPlaneModule',\r\n\r\n // react-cornerstone-viewport specifc\r\n PATIENT_MODULE: 'patientModule',\r\n GENERAL_IMAGE_MODULE: 'generalImageModule',\r\n GENERAL_STUDY_MODULE: 'generalStudyModule',\r\n CINE_MODULE: 'cineModule'\r\n};\r\n\r\nconst INSTANCE = 'instance';\r\n","import log from '../../log';\r\n\r\nexport default function getPixelSpacingInformation(instance) {\r\n // See http://gdcm.sourceforge.net/wiki/index.php/Imager_Pixel_Spacing\r\n\r\n // TODO: Add Ultrasound region spacing\r\n // TODO: Add manual calibration\r\n\r\n // TODO: Use ENUMS from dcmjs\r\n const projectionRadiographSOPClassUIDs = [\r\n '1.2.840.10008.5.1.4.1.1.1', //\tCR Image Storage\r\n '1.2.840.10008.5.1.4.1.1.1.1', //\tDigital X-Ray Image Storage – for Presentation\r\n '1.2.840.10008.5.1.4.1.1.1.1.1', //\tDigital X-Ray Image Storage – for Processing\r\n '1.2.840.10008.5.1.4.1.1.1.2', //\tDigital Mammography X-Ray Image Storage – for Presentation\r\n '1.2.840.10008.5.1.4.1.1.1.2.1', //\tDigital Mammography X-Ray Image Storage – for Processing\r\n '1.2.840.10008.5.1.4.1.1.1.3', //\tDigital Intra – oral X-Ray Image Storage – for Presentation\r\n '1.2.840.10008.5.1.4.1.1.1.3.1', //\tDigital Intra – oral X-Ray Image Storage – for Processing\r\n '1.2.840.10008.5.1.4.1.1.12.1', //\tX-Ray Angiographic Image Storage\r\n '1.2.840.10008.5.1.4.1.1.12.1.1', //\tEnhanced XA Image Storage\r\n '1.2.840.10008.5.1.4.1.1.12.2', //\tX-Ray Radiofluoroscopic Image Storage\r\n '1.2.840.10008.5.1.4.1.1.12.2.1', //\tEnhanced XRF Image Storage\r\n '1.2.840.10008.5.1.4.1.1.12.3' // X-Ray Angiographic Bi-plane Image Storage\tRetired\r\n ];\r\n\r\n const {\r\n PixelSpacing,\r\n ImagerPixelSpacing,\r\n SOPClassUID,\r\n PixelSpacingCalibrationType,\r\n PixelSpacingCalibrationDescription,\r\n EstimatedRadiographicMagnificationFactor,\r\n SequenceOfUltrasoundRegions\r\n } = instance;\r\n const isProjection = projectionRadiographSOPClassUIDs.includes(SOPClassUID);\r\n\r\n const TYPES = {\r\n NOT_APPLICABLE: 'NOT_APPLICABLE',\r\n UNKNOWN: 'UNKNOWN',\r\n CALIBRATED: 'CALIBRATED',\r\n DETECTOR: 'DETECTOR'\r\n };\r\n\r\n if (isProjection && !ImagerPixelSpacing) {\r\n // If only Pixel Spacing is present, and this is a projection radiograph,\r\n // PixelSpacing should be used, but the user should be informed that\r\n // what it means is unknown\r\n return {\r\n PixelSpacing,\r\n type: TYPES.UNKNOWN,\r\n isProjection\r\n };\r\n } else if (\r\n PixelSpacing &&\r\n ImagerPixelSpacing &&\r\n PixelSpacing === ImagerPixelSpacing\r\n ) {\r\n // If Imager Pixel Spacing and Pixel Spacing are present and they have the same values,\r\n // then the user should be informed that the measurements are at the detector plane\r\n return {\r\n PixelSpacing,\r\n type: TYPES.DETECTOR,\r\n isProjection\r\n };\r\n } else if (\r\n PixelSpacing &&\r\n ImagerPixelSpacing &&\r\n PixelSpacing !== ImagerPixelSpacing\r\n ) {\r\n // If Imager Pixel Spacing and Pixel Spacing are present and they have different values,\r\n // then the user should be informed that these are \"calibrated\"\r\n // (in some unknown manner if Pixel Spacing Calibration Type and/or\r\n // Pixel Spacing Calibration Description are absent)\r\n return {\r\n PixelSpacing,\r\n type: TYPES.CALIBRATED,\r\n isProjection,\r\n PixelSpacingCalibrationType,\r\n PixelSpacingCalibrationDescription\r\n };\r\n } else if (!PixelSpacing && ImagerPixelSpacing) {\r\n let CorrectedImagerPixelSpacing = ImagerPixelSpacing;\r\n if (EstimatedRadiographicMagnificationFactor) {\r\n // Note that in IHE Mammo profile compliant displays, the value of Imager Pixel Spacing is required to be corrected by\r\n // Estimated Radiographic Magnification Factor and the user informed of that.\r\n // TODO: should this correction be done before all of this logic?\r\n CorrectedImagerPixelSpacing = ImagerPixelSpacing.map(\r\n (pixelSpacing) => pixelSpacing / EstimatedRadiographicMagnificationFactor\r\n );\r\n } else {\r\n log.info(\r\n 'EstimatedRadiographicMagnificationFactor was not present. Unable to correct ImagerPixelSpacing.'\r\n );\r\n }\r\n\r\n return {\r\n PixelSpacing: CorrectedImagerPixelSpacing,\r\n isProjection\r\n };\r\n } else if (\r\n SequenceOfUltrasoundRegions &&\r\n typeof SequenceOfUltrasoundRegions === 'object'\r\n ) {\r\n const {PhysicalDeltaX, PhysicalDeltaY} = SequenceOfUltrasoundRegions;\r\n const USPixelSpacing = [PhysicalDeltaX * 10, PhysicalDeltaY * 10];\r\n\r\n return {\r\n PixelSpacing: USPixelSpacing\r\n };\r\n } else if (\r\n SequenceOfUltrasoundRegions &&\r\n Array.isArray(SequenceOfUltrasoundRegions) &&\r\n SequenceOfUltrasoundRegions.length > 1\r\n ) {\r\n log.warn(\r\n 'Sequence of Ultrasound Regions > one entry. This is not yet implemented, all measurements will be shown in pixels.'\r\n );\r\n } else if (isProjection === false && !ImagerPixelSpacing) {\r\n // If only Pixel Spacing is present, and this is not a projection radiograph,\r\n // we can stop here\r\n return {\r\n PixelSpacing,\r\n type: TYPES.NOT_APPLICABLE,\r\n isProjection\r\n };\r\n }\r\n\r\n log.info(\r\n 'Unknown combination of PixelSpacing and ImagerPixelSpacing identified. Unable to determine spacing.'\r\n );\r\n}\r\n","import OHIFError from '../classes/OHIFError.js';\r\nimport getImageId from './getImageId';\r\nimport metadataProvider from '../classes/MetadataProvider.js';\r\n\r\nlet stackMap = {};\r\nlet configuration = {};\r\nconst stackUpdatedCallbacks = [];\r\n\r\n/**\r\n * Loop through the current series and add metadata to the\r\n * Cornerstone meta data provider. This will be used to fill information\r\n * into the viewport overlays, and to calculate reference lines and orientation markers\r\n * @param {Object} stackMap stackMap object\r\n * @param {Object} study Study object\r\n * @param {Object} displaySet The set of images to make the stack from\r\n * @return {Array} Array with image IDs\r\n */\r\nfunction createAndAddStack(stackMap, study, displaySet, stackUpdatedCallbacks) {\r\n const images = displaySet.images;\r\n if (!images) {\r\n return;\r\n }\r\n\r\n const numImages = images.length;\r\n const imageIds = [];\r\n let imageId;\r\n\r\n displaySet.images.forEach((instance, imageIndex) => {\r\n const image = instance.getData();\r\n const metaData = {\r\n instance: image, // in this context, instance will be the data of the InstanceMetadata object...\r\n series: displaySet, // TODO: Check this\r\n study,\r\n numImages,\r\n imageIndex: imageIndex + 1\r\n };\r\n\r\n const naturalizedInstance = instance.getData().metadata;\r\n const NumberOfFrames = naturalizedInstance.NumberOfFrames;\r\n\r\n if (NumberOfFrames > 1) {\r\n for (let i = 0; i < NumberOfFrames; i++) {\r\n metaData.frameNumber = i;\r\n imageId = getImageId(image, i);\r\n imageIds.push(imageId);\r\n\r\n const {\r\n StudyInstanceUID,\r\n SeriesInstanceUID,\r\n SOPInstanceUID\r\n } = instance.getData().metadata;\r\n\r\n metadataProvider.addImageIdToUIDs(imageId, {\r\n StudyInstanceUID,\r\n SeriesInstanceUID,\r\n SOPInstanceUID\r\n });\r\n }\r\n } else {\r\n metaData.frameNumber = 1;\r\n imageId = getImageId(image);\r\n imageIds.push(imageId);\r\n\r\n const {\r\n StudyInstanceUID,\r\n SeriesInstanceUID,\r\n SOPInstanceUID\r\n } = naturalizedInstance;\r\n\r\n metadataProvider.addImageIdToUIDs(imageId, {\r\n StudyInstanceUID,\r\n SeriesInstanceUID,\r\n SOPInstanceUID\r\n });\r\n }\r\n });\r\n\r\n const stack = {\r\n StudyInstanceUID: study.StudyInstanceUID,\r\n displaySetInstanceUID: displaySet.displaySetInstanceUID,\r\n imageIds,\r\n frameRate: displaySet.frameRate,\r\n isClip: displaySet.isClip\r\n };\r\n\r\n stackMap[displaySet.displaySetInstanceUID] = stack;\r\n\r\n return stack;\r\n}\r\n\r\nconfiguration = {\r\n createAndAddStack\r\n};\r\n\r\n/**\r\n * This object contains all the functions needed for interacting with the stack manager.\r\n * Generally, findStack is the only function used. If you want to know when new stacks\r\n * come in, you can register a callback with addStackUpdatedCallback.\r\n */\r\nconst StackManager = {\r\n /**\r\n * Removes all current stacks\r\n */\r\n clearStacks() {\r\n stackMap = {};\r\n },\r\n /**\r\n * Create a stack from an image set, as well as add in the metadata on a per image bases.\r\n * @param study The study who's metadata will be added\r\n * @param displaySet The set of images to make the stack from\r\n * @return {Array} Array with image IDs\r\n */\r\n makeAndAddStack(study, displaySet) {\r\n return configuration.createAndAddStack(\r\n stackMap,\r\n study,\r\n displaySet,\r\n stackUpdatedCallbacks\r\n );\r\n },\r\n /**\r\n * Find a stack from the currently created stacks.\r\n * @param displaySetInstanceUID The UID of the stack to find.\r\n * @returns {*} undefined if not found, otherwise the stack object is returned.\r\n */\r\n findStack(displaySetInstanceUID) {\r\n return stackMap[displaySetInstanceUID];\r\n },\r\n /**\r\n * Find a stack or reate one if it has not been created yet\r\n * @param study The study who's metadata will be added\r\n * @param displaySet The set of images to make the stack from\r\n * @return {Array} Array with image IDs\r\n */\r\n findOrCreateStack(study, displaySet) {\r\n let stack = this.findStack(displaySet.displaySetInstanceUID);\r\n\r\n if (!stack || !stack.imageIds) {\r\n stack = this.makeAndAddStack(study, displaySet);\r\n }\r\n\r\n return stack;\r\n },\r\n /**\r\n * Gets the underlying map of displaySetInstanceUID to stack object.\r\n * WARNING: Do not change this object. It directly affects the manager.\r\n * @returns {{}} map of displaySetInstanceUID -> stack.\r\n */\r\n getAllStacks() {\r\n return stackMap;\r\n },\r\n /**\r\n * Adds in a callback to be called on a stack being added / updated.\r\n * @param callback must accept at minimum one argument,\r\n * which is the stack that was added / updated.\r\n */\r\n addStackUpdatedCallback(callback) {\r\n if (typeof callback !== 'function') {\r\n throw new OHIFError('callback must be provided as a function');\r\n }\r\n stackUpdatedCallbacks.push(callback);\r\n },\r\n /**\r\n * Return configuration\r\n */\r\n getConfiguration() {\r\n return configuration;\r\n },\r\n /**\r\n * Set configuration, in order to provide compatibility\r\n * with other systems by overriding this functions\r\n * @param {Object} config object with functions to be overrided\r\n *\r\n * For now, only makeAndAddStack can be overrided\r\n */\r\n setConfiguration(config) {\r\n configuration = config;\r\n }\r\n};\r\n\r\nexport {StackManager};\r\nexport default StackManager;\r\n","import cornerstone from 'cornerstone-core';\nimport { getCornerstoneWADOImageLoader } from '../utils/cornerstoneWADOImageLoader';\nimport StackManager from '../utils/StackManager';\n\nclass BaseLoadingListener {\n constructor(stack, options = {}) {\n this.id = BaseLoadingListener.getNewId();\n this.stack = stack;\n this.startListening();\n this.statsItemsLimit = options.statsItemsLimit || 2;\n this.stats = {\n items: [],\n total: 0,\n elapsedTime: 0,\n speed: 0\n };\n\n this._setProgressData = options._setProgressData;\n this._clearProgressById = options._clearProgressById;\n\n // Register the start point to make it possible to calculate\n // bytes/s or frames/s when the first byte or frame is received\n this._addStatsData(0);\n\n // Update the progress before starting the download\n // to make it possible to update the UI\n this._updateProgress();\n }\n\n _addStatsData(value) {\n const date = new Date();\n const stats = this.stats;\n const items = stats.items;\n const newItem = {\n value,\n date\n };\n\n items.push(newItem);\n stats.total += newItem.value;\n\n // Remove items until it gets below the limit\n while (items.length > this.statsItemsLimit) {\n const item = items.shift();\n stats.total -= item.value;\n }\n\n // Update the elapsedTime (seconds) based on first and last\n // elements and recalculate the speed (bytes/s or frames/s)\n if (items.length > 1) {\n const oldestItem = items[0];\n stats.elapsedTime = (newItem.date.getTime() - oldestItem.date.getTime()) / 1000;\n stats.speed = (stats.total - oldestItem.value) / stats.elapsedTime;\n }\n }\n\n _getProgressId() {\n const displaySetInstanceUID = this.stack.displaySetInstanceUID;\n return 'StackProgress:' + displaySetInstanceUID;\n }\n\n _clearProgress() {\n const progressId = this._getProgressId();\n this._clearProgressById(progressId);\n }\n\n startListening() {\n throw new Error('`startListening` must be implemented by child classes');\n }\n\n stopListening() {\n throw new Error('`stopListening` must be implemented by child classes');\n }\n\n destroy() {\n this.stopListening();\n this._clearProgress();\n }\n\n static getNewId() {\n const timeSlice = new Date().getTime().toString().slice(-8);\n const randomNumber = parseInt(Math.random() * 1000000000);\n\n return timeSlice.toString() + randomNumber.toString();\n }\n}\n\nclass DICOMFileLoadingListener extends BaseLoadingListener {\n constructor(stack, options) {\n super(stack, options);\n this._dataSetUrl = this._getDataSetUrl(stack);\n this._lastLoaded = 0;\n\n // Check how many instances has already been download (cached)\n this._checkCachedData();\n }\n\n async _checkCachedData() {\n const cornerstoneWADOImageLoader = await getCornerstoneWADOImageLoader();\n const dataSet = cornerstoneWADOImageLoader.wadouri.dataSetCacheManager.get(this._dataSetUrl);\n\n if (dataSet) {\n const dataSetLength = dataSet.byteArray.length;\n\n this._updateProgress({\n percentComplete: 100,\n loaded: dataSetLength,\n total: dataSetLength\n });\n }\n }\n\n _getImageLoadProgressEventName() {\n // TODO: Add this event as a constant in Cornerstone\n return 'cornerstoneimageloadprogress.' + this.id;\n }\n\n startListening() {\n const imageLoadProgressEventName = this._getImageLoadProgressEventName();\n\n this.imageLoadProgressEventHandler = this._imageLoadProgressEventHandle.bind(this);\n\n this.stopListening();\n\n cornerstone.events.addEventListener(imageLoadProgressEventName, this.imageLoadProgressEventHandle);\n }\n\n stopListening() {\n const imageLoadProgressEventName = this._getImageLoadProgressEventName();\n cornerstone.events.removeEventListener(imageLoadProgressEventName, this.imageLoadProgressEventHandle);\n }\n\n _imageLoadProgressEventHandler = (e) => {\n const eventData = e.detail;\n const dataSetUrl = this._convertImageIdToDataSetUrl(eventData.imageId);\n const bytesDiff = eventData.loaded - this._lastLoaded;\n\n if (!this._dataSetUrl === dataSetUrl) {\n return;\n }\n\n // Add the bytes downloaded to the stats\n this._addStatsData(bytesDiff);\n\n // Update the download progress\n this._updateProgress(eventData);\n\n // Cache the last eventData.loaded value\n this._lastLoaded = eventData.loaded;\n };\n\n _updateProgress(eventData) {\n const progressId = this._getProgressId();\n eventData = eventData || {};\n\n const progressData = {\n multiFrame: false,\n percentComplete: eventData.percentComplete,\n bytesLoaded: eventData.loaded,\n bytesTotal: eventData.total,\n bytesPerSecond: this.stats.speed\n };\n\n this._setProgressData(progressId, progressData);\n }\n\n _convertImageIdToDataSetUrl(imageId) {\n // Remove the prefix (\"dicomweb:\" or \"wadouri:\"\")\n imageId = imageId.replace(/^(dicomweb:|wadouri:)/i, '');\n\n // Remove \"frame=999&\" from the imageId\n imageId = imageId.replace(/frame=\\d+&?/i, '');\n\n // Remove the last \"&\" like in \"http://...?foo=1&bar=2&\"\n imageId = imageId.replace(/&$/, '');\n\n return imageId;\n }\n\n _getDataSetUrl(stack) {\n const imageId = stack.imageIds[0];\n return this._convertImageIdToDataSetUrl(imageId);\n }\n}\n\nclass StackLoadingListener extends BaseLoadingListener {\n constructor(stack, options = {}) {\n options.statsItemsLimit = 20;\n super(stack, options);\n\n this.imageDataMap = this._convertImageIdsArrayToMap(stack.imageIds);\n this.framesStatus = this._createArray(stack.imageIds.length, false);\n this.loadedCount = 0;\n\n // Check how many instances has already been download (cached)\n this._checkCachedData();\n }\n\n _convertImageIdsArrayToMap(imageIds) {\n const imageIdsMap = new Map();\n\n for (let i = 0; i < imageIds.length; i++) {\n imageIdsMap.set(imageIds[i], {\n index: i,\n loaded: false\n });\n }\n\n return imageIdsMap;\n }\n\n _createArray(length, defaultValue) {\n // `new Array(length)` is an anti-pattern in javascript because its\n // funny API. Otherwise I would go for `new Array(length).fill(false)`\n const array = [];\n\n for (let i = 0; i < length; i++) {\n array[i] = defaultValue;\n }\n\n return array;\n }\n\n _checkCachedData() {\n // const imageIds = this.stack.imageIds;\n // TODO: No way to check status of Promise.\n /*for(let i = 0; i < imageIds.length; i++) {\n const imageId = imageIds[i];\n\n const imagePromise = cornerstone.imageCache.getImageLoadObject(imageId).promise;\n\n if (imagePromise && (imagePromise.state() === 'resolved')) {\n this._updateFrameStatus(imageId, true);\n }\n }*/\n }\n\n _getImageLoadedEventName() {\n return `${cornerstone.EVENTS.IMAGE_LOADED}.${this.id}`;\n }\n\n _getImageCachePromiseRemoveEventName() {\n return `${cornerstone.EVENTS.IMAGE_CACHE_PROMISE_REMOVED}.${this.id}`;\n }\n\n _imageLoadedEventHandler(e) {\n this._updateFrameStatus(e.detail.image.imageId, true);\n }\n\n _imageCachePromiseRemovedEventHandler(e) {\n this._updateFrameStatus(e.detail.imageId, false);\n }\n\n startListening() {\n const imageLoadedEventName = this._getImageLoadedEventName();\n const imageCachePromiseRemovedEventName = this._getImageCachePromiseRemoveEventName();\n\n this.imageLoadedEventHandler = this._imageLoadedEventHandler.bind(this);\n this.imageCachePromiseRemovedEventHandler = this._imageCachePromiseRemovedEventHandler.bind(this);\n\n this.stopListening();\n\n cornerstone.events.addEventListener(imageLoadedEventName, this.imageLoadedEventHandler);\n cornerstone.events.addEventListener(imageCachePromiseRemovedEventName, this.imageCachePromiseRemovedEventHandler);\n }\n\n stopListening() {\n const imageLoadedEventName = this._getImageLoadedEventName();\n const imageCachePromiseRemovedEventName = this._getImageCachePromiseRemoveEventName();\n\n cornerstone.events.removeEventListener(imageLoadedEventName, this.imageLoadedEventHandler);\n cornerstone.events.removeEventListener(imageCachePromiseRemovedEventName, this.imageCachePromiseRemovedEventHandler);\n }\n\n _updateFrameStatus(imageId, loaded) {\n const imageData = this.imageDataMap.get(imageId);\n\n if (!imageData || imageData.loaded === loaded) {\n return;\n }\n\n // Add one more frame to the stats\n if (loaded) {\n this._addStatsData(1);\n }\n\n imageData.loaded = loaded;\n this.framesStatus[imageData.index] = loaded;\n this.loadedCount += loaded ? 1 : -1;\n this._updateProgress();\n }\n\n _setProgressData(progressId, progressData) {\n // TODO: This method (and _clearProgressById) need to access\n // the Redux store and should therefore be provided from the\n // application. I've added a workaround to pass this in through\n // the 'options' variable on instantiation, but this is really ugly.\n // We could consider making the StudyLoadingListener a higher-order\n // component which would set this stuff itself.\n throw new Error(\"The _setProgressData function must be provided in StudyLoadingListener's options\");\n }\n\n _clearProgressById(progressId) {\n throw new Error(\"The _clearProgressById function must be provided in StudyLoadingListener's options\");\n }\n\n _updateProgress() {\n const totalFramesCount = this.stack.imageIds.length;\n const loadedFramesCount = this.loadedCount;\n const loadingFramesCount = totalFramesCount - loadedFramesCount;\n const percentComplete = Math.round((loadedFramesCount / totalFramesCount) * 100);\n const progressId = this._getProgressId();\n const progressData = {\n multiFrame: true,\n totalFramesCount,\n loadedFramesCount,\n loadingFramesCount,\n percentComplete,\n framesPerSecond: this.stats.speed,\n framesStatus: this.framesStatus\n };\n\n this._setProgressData(progressId, progressData);\n }\n\n _logProgress() {\n const totalFramesCount = this.stack.imageIds.length;\n const displaySetInstanceUID = this.stack.displaySetInstanceUID;\n let progressBar = '[';\n\n for (let i = 0; i < totalFramesCount; i++) {\n const ch = this.framesStatus[i] ? '|' : '.';\n progressBar += `${ch}`;\n }\n\n progressBar += ']';\n console.info(`${displaySetInstanceUID}: ${progressBar}`);\n }\n}\n\nclass StudyLoadingListener {\n constructor(options) {\n this.listeners = {};\n this.options = options;\n }\n\n addStack(stack, stackMetaData) {\n // TODO: Make this work for plugins\n if (!stack) {\n //console.log('Skipping adding stack to StudyLoadingListener');\n return;\n }\n\n const displaySetInstanceUID = stack.displaySetInstanceUID;\n\n if (!this.listeners[displaySetInstanceUID]) {\n const listener = this._createListener(stack, stackMetaData);\n if (listener) {\n this.listeners[displaySetInstanceUID] = listener;\n }\n }\n }\n\n addStudy(study) {\n study.displaySets.forEach((displaySet) => {\n const stack = StackManager.findOrCreateStack(study, displaySet);\n\n // TODO: Make this work for plugins\n if (!stack) {\n console.warn('Skipping adding displaySet to StudyLoadingListener');\n console.warn(displaySet);\n return;\n }\n\n this.addStack(stack, {\n isMultiFrame: displaySet.isMultiFrame\n });\n });\n }\n\n addStudies(studies) {\n if (!studies || !studies.length) {\n return;\n }\n\n studies.forEach((study) => this.addStudy(study));\n }\n\n clear() {\n const displaySetInstanceUIDs = Object.keys(this.listeners);\n const length = displaySetInstanceUIDs.length;\n\n for (let i = 0; i < length; i++) {\n const displaySetInstanceUID = displaySetInstanceUIDs[i];\n const displaySet = this.listeners[displaySetInstanceUID];\n\n displaySet.destroy();\n }\n\n this.listeners = {};\n }\n\n _createListener(stack, stackMetaData) {\n const schema = this._getSchema(stack);\n\n // A StackLoadingListener can be created if it's wadors or not a multiframe\n // wadouri instance (single file) that means \"N\" files will have to be\n // downloaded where \"N\" is the number of frames. DICOMFileLoadingListener\n // is created only if it's a single DICOM file and there's no way to know\n // how many frames has already been loaded (bytes/s instead of frames/s).\n if (schema === 'wadors' || !stackMetaData.isMultiFrame) {\n return new StackLoadingListener(stack, this.options);\n }\n return new DICOMFileLoadingListener(stack, this.options);\n }\n\n _getSchema(stack) {\n const imageId = stack.imageIds[0];\n if (!imageId) return null;\n const colonIndex = imageId.indexOf(':');\n return imageId.substring(0, colonIndex);\n }\n\n // Singleton\n static getInstance(options) {\n if (!StudyLoadingListener._instance) {\n StudyLoadingListener._instance = new StudyLoadingListener(options);\n }\n\n return StudyLoadingListener._instance;\n }\n}\n\nexport { StudyLoadingListener, StackLoadingListener, DICOMFileLoadingListener };\n","import guid from '../utils/guid';\n\n/**\n * Constants\n */\nconst PROPERTY_SEPARATOR = '.';\nconst ORDER_ASC = 'asc';\nconst ORDER_DESC = 'desc';\nconst MIN_COUNT = 0x00000000;\nconst MAX_COUNT = 0x7fffffff;\n\n/**\n * Class Definition\n */\nexport class TypeSafeCollection {\n constructor() {\n this._operationCount = MIN_COUNT;\n this._elementList = [];\n this._handlers = Object.create(null);\n }\n\n /**\n * Private Methods\n */\n\n _invalidate() {\n const count = this._operationCount;\n this._operationCount = count < MAX_COUNT ? count + 1 : MIN_COUNT;\n }\n\n _elements(silent) {\n silent === true || this._operationCount;\n return this._elementList;\n }\n\n _elementWithPayload(payload, silent) {\n return this._elements(silent).find((item) => item.payload === payload);\n }\n\n _elementWithId(id, silent) {\n return this._elements(silent).find((item) => item.id === id);\n }\n\n _trigger(event, data) {\n let handlers = this._handlers;\n if (event in handlers) {\n handlers = handlers[event];\n if (!(handlers instanceof Array)) {\n return;\n }\n for (let i = 0, limit = handlers.length; i < limit; ++i) {\n const handler = handlers[i];\n if (_isFunction(handler)) {\n handler.call(null, data);\n }\n }\n }\n }\n\n /**\n * Public Methods\n */\n\n onInsert(callback) {\n if (_isFunction(callback)) {\n let handlers = this._handlers.insert;\n if (!(handlers instanceof Array)) {\n handlers = [];\n this._handlers.insert = handlers;\n }\n handlers.push(callback);\n }\n }\n\n /**\n * Update the payload associated with the given ID to be the new supplied payload.\n * @param {string} id The ID of the entry that will be updated.\n * @param {any} payload The element that will replace the previous payload.\n * @returns {boolean} Returns true if the given ID is present in the collection, false otherwise.\n */\n updateById(id, payload) {\n let result = false;\n let found = this._elementWithPayload(payload, true);\n if (found) {\n // nothing to do since the element is already in the collection...\n if (found.id === id) {\n // set result to true since the ids match...\n result = true;\n this._invalidate();\n }\n } else {\n found = this._elementWithId(id, true);\n if (found) {\n found.payload = payload;\n result = true;\n this._invalidate();\n }\n }\n return result;\n }\n\n /**\n * Signal that the given element has been changed by notifying reactive data-source observers.\n * This method is basically a means to invalidate the inernal reactive data-source.\n * @param {any} payload The element that has been altered.\n * @returns {boolean} Returns true if the element is present in the collection, false otherwise.\n */\n update(payload) {\n let result = false;\n const found = this._elementWithPayload(payload, true);\n if (found) {\n // nothing to do since the element is already in the collection...\n result = true;\n this._invalidate();\n }\n return result;\n }\n\n /**\n * Insert an element in the collection. On success, the element ID (a unique string) is returned. On failure, returns null.\n * A failure scenario only happens when the given payload is already present in the collection. Note that NO exceptions are thrown!\n * @param {any} payload The element to be stored.\n * @returns {string} The ID of the inserted element or null if the element already exists...\n */\n insert(payload) {\n let id = null;\n const found = this._elementWithPayload(payload, true);\n if (!found) {\n id = guid();\n this._elements(true).push({id, payload});\n this._invalidate();\n this._trigger('insert', {id, data: payload});\n }\n return id;\n }\n\n /**\n * Remove all elements from the collection.\n * @returns {void} No meaningful value is returned.\n */\n removeAll() {\n const all = this._elements(true);\n const length = all.length;\n for (let i = length - 1; i >= 0; i--) {\n const item = all[i];\n delete item.id;\n delete item.payload;\n all[i] = null;\n }\n all.splice(0, length);\n this._invalidate();\n }\n\n /**\n * Remove elements from the collection that match the criteria given in the property map.\n * @param {Object} propertyMap A property map that will be macthed against all collection elements.\n * @returns {Array} A list with all removed elements.\n */\n remove(propertyMap) {\n const found = this.findAllEntriesBy(propertyMap);\n const foundCount = found.length;\n const removed = [];\n if (foundCount > 0) {\n const all = this._elements(true);\n for (let i = foundCount - 1; i >= 0; i--) {\n const item = found[i];\n all.splice(item[2], 1);\n removed.push(item[0]);\n }\n this._invalidate();\n }\n return removed;\n }\n\n /**\n * Provides the ID of the given element inside the collection.\n * @param {any} payload The element being searched for.\n * @returns {string} The ID of the given element or undefined if the element is not present.\n */\n getElementId(payload) {\n const found = this._elementWithPayload(payload);\n return found && found.id;\n }\n\n /**\n * Provides the position of the given element in the internal list returning -1 if the element is not present.\n * @param {any} payload The element being searched for.\n * @returns {number} The position of the given element in the internal list. If the element is not present -1 is returned.\n */\n findById(id) {\n const found = this._elementWithId(id);\n return found && found.payload;\n }\n\n /**\n * Provides the position of the given element in the internal list returning -1 if the element is not present.\n * @param {any} payload The element being searched for.\n * @returns {number} The position of the given element in the internal list. If the element is not present -1 is returned.\n */\n indexOfElement(payload) {\n return this._elements().indexOf(this._elementWithPayload(payload, true));\n }\n\n /**\n * Provides the position of the element associated with the given ID in the internal list returning -1 if the element is not present.\n * @param {string} id The index of the element.\n * @returns {number} The position of the element associated with the given ID in the internal list. If the element is not present -1 is returned.\n */\n indexOfId(id) {\n return this._elements().indexOf(this._elementWithId(id, true));\n }\n\n /**\n * Provides a list-like approach to the collection returning an element by index.\n * @param {number} index The index of the element.\n * @returns {any} If out of bounds, undefined is returned. Otherwise the element in the given position is returned.\n */\n getElementByIndex(index) {\n const found = this._elements()[index >= 0 ? index : -1];\n return found && found.payload;\n }\n\n /**\n * Find an element by a criteria defined by the given callback function.\n * Attention!!! The reactive source will not be notified if no valid callback is supplied...\n * @param {function} callback A callback function which will define the search criteria. The callback\n * function will be passed the collection element, its ID and its index in this very order. The callback\n * shall return true when its criterea has been fulfilled.\n * @returns {any} The matched element or undefined if not match was found.\n */\n find(callback) {\n let found;\n if (_isFunction(callback)) {\n found = this._elements().find((item, index) => callback.call(this, item.payload, item.id, index));\n }\n return found && found.payload;\n }\n\n /**\n * Find the first element that strictly matches the specified property map.\n * @param {Object} propertyMap A property map that will be macthed against all collection elements.\n * @param {Object} options A set of options. Currently only \"options.sort\" option is supported.\n * @param {Object.SortingSpecifier} options.sort An optional sorting specifier. If a sorting specifier is supplied\n * but is not valid, an exception will be thrown.\n * @returns {Any} The matched element or undefined if not match was found.\n */\n findBy(propertyMap, options) {\n let found;\n if (_isObject(options)) {\n // if the \"options\" argument is provided and is a valid object,\n // it must be applied to the dataset before search...\n const all = this.all(options);\n if (all.length > 0) {\n if (_isObject(propertyMap)) {\n found = all.find((item) => _compareToPropertyMapStrict(propertyMap, item));\n } else {\n found = all[0]; // simply extract the first element...\n }\n }\n } else if (_isObject(propertyMap)) {\n found = this._elements().find((item) => _compareToPropertyMapStrict(propertyMap, item.payload));\n if (found) {\n found = found.payload;\n }\n }\n return found;\n }\n\n /**\n * Find all elements that strictly match the specified property map.\n * Attention!!! The reactive source will not be notified if no valid property map is supplied...\n * @param {Object} propertyMap A property map that will be macthed against all collection elements.\n * @returns {Array} An array of entries of all elements that match the given criteria. Each set in\n * in the array has the following format: [ elementData, elementId, elementIndex ].\n */\n findAllEntriesBy(propertyMap) {\n const found = [];\n if (_isObject(propertyMap)) {\n this._elements().forEach((item, index) => {\n if (_compareToPropertyMapStrict(propertyMap, item.payload)) {\n // Match! Add it to the found list...\n found.push([item.payload, item.id, index]);\n }\n });\n }\n return found;\n }\n\n /**\n * Find all elements that match a specified property map.\n * Attention!!! The reactive source will not be notified if no valid property map is supplied...\n * @param {Object} propertyMap A property map that will be macthed against all collection elements.\n * @param {Object} options A set of options. Currently only \"options.sort\" option is supported.\n * @param {Object.SortingSpecifier} options.sort An optional sorting specifier. If a sorting specifier is supplied\n * but is not valid, an exception will be thrown.\n * @returns {Array} An array with all elements that match the given criteria and sorted in the specified sorting order.\n */\n findAllBy(propertyMap, options) {\n const found = this.findAllEntriesBy(propertyMap).map((item) => item[0]); // Only payload is relevant...\n if (_isObject(options)) {\n if ('sort' in options) {\n _sortListBy(found, options.sort);\n }\n }\n return found;\n }\n\n /**\n * Executes the supplied callback function for each element of the collection.\n * Attention!!! The reactive source will not be notified if no valid property map is supplied...\n * @param {function} callback The callback function to be executed. The callback is passed the element,\n * its ID and its index in this very order.\n * @returns {void} Nothing is returned.\n */\n forEach(callback) {\n if (_isFunction(callback)) {\n this._elements().forEach((item, index) => {\n callback.call(this, item.payload, item.id, index);\n });\n }\n }\n\n /**\n * Count the number of elements currently in the collection.\n * @returns {number} The current number of elements in the collection.\n */\n count() {\n return this._elements().length;\n }\n\n /**\n * Returns a list with all elements of the collection optionally sorted by a sorting specifier criteria.\n * @param {Object} options A set of options. Currently only \"options.sort\" option is supported.\n * @param {Object.SortingSpecifier} options.sort An optional sorting specifier. If a sorting specifier is supplied\n * but is not valid, an exception will be thrown.\n * @returns {Array} An array with all elements stored in the collection.\n */\n all(options) {\n const list = this._elements().map((item) => item.payload);\n if (_isObject(options)) {\n if ('sort' in options) {\n _sortListBy(list, options.sort);\n }\n }\n return list;\n }\n}\n\n/**\n * Utility Functions\n */\n\n/**\n * Test if supplied argument is a valid object for current class purposes.\n * Atention! The underscore version of this function should not be used for performance reasons.\n */\nfunction _isObject(subject) {\n return (\n subject instanceof Object ||\n (typeof subject === 'object' && subject !== null)\n );\n}\n\n/**\n * Test if supplied argument is a valid string for current class purposes.\n * Atention! The underscore version of this function should not be used for performance reasons.\n */\nfunction _isString(subject) {\n return typeof subject === 'string';\n}\n\n/**\n * Test if supplied argument is a valid function for current class purposes.\n * Atention! The underscore version of this function should not be used for performance reasons.\n */\nfunction _isFunction(subject) {\n return typeof subject === 'function';\n}\n\n/**\n * Retrieve an object's property value by name. Composite property names (e.g., 'address.country.name') are accepted.\n * @param {Object} targetObject The object we want read the property from...\n * @param {String} propertyName The property to be read (e.g., 'address.street.name' or 'address.street.number'\n * to read object.address.street.name or object.address.street.number, respectively);\n * @returns {Any} Returns whatever the property holds or undefined if the property cannot be read or reached.\n */\nfunction _getPropertyValue(targetObject, propertyName) {\n let propertyValue; // undefined (the default return value)\n if (_isObject(targetObject) && _isString(propertyName)) {\n const fragments = propertyName.split(PROPERTY_SEPARATOR);\n const fragmentCount = fragments.length;\n if (fragmentCount > 0) {\n const firstFragment = fragments[0];\n const remainingFragments =\n fragmentCount > 1 ? fragments.slice(1).join(PROPERTY_SEPARATOR) : null;\n propertyValue = targetObject[firstFragment];\n if (remainingFragments !== null) {\n propertyValue = _getPropertyValue(propertyValue, remainingFragments);\n }\n }\n }\n return propertyValue;\n}\n\n/**\n * Compare a property map with a target object using strict comparison.\n * @param {Object} propertyMap The property map whose properties will be used for comparison. Composite\n * property names (e.g., 'address.country.name') will be tested against the \"resolved\" properties from the target object.\n * @param {Object} targetObject The target object whose properties will be tested.\n * @returns {boolean} Returns true if the properties match, false otherwise.\n */\nfunction _compareToPropertyMapStrict(propertyMap, targetObject) {\n let result = false;\n // \"for in\" loops do not thown exceptions for invalid data types...\n for (const propertyName in propertyMap) {\n if (Object.prototype.hasOwnProperty.call(propertyMap, propertyName)) {\n if (\n propertyMap[propertyName] !==\n _getPropertyValue(targetObject, propertyName)\n ) {\n result = false;\n break;\n } else if (result !== true) {\n result = true;\n }\n }\n }\n return result;\n}\n\n/**\n * Checks if a sorting specifier is valid.\n * A valid sorting specifier consists of an array of arrays being each subarray a pair\n * in the format [\"property name\", \"sorting order\"].\n * The following exemple can be used to sort studies by \"date\"\" and use \"time\" to break ties in descending order.\n * [ [ 'study.date', 'desc' ], [ 'study.time', 'desc' ] ]\n * @param {Array} specifiers The sorting specifier to be tested.\n * @returns {boolean} Returns true if the specifiers are valid, false otherwise.\n */\nfunction _isValidSortingSpecifier(specifiers) {\n let result = true;\n if (specifiers instanceof Array && specifiers.length > 0) {\n for (let i = specifiers.length - 1; i >= 0; i--) {\n const item = specifiers[i];\n if (item instanceof Array) {\n const property = item[0];\n const order = item[1];\n if (\n _isString(property) &&\n (order === ORDER_ASC || order === ORDER_DESC)\n ) {\n continue;\n }\n }\n result = false;\n break;\n }\n }\n return result;\n}\n\n/**\n * Sorts an array based on sorting specifier options.\n * @param {Array} list The that needs to be sorted.\n * @param {Array} specifiers An array of specifiers. Please read isValidSortingSpecifier method definition for further details.\n * @returns {void} No value is returned. The array is sorted in place.\n */\nfunction _sortListBy(list, specifiers) {\n if (list instanceof Array && _isValidSortingSpecifier(specifiers)) {\n const specifierCount = specifiers.length;\n list.sort((a, b) => {\n // callback name for stack traces...\n let index = 0;\n while (index < specifierCount) {\n const specifier = specifiers[index];\n const property = specifier[0];\n const order = specifier[1] === ORDER_DESC ? -1 : 1;\n const aValue = _getPropertyValue(a, property);\n const bValue = _getPropertyValue(b, property);\n // @TODO: should we check for the types being compared, like:\n // ~~ if (typeof aValue !== typeof bValue) continue;\n // Not sure because dates, for example, can be correctly compared to numbers...\n if (aValue < bValue) {\n return order * -1;\n }\n if (aValue > bValue) {\n return order * 1;\n }\n if (++index >= specifierCount) {\n return 0;\n }\n }\n });\n } else {\n throw new Error('Invalid Arguments');\n }\n}\n","import {TypeSafeCollection} from '../classes/TypeSafeCollection';\r\n\r\nconst studyMetadataList = new TypeSafeCollection();\r\n\r\nfunction add(studyMetadata) {\r\n studyMetadataList.insert(studyMetadata);\r\n}\r\n\r\nfunction get(studyInstanceUID) {\r\n return studyMetadataList.findBy({studyInstanceUID});\r\n}\r\n\r\nfunction all(options) {\r\n return studyMetadataList.all(options);\r\n}\r\n\r\nfunction remove(studyInstanceUID) {\r\n studyMetadataList.remove({studyInstanceUID});\r\n}\r\n\r\nfunction purge() {\r\n studyMetadataList.removeAll();\r\n}\r\n\r\nexport default {\r\n add,\r\n get,\r\n all,\r\n remove,\r\n purge\r\n};\r\n","import OHIFError from './OHIFError';\n\n/**\n * Abstract class to fetch study metadata.\n */\nexport class StudyMetadataSource {\n /**\n * Get study metadata for a study with given study InstanceUID.\n * @param {String} studyInstanceUID Study InstanceUID.\n */\n getByInstanceUID(studyInstanceUID) {\n /**\n * Please override this method on a specialized class.\n */\n throw new OHIFError(\n 'StudyMetadataSource::getByInstanceUID is not overriden. Please, override it in a specialized class. See OHIFStudyMetadataSource for example'\n );\n }\n\n /**\n * Load study info and study metadata for a given study into the viewer.\n * @param {StudyMetadata} study StudyMetadata object.\n */\n loadStudy(study) {\n /**\n * Please override this method on a specialized class.\n */\n throw new OHIFError(\n 'StudyMetadataSource::loadStudy is not overriden. Please, override it in a specialized class. See OHIFStudyMetadataSource for example'\n );\n }\n}\n","import DICOMWeb from '../../../DICOMWeb';\r\n\r\n/**\r\n * Function to get series sequence (sequence of pepeating items where each\r\n * item includes the attributes of one or more series) based on a given sopInstance.\r\n *\r\n * @param {Object} instance The sop instance\r\n * @returns {Promise} Referenced series sequence\r\n */\r\nconst getReferencedSeriesSequence = (instance) => {\r\n const referencedSeriesSequenceRaw = instance['00081115'];\r\n\r\n const referencedSeriesSequence = [];\r\n\r\n if (referencedSeriesSequenceRaw && referencedSeriesSequenceRaw.Value) {\r\n referencedSeriesSequenceRaw.Value.forEach((referencedSeries) => {\r\n const referencedSeriesInstanceUID = DICOMWeb.getString(\r\n referencedSeries['0020000E']\r\n );\r\n\r\n const referencedInstanceSequenceRaw = referencedSeries['0008114A'];\r\n const referencedInstanceSequence = [];\r\n\r\n referencedInstanceSequenceRaw.Value.forEach((referencedInstance) => {\r\n referencedInstanceSequence.push({\r\n referencedSOPClassUID: DICOMWeb.getString(\r\n referencedInstance['00081150']\r\n ),\r\n referencedSOPInstanceUID: DICOMWeb.getString(\r\n referencedInstance['00081155']\r\n )\r\n });\r\n });\r\n\r\n referencedSeriesSequence.push({\r\n referencedSeriesInstanceUID,\r\n referencedInstanceSequence\r\n });\r\n });\r\n }\r\n\r\n return referencedSeriesSequence;\r\n};\r\n\r\nexport default getReferencedSeriesSequence;\r\n","import DICOMWeb from '../../../DICOMWeb';\r\nimport metadataProvider from '../../../classes/MetadataProvider';\r\nimport getWADORSImageId from '../../../utils/getWADORSImageId';\r\nimport getReferencedSeriesSequence from './getReferencedSeriesSequence';\r\nimport { getCornerstoneWADOImageLoader } from '../../../utils/cornerstoneWADOImageLoader';\r\n\r\n// Modified by TungLT\r\n/**\r\n * Create a plain JS object that describes a study (a study descriptor object)\r\n * @param {Object} server Object with server configuration parameters\r\n * @param {Object} aSopInstance a SOP Instance from which study information will be added\r\n * @param {String} studyInstanceUID of study, need to replace dicom tag of instance - iTech's security\r\n */\r\nfunction createStudy(server, aSopInstance, studyInstanceUID) {\r\n // TODO: Pass a reference ID to the server instead of including the URLs here\r\n return {\r\n series: [],\r\n seriesMap: Object.create(null),\r\n seriesLoader: null,\r\n wadoUriRoot: server.wadoUriRoot,\r\n wadoRoot: server.wadoRoot,\r\n qidoRoot: server.qidoRoot,\r\n PatientName: DICOMWeb.getName(aSopInstance['00100010']),\r\n PatientID: DICOMWeb.getString(aSopInstance['00100020']),\r\n PatientAge: DICOMWeb.getNumber(aSopInstance['00101010']),\r\n PatientSize: DICOMWeb.getNumber(aSopInstance['00101020']),\r\n PatientWeight: DICOMWeb.getNumber(aSopInstance['00101030']),\r\n AccessionNumber: DICOMWeb.getString(aSopInstance['00080050']),\r\n StudyTime: DICOMWeb.getString(aSopInstance['00080030']),\r\n StudyDate: DICOMWeb.getString(aSopInstance['00080020']),\r\n FrameOfReferenceUID: DICOMWeb.getString(aSopInstance['00200052']),\r\n ReferencedSeriesSequence: getReferencedSeriesSequence(aSopInstance),\r\n modalities: DICOMWeb.getString(aSopInstance['00080061']), // TODO -> Rename this.. it'll take a while to not mess this one up.\r\n StudyDescription: DICOMWeb.getString(aSopInstance['00081030']),\r\n NumberOfStudyRelatedInstances: DICOMWeb.getString(aSopInstance['00201208']),\r\n StudyInstanceUID: studyInstanceUID || DICOMWeb.getString(aSopInstance['0020000D']),\r\n InstitutionName: DICOMWeb.getString(aSopInstance['00080080'])\r\n };\r\n}\r\n\r\n/** Returns a WADO url for an instance\r\n *\r\n * @param StudyInstanceUID\r\n * @param SeriesInstanceUID\r\n * @param SOPInstanceUID\r\n * @returns {string}\r\n */\r\nfunction buildInstanceWadoUrl(server, StudyInstanceUID, SeriesInstanceUID, SOPInstanceUID) {\r\n // TODO: This can be removed, since DICOMWebClient has the same function. Not urgent, though\r\n const params = [];\r\n\r\n params.push('requestType=WADO');\r\n params.push(`studyUID=${StudyInstanceUID}`);\r\n params.push(`seriesUID=${SeriesInstanceUID}`);\r\n params.push(`objectUID=${SOPInstanceUID}`);\r\n params.push('contentType=application/dicom');\r\n params.push('transferSyntax=*');\r\n\r\n const paramString = params.join('&');\r\n\r\n return `${server.wadoUriRoot}?${paramString}`;\r\n}\r\n\r\nfunction buildInstanceWadoRsUri(server, StudyInstanceUID, SeriesInstanceUID, SOPInstanceUID) {\r\n return `${server.wadoRoot}/studies/${StudyInstanceUID}/series/${SeriesInstanceUID}/instances/${SOPInstanceUID}`;\r\n}\r\n\r\nfunction buildInstanceFrameWadoRsUri(server, StudyInstanceUID, SeriesInstanceUID, SOPInstanceUID, frame) {\r\n const baseWadoRsUri = buildInstanceWadoRsUri(server, StudyInstanceUID, SeriesInstanceUID, SOPInstanceUID);\r\n frame = frame != null || 1;\r\n\r\n return `${baseWadoRsUri}/frames/${frame}`;\r\n}\r\n\r\nasync function makeSOPInstance(server, study, instance) {\r\n const naturalizedInstance = await metadataProvider.addInstance(instance, {\r\n server,\r\n StudyInstanceUID: study.StudyInstanceUID // TungLT mod\r\n });\r\n\r\n const { StudyInstanceUID, SeriesInstanceUID, SOPInstanceUID } = naturalizedInstance;\r\n\r\n let series = study.seriesMap[SeriesInstanceUID];\r\n\r\n if (!series) {\r\n series = {\r\n SeriesInstanceUID,\r\n SeriesDescription: naturalizedInstance.SeriesDescription,\r\n Modality: naturalizedInstance.Modality,\r\n SeriesNumber: naturalizedInstance.SeriesNumber,\r\n SeriesDate: naturalizedInstance.SeriesDate,\r\n SeriesTime: naturalizedInstance.SeriesTime,\r\n instances: []\r\n };\r\n study.seriesMap[SeriesInstanceUID] = series;\r\n study.series.push(series);\r\n }\r\n\r\n const wadouri = buildInstanceWadoUrl(server, StudyInstanceUID, SeriesInstanceUID, SOPInstanceUID);\r\n const baseWadoRsUri = buildInstanceWadoRsUri(server, StudyInstanceUID, SeriesInstanceUID, SOPInstanceUID);\r\n const wadorsuri = buildInstanceFrameWadoRsUri(server, StudyInstanceUID, SeriesInstanceUID, SOPInstanceUID);\r\n\r\n const sopInstance = {\r\n metadata: naturalizedInstance,\r\n baseWadoRsUri,\r\n wadouri,\r\n wadorsuri,\r\n wadoRoot: server.wadoRoot,\r\n imageRendering: server.imageRendering,\r\n thumbnailRendering: server.thumbnailRendering\r\n };\r\n\r\n series.instances.push(sopInstance);\r\n\r\n if (sopInstance.thumbnailRendering === 'wadors' || sopInstance.imageRendering === 'wadors') {\r\n // If using WADO-RS for either images or thumbnails,\r\n // Need to add this to cornerstoneWADOImageLoader's provider\r\n // (it won't be hit on cornerstone.metaData.get, but cornerstoneWADOImageLoader\r\n // will cry if you don't add data to cornerstoneWADOImageLoader.wadors.metaDataManager).\r\n\r\n const wadoRSMetadata = Object.assign(instance);\r\n\r\n const cornerstoneWADOImageLoader = await getCornerstoneWADOImageLoader();\r\n const { NumberOfFrames } = sopInstance.metadata;\r\n\r\n if (NumberOfFrames) {\r\n for (let i = 0; i < NumberOfFrames; i++) {\r\n const wadorsImageId = getWADORSImageId(sopInstance, i);\r\n\r\n cornerstoneWADOImageLoader.wadors.metaDataManager.add(wadorsImageId, wadoRSMetadata);\r\n }\r\n } else {\r\n const wadorsImageId = getWADORSImageId(sopInstance);\r\n\r\n cornerstoneWADOImageLoader.wadors.metaDataManager.add(wadorsImageId, wadoRSMetadata);\r\n }\r\n }\r\n\r\n return sopInstance;\r\n}\r\n\r\n/**\r\n * Add a list of SOP Instances to a given study object descriptor\r\n * @param {Object} server Object with server configuration parameters\r\n * @param {Object} study The study descriptor to which the given SOP instances will be added\r\n * @param {Array} sopInstanceList A list of SOP instance objects\r\n */\r\nasync function addInstancesToStudy(server, study, sopInstanceList) {\r\n return Promise.all(\r\n sopInstanceList.map(function (sopInstance) {\r\n return makeSOPInstance(server, study, sopInstance);\r\n })\r\n );\r\n}\r\n\r\n// TungLT modify\r\nconst createStudyFromSOPInstanceList = async (server, sopInstanceList, studyInstanceUID) => {\r\n if (Array.isArray(sopInstanceList) && sopInstanceList.length > 0) {\r\n const firstSopInstance = sopInstanceList[0];\r\n const study = createStudy(server, firstSopInstance, studyInstanceUID);\r\n await addInstancesToStudy(server, study, sopInstanceList);\r\n return study;\r\n }\r\n throw new Error('Failed to create study out of provided SOP instance list');\r\n};\r\n\r\nexport { createStudyFromSOPInstanceList, addInstancesToStudy };\r\n","/**\r\n * Class to define inheritance of load retrieve strategy.\r\n * The process can be async load (lazy) or sync load\r\n *\r\n * There are methods that must be implemented at consumer level\r\n * To retrieve study call execLoad\r\n */\r\nexport default class RetrieveMetadataLoader {\r\n /**\r\n * @constructor\r\n * @param {Object} server Object with server configuration parameters\r\n * @param {Array} studyInstanceUID Study instance ui to be retrieved\r\n * @param {Object} [filters] - Object containing filters to be applied on retrieve metadata process\r\n * @param {string} [filter.seriesInstanceUID] - series instance uid to filter results against\r\n */\r\n constructor(server, studyInstanceUID, filters = {}) {\r\n this.server = server;\r\n this.studyInstanceUID = studyInstanceUID;\r\n this.filters = filters;\r\n }\r\n\r\n async execLoad() {\r\n await this.configLoad();\r\n const preLoadData = await this.preLoad();\r\n const loadData = await this.load(preLoadData);\r\n const postLoadData = await this.posLoad(loadData);\r\n\r\n return postLoadData;\r\n }\r\n\r\n /**\r\n * It iterates over given loaders running each one. Loaders parameters must be bind when getting it.\r\n * @param {Array} loaders - array of loader to retrieve data.\r\n */\r\n async runLoaders(loaders) {\r\n let result;\r\n for (const loader of loaders) {\r\n result = await loader();\r\n if (result && result.length) {\r\n break; // closes iterator in case data is retrieved successfully\r\n }\r\n }\r\n\r\n if (loaders.next().done && !result) {\r\n throw new Error('RetrieveMetadataLoader failed');\r\n }\r\n\r\n return result;\r\n }\r\n\r\n // Methods to be overwrite\r\n async configLoad() {\r\n }\r\n\r\n async preLoad() {\r\n }\r\n\r\n async load(preLoadData) {\r\n }\r\n\r\n async posLoad(loadData) {\r\n }\r\n}\r\n","import { api } from 'dicomweb-client';\r\nimport DICOMWeb from '../../../DICOMWeb';\r\nimport { createStudyFromSOPInstanceList } from './studyInstanceHelpers';\r\nimport RetrieveMetadataLoader from './retrieveMetadataLoader';\r\n\r\n/**\r\n * Class for sync load of study metadata.\r\n * It inherits from RetrieveMetadataLoader\r\n *\r\n * A list of loaders (getLoaders) can be created so, it will be applied a fallback load strategy.\r\n * I.e Retrieve metadata using all loaders possibilities.\r\n */\r\nexport default class RetrieveMetadataLoaderSync extends RetrieveMetadataLoader {\r\n getOptions() {\r\n const { studyInstanceUID, filters } = this;\r\n\r\n const options = {\r\n studyInstanceUID\r\n };\r\n\r\n const { seriesInstanceUID } = filters;\r\n if (seriesInstanceUID) {\r\n options['seriesInstanceUID'] = seriesInstanceUID;\r\n }\r\n\r\n return options;\r\n }\r\n\r\n /**\r\n * @returns {Array} Array of loaders. To be consumed as queue\r\n */\r\n *getLoaders() {\r\n const loaders = [];\r\n const { studyInstanceUID, filters: { seriesInstanceUID } = {}, client } = this;\r\n\r\n if (seriesInstanceUID) {\r\n loaders.push(\r\n client.retrieveSeriesMetadata.bind(client, {\r\n studyInstanceUID,\r\n seriesInstanceUID\r\n })\r\n );\r\n }\r\n\r\n loaders.push(client.retrieveStudyMetadata.bind(client, { studyInstanceUID }));\r\n\r\n yield* loaders;\r\n }\r\n\r\n configLoad() {\r\n const { server } = this;\r\n const client = new api.DICOMwebClient({\r\n url: server.wadoRoot,\r\n headers: DICOMWeb.getAuthorizationHeader(server)\r\n });\r\n\r\n this.client = client;\r\n }\r\n\r\n async load(preLoadData) {\r\n const loaders = this.getLoaders();\r\n const result = this.runLoaders(loaders);\r\n return result;\r\n }\r\n\r\n async posLoad(loadData) {\r\n const { server, studyInstanceUID } = this;\r\n // TungLT: modify to fill custom combine studyInstanceUID into series\r\n // and instance model data to build exact image request URL\r\n return createStudyFromSOPInstanceList(server, loadData, studyInstanceUID);\r\n }\r\n}\r\n","import DICOMWeb from '../DICOMWeb';\nimport isLowPriorityModality from '../utils/isLowPriorityModality';\n\nconst INFO = Symbol('INFO');\n\n/**\n * Creates an object with processed series information and saves its reference\n * inside the series object itself.\n * @param {Object} series The raw series object\n * @returns {Object} object containing some useful info from given series\n */\nexport default function getSeriesInfo(series) {\n let info = series[INFO];\n if (!info) {\n const Modality = DICOMWeb.getString(series['00080060'], '').toUpperCase();\n info = Object.freeze({\n Modality,\n isLowPriority: isLowPriorityModality(Modality),\n SeriesInstanceUID: DICOMWeb.getString(series['0020000E']),\n SeriesNumber: DICOMWeb.getNumber(series['00200011'], 0) || 0\n });\n series[INFO] = info;\n }\n return info;\n}\n","import getSeriesInfo from './getSeriesInfo';\n\n/**\n * Series sorting criteria: series considered low priority are moved to the end\n * of the list and series number is used to break ties\n * @param {Object} firstSeries\n * @param {Object} secondSeries\n */\nfunction seriesInfoSortingCriteria(firstSeries, secondSeries) {\n const a = getSeriesInfo(firstSeries);\n const b = getSeriesInfo(secondSeries);\n if (!a.isLowPriority && b.isLowPriority) {\n return -1;\n }\n if (a.isLowPriority && !b.isLowPriority) {\n return 1;\n }\n return a.SeriesNumber - b.SeriesNumber;\n}\n\nconst seriesSortCriteria = {\n default: (a, b) => a.SeriesNumber - b.SeriesNumber,\n seriesInfoSortingCriteria\n};\n\nconst instancesSortCriteria = {\n default: (a, b) => a.InstanceNumber - b.InstanceNumber\n};\n\nconst sortingCriteria = {\n seriesSortCriteria,\n instancesSortCriteria\n};\n\n/**\n * Sorts given series (given param is modified)\n * The default criteria is based on series number in ascending order.\n *\n * @param {Array} series List of series\n * @param {function} seriesSortingCriteria method for sorting\n * @returns {Array} sorted series object\n */\nconst sortStudySeries = (\n series,\n seriesSortingCriteria = seriesSortCriteria.default\n) => series.sort(seriesSortingCriteria);\n\n/**\n * Sorts given instancesList (given param is modified)\n * The default criteria is based on instance number in ascending order.\n *\n * @param {Array} instancesList List of series\n * @param {function} instancesSortingCriteria method for sorting\n * @returns {Array} sorted instancesList object\n */\nconst sortStudyInstances = (\n instancesList,\n instancesSortingCriteria = instancesSortCriteria.default\n) => instancesList.sort(instancesSortingCriteria);\n\n/**\n * Sorts the series and instances (by default) inside a study instance based on sortingCriteria (given param is modified)\n * The default criteria is based on series and instance numbers in ascending order.\n *\n * @param {Object} study The study instance\n * @param {boolean} [deepSort = true] to sort instance also\n * @param {function} [seriesSortingCriteria = seriesSortCriteria.default] method for sorting series\n * @param {function} [instancesSortingCriteria = instancesSortCriteria.default] method for sorting instances\n * @returns {Object} sorted study object\n */\nexport default function sortStudy(\n study,\n deepSort = true,\n seriesSortingCriteria = seriesSortCriteria.default,\n instancesSortingCriteria = instancesSortCriteria.default\n) {\n if (!study || !study.series) {\n throw new Error('Insufficient study data was provided to sortStudy');\n }\n\n sortStudySeries(study.series, seriesSortingCriteria);\n\n if (deepSort) {\n study.series.forEach((series) => {\n sortStudyInstances(series.instances, instancesSortingCriteria);\n });\n }\n\n return study;\n}\n\nexport {sortStudySeries, sortStudyInstances, sortingCriteria};\n","import { api } from 'dicomweb-client';\r\nimport dcmjs from 'dcmjs';\r\nimport DICOMWeb from '../../../DICOMWeb/';\r\nimport RetrieveMetadataLoader from './retrieveMetadataLoader';\r\nimport { sortStudySeries, sortingCriteria } from '../../sortStudy';\r\nimport getSeriesInfo from '../../getSeriesInfo';\r\nimport { createStudyFromSOPInstanceList, addInstancesToStudy } from './studyInstanceHelpers';\r\n\r\nimport errorHandler from '../../../errorHandler';\r\n\r\nconst { naturalizeDataset } = dcmjs.data.DicomMetaDictionary;\r\n\r\n/**\r\n * Map series to an array of SeriesInstanceUID\r\n * @param {Arrays} series list of Series Instance UIDs\r\n * @returns {Arrays} A list of Series Instance UIDs\r\n */\r\nfunction mapStudySeries(series) {\r\n return series.map((series) => getSeriesInfo(series).SeriesInstanceUID);\r\n}\r\n\r\nfunction attachSeriesLoader(server, study, seriesLoader) {\r\n study.seriesLoader = Object.freeze({\r\n hasNext() {\r\n return seriesLoader.hasNext();\r\n },\r\n async next() {\r\n const series = await seriesLoader.next();\r\n await addInstancesToStudy(server, study, series.sopInstances, study.StudyInstanceUID);\r\n return study.seriesMap[series.seriesInstanceUID];\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Creates an immutable series loader object which loads each series sequentially using the iterator interface\r\n * @param {DICOMWebClient} dicomWebClient The DICOMWebClient instance to be used for series load\r\n * @param {string} studyInstanceUID The Study Instance UID from which series will be loaded\r\n * @param {Array} seriesInstanceUIDList A list of Series Instance UIDs\r\n * @returns {Object} Returns an object which supports loading of instances from each of given Series Instance UID\r\n */\r\nfunction makeSeriesAsyncLoader(dicomWebClient, studyInstanceUID, seriesInstanceUIDList) {\r\n return Object.freeze({\r\n hasNext() {\r\n return seriesInstanceUIDList.length > 0;\r\n },\r\n async next() {\r\n const seriesInstanceUID = seriesInstanceUIDList.shift();\r\n const sopInstances = await dicomWebClient.retrieveSeriesMetadata({\r\n studyInstanceUID,\r\n seriesInstanceUID\r\n });\r\n return { studyInstanceUID, seriesInstanceUID, sopInstances };\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Class for async load of study metadata.\r\n * It inherits from RetrieveMetadataLoader\r\n *\r\n * It loads the one series and then append to seriesLoader the others to be consumed/loaded\r\n */\r\nexport default class RetrieveMetadataLoaderAsync extends RetrieveMetadataLoader {\r\n configLoad() {\r\n const { server } = this;\r\n\r\n const client = new api.DICOMwebClient({\r\n url: server.qidoRoot,\r\n headers: DICOMWeb.getAuthorizationHeader(server),\r\n errorInterceptor: errorHandler.getHTTPErrorHandler()\r\n });\r\n\r\n this.client = client;\r\n }\r\n\r\n /**\r\n * @returns {Array} Array of preLoaders. To be consumed as queue\r\n */\r\n *getPreLoaders() {\r\n const preLoaders = [];\r\n const { studyInstanceUID, filters: { seriesInstanceUID } = {}, client } = this;\r\n\r\n if (seriesInstanceUID) {\r\n const options = {\r\n studyInstanceUID,\r\n queryParams: { SeriesInstanceUID: seriesInstanceUID }\r\n };\r\n preLoaders.push(client.searchForSeries.bind(client, options));\r\n }\r\n // Fallback preloader\r\n preLoaders.push(client.searchForSeries.bind(client, { studyInstanceUID }));\r\n\r\n yield* preLoaders;\r\n }\r\n\r\n async preLoad() {\r\n const preLoaders = this.getPreLoaders();\r\n\r\n // seriesData is the result of the QIDO-RS Search For Series request\r\n // It's an array of Objects containing DICOM Tag values at the Series level\r\n const seriesData = await this.runLoaders(preLoaders);\r\n\r\n const seriesSorted = sortStudySeries(seriesData, sortingCriteria.seriesSortCriteria.seriesInfoSortingCriteria);\r\n const seriesInstanceUIDsMap = mapStudySeries(seriesSorted);\r\n\r\n return {\r\n seriesInstanceUIDsMap,\r\n seriesData\r\n };\r\n }\r\n\r\n async load(preLoadData) {\r\n const { client, studyInstanceUID } = this;\r\n\r\n const seriesAsyncLoader = makeSeriesAsyncLoader(client, studyInstanceUID, preLoadData.seriesInstanceUIDsMap);\r\n\r\n const firstSeries = await seriesAsyncLoader.next();\r\n\r\n return {\r\n sopInstances: firstSeries.sopInstances,\r\n asyncLoader: seriesAsyncLoader,\r\n seriesData: preLoadData.seriesData\r\n };\r\n }\r\n\r\n async posLoad(loadData) {\r\n const { server, studyInstanceUID } = this;\r\n\r\n const { sopInstances, asyncLoader, seriesData } = loadData;\r\n\r\n // TungLT\r\n const study = await createStudyFromSOPInstanceList(server, sopInstances, studyInstanceUID);\r\n\r\n // TODO: Should this be in a helper\r\n const seriesDataNaturalized = seriesData.map(naturalizeDataset);\r\n\r\n seriesDataNaturalized.forEach((series, idx) => {\r\n const seriesDataFromQIDO = {\r\n SeriesInstanceUID: series.SeriesInstanceUID,\r\n SeriesDescription: series.SeriesDescription,\r\n SeriesNumber: series.SeriesNumber,\r\n Modality: series.Modality,\r\n instances: []\r\n };\r\n\r\n if (study.series[idx]) {\r\n study.series[idx] = Object.assign(seriesDataFromQIDO, study.series[idx]);\r\n } else {\r\n study.series[idx] = seriesDataFromQIDO;\r\n }\r\n\r\n study.seriesMap[series.SeriesInstanceUID] = study.series[idx];\r\n });\r\n\r\n if (asyncLoader.hasNext()) {\r\n attachSeriesLoader(server, study, asyncLoader);\r\n }\r\n\r\n return study;\r\n }\r\n}\r\n","import RetrieveMetadataLoaderSync from './retrieveMetadataLoaderSync';\r\nimport RetrieveMetadataLoaderAsync from './retrieveMetadataLoaderAsync';\r\n\r\n/**\r\n * Retrieve Study metadata from a DICOM server. If the server is configured to use lazy load, only the first series\r\n * will be loaded and the property \"studyLoader\" will be set to let consumer load remaining series as needed.\r\n *\r\n * @param {Object} server Object with server configuration parameters\r\n * @param {string} StudyInstanceUID The Study Instance UID of the study which needs to be loaded\r\n * @param {Object} [filters] - Object containing filters to be applied on retrieve metadata process\r\n * @param {string} [filter.seriesInstanceUID] - series instance uid to filter results against\r\n * @returns {Object} A study descriptor object\r\n */\r\nasync function RetrieveMetadata(server, StudyInstanceUID, filters = {}) {\r\n const RetrieveMetadataLoader =\r\n server.enableStudyLazyLoad !== false\r\n ? RetrieveMetadataLoaderAsync\r\n : RetrieveMetadataLoaderSync;\r\n\r\n const retrieveMetadataLoader = new RetrieveMetadataLoader(\r\n server,\r\n StudyInstanceUID,\r\n filters\r\n );\r\n const studyMetadata = retrieveMetadataLoader.execLoad();\r\n\r\n return studyMetadata;\r\n}\r\n\r\nexport default RetrieveMetadata;\r\n","import RetrieveMetadata from './services/wado/retrieveMetadata';\n\nconst moduleName = 'RetrieveStudyMetadata';\n// Cache for promises. Prevents unnecessary subsequent calls to the server\nconst StudyMetaDataPromises = new Map();\n\n/**\n * Retrieves study metadata\n *\n * @param {Object} server Object with server configuration parameters\n * @param {string} StudyInstanceUID The UID of the Study to be retrieved\n * @param {Object} [filters] - Object containing filters to be applied on retrieve metadata process\n * @param {string} [filter.seriesInstanceUID] - series instance uid to filter results against\n * @returns {Promise} that will be resolved with the metadata or rejected with the error\n */\nexport function retrieveStudyMetadata(server, StudyInstanceUID, filters) {\n // @TODO: Whenever a study metadata request has failed, its related promise will be rejected once and for all\n // and further requests for that metadata will always fail. On failure, we probably need to remove the\n // corresponding promise from the \"StudyMetaDataPromises\" map...\n\n if (!server) {\n throw new Error(`${moduleName}: Required 'server' parameter not provided.`);\n }\n if (!StudyInstanceUID) {\n throw new Error(\n `${moduleName}: Required 'StudyInstanceUID' parameter not provided.`\n );\n }\n\n // Already waiting on result? Return cached promise\n if (StudyMetaDataPromises.has(StudyInstanceUID)) {\n return StudyMetaDataPromises.get(StudyInstanceUID);\n }\n\n // Create a promise to handle the data retrieval\n const promise = new Promise((resolve, reject) => {\n RetrieveMetadata(server, StudyInstanceUID, filters).then((data) => {\n resolve(data);\n }, reject);\n });\n\n // Store the promise in cache\n StudyMetaDataPromises.set(StudyInstanceUID, promise);\n\n return promise;\n}\n\n/**\n * Delete the cached study metadata retrieval promise to ensure that the browser will\n * re-retrieve the study metadata when it is next requested\n *\n * @param {String} StudyInstanceUID The UID of the Study to be removed from cache\n *\n */\nexport function deleteStudyMetadataPromise(StudyInstanceUID) {\n if (StudyMetaDataPromises.has(StudyInstanceUID)) {\n StudyMetaDataPromises.delete(StudyInstanceUID);\n }\n}\n","import {studyMetadataManager} from '../utils';\n\nimport OHIFError from './OHIFError';\nimport {StudyMetadata} from './metadata/StudyMetadata';\nimport {StudyMetadataSource} from './StudyMetadataSource';\nimport {retrieveStudyMetadata} from '../studies/retrieveStudyMetadata';\n\nexport class OHIFStudyMetadataSource extends StudyMetadataSource {\n /**\n * Get study metadata for a study with given study InstanceUID\n * @param server\n * @param {String} studyInstanceUID Study InstanceUID\n * @return {Promise} A Promise object\n */\n getByInstanceUID(server, studyInstanceUID) {\n return retrieveStudyMetadata(server, studyInstanceUID);\n }\n\n /**\n * Load study info (OHIF.viewer.Studies) and study metadata (OHIF.viewer.StudyMetadataList) for a given study.\n * @param {StudyMetadata} study StudyMetadata object.\n */\n loadStudy(study) {\n if (!(study instanceof StudyMetadata)) {\n throw new OHIFError(\n 'OHIFStudyMetadataSource::loadStudy study is not an instance of StudyMetadata'\n );\n }\n\n return new Promise((resolve, reject) => {\n const studyInstanceUID = study.getStudyInstanceUID();\n\n if (study instanceof StudyMetadata) {\n const alreadyLoaded = OHIF.viewer.Studies.findBy({\n StudyInstanceUID: studyInstanceUID\n });\n\n if (!alreadyLoaded) {\n OHIFStudyMetadataSource._updateStudyCollections(study);\n }\n\n resolve(study);\n return;\n }\n\n this.getByInstanceUID(studyInstanceUID)\n .then((studyInfo) => {\n // Create study metadata object\n const studyMetadata = new StudyMetadata(\n studyInfo,\n studyInfo.StudyInstanceUID\n );\n\n // Get Study display sets\n const displaySets = studyMetadata.createDisplaySets();\n\n // Set studyMetadata display sets\n studyMetadata.setDisplaySets(displaySets);\n\n OHIFStudyMetadataSource._updateStudyCollections(studyMetadata);\n resolve(studyMetadata);\n })\n .catch(reject);\n });\n }\n\n // Static methods\n static _updateStudyCollections(studyMetadata) {\n const studyInfo = studyMetadata.getData();\n\n // Set some studyInfo properties\n studyInfo.selected = true;\n studyInfo.displaySets = studyMetadata.getDisplaySets();\n studyMetadataManager.add(studyMetadata);\n }\n}\n","import {InstanceMetadata, SeriesMetadata, StudyMetadata} from './metadata';\n\nimport CommandsManager from './CommandsManager';\nimport {DICOMFileLoadingListener, StackLoadingListener, StudyLoadingListener} from './StudyLoadingListener';\nimport HotkeysManager from './HotkeysManager';\nimport ImageSet from './ImageSet';\nimport MetadataProvider from './MetadataProvider';\nimport OHIFError from './OHIFError';\nimport {OHIFStudyMetadataSource} from './OHIFStudyMetadataSource';\n\n\nimport {StudyMetadataSource} from './StudyMetadataSource';\nimport {StudyPrefetcher} from './StudyPrefetcher';\nimport {TypeSafeCollection} from './TypeSafeCollection';\n\nexport {\n OHIFStudyMetadataSource,\n MetadataProvider,\n CommandsManager,\n HotkeysManager,\n ImageSet,\n StudyPrefetcher,\n StudyLoadingListener,\n StackLoadingListener,\n DICOMFileLoadingListener,\n StudyMetadata,\n SeriesMetadata,\n InstanceMetadata,\n TypeSafeCollection,\n OHIFError,\n StudyMetadataSource\n};\n\nconst classes = {\n OHIFStudyMetadataSource,\n MetadataProvider,\n CommandsManager,\n HotkeysManager,\n ImageSet,\n StudyPrefetcher,\n StudyLoadingListener,\n StackLoadingListener,\n DICOMFileLoadingListener,\n StudyMetadata,\n SeriesMetadata,\n InstanceMetadata,\n TypeSafeCollection,\n OHIFError,\n StudyMetadataSource\n};\n\nexport default classes;\n","import cornerstone from 'cornerstone-core';\nimport cornerstoneTools from 'cornerstone-tools';\nimport log from '../log';\nimport getImageId from '../utils/getImageId';\n\nexport class StudyPrefetcher {\n constructor(studies) {\n this.studies = studies || [];\n this.prefetchDisplaySetsTimeout = 300;\n this.lastActiveViewportElement = null;\n\n cornerstone.events.addEventListener(\n 'cornerstoneimagecachefull.StudyPrefetcher',\n this.cacheFullHandler.bind(this)\n );\n }\n\n destroy() {\n this.stopPrefetching();\n cornerstone.events.removeEventListener(\n 'cornerstoneimagecachefull.StudyPrefetcher',\n this.cacheFullHandler.bind(this)\n );\n }\n\n static getInstance() {\n if (!StudyPrefetcher.instance) {\n StudyPrefetcher.instance = new StudyPrefetcher([]);\n }\n\n return StudyPrefetcher.instance;\n }\n\n setStudies(studies) {\n this.stopPrefetching();\n this.studies = studies;\n }\n\n prefetch() {\n if (!this.studies || !this.studies.length) {\n return;\n }\n\n this.stopPrefetching();\n this.prefetchDisplaySets();\n }\n\n stopPrefetching() {\n cornerstoneTools.requestPoolManager.clearRequestStack('prefetch');\n }\n\n prefetchDisplaySetsAsync(timeout) {\n timeout = timeout || this.prefetchDisplaySetsTimeout;\n\n clearTimeout(this.prefetchDisplaySetsHandler);\n this.prefetchDisplaySetsHandler = setTimeout(() => {\n this.prefetchDisplaySets();\n }, timeout);\n }\n\n prefetchDisplaySets() {\n // TODO: Allow passing in config\n const config = {\n order: 'closest',\n displaySetCount: 1\n };\n\n const displaySetsToPrefetch = this.getDisplaySetsToPrefetch(config);\n const imageIds = this.getImageIdsFromDisplaySets(displaySetsToPrefetch);\n\n this.prefetchImageIds(imageIds);\n }\n\n prefetchImageIds(imageIds) {\n const nonCachedImageIds = this.filterCachedImageIds(imageIds);\n const requestPoolManager = cornerstoneTools.requestPoolManager;\n const requestType = 'prefetch';\n const preventCache = false;\n const noop = () => {\n };\n\n nonCachedImageIds.forEach((imageId) => {\n requestPoolManager.addRequest(\n {},\n imageId,\n requestType,\n preventCache,\n noop,\n noop\n );\n });\n\n requestPoolManager.startGrabbing();\n }\n\n // getStudy(image) {\n // const StudyInstanceUID = cornerstone.metaData.get(\n // 'StudyInstanceUID',\n // image.imageId\n // );\n // return OHIF.viewer.Studies.find(\n // (study) => study.StudyInstanceUID === StudyInstanceUID\n // );\n // }\n\n // getSeries(study, image) {\n // const SeriesInstanceUID = cornerstone.metaData.get(\n // 'SeriesInstanceUID',\n // image.imageId\n // );\n // const studyMetadata = OHIF.viewerbase.getStudyMetadata(study);\n\n // return studyMetadata.getSeriesByUID(SeriesInstanceUID);\n // }\n\n getInstance(series, image) {\n const instanceMetadata = cornerstone.metaData.get(\n 'instance',\n image.imageId\n );\n return series.getInstanceByUID(instanceMetadata.SOPInstanceUID);\n }\n\n getActiveDisplaySet(displaySets, instance) {\n return displaySets.find((displaySet) => displaySet.images.some((displaySetImage) => displaySetImage.SOPInstanceUID === instance.SOPInstanceUID));\n }\n\n getDisplaySetsToPrefetch(config) {\n const image = this.getActiveViewportImage();\n\n if (!image || !config || !config.displaySetCount) {\n return [];\n }\n\n const study = this.getStudy(image);\n // const series = this.getSeries(study, image);\n // const instance = this.getInstance(series, image);\n const displaySets = study.displaySets;\n const activeDisplaySet = null; // this.getActiveDisplaySet(displaySets, instance);\n const prefetchMethodMap = {\n topdown: 'getFirstDisplaySets',\n downward: 'getNextDisplaySets',\n closest: 'getClosestDisplaySets'\n };\n\n const prefetchOrder = config.order;\n const methodName = prefetchMethodMap[prefetchOrder];\n const getDisplaySets = this[methodName];\n\n if (!getDisplaySets) {\n if (prefetchOrder) {\n log.warn(`Invalid prefetch order configuration (${prefetchOrder})`);\n }\n\n return [];\n }\n\n return getDisplaySets.call(\n this,\n displaySets,\n activeDisplaySet,\n config.displaySetCount\n );\n }\n\n getFirstDisplaySets(displaySets, activeDisplaySet, displaySetCount) {\n const length = displaySets.length;\n const selectedDisplaySets = [];\n\n for (let i = 0; i < length && displaySetCount; i++) {\n const displaySet = displaySets[i];\n\n if (displaySet !== activeDisplaySet) {\n selectedDisplaySets.push(displaySet);\n displaySetCount--;\n }\n }\n\n return selectedDisplaySets;\n }\n\n getNextDisplaySets(displaySets, activeDisplaySet, displaySetCount) {\n const activeDisplaySetIndex = displaySets.indexOf(activeDisplaySet);\n const begin = activeDisplaySetIndex + 1;\n const end = Math.min(begin + displaySetCount, displaySets.length);\n\n return displaySets.slice(begin, end);\n }\n\n getClosestDisplaySets(displaySets, activeDisplaySet, displaySetCount) {\n const activeDisplaySetIndex = displaySets.indexOf(activeDisplaySet);\n const length = displaySets.length;\n const selectedDisplaySets = [];\n let left = activeDisplaySetIndex - 1;\n let right = activeDisplaySetIndex + 1;\n\n while ((left >= 0 || right < length) && displaySetCount) {\n if (left >= 0) {\n selectedDisplaySets.push(displaySets[left]);\n displaySetCount--;\n left--;\n }\n\n if (right < length && displaySetCount) {\n selectedDisplaySets.push(displaySets[right]);\n displaySetCount--;\n right++;\n }\n }\n\n return selectedDisplaySets;\n }\n\n getImageIdsFromDisplaySets(displaySets) {\n let imageIds = [];\n\n displaySets.forEach((displaySet) => {\n imageIds = imageIds.concat(this.getImageIdsFromDisplaySet(displaySet));\n });\n\n return imageIds;\n }\n\n getImageIdsFromDisplaySet(displaySet) {\n const imageIds = [];\n\n // TODO: This duplicates work done by the stack manager\n // Mod by Triet: add check for images in displaySet\n if (displaySet.images && displaySet.images.length) {\n displaySet.images.forEach((image) => {\n const numFrames = image.numFrames;\n if (numFrames > 1) {\n for (let i = 0; i < numFrames; i++) {\n const imageId = getImageId(image, i);\n imageIds.push(imageId);\n }\n } else {\n const imageId = getImageId(image);\n imageIds.push(imageId);\n }\n });\n }\n\n return imageIds;\n }\n\n filterCachedImageIds(imageIds) {\n return imageIds.filter((imageId) => !this.isImageCached(imageId));\n }\n\n isImageCached(imageId) {\n const image = cornerstone.imageCache.imageCache[imageId];\n return image && image.sizeInBytes;\n }\n\n cacheFullHandler() {\n log.warn('Cache full');\n this.stopPrefetching();\n }\n}\n","import {api} from 'dicomweb-client';\nimport DICOMWeb from '../../../DICOMWeb';\n\n/**\n * Parses data returned from a QIDO search and transforms it into\n * an array of series that are present in the study\n *\n * @param server The DICOM server\n * @param StudyInstanceUID\n * @param resultData\n * @returns {Array} Series List\n */\nfunction resultDataToStudyMetadata(server, StudyInstanceUID, resultData) {\n const seriesMap = {};\n const series = [];\n\n resultData.forEach((instance) => {\n // Use seriesMap to cache series data\n // If the series instance UID has already been used to\n // process series data, continue using that series\n const SeriesInstanceUID = DICOMWeb.getString(instance['0020000E']);\n let series = seriesMap[SeriesInstanceUID];\n\n // If no series data exists in the seriesMap cache variable,\n // process any available series data\n if (!series) {\n series = {\n SeriesInstanceUID,\n SeriesNumber: DICOMWeb.getString(instance['00200011']),\n instances: []\n };\n\n // Save this data in the seriesMap cache variable\n seriesMap[SeriesInstanceUID] = series;\n series.push(series);\n }\n\n // The uri for the dicomweb\n // NOTE: DCM4CHEE seems to return the data zipped\n // NOTE: Orthanc returns the data with multi-part mime which cornerstoneWADOImageLoader doesn't\n // know how to parse yet\n // var uri = DICOMWeb.getString(instance['00081190']);\n // uri = uri.replace('wado-rs', 'dicom-web');\n\n // manually create a WADO-URI from the UIDs\n // NOTE: Haven't been able to get Orthanc's WADO-URI to work yet - maybe its not configured?\n const SOPInstanceUID = DICOMWeb.getString(instance['00080018']);\n const uri =\n `${server.wadoUriRoot\n }?requestType=WADO&studyUID=${\n StudyInstanceUID\n }&seriesUID=${\n SeriesInstanceUID\n }&objectUID=${\n SOPInstanceUID\n }&contentType=application%2Fdicom`;\n\n // Add this instance to the current series\n series.instances.push({\n SOPClassUID: DICOMWeb.getString(instance['00080016']),\n SOPInstanceUID,\n uri,\n InstanceNumber: DICOMWeb.getString(instance['00200013'])\n });\n });\n return series;\n}\n\n/**\n * Retrieve a set of instances using a QIDO call\n * @param server\n * @param StudyInstanceUID\n * @throws ECONNREFUSED\n * @returns {{wadoUriRoot: String, StudyInstanceUID: String, series: Array}}\n */\nexport default function Instances(server, StudyInstanceUID) {\n // TODO: Are we using this function anywhere?? Can we remove it?\n\n const config = {\n url: server.qidoRoot,\n headers: DICOMWeb.getAuthorizationHeader(server)\n };\n const dicomWeb = new api.DICOMwebClient(config);\n const options = {\n studyInstanceUID: StudyInstanceUID\n };\n\n return dicomWeb.searchForInstances(options).then((result) => ({\n wadoUriRoot: server.wadoUriRoot,\n StudyInstanceUID,\n series: resultDataToStudyMetadata(server, StudyInstanceUID, result.data)\n }));\n}\n","import {api} from 'dicomweb-client';\nimport DICOMWeb from '../../../DICOMWeb';\n\n/**\n * Creates a QIDO date string for a date range query\n * Assumes the year is positive, at most 4 digits long.\n *\n * @param date The Date object to be formatted\n * @returns {string} The formatted date string\n */\nfunction dateToString(date) {\n if (!date) return '';\n let year = date.getFullYear().toString();\n let month = (date.getMonth() + 1).toString();\n let day = date.getDate().toString();\n year = '0'.repeat(4 - year.length).concat(year);\n month = '0'.repeat(2 - month.length).concat(month);\n day = '0'.repeat(2 - day.length).concat(day);\n return ''.concat(year, month, day);\n}\n\n/**\n * Produces a QIDO URL given server details and a set of specified search filter\n * items\n *\n * @param filter\n * @param serverSupportsQIDOIncludeField\n * @returns {string} The URL with encoded filter query data\n */\nfunction getQIDOQueryParams(filter, serverSupportsQIDOIncludeField) {\n const commaSeparatedFields = [\n '00081030', // Study Description\n '00080060' // Modality\n // Add more fields here if you want them in the result\n ].join(',');\n\n const parameters = {\n PatientName: filter.PatientName,\n PatientID: filter.PatientID,\n AccessionNumber: filter.AccessionNumber,\n StudyDescription: filter.StudyDescription,\n ModalitiesInStudy: filter.ModalitiesInStudy,\n limit: filter.limit,\n offset: filter.offset,\n fuzzymatching: filter.fuzzymatching,\n includefield: serverSupportsQIDOIncludeField ? commaSeparatedFields : 'all'\n };\n\n // build the StudyDate range parameter\n if (filter.studyDateFrom || filter.studyDateTo) {\n const dateFrom = dateToString(new Date(filter.studyDateFrom));\n const dateTo = dateToString(new Date(filter.studyDateTo));\n parameters.StudyDate = `${dateFrom}-${dateTo}`;\n }\n\n // Build the StudyInstanceUID parameter\n if (filter.StudyInstanceUID) {\n let studyUIDs = filter.StudyInstanceUID;\n studyUIDs = Array.isArray(studyUIDs) ? studyUIDs.join() : studyUIDs;\n studyUIDs = studyUIDs.replace(/[^0-9.]+/g, '\\\\');\n parameters.StudyInstanceUID = studyUIDs;\n }\n\n // Clean query params of undefined values.\n const params = {};\n Object.keys(parameters).forEach((key) => {\n if (parameters[key] !== undefined && parameters[key] !== '') {\n params[key] = parameters[key];\n }\n });\n\n return params;\n}\n\n/**\n * Parses resulting data from a QIDO call into a set of Study MetaData\n *\n * @param resultData\n * @returns {Array} An array of Study MetaData objects\n */\nfunction resultDataToStudies(resultData) {\n const studies = [];\n\n if (!resultData || !resultData.length) return;\n\n resultData.forEach((study) => studies.push({\n StudyInstanceUID: DICOMWeb.getString(study['0020000D']),\n // 00080005 = SpecificCharacterSet\n StudyDate: DICOMWeb.getString(study['00080020']),\n StudyTime: DICOMWeb.getString(study['00080030']),\n AccessionNumber: DICOMWeb.getString(study['00080050']),\n referringPhysicianName: DICOMWeb.getString(study['00080090']),\n // 00081190 = URL\n PatientName: DICOMWeb.getName(study['00100010']),\n PatientID: DICOMWeb.getString(study['00100020']),\n PatientBirthdate: DICOMWeb.getString(study['00100030']),\n patientSex: DICOMWeb.getString(study['00100040']),\n studyId: DICOMWeb.getString(study['00200010']),\n numberOfStudyRelatedSeries: DICOMWeb.getString(study['00201206']),\n numberOfStudyRelatedInstances: DICOMWeb.getString(study['00201208']),\n StudyDescription: DICOMWeb.getString(study['00081030']),\n // Modality: DICOMWeb.getString(study['00080060']),\n // ModalitiesInStudy: DICOMWeb.getString(study['00080061']),\n modalities: DICOMWeb.getString(\n DICOMWeb.getModalities(study['00080060'], study['00080061'])\n )\n }));\n\n return studies;\n}\n\nexport default function Studies(server, filter) {\n const config = {\n url: server.qidoRoot,\n headers: DICOMWeb.getAuthorizationHeader(server)\n };\n\n const dicomWeb = new api.DICOMwebClient(config);\n server.qidoSupportsIncludeField =\n server.qidoSupportsIncludeField === undefined\n ? true\n : server.qidoSupportsIncludeField;\n const queryParams = getQIDOQueryParams(\n filter,\n server.qidoSupportsIncludeField\n );\n const options = {\n queryParams\n };\n\n return dicomWeb.searchForStudies(options).then(resultDataToStudies);\n}\n","// DICOMWeb instance, study, and metadata retrieval\nimport Instances from './qido/instances';\nimport Studies from './qido/studies';\nimport RetrieveMetadata from './wado/retrieveMetadata';\n\nconst WADO = {\n RetrieveMetadata\n};\n\nconst QIDO = {\n Studies,\n Instances\n};\n\nexport {QIDO, WADO};\n","import Studies from './services/qido/studies';\n\nconst studySearchPromises = new Map();\n\n/**\n * Search for studies information by the given filter\n *\n * @param {Object} filter Filter that will be used on search\n * @returns {Promise} resolved with an array of studies information or rejected with an error\n */\nexport default function searchStudies(server, filter) {\n const promiseKeyObj = {\n qidoRoot: server.qidoRoot,\n filter\n };\n const promiseKey = JSON.stringify(promiseKeyObj);\n if (studySearchPromises.has(promiseKey)) {\n return studySearchPromises.get(promiseKey);\n }\n const promise = Studies(server, filter);\n\n studySearchPromises.set(promiseKey, promise);\n\n return promise;\n}\n","import {QIDO, WADO} from './services';\nimport {\n deleteStudyMetadataPromise,\n retrieveStudyMetadata\n} from './retrieveStudyMetadata';\n\nimport getStudyBoxData from './getStudyBoxData';\nimport retrieveStudiesMetadata from './retrieveStudiesMetadata';\nimport searchStudies from './searchStudies';\nimport sortStudy from './sortStudy';\n\nconst studies = {\n services: {\n QIDO,\n WADO\n },\n loadingDict: {},\n retrieveStudyMetadata,\n deleteStudyMetadataPromise,\n retrieveStudiesMetadata,\n getStudyBoxData,\n searchStudies,\n sortStudy\n};\n\nexport default studies;\n","import log from '../log';\nimport {retrieveStudyMetadata} from './retrieveStudyMetadata';\n\n/**\n * Retrieves metaData for multiple studies at once.\n *\n * This function calls retrieveStudyMetadata several times, asynchronously,\n * and waits for all of the results to be returned.\n *\n * @param {Object} server Object with server configuration parameters\n * @param {Array} studyInstanceUIDs The UIDs of the Studies to be retrieved\n * @param {Object} [filters] - Object containing filters to be applied on retrieve metadata process\n * @param {string} [filter.seriesInstanceUID] - series instance uid to filter results against\n * @returns {Promise} that will be resolved with the metadata or rejected with the error\n */\nexport default function retrieveStudiesMetadata(\n server,\n studyInstanceUIDs,\n filters\n) {\n // Create an empty array to store the Promises for each metaData retrieval call\n const promises = [];\n\n // Loop through the array of studyInstanceUIDs\n studyInstanceUIDs.forEach((StudyInstanceUID) => {\n // Send the call and resolve or reject the related promise based on its outcome\n const promise = retrieveStudyMetadata(server, StudyInstanceUID, filters);\n\n // Add the current promise to the array of promises\n promises.push(promise);\n });\n\n // When all of the promises are complete, this callback runs\n const promise = Promise.all(promises);\n\n // Warn the error on console if some retrieval failed\n promise.catch((error) => log.warn(error));\n\n return promise;\n}\n","/**\n * Overridable namespace to allow getting study boxes data externally.\n *\n * The function must handle the first parameter as a studyInformation object containing at least the\n * StudyInstanceUID attribute.\n *\n * Shall return a promise that will be resolved with an object containing those attributes:\n * - StudyInstanceUID {String}: copy of studyInformation.StudyInstanceUID\n * - modalities {String}: 2 uppercase letters for each Modality split by any non-alphabetical char(s)\n * - StudyDate {String}: date formatted as YYYYMMDD\n * - StudyDescription {String}: study description string\n */\n// TODO: What is this for?\nconst getStudyBoxData = false;\n\nexport default getStudyBoxData;\n","const absoluteUrl = (path) => {\r\n let absolutePath = '/';\r\n\r\n if (!path) return absolutePath;\r\n\r\n // TODO: Find another way to get root url\r\n const absoluteUrl = window.location.origin;\r\n const absoluteUrlParts = absoluteUrl.split('/');\r\n\r\n if (absoluteUrlParts.length > 4) {\r\n const rootUrlPrefixIndex = absoluteUrl.indexOf(absoluteUrlParts[3]);\r\n absolutePath += absoluteUrl.substring(rootUrlPrefixIndex) + path;\r\n } else {\r\n absolutePath += path;\r\n }\r\n\r\n return absolutePath.replace(/\\/\\/+/g, '/');\r\n};\r\n\r\nexport default absoluteUrl;\r\n","// TODO: figure out where else to put this function\r\nconst addServers = (servers, store) => {\r\n if (!servers || !store) {\r\n throw new Error('The servers and store must be defined');\r\n }\r\n\r\n Object.keys(servers).forEach((serverType) => {\r\n const endpoints = servers[serverType];\r\n endpoints.forEach((endpoint) => {\r\n const server = Object.assign({}, endpoint);\r\n server.type = serverType;\r\n\r\n store.dispatch({\r\n type: 'ADD_SERVER',\r\n server\r\n });\r\n });\r\n });\r\n};\r\n\r\nexport default addServers;\r\n","/* Enabled JPEG images downloading on IE11. */\r\nconst b64toBlob = (b64Data, contentType = '', sliceSize = 512) => {\r\n const byteCharacters = atob(b64Data);\r\n const byteArrays = [];\r\n\r\n for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {\r\n const slice = byteCharacters.slice(offset, offset + sliceSize);\r\n\r\n const byteNumbers = new Array(slice.length);\r\n for (let i = 0; i < slice.length; i++) {\r\n byteNumbers[i] = slice.charCodeAt(i);\r\n }\r\n\r\n const byteArray = new Uint8Array(byteNumbers);\r\n byteArrays.push(byteArray);\r\n }\r\n\r\n const blob = new Blob(byteArrays, {type: contentType});\r\n return blob;\r\n};\r\n\r\nexport default b64toBlob;\r\n","import cornerstone from 'cornerstone-core';\r\nimport {api} from 'dicomweb-client';\r\nimport DICOMWeb from '../DICOMWeb';\r\nimport {getCornerstoneWADOImageLoader} from './cornerstoneWADOImageLoader';\r\n\r\nconst getImageId = (imageObj) => {\r\n if (!imageObj) {\r\n return;\r\n }\r\n\r\n return typeof imageObj.getImageId === 'function'\r\n ? imageObj.getImageId()\r\n : imageObj.url;\r\n};\r\n\r\nconst findImageIdOnStudies = (studies, displaySetInstanceUID) => {\r\n const study = studies.find((study) => {\r\n const displaySet = study.displaySets.some(\r\n (displaySet) => displaySet.displaySetInstanceUID === displaySetInstanceUID\r\n );\r\n return displaySet;\r\n });\r\n const {series = []} = study;\r\n const {instances = []} = series[0] || {};\r\n const instance = instances[0];\r\n\r\n return getImageId(instance);\r\n};\r\n\r\nconst someInvalidStrings = (strings) => {\r\n const stringsArray = Array.isArray(strings) ? strings : [strings];\r\n const emptyString = (string) => !string;\r\n let invalid = stringsArray.some(emptyString);\r\n return invalid;\r\n};\r\n\r\nconst getImageInstance = (dataset) => {\r\n return dataset && dataset.images && dataset.images[0];\r\n};\r\n\r\nconst getImageInstanceId = (imageInstance) => {\r\n return getImageId(imageInstance);\r\n};\r\n\r\nconst fetchIt = (url, headers = DICOMWeb.getAuthorizationHeader()) => {\r\n return fetch(url, headers).then((response) => response.arrayBuffer());\r\n};\r\n\r\nconst cornerstoneRetriever = (imageId) => {\r\n return cornerstone.loadAndCacheImage(imageId).then((image) => {\r\n return image && image.data && image.data.byteArray.buffer;\r\n });\r\n};\r\n\r\nconst wadorsRetriever = (\r\n url,\r\n studyInstanceUID,\r\n seriesInstanceUID,\r\n sopInstanceUID,\r\n headers = DICOMWeb.getAuthorizationHeader()\r\n) => {\r\n const config = {\r\n url,\r\n headers\r\n };\r\n const dicomWeb = new api.DICOMwebClient(config);\r\n\r\n return dicomWeb.retrieveInstance({\r\n studyInstanceUID,\r\n seriesInstanceUID,\r\n sopInstanceUID\r\n });\r\n};\r\n\r\nconst getImageLoaderType = (imageId) => {\r\n const loaderRegExp = /^\\w+:/;\r\n const loaderType = loaderRegExp.exec(imageId);\r\n\r\n return (\r\n (loaderRegExp.lastIndex === 0 &&\r\n loaderType &&\r\n loaderType[0] &&\r\n loaderType[0].replace(':', '')) ||\r\n ''\r\n );\r\n};\r\n\r\nclass DicomLoaderService {\r\n async getLocalData(dataset, studies) {\r\n if (dataset && dataset.localFile) {\r\n // Use referenced imageInstance\r\n const imageInstance = getImageInstance(dataset);\r\n let imageId = getImageInstanceId(imageInstance);\r\n\r\n // or Try to get it from studies\r\n if (someInvalidStrings(imageId)) {\r\n imageId = findImageIdOnStudies(studies, dataset.displaySetInstanceUID);\r\n }\r\n\r\n if (!someInvalidStrings(imageId)) {\r\n const cornerstoneWADOImageLoader = await getCornerstoneWADOImageLoader();\r\n return cornerstoneWADOImageLoader.wadouri.loadFileRequest(imageId);\r\n }\r\n }\r\n }\r\n\r\n getDataByImageType(dataset) {\r\n const imageInstance = getImageInstance(dataset);\r\n\r\n if (imageInstance) {\r\n let imageId = getImageInstanceId(imageInstance);\r\n let getDicomDataMethod = fetchIt;\r\n const loaderType = getImageLoaderType(imageId);\r\n\r\n switch (loaderType) {\r\n case 'dicomfile':\r\n getDicomDataMethod = cornerstoneRetriever.bind(this, imageId);\r\n break;\r\n case 'wadors':\r\n const url = imageInstance.getData().wadoRoot;\r\n const studyInstanceUID = imageInstance.getStudyInstanceUID();\r\n const seriesInstanceUID = imageInstance.getSeriesInstanceUID();\r\n const sopInstanceUID = imageInstance.getSOPInstanceUID();\r\n const invalidParams = someInvalidStrings([\r\n url,\r\n studyInstanceUID,\r\n seriesInstanceUID,\r\n sopInstanceUID\r\n ]);\r\n if (invalidParams) {\r\n return;\r\n }\r\n\r\n getDicomDataMethod = wadorsRetriever.bind(\r\n this,\r\n url,\r\n studyInstanceUID,\r\n seriesInstanceUID,\r\n sopInstanceUID\r\n );\r\n break;\r\n case 'wadouri':\r\n // Strip out the image loader specifier\r\n imageId = imageId.substring(imageId.indexOf(':') + 1);\r\n\r\n if (someInvalidStrings(imageId)) {\r\n return;\r\n }\r\n getDicomDataMethod = fetchIt.bind(this, imageId);\r\n break;\r\n }\r\n\r\n return getDicomDataMethod();\r\n }\r\n }\r\n\r\n getDataByDatasetType(dataset) {\r\n const {\r\n StudyInstanceUID,\r\n SeriesInstanceUID,\r\n SOPInstanceUID,\r\n authorizationHeaders,\r\n wadoRoot,\r\n wadoUri\r\n } = dataset;\r\n // Retrieve wadors or just try to fetch wadouri\r\n if (!someInvalidStrings(wadoRoot)) {\r\n return wadorsRetriever(\r\n wadoRoot,\r\n StudyInstanceUID,\r\n SeriesInstanceUID,\r\n SOPInstanceUID,\r\n authorizationHeaders\r\n );\r\n } else if (!someInvalidStrings(wadoUri)) {\r\n return fetchIt(wadoUri, {headers: authorizationHeaders});\r\n }\r\n }\r\n\r\n async *getLoaderIterator(dataset, studies) {\r\n yield await this.getLocalData(dataset, studies);\r\n yield this.getDataByImageType(dataset);\r\n yield this.getDataByDatasetType(dataset);\r\n }\r\n\r\n async findDicomDataPromise(dataset, studies) {\r\n const loaderIterator = this.getLoaderIterator(dataset, studies);\r\n // it returns first valid retriever method.\r\n for await (const loader of loaderIterator) {\r\n if (loader) {\r\n return loader;\r\n }\r\n }\r\n\r\n // in case of no valid loader\r\n throw new Error('Invalid dicom data loader');\r\n }\r\n}\r\n\r\nconst dicomLoaderService = new DicomLoaderService();\r\n\r\nexport default dicomLoaderService;\r\n","import studyMetadataManager from './studyMetadataManager';\r\n\r\n/**\r\n * Study schema\r\n *\r\n * @typedef {Object} Study\r\n * @property {Array} seriesList -\r\n * @property {Object} seriesMap -\r\n * @property {Object} seriesLoader -\r\n * @property {string} wadoUriRoot -\r\n * @property {string} wadoRoot -\r\n * @property {string} qidoRoot -\r\n * @property {string} patientName -\r\n * @property {string} patientId -\r\n * @property {number} patientAge -\r\n * @property {number} patientSize -\r\n * @property {number} patientWeight -\r\n * @property {string} accessionNumber -\r\n * @property {string} studyDate -\r\n * @property {string} studyTime -\r\n * @property {string} modalities -\r\n * @property {string} studyDescription -\r\n * @property {string} imageCount -\r\n * @property {string} studyInstanceUid -\r\n * @property {string} institutionName -\r\n * @property {Array} displaySets -\r\n */\r\n\r\n/**\r\n * Factory function to load and cache derived display sets.\r\n *\r\n * @param {object} referencedDisplaySet Display set\r\n * @param {string} referencedDisplaySet.displaySetInstanceUid Display set instance uid\r\n * @param {string} referencedDisplaySet.seriesDate\r\n * @param {string} referencedDisplaySet.seriesTime\r\n * @param {string} referencedDisplaySet.seriesInstanceUid\r\n * @param {string} referencedDisplaySet.seriesNumber\r\n * @param {string} referencedDisplaySet.seriesDescription\r\n * @param {number} referencedDisplaySet.numImageFrames\r\n * @param {string} referencedDisplaySet.frameRate\r\n * @param {string} referencedDisplaySet.modality\r\n * @param {boolean} referencedDisplaySet.isMultiFrame\r\n * @param {number} referencedDisplaySet.instanceNumber\r\n * @param {boolean} referencedDisplaySet.isReconstructable\r\n * @param {string} referencedDisplaySet.studyInstanceUid\r\n * @param {Array} referencedDisplaySet.sopClassUids\r\n * @param {Study[]} studies Collection of studies\r\n * @returns void\r\n */\r\nconst loadAndCacheDerivedDisplaySets = (referencedDisplaySet, studies) => {\r\n const {StudyInstanceUID, SeriesInstanceUID} = referencedDisplaySet;\r\n\r\n const studyMetadata = studyMetadataManager.get(StudyInstanceUID);\r\n\r\n if (!studyMetadata) {\r\n return;\r\n }\r\n\r\n const derivedDisplaySets = studyMetadata.getDerivedDatasets({\r\n referencedSeriesInstanceUID: SeriesInstanceUID\r\n });\r\n\r\n if (!derivedDisplaySets.length) {\r\n return;\r\n }\r\n\r\n // Filter by type\r\n const displaySetsPerModality = {};\r\n\r\n derivedDisplaySets.forEach((displaySet) => {\r\n const Modality = displaySet.Modality;\r\n\r\n if (displaySetsPerModality[Modality] === undefined) {\r\n displaySetsPerModality[Modality] = [];\r\n }\r\n\r\n displaySetsPerModality[Modality].push(displaySet);\r\n });\r\n\r\n // For each type, see if any are loaded, if not load the most recent.\r\n Object.keys(displaySetsPerModality).forEach((key) => {\r\n const displaySets = displaySetsPerModality[key];\r\n const isLoaded = displaySets.some((displaySet) => displaySet.isLoaded);\r\n\r\n if (isLoaded) {\r\n return;\r\n }\r\n\r\n // find most recent and load it.\r\n let recentDateTime = 0;\r\n let recentDisplaySet;\r\n\r\n displaySets.forEach((displaySet) => {\r\n const dateTime = Number(\r\n `${displaySet.SeriesDate}${displaySet.SeriesTime}`\r\n );\r\n if (dateTime > recentDateTime) {\r\n recentDateTime = dateTime;\r\n recentDisplaySet = displaySet;\r\n }\r\n });\r\n\r\n recentDisplaySet.load(referencedDisplaySet, studies);\r\n });\r\n};\r\n\r\nexport default loadAndCacheDerivedDisplaySets;\r\n","// Return the array sorting function for its object's properties\r\nexport default function sortBy() {\r\n var fields = [].slice.call(arguments),\r\n n_fields = fields.length;\r\n\r\n return function(A, B) {\r\n var a, b, field, key, reverse, result, i;\r\n\r\n for (i = 0; i < n_fields; i++) {\r\n result = 0;\r\n field = fields[i];\r\n\r\n key = typeof field === 'string' ? field : field.name;\r\n\r\n a = A[key];\r\n b = B[key];\r\n\r\n if (typeof field.primer !== 'undefined') {\r\n a = field.primer(a);\r\n b = field.primer(b);\r\n }\r\n\r\n reverse = field.reverse ? -1 : 1;\r\n\r\n if (a < b) {\r\n result = reverse * -1;\r\n }\r\n\r\n if (a > b) {\r\n result = reverse * 1;\r\n }\r\n\r\n if (result !== 0) {\r\n break;\r\n }\r\n }\r\n\r\n return result;\r\n };\r\n}\r\n","import lib from 'query-string';\r\n\r\nconst PARAM_SEPARATOR = ';';\r\nconst PARAM_PATTERN_IDENTIFIER = ':';\r\n\r\nfunction toLowerCaseFirstLetter(word) {\r\n return word[0].toLowerCase() + word.slice(1);\r\n}\r\nconst getQueryFilters = (location = {}) => {\r\n const {search} = location;\r\n\r\n if (!search) {\r\n return;\r\n }\r\n\r\n const searchParameters = parse(search);\r\n const filters = {};\r\n\r\n Object.entries(searchParameters).forEach(([key, value]) => {\r\n filters[toLowerCaseFirstLetter(key)] = value;\r\n });\r\n\r\n return filters;\r\n};\r\n\r\nconst decode = (strToDecode = '') => {\r\n try {\r\n const decoded = window.atob(strToDecode);\r\n return decoded;\r\n } catch (e) {\r\n return strToDecode;\r\n }\r\n};\r\n\r\nconst parse = (toParse) => {\r\n if (toParse) {\r\n return lib.parse(toParse);\r\n }\r\n\r\n return {};\r\n};\r\nconst parseParam = (paramStr) => {\r\n const _paramDecoded = decode(paramStr);\r\n if (_paramDecoded && typeof _paramDecoded === 'string') {\r\n return _paramDecoded.split(PARAM_SEPARATOR);\r\n }\r\n};\r\n\r\nconst replaceParam = (path = '', paramKey, paramValue) => {\r\n const paramPattern = `${PARAM_PATTERN_IDENTIFIER}${paramKey}`;\r\n if (paramValue) {\r\n return path.replace(paramPattern, paramValue);\r\n }\r\n\r\n return path;\r\n};\r\n\r\nconst isValidPath = (path) => {\r\n const paramPatternPiece = `/${PARAM_PATTERN_IDENTIFIER}`;\r\n return path.indexOf(paramPatternPiece) < 0;\r\n};\r\n\r\nconst queryString = {\r\n getQueryFilters\r\n};\r\n\r\nconst paramString = {\r\n isValidPath,\r\n parseParam,\r\n replaceParam\r\n};\r\n\r\nexport {parse, queryString, paramString};\r\n","\n/** Process series metadata and split if necessary\n* @param {Object} series original series\n* @author Triet\n*/\n\nconst getManufacturer = (instance) => {\n const { metadata } = instance;\n return metadata.Manufacturer || metadata['00080070'] || '';\n};\n\nconst getSplitRules = (manufacturer) => {\n /** Define rules for each modality types and madufacturer\n * if the value of the defined Tag is different accross the instances, the instances will be split\n * into each Tag\n */\n const manufacturerLowerCase = manufacturer.toLowerCase();\n // console.log('manufacturer', manufacturerLowerCase);\n if (manufacturerLowerCase.indexOf('siemens') > -1) {\n return {\n MR: [\n 'ImageType',\n 'SequenceName',\n '0019100C', // SIEMENS b-value\n 'EchoTime',\n 'RepetitionTime'\n ]\n };\n }\n else if (manufacturerLowerCase.indexOf('philips') > -1) {\n return {\n MR: [\n 'ImageType', // \n '20011020', // pulse sequence name\n '20011003', // PHILIPS b-value\n 'EchoTime',\n 'RepetitionTime'\n ]\n };\n }\n // else if (manufacturerLowerCase === 'toshiba') {\n // return {};\n // }\n \n // default case\n return {\n MR: [\n 'ImageType',\n 'SequenceName',\n 'DiffusionBValue',\n 'EchoTime',\n 'RepetitionTime'\n ]\n };\n};\n\nconst seriesDescriptionSuffix = ' - Subseries ';\n\nexport default (series) => {\n // console.log('splitSeries', series);\n let result;\n const { instances, Modality } = series;\n if (instances && instances.length) {\n switch (Modality) {\n case 'MR':\n // console.log('splitSeries MR ne'); \n result = processMRSeries(series);\n return result;\n default:\n return [series];\n }\n } else return [series];\n};\n\nconst processMRSeries = (series) => {\n const subSeriesInstances = splitInstances(series.instances, getSplitRules(getManufacturer(series.instances[0])).MR);\n delete series.instance;\n let count = 0;\n let isSubSeries = false;\n let descriptionSuffix;\n // let SubSeriesIndex;\n if (subSeriesInstances.length > 1) {\n isSubSeries = true;\n descriptionSuffix = seriesDescriptionSuffix;\n }\n const subSeriesList = subSeriesInstances.map((subInstances) => {\n count++;\n return {\n ...series,\n SeriesDescription: isSubSeries ? series.SeriesDescription + descriptionSuffix + count : series.SeriesDescription,\n // SeriesInstanceUID: series.SeriesInstanceUID + '.' + count,\n SubSeriesIndex: isSubSeries ? '_' + count : '',\n isSubSeries: isSubSeries,\n instances: subInstances\n };\n });\n // console.log('processMRSeries', subSeriesList);\n return subSeriesList;\n};\n\nconst splitInstances = (instances, ruleSet) => {\n // console.log('instances', instances);\n // console.log('manufacturer', getManufacturer(instances[0]));\n let instancesList = [];\n const rulesLength = ruleSet.length;\n const uniqueValues = new Array(rulesLength).fill(new Set()); // list of possible unique values accross rule set\n const indexes = new Set(); // list of the subseries identifier\n instances.forEach((instance) => {\n let index = ''; // instance identifier\n for (let i = 0; i < rulesLength; i++) {\n // generate instance identifier for each rule\n const val = getMetadataValueFromRule(instance.metadata, ruleSet[i]);\n const valString = getValueString(val);\n uniqueValues[i].add(valString);\n index += [...uniqueValues[i]].indexOf(valString);\n }\n // if instance identifier is different from previous instances, make new subseries\n indexes.add(index);\n const subSeriesIndex = [...indexes].indexOf(index);\n // add instance to output array according to subseries index\n if (!instancesList[subSeriesIndex]) instancesList[subSeriesIndex] = [instance];\n else instancesList[subSeriesIndex].push(instance);\n });\n // console.log('processMRSeries uniqueValues', uniqueValues);\n // console.log('processMRSeries subSeries', instancesList);\n return instancesList;\n};\n\nconst getMetadataValueFromRule = (metadata, rule) => {\n const objectKeys = rule.split('.');\n // console.log('getMetadataValue objectKeys', objectKeys);\n let value = metadata[objectKeys[0]];\n for (let i = 1; i < objectKeys.length; i++) {\n value = value[objectKeys[i]];\n }\n return value;\n};\n\nconst getValueString = (val) => {\n // console.log('getValueString', val);\n if (Array.isArray(val)) {\n // array can't be differentiated in Set, so we have to flatten them\n // console.log(val.join('/'));\n return val.join('/');\n }\n return val;\n};\n","import absoluteUrl from './absoluteUrl';\r\nimport addServers from './addServers';\r\nimport b64toBlob from './b64toBlob';\r\nimport DicomLoaderService from './dicomLoaderService';\r\nimport getImageSetCalculatedSpacings from './getImageSetCalculatedSpacings';\r\nimport guid from './guid';\r\nimport hotkeys from './hotkeys';\r\nimport loadAndCacheDerivedDisplaySets from './loadAndCacheDerivedDisplaySets';\r\nimport makeCancelable from './makeCancelable';\r\nimport ObjectPath from './objectPath';\r\nimport sortBy from './sortBy';\r\nimport StackManager from './StackManager';\r\nimport studyMetadataManager from './studyMetadataManager';\r\nimport * as urlUtil from './urlUtil';\r\nimport writeScript from './writeScript';\r\nimport splitSeries from './splitSeries';\r\n\r\nconst utils = {\r\n guid,\r\n ObjectPath,\r\n absoluteUrl,\r\n addServers,\r\n sortBy,\r\n writeScript,\r\n b64toBlob,\r\n StackManager,\r\n studyMetadataManager,\r\n DicomLoaderService,\r\n urlUtil,\r\n loadAndCacheDerivedDisplaySets,\r\n makeCancelable,\r\n hotkeys,\r\n getImageSetCalculatedSpacings,\r\n splitSeries\r\n};\r\n\r\nexport {\r\n guid,\r\n ObjectPath,\r\n absoluteUrl,\r\n addServers,\r\n sortBy,\r\n writeScript,\r\n b64toBlob,\r\n StackManager,\r\n studyMetadataManager,\r\n DicomLoaderService,\r\n urlUtil,\r\n loadAndCacheDerivedDisplaySets,\r\n makeCancelable,\r\n hotkeys,\r\n getImageSetCalculatedSpacings,\r\n splitSeries\r\n};\r\n\r\nexport default utils;\r\n","export class ObjectPath {\r\n /**\r\n * Set an object property based on \"path\" (namespace) supplied creating\r\n * ... intermediary objects if they do not exist.\r\n * @param object {Object} An object where the properties specified on path should be set.\r\n * @param path {String} A string representing the property to be set, e.g. \"user.study.series.timepoint\".\r\n * @param value {Any} The value of the property that will be set.\r\n * @return {Boolean} Returns \"true\" on success, \"false\" if any intermediate component of the supplied path\r\n * ... is not a valid Object, in which case the property cannot be set. No excpetions are thrown.\r\n */\r\n static set(object, path, value) {\r\n let components = ObjectPath.getPathComponents(path),\r\n length = components !== null ? components.length : 0,\r\n result = false;\r\n\r\n if (length > 0 && ObjectPath.isValidObject(object)) {\r\n let i = 0,\r\n last = length - 1,\r\n currentObject = object;\r\n\r\n while (i < last) {\r\n let field = components[i];\r\n\r\n if (field in currentObject) {\r\n if (!ObjectPath.isValidObject(currentObject[field])) {\r\n break;\r\n }\r\n } else {\r\n currentObject[field] = {};\r\n }\r\n\r\n currentObject = currentObject[field];\r\n i++;\r\n }\r\n\r\n if (i === last) {\r\n currentObject[components[last]] = value;\r\n result = true;\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Get an object property based on \"path\" (namespace) supplied traversing the object\r\n * ... tree as necessary.\r\n * @param object {Object} An object where the properties specified might exist.\r\n * @param path {String} A string representing the property to be searched for, e.g. \"user.study.series.timepoint\".\r\n * @return {Any} The value of the property if found. By default, returns the special type \"undefined\".\r\n */\r\n static get(object, path) {\r\n let found, // undefined by default\r\n components = ObjectPath.getPathComponents(path),\r\n length = components !== null ? components.length : 0;\r\n\r\n if (length > 0 && ObjectPath.isValidObject(object)) {\r\n let i = 0,\r\n last = length - 1,\r\n currentObject = object;\r\n\r\n while (i < last) {\r\n let field = components[i];\r\n\r\n const isValid = ObjectPath.isValidObject(currentObject[field]);\r\n if (field in currentObject && isValid) {\r\n currentObject = currentObject[field];\r\n i++;\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n if (i === last && components[last] in currentObject) {\r\n found = currentObject[components[last]];\r\n }\r\n }\r\n\r\n return found;\r\n }\r\n\r\n /**\r\n * Check if the supplied argument is a real JavaScript Object instance.\r\n * @param object {Any} The subject to be tested.\r\n * @return {Boolean} Returns \"true\" if the object is a real Object instance and \"false\" otherwise.\r\n */\r\n static isValidObject(object) {\r\n return (\r\n typeof object === 'object' && object !== null && object instanceof Object\r\n );\r\n }\r\n\r\n static getPathComponents(path) {\r\n return typeof path === 'string' ? path.split('.') : null;\r\n }\r\n}\r\n\r\nexport default ObjectPath;\r\n","/* jshint -W060 */\r\nimport absoluteUrl from './absoluteUrl';\r\n\r\nexport default function writeScript(fileName, callback) {\r\n const script = document.createElement('script');\r\n script.src = absoluteUrl(fileName);\r\n script.onload = () => {\r\n if (typeof callback === 'function') {\r\n callback(script);\r\n }\r\n };\r\n\r\n document.body.appendChild(script);\r\n}\r\n","export default function makeCancelable(thenable) {\r\n let isCanceled = false;\r\n const promise = Promise.resolve(thenable).then(\r\n function(result) {\r\n if (isCanceled) throw Object.freeze({isCanceled});\r\n return result;\r\n },\r\n function(error) {\r\n if (isCanceled) throw Object.freeze({isCanceled, error});\r\n throw error;\r\n }\r\n );\r\n return Object.assign(Object.create(promise), {\r\n then: promise.then.bind(promise),\r\n cancel() {\r\n isCanceled = true;\r\n }\r\n });\r\n}\r\n","/**\n * Should Find the requested instance metadata into the displaySets and return\n *\n * @param {Array} displaySets - List of displaySets\n * @param {string} SOPInstanceUID - sopInstanceUID to look for\n * @returns {Object} - instance metadata found\n */\nconst findInstanceMetadataBySopInstanceUID = (displaySets, SOPInstanceUID) => {\n let instanceFound;\n\n displaySets.find((displaySet) => {\n if (!displaySet.images) return false;\n\n instanceFound = displaySet.images.find((instanceMetadata) => instanceMetadata.getSOPInstanceUID() === SOPInstanceUID);\n\n return !!instanceFound;\n });\n\n return instanceFound;\n};\n\nexport default findInstanceMetadataBySopInstanceUID;\n","import * as dcmjs from 'dcmjs';\n\nimport findInstanceMetadataBySopInstanceUID from './utils/findInstanceMetadataBySopInstanceUid';\n\n/**\n * Function to parse the part10 array buffer that comes from a DICOM Structured report into measurementData\n * measurementData format is a viewer specific format to be stored into the redux and consumed by other components\n * (e.g. measurement table)\n *\n * @param {ArrayBuffer} part10SRArrayBuffer\n * @param {Array} displaySets\n * @returns\n */\nconst parseDicomStructuredReport = (part10SRArrayBuffer, displaySets) => {\n // Get the dicom data as an Object\n\n const dicomData = dcmjs.data.DicomMessage.readFile(part10SRArrayBuffer);\n const dataset = dcmjs.data.DicomMetaDictionary.naturalizeDataset(\n dicomData.dict\n );\n\n const {MeasurementReport} = dcmjs.adapters.Cornerstone;\n const storedMeasurementByToolType = MeasurementReport.generateToolState(\n dataset\n );\n const measurementData = {};\n let measurementNumber = 0;\n\n Object.keys(storedMeasurementByToolType).forEach((toolName) => {\n const measurements = storedMeasurementByToolType[toolName];\n measurementData[toolName] = [];\n\n measurements.forEach((measurement) => {\n const instanceMetadata = findInstanceMetadataBySopInstanceUID(\n displaySets,\n measurement.sopInstanceUid\n );\n\n const {_study: study, _series: series} = instanceMetadata;\n const {StudyInstanceUID, PatientID} = study;\n const {SeriesInstanceUID} = series;\n const {sopInstanceUid, frameIndex} = measurement;\n const imagePath = getImagePath(\n StudyInstanceUID,\n SeriesInstanceUID,\n sopInstanceUid,\n frameIndex\n );\n\n const imageId = instanceMetadata.getImageId();\n if (!imageId) {\n return;\n }\n\n // TODO: We need the currentTimepointID set into the viewer\n const currentTimepointId = 'TimepointId';\n\n const toolData = {...measurement,\n imageId,\n imagePath,\n SOPInstanceUID: sopInstanceUid,\n SeriesInstanceUID,\n StudyInstanceUID,\n PatientID,\n measurementNumber: ++measurementNumber,\n timepointId: currentTimepointId,\n toolType: toolName,\n _id: imageId + measurementNumber};\n\n measurementData[toolName].push(toolData);\n });\n });\n\n return measurementData;\n};\n\n/**\n * Function to create imagePath with all imageData related\n *\n * @param {string} StudyInstanceUID\n * @param {string} SeriesInstanceUID\n * @param {string} SOPInstanceUID\n * @param {string} frameIndex\n * @returns\n */\nconst getImagePath = (\n StudyInstanceUID,\n SeriesInstanceUID,\n SOPInstanceUID,\n frameIndex\n) => [StudyInstanceUID, SeriesInstanceUID, SOPInstanceUID, frameIndex].join(\n '_'\n);\n\nexport default parseDicomStructuredReport;\n","const displayFunction = (data) => data.text || '';\n\nexport const arrowAnnotate = {\n id: 'ArrowAnnotate',\n name: 'ArrowAnnotate',\n toolGroup: 'allTools',\n cornerstoneToolType: 'ArrowAnnotate',\n options: {\n measurementTable: {\n displayFunction\n },\n caseProgress: {\n include: true,\n evaluate: true\n }\n }\n};\n","const displayFunction = (data) => {\n if (data.shortestDiameter) {\n // TODO: Make this check criteria again to see if we should display shortest x longest\n return `${data.longestDiameter} x ${data.shortestDiameter}`;\n }\n\n return data.longestDiameter;\n};\n\nexport const bidirectional = {\n id: 'Bidirectional',\n name: 'Target',\n toolGroup: 'allTools',\n cornerstoneToolType: 'Bidirectional',\n options: {\n measurementTable: {\n displayFunction\n },\n caseProgress: {\n include: true,\n evaluate: true\n }\n }\n};\n","const displayFunction = (data) => {\n let meanValue = '';\n const {cachedStats} = data;\n if (cachedStats && cachedStats.mean && !isNaN(cachedStats.mean)) {\n meanValue = `${cachedStats.mean.toFixed(2)} HU`;\n }\n return meanValue;\n};\n\nexport const ellipticalRoi = {\n id: 'EllipticalRoi',\n name: 'Ellipse',\n toolGroup: 'allTools',\n cornerstoneToolType: 'EllipticalRoi',\n options: {\n measurementTable: {\n displayFunction\n },\n caseProgress: {\n include: true,\n evaluate: true\n }\n }\n};\n","const displayFunction = (data) => {\n let meanValue = '';\n const {cachedStats} = data;\n if (cachedStats && cachedStats.mean && !isNaN(cachedStats.mean)) {\n meanValue = `${cachedStats.mean.toFixed(2)} HU`;\n }\n return meanValue;\n};\n\nexport const circleRoi = {\n id: 'CircleRoi',\n name: 'Circle',\n toolGroup: 'allTools',\n cornerstoneToolType: 'CircleRoi',\n options: {\n measurementTable: {\n displayFunction\n },\n caseProgress: {\n include: true,\n evaluate: true\n }\n }\n};\n","const displayFunction = (data) => {\n let meanValue = '';\n if (data.meanStdDev && data.meanStdDev.mean && !isNaN(data.meanStdDev.mean)) {\n meanValue = `${data.meanStdDev.mean.toFixed(2)} HU`;\n }\n return meanValue;\n};\n\nexport const freehandMouse = {\n id: 'FreehandRoi',\n name: 'Freehand',\n toolGroup: 'allTools',\n cornerstoneToolType: 'FreehandRoi',\n options: {\n measurementTable: {\n displayFunction\n },\n caseProgress: {\n include: true,\n evaluate: true\n }\n }\n};\n","const displayFunction = (data) => {\n let lengthValue = '';\n if (data.length && !isNaN(data.length)) {\n lengthValue = `${data.length.toFixed(2)} ${data.unit ? data.unit : 'mm'}`;\n }\n return lengthValue;\n};\n\nexport const length = {\n id: 'Length',\n name: 'Length',\n toolGroup: 'allTools',\n cornerstoneToolType: 'Length',\n options: {\n measurementTable: {\n displayFunction\n },\n caseProgress: {\n include: true,\n evaluate: true\n }\n }\n};\n","export const nonTarget = {\n id: 'NonTarget',\n name: 'Non-Target',\n toolGroup: 'allTools',\n cornerstoneToolType: 'NonTarget',\n options: {\n measurementTable: {\n displayFunction: (data) => data.response\n },\n caseProgress: {\n include: true,\n evaluate: true\n }\n }\n};\n","const displayFunction = (data) => {\n let meanValue = '';\n const {cachedStats} = data;\n if (cachedStats && cachedStats.mean && !isNaN(cachedStats.mean)) {\n meanValue = `${cachedStats.mean.toFixed(2)} HU`;\n }\n return meanValue;\n};\n\nexport const rectangleRoi = {\n id: 'RectangleRoi',\n name: 'Rectangle',\n toolGroup: 'allTools',\n cornerstoneToolType: 'RectangleRoi',\n options: {\n measurementTable: {\n displayFunction\n },\n caseProgress: {\n include: true,\n evaluate: true\n }\n }\n};\n","const displayFunction = (data) => {\n let text = '';\n if (data.rAngle && !isNaN(data.rAngle)) {\n text = data.rAngle.toFixed(2) + String.fromCharCode(0x00B0);\n }\n return text;\n};\n\nexport const angle = {\n id: 'Angle',\n name: 'Angle',\n toolGroup: 'allTools',\n cornerstoneToolType: 'Angle',\n options: {\n measurementTable: {\n displayFunction\n },\n caseProgress: {\n include: true,\n evaluate: true\n }\n }\n};\n","export const targetCR = {\n id: 'TargetCR',\n name: 'CR Target',\n toolGroup: 'allTools',\n cornerstoneToolType: 'TargetCR',\n options: {\n measurementTable: {\n displayFunction: (data) => data.response\n },\n caseProgress: {\n include: true,\n evaluate: true\n }\n }\n};\n","export const targetNE = {\n id: 'TargetNE',\n name: 'NE Target',\n toolGroup: 'allTools',\n cornerstoneToolType: 'TargetNE',\n options: {\n measurementTable: {\n displayFunction: (data) => data.response\n },\n caseProgress: {\n include: true,\n evaluate: true\n }\n }\n};\n","export const targetUN = {\n id: 'TargetUN',\n name: 'UN Target',\n toolGroup: 'allTools',\n cornerstoneToolType: 'TargetUN',\n options: {\n measurementTable: {\n displayFunction: (data) => data.response\n },\n caseProgress: {\n include: true,\n evaluate: true\n }\n }\n};\n","const displayFunction = (data) => {\r\n let text = '';\r\n if (data.rAngle && !isNaN(data.rAngle)) {\r\n text = data.rAngle.toFixed(2) + String.fromCharCode(0x00B0);\r\n }\r\n return text;\r\n};\r\n\r\nexport const cobbAngle = {\r\n id: 'CobbAngle',\r\n name: 'CobbAngle',\r\n toolGroup: 'allTools',\r\n cornerstoneToolType: 'CobbAngle',\r\n options: {\r\n measurementTable: {\r\n displayFunction\r\n },\r\n caseProgress: {\r\n include: true,\r\n evaluate: true\r\n }\r\n }\r\n};\r\n","const displayFunction = (data) => `Probe ${parseInt(data.handles.end.x)}, ${parseInt(data.handles.end.y)}`;\n\nexport const probe = {\n id: 'Probe',\n name: 'Probe',\n toolGroup: 'allTools',\n cornerstoneToolType: 'Probe',\n options: {\n measurementTable: {\n displayFunction\n },\n caseProgress: {\n include: true,\n evaluate: true\n }\n }\n};\n","import * as tools from '../tools';\n\nconst childTools = [];\nObject.keys(tools).forEach((key) => childTools.push(tools[key]));\n\nexport const allTools = {\n id: 'allTools',\n name: 'Measurements',\n childTools,\n options: {\n caseProgress: {\n include: true,\n evaluate: true\n }\n }\n};\n","import {allTools} from './toolGroups/allTools';\nimport {\n retrieveMeasurements,\n storeMeasurements,\n retrieveTimepoints,\n storeTimepoints,\n removeTimepoint,\n updateTimepoint,\n disassociateStudy\n} from './dataExchange';\n\nconst measurementApiDefaultConfig = {\n measurementTools: [allTools],\n newLesions: [\n {\n id: 'newTargets',\n name: 'New Targets',\n toolGroupId: 'targets'\n },\n {\n id: 'newNonTargets',\n name: 'New Non-Targets',\n toolGroupId: 'nonTargets'\n }\n ],\n dataExchange: {\n retrieve: retrieveMeasurements,\n store: storeMeasurements\n }\n};\n\nconst timepointApiDefaultConfig = {\n dataExchange: {\n retrieve: retrieveTimepoints,\n store: storeTimepoints,\n remove: removeTimepoint,\n update: updateTimepoint,\n disassociate: disassociateStudy\n }\n};\n\nexport {measurementApiDefaultConfig, timepointApiDefaultConfig};\n","import log from '../log';\n\nexport const retrieveMeasurements = (PatientID, timepointIds) => {\n log.error('retrieveMeasurements');\n return Promise.resolve();\n};\n\nexport const storeMeasurements = (measurementData, timepointIds) => {\n log.error('storeMeasurements');\n return Promise.resolve();\n};\n\nexport const retrieveTimepoints = (filter) => {\n log.error('retrieveTimepoints');\n return Promise.resolve();\n};\n\nexport const storeTimepoints = (timepointData) => {\n log.error('storeTimepoints');\n return Promise.resolve();\n};\n\nexport const updateTimepoint = (timepointData, query) => {\n log.error('updateTimepoint');\n return Promise.resolve();\n};\n\nexport const removeTimepoint = (timepointId) => {\n log.error('removeTimepoint');\n return Promise.resolve();\n};\n\nexport const disassociateStudy = (timepointIds, StudyInstanceUID) => {\n log.error('disassociateStudy');\n return Promise.resolve();\n};\n","import log from '../../log';\nimport { timepointApiDefaultConfig } from '../configuration';\n\nconst configuration = {\n ...timepointApiDefaultConfig\n};\n\nconst TIMEPOINT_TYPE_NAMES = {\n prebaseline: 'Pre-Baseline',\n baseline: 'Baseline',\n followup: 'Follow-up'\n};\n\nexport default class TimepointApi {\n static Instance;\n\n static setConfiguration(config) {\n Object.assign(configuration, config);\n }\n\n static getConfiguration() {\n return configuration;\n }\n\n constructor(currentTimepointId, options = {}) {\n if (TimepointApi.Instance) {\n TimepointApi.Instance.initialize(currentTimepointId, options);\n return TimepointApi.Instance;\n }\n\n this.initialize(currentTimepointId, options);\n TimepointApi.Instance = this;\n }\n\n static getInstance() {\n if (!this.Instance) {\n this.Instance = new TimepointApi();\n }\n return this.Instance;\n }\n\n initialize(currentTimepointId, options = {}) {\n this.currentTimepointId = currentTimepointId;\n this.comparisonTimepointKey = options.comparisonTimepointKey || 'baseline';\n this.options = options;\n this.timepoints = [];\n }\n\n onTimepointsUpdated() {\n if (typeof this.options.onTimepointsUpdated !== 'function') {\n log.warn('Timepoints update callback is not defined');\n return;\n }\n\n this.options.onTimepointsUpdated(Object.assign([], this.timepoints));\n }\n\n calculateVisitNumber(timepoint) {\n // Retrieve all of the relevant follow-up timepoints for this patient\n const sortedTimepoints = this.timepoints.sort((tp1, tp2) =>\n tp1.visitDate > tp2.visitDate ? 1 : -1\n );\n const filteredTimepoints = sortedTimepoints.find(\n (tp) =>\n tp.PatientID === timepoint.PatientID &&\n tp.timepointType === timepoint.timepointType\n );\n\n // Create an array of just timepointIds, so we can use indexOf\n // on it to find the current timepoint's relative position\n const timepointIds = filteredTimepoints.map(\n (timepoint) => timepoint.timepointId\n );\n\n // Calculate the index of the current timepoint in the array of all\n // relevant follow-up timepoints\n const visitNumber = timepointIds.indexOf(timepoint.timepointId) + 1;\n\n // If visitNumber is 0, it means that the current timepoint was not in the list\n if (!visitNumber) {\n throw new Error(\n 'Current timepoint was not in the list of relevant timepoints?'\n );\n }\n\n return visitNumber;\n }\n\n retrieveTimepoints(filter) {\n const retrievalFn = configuration.dataExchange.retrieve;\n if (typeof retrievalFn !== 'function') {\n log.error('Timepoint retrieval function has not been configured.');\n return;\n }\n\n return new Promise((resolve, reject) => {\n retrievalFn(filter)\n .then((timepointData) => {\n log.info('Timepoint data retrieval');\n\n timepointData.forEach((timepoint) => {\n const timepointIndex = this.timepoints.findIndex(\n (tp) => tp.timepointId === timepoint.timepointId\n );\n if (timepointIndex < 0) {\n this.timepoints.push(timepoint);\n } else {\n this.timepoints[timepointIndex] = timepoint;\n }\n });\n\n // Let others know that the timepoints are updated\n this.onTimepointsUpdated();\n\n resolve();\n })\n .catch((reason) => {\n log.error(`Timepoint retrieval function failed: ${reason}`);\n reject(reason);\n });\n });\n }\n\n storeTimepoints() {\n const storeFn = configuration.dataExchange.store;\n if (typeof storeFn !== 'function') {\n log.error('Timepoint store function has not been configured.');\n return;\n }\n\n log.info('Preparing to store timepoints');\n log.info(JSON.stringify(this.timepoints, null, 2));\n\n // storeFn(this.timepoints).then(() => log.info('Timepoint storage completed'));\n // TungLT: change logic to use result of storing timepoints data\n return storeFn(this.timepoints);\n }\n\n disassociateStudy(timepointIds, StudyInstanceUID) {\n const disassociateFn = configuration.dataExchange.disassociate;\n if (typeof disassociateFn !== 'function') {\n log.error('Study disassociate function has not been configured.');\n return;\n }\n\n disassociateFn(timepointIds, StudyInstanceUID).then(() => {\n log.info('Disassociation completed');\n\n this.timepoints = [];\n this.retrieveTimepoints({});\n });\n }\n\n removeTimepoint(timepointId) {\n const removeFn = configuration.dataExchange.remove;\n if (typeof removeFn !== 'function') {\n log.error('Timepoint remove function has not been configured.');\n return;\n }\n\n const timepointData = {\n timepointId\n };\n\n log.info('Preparing to remove timepoint');\n log.info(JSON.stringify(timepointData, null, 2));\n\n removeFn(timepointData).then(() => {\n log.info('Timepoint removal completed');\n\n const tpIndex = this.timepoints.findIndex(\n (tp) => tp.timepointId === timepointId\n );\n if (tpIndex > -1) {\n this.timepoints.splice(tpIndex, 1);\n }\n\n // Let others know that the timepoints are updated\n this.onTimepointsUpdated();\n });\n }\n\n updateTimepoint(timepointId, query) {\n const updateFn = configuration.dataExchange.update;\n if (typeof updateFn !== 'function') {\n log.error('Timepoint update function has not been configured.');\n return;\n }\n\n const timepointData = {\n timepointId\n };\n\n log.info('Preparing to update timepoint');\n log.info(JSON.stringify(timepointData, null, 2));\n log.info(JSON.stringify(query, null, 2));\n\n updateFn(timepointData, query).then(() => {\n log.info('Timepoint updated completed');\n\n const tpIndex = this.timepoints.findIndex(\n (tp) => tp.timepointId === timepointId\n );\n if (tpIndex > -1) {\n this.timepoints[tpIndex] = {\n ...this.timepoints[tpIndex],\n ...query\n };\n }\n\n // Let others know that the timepoints are updated\n this.onTimepointsUpdated();\n });\n }\n\n // Return all timepoints\n all(filter) {\n let timepointsToReturn;\n if (filter) {\n timepointsToReturn = this.timepoints.filter(filter);\n } else {\n timepointsToReturn = this.timepoints;\n }\n\n return timepointsToReturn.sort((tp1, tp2) =>\n tp1.visitDate < tp2.visitDate ? 1 : -1\n );\n }\n\n // Return only the current timepoint\n current() {\n return this.timepoints.find(\n (tp) => tp.timepointId === this.currentTimepointId\n );\n }\n\n lock() {\n const tpIndex = this.timepoints.findIndex(\n (tp) => tp.timepointId === this.currentTimepointId\n );\n if (tpIndex < 0) {\n return;\n }\n\n this.timepoints[tpIndex] = {\n ...this.timepoints[tpIndex],\n locked: true\n };\n }\n\n // Return the prior timepoint\n prior() {\n const current = this.current();\n if (!current) {\n return;\n }\n\n return this.all().find((tp) => tp.visitDate < current.visitDate);\n }\n\n // Return only the current and prior timepoints\n currentAndPrior() {\n const timepoints = [];\n\n const current = this.current();\n if (current) {\n timepoints.push(current);\n }\n\n const prior = this.prior();\n if (current && prior && prior.timepointId !== current.timepointId) {\n timepoints.push(prior);\n }\n\n return timepoints;\n }\n\n // Return the current and the comparison timepoints\n currentAndComparison(comparisonTimepointKey = this.comparisonTimepointKey) {\n const current = this.current();\n const comparisonTimepoint = this.comparison(comparisonTimepointKey);\n const timepoints = [current];\n\n if (\n comparisonTimepoint &&\n !timepoints.find(\n (tp) => tp.timepointId === comparisonTimepoint.timepointId\n )\n ) {\n timepoints.push(comparisonTimepoint);\n }\n\n return timepoints;\n }\n\n /**\n * Return true if there are 2 or more baseline timepoints before and at the current timepoint, otherwise false\n * @returns {boolean}\n */\n isRebaseline(timepointId) {\n const current = timepointId\n ? this.timepoints.find((tp) => tp.timepointId === timepointId)\n : this.current();\n if (!current) {\n return false;\n }\n\n const baselines = this.timepoints.filter(\n (tp) =>\n tp.timepointType === 'baseline' &&\n tp.visitDate <= current.visitDate\n );\n return baselines.length > 1;\n }\n\n /**\n * Return the next (closest future) baseline after current timepoint\n * @returns {*}\n */\n nextBaselineAfterCurrent() {\n const current = this.current();\n\n // Get all next timepoints newer than the current timepoint sorted by visitDate ascending\n const sortedTimepoints = this.timepoints.sort((tp1, tp2) =>\n tp1.visitDate > tp2.visitDate ? 1 : -1\n );\n return sortedTimepoints.find(\n (tp) =>\n tp.visitDate > current.visitDate &&\n tp.timepointType === 'baseline'\n );\n }\n\n /**\n * Set the current timepoint id\n * @param timepointId\n */\n setCurrentTimepointId(timepointId) {\n this.currentTimepointId = timepointId;\n }\n\n /**\n * Set the comparison timepoint that overrides the default comparison timepoint (called based on user selection in a viewport)\n * @param timepoint\n */\n setUserComparison(timepoint) {\n this.userComparison = timepoint;\n }\n\n /**\n * Return only the comparison timepoint\n * @param {String} [comparisonTimepointKey]\n * @return {*}\n */\n comparison(comparisonTimepointKey = this.comparisonTimepointKey) {\n // Return the comparison timepoint set by user if exists\n if (this.userComparison) {\n return this.userComparison;\n }\n\n const current = this.current();\n if (!current) {\n return;\n }\n\n // If current timepoint is prebaseline, the first (closest future) BL after current is comparison regardless of default comparison timepoint\n if (current.timepointType === 'prebaseline') {\n const nextBaselineAfterCurrent = this.nextBaselineAfterCurrent();\n // If there is a next baseline, make it comparison, otherwise comparison is done by default comparison timepoint\n if (nextBaselineAfterCurrent) {\n return nextBaselineAfterCurrent;\n }\n }\n\n // If current timepoint is baseline, the prior is comparison if exists regardless of default comparison timepoint\n if (current.timepointType === 'baseline') {\n const prior = this.prior();\n if (prior) {\n return prior;\n }\n }\n\n const comparison = this[comparisonTimepointKey]();\n\n // Do not return a comparison if it would be identical to\n // the current.\n if (comparison && comparison.timepointId === current.timepointId) {\n return;\n }\n\n return comparison;\n }\n\n /**\n * Return the latest initial (prebaseline or baseline) timepoint after current and before the next followup timepoint\n * @returns {*}\n */\n latestInitialTimepointAfterCurrent() {\n const currentTimepoint = this.current();\n\n // Skip if the current timepoint is FU since there is no initial timepoint after follow-up\n if (currentTimepoint.timepointType === 'followup') {\n return;\n }\n\n // Get all next timepoints newer than the current timepoint sorted by visitDate ascending\n const sortedTimepoints = this.timepoints.sort((tp1, tp2) =>\n tp1.visitDate > tp2.visitDate ? 1 : -1\n );\n const allNextTimepoints = sortedTimepoints.filter(\n (tp) => tp.visitDate > currentTimepoint.visitDate\n );\n\n const nextFollowupIndex = allNextTimepoints.findIndex(\n (tp) => tp.timepointType === 'followup'\n );\n const latestInitialBeforeNextFUIndex = nextFollowupIndex - 1;\n\n if (latestInitialBeforeNextFUIndex < 0) {\n // There is no FU and all next timepoints are initial, so return the last one\n return allNextTimepoints[allNextTimepoints.length - 1];\n }\n\n // Return the latest initial timepoint before the next FU\n return allNextTimepoints[latestInitialBeforeNextFUIndex];\n }\n\n /**\n * Return timepoint ids of initial timepoints which are prebaseline and baseline\n * @returns {*}\n */\n initialTimepointIds() {\n let timepointToCheck = this.current();\n\n // If the current timepoint is PBL or BL, then get the recent PBL/BL of the current timepoint by its first FU\n // If it does not exist, then there is no newer initial timepoint, so the current timepoint is used to determine initial timepoint ids\n if (\n timepointToCheck.timepointType === 'prebaseline' ||\n timepointToCheck.timepointType === 'baseline'\n ) {\n timepointToCheck =\n this.latestInitialTimepointAfterCurrent() || timepointToCheck;\n }\n\n const visitDateToCheck = timepointToCheck.visitDate;\n\n const preBaselineTimepoints =\n this.timepoints.filter(\n (tp) =>\n tp.timepointType === 'prebaseline' &&\n tp.visitDate <= visitDateToCheck\n ) || [];\n const preBaselineTimepointIds = preBaselineTimepoints.map(\n (timepoint) => timepoint.timepointId\n );\n\n const baselineTimepoints =\n this.timepoints.filter(\n (tp) =>\n tp.timepointType === 'baseline' &&\n tp.visitDate <= visitDateToCheck\n ) || [];\n const baselineTimepointIds = baselineTimepoints.map(\n (timepoint) => timepoint.timepointId\n );\n\n return preBaselineTimepointIds.concat(baselineTimepointIds);\n }\n\n // Return only the baseline timepoint\n baseline() {\n const currentVisitDate = this.current().visitDate;\n return this.all().find(\n (tp) =>\n tp.timepointType === 'baseline' &&\n tp.visitDate <= currentVisitDate\n );\n }\n\n /**\n * Return only the nadir timepoint. Must be prior to the current timepoint\n * @return {any}\n */\n nadir() {\n const current = this.current();\n const nadir = this.all().find(\n (tp) =>\n tp.timepointId !== current.timepointId &&\n tp.timepointKey === 'nadir' &&\n tp.visitDate <= current.visitDate\n );\n\n // If we have found a nadir, return that\n if (nadir) {\n return nadir;\n }\n\n // Otherwise, return the most recent baseline\n // This should only happen if we are only at FU1,\n // so the baseline is the nadir.\n return this.baseline();\n }\n\n // Return only the key timepoints (current, prior, nadir and baseline)\n key() {\n const result = [this.current()];\n const prior = this.prior();\n const nadir = this.nadir();\n const baseline = this.baseline();\n\n const resultIncludes = (timepoint) =>\n !!result.find((x) => x.timepointId === timepoint.timepointId);\n\n if (prior && resultIncludes(prior) === false) {\n result.push(prior);\n }\n\n if (nadir && resultIncludes(nadir) === false) {\n result.push(nadir);\n }\n\n if (baseline && resultIncludes(baseline) === false) {\n result.push(baseline);\n }\n\n return result;\n }\n\n // Return only the timepoints for the given study\n study(StudyInstanceUID) {\n return this.all().filter((timepoint) =>\n timepoint.studyInstanceUIDs.includes(StudyInstanceUID)\n );\n }\n\n // Return the timepoint's name\n name(timepoint) {\n const timepointTypeName = TIMEPOINT_TYPE_NAMES[timepoint.timepointType];\n\n // Check if this is a Baseline timepoint, if it is, return 'Baseline'\n if (timepoint.timepointType === 'baseline') {\n return 'Baseline';\n }\n if (timepoint.visitNumber) {\n return `${timepointTypeName} ${timepoint.visitNumber}`;\n }\n\n const visitNumber = this.calculateVisitNumber(timepoint);\n\n // Return the timepoint name as 'Follow-up N'\n return `${timepointTypeName} ${visitNumber}`;\n }\n\n // Build the timepoint title based on its date\n title(timepoint) {\n const timepointName = this.name(timepoint);\n\n const all = this.all();\n let index = -1;\n let currentIndex = null;\n for (let i = 0; i < all.length; i++) {\n const currentTimepoint = all[i];\n\n // Skip the iterations until we can't find the selected timepoint on study list\n if (this.currentTimepointId === currentTimepoint.timepointId) {\n currentIndex = 0;\n }\n\n if (currentIndex !== null) {\n index = currentIndex++;\n }\n\n // Break the loop if reached the timepoint to get the title\n if (currentTimepoint.timepointId === timepoint.timepointId) {\n break;\n }\n }\n\n const states = {\n 0: ['Current'],\n 1: ['Prior']\n };\n const parenthesis = states[index] || [];\n const nadir = this.nadir();\n\n if (nadir && nadir.timepointId === timepoint.timepointId) {\n parenthesis.push('Nadir');\n }\n\n let parenthesisText = '';\n if (parenthesis.length) {\n parenthesisText = `(${parenthesis.join(', ')})`;\n }\n\n return `${timepointName} ${parenthesisText}`;\n }\n\n // TungLT: create timeplate timepoint id for a template annotation group\n addTempTimepoint(timepoint) {\n this.timepoints.push(timepoint);\n this.onTimepointsUpdated();\n }\n}\n","export default function (measurement) {\n if (!measurement) {\n return;\n }\n\n switch (measurement.toolType) {\n case 'Bidirectional':\n case 'TargetCR':\n case 'TargetNE':\n case 'TargetUN':\n return `Target ${measurement.lesionNamingNumber}`;\n case 'NonTarget':\n return `Non-Target ${measurement.lesionNamingNumber}`;\n }\n}\n","export default function (measurement) {\n return measurement.description;\n}\n","import studyMetadataManager from '../../utils/studyMetadataManager';\n\nexport default function (imagePath, thumbnail = false) {\n const [\n StudyInstanceUID,\n SeriesInstanceUID,\n SOPInstanceUID,\n frameIndex\n ] = imagePath.split('_');\n const studyMetadata = studyMetadataManager.get(StudyInstanceUID);\n const series = studyMetadata.getSeriesByUID(SeriesInstanceUID);\n const instance = series.getInstanceByUID(SOPInstanceUID);\n return instance.getImageId(frameIndex, thumbnail);\n}\n","import cornerstoneTools from 'cornerstone-tools';\r\nimport cornerstone from 'cornerstone-core';\r\nimport log from '../../log';\r\nimport getLabel from '../lib/getLabel';\r\nimport getDescription from '../lib/getDescription';\r\nimport getImageIdForImagePath from '../lib/getImageIdForImagePath';\r\nimport guid from '../../utils/guid';\r\nimport studyMetadataManager from '../../utils/studyMetadataManager';\r\nimport {measurementApiDefaultConfig} from '../configuration';\r\n\r\nconst configuration = {\r\n ...measurementApiDefaultConfig\r\n};\r\n\r\nexport default class MeasurementApi {\r\n static Instance;\r\n\r\n temporaryDeletedMeasurement = {};\r\n\r\n /**\r\n * Set configuration: It should merge default configuration with any new one\r\n *\r\n * @static\r\n * @param {Object} config\r\n * @param {Object} config.server\r\n * @param {string} config.server.type - The server type\r\n * @param {string} config.server.wadoRoot - The server wado URL root\r\n * @param {Array} config.measurementTools\r\n * @param {string} config.measurementTools[].id - The tool group id\r\n * @param {string} config.measurementTools[].name - The tool group name\r\n * @param {Array} config.measurementTools[].childTools - The child tool's configuration\r\n * @param {Object} config.dataExchange\r\n * @param {Function} config.dataExchange.store - Function that store measurement data\r\n * @param {Function} config.dataExchange.retrieve - Function that retrieves measurement data\r\n *\r\n * @memberof MeasurementApi\r\n */\r\n static setConfiguration(config) {\r\n Object.assign(configuration, config);\r\n }\r\n\r\n static getConfiguration() {\r\n return configuration;\r\n }\r\n\r\n static getToolsGroupsMap() {\r\n const toolsGroupsMap = {};\r\n configuration.measurementTools.forEach((toolGroup) => {\r\n toolGroup.childTools.forEach(\r\n (tool) => (toolsGroupsMap[tool.id] = toolGroup.id)\r\n );\r\n });\r\n\r\n return toolsGroupsMap;\r\n }\r\n\r\n static getToolGroupTools(toolsGroupsMap) {\r\n const result = {};\r\n Object.keys(toolsGroupsMap).forEach((toolType) => {\r\n const toolGroupId = toolsGroupsMap[toolType];\r\n if (!result[toolGroupId]) {\r\n result[toolGroupId] = [];\r\n }\r\n\r\n result[toolGroupId].push(toolType);\r\n });\r\n\r\n return result;\r\n }\r\n\r\n static getToolConfiguration(toolType) {\r\n const configuration = MeasurementApi.getConfiguration();\r\n const toolsGroupsMap = MeasurementApi.getToolsGroupsMap();\r\n\r\n const toolGroupId = toolsGroupsMap[toolType];\r\n const toolGroup = configuration.measurementTools.find(\r\n (toolGroup) => toolGroup.id === toolGroupId\r\n );\r\n\r\n let tool;\r\n if (toolGroup) {\r\n tool = toolGroup.childTools.find((tool) => tool.id === toolType);\r\n }\r\n\r\n return {\r\n toolGroupId,\r\n toolGroup,\r\n tool\r\n };\r\n }\r\n\r\n static syncMeasurementAndToolData(measurement) {\r\n log.info('syncMeasurementAndToolData', measurement);\r\n\r\n const measurementLabel = getLabel(measurement);\r\n if (measurementLabel) {\r\n measurement.labels = [measurementLabel];\r\n }\r\n\r\n const toolState = cornerstoneTools.globalImageIdSpecificToolStateManager.saveToolState();\r\n\r\n // Stop here if the metadata for the measurement's study is not loaded yet\r\n const {StudyInstanceUID} = measurement;\r\n const metadata = studyMetadataManager.get(StudyInstanceUID);\r\n if (!metadata) return;\r\n\r\n // Iterate each child tool if the current tool has children\r\n const toolType = measurement.toolType;\r\n const {tool} = MeasurementApi.getToolConfiguration(toolType);\r\n if (Array.isArray(tool.childTools)) {\r\n tool.childTools.forEach((childToolKey) => {\r\n const childMeasurement = measurement[childToolKey];\r\n if (!childMeasurement) return;\r\n childMeasurement._id = measurement._id;\r\n childMeasurement.measurementNumber = measurement.measurementNumber;\r\n childMeasurement.lesionNamingNumber = measurement.lesionNamingNumber;\r\n\r\n MeasurementApi.syncMeasurementAndToolData(childMeasurement);\r\n });\r\n\r\n return;\r\n }\r\n\r\n const imageId = getImageIdForImagePath(measurement.imagePath);\r\n\r\n // If no tool state exists for this imageId, create an empty object to store it\r\n if (!toolState[imageId]) {\r\n toolState[imageId] = {};\r\n }\r\n\r\n const currentToolState = toolState[imageId][toolType];\r\n const toolData = currentToolState && currentToolState.data;\r\n\r\n // Check if we already have toolData for this imageId and toolType\r\n if (toolData && toolData.length) {\r\n // If we have toolData, we should search it for any data related to the current Measurement\r\n const toolData = toolState[imageId][toolType].data;\r\n\r\n // Create a flag so we know if we've successfully updated the Measurement in the toolData\r\n let alreadyExists = false;\r\n\r\n // Loop through the toolData to search for this Measurement\r\n toolData.forEach((tool) => {\r\n // Break the loop if this isn't the Measurement we are looking for\r\n if (tool._id !== measurement._id) {\r\n return;\r\n }\r\n\r\n // If we have found the Measurement, set the flag to True\r\n alreadyExists = true;\r\n\r\n // Update the toolData from the Measurement data\r\n Object.assign(tool, measurement);\r\n return false;\r\n });\r\n\r\n // If we have found the Measurement we intended to update, we can stop this function here\r\n if (alreadyExists === true) {\r\n return;\r\n }\r\n } else {\r\n // If no toolData exists for this toolType, create an empty array to hold some\r\n toolState[imageId][toolType] = {\r\n data: []\r\n };\r\n }\r\n\r\n // If we have reached this point, it means we haven't found the Measurement we are looking for\r\n // in the current toolData. This means we need to add it.\r\n\r\n // Add the MeasurementData into the toolData for this imageId\r\n toolState[imageId][toolType].data.push(measurement);\r\n\r\n cornerstoneTools.globalImageIdSpecificToolStateManager.restoreToolState(\r\n toolState\r\n );\r\n }\r\n\r\n static isToolIncluded(tool) {\r\n return (\r\n tool.options &&\r\n tool.options.caseProgress &&\r\n tool.options.caseProgress.include\r\n );\r\n }\r\n\r\n constructor(timepointApi, options = {}) {\r\n if (MeasurementApi.Instance) {\r\n MeasurementApi.Instance.initialize(timepointApi, options);\r\n return MeasurementApi.Instance;\r\n }\r\n\r\n this.initialize(timepointApi, options);\r\n MeasurementApi.Instance = this;\r\n }\r\n\r\n static getInstance() {\r\n if (!this.Instance) {\r\n this.Instance = new MeasurementApi();\r\n }\r\n return this.Instance;\r\n }\r\n\r\n initialize(timepointApi, options = {}) {\r\n this.timepointApi = timepointApi;\r\n this.options = options;\r\n this.toolGroups = {};\r\n this.tools = {};\r\n this.toolsGroupsMap = MeasurementApi.getToolsGroupsMap();\r\n this.toolGroupTools = MeasurementApi.getToolGroupTools(this.toolsGroupsMap);\r\n\r\n // Iterate over each tool group and create collection\r\n configuration.measurementTools.forEach((toolGroup) => {\r\n this.toolGroups[toolGroup.id] = [];\r\n\r\n // Iterate over each tool group child tools (e.g. bidirectional, targetCR, etc.) and create collection\r\n toolGroup.childTools.forEach((tool) => {\r\n this.tools[tool.id] = [];\r\n });\r\n });\r\n }\r\n\r\n onMeasurementsUpdated() {\r\n if (typeof this.options.onMeasurementsUpdated !== 'function') {\r\n log.warn('Measurements update callback is not defined');\r\n return;\r\n }\r\n\r\n this.options.onMeasurementsUpdated({...this.tools});\r\n }\r\n\r\n processMeasurementData(measurementData) {\r\n if (measurementData) {\r\n log.info('Measurement data retrieval');\r\n log.info(measurementData);\r\n\r\n Object.keys(measurementData).forEach((measurementTypeId) => {\r\n const measurements = measurementData[measurementTypeId];\r\n\r\n measurements.forEach((measurement) => {\r\n const {toolType} = measurement;\r\n\r\n this.addMeasurement(toolType, measurement);\r\n });\r\n });\r\n }\r\n\r\n // Synchronize the new tool data\r\n this.syncMeasurementsAndToolData();\r\n\r\n try {\r\n cornerstone.getEnabledElements().forEach((enabledElement) => {\r\n cornerstone.updateImage(enabledElement.element);\r\n });\r\n } catch (e) {\r\n log.error(e);\r\n }\r\n\r\n // Let others know that the measurements are updated\r\n this.onMeasurementsUpdated();\r\n }\r\n\r\n retrieveMeasurements(filter) {\r\n const retrievalFn = configuration.dataExchange.retrieve;\r\n const {server} = configuration;\r\n if (typeof retrievalFn !== 'function') {\r\n log.error('Measurement retrieval function has not been configured.');\r\n return;\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n retrievalFn(server, filter).then((measurementData) => {\r\n this.processMeasurementData(measurementData);\r\n resolve();\r\n }, reject);\r\n });\r\n }\r\n\r\n storeMeasurements(timepointId, options) {\r\n const {server} = configuration;\r\n const storeFn = configuration.dataExchange.store;\r\n if (typeof storeFn !== 'function') {\r\n log.error('Measurement store function has not been configured.');\r\n return;\r\n }\r\n\r\n const measurementData = {};\r\n configuration.measurementTools.forEach((toolGroup) => {\r\n // Skip the tool groups excluded from case progress\r\n if (!MeasurementApi.isToolIncluded(toolGroup)) {\r\n return;\r\n }\r\n\r\n toolGroup.childTools.forEach((tool) => {\r\n // Skip the tools excluded from case progress\r\n if (!MeasurementApi.isToolIncluded(tool)) {\r\n return;\r\n }\r\n\r\n if (!measurementData[toolGroup.id]) {\r\n measurementData[toolGroup.id] = [];\r\n }\r\n\r\n measurementData[toolGroup.id] = measurementData[toolGroup.id].concat(\r\n this.tools[tool.id]\r\n );\r\n });\r\n });\r\n\r\n const timepointFilter = timepointId\r\n ? (tp) => tp.timepointId === timepointId\r\n : null;\r\n const timepoints = this.timepointApi.all(timepointFilter);\r\n const timepointIds = timepoints.map((t) => t.timepointId);\r\n const PatientID = timepoints[0].PatientID;\r\n const filter = {\r\n PatientID,\r\n timepointIds\r\n };\r\n\r\n log.info('Saving Measurements for timepoints:', timepoints);\r\n return storeFn(measurementData, filter, server, options).then((measurementData) => {\r\n log.info('Measurement storage completed', measurementData);\r\n this.processMeasurementData(measurementData);\r\n return measurementData;\r\n });\r\n }\r\n\r\n calculateLesionNamingNumber(measurements) {\r\n const sortedMeasurements = measurements.sort((a, b) => {\r\n if (a.lesionNamingNumber > b.lesionNamingNumber) {\r\n return 1;\r\n }\r\n if (a.lesionNamingNumber < b.lesionNamingNumber) {\r\n return -1;\r\n }\r\n\r\n return 0;\r\n });\r\n\r\n // Calculate lesion naming number starting from 1 not to miss any measurement (as seen in MM)\r\n // A measurement from beginning of the list might be deleted, so a new measurement should replace that\r\n let i;\r\n for (i = 1; i < sortedMeasurements.length + 1; i++) {\r\n if (i < sortedMeasurements[i - 1].lesionNamingNumber) {\r\n break;\r\n }\r\n }\r\n\r\n return i;\r\n }\r\n\r\n fetch(toolGroupId, filter) {\r\n if (!this.toolGroups[toolGroupId]) {\r\n throw new Error(\r\n `MeasurementApi: No Collection with the id: ${toolGroupId}`\r\n );\r\n }\r\n\r\n let items;\r\n if (filter) {\r\n items = this.toolGroups[toolGroupId].filter(filter);\r\n } else {\r\n items = this.toolGroups[toolGroupId];\r\n }\r\n\r\n return items.map((item) => {\r\n if (item.toolId) {\r\n return this.tools[item.toolId].find(\r\n (tool) => tool._id === item.toolItemId\r\n );\r\n }\r\n\r\n return {lesionNamingNumber: item.lesionNamingNumber};\r\n });\r\n }\r\n\r\n getFirstMeasurement(timepointId) {\r\n // Get child tools from all included tool groups\r\n let childTools = [];\r\n configuration.measurementTools.forEach((toolGroup) => {\r\n // Skip the tool groups excluded from case progress\r\n if (!MeasurementApi.isToolIncluded(toolGroup)) {\r\n return false;\r\n }\r\n\r\n childTools = childTools.concat(toolGroup.childTools);\r\n });\r\n\r\n // Get all included child tools\r\n const includedChildTools = childTools.filter((tool) => MeasurementApi.isToolIncluded(tool));\r\n\r\n // Get the first measurement for the given timepoint\r\n let measurement;\r\n includedChildTools.every((tool) => {\r\n measurement = this.tools[tool.id].find(\r\n (t) => t.timepointId === timepointId && t.measurementNumber === 1\r\n );\r\n\r\n return !measurement;\r\n });\r\n\r\n // Return the found measurement object or undefined if not found\r\n return measurement;\r\n }\r\n\r\n lesionExistsAtTimepoints(lesionNamingNumber, toolGroupId, timepointIds) {\r\n // Retrieve all the data for the given tool group (e.g. 'targets')\r\n const measurementsAtTimepoint = this.fetch(toolGroupId, (tool) => timepointIds.includes(tool.timepointId));\r\n\r\n // Return whether or not any lesion at this timepoint has the same lesionNamingNumber\r\n return !!measurementsAtTimepoint.find(\r\n (m) => m.lesionNamingNumber === lesionNamingNumber\r\n );\r\n }\r\n\r\n isNewLesionsMeasurement(measurementData) {\r\n if (!measurementData) {\r\n return;\r\n }\r\n\r\n const toolConfig = MeasurementApi.getToolConfiguration(\r\n measurementData.toolType\r\n );\r\n const toolType = toolConfig.tool.parentTool || measurementData.toolType;\r\n const {timepointApi} = this;\r\n const currentMeasurement =\r\n this.tools[toolType].find((tool) => tool._id === measurementData._id) || {};\r\n const timepointId =\r\n currentMeasurement.timepointId || measurementData.timepointId;\r\n const lesionNamingNumber =\r\n currentMeasurement.lesionNamingNumber ||\r\n measurementData.lesionNamingNumber;\r\n\r\n // Stop here if the needed information is not set\r\n if (!timepointApi || !timepointId || !toolConfig) {\r\n return;\r\n }\r\n\r\n const {toolGroupId} = toolConfig;\r\n const current = timepointApi.timepoints.find(\r\n (tp) => tp.timepointId === timepointId\r\n );\r\n const initialTimepointIds = timepointApi.initialTimepointIds();\r\n\r\n // Stop here if there's no initial timepoint, or if the current is any initial\r\n if (\r\n !initialTimepointIds ||\r\n initialTimepointIds.length < 1 ||\r\n initialTimepointIds.some(\r\n (initialtpid) => initialtpid === current.timepointId\r\n )\r\n ) {\r\n return false;\r\n }\r\n\r\n return (\r\n this.lesionExistsAtTimepoints(\r\n lesionNamingNumber,\r\n toolGroupId,\r\n initialTimepointIds\r\n ) === false\r\n );\r\n }\r\n\r\n calculateLesionMaxMeasurementNumber(groupId, filter) {\r\n let measurements = [];\r\n if (groupId) {\r\n // Get the measurements of the group\r\n measurements = this.toolGroups[groupId] || [];\r\n } else {\r\n // Get all measurements of all groups\r\n measurements = Object.keys(this.toolGroups).reduce((acc, val) => {\r\n acc.push(...this.toolGroups[val]);\r\n return acc;\r\n }, []);\r\n }\r\n\r\n const sortedMeasurements = measurements.filter(filter).sort((tp1, tp2) => (tp1.measurementNumber < tp2.measurementNumber ? 1 : -1));\r\n\r\n for (let i = 0; i < sortedMeasurements.length; i++) {\r\n const toolGroupMeasurement = sortedMeasurements[i];\r\n const measurement = this.tools[toolGroupMeasurement.toolId].find(\r\n (tool) => tool._id === toolGroupMeasurement.toolItemId\r\n );\r\n const isNew = this.isNewLesionsMeasurement(measurement);\r\n if (!isNew) {\r\n return (measurement && measurement.measurementNumber) || 0;\r\n }\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n calculateNewLesionMaxMeasurementNumber(groupId, filter) {\r\n const sortedMeasurements = this.toolGroups[groupId]\r\n .filter(filter)\r\n .sort((tp1, tp2) => (tp1.measurementNumber < tp2.measurementNumber ? 1 : -1));\r\n\r\n for (let i = 0; i < sortedMeasurements.length; i++) {\r\n const toolGroupMeasurement = sortedMeasurements[i];\r\n const measurement = this.tools[toolGroupMeasurement.toolId].find(\r\n (tool) => tool._id === toolGroupMeasurement.toolItemId\r\n );\r\n const isNew = this.isNewLesionsMeasurement(measurement);\r\n if (isNew) {\r\n return measurement.measurementNumber;\r\n }\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n calculateMeasurementNumber(measurement) {\r\n const toolGroupId = this.toolsGroupsMap[measurement.toolType];\r\n\r\n const filter = (tool) => tool._id !== measurement._id;\r\n\r\n const isNew = this.isNewLesionsMeasurement(measurement);\r\n\r\n if (isNew) {\r\n const maxTargetMeasurementNumber = this.calculateLesionMaxMeasurementNumber(\r\n 'targets',\r\n filter\r\n );\r\n const maxNonTargetMeasurementNumber = this.calculateLesionMaxMeasurementNumber(\r\n 'nonTargets',\r\n filter\r\n );\r\n const maxNewTargetMeasurementNumber = this.calculateNewLesionMaxMeasurementNumber(\r\n 'targets',\r\n filter\r\n );\r\n if (toolGroupId === 'targets') {\r\n return Math.max(\r\n maxTargetMeasurementNumber,\r\n maxNonTargetMeasurementNumber,\r\n maxNewTargetMeasurementNumber\r\n );\r\n }\r\n if (toolGroupId === 'nonTargets') {\r\n const maxNewNonTargetMeasurementNumber = this.calculateNewLesionMaxMeasurementNumber(\r\n 'nonTargets',\r\n filter\r\n );\r\n return Math.max(\r\n maxTargetMeasurementNumber,\r\n maxNonTargetMeasurementNumber,\r\n maxNewTargetMeasurementNumber,\r\n maxNewNonTargetMeasurementNumber\r\n );\r\n }\r\n } else {\r\n const maxTargetMeasurementNumber = this.calculateLesionMaxMeasurementNumber(\r\n 'targets',\r\n filter\r\n );\r\n if (toolGroupId === 'targets') {\r\n return maxTargetMeasurementNumber;\r\n }\r\n if (toolGroupId === 'nonTargets') {\r\n const maxNonTargetMeasurementNumber = this.calculateLesionMaxMeasurementNumber(\r\n 'nonTargets',\r\n filter\r\n );\r\n return Math.max(\r\n maxTargetMeasurementNumber,\r\n maxNonTargetMeasurementNumber\r\n );\r\n }\r\n return this.calculateLesionMaxMeasurementNumber(null, filter);\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n getPreviousMeasurement(measurementData) {\r\n if (!measurementData) {\r\n return;\r\n }\r\n\r\n const {timepointId, toolType, lesionNamingNumber} = measurementData;\r\n if (!timepointId || !toolType || !lesionNamingNumber) {\r\n return;\r\n }\r\n\r\n const toolGroupId = this.toolsGroupsMap[measurementData.toolType];\r\n\r\n // TODO: Remove TrialPatientLocationUID from here and override it somehow\r\n // by dependant applications. Here we should use the location attribute instead of the uid\r\n let filter;\r\n const uid =\r\n measurementData.additionalData &&\r\n measurementData.additionalData.TrialPatientLocationUID;\r\n if (uid) {\r\n filter = (tool) => tool._id !== measurementData._id &&\r\n tool.additionalData &&\r\n tool.additionalData.TrialPatientLocationUID === uid;\r\n } else {\r\n filter = (tool) => tool._id !== measurementData._id &&\r\n tool.lesionNamingNumber === lesionNamingNumber;\r\n }\r\n\r\n const childToolTypes = this.toolGroupTools[toolGroupId];\r\n for (let i = 0; i < childToolTypes.length; i++) {\r\n const childToolType = childToolTypes[i];\r\n const toolCollection = this.tools[childToolType];\r\n const item = toolCollection.find(filter);\r\n\r\n if (item) {\r\n return item;\r\n }\r\n }\r\n }\r\n\r\n hasDuplicateMeasurementNumber(measurementData) {\r\n if (!measurementData) {\r\n return;\r\n }\r\n\r\n const {toolType, measurementNumber} = measurementData;\r\n if (!toolType || !measurementNumber) {\r\n return;\r\n }\r\n\r\n const filter = (tool) => tool._id !== measurementData._id &&\r\n tool.measurementNumber === measurementData.measurementNumber;\r\n\r\n return configuration.measurementTools\r\n .filter((toolGroup) => toolGroup.id !== 'temp')\r\n .some((toolGroup) => {\r\n if (this.toolGroups[toolGroup.id].find(filter)) {\r\n return true;\r\n }\r\n return toolGroup.childTools.some((tool) => {\r\n if (this.tools[tool.id].find(filter)) {\r\n return true;\r\n }\r\n });\r\n });\r\n }\r\n\r\n updateNumbering(collectionToUpdate, propertyFilter, propertyName, increment) {\r\n collectionToUpdate.filter(propertyFilter).forEach((item) => {\r\n item[propertyName] += increment;\r\n });\r\n }\r\n\r\n updateMeasurementNumberForAllMeasurements(measurement, increment) {\r\n const filter = (tool) => tool._id !== measurement._id &&\r\n tool.measurementNumber >= measurement.measurementNumber;\r\n\r\n configuration.measurementTools\r\n .filter((toolGroup) => toolGroup.id !== 'temp')\r\n .forEach((toolGroup) => {\r\n this.updateNumbering(\r\n this.toolGroups[toolGroup.id],\r\n filter,\r\n 'measurementNumber',\r\n increment\r\n );\r\n\r\n toolGroup.childTools.forEach((tool) => {\r\n this.updateNumbering(\r\n this.tools[tool.id],\r\n filter,\r\n 'measurementNumber',\r\n increment\r\n );\r\n });\r\n });\r\n }\r\n\r\n addMeasurement(toolType, measurement) {\r\n const toolGroup = this.toolsGroupsMap[toolType];\r\n const groupCollection = this.toolGroups[toolGroup];\r\n const collection = this.tools[toolType];\r\n\r\n // Get the related measurement by the measurement number and use its location if defined\r\n const relatedMeasurement = collection.find(\r\n (t) => t.lesionNamingNumber === measurement.lesionNamingNumber &&\r\n t.toolType === measurement.toolType\r\n );\r\n\r\n // Use the related measurement location if found and defined\r\n if (relatedMeasurement && relatedMeasurement.location) {\r\n measurement.location = relatedMeasurement.location;\r\n }\r\n\r\n // Use the related measurement description if found and defined\r\n if (relatedMeasurement && relatedMeasurement.description) {\r\n measurement.description = relatedMeasurement.description;\r\n }\r\n\r\n // TungLT stored measurement from MongoDB already have mapping _id property, which is generated from MeasurementApi\r\n if (!measurement._id)\r\n measurement._id = guid();\r\n\r\n // Get the timepoint\r\n let timepoint;\r\n if (measurement.StudyInstanceUID) {\r\n timepoint = this.timepointApi.study(measurement.StudyInstanceUID)[0];\r\n } else {\r\n const {timepointId} = measurement;\r\n timepoint = this.timepointApi.timepoints.find(\r\n (t) => t.timepointId === timepointId\r\n );\r\n }\r\n\r\n // Preventing errors thrown when non-associated (standalone) study is opened...\r\n // @TODO: Make sure this logic is correct.\r\n if (!timepoint) return;\r\n\r\n // Empty Item is the lesion just added in cornerstoneTools, but does not have measurement data yet\r\n const emptyItem = groupCollection.find(\r\n // (groupTool) => !groupTool.toolId && groupTool.timepointId === timepoint.timepointId\r\n // TungLT change logic to update measurement data after save to storage\r\n (groupTool) => groupTool.toolItemId === measurement._id && groupTool.timepointId === timepoint.timepointId\r\n );\r\n\r\n // Set the timepointId attribute to measurement to make it easier to filter measurements by timepoint\r\n measurement.timepointId = timepoint.timepointId;\r\n\r\n // Check if the measurement data is just added by a cornerstone tool and is still empty\r\n if (emptyItem) {\r\n // Set relevant initial data and measurement number to the measurement\r\n measurement.lesionNamingNumber = emptyItem.lesionNamingNumber;\r\n measurement.measurementNumber = emptyItem.measurementNumber;\r\n\r\n groupCollection\r\n .filter(\r\n (groupTool) => groupTool.timepointId === timepoint.timepointId &&\r\n groupTool.lesionNamingNumber === measurement.lesionNamingNumber\r\n )\r\n .forEach((groupTool) => {\r\n groupTool.toolId = measurement.toolType;\r\n groupTool.toolItemId = measurement._id;\r\n groupTool.createdAt = measurement.createdAt;\r\n groupTool.measurementNumber = measurement.measurementNumber;\r\n // TungLT synchronize id property, which is generated by MongoDB\r\n groupTool.id = measurement.id;\r\n });\r\n } else {\r\n // Handle measurements not added by cornerstone tools and update its number\r\n log.info('handle measurement not added by cornerstone tool', measurement);\r\n const measurementsInTimepoint = groupCollection.filter(\r\n (groupTool) => groupTool.timepointId === timepoint.timepointId\r\n );\r\n\r\n // TungLT: dont need to update lesionNamingNumber with stored\r\n measurement.lesionNamingNumber = measurement.lesionNamingNumber || this.calculateLesionNamingNumber(\r\n measurementsInTimepoint\r\n );\r\n measurement.measurementNumber =\r\n measurement.measurementNumber ||\r\n this.calculateMeasurementNumber(measurement) + 1;\r\n }\r\n\r\n // Define an update object to reflect the changes in the collection\r\n const updateObject = {\r\n timepointId: timepoint.timepointId,\r\n lesionNamingNumber: measurement.lesionNamingNumber,\r\n measurementNumber: measurement.measurementNumber,\r\n id: measurement.id // TungLT: synchronize id property\r\n };\r\n\r\n // Find the matched measurement from other timepoints\r\n const found = this.getPreviousMeasurement(measurement);\r\n\r\n // Check if a previous related meausurement was found on other timepoints\r\n if (found) {\r\n log.info('previous measurement', found);\r\n // Use the same number as the previous measurement\r\n measurement.lesionNamingNumber = found.lesionNamingNumber;\r\n measurement.measurementNumber = found.measurementNumber;\r\n\r\n // TODO: Remove TrialPatientLocationUID from here and override it somehow\r\n // by dependant applications\r\n\r\n // Change the update object to set the same number, additionalData,\r\n // location, label and description to the current measurement\r\n updateObject.lesionNamingNumber = found.lesionNamingNumber;\r\n updateObject.measurementNumber = found.measurementNumber;\r\n updateObject.additionalData = measurement.additionalData || {};\r\n updateObject.additionalData.TrialPatientLocationUID =\r\n found.additionalData && found.additionalData.TrialPatientLocationUID;\r\n updateObject.location = found.location;\r\n updateObject.label = found.label;\r\n updateObject.description = found.description;\r\n updateObject.isSplitLesion = found.isSplitLesion;\r\n updateObject.isNodal = found.isNodal;\r\n\r\n const description = getDescription(found, measurement);\r\n if (description) {\r\n updateObject.description = description;\r\n }\r\n } else if (this.hasDuplicateMeasurementNumber(measurement)) {\r\n // Update measurementNumber for the measurements with masurementNumber greater or equal than\r\n // measurementNumber of the added measurement (except the added one)\r\n // only if there is another measurement with the same measurementNumber\r\n\r\n // TungLT, dont need to update measurement number\r\n // this.updateMeasurementNumberForAllMeasurements(measurement, 1);\r\n }\r\n\r\n let addedMeasurement;\r\n\r\n // Upsert the measurement in collection\r\n const toolIndex = collection.findIndex(\r\n (tool) => tool._id === measurement._id\r\n );\r\n if (toolIndex > -1) {\r\n addedMeasurement = {...collection[toolIndex], ...updateObject};\r\n collection[toolIndex] = addedMeasurement;\r\n } else {\r\n addedMeasurement = {...measurement, ...updateObject};\r\n collection.push(addedMeasurement);\r\n }\r\n\r\n if (!emptyItem) {\r\n // Reflect the entry in the tool group collection\r\n groupCollection.push({\r\n toolId: toolType,\r\n toolItemId: addedMeasurement._id,\r\n timepointId: timepoint.timepointId,\r\n StudyInstanceUID: addedMeasurement.StudyInstanceUID,\r\n createdAt: addedMeasurement.createdAt,\r\n lesionNamingNumber: addedMeasurement.lesionNamingNumber,\r\n measurementNumber: addedMeasurement.measurementNumber,\r\n id: addedMeasurement.id // TungLT synchronize id generated by MongoDB\r\n });\r\n }\r\n\r\n // Let others know that the measurements are updated\r\n this.onMeasurementsUpdated();\r\n\r\n // TODO: Enable reactivity\r\n // this.timepointChanged.set(timepoint.timepointId);\r\n\r\n return addedMeasurement;\r\n }\r\n\r\n updateMeasurement(toolType, measurement) {\r\n const collection = this.tools[toolType];\r\n\r\n const toolIndex = collection.findIndex(\r\n (tool) => tool._id === measurement._id\r\n );\r\n if (toolIndex < 0) {\r\n return;\r\n }\r\n\r\n collection[toolIndex] = {...measurement, updated: true};\r\n\r\n // Let others know that the measurements are updated\r\n this.onMeasurementsUpdated();\r\n\r\n // TODO: Enable reactivity\r\n // this.timepointChanged.set(timepoint.timepointId);\r\n }\r\n\r\n onMeasurementRemoved(toolType, measurement, persist = true) {\r\n const {lesionNamingNumber, measurementNumber} = measurement;\r\n\r\n const toolGroupId = this.toolsGroupsMap[toolType];\r\n const groupCollection = this.toolGroups[toolGroupId];\r\n\r\n const groupIndex = groupCollection.findIndex(\r\n (group) => group.toolItemId === measurement._id\r\n );\r\n log.info('onMeasurementRemoved', measurement, groupCollection, groupIndex);\r\n if (groupIndex < 0) {\r\n return;\r\n }\r\n\r\n // Remove the deleted measurement only in its timepoint from the collection\r\n groupCollection.splice(groupIndex, 1);\r\n\r\n // Check which timepoints have the deleted measurement\r\n const timepointsWithDeletedMeasurement = groupCollection\r\n .filter((tool) => tool.measurementNumber === measurementNumber)\r\n .map((tool) => tool.timepointId);\r\n\r\n // Update lesionNamingNumber and measurementNumber only if there is no timepoint with that measurement\r\n if (timepointsWithDeletedMeasurement.length < 1) {\r\n // Decrease lesionNamingNumber of all measurements with lesionNamingNumber greater than lesionNamingNumber of the deleted measurement by 1\r\n const lesionNamingNumberFilter = (tool) => tool.lesionNamingNumber >= lesionNamingNumber;\r\n this.updateNumbering(\r\n groupCollection,\r\n lesionNamingNumberFilter,\r\n 'lesionNamingNumber',\r\n -1\r\n );\r\n\r\n const toolGroup = configuration.measurementTools.find(\r\n (tGroup) => tGroup.id === toolGroupId\r\n );\r\n if (toolGroup && toolGroup.childTools) {\r\n toolGroup.childTools.forEach((childTool) => {\r\n const collection = this.tools[childTool.id];\r\n this.updateNumbering(\r\n collection,\r\n lesionNamingNumberFilter,\r\n 'lesionNamingNumber',\r\n -1\r\n );\r\n });\r\n }\r\n\r\n // Decrease measurementNumber of all measurements with measurementNumber greater than measurementNumber of the deleted measurement by 1\r\n this.updateMeasurementNumberForAllMeasurements(measurement, -1);\r\n }\r\n\r\n // Synchronize the new tool data\r\n this.syncMeasurementsAndToolData();\r\n\r\n // Let others know that the measurements are updated\r\n this.onMeasurementsUpdated();\r\n\r\n // TODO: Enable reactivity\r\n // this.timepointChanged.set(timepoint.timepointId);\r\n\r\n // TungLT: for persist deleted measurement\r\n const {id} = measurement;\r\n // \"id\" is generated by backend service. it is different with \"_id\", which generated by MeasurementApi\r\n if (id && persist) {\r\n // if \"id\" is existed, its measurement need to be deleted from database\r\n this.addTemporaryDeletedMeasurements(measurement);\r\n }\r\n }\r\n\r\n syncMeasurementsAndToolData() {\r\n configuration.measurementTools.forEach((toolGroup) => {\r\n // Skip the tool groups excluded from case progress\r\n if (!MeasurementApi.isToolIncluded(toolGroup)) {\r\n return;\r\n }\r\n toolGroup.childTools.forEach((tool) => {\r\n // Skip the tools excluded from case progress\r\n if (!MeasurementApi.isToolIncluded(tool)) {\r\n return;\r\n }\r\n const measurements = this.tools[tool.id];\r\n measurements.forEach((measurement) => {\r\n MeasurementApi.syncMeasurementAndToolData(measurement);\r\n });\r\n });\r\n });\r\n }\r\n\r\n // Modified by TungLT\r\n deleteMeasurements(toolType, measurementTypeId, measurement, persist) {\r\n const filter = {lesionNamingNumber: measurement.lesionNamingNumber, timepointId: measurement.timepointId};\r\n const filterKeys = Object.keys(filter);\r\n const groupCollection = this.toolGroups[measurementTypeId];\r\n\r\n // Stop here if it is a temporary toolGroups\r\n if (!groupCollection) return;\r\n\r\n // Get the entries information before removing them\r\n const groupItems = groupCollection.filter((toolGroup) => filterKeys.every(\r\n (filterKey) => toolGroup[filterKey] === filter[filterKey]\r\n ));\r\n const entries = [];\r\n groupItems.forEach((groupItem) => {\r\n if (!groupItem.toolId) {\r\n return;\r\n }\r\n\r\n const collection = this.tools[groupItem.toolId];\r\n const toolIndex = collection.findIndex(\r\n (tool) => tool._id === groupItem.toolItemId\r\n );\r\n if (toolIndex > -1) {\r\n entries.push(collection[toolIndex]);\r\n collection.splice(toolIndex, 1);\r\n }\r\n });\r\n\r\n // Stop here if no entries were found\r\n if (!entries.length) {\r\n return;\r\n }\r\n\r\n // If the filter doesn't have the measurement number, get it from the first entry\r\n const lesionNamingNumber =\r\n filter.lesionNamingNumber || entries[0].lesionNamingNumber;\r\n\r\n // Synchronize the new data with cornerstone tools\r\n const toolState = cornerstoneTools.globalImageIdSpecificToolStateManager.saveToolState();\r\n\r\n entries.forEach((entry) => {\r\n const measurementsData = [];\r\n const {tool} = MeasurementApi.getToolConfiguration(entry.toolType);\r\n if (Array.isArray(tool.childTools)) {\r\n tool.childTools.forEach((key) => {\r\n const childMeasurement = entry[key];\r\n if (!childMeasurement) return;\r\n measurementsData.push(childMeasurement);\r\n });\r\n } else {\r\n measurementsData.push(entry);\r\n }\r\n\r\n measurementsData.forEach((measurementData) => {\r\n const {imagePath, toolType} = measurementData;\r\n const imageId = getImageIdForImagePath(imagePath);\r\n if (imageId && toolState[imageId]) {\r\n const toolData = toolState[imageId][toolType];\r\n const measurementEntries = toolData && toolData.data;\r\n const measurementEntry = measurementEntries.find(\r\n (mEntry) => mEntry._id === entry._id\r\n );\r\n if (measurementEntry) {\r\n const index = measurementEntries.indexOf(measurementEntry);\r\n measurementEntries.splice(index, 1);\r\n }\r\n }\r\n });\r\n\r\n this.onMeasurementRemoved(toolType, entry, persist);\r\n });\r\n\r\n cornerstoneTools.globalImageIdSpecificToolStateManager.restoreToolState(\r\n toolState\r\n );\r\n\r\n // Synchronize the updated measurements with Cornerstone Tools\r\n // toolData to make sure the displayed measurements show 'Target X' correctly\r\n const syncFilter = {...filter};\r\n delete syncFilter.timepointId;\r\n delete syncFilter.lesionNamingNumber;\r\n\r\n const syncFilterKeys = Object.keys(syncFilter);\r\n\r\n const toolTypes = [...new Set(entries.map((entry) => entry.toolType))];\r\n toolTypes.forEach((toolType) => {\r\n const collection = this.tools[toolType];\r\n collection\r\n .filter((tool) => (\r\n tool.lesionNamingNumber > lesionNamingNumber - 1 &&\r\n syncFilterKeys.every(\r\n (syncFilterKey) => tool[syncFilterKey] === filter[syncFilterKey]\r\n )\r\n ))\r\n .forEach((measurement) => {\r\n MeasurementApi.syncMeasurementAndToolData(measurement);\r\n });\r\n });\r\n }\r\n\r\n getTemporaryDeletedMeasurements = (StudyInstanceUID) => {\r\n return this.temporaryDeletedMeasurement[StudyInstanceUID] || [];\r\n };\r\n\r\n addTemporaryDeletedMeasurements = (measurementData) => {\r\n const {StudyInstanceUID} = measurementData;\r\n const temporaryDeleted = this.getTemporaryDeletedMeasurements(StudyInstanceUID);\r\n // prevent duplicated measurement\r\n if (temporaryDeleted.length === 0 || temporaryDeleted.findIndex((measurement) => measurement.id === measurementData.id) === -1) {\r\n log.info('add measurement to temporary deleted list', measurementData);\r\n temporaryDeleted.push(measurementData);\r\n this.temporaryDeletedMeasurement[StudyInstanceUID] = temporaryDeleted;\r\n }\r\n };\r\n\r\n // temporary deleted measurements of a study need to be clear when call delete request success or current viewport of this study is cleared\r\n clearTemporaryDeletedMeasurement = (StudyInstanceUID) => {\r\n delete this.temporaryDeletedMeasurement[StudyInstanceUID];\r\n };\r\n}\r\n","export class BaseCriterion {\n constructor(options, criterionName) {\n this.options = options;\n this.criterionName = criterionName;\n }\n\n generateResponse(message, measurements) {\n const passed = !message;\n const isGlobal = !measurements || !measurements.length;\n\n return {\n passed,\n isGlobal,\n message,\n measurements,\n criterionName: this.criterionName\n };\n }\n\n getNewTargetNumbers(data) {\n const {options} = this;\n const baselineMeasurementNumbers = [];\n const newTargetNumbers = new Set();\n\n if (options.newTarget) {\n data.targets.forEach((target) => {\n const {measurementNumber} = target.measurement;\n if (target.timepoint.timepointType === 'baseline') {\n baselineMeasurementNumbers.push(measurementNumber);\n }\n });\n data.targets.forEach((target) => {\n const {measurementNumber} = target.measurement;\n if (target.timepoint.timepointType === 'followup') {\n if (!baselineMeasurementNumbers.includes(measurementNumber)) {\n newTargetNumbers.add(measurementNumber);\n }\n }\n });\n }\n\n return newTargetNumbers;\n }\n}\n","import {BaseCriterion} from './BaseCriterion';\n\nexport const LocationSchema = {\n type: 'object'\n};\n\n/* LocationCriterion\n * Check if the there are non-target measurements with response different than \"present\" on baseline\n */\nexport class LocationCriterion extends BaseCriterion {\n constructor(...props) {\n super(...props);\n }\n\n evaluate(data) {\n const items = data.targets.concat(data.nonTargets);\n const measurements = [];\n let message;\n\n items.forEach((item) => {\n const measurement = item.measurement;\n\n if (!measurement.location) {\n measurements.push(measurement);\n }\n });\n\n if (measurements.length) {\n message = 'All measurements should have a location';\n }\n\n return this.generateResponse(message, measurements);\n }\n}\n","import {BaseCriterion} from './BaseCriterion';\n\nexport const MaxTargetsPerOrganSchema = {\n type: 'object',\n properties: {\n limit: {\n label: 'Max targets allowed per organ',\n type: 'integer',\n minimum: 1\n },\n newTarget: {\n label: 'Flag to evaluate only new targets',\n type: 'boolean'\n },\n isNodal: {\n label: 'Filter to evaluate only nodal or extranodal measurements',\n type: 'boolean'\n },\n message: {\n label: 'Message to be displayed in case of nonconformity',\n type: 'string'\n }\n },\n required: ['limit']\n};\n\n/*\n * MaxTargetsPerOrganCriterion\n * Check if the number of target measurements per organ exceeded the limit allowed\n * Options:\n * limit: Max targets allowed in study\n * newTarget: Flag to evaluate only new targets (must be evaluated on both)\n * isNodal: Filter to evaluate only nodal or extranodal measurements\n * message: Message to be displayed in case of nonconformity\n */\nexport class MaxTargetsPerOrganCriterion extends BaseCriterion {\n constructor(...props) {\n super(...props);\n }\n\n evaluate(data) {\n const {options} = this;\n const targetsPerOrgan = {};\n const measurements = [];\n\n const newTargetNumbers = this.getNewTargetNumbers(data);\n data.targets.forEach((target) => {\n const {measurement} = target;\n const {location, measurementNumber, isSplitLesion, isNodal} = measurement;\n\n if (isSplitLesion) { return; }\n\n if (typeof isNodal === 'boolean' && typeof options.isNodal === 'boolean' && options.isNodal !== isNodal) { return; }\n\n if (!targetsPerOrgan[location]) {\n targetsPerOrgan[location] = new Set();\n }\n\n if (!options.newTarget || newTargetNumbers.has(measurementNumber)) {\n targetsPerOrgan[location].add(measurementNumber);\n }\n\n if (targetsPerOrgan[location].size > options.limit) {\n measurements.push(measurement);\n }\n });\n\n let message;\n if (measurements.length) {\n const increment = options.newTarget ? 'new ' : '';\n message =\n options.message ||\n `Each organ should not have more than ${\n options.limit\n } ${increment}targets.`;\n }\n\n return this.generateResponse(message, measurements);\n }\n}\n","import {BaseCriterion} from './BaseCriterion';\n\nexport const MaxTargetsSchema = {\n type: 'object',\n properties: {\n limit: {\n label: 'Max targets allowed in study',\n type: 'integer',\n minimum: 0\n },\n newTarget: {\n label: 'Flag to evaluate only new targets',\n type: 'boolean'\n },\n locationIn: {\n label:\n 'Filter to evaluate only measurements with the specified locations',\n type: 'array',\n items: {\n type: 'string'\n },\n minItems: 1,\n uniqueItems: true\n },\n locationNotIn: {\n label:\n 'Filter to evaluate only measurements without the specified locations',\n type: 'array',\n items: {\n type: 'string'\n },\n minItems: 1,\n uniqueItems: true\n },\n isNodal: {\n label: 'Filter to evaluate only nodal or extranodal measurements',\n type: 'boolean'\n },\n message: {\n label: 'Message to be displayed in case of nonconformity',\n type: 'string'\n }\n },\n required: ['limit']\n};\n\n/* MaxTargetsCriterion\n * Check if the number of target measurements exceeded the limit allowed\n * Options:\n * limit: Max targets allowed in study\n * newTarget: Flag to evaluate only new targets (must be evaluated on both)\n * locationIn: Filter to evaluate only measurements with the specified locations\n * locationNotIn: Filter to evaluate only measurements without the specified locations\n * isNodal: Filter to evaluate only nodal or extranodal measurements\n * message: Message to be displayed in case of nonconformity\n */\nexport class MaxTargetsCriterion extends BaseCriterion {\n constructor(...props) {\n super(...props);\n }\n\n evaluate(data) {\n const {options} = this;\n\n const newTargetNumbers = this.getNewTargetNumbers(data);\n const measurementNumbers = [];\n data.targets.forEach((target) => {\n const {location, measurementNumber, isSplitLesion, isNodal} = target.measurement;\n\n if (isSplitLesion) { return; }\n\n if (typeof isNodal === 'boolean' && typeof options.isNodal === 'boolean' && options.isNodal !== isNodal) { return; }\n\n if (options.newTarget && !newTargetNumbers.has(measurementNumber)) { return; }\n\n if (options.locationIn && options.locationIn.indexOf(location) === -1) { return; }\n\n if (options.locationNotIn && options.locationNotIn.indexOf(location) > -1) { return; }\n\n measurementNumbers.push(measurementNumber);\n });\n\n let lesionType = '';\n if (typeof options.isNodal === 'boolean') {\n lesionType = options.isNodal ? 'nodal ' : 'extranodal ';\n }\n\n let message;\n if (measurementNumbers.length > options.limit) {\n const increment = options.newTarget ? 'new ' : '';\n const plural = options.limit === 1 ? '' : 's';\n const amount = options.limit === 0 ? '' : `more than ${options.limit}`;\n message =\n options.message ||\n `The study should not have ${amount} ${increment}${lesionType}target${plural}.`;\n }\n\n return this.generateResponse(message);\n }\n}\n","import {BaseCriterion} from './BaseCriterion';\n\nexport const MeasurementsLengthSchema = {\n type: 'object',\n properties: {\n longAxis: {\n label: 'Minimum length of long axis',\n type: 'number',\n minimum: 0\n },\n shortAxis: {\n label: 'Minimum length of short axis',\n type: 'number',\n minimum: 0\n },\n longAxisSliceThicknessMultiplier: {\n label: 'Length of long axis multiplier',\n type: 'number',\n minimum: 0\n },\n shortAxisSliceThicknessMultiplier: {\n label: 'Length of short axis multiplier',\n type: 'number',\n minimum: 0\n },\n modalityIn: {\n label:\n 'Filter to evaluate only measurements with the specified modalities',\n type: 'array',\n items: {\n type: 'string'\n },\n minItems: 1,\n uniqueItems: true\n },\n modalityNotIn: {\n label:\n 'Filter to evaluate only measurements without the specified modalities',\n type: 'array',\n items: {\n type: 'string'\n },\n minItems: 1,\n uniqueItems: true\n },\n locationIn: {\n label:\n 'Filter to evaluate only measurements with the specified locations',\n type: 'array',\n items: {\n type: 'string'\n },\n minItems: 1,\n uniqueItems: true\n },\n locationNotIn: {\n label:\n 'Filter to evaluate only measurements without the specified locations',\n type: 'array',\n items: {\n type: 'string'\n },\n minItems: 1,\n uniqueItems: true\n },\n isNodal: {\n label: 'Filter to evaluate only nodal or extranodal measurements',\n type: 'boolean'\n },\n message: {\n label: 'Message to be displayed in case of nonconformity',\n type: 'string'\n }\n },\n anyOf: [\n {required: ['message', 'longAxis']},\n {required: ['message', 'shortAxis']},\n {required: ['message', 'longAxisSliceThicknessMultiplier']},\n {required: ['message', 'shortAxisSliceThicknessMultiplier']}\n ]\n};\n\n/*\n * MeasurementsLengthCriterion\n * Check the measurements of all bidirectional tools based on\n * short axis, long axis, modalities, location and slice thickness\n * Options:\n * longAxis: Minimum length of long axis\n * shortAxis: Minimum length of short axis\n * longAxisSliceThicknessMultiplier: Length of long axis multiplier\n * shortAxisSliceThicknessMultiplier: Length of short axis multiplier\n * modalityIn: Filter to evaluate only measurements with the specified modalities\n * modalityNotIn: Filter to evaluate only measurements without the specified modalities\n * locationIn: Filter to evaluate only measurements with the specified locations\n * locationNotIn: Filter to evaluate only measurements without the specified locations\n * isNodal: Filter to evaluate only nodal or extranodal measurements\n * message: Message to be displayed in case of nonconformity\n */\nexport class MeasurementsLengthCriterion extends BaseCriterion {\n constructor(...props) {\n super(...props);\n }\n\n evaluate(data) {\n let message;\n const measurements = [];\n const {options} = this;\n const longMultiplier = options.longAxisSliceThicknessMultiplier;\n const shortMultiplier = options.shortAxisSliceThicknessMultiplier;\n\n data.targets.forEach((item) => {\n const {metadata, measurement} = item;\n const {location} = measurement;\n\n let {longestDiameter, shortestDiameter, isNodal} = measurement;\n if (measurement.childToolsCount) {\n const child = measurement.bidirectional;\n longestDiameter = (child && child.longestDiameter) || 0;\n shortestDiameter = (child && child.shortestDiameter) || 0;\n }\n\n const {SliceThickness} = metadata;\n\n const Modality = metadata.getTagValue('Modality') || '';\n\n // Stop here if the measurement does not match the Modality and location filters\n if (\n typeof isNodal === 'boolean' &&\n typeof options.isNodal === 'boolean' &&\n options.isNodal !== isNodal\n ) { return; }\n if (options.locationIn && options.locationIn.indexOf(location) === -1) { return; }\n if (options.modalityIn && options.modalityIn.indexOf(Modality) === -1) { return; }\n if (options.locationNotIn && options.locationNotIn.indexOf(location) > -1) { return; }\n if (options.modalityNotIn && options.modalityNotIn.indexOf(Modality) > -1) { return; }\n\n // Check the measurement length\n const failed =\n (options.longAxis && longestDiameter < options.longAxis) ||\n (options.shortAxis && shortestDiameter < options.shortAxis) ||\n (longMultiplier &&\n !isNaN(SliceThickness) &&\n longestDiameter < longMultiplier * SliceThickness) ||\n (shortMultiplier &&\n !isNaN(SliceThickness) &&\n shortestDiameter < shortMultiplier * SliceThickness);\n\n // Mark this measurement as invalid if some of the checks have failed\n if (failed) {\n measurements.push(measurement);\n }\n });\n\n // Use the options' message if some measurement is invalid\n if (measurements.length) {\n message = options.message;\n }\n\n return this.generateResponse(message, measurements);\n }\n}\n","import {BaseCriterion} from './BaseCriterion';\n\nexport const ModalitySchema = {\n type: 'object',\n properties: {\n method: {\n label: 'Specify if it\\'s goinig to \"allow\" or \"deny\" the modalities',\n type: 'string',\n enum: ['allow', 'deny']\n },\n measurementTypes: {\n label: 'List of measurement types that will be evaluated',\n type: 'array',\n items: {\n type: 'string'\n },\n minItems: 1,\n uniqueItems: true\n },\n modalities: {\n label: 'List of allowed/denied modalities',\n type: 'array',\n items: {\n type: 'string'\n },\n minItems: 1,\n uniqueItems: true\n }\n },\n required: ['method', 'modalities']\n};\n\n/*\n * ModalityCriteria\n * Check if a Modality is allowed or denied\n * Options:\n * method (string): Specify if it\\'s goinig to \"allow\" or \"deny\" the modalities\n * measurementTypes (string[]): List of measurement types that will be evaluated\n * modalities (string[]): List of allowed/denied modalities\n */\nexport class ModalityCriterion extends BaseCriterion {\n constructor(...props) {\n super(...props);\n }\n\n evaluate(data) {\n const measurementTypes = this.options.measurementTypes || ['targets'];\n const modalitiesSet = new Set(this.options.modalities);\n const validationMethod = this.options.method;\n const measurements = [];\n const invalidModalities = new Set();\n let message;\n\n measurementTypes.forEach((measurementType) => {\n const items = data[measurementType];\n\n items.forEach((item) => {\n const {measurement, metadata} = item;\n const Modality = metadata.getTagValue('Modality') || '';\n\n if (\n (validationMethod === 'allow' && !modalitiesSet.has(Modality)) ||\n (validationMethod === 'deny' && modalitiesSet.has(Modality))\n ) {\n measurements.push(measurement);\n invalidModalities.add(Modality);\n }\n });\n });\n\n if (measurements.length) {\n const uniqueModalities = Array.from(invalidModalities);\n const uniqueModalitiesText = uniqueModalities.join(', ');\n const modalityText =\n uniqueModalities.length > 1 ? 'modalities' : 'Modality';\n\n message = `The ${modalityText} ${uniqueModalitiesText} should not be used as a method of measurement`;\n }\n\n return this.generateResponse(message, measurements);\n }\n}\n","import {BaseCriterion} from './BaseCriterion';\n\nexport const NonTargetResponseSchema = {\n type: 'object'\n};\n\n/* NonTargetResponseCriterion\n * Check if the there are non-target measurements with response different than \"present\" on baseline\n */\nexport class NonTargetResponseCriterion extends BaseCriterion {\n constructor(...props) {\n super(...props);\n }\n\n evaluate(data) {\n const items = data.nonTargets;\n const measurements = [];\n let message;\n\n items.forEach((item) => {\n const measurement = item.measurement;\n const response = (measurement.response || '').toLowerCase();\n\n if (response !== 'present') {\n measurements.push(measurement);\n }\n });\n\n if (measurements.length) {\n message = 'Non-targets can only be assessed as \"present\"';\n }\n\n return this.generateResponse(message, measurements);\n }\n}\n","import {BaseCriterion} from './BaseCriterion';\n\nexport const TargetTypeSchema = {\n type: 'object'\n};\n\n/* TargetTypeCriterion\n * Check if the there are non-bidirectional target measurements on baseline\n */\nexport class TargetTypeCriterion extends BaseCriterion {\n constructor(...props) {\n super(...props);\n }\n\n evaluate(data) {\n const items = data.targets;\n const measurements = [];\n let message;\n\n items.forEach((item) => {\n const measurement = item.measurement;\n\n if (\n measurement.toolType !== 'Bidirectional' &&\n !measurement.bidirectional\n ) {\n measurements.push(measurement);\n }\n });\n\n if (measurements.length) {\n message =\n 'Target lesions must have measurements (cannot be assessed as CR, UN/NE, EX)';\n }\n\n return this.generateResponse(message, measurements);\n }\n}\n","import Ajv from 'ajv';\nimport {BaseCriterion} from './criteria/BaseCriterion';\nimport * as initialCriteria from './criteria';\n\nconst Criteria = {...initialCriteria};\n\nexport class CriteriaEvaluator {\n constructor(criteriaObject) {\n const criteriaValidator = this.getCriteriaValidator();\n this.criteria = [];\n\n if (!criteriaValidator(criteriaObject)) {\n let message = '';\n criteriaValidator.errors.forEach((error) => {\n message += `\\noptions${error.dataPath} ${error.message}`;\n });\n throw new Error(message);\n }\n\n Object.keys(criteriaObject).forEach((criterionkey) => {\n const optionsObject = criteriaObject[criterionkey];\n const Criterion = Criteria[`${criterionkey}Criterion`];\n const optionsArray =\n optionsObject instanceof Array ? optionsObject : [optionsObject];\n optionsArray.forEach((options) => this.criteria.push(new Criterion(options, criterionkey)));\n });\n }\n\n getMaxTargets(newTarget = false) {\n let result = 0;\n this.criteria.forEach((criterion) => {\n const newTargetMatch = newTarget === !!criterion.options.newTarget;\n if (criterion instanceof Criteria.MaxTargetsCriterion && newTargetMatch) {\n const {limit} = criterion.options;\n if (limit > result) {\n result = limit;\n }\n }\n });\n return result;\n }\n\n getCriteriaValidator() {\n if (CriteriaEvaluator.criteriaValidator) {\n return CriteriaEvaluator.criteriaValidator;\n }\n\n const schema = {\n properties: {},\n definitions: {}\n };\n\n Object.keys(Criteria).forEach((key) => {\n const Criterion = Criteria[key];\n if (Criterion.prototype instanceof BaseCriterion) {\n const criterionkey = key.replace(/Criterion$/, '');\n const criterionDefinition = `#/definitions/${criterionkey}`;\n\n schema.definitions[criterionkey] = Criteria[`${criterionkey}Schema`];\n schema.properties[criterionkey] = {\n oneOf: [\n {$ref: criterionDefinition},\n {\n type: 'array',\n items: {\n $ref: criterionDefinition\n }\n }\n ]\n };\n }\n });\n\n CriteriaEvaluator.criteriaValidator = new Ajv().compile(schema);\n return CriteriaEvaluator.criteriaValidator;\n }\n\n evaluate(data) {\n const nonconformities = [];\n this.criteria.forEach((criterion) => {\n const criterionResult = criterion.evaluate(data);\n if (!criterionResult.passed) {\n nonconformities.push(criterionResult);\n }\n });\n return nonconformities;\n }\n\n static setCriterion(criterionKey, criterionDefinitions) {\n Criteria[criterionKey] = criterionDefinitions;\n }\n}\n","import * as recistEvaluation from './recist.json';\n\nexport const recist11 = recistEvaluation;\n","import {CriteriaEvaluator} from './CriteriaEvaluator';\nimport * as initialEvaluations from './evaluations';\nimport log from '../../log';\n\nconst evaluations = {...initialEvaluations};\n\nconst BASELINE = 'baseline';\nconst FOLLOWUP = 'followup';\nconst BOTH = 'both';\nconst TARGETS = 'targets';\nconst NONTARGETS = 'nonTargets';\n\nclass ConformanceCriteria {\n constructor(measurementApi, timepointApi, options = {}) {\n this.measurementApi = measurementApi;\n this.timepointApi = timepointApi;\n this.nonconformities = [];\n this.groupedNonConformities = [];\n this.maxTargets = null;\n this.maxNewTargets = null;\n this.options = options;\n }\n\n loadStudy(StudyInstanceUID) {\n if (typeof this.options.loadStudy !== 'function') {\n throw new Error('loadStudy callback is not defined');\n }\n\n return this.options.loadStudy(null, StudyInstanceUID);\n }\n\n async validate(trialCriteriaType) {\n const baselinePromise = this.getData(BASELINE);\n const followupPromise = this.getData(FOLLOWUP);\n const [baselineData, followupData] = await Promise.all([\n baselinePromise,\n followupPromise\n ]);\n const mergedData = {\n targets: [],\n nonTargets: []\n };\n\n mergedData.targets = mergedData.targets.concat(baselineData.targets);\n mergedData.targets = mergedData.targets.concat(followupData.targets);\n mergedData.nonTargets = mergedData.nonTargets.concat(\n baselineData.nonTargets\n );\n mergedData.nonTargets = mergedData.nonTargets.concat(\n followupData.nonTargets\n );\n\n this.maxTargets = null;\n this.maxNewTargets = null;\n const resultBoth = this.validateTimepoint(\n BOTH,\n trialCriteriaType,\n mergedData\n );\n const resultBaseline = this.validateTimepoint(\n BASELINE,\n trialCriteriaType,\n baselineData\n );\n const resultFollowup = this.validateTimepoint(\n FOLLOWUP,\n trialCriteriaType,\n followupData\n );\n const nonconformities = resultBaseline\n .concat(resultFollowup)\n .concat(resultBoth);\n const groupedNonConformities = this.groupNonConformities(nonconformities);\n\n // Keep both? Group the data only on viewer/measurementTable views?\n // Work with not grouped data (worse lookup performance on measurementTableRow)?\n this.nonconformities = nonconformities;\n this.groupedNonConformities = groupedNonConformities;\n\n console.warn('nonconformities');\n console.warn(nonconformities);\n console.warn('groupedNonConformities');\n console.warn(groupedNonConformities);\n\n return nonconformities;\n }\n\n groupNonConformities(nonconformities) {\n const groups = {};\n const toolsGroupsMap = this.measurementApi.toolsGroupsMap;\n\n nonconformities.forEach((nonConformity) => {\n if (nonConformity.isGlobal) {\n groups.globals = groups.globals || {messages: []};\n groups.globals.messages.push(nonConformity.message);\n\n return;\n }\n\n nonConformity.measurements.forEach((measurement) => {\n const groupName = toolsGroupsMap[measurement.toolType];\n groups[groupName] = groups[groupName] || {measurementNumbers: {}};\n\n const group = groups[groupName];\n const measureNumber = measurement.measurementNumber;\n let measurementNumbers = group.measurementNumbers[measureNumber];\n\n if (!measurementNumbers) {\n measurementNumbers = group.measurementNumbers[measureNumber] = {\n messages: [],\n measurements: []\n };\n }\n\n measurementNumbers.messages.push(nonConformity.message);\n measurementNumbers.measurements.push(measurement);\n });\n });\n\n return groups;\n }\n\n validateTimepoint(timepointType, trialCriteriaType, data) {\n const evaluators = this.getEvaluators(timepointType, trialCriteriaType);\n let nonconformities = [];\n\n evaluators.forEach((evaluator) => {\n const maxTargets = evaluator.getMaxTargets(false);\n const maxNewTargets = evaluator.getMaxTargets(true);\n if (maxTargets) {\n this.maxTargets = maxTargets;\n }\n\n if (maxNewTargets) {\n this.maxNewTargets = maxNewTargets;\n }\n\n const result = evaluator.evaluate(data);\n\n if (result.length > 0) {\n result.forEach((resultItem) => {\n resultItem.timepointType = timepointType;\n });\n }\n\n nonconformities = nonconformities.concat(result);\n });\n\n return nonconformities;\n }\n\n getEvaluators(timepointType, trialCriteriaType) {\n const evaluators = [];\n console.warn(evaluations);\n const trialCriteriaTypeId = trialCriteriaType.id.toLowerCase();\n const evaluation = evaluations[trialCriteriaTypeId];\n\n if (evaluation) {\n const evaluationTimepoint = evaluation[timepointType];\n\n if (evaluationTimepoint) {\n evaluators.push(new CriteriaEvaluator(evaluationTimepoint));\n }\n }\n\n return evaluators;\n }\n\n /*\n * Build the data that will be used to do the conformance criteria checks\n */\n async getData(timepointType) {\n const data = {\n targets: [],\n nonTargets: []\n };\n\n const studyPromises = [];\n\n const fillData = (measurementType) => {\n const measurements = this.measurementApi.fetch(measurementType);\n\n measurements.forEach((measurement) => {\n const {StudyInstanceUID} = measurement;\n\n const timepointId = measurement.timepointId;\n const timepoint =\n timepointId &&\n this.timepointApi.timepoints.find((a) => a.timepointId === timepointId);\n\n if (\n !timepoint ||\n (timepointType !== BOTH && timepoint.timepointType !== timepointType)\n ) {\n return;\n }\n\n const promise = this.loadStudy(StudyInstanceUID);\n promise.then(\n (studyMetadata) => {\n data[measurementType].push({\n measurement,\n metadata: studyMetadata.getFirstInstance(),\n timepoint\n });\n },\n (error) => {\n throw new Error(error);\n }\n );\n studyPromises.push(promise);\n });\n };\n\n fillData(TARGETS);\n fillData(NONTARGETS);\n\n await Promise.all(studyPromises);\n\n return data;\n }\n\n static setEvaluationDefinitions(evaluationKey, evaluationDefinitions) {\n evaluations[evaluationKey] = evaluationDefinitions;\n }\n}\n\nexport default ConformanceCriteria;\n// OHIF.measurements.ConformanceCriteria = ConformanceCriteria;\n","import cornerstone from 'cornerstone-core';\n\nexport default function (element) {\n // Get the Cornerstone imageId\n const enabledElement = cornerstone.getEnabledElement(element);\n const imageId = enabledElement.image.imageId;\n\n // Get StudyInstanceUID & PatientID\n const {\n StudyInstanceUID,\n PatientID,\n SeriesInstanceUID,\n SOPInstanceUID\n } = cornerstone.metaData.get('instance', imageId);\n\n const splitImageId = imageId.split('&frame');\n const frameIndex =\n splitImageId[1] !== undefined ? Number(splitImageId[1]) : 0;\n\n const imagePath = [\n StudyInstanceUID,\n SeriesInstanceUID,\n SOPInstanceUID,\n frameIndex\n ].join('_');\n\n return {\n PatientID,\n StudyInstanceUID,\n SeriesInstanceUID,\n SOPInstanceUID,\n frameIndex,\n imagePath\n };\n}\n","import cornerstone from 'cornerstone-core';\nimport {MeasurementApi} from '../classes';\nimport log from '../../log';\nimport user from '../../user';\nimport getImageAttributes from '../lib/getImageAttributes';\nimport getLabel from '../lib/getLabel';\n\nexport default function handleSingleMeasurementAdded({eventData, tool}) {\n const measurementApi = MeasurementApi.Instance;\n if (!measurementApi) {\n log.warn('Measurement API is not initialized');\n }\n\n const {measurementData, toolType} = eventData;\n\n const collection = measurementApi.tools[toolType];\n\n // Stop here if the tool data shall not be persisted (e.g. temp tools)\n if (!collection) return;\n\n // Stop here if there's no measurement data or if it was cancelled\n if (!measurementData || measurementData.cancelled) return;\n\n log.info('CornerstoneToolsMeasurementAdded');\n\n const imageAttributes = getImageAttributes(eventData.element);\n const measurement = {\n ...measurementData,\n ...imageAttributes,\n lesionNamingNumber: measurementData.lesionNamingNumber,\n userId: user.getUserId(),\n toolType\n };\n\n const addedMeasurement = measurementApi.addMeasurement(toolType, measurement);\n Object.assign(measurementData, addedMeasurement);\n\n const measurementLabel = getLabel(measurementData);\n if (measurementLabel) {\n measurementData.labels = [measurementLabel];\n }\n\n // TODO: This is very hacky, but will work for now\n cornerstone.getEnabledElements().forEach((enabledElement) => {\n cornerstone.updateImage(enabledElement.element);\n });\n\n // TODO: Notify about the last activated measurement\n\n if (MeasurementApi.isToolIncluded(tool)) {\n // TODO: Notify that viewer suffered changes\n }\n}\n","import cornerstone from 'cornerstone-core';\nimport {MeasurementApi} from '../classes';\nimport log from '../../log';\nimport user from '../../user';\nimport getImageAttributes from '../lib/getImageAttributes';\nimport getLabel from '../lib/getLabel';\n\nexport default function ({eventData, tool, toolGroupId, toolGroup}) {\n const measurementApi = MeasurementApi.Instance;\n if (!measurementApi) {\n log.warn('Measurement API is not initialized');\n }\n\n const {measurementData} = eventData;\n\n const collection = measurementApi.tools[tool.parentTool];\n\n // Stop here if the tool data shall not be persisted (e.g. temp tools)\n if (!collection) return;\n\n // Stop here if there's no measurement data or if it was cancelled\n if (!measurementData || measurementData.cancelled) return;\n\n log.info('CornerstoneToolsMeasurementAdded');\n\n const imageAttributes = getImageAttributes(eventData.element);\n\n const additionalProperties = Object.assign(imageAttributes, {\n userId: user.getUserId()\n });\n\n const childMeasurement = {\n\n ...measurementData,\n ...additionalProperties\n };\n\n const parentMeasurement = collection.find(\n (t) => t.toolType === tool.parentTool &&\n t.PatientID === imageAttributes.PatientID &&\n t[tool.attribute] === null\n );\n\n // Check if a measurement to fit this child tool already exists\n if (parentMeasurement) {\n const key = tool.attribute;\n\n // Add the createdAt attribute\n childMeasurement.createdAt = new Date();\n\n // Update the parent measurement\n parentMeasurement[key] = childMeasurement;\n parentMeasurement.childToolsCount =\n (parentMeasurement.childToolsCount || 0) + 1;\n measurementApi.updateMeasurement(tool.parentTool, parentMeasurement);\n\n // Update the measurementData ID and lesionNamingNumber\n measurementData._id = parentMeasurement._id;\n measurementData.lesionNamingNumber = parentMeasurement.lesionNamingNumber;\n } else {\n const measurement = {\n toolType: tool.parentTool,\n lesionNamingNumber: measurementData.lesionNamingNumber,\n userId: user.getUserId(),\n PatientID: imageAttributes.PatientID,\n StudyInstanceUID: imageAttributes.StudyInstanceUID\n };\n\n measurement[tool.attribute] = {\n\n ...measurementData,\n ...additionalProperties\n };\n\n const addedMeasurement = measurementApi.addMeasurement(\n tool.parentTool,\n measurement\n );\n Object.assign(measurementData, addedMeasurement);\n }\n\n const measurementLabel = getLabel(measurementData);\n if (measurementLabel) {\n measurementData.labels = [measurementLabel];\n }\n\n // TODO: This is very hacky, but will work for now\n cornerstone.getEnabledElements().forEach((enabledElement) => {\n cornerstone.updateImage(enabledElement.element);\n });\n\n // TODO: Notify about the last activated measurement\n\n if (MeasurementApi.isToolIncluded(tool)) {\n // TODO: Notify that viewer suffered changes\n }\n}\n","import cornerstone from 'cornerstone-core';\nimport {MeasurementApi} from '../classes';\nimport log from '../../log';\n\nexport default function ({eventData, tool, toolGroupId, toolGroup}) {\n const measurementApi = MeasurementApi.Instance;\n if (!measurementApi) {\n log.warn('Measurement API is not initialized');\n }\n\n const {measurementData, toolType} = eventData;\n\n const collection = measurementApi.tools[toolType];\n\n // Stop here if the tool data shall not be persisted (e.g. temp tools)\n if (!collection) return;\n\n log.info('CornerstoneToolsMeasurementModified');\n let measurement = collection.find((t) => t._id === measurementData._id);\n\n // Stop here if the measurement is already deleted\n if (!measurement) return;\n\n measurement = Object.assign(measurement, measurementData);\n measurement.viewport = cornerstone.getViewport(eventData.element);\n\n measurementApi.updateMeasurement(toolType, measurement);\n\n // TODO: Notify about the last activated measurement\n\n if (MeasurementApi.isToolIncluded(tool)) {\n // TODO: Notify that viewer suffered changes\n }\n}\n","import cornerstone from 'cornerstone-core';\nimport {MeasurementApi} from '../classes';\nimport log from '../../log';\n\nexport default function ({eventData, tool, toolGroupId, toolGroup}) {\n const measurementApi = MeasurementApi.Instance;\n if (!measurementApi) {\n log.warn('Measurement API is not initialized');\n }\n\n const {measurementData} = eventData;\n\n const collection = measurementApi.tools[tool.parentTool];\n\n // Stop here if the tool data shall not be persisted (e.g. temp tools)\n if (!collection) return;\n\n log.info('CornerstoneToolsMeasurementModified');\n\n const measurement = collection.find((t) => t._id === measurementData._id);\n let childMeasurement = measurement && measurement[tool.attribute];\n\n // Stop here if the measurement is already deleted\n if (!childMeasurement) return;\n\n childMeasurement = Object.assign(childMeasurement, measurementData);\n childMeasurement.viewport = cornerstone.getViewport(eventData.element);\n\n // Update the parent measurement\n measurement[tool.attribute] = childMeasurement;\n measurementApi.updateMeasurement(tool.parentTool, measurement);\n\n // TODO: Notify about the last activated measurement\n\n if (MeasurementApi.isToolIncluded(tool)) {\n // TODO: Notify that viewer suffered changes\n }\n}\n","import cornerstone from 'cornerstone-core';\nimport {MeasurementApi} from '../classes';\nimport log from '../../log';\n\nexport default function handleSingleMeasurementRemoved({\n eventData,\n tool,\n toolGroupId,\n toolGroup\n}) {\n log.info('CornerstoneToolsMeasurementRemoved');\n // Mod by TungLT: add persist flag to add removed annotation to template deteled data, which needs to send request to server\n const {measurementData, toolType, persist} = eventData;\n\n const measurementApi = MeasurementApi.Instance;\n if (!measurementApi) {\n log.warn('Measurement API is not initialized');\n }\n\n const collection = measurementApi.tools[toolType];\n\n // Stop here if the tool data shall not be persisted (e.g. temp tools)\n if (!collection) return;\n\n const measurementTypeId = measurementApi.toolsGroupsMap[toolType];\n const measurement = collection.find((t) => t._id === measurementData._id);\n\n // Stop here if the measurement is already gone or never existed\n if (!measurement) return;\n\n // Remove all the measurements with the given type and number\n // Modified by TungLT\n // const { lesionNamingNumber, timepointId } = measurement;\n measurementApi.deleteMeasurements(toolType, measurementTypeId, measurement, persist);\n\n // TODO: This is very hacky, but will work for now\n cornerstone.getEnabledElements().forEach((enabledElement) => {\n cornerstone.updateImage(enabledElement.element);\n });\n\n if (MeasurementApi.isToolIncluded(tool)) {\n // TODO: Notify that viewer suffered changes\n }\n}\n","import cornerstone from 'cornerstone-core';\nimport {MeasurementApi} from '../classes';\nimport log from '../../log';\n\nexport default function ({eventData, tool, toolGroupId, toolGroup}) {\n log.info('CornerstoneToolsMeasurementRemoved');\n // Mod by TungLT: add persist flag to add removed annotation to template deteled data, which needs to send request to server\n const {measurementData, persist} = eventData;\n\n const measurementApi = MeasurementApi.Instance;\n if (!measurementApi) {\n log.warn('Measurement API is not initialized');\n }\n\n const collection = measurementApi.tools[tool.parentTool];\n\n // Stop here if the tool data shall not be persisted (e.g. temp tools)\n if (!collection) return;\n\n const measurementIndex = collection.findIndex(\n (t) => t._id === measurementData._id\n );\n const measurement =\n measurementIndex > -1 ? collection[measurementIndex] : null;\n\n // Stop here if the measurement is already gone or never existed\n if (!measurement) return;\n\n if (measurement.childToolsCount === 1) {\n // Remove the measurement\n collection.splice(measurementIndex, 1);\n measurementApi.onMeasurementRemoved(tool.parentTool, measurement, persist);\n } else {\n // Update the measurement\n measurement[tool.attribute] = null;\n measurement.childToolsCount = (measurement.childToolsCount || 0) - 1;\n measurementApi.updateMeasurement(tool.parentTool, measurement);\n }\n\n // TODO: This is very hacky, but will work for now\n cornerstone.getEnabledElements().forEach((enabledElement) => {\n cornerstone.updateImage(enabledElement.element);\n });\n\n if (MeasurementApi.isToolIncluded(tool)) {\n // TODO: Notify that viewer suffered changes\n }\n}\n","import {MeasurementApi, TimepointApi} from '../classes';\nimport handleSingleMeasurementAdded from './handleSingleMeasurementAdded';\nimport handleChildMeasurementAdded from './handleChildMeasurementAdded';\nimport handleSingleMeasurementModified from './handleSingleMeasurementModified';\nimport handleChildMeasurementModified from './handleChildMeasurementModified';\nimport handleSingleMeasurementRemoved from './handleSingleMeasurementRemoved';\nimport handleChildMeasurementRemoved from './handleChildMeasurementRemoved';\n\nconst getEventData = (event) => {\n const eventData = event.detail;\n if (eventData.toolName) {\n eventData.toolType = eventData.toolName;\n }\n\n return eventData;\n};\n\nconst MeasurementHandlers = {\n handleSingleMeasurementAdded,\n handleChildMeasurementAdded,\n handleSingleMeasurementModified,\n handleChildMeasurementModified,\n handleSingleMeasurementRemoved,\n handleChildMeasurementRemoved,\n\n onAdded(event) {\n const eventData = getEventData(event);\n const {toolType} = eventData;\n const {\n toolGroupId,\n toolGroup,\n tool\n } = MeasurementApi.getToolConfiguration(toolType);\n\n // TungLT add current selected timepoint id\n const currentTimepoint = TimepointApi.getInstance().current();\n if (currentTimepoint)\n eventData.measurementData.timepointId = currentTimepoint.timepointId;\n\n const params = {\n eventData,\n tool,\n toolGroupId,\n toolGroup\n };\n\n if (!tool) return;\n\n if (tool.parentTool) {\n handleChildMeasurementAdded(params);\n } else {\n handleSingleMeasurementAdded(params);\n }\n },\n\n onModified(event) {\n const eventData = getEventData(event);\n const {toolType} = eventData;\n const {\n toolGroupId,\n toolGroup,\n tool\n } = MeasurementApi.getToolConfiguration(toolType);\n const params = {\n eventData,\n tool,\n toolGroupId,\n toolGroup\n };\n\n if (!tool) return;\n\n if (tool.parentTool) {\n handleChildMeasurementModified(params);\n } else {\n handleSingleMeasurementModified(params);\n }\n },\n\n onRemoved(event) {\n const eventData = getEventData(event);\n const {toolType} = eventData;\n const {\n toolGroupId,\n toolGroup,\n tool\n } = MeasurementApi.getToolConfiguration(toolType);\n const params = {\n eventData,\n tool,\n toolGroupId,\n toolGroup\n };\n\n if (!tool) return;\n\n if (tool.parentTool) {\n handleChildMeasurementRemoved(params);\n } else {\n handleSingleMeasurementRemoved(params);\n }\n }\n};\n\nexport default MeasurementHandlers;\n","import {bidirectional, targetCR, targetUN, targetNE} from '../tools';\n\nexport const targets = {\n id: 'targets',\n name: 'Targets',\n childTools: [bidirectional, targetCR, targetUN, targetNE],\n options: {\n caseProgress: {\n include: true,\n evaluate: true\n }\n }\n};\n","import {nonTarget} from '../tools';\n\nexport const nonTargets = {\n id: 'nonTargets',\n name: 'Non-Targets',\n childTools: [nonTarget],\n options: {\n caseProgress: {\n include: true,\n evaluate: true\n }\n }\n};\n","import { cloneDeep } from 'lodash';\nimport {length, ellipticalRoi} from '../tools';\n\nconst childTools = cloneDeep([length, ellipticalRoi]);\n\n// Exclude temp tools from case progress\nchildTools.forEach((childTool) => {\n childTool.options = {...childTool.options,\n caseProgress: {\n include: false,\n evaluate: false\n }};\n});\n\nexport const temp = {\n id: 'temp',\n name: 'Temporary',\n childTools,\n options: {\n caseProgress: {\n include: false,\n evaluate: false\n }\n }\n};\n","import { cloneDeep } from 'lodash';\nimport {targets} from './toolGroups/targets';\nimport {nonTargets} from './toolGroups/nonTargets';\nimport {temp} from './toolGroups/temp';\n\nconst ltTools = cloneDeep([targets, nonTargets, temp]);\n\nltTools.forEach((toolGroup) => {\n toolGroup.childTools.forEach((tool) => {\n tool.toolGroup = toolGroup.id;\n });\n});\n\nexport default ltTools;\n","import * as tools from './tools';\n\nimport {MeasurementApi, TimepointApi} from './classes';\nimport {ConformanceCriteria} from './conformance';\nimport MeasurementHandlers from './measurementHandlers';\nimport getDescription from './lib/getDescription';\nimport getImageAttributes from './lib/getImageAttributes';\nimport getImageIdForImagePath from './lib/getImageIdForImagePath';\nimport getLabel from './lib/getLabel';\nimport ltTools from './ltTools';\n\nconst measurements = {\n TimepointApi,\n MeasurementApi,\n ConformanceCriteria,\n MeasurementHandlers,\n ltTools,\n tools,\n getLabel,\n getDescription,\n getImageAttributes,\n getImageIdForImagePath\n};\n\nexport default measurements;\n","import dcmjs from 'dcmjs';\n\n/**\n * Checks if dcmjs has support to determined tool\n *\n * @param {string} toolName\n * @returns {boolean}\n */\nconst isToolSupported = (toolName) => {\n const adapter = dcmjs.adapters.Cornerstone;\n return !!adapter[toolName];\n};\n\nexport default isToolSupported;\n","import * as dcmjs from 'dcmjs';\nimport cornerstone from 'cornerstone-core';\n\nimport log from '../log';\nimport measurements from '../measurements';\nimport isToolSupported from './utils/isToolSupported';\n\n/**\n * Function to parse OHIF viewer measurementData into a dcmjs MeasurementReport\n *\n * @param {Object} measurementsData - OHIF measurementData object\n * @returns {Object} Dataset: measurement report from dcmjs\n */\nconst parseMeasurementsData = (measurementsData) => {\n const {MeasurementReport} = dcmjs.adapters.Cornerstone;\n const {getImageIdForImagePath} = measurements;\n\n const toolState = {};\n const unsupportedTools = [];\n\n Object.keys(measurementsData).forEach((measurementType) => {\n const annotations = measurementsData[measurementType];\n\n annotations.forEach((annotation) => {\n const {toolType, imagePath} = annotation;\n\n if (isToolSupported(toolType)) {\n const imageId = getImageIdForImagePath(imagePath);\n toolState[imageId] = toolState[imageId] || {};\n toolState[imageId][toolType] = toolState[imageId][toolType] || {\n data: []\n };\n\n toolState[imageId][toolType].data.push(annotation);\n } else {\n unsupportedTools.push(toolType);\n }\n });\n });\n\n if (unsupportedTools.length > 0) {\n log.warn(\n `[DICOMSR] Tooltypes not supported: ${unsupportedTools.join(', ')}`\n );\n }\n\n const report = MeasurementReport.generateReport(\n toolState,\n cornerstone.metaData\n );\n\n return {\n dataset: report.dataset\n };\n};\n\nexport default parseMeasurementsData;\n","/**\n * Retrieve a list of all displaySets of all studies\n *\n * @param {Object} studies - List of studies loaded into the viewer\n * @returns {Object} List of DisplaySets\n */\nconst getAllDisplaySets = (studies) => {\n let allDisplaySets = [];\n\n studies.forEach((study) => {\n if (study.getDisplaySets) {\n allDisplaySets = allDisplaySets.concat(study.getDisplaySets());\n }\n });\n\n return allDisplaySets;\n};\n\nexport default getAllDisplaySets;\n","import * as dcmjs from 'dcmjs';\nimport {api} from 'dicomweb-client';\n\nimport DICOMWeb from '../DICOMWeb';\nimport parseDicomStructuredReport from './parseDicomStructuredReport';\nimport parseMeasurementsData from './parseMeasurementsData';\nimport getAllDisplaySets from './utils/getAllDisplaySets';\n\nconst VERSION_NAME = 'dcmjs-0.0';\nconst TRANSFER_SYNTAX_UID = '1.2.840.10008.1.2.1';\n\n/**\n * Function to retrieve measurements from DICOM Structured Reports coming from determined server\n *\n * @param {Array} series - List of all series metaData loaded\n * @param {Array} studies - List of all studies metaData loaded\n * @param {string} serverUrl - Server URL to be used on request\n * @returns {Object} MeasurementData\n */\nconst retrieveMeasurementFromSR = async (series, studies, serverUrl) => {\n const config = {\n url: serverUrl,\n headers: DICOMWeb.getAuthorizationHeader()\n };\n\n const dicomWeb = new api.DICOMwebClient(config);\n\n const instance = series.getFirstInstance();\n const options = {\n studyInstanceUID: instance.getStudyInstanceUID(),\n seriesInstanceUID: instance.getSeriesInstanceUID(),\n sopInstanceUID: instance.getSOPInstanceUID()\n };\n\n const part10SRArrayBuffer = await dicomWeb.retrieveInstance(options);\n const displaySets = getAllDisplaySets(studies);\n const measurementsData = parseDicomStructuredReport(\n part10SRArrayBuffer,\n displaySets\n );\n\n return measurementsData;\n};\n\n/**\n * Function to store measurements to DICOM Structured Reports in determined server\n *\n * @param {Object} measurements - OHIF measurementData object\n * @param {string} serverUrl - Server URL to be used on request\n * @returns {Promise}\n */\nconst stowSRFromMeasurements = async (measurements, serverUrl) => {\n const {dataset} = parseMeasurementsData(measurements);\n const {DicomMetaDictionary, DicomDict} = dcmjs.data;\n const meta = {\n FileMetaInformationVersion: dataset._meta.FileMetaInformationVersion.Value,\n MediaStorageSOPClassUID: dataset.SOPClassUID,\n MediaStorageSOPInstanceUID: dataset.SOPInstanceUID,\n TransferSyntaxUID: TRANSFER_SYNTAX_UID,\n ImplementationClassUID: DicomMetaDictionary.uid(),\n ImplementationVersionName: VERSION_NAME\n };\n\n const denaturalized = DicomMetaDictionary.denaturalizeDataset(meta);\n const dicomDict = new DicomDict(denaturalized);\n\n dicomDict.dict = DicomMetaDictionary.denaturalizeDataset(dataset);\n\n const part10Buffer = dicomDict.write();\n\n const config = {\n url: serverUrl,\n headers: DICOMWeb.getAuthorizationHeader()\n };\n\n const dicomWeb = new api.DICOMwebClient(config);\n const options = {\n datasets: [part10Buffer]\n };\n\n await dicomWeb.storeInstances(options);\n};\n\nexport {retrieveMeasurementFromSR, stowSRFromMeasurements};\n","/**\n * Should find the most recent Structured Report metadata\n *\n * @param {Array} studies\n * @returns {Object} Series\n */\nconst findMostRecentStructuredReport = (studies) => {\n let mostRecentStructuredReport;\n\n studies.forEach((study) => {\n const allSeries = study.getSeries ? study.getSeries() : [];\n allSeries.forEach((series) => {\n // Skip series that may not have instances yet\n // This can happen if we have retrieved just the initial\n // details about the series via QIDO-RS, but not the full metadata\n if (!series.instances || !series.instances.length) {\n return;\n }\n\n if (isStructuredReportSeries(series)) {\n if (!mostRecentStructuredReport || compareSeriesDate(series, mostRecentStructuredReport)) {\n mostRecentStructuredReport = series;\n }\n }\n });\n });\n\n return mostRecentStructuredReport;\n};\n\n/**\n * Checks if series sopClassUID matches with the supported Structured Reports sopClassUID\n *\n * @param {Object} series - Series metadata\n * @returns {boolean}\n */\nconst isStructuredReportSeries = (series) => {\n const supportedSopClassUIDs = ['1.2.840.10008.5.1.4.1.1.88.22', '1.2.840.10008.5.1.4.1.1.11.1'];\n\n const firstInstance = series.getFirstInstance();\n const SOPClassUID = firstInstance.getData().metadata.SOPClassUID;\n\n return supportedSopClassUIDs.includes(SOPClassUID);\n};\n\n/**\n * Checkes if series1 is newer than series2\n *\n * @param {Object} series1 - Series Metadata 1\n * @param {Object} series2 - Series Metadata 2\n * @returns {boolean} true/false if series1 is newer than series2\n */\nconst compareSeriesDate = (series1, series2) => {\n return (\n series1._data.SeriesDate > series2._data.SeriesDate ||\n (series1._data.SeriesDate === series2._data.SeriesDate && series1._data.SeriesTime > series2._data.SeriesTime)\n );\n};\n\nexport default findMostRecentStructuredReport;\n","import {retrieveMeasurements, storeMeasurements} from './dataExchange';\nimport isToolSupported from './utils/isToolSupported';\n\nconst DICOMSR = {\n retrieveMeasurements,\n storeMeasurements,\n isToolSupported\n};\n\nexport default DICOMSR;\n","import log from '../log';\nimport studies from '../studies';\nimport utils from '../utils';\nimport {\n retrieveMeasurementFromSR,\n stowSRFromMeasurements\n} from './handleStructuredReport';\nimport findMostRecentStructuredReport from './utils/findMostRecentStructuredReport';\n\n/**\n *\n * @typedef ServerType\n * @property {string} type - type of the server\n * @property {string} wadoRoot - server wado root url\n * @property {string} annotationEndpoint - endpoint url for annotation service\n *\n */\n\n/**\n * Function to be registered into MeasurementAPI to retrieve measurements from DICOM Structured Reports\n *\n * @param {ServerType} server\n * @returns {Promise} Should resolve with OHIF measurementData object\n */\nconst retrieveMeasurements = (server) => {\n log.info('[DICOMSR] retrieveMeasurements');\n\n if (!server || server.type !== 'dicomWeb') {\n log.error('[DICOMSR] DicomWeb server is required!');\n return Promise.reject({});\n }\n\n const serverUrl = server.wadoRoot;\n const studies = utils.studyMetadataManager.all();\n\n const latestSeries = findMostRecentStructuredReport(studies);\n\n if (!latestSeries) return Promise.resolve({});\n\n return retrieveMeasurementFromSR(latestSeries, studies, serverUrl);\n};\n\n/**\n * Function to be registered into MeasurementAPI to store measurements into DICOM Structured Reports\n *\n * @param {Object} measurementData - OHIF measurementData object\n * @param {Object} filter\n * @param {ServerType} server\n * @returns {Object} With message to be displayed on success\n */\nconst storeMeasurements = async (measurementData, filter, server) => {\n log.info('[DICOMSR] storeMeasurements');\n\n if (!server || server.type !== 'dicomWeb') {\n log.error('[DICOMSR] DicomWeb server is required!');\n return Promise.reject({});\n }\n\n const serverUrl = server.wadoRoot;\n const firstMeasurementKey = Object.keys(measurementData)[0];\n const firstMeasurement = measurementData[firstMeasurementKey][0];\n const StudyInstanceUID =\n firstMeasurement && firstMeasurement.StudyInstanceUID;\n\n try {\n await stowSRFromMeasurements(measurementData, serverUrl);\n if (StudyInstanceUID) {\n studies.deleteStudyMetadataPromise(StudyInstanceUID);\n }\n\n return {\n message: 'Measurements saved successfully'\n };\n } catch (error) {\n log.error(\n `[DICOMSR] Error while saving the measurements: ${error.message}`\n );\n throw new Error('Error while saving the measurements.');\n }\n};\n\nexport {retrieveMeasurements, storeMeasurements};\n","import metadataProvider from './classes/MetadataProvider';\n\nconst cornerstone = {\n metadataProvider\n};\n\nexport default cornerstone;\n","import { InstanceMetadata } from './InstanceMetadata';\r\nimport getImageId from '../../utils/getImageId';\r\n\r\nexport class OHIFInstanceMetadata extends InstanceMetadata {\r\n /**\r\n * @param {Object} Instance object.\r\n */\r\n constructor(data, series, study, uid) {\r\n super(data, uid);\r\n this.init(series, study);\r\n }\r\n\r\n init(series, study) {\r\n const instance = this.getData();\r\n\r\n // Initialize Private Properties\r\n Object.defineProperties(this, {\r\n _sopInstanceUID: {\r\n configurable: false,\r\n enumerable: false,\r\n writable: false,\r\n value: instance.SOPInstanceUID\r\n },\r\n _study: {\r\n configurable: false,\r\n enumerable: false,\r\n writable: false,\r\n value: study\r\n },\r\n _series: {\r\n configurable: false,\r\n enumerable: false,\r\n writable: false,\r\n value: series\r\n },\r\n _instance: {\r\n configurable: false,\r\n enumerable: false,\r\n writable: false,\r\n value: instance\r\n },\r\n _cache: {\r\n configurable: false,\r\n enumerable: false,\r\n writable: false,\r\n value: Object.create(null)\r\n }\r\n });\r\n }\r\n\r\n // Override\r\n getTagValue(tagOrProperty, defaultValue, bypassCache) {\r\n // check if this property has been cached...\r\n if (tagOrProperty in this._cache && bypassCache !== true) {\r\n return this._cache[tagOrProperty];\r\n }\r\n\r\n const instanceData = this._instance.metadata;\r\n\r\n // Search property value in the whole study metadata chain...\r\n let rawValue;\r\n if (tagOrProperty in instanceData) {\r\n rawValue = instanceData[tagOrProperty];\r\n } else if (tagOrProperty in this._series) {\r\n rawValue = this._series[tagOrProperty];\r\n } else if (tagOrProperty in this._study) {\r\n rawValue = this._study[tagOrProperty];\r\n }\r\n\r\n if (rawValue !== void 0) {\r\n // if rawValue value is not undefined, cache result...\r\n this._cache[tagOrProperty] = rawValue;\r\n return rawValue;\r\n }\r\n\r\n return defaultValue;\r\n }\r\n\r\n // Override\r\n tagExists(tagOrProperty) {\r\n return tagOrProperty in this._instance.metadata || tagOrProperty in this._series || tagOrProperty in this._study;\r\n }\r\n\r\n // Override\r\n getImageId(frame, thumbnail) {\r\n // If _imageID is not cached, create it\r\n if (this._imageId === null) {\r\n this._imageId = getImageId(this.getData(), frame, thumbnail);\r\n }\r\n\r\n return this._imageId;\r\n }\r\n}\r\n","import { SeriesMetadata } from './SeriesMetadata';\r\nimport { OHIFInstanceMetadata } from './OHIFInstanceMetadata';\r\n\r\nexport class OHIFSeriesMetadata extends SeriesMetadata {\r\n /**\r\n * @param {Object} Series object.\r\n */\r\n constructor(data, study, uid) {\r\n super(data, uid);\r\n this.init(study);\r\n }\r\n\r\n init(study) {\r\n const series = this.getData();\r\n // console.log('OHIFSeriesMetadata', series);\r\n // define \"_seriesInstanceUID\" protected property...\r\n Object.defineProperty(this, '_seriesInstanceUID', {\r\n configurable: false,\r\n enumerable: false,\r\n writable: false,\r\n value: series.SeriesInstanceUID\r\n });\r\n\r\n // populate internal list of instances...\r\n series.instances.forEach((instance) => {\r\n this.addInstance(new OHIFInstanceMetadata(instance, series, study));\r\n });\r\n // Mod by Triet\r\n this.combinedId = series.SeriesInstanceUID + (series.SubSeriesIndex || '');\r\n }\r\n\r\n // Mod by Triet\r\n isSubSeries() {\r\n return this._data.isSubSeries;\r\n }\r\n\r\n getSeriesDescription() {\r\n return this._data.SeriesDescription;\r\n }\r\n\r\n getSeriesNumber() {\r\n return this._data.SeriesNumber;\r\n }\r\n\r\n getCustomSeriesInstanceUID() {\r\n return this.combinedId;\r\n }\r\n}\r\n","import { StudyMetadata } from './StudyMetadata';\r\nimport { OHIFSeriesMetadata } from './OHIFSeriesMetadata';\r\nimport { splitSeries } from '../../utils';\r\n\r\nexport class OHIFStudyMetadata extends StudyMetadata {\r\n /**\r\n * @param {Object} Study object.\r\n */\r\n constructor(data, uid) {\r\n super(data, uid);\r\n this.init();\r\n }\r\n\r\n init() {\r\n const study = this.getData();\r\n\r\n // define \"_studyInstanceUID\" protected property\r\n Object.defineProperty(this, '_studyInstanceUID', {\r\n configurable: false,\r\n enumerable: false,\r\n writable: false,\r\n value: study.StudyInstanceUID\r\n });\r\n\r\n // populate internal list of series\r\n study.series.forEach((series) => {\r\n const split = splitSeries(series);\r\n // Mod by Triet\r\n split.forEach((series) => {\r\n this.addSeries(new OHIFSeriesMetadata(series, study));\r\n });\r\n });\r\n }\r\n}\r\n","import {InstanceMetadata} from './InstanceMetadata';\r\nimport {Metadata} from './Metadata';\r\nimport {OHIFInstanceMetadata} from './OHIFInstanceMetadata';\r\nimport {OHIFSeriesMetadata} from './OHIFSeriesMetadata';\r\nimport {OHIFStudyMetadata} from './OHIFStudyMetadata';\r\nimport {SeriesMetadata} from './SeriesMetadata';\r\nimport {StudyMetadata} from './StudyMetadata';\r\n\r\nconst metadata = {\r\n Metadata,\r\n StudyMetadata,\r\n SeriesMetadata,\r\n InstanceMetadata,\r\n OHIFStudyMetadata,\r\n OHIFSeriesMetadata,\r\n OHIFInstanceMetadata\r\n};\r\n\r\nexport {\r\n Metadata,\r\n StudyMetadata,\r\n SeriesMetadata,\r\n InstanceMetadata,\r\n OHIFStudyMetadata,\r\n OHIFSeriesMetadata,\r\n OHIFInstanceMetadata\r\n};\r\n\r\nexport default metadata;\r\n","import validate from 'validate.js';\n\nvalidate.validators.equals = function (value, options, key, attributes) {\n if (options && value !== options.value) {\n return `${key}must equal ${options.value}`;\n }\n};\n\nvalidate.validators.doesNotEqual = function (value, options, key) {\n if (options && value === options.value) {\n return `${key}cannot equal ${options.value}`;\n }\n};\n\nvalidate.validators.contains = function (value, options, key) {\n if (options && value.indexOf && value.indexOf(options.value) === -1) {\n return `${key}must contain ${options.value}`;\n }\n};\n\nvalidate.validators.doesNotContain = function (value, options, key) {\n if (options && value.indexOf && value.indexOf(options.value) !== -1) {\n return `${key}cannot contain ${options.value}`;\n }\n};\n\nvalidate.validators.startsWith = function (value, options, key) {\n if (options && value.startsWith && !value.startsWith(options.value)) {\n return `${key}must start with ${options.value}`;\n }\n};\n\nvalidate.validators.endsWith = function (value, options, key) {\n if (options && value.endsWith && !value.endsWith(options.value)) {\n return `${key}must end with ${options.value}`;\n }\n};\n\nexport {validate};\n","// Define an empty object to store callbacks that are used to retrieve custom attributes\n// The simplest example for a custom attribute is the Timepoint type (i.e. baseline or follow-up)\n// used in the LesionTracker application.\n//\n// Timepoint type can be obtained given a studyId, and this is done through a custom callback.\n// Developers can define attributes (i.e. attributeId = timepointType) with a name ('Timepoint Type')\n// and a callback function that is used to calculate them.\n//\n// The input to the callback, which is called during viewport-image matching rule evaluation\n// is the set of attributes that contains the specified attribute. In our example, timepointType is\n// linked to the study attributes, and so the inputs to the callback is an object containing\n// the study attributes.\nconst CustomAttributeRetrievalCallbacks = {};\n\n/**\n * Adds a custom attribute to be used in the HangingProtocol UI and matching rules, including a\n * callback that will be used to calculate the attribute value.\n *\n * @param attributeId The ID used to refer to the attribute (e.g. 'timepointType')\n * @param attributeName The name of the attribute to be displayed (e.g. 'Timepoint Type')\n * @param callback The function used to calculate the attribute value from the other attributes at its level (e.g. study/series/image)\n */\nfunction addCustomAttribute(attributeId, attributeName, callback) {\n CustomAttributeRetrievalCallbacks[attributeId] = {\n name: attributeName,\n callback\n };\n}\n\nexport {CustomAttributeRetrievalCallbacks, addCustomAttribute};\n","import OHIFError from '../classes/OHIFError';\nimport metadata from '../classes/metadata';\nimport {validate} from './lib/validate';\nimport {CustomAttributeRetrievalCallbacks} from './customAttributes';\n\n/**\n * Import Constants\n */\nconst {InstanceMetadata} = metadata;\n\n/**\n * Match a Metadata instance against rules using Validate.js for validation.\n * @param {InstanceMetadata} metadataInstance Metadata instance object\n * @param {Array} rules Array of MatchingRules instances (StudyMatchingRule|SeriesMatchingRule|ImageMatchingRule) for the match\n * @return {Object} Matching Object with score and details (which rule passed or failed)\n */\nconst match = (metadataInstance, rules) => {\n // Make sure the supplied data is valid.\n if (!(metadataInstance instanceof InstanceMetadata)) {\n throw new OHIFError(\n 'HPMatcher::match metadataInstance must be an instance of InstanceMetadata'\n );\n }\n\n const options = {\n format: 'grouped'\n };\n\n const details = {\n passed: [],\n failed: []\n };\n\n let requiredFailed = false;\n let score = 0;\n\n rules.forEach((rule) => {\n const attribute = rule.attribute;\n\n // Do not use the custom attribute from the metadataInstance since it is subject to change\n if (Object.prototype.hasOwnProperty.call(CustomAttributeRetrievalCallbacks, attribute)) {\n const customAttribute = CustomAttributeRetrievalCallbacks[attribute];\n metadataInstance.setCustomAttribute(\n attribute,\n customAttribute.callback(metadataInstance)\n );\n }\n\n // Format the constraint as required by Validate.js\n const testConstraint = {\n [attribute]: rule.constraint\n };\n\n // Create a single attribute object to be validated, since metadataInstance is an\n // instance of Metadata (StudyMetadata, SeriesMetadata or InstanceMetadata)\n const attributeValue = metadataInstance.customAttributeExists(attribute)\n ? metadataInstance.getCustomAttribute(attribute)\n : metadataInstance.getTagValue(attribute);\n const attributeMap = {\n [attribute]: attributeValue\n };\n\n // Use Validate.js to evaluate the constraints on the specified metadataInstance\n let errorMessages;\n try {\n errorMessages = validate(attributeMap, testConstraint, [options]);\n } catch (e) {\n errorMessages = ['Something went wrong during validation.', e];\n }\n\n if (!errorMessages) {\n // If no errorMessages were returned, then validation passed.\n\n // Add the rule's weight to the total score\n score += parseInt(rule.weight, 10);\n\n // Log that this rule passed in the matching details object\n details.passed.push({\n rule\n });\n } else {\n // If errorMessages were present, then validation failed\n\n // If the rule that failed validation was Required, then\n // mark that a required Rule has failed\n if (rule.required) {\n requiredFailed = true;\n }\n\n // Log that this rule failed in the matching details object\n // and include any error messages\n details.failed.push({\n rule,\n errorMessages\n });\n }\n });\n\n // If a required Rule has failed Validation, set the matching score to zero\n if (requiredFailed) {\n score = 0;\n }\n\n return {\n score,\n details,\n requiredFailed\n };\n};\n\nconst HPMatcher = {\n match\n};\n\nexport {HPMatcher};\n","// Define an empty object to store callbacks that are used to apply custom viewport settings\n// after a viewport is rendered.\nconst CustomViewportSettings = {};\n\n/**\n * Adds a custom setting that can be chosen in the HangingProtocol UI and applied to a Viewport\n *\n * @param settingId The ID used to refer to the setting (e.g. 'displayCADMarkers')\n * @param settingName The name of the setting to be displayed (e.g. 'Display CAD Markers')\n * @param options\n * @param callback A function to be run after a viewport is rendered with a series\n */\nfunction addCustomViewportSetting(settingId, settingName, options, callback) {\n CustomViewportSettings[settingId] = {\n id: settingId,\n text: settingName,\n options,\n callback\n };\n}\n\nexport {CustomViewportSettings, addCustomViewportSetting};\n","const comparators = [\n {\n id: 'equals',\n name: '= (Equals)',\n validator: 'equals',\n validatorOption: 'value',\n description: 'The attribute must equal this value.'\n },\n {\n id: 'doesNotEqual',\n name: '!= (Does not equal)',\n validator: 'doesNotEqual',\n validatorOption: 'value',\n description: 'The attribute must not equal this value.'\n },\n {\n id: 'contains',\n name: 'Contains',\n validator: 'contains',\n validatorOption: 'value',\n description: 'The attribute must contain this value.'\n },\n {\n id: 'doesNotContain',\n name: 'Does not contain',\n validator: 'doesNotContain',\n validatorOption: 'value',\n description: 'The attribute must not contain this value.'\n },\n {\n id: 'startsWith',\n name: 'Starts with',\n validator: 'startsWith',\n validatorOption: 'value',\n description: 'The attribute must start with this value.'\n },\n {\n id: 'endsWith',\n name: 'Ends with',\n validator: 'endsWith',\n validatorOption: 'value',\n description: 'The attribute must end with this value.'\n },\n {\n id: 'onlyInteger',\n name: 'Only Integers',\n validator: 'numericality',\n validatorOption: 'onlyInteger',\n description: 'Real numbers won\\'t be allowed.'\n },\n {\n id: 'greaterThan',\n name: '> (Greater than)',\n validator: 'numericality',\n validatorOption: 'greaterThan',\n description: 'The attribute has to be greater than this value.'\n },\n {\n id: 'greaterThanOrEqualTo',\n name: '>= (Greater than or equal to)',\n validator: 'numericality',\n validatorOption: 'greaterThanOrEqualTo',\n description: 'The attribute has to be at least this value.'\n },\n {\n id: 'lessThanOrEqualTo',\n name: '<= (Less than or equal to)',\n validator: 'numericality',\n validatorOption: 'lessThanOrEqualTo',\n description: 'The attribute can be this value at the most.'\n },\n {\n id: 'lessThan',\n name: '< (Less than)',\n validator: 'numericality',\n validatorOption: 'lessThan',\n description: 'The attribute has to be less than this value.'\n },\n {\n id: 'odd',\n name: 'Odd',\n validator: 'numericality',\n validatorOption: 'odd',\n description: 'The attribute has to be odd.'\n },\n {\n id: 'even',\n name: 'Even',\n validator: 'numericality',\n validatorOption: 'even',\n description: 'The attribute has to be even.'\n }\n];\n\n// Immutable object\nObject.freeze(comparators);\n\nexport {comparators};\n","import {comparators} from '../lib/comparators';\nimport guid from '../../utils/guid';\n\nconst EQUALS_REGEXP = /^equals$/;\n\n/**\n * This Class represents a Rule to be evaluated given a set of attributes\n * Rules have:\n * - An attribute (e.g. 'SeriesDescription')\n * - A constraint Object, in the form required by Validate.js:\n *\n * rule.constraint = {\n * contains: {\n * value: 'T-1'\n * }\n * };\n *\n * Note: In this example we use the 'contains' Validator, which is a custom Validator defined in Viewerbase\n *\n * - A value for whether or not they are Required to be matched (default: False)\n * - A value for their relative weighting during Protocol or Image matching (default: 1)\n */\nexport default class Rule {\n /**\n * The Constructor for the Class to create a Rule with the bare\n * minimum information\n *\n * @param name The desired name for the Rule\n */\n constructor(attribute, constraint, required, weight) {\n // Create a new UUID for this Rule\n this.id = guid();\n\n // Set the Rule's weight (defaults to 1)\n this.weight = weight || 1;\n\n // If an attribute is specified, assign it\n if (attribute) {\n this.attribute = attribute;\n }\n\n // If a constraint is specified, assign it\n if (constraint) {\n this.constraint = constraint;\n }\n\n // If a value for 'required' is specified, assign it\n if (required === undefined) {\n // If no value was specified, default to False\n this.required = false;\n } else {\n this.required = required;\n }\n\n // Cache for constraint info object\n this._constraintInfo = void 0;\n\n // Cache for validator and value object\n this._validatorAndValue = void 0;\n }\n\n /**\n * Occasionally the Rule class needs to be instantiated from a JavaScript Object.\n * This function fills in a Protocol with the Object data.\n *\n * @param input A Rule as a JavaScript Object, e.g. retrieved from JSON\n */\n fromObject(input) {\n // Check if the input already has an ID\n // If so, keep it. It not, create a new UUID\n this.id = input.id || guid();\n\n // Assign the specified input data to the Rule\n this.required = input.required;\n this.weight = input.weight;\n this.attribute = input.attribute;\n this.constraint = input.constraint;\n }\n\n /**\n * Get the constraint info object for the current constraint\n * @return {Object\\undefined} Constraint object or undefined if current constraint\n * is not valid or not found in comparators list\n */\n getConstraintInfo() {\n let constraintInfo = this._constraintInfo;\n // Check if info is cached already\n if (constraintInfo !== void 0) {\n return constraintInfo;\n }\n\n const ruleConstraint = Object.keys(this.constraint)[0];\n\n if (ruleConstraint !== void 0) {\n constraintInfo = comparators.find(\n (comparator) => ruleConstraint === comparator.id\n );\n }\n\n // Cache this information for later use\n this._constraintInfo = constraintInfo;\n\n return constraintInfo;\n }\n\n /**\n * Check if current rule is related to priors\n * @return {Boolean} True if a rule is related to priors or false otherwise\n */\n isRuleForPrior() {\n // @TODO: Should we check this too? this.attribute === 'relativeTime'\n return this.attribute === 'abstractPriorValue';\n }\n\n /**\n * If the current rule is a rule for priors, returns the number of referenced priors. Otherwise, returns -1.\n * @return {Number} The number of referenced priors or -1 if not applicable. Returns zero if the actual value could not be determined.\n */\n getNumberOfPriorsReferenced() {\n if (!this.isRuleForPrior()) {\n return -1;\n }\n\n // Get rule's validator and value\n const ruleValidatorAndValue = this.getConstraintValidatorAndValue();\n const {value, validator} = ruleValidatorAndValue;\n const intValue = parseInt(value, 10) || 0; // avoid possible NaN\n\n // \"Equal to\" validators\n if (EQUALS_REGEXP.test(validator)) {\n // In this case, -1 (the oldest prior) indicates that at least one study is used\n return intValue < 0 ? 1 : intValue;\n }\n\n // Default cases return value\n return 0;\n }\n\n /**\n * Get the constraint validator and value\n * @return {Object|undefined} Returns an object containing the validator and it's value or undefined\n */\n getConstraintValidatorAndValue() {\n let validatorAndValue = this._validatorAndValue;\n\n // Check if validator and value are cached already\n if (validatorAndValue !== void 0) {\n return validatorAndValue;\n }\n\n // Get the constraint info object\n const constraintInfo = this.getConstraintInfo();\n\n // Constraint info object exists and is valid\n if (constraintInfo !== void 0) {\n const validator = constraintInfo.validator;\n const currentValidator = this.constraint[validator];\n\n if (currentValidator) {\n const constraintValidator = constraintInfo.validatorOption;\n const constraintValue = currentValidator[constraintValidator];\n\n validatorAndValue = {\n value: constraintValue,\n validator: constraintInfo.id\n };\n\n this._validatorAndValue = validatorAndValue;\n }\n }\n\n return validatorAndValue;\n }\n}\n","import Rule from './Rule';\n\n/**\n * The ProtocolMatchingRule Class extends the Rule Class.\n *\n * At present it does not add any new methods or attributes\n * @type {ProtocolMatchingRule}\n */\nclass ProtocolMatchingRule extends Rule {}\n\n/**\n * The StudyMatchingRule Class extends the Rule Class.\n *\n * At present it does not add any new methods or attributes\n * @type {StudyMatchingRule}\n */\nclass StudyMatchingRule extends Rule {}\n\n/**\n * The SeriesMatchingRule Class extends the Rule Class.\n *\n * At present it does not add any new methods or attributes\n * @type {SeriesMatchingRule}\n */\nclass SeriesMatchingRule extends Rule {}\n\n/**\n * The ImageMatchingRule class extends the Rule Class.\n *\n * At present it does not add any new methods or attributes\n * @type {ImageMatchingRule}\n */\nclass ImageMatchingRule extends Rule {}\n\nexport {\n ProtocolMatchingRule,\n StudyMatchingRule,\n SeriesMatchingRule,\n ImageMatchingRule\n};\n","/**\n * Removes the first instance of an element from an array, if an equal value exists\n *\n * @param array\n * @param input\n *\n * @returns {boolean} Whether or not the element was found and removed\n */\nconst removeFromArray = (array, input) => {\n // If the array is empty, stop here\n if (!array || !array.length) {\n return false;\n }\n\n let indexToRemove;\n array.forEach((value, index) => {\n // TODO: Double check whether or not this deep equality check is necessary\n // if (_.isEqual(value, input)) {\n if (value === input) {\n indexToRemove = index;\n return false;\n }\n });\n\n if (!indexToRemove) {\n return false;\n }\n\n array.splice(indexToRemove, 1);\n return true;\n};\n\nexport {removeFromArray};\n","/**\n * The ViewportStructure class represents the layout and layout properties that\n * Viewports are displayed in. ViewportStructure has a type, which corresponds to\n * a layout template, and a set of properties, which depend on the type.\n *\n * @type {ViewportStructure}\n */\nexport default class ViewportStructure {\n constructor(type, properties) {\n this.type = type;\n this.properties = properties;\n }\n\n /**\n * Occasionally the ViewportStructure class needs to be instantiated from a JavaScript Object.\n * This function fills in a ViewportStructure with the Object data.\n *\n * @param input The ViewportStructure as a JavaScript Object, e.g. retrieved from JSON\n */\n fromObject(input) {\n this.type = input.type;\n this.properties = input.properties;\n }\n\n /**\n * Retrieve the layout template name based on the layout type\n *\n * @returns {string}\n */\n getLayoutTemplateName() {\n // Viewport structure can be updated later when we build more complex display layouts\n switch (this.type) {\n case 'grid':\n return 'gridLayout';\n }\n }\n\n /**\n * Retrieve the number of Viewports required for this layout\n * given the layout type and properties\n *\n * @returns {string}\n */\n getNumViewports() {\n // Viewport structure can be updated later when we build more complex display layouts\n switch (this.type) {\n case 'grid':\n // For the typical grid layout, we only need to multiply Rows by Columns to\n // obtain the number of viewports\n return this.properties.Rows * this.properties.Columns;\n }\n }\n}\n","import {\n StudyMatchingRule,\n SeriesMatchingRule,\n ImageMatchingRule\n} from './rules';\nimport {removeFromArray} from '../lib/removeFromArray';\n\n/**\n * This Class defines a Viewport in the Hanging Protocol Stage. A Viewport contains\n * arrays of Rules that are matched in the ProtocolEngine in order to determine which\n * images should be hung.\n *\n * @type {Viewport}\n */\nexport default class Viewport {\n constructor() {\n this.viewportSettings = {};\n this.imageMatchingRules = [];\n this.seriesMatchingRules = [];\n this.studyMatchingRules = [];\n }\n\n /**\n * Occasionally the Viewport class needs to be instantiated from a JavaScript Object.\n * This function fills in a Viewport with the Object data.\n *\n * @param input The Viewport as a JavaScript Object, e.g. retrieved from JSON\n */\n fromObject(input) {\n // If ImageMatchingRules exist, create them from the Object data\n // and add them to the Viewport's imageMatchingRules array\n if (input.imageMatchingRules) {\n input.imageMatchingRules.forEach((ruleObject) => {\n const rule = new ImageMatchingRule();\n rule.fromObject(ruleObject);\n this.imageMatchingRules.push(rule);\n });\n }\n\n // If SeriesMatchingRules exist, create them from the Object data\n // and add them to the Viewport's seriesMatchingRules array\n if (input.seriesMatchingRules) {\n input.seriesMatchingRules.forEach((ruleObject) => {\n const rule = new SeriesMatchingRule();\n rule.fromObject(ruleObject);\n this.seriesMatchingRules.push(rule);\n });\n }\n\n // If StudyMatchingRules exist, create them from the Object data\n // and add them to the Viewport's studyMatchingRules array\n if (input.studyMatchingRules) {\n input.studyMatchingRules.forEach((ruleObject) => {\n const rule = new StudyMatchingRule();\n rule.fromObject(ruleObject);\n this.studyMatchingRules.push(rule);\n });\n }\n\n // If ViewportSettings exist, add them to the current protocol\n if (input.viewportSettings) {\n this.viewportSettings = input.viewportSettings;\n }\n }\n\n /**\n * Finds and removes a rule from whichever array it exists in.\n * It is not required to specify if it exists in studyMatchingRules,\n * seriesMatchingRules, or imageMatchingRules\n *\n * @param rule\n */\n removeRule(rule) {\n let array;\n if (rule instanceof StudyMatchingRule) {\n array = this.studyMatchingRules;\n } else if (rule instanceof SeriesMatchingRule) {\n array = this.seriesMatchingRules;\n } else if (rule instanceof ImageMatchingRule) {\n array = this.imageMatchingRules;\n }\n\n removeFromArray(array, rule);\n }\n}\n","import ViewportStructure from './ViewportStructure';\nimport Viewport from './Viewport';\nimport guid from '../../utils/guid';\n\n/**\n * A Stage is one step in the Display Set Sequence for a Hanging Protocol\n *\n * Stages are defined as a ViewportStructure and an array of Viewports\n *\n * @type {Stage}\n */\nexport default class Stage {\n constructor(ViewportStructure, name) {\n // Create a new UUID for this Stage\n this.id = guid();\n\n // Assign the name and ViewportStructure provided\n this.name = name;\n this.viewportStructure = ViewportStructure;\n\n // Create an empty array for the Viewports\n this.viewports = [];\n\n // Set the created date to Now\n this.createdDate = new Date();\n }\n\n /**\n * Creates a clone of the current Stage with a new name\n *\n * @param name\n * @returns {Stage|*}\n */\n createClone(name) {\n // Create a new JavaScript independent of the current Protocol\n const currentStage = {...this};\n\n // Create a new Stage to return\n const clonedStage = new Stage();\n\n // Assign the desired properties\n currentStage.id = clonedStage.id;\n clonedStage.fromObject(currentStage);\n\n // If we have specified a name, assign it\n if (name) {\n clonedStage.name = name;\n }\n\n // Return the cloned Stage\n return clonedStage;\n }\n\n /**\n * Occasionally the Stage class needs to be instantiated from a JavaScript Object.\n * This function fills in a Protocol with the Object data.\n *\n * @param input A Stage as a JavaScript Object, e.g. retrieved from JSON\n */\n fromObject(input) {\n // Check if the input already has an ID\n // If so, keep it. It not, create a new UUID\n this.id = input.id || guid();\n\n // Assign the input name to the Stage\n this.name = input.name;\n\n // If a ViewportStructure is present in the input, add it from the\n // input data\n this.viewportStructure = new ViewportStructure();\n this.viewportStructure.fromObject(input.viewportStructure);\n\n // If any viewports are present in the input object\n if (input.viewports) {\n input.viewports.forEach((viewportObject) => {\n // Create a new Viewport with their data\n const viewport = new Viewport();\n viewport.fromObject(viewportObject);\n\n // Add it to the viewports array\n this.viewports.push(viewport);\n });\n }\n }\n}\n","import {ProtocolMatchingRule} from './rules';\nimport {removeFromArray} from '../lib/removeFromArray';\nimport Stage from './Stage';\nimport guid from '../../utils/guid';\nimport user from '../../user';\n\n/**\n * This class represents a Hanging Protocol at the highest level\n *\n * @type {Protocol}\n */\nexport default class Protocol {\n /**\n * The Constructor for the Class to create a Protocol with the bare\n * minimum information\n *\n * @param name The desired name for the Protocol\n */\n constructor(name) {\n // Create a new UUID for this Protocol\n this.id = guid();\n\n // Store a value which determines whether or not a Protocol is locked\n // This is probably temporary, since we will eventually have role / user\n // checks for editing. For now we just need it to prevent changes to the\n // default protocols.\n this.locked = false;\n\n // Boolean value to indicate if the protocol has updated priors information\n // it's set in \"updateNumberOfPriorsReferenced\" function\n this.hasUpdatedPriorsInformation = false;\n\n // Apply the desired name\n this.name = name;\n\n // Set the created and modified dates to Now\n this.createdDate = new Date();\n this.modifiedDate = new Date();\n\n // If we are logged in while creating this Protocol,\n // store this information as well\n if (user.userLoggedIn && user.userLoggedIn()) {\n this.createdBy = user.getUserId();\n this.modifiedBy = user.getUserId();\n }\n\n // Create two empty Sets specifying which roles\n // have read and write access to this Protocol\n this.availableTo = new Set();\n this.editableBy = new Set();\n\n // Define empty arrays for the Protocol matching rules\n // and Stages\n this.protocolMatchingRules = [];\n this.stages = [];\n\n // Define auxiliary values for priors\n this.numberOfPriorsReferenced = -1;\n }\n\n getNumberOfPriorsReferenced(skipCache = false) {\n let numberOfPriorsReferenced =\n skipCache !== true ? this.numberOfPriorsReferenced : -1;\n\n // Check if information is cached already\n if (numberOfPriorsReferenced > -1) {\n return numberOfPriorsReferenced;\n }\n\n numberOfPriorsReferenced = 0;\n\n // Search each study matching rule for prior rules\n // Each stage can have many viewports that can have\n // multiple study matching rules.\n this.stages.forEach((stage) => {\n if (!stage.viewports) {\n return;\n }\n\n stage.viewports.forEach((viewport) => {\n if (!viewport.studyMatchingRules) {\n return;\n }\n\n viewport.studyMatchingRules.forEach((rule) => {\n // If the current rule is not a priors rule, it will return -1 then numberOfPriorsReferenced will continue to be 0\n const priorsReferenced = rule.getNumberOfPriorsReferenced();\n if (priorsReferenced > numberOfPriorsReferenced) {\n numberOfPriorsReferenced = priorsReferenced;\n }\n });\n });\n });\n\n this.numberOfPriorsReferenced = numberOfPriorsReferenced;\n\n return numberOfPriorsReferenced;\n }\n\n updateNumberOfPriorsReferenced() {\n this.getNumberOfPriorsReferenced(true);\n }\n\n /**\n * Method to update the modifiedDate when the Protocol\n * has been changed\n */\n protocolWasModified() {\n // If we are logged in while modifying this Protocol,\n // store this information as well\n if (user.userLoggedIn && user.userLoggedIn()) {\n this.modifiedBy = user.getUserId();\n }\n\n // Protocol has been modified, so mark priors information\n // as \"outdated\"\n this.hasUpdatedPriorsInformation = false;\n\n // Update number of priors referenced info\n this.updateNumberOfPriorsReferenced();\n\n // Update the modifiedDate with the current Date/Time\n this.modifiedDate = new Date();\n }\n\n /**\n * Occasionally the Protocol class needs to be instantiated from a JavaScript Object\n * containing the Protocol data. This function fills in a Protocol with the Object\n * data.\n *\n * @param input A Protocol as a JavaScript Object, e.g. retrieved from JSON\n */\n fromObject(input) {\n // Check if the input already has an ID\n // If so, keep it. It not, create a new UUID\n this.id = input.id || guid();\n\n // Assign the input name to the Protocol\n this.name = input.name;\n\n // Retrieve locked status, use !! to make it truthy\n // so that undefined values will be set to false\n this.locked = !!input.locked;\n\n // TODO: Check how to regenerate Set from Object\n // this.availableTo = new Set(input.availableTo);\n // this.editableBy = new Set(input.editableBy);\n\n // If the input contains Protocol matching rules\n if (input.protocolMatchingRules) {\n input.protocolMatchingRules.forEach((ruleObject) => {\n // Create new Rules from the stored data\n const rule = new ProtocolMatchingRule();\n rule.fromObject(ruleObject);\n\n // Add them to the Protocol\n this.protocolMatchingRules.push(rule);\n });\n }\n\n // If the input contains data for various Stages in the\n // display set sequence\n if (input.stages) {\n input.stages.forEach((stageObject) => {\n // Create Stages from the stored data\n const stage = new Stage();\n stage.fromObject(stageObject);\n\n // Add them to the Protocol\n this.stages.push(stage);\n });\n }\n }\n\n /**\n * Creates a clone of the current Protocol with a new name\n *\n * @param name\n * @returns {Protocol|*}\n */\n createClone(name) {\n // Create a new JavaScript independent of the current Protocol\n const currentProtocol = {...this};\n\n // Create a new Protocol to return\n const clonedProtocol = new Protocol();\n\n // Apply the desired properties\n currentProtocol.id = clonedProtocol.id;\n clonedProtocol.fromObject(currentProtocol);\n\n // If we have specified a name, assign it\n if (name) {\n clonedProtocol.name = name;\n }\n\n // Unlock the clone\n clonedProtocol.locked = false;\n\n // Return the cloned Protocol\n return clonedProtocol;\n }\n\n /**\n * Adds a Stage to this Protocol's display set sequence\n *\n * @param stage\n */\n addStage(stage) {\n this.stages.push(stage);\n\n // Update the modifiedDate and User that last\n // modified this Protocol\n this.protocolWasModified();\n }\n\n /**\n * Adds a Rule to this Protocol's array of matching rules\n *\n * @param rule\n */\n addProtocolMatchingRule(rule) {\n this.protocolMatchingRules.push(rule);\n\n // Update the modifiedDate and User that last\n // modified this Protocol\n this.protocolWasModified();\n }\n\n /**\n * Removes a Rule from this Protocol's array of matching rules\n *\n * @param rule\n */\n removeProtocolMatchingRule(rule) {\n const wasRemoved = removeFromArray(this.protocolMatchingRules, rule);\n\n // Update the modifiedDate and User that last\n // modified this Protocol\n if (wasRemoved) {\n this.protocolWasModified();\n }\n }\n}\n","import OHIFError from '../classes/OHIFError';\nimport metadata from '../classes/metadata';\nimport { StudyMetadataSource } from '../classes/StudyMetadataSource';\nimport { isImage } from '../utils/isImage';\nimport { HPMatcher } from './HPMatcher';\nimport { sortByScore } from './lib/sortByScore';\nimport log from '../log';\nimport sortBy from '../utils/sortBy';\nimport { CustomViewportSettings } from './customViewportSettings';\nimport Protocol from './classes/Protocol';\nimport { ProtocolStore } from './protocolStore/classes';\n\n/**\n * Import Constants\n */\nconst { StudyMetadata, InstanceMetadata } = metadata;\n\n// Useful constants\nconst ABSTRACT_PRIOR_VALUE = 'abstractPriorValue';\n\nexport default class ProtocolEngine {\n matchedProtocols = new Map();\n\n matchedProtocolScores = {};\n\n /**\n * Constructor\n * @param {ProtocolStore} protocolStore Protocol Store used to keep track of all hanging protocols\n * @param {Array} studies Array of study metadata\n * @param {Map} priorStudies Map of prior studies\n * @param {Object} studyMetadataSource Instance of StudyMetadataSource (ohif-viewerbase) Object to get study metadata\n * @param {Object} options\n */\n constructor(\n protocolStore,\n studies,\n priorStudies,\n studyMetadataSource,\n options = {}\n ) {\n // -----------\n // Type Validations\n if (!(studyMetadataSource instanceof StudyMetadataSource)) {\n throw new OHIFError(\n 'ProtocolEngine::constructor studyMetadataSource is not an instance of StudyMetadataSource'\n );\n }\n\n if (\n !(studies instanceof Array) &&\n !studies.every((study) => study instanceof StudyMetadata)\n ) {\n throw new OHIFError(\n 'ProtocolEngine::constructor studies is not an array or it\\'s items are not instances of StudyMetadata'\n );\n }\n\n // --------------\n // Initialization\n this.protocolStore = protocolStore;\n this.studies = studies;\n this.priorStudies = priorStudies instanceof Map ? priorStudies : new Map();\n this.studyMetadataSource = studyMetadataSource;\n this.options = options;\n\n // Put protocol engine in a known state\n this.reset();\n\n // Create an array for new stage ids to be stored\n // while editing a stage\n this.newStageIds = [];\n }\n\n /**\n * Resets the ProtocolEngine to the best match\n */\n reset() {\n const protocol = this.getBestProtocolMatch();\n\n this.setHangingProtocol(protocol);\n }\n\n /**\n * Retrieves the current Stage from the current Protocol and stage index\n *\n * @returns {*} The Stage model for the currently displayed Stage\n */\n getCurrentStageModel() {\n return this.protocol.stages[this.stage];\n }\n\n /**\n * Finds the best protocols from Protocol Store, matching each protocol matching rules\n * with the given study. The best protocol are orded by score and returned in an array\n * @param {Object} study StudyMetadata instance object\n * @return {Array} Array of match objects or an empty array if no match was found\n * Each match object has the score of the matching and the matched\n * protocol\n */\n findMatchByStudy(study) {\n log.trace('ProtocolEngine::findMatchByStudy');\n\n const matched = [];\n const studyInstance = study.getFirstInstance();\n\n // Set custom attribute for study metadata\n const numberOfAvailablePriors = this.getNumberOfAvailablePriors(\n study.getObjectID()\n );\n\n this.protocolStore.getProtocol().forEach((protocol) => {\n // Clone the protocol's protocolMatchingRules array\n // We clone it so that we don't accidentally add the\n // numberOfPriorsReferenced rule to the Protocol itself.\n const rules = protocol.protocolMatchingRules.slice();\n if (!rules) {\n return;\n }\n\n // Check if the study has the minimun number of priors used by the protocol.\n const numberOfPriorsReferenced = protocol.getNumberOfPriorsReferenced();\n if (numberOfPriorsReferenced > numberOfAvailablePriors) {\n return;\n }\n\n // Run the matcher and get matching details\n const matchedDetails = HPMatcher.match(studyInstance, rules);\n const score = matchedDetails.score;\n\n // The protocol matched some rule, add it to the matched list\n if (score > 0) {\n matched.push({\n score,\n protocol\n });\n }\n });\n\n // If no matches were found, select the default protocol\n if (!matched.length) {\n const defaultProtocol = this.protocolStore.getProtocol('defaultProtocol');\n\n return [\n {\n score: 1,\n protocol: defaultProtocol\n }\n ];\n }\n\n // Sort the matched list by score\n sortByScore(matched);\n\n log.trace('ProtocolEngine::findMatchByStudy matched', matched);\n\n return matched;\n }\n\n _clearMatchedProtocols() {\n this.matchedProtocols.clear();\n this.matchedProtocolScores = {};\n }\n\n /**\n * Populates the MatchedProtocols Collection by running the matching procedure\n */\n updateProtocolMatches() {\n log.trace('ProtocolEngine::updateProtocolMatches');\n\n // Clear all data currently in matchedProtocols\n this._clearMatchedProtocols();\n\n // For each study, find the matching protocols\n this.studies.forEach((study) => {\n const matched = this.findMatchByStudy(study);\n\n // For each matched protocol, check if it is already in MatchedProtocols\n matched.forEach((matchedDetail) => {\n const protocol = matchedDetail.protocol;\n if (!protocol) {\n return;\n }\n\n // If it is not already in the MatchedProtocols Collection, insert it with its score\n if (!this.matchedProtocols.has(protocol.id)) {\n log.trace(\n 'ProtocolEngine::updateProtocolMatches inserting protocol match',\n matchedDetail\n );\n this.matchedProtocols.set(protocol.id, protocol);\n this.matchedProtocolScores[protocol.id] = matchedDetail.score;\n }\n });\n });\n }\n\n _largestKeyByValue(obj) {\n return Object.keys(obj).reduce((a, b) => (obj[a] > obj[b] ? a : b));\n }\n\n _getHighestScoringProtocol() {\n if (!Object.keys(this.matchedProtocolScores).length) {\n return this.protocolStore.getProtocol('defaultProtocol');\n }\n const highestScoringProtocolId = this._largestKeyByValue(\n this.matchedProtocolScores\n );\n return this.matchedProtocols.get(highestScoringProtocolId);\n }\n\n /**\n * Return the best matched Protocol to the current study or set of studies\n * @returns {*}\n */\n getBestProtocolMatch() {\n // Run the matching to populate matchedProtocols Set and Map\n this.updateProtocolMatches();\n\n // Retrieve the highest scoring Protocol\n const bestMatch = this._getHighestScoringProtocol();\n\n log.trace('ProtocolEngine::getBestProtocolMatch bestMatch', bestMatch);\n\n return bestMatch;\n }\n\n /**\n * Get the number of prior studies supplied in the priorStudies map property.\n *\n * @param {String} studyObjectID The study object ID of the study whose priors are needed\n * @returns {number} The number of available prior studies with the same PatientID\n */\n getNumberOfAvailablePriors(studyObjectID) {\n return this.getAvailableStudyPriors(studyObjectID).length;\n }\n\n /**\n * Get the array of prior studies from a specific study.\n *\n * @param {String} studyObjectID The study object ID of the study whose priors are needed\n * @returns {Array} The array of available priors or an empty array\n */\n getAvailableStudyPriors(studyObjectID) {\n const priors = this.priorStudies.get(studyObjectID);\n\n return priors instanceof Array ? priors : [];\n }\n\n // Match images given a list of Studies and a Viewport's image matching reqs\n matchImages(viewport, viewportIndex) {\n log.trace('ProtocolEngine::matchImages');\n\n const {\n studyMatchingRules,\n seriesMatchingRules,\n imageMatchingRules: instanceMatchingRules\n } = viewport;\n\n const matchingScores = [];\n const currentStudy = this.studies[0]; // @TODO: Should this be: this.studies[this.currentStudy] ???\n const firstInstance = currentStudy.getFirstInstance();\n\n let highestStudyMatchingScore = 0;\n let highestSeriesMatchingScore = 0;\n\n // Set custom attribute for study metadata and it's first instance\n currentStudy.setCustomAttribute(ABSTRACT_PRIOR_VALUE, 0);\n if (firstInstance instanceof InstanceMetadata) {\n firstInstance.setCustomAttribute(ABSTRACT_PRIOR_VALUE, 0);\n }\n\n // Only used if study matching rules has abstract prior values defined...\n let priorStudies;\n\n studyMatchingRules.forEach((rule) => {\n if (rule.attribute === ABSTRACT_PRIOR_VALUE) {\n const validatorType = Object.keys(rule.constraint)[0];\n const validator = Object.keys(rule.constraint[validatorType])[0];\n\n let abstractPriorValue = rule.constraint[validatorType][validator];\n abstractPriorValue = parseInt(abstractPriorValue, 10);\n // TODO: Restrict or clarify validators for abstractPriorValue?\n\n // No need to call it more than once...\n if (!priorStudies) {\n priorStudies = this.getAvailableStudyPriors(\n currentStudy.getObjectID()\n );\n }\n\n // TODO: Revisit this later: What about two studies with the same\n // study date?\n\n let priorStudy;\n if (abstractPriorValue === -1) {\n priorStudy = priorStudies[priorStudies.length - 1];\n } else {\n const studyIndex = Math.max(abstractPriorValue - 1, 0);\n priorStudy = priorStudies[studyIndex];\n }\n\n // Invalid data\n if (!(priorStudy instanceof StudyMetadata)) {\n return;\n }\n\n const priorStudyObjectID = priorStudy.getObjectID();\n\n // Check if study metadata is already in studies list\n if (\n this.studies.find(\n (study) => study.getObjectID() === priorStudyObjectID\n )\n ) {\n return;\n }\n\n // Get study metadata if necessary and load study in the viewer (each viewer should provide it's own load study method)\n this.studyMetadataSource.loadStudy(priorStudy).then(\n (studyMetadata) => {\n // Set the custom attribute abstractPriorValue for the study metadata\n studyMetadata.setCustomAttribute(\n ABSTRACT_PRIOR_VALUE,\n abstractPriorValue\n );\n\n // Also add custom attribute\n const firstInstance = studyMetadata.getFirstInstance();\n if (firstInstance instanceof InstanceMetadata) {\n firstInstance.setCustomAttribute(\n ABSTRACT_PRIOR_VALUE,\n abstractPriorValue\n );\n }\n\n // Insert the new study metadata\n this.studies.push(studyMetadata);\n\n // Update the viewport to refresh layout manager with new study\n this.updateViewports(viewportIndex);\n },\n (error) => {\n log.warn(error);\n throw new OHIFError(\n `ProtocolEngine::matchImages could not get study metadata for the Study with the following ObjectID: ${priorStudyObjectID}`\n );\n }\n );\n }\n // TODO: Add relative Date / time\n });\n\n this.studies.forEach((study) => {\n const studyMatchDetails = HPMatcher.match(\n study.getFirstInstance(),\n studyMatchingRules\n );\n\n // Prevent bestMatch from being updated if the matchDetails' required attribute check has failed\n if (\n studyMatchDetails.requiredFailed === true ||\n studyMatchDetails.score < highestStudyMatchingScore\n ) {\n return;\n }\n\n highestStudyMatchingScore = studyMatchDetails.score;\n\n study.forEachSeries((series) => {\n const seriesMatchDetails = HPMatcher.match(\n series.getFirstInstance(),\n seriesMatchingRules\n );\n\n // Prevent bestMatch from being updated if the matchDetails' required attribute check has failed\n if (\n seriesMatchDetails.requiredFailed === true ||\n seriesMatchDetails.score < highestSeriesMatchingScore\n ) {\n return;\n }\n\n highestSeriesMatchingScore = seriesMatchDetails.score;\n\n series.forEachInstance((instance, index) => {\n // This tests to make sure there is actually image data in this instance\n // TODO: Change this when we add PDF and MPEG support\n // See https://ohiforg.atlassian.net/browse/LT-227\n if (\n !isImage(instance.getTagValue('SOPClassUID')) &&\n !instance.getTagValue('Rows')\n ) {\n return;\n }\n\n const instanceMatchDetails = HPMatcher.match(\n instance,\n instanceMatchingRules\n );\n\n // Prevent bestMatch from being updated if the matchDetails' required attribute check has failed\n if (instanceMatchDetails.requiredFailed === true) {\n return;\n }\n\n const matchDetails = {\n passed: [],\n failed: []\n };\n\n matchDetails.passed = matchDetails.passed.concat(\n instanceMatchDetails.details.passed\n );\n matchDetails.passed = matchDetails.passed.concat(\n seriesMatchDetails.details.passed\n );\n matchDetails.passed = matchDetails.passed.concat(\n studyMatchDetails.details.passed\n );\n\n matchDetails.failed = matchDetails.failed.concat(\n instanceMatchDetails.details.failed\n );\n matchDetails.failed = matchDetails.failed.concat(\n seriesMatchDetails.details.failed\n );\n matchDetails.failed = matchDetails.failed.concat(\n studyMatchDetails.details.failed\n );\n\n const totalMatchScore =\n instanceMatchDetails.score +\n seriesMatchDetails.score +\n studyMatchDetails.score;\n const currentSOPInstanceUID = instance.getSOPInstanceUID();\n\n const imageDetails = {\n StudyInstanceUID: study.getStudyInstanceUID(),\n SeriesInstanceUID: series.getSeriesInstanceUID(),\n SOPInstanceUID: currentSOPInstanceUID,\n currentImageIdIndex: index,\n matchingScore: totalMatchScore,\n matchDetails,\n sortingInfo: {\n score: totalMatchScore,\n study:\n instance.getTagValue('StudyDate') +\n instance.getTagValue('StudyTime'),\n series: parseInt(instance.getTagValue('SeriesNumber')), // TODO: change for seriesDateTime\n instance: parseInt(instance.getTagValue('InstanceNumber')) // TODO: change for acquisitionTime\n }\n };\n\n // Find the displaySet\n const displaySet = study.findDisplaySet((displaySet) =>\n displaySet.images.find(\n (image) => image.getSOPInstanceUID() === currentSOPInstanceUID\n )\n );\n\n // If the instance was found, set the displaySet ID\n if (displaySet) {\n imageDetails.displaySetInstanceUID = displaySet.getUID();\n imageDetails.imageId = instance.getImageId();\n }\n\n matchingScores.push(imageDetails);\n });\n });\n });\n\n // Sort the matchingScores\n const sortingFunction = sortBy(\n {\n name: 'score',\n reverse: true\n },\n {\n name: 'study',\n reverse: true\n },\n {\n name: 'instance'\n },\n {\n name: 'series'\n }\n );\n matchingScores.sort((a, b) =>\n sortingFunction(a.sortingInfo, b.sortingInfo)\n );\n\n const bestMatch = matchingScores[0];\n\n log.trace('ProtocolEngine::matchImages bestMatch', bestMatch);\n\n return {\n bestMatch,\n matchingScores\n };\n }\n\n /**\n * Sets the current layout\n *\n * @param {number} numRows\n * @param {number} numColumns\n */\n setLayout(numRows, numColumns) {\n if (numRows < 1 && numColumns < 1) {\n log.error(`Invalid layout ${numRows} x ${numColumns}`);\n return;\n }\n\n if (typeof this.options.setLayout !== 'function') {\n log.error('Hanging Protocol Engine setLayout callback is not defined');\n return;\n }\n\n const viewports = [];\n const numViewports = numRows * numColumns;\n\n for (let i = 0; i < numViewports; i++) {\n viewports.push({});\n }\n\n this.options.setLayout({ numRows, numColumns, viewports });\n }\n\n /**\n * Rerenders viewports that are part of the current layout manager\n * using the matching rules internal to each viewport.\n *\n * If this function is provided the index of a viewport, only the specified viewport\n * is rerendered.\n *\n * @param viewportIndex\n */\n updateViewports(viewportIndex) {\n log.trace(\n `ProtocolEngine::updateViewports viewportIndex: ${viewportIndex}`\n );\n\n // Make sure we have an active protocol with a non-empty array of display sets\n if (!this.getNumProtocolStages()) {\n return;\n }\n\n // Retrieve the current stage\n const stageModel = this.getCurrentStageModel();\n\n // If the current stage does not fulfill the requirements to be displayed,\n // stop here.\n if (\n !stageModel ||\n !stageModel.viewportStructure ||\n !stageModel.viewports ||\n !stageModel.viewports.length\n ) {\n return;\n }\n\n // Retrieve the layoutTemplate associated with the current display set's viewport structure\n // If no such template name exists, stop here.\n const layoutTemplateName = stageModel.viewportStructure.getLayoutTemplateName();\n if (!layoutTemplateName) {\n return;\n }\n\n // Retrieve the properties associated with the current display set's viewport structure template\n // If no such layout properties exist, stop here.\n const layoutProps = stageModel.viewportStructure.properties;\n if (!layoutProps) {\n return;\n }\n\n // Create an empty array to store the output viewportData\n const viewportData = [];\n\n // Empty the matchDetails associated with the ProtocolEngine.\n // This will be used to store the pass/fail details and score\n // for each of the viewport matching procedures\n this.matchDetails = [];\n\n // Loop through each viewport\n stageModel.viewports.forEach((viewport, viewportIndex) => {\n const details = this.matchImages(viewport, viewportIndex);\n\n this.matchDetails[viewportIndex] = details;\n\n // Convert any YES/NO values into true/false for Cornerstone\n const cornerstoneViewportParams = {};\n\n // Cache viewportSettings keys\n const viewportSettingsKeys = Object.keys(viewport.viewportSettings);\n\n viewportSettingsKeys.forEach((key) => {\n let value = viewport.viewportSettings[key];\n if (value === 'YES') {\n value = true;\n } else if (value === 'NO') {\n value = false;\n }\n\n cornerstoneViewportParams[key] = value;\n });\n\n // imageViewerViewports occasionally needs relevant layout data in order to set\n // the element style of the viewport in question\n const currentViewportData = {\n viewportIndex,\n viewport: cornerstoneViewportParams,\n ...layoutProps\n };\n\n const customSettings = [];\n viewportSettingsKeys.forEach((id) => {\n const setting = CustomViewportSettings[id];\n if (!setting) {\n return;\n }\n\n customSettings.push({\n id,\n value: viewport.viewportSettings[id]\n });\n });\n\n currentViewportData.renderedCallback = (element) => {\n // console.log('renderedCallback for ' + element.id);\n customSettings.forEach((customSetting) => {\n log.trace(\n `ProtocolEngine::currentViewportData.renderedCallback Applying custom setting: ${customSetting.id}`\n );\n log.trace(\n `ProtocolEngine::currentViewportData.renderedCallback with value: ${customSetting.value}`\n );\n\n const setting = CustomViewportSettings[customSetting.id];\n setting.callback(element, customSetting.value);\n });\n };\n\n let currentMatch = details.bestMatch;\n let currentPosition = 1;\n const scoresLength = details.matchingScores.length;\n while (\n currentPosition < scoresLength &&\n viewportData.find((a) => a.imageId === currentMatch.imageId)\n ) {\n currentMatch = details.matchingScores[currentPosition];\n currentPosition++;\n }\n\n if (currentMatch && currentMatch.imageId) {\n currentViewportData.StudyInstanceUID = currentMatch.StudyInstanceUID;\n currentViewportData.SeriesInstanceUID = currentMatch.SeriesInstanceUID;\n currentViewportData.SOPInstanceUID = currentMatch.SOPInstanceUID;\n currentViewportData.currentImageIdIndex =\n currentMatch.currentImageIdIndex;\n currentViewportData.displaySetInstanceUID =\n currentMatch.displaySetInstanceUID;\n currentViewportData.imageId = currentMatch.imageId;\n }\n\n // @TODO Why should we throw an exception when a best match is not found? This was aborting the whole process.\n // if (!currentViewportData.displaySetInstanceUID) {\n // throw new OHIFError('ProtocolEngine::updateViewports No matching display set found?');\n // }\n\n viewportData.push(currentViewportData);\n });\n\n this.setLayout(layoutProps.Rows, layoutProps.Columns);\n\n if (typeof this.options.setViewportSpecificData !== 'function') {\n log.error(\n 'Hanging Protocol Engine setViewportSpecificData callback is not defined'\n );\n return;\n }\n\n // If viewportIndex is defined, then update only that viewport\n if (viewportIndex !== undefined && viewportData[viewportIndex]) {\n this.options.setViewportSpecificData(\n viewportIndex,\n viewportData[viewportIndex]\n );\n return;\n }\n\n // Update all viewports\n viewportData.forEach((viewportSpecificData) => {\n this.options.setViewportSpecificData(\n viewportSpecificData.viewportIndex,\n viewportSpecificData\n );\n });\n }\n\n /**\n * Sets the current Hanging Protocol to the specified Protocol\n * An optional argument can also be used to prevent the updating of the Viewports\n *\n * @param newProtocol\n * @param updateViewports\n */\n setHangingProtocol(newProtocol, updateViewports = true) {\n log.trace('ProtocolEngine::setHangingProtocol newProtocol', newProtocol);\n log.trace(\n `ProtocolEngine::setHangingProtocol updateViewports = ${updateViewports}`\n );\n\n // Reset the array of newStageIds\n this.newStageIds = [];\n\n if (Object.prototype.isPrototypeOf.call(newProtocol, Protocol)) {\n this.protocol = newProtocol;\n } else {\n this.protocol = new Protocol();\n this.protocol.fromObject(newProtocol);\n }\n\n this.stage = 0;\n\n // Update viewports by default\n if (updateViewports) {\n this.updateViewports();\n }\n }\n\n /**\n * Check if the next stage is available\n * @return {Boolean} True if next stage is available or false otherwise\n */\n isNextStageAvailable() {\n const numberOfStages = this.getNumProtocolStages();\n\n return this.stage + 1 < numberOfStages;\n }\n\n /**\n * Check if the previous stage is available\n * @return {Boolean} True if previous stage is available or false otherwise\n */\n isPreviousStageAvailable() {\n return this.stage - 1 >= 0;\n }\n\n /**\n * Changes the current stage to a new stage index in the display set sequence.\n * It checks if the next stage exists.\n *\n * @param {Integer} stageAction An integer value specifying wheater next (1) or previous (-1) stage\n * @return {Boolean} True if new stage has set or false, otherwise\n */\n setCurrentProtocolStage(stageAction) {\n // Check if previous or next stage is available\n if (stageAction === -1 && !this.isPreviousStageAvailable()) {\n return false;\n }\n if (stageAction === 1 && !this.isNextStageAvailable()) {\n return false;\n }\n\n // Sets the new stage\n this.stage += stageAction;\n\n // Log the new stage\n log.trace(`ProtocolEngine::setCurrentProtocolStage stage = ${this.stage}`);\n\n // Since stage has changed, we need to update the viewports\n // and redo matchings\n this.updateViewports();\n\n // Everything went well\n return true;\n }\n\n /**\n * Retrieves the number of Stages in the current Protocol or\n * undefined if no protocol or stages are set\n */\n getNumProtocolStages() {\n if (\n !this.protocol ||\n !this.protocol.stages ||\n !this.protocol.stages.length\n ) {\n return;\n }\n\n return this.protocol.stages.length;\n }\n\n /**\n * Switches to the next protocol stage in the display set sequence\n */\n nextProtocolStage() {\n log.trace('ProtocolEngine::nextProtocolStage');\n\n if (!this.setCurrentProtocolStage(1)) {\n log.trace('ProtocolEngine::nextProtocolStage failed');\n }\n }\n\n /**\n * Switches to the previous protocol stage in the display set sequence\n */\n previousProtocolStage() {\n log.trace('ProtocolEngine::previousProtocolStage');\n\n if (!this.setCurrentProtocolStage(-1)) {\n log.trace('ProtocolEngine::previousProtocolStage failed');\n }\n }\n}\n","// Sorts an array by score\nconst sortByScore = (arr) => {\n arr.sort((a, b) => b.score - a.score);\n};\n\nexport {sortByScore};\n","import Protocol from '../../classes/Protocol';\n\n// The ProtocolStore class allows persisting hanging protocols using different strategies.\n// For example, one strategy stores hanging protocols in the application server while\n// another strategy stores them in a remote machine, but only one strategy can be used at a time.\n\nexport default class ProtocolStore {\n constructor(strategy) {\n this.strategy = strategy;\n }\n\n /**\n * Get a Protocol instance or array of Protocol instances for the given protocol object or array\n * @param {Object|array} protocolObject Protocol plain object or array of Protocol plain objects\n * @return {Protocol|array} Protocol instance or array of Protocol intances for the given protocol object or array\n */\n static getProtocolInstance(protocolObject) {\n let result = protocolObject;\n\n // If result is an array of protocols objects\n if (result instanceof Array) {\n result.forEach((protocol, index) => {\n // Check if protocol is an instance of Protocol\n if (!(protocol instanceof Protocol)) {\n const protocolInstance = new Protocol();\n protocolInstance.fromObject(protocol);\n result[index] = protocolInstance;\n }\n });\n } else if (result !== void 0 && !(result instanceof Protocol)) {\n // Check if result exists and is not an instance of Protocol\n const protocolInstance = new Protocol();\n protocolInstance.fromObject(result);\n result = protocolInstance;\n }\n\n return result;\n }\n\n /**\n * Registers a function to be called when the protocol store is ready to persist hanging protocols\n *\n * NOTE: Strategies should implement this function\n *\n * @param callback The function to be called as a callback\n */\n onReady(callback) {\n this.strategy.onReady(callback);\n }\n\n /**\n * Gets the hanging protocol by protocolId if defined, otherwise all stored hanging protocols\n *\n * NOTE: Strategies should implement this function\n *\n * @param protocolId The protocol ID used to find the hanging protocol\n * @returns {object|array} The hanging protocol by protocolId or array of the stored hanging protocols\n */\n getProtocol(protocolId) {\n const result = this.strategy.getProtocol(protocolId);\n return ProtocolStore.getProtocolInstance(result);\n }\n\n /**\n * Stores the hanging protocol\n *\n * NOTE: Strategies should implement this function\n *\n * @param protocol The hanging protocol to be stored\n */\n addProtocol(protocol) {\n this.strategy.addProtocol(protocol);\n }\n\n /**\n * Updates the hanging protocol by protocolId\n *\n * NOTE: Strategies should implement this function\n *\n * @param protocolId The protocol ID used to find the hanging protocol to update\n * @param protocol The updated hanging protocol\n */\n updateProtocol(protocolId, protocol) {\n this.strategy.updateProtocol(protocolId, protocol);\n }\n\n /**\n * Removes the hanging protocol\n *\n * NOTE: Strategies should implement this function\n *\n * @param protocolId The protocol ID used to remove the hanging protocol\n */\n removeProtocol(protocolId) {\n this.strategy.removeProtocol(protocolId);\n }\n}\n","import Protocol from '../classes/Protocol';\nimport ViewportStructure from '../classes/ViewportStructure';\nimport Viewport from '../classes/Viewport';\nimport Stage from '../classes/Stage';\n\nfunction getDefaultProtocol() {\n const protocol = new Protocol('Default');\n protocol.id = 'defaultProtocol';\n protocol.locked = true;\n\n const oneByOne = new ViewportStructure('grid', {\n Rows: 1,\n Columns: 1\n });\n\n const viewport = new Viewport();\n const first = new Stage(oneByOne, 'oneByOne');\n first.viewports.push(viewport);\n\n protocol.stages.push(first);\n\n return protocol;\n}\n\nconst defaultProtocol = getDefaultProtocol();\n\nexport default defaultProtocol;\n","import ProtocolEngine from './ProtocolEngine';\nimport {ProtocolStore, ProtocolStrategy} from './protocolStore';\nimport {addCustomAttribute} from './customAttributes';\nimport {addCustomViewportSetting} from './customViewportSettings';\n\nconst hangingProtocols = {\n ProtocolEngine,\n ProtocolStore,\n ProtocolStrategy,\n addCustomAttribute,\n addCustomViewportSetting\n};\n\nexport default hangingProtocols;\n","import log from '../../../log';\nimport defaultProtocol from '../defaultProtocol';\n\nexport default class ProtocolStrategy {\n constructor() {\n this.hangingProtocols = new Map();\n this.defaultsAdded = false;\n }\n\n /**\n * Registers a function to be called when the hangingProtocols collection is subscribed\n * The callback is called only one time when the subscription is ready\n *\n * @param callback The function to be called as a callback\n */\n onReady(callback) {\n if (!this.defaultsAdded) {\n log.info('Inserting the default hanging protocol...');\n this.addProtocol(defaultProtocol);\n this.defaultsAdded = true;\n }\n\n callback();\n }\n\n /**\n * Gets the hanging protocol by protocolId if defined, otherwise all stored hanging protocols\n *\n * @param protocolId The protocol ID used to find the hanging protocol\n * @returns {object|array} The hanging protocol by protocolId or array of the stored hanging protocols\n */\n getProtocol(protocolId) {\n // Return the hanging protocol by protocolId if defined\n if (protocolId) {\n return this.hangingProtocols.get(protocolId);\n }\n\n // Otherwise, return all protocols\n return Array.from(this.hangingProtocols.values());\n }\n\n /**\n * Stores the hanging protocol\n *\n * @param protocol The hanging protocol to be stored\n */\n addProtocol(protocol) {\n this.hangingProtocols.set(protocol.id, protocol);\n }\n\n /**\n * Updates the hanging protocol by protocolId\n *\n * @param protocolId The protocol ID used to find the hanging protocol to update\n * @param protocol The updated hanging protocol\n */\n updateProtocol(protocolId, protocol) {\n if (!this.hangingProtocols.has(protocolId)) {\n return;\n }\n\n this.hangingProtocols.set(protocolId, protocol);\n }\n\n /**\n * Removes the hanging protocol\n *\n * @param protocolId The protocol ID used to remove the hanging protocol\n */\n removeProtocol(protocolId) {\n if (!this.hangingProtocols.has(protocolId)) {\n return;\n }\n\n this.hangingProtocols.delete(protocolId);\n }\n}\n","// import Dropdown from './ui/dropdown/class';\n\n/*\n * Defines the base OHIF header object\n */\n// const dropdown = new OHIF.ui.Dropdown();\nconst header = {};\n\nexport default header;\n","// Transforms a shallow object with keys separated by \".\" into a nested object\nfunction getNestedObject(shallowObject) {\n const nestedObject = {};\n for (const key in shallowObject) {\n if (!Object.prototype.hasOwnProperty.call(shallowObject, key)) continue;\n const value = shallowObject[key];\n const propertyArray = key.split('.');\n let currentObject = nestedObject;\n while (propertyArray.length) {\n const currentProperty = propertyArray.shift();\n if (!propertyArray.length) {\n currentObject[currentProperty] = value;\n } else {\n if (!currentObject[currentProperty]) {\n currentObject[currentProperty] = {};\n }\n\n currentObject = currentObject[currentProperty];\n }\n }\n }\n\n return nestedObject;\n}\n\n// Transforms a nested object into a shallowObject merging its keys with \".\" character\nfunction getShallowObject(nestedObject) {\n const shallowObject = {};\n const putValues = (baseKey, nestedObject, resultObject) => {\n for (const key in nestedObject) {\n if (!Object.prototype.hasOwnProperty.call(nestedObject, key)) continue;\n let currentKey = baseKey ? `${baseKey}.${key}` : key;\n const currentValue = nestedObject[key];\n if (typeof currentValue === 'object') {\n if (currentValue instanceof Array) {\n currentKey += '[]';\n }\n\n putValues(currentKey, currentValue, resultObject);\n } else {\n resultObject[currentKey] = currentValue;\n }\n }\n };\n\n putValues('', nestedObject, shallowObject);\n return shallowObject;\n}\n\nconst object = {\n getNestedObject,\n getShallowObject\n};\n\nexport default object;\n","/** Action Creators:\n * https://redux.js.org/basics/actions#action-creators\n */\n\nimport {\n CLEAR_VIEWPORT,\n SET_ACTIVE_SPECIFIC_DATA,\n SET_SERVERS,\n SET_VIEWPORT,\n SET_VIEWPORT_ACTIVE,\n SET_VIEWPORT_LAYOUT,\n SET_VIEWPORT_LAYOUT_AND_DATA,\n SET_USER_PREFERENCES\n} from './constants/ActionTypes';\n\n/**\n * The definition of a viewport layout.\n *\n * @typedef {Object} ViewportLayout\n * @property {number} numRows -\n * @property {number} numColumns -\n * @property {array} viewports -\n */\n\n/**\n * VIEWPORT\n */\nexport const setViewportSpecificData = (\n viewportIndex,\n viewportSpecificData\n) => ({\n type: SET_VIEWPORT,\n viewportIndex,\n viewportSpecificData\n});\n\nexport const setViewportActive = (viewportIndex) => ({\n type: SET_VIEWPORT_ACTIVE,\n viewportIndex\n});\n\n/**\n * @param {ViewportLayout} layout\n */\nexport const setLayout = ({numRows, numColumns, viewports}) => ({\n type: SET_VIEWPORT_LAYOUT,\n numRows,\n numColumns,\n viewports\n});\n\n/**\n * @param {number} layout.numRows\n * @param {number} layout.numColumns\n * @param {array} viewports\n */\nexport const setViewportLayoutAndData = (\n {numRows, numColumns, viewports},\n viewportSpecificData\n) => ({\n type: SET_VIEWPORT_LAYOUT_AND_DATA,\n numRows,\n numColumns,\n viewports,\n viewportSpecificData\n});\n\nexport const clearViewportSpecificData = (viewportIndex) => ({\n type: CLEAR_VIEWPORT,\n viewportIndex\n});\n\nexport const setActiveViewportSpecificData = (viewportSpecificData) => ({\n type: SET_ACTIVE_SPECIFIC_DATA,\n viewportSpecificData\n});\n\n/**\n * NOT-VIEWPORT\n */\nexport const setStudyLoadingProgress = (progressId, progressData) => ({\n type: 'SET_STUDY_LOADING_PROGRESS',\n progressId,\n progressData\n});\n\nexport const clearStudyLoadingProgress = (progressId) => ({\n type: 'CLEAR_STUDY_LOADING_PROGRESS',\n progressId\n});\n\nexport const setUserPreferences = (state) => ({\n type: SET_USER_PREFERENCES,\n state\n});\n\nexport const setExtensionData = (extension, data) => ({\n type: 'SET_EXTENSION_DATA',\n extension,\n data\n});\n\nexport const setTimepoints = (state) => ({\n type: 'SET_TIMEPOINTS',\n state\n});\n\nexport const setMeasurements = (state) => ({\n type: 'SET_MEASUREMENTS',\n state\n});\n\nexport const setStudyData = (StudyInstanceUID, data) => ({\n type: 'SET_STUDY_DATA',\n StudyInstanceUID,\n data\n});\n\nexport const setServers = (servers) => ({\n type: SET_SERVERS,\n servers\n});\n\nconst actions = {\n /**\n * VIEWPORT\n */\n setViewportActive,\n setViewportSpecificData,\n setViewportLayoutAndData,\n setLayout,\n clearViewportSpecificData,\n setActiveViewportSpecificData,\n /**\n * NOT-VIEWPORT\n */\n setStudyLoadingProgress,\n clearStudyLoadingProgress,\n setUserPreferences,\n setExtensionData,\n setTimepoints,\n setMeasurements,\n setStudyData,\n setServers\n};\n\nexport default actions;\n","/**\n * VIEWPORT\n */\nexport const SET_VIEWPORT = 'VIEWPORT::SET';\nexport const SET_VIEWPORT_ACTIVE = 'VIEWPORT::SET_ACTIVE';\nexport const SET_VIEWPORT_LAYOUT = 'VIEWPORT::SET_LAYOUT';\nexport const SET_VIEWPORT_LAYOUT_AND_DATA =\n 'VIEWPORT::SET_VIEWPORT_LAYOUT_AND_DATA';\nexport const CLEAR_VIEWPORT = 'VIEWPORT::CLEAR';\nexport const SET_SPECIFIC_DATA = 'VIEWPORT::SET_SPECIFIC_DATA';\nexport const SET_ACTIVE_SPECIFIC_DATA = 'VIEWPORT::SET_ACTIVE_SPECIFIC_DATA';\n\n/**\n * SERVERS\n */\nexport const ADD_SERVER = 'ADD_SERVER';\nexport const SET_SERVERS = 'SET_SERVERS';\n\n/**\n * EXTENSIONS\n */\nexport const SET_EXTENSION_DATA = 'SET_EXTENSION_DATA';\n\n/**\n * PREFERENCES\n * */\nexport const SET_USER_PREFERENCES = 'SET_USER_PREFERENCES';\n","export const defaultState = {};\n\nconst extensions = (state = defaultState, action) => {\n switch (action.type) {\n case 'SET_EXTENSION_DATA':\n const extensionName = action.extension;\n const currentData = state[extensionName] || {};\n\n const incomingData = action.data;\n\n const extension = {\n [extensionName]: {\n ...currentData,\n ...incomingData\n }\n };\n\n return {...state, ...extension};\n\n default:\n return state;\n }\n};\n\nexport default extensions;\n","import { cloneDeep } from 'lodash';\n\nconst defaultState = {\n progress: {},\n lastUpdated: null\n};\n\nconst loading = (state = defaultState, action) => {\n let progress;\n let lastUpdated;\n switch (action.type) {\n case 'SET_STUDY_LOADING_PROGRESS':\n progress = cloneDeep(state).progress;\n progress[action.progressId] = action.progressData;\n\n // This is a workaround so we can easily identify changes\n // to the progress object without doing deep comparison.\n lastUpdated = new Date().getTime();\n\n return {...state, progress, lastUpdated};\n case 'CLEAR_STUDY_LOADING_PROGRESS':\n progress = cloneDeep(state).progress;\n delete progress[action.progressId];\n\n lastUpdated = new Date().getTime();\n\n return {...state, progress, lastUpdated};\n default:\n return state;\n }\n};\n\nexport default loading;\n","const defaultState = {\n windowLevelData: {\n 1: {description: 'Soft tissue', window: '550', level: '40'},\n 2: {description: 'Lung', window: '150', level: '-600'},\n 3: {description: 'Liver', window: '150', level: '90'},\n 4: {description: 'Bone', window: '2500', level: '480'},\n 5: {description: 'Brain', window: '80', level: '40'},\n 6: {description: 'Trest', window: '1', level: '1'},\n 7: {description: '', window: '', level: ''},\n 8: {description: '', window: '', level: ''},\n 9: {description: '', window: '', level: ''},\n 10: {description: '', window: '', level: ''}\n },\n generalPreferences: {\n // language: 'en-US'\n }\n};\n\nconst preferences = (state = defaultState, action) => {\n switch (action.type) {\n case 'SET_USER_PREFERENCES': {\n return {...state, ...action.state};\n }\n default:\n return state;\n }\n};\n\nexport {defaultState};\nexport default preferences;\n","import { uniqBy } from 'lodash';\n\nexport const defaultState = {\n servers: []\n};\n\nconst servers = (state = defaultState, action) => {\n switch (action.type) {\n case 'ADD_SERVER':\n const servers = uniqBy([...state.servers, action.server], 'id');\n servers.forEach((s) => (s.active = true));\n return {...state, servers};\n\n case 'ACTIVATE_SERVER': {\n const newServer = {...action.server, active: true};\n const newServers = state.servers;\n newServers.forEach((s) => (s.active = false));\n return {\n ...state,\n servers: uniqBy([...newServers, newServer], 'wadoRoot')\n };\n }\n\n case 'SET_SERVERS':\n return {...state, servers: action.servers};\n\n default:\n return state;\n }\n};\n\nexport default servers;\n","import { cloneDeep } from 'lodash';\n\nconst defaultState = {\n studyData: {}\n};\n\nconst servers = (state = defaultState, action) => {\n switch (action.type) {\n case 'SET_STUDY_DATA':\n const updatedStudyData = cloneDeep(state).studyData;\n updatedStudyData[action.StudyInstanceUID] = action.data;\n\n return {...state, studyData: updatedStudyData};\n default:\n return state;\n }\n};\n\nexport default servers;\n","const defaultState = {\n timepoints: [],\n measurements: []\n};\n\nconst timepointManager = (state = defaultState, action) => {\n switch (action.type) {\n case 'SET_TIMEPOINTS':\n return {...state, timepoints: action.state};\n case 'SET_MEASUREMENTS':\n return {...state, measurements: action.state};\n default:\n return state;\n }\n};\n\nexport default timepointManager;\n","import { cloneDeep } from 'lodash';\nimport { merge } from 'lodash';\n\nimport {\n CLEAR_VIEWPORT,\n SET_ACTIVE_SPECIFIC_DATA,\n SET_SPECIFIC_DATA,\n SET_VIEWPORT,\n SET_VIEWPORT_ACTIVE,\n SET_VIEWPORT_LAYOUT,\n SET_VIEWPORT_LAYOUT_AND_DATA\n} from '../constants/ActionTypes';\n\nexport const DEFAULT_STATE = {\n numRows: 1,\n numColumns: 1,\n activeViewportIndex: 0,\n layout: {\n viewports: [{}]\n },\n viewportSpecificData: {}\n};\n\n/**\n * Take the new number of Rows and Columns, delete all not used viewport data and also set\n * active viewport as default in case current one is not available anymore.\n *\n * @param {Number} numRows\n * @param {Number} numColumns\n * @param {Object} currentViewportSpecificData\n * @returns\n */\nconst findActiveViewportSpecificData = (\n numRows,\n numColumns,\n currentViewportSpecificData = {}\n) => {\n const numberOfViewports = numRows * numColumns;\n const viewportSpecificData = cloneDeep(currentViewportSpecificData);\n\n if (numberOfViewports < Object.keys(viewportSpecificData).length) {\n Object.keys(viewportSpecificData).forEach((key) => {\n if (key > numberOfViewports - 1) {\n delete viewportSpecificData[key];\n }\n });\n }\n\n return viewportSpecificData;\n};\n/**\n * Take new number of Rows and Columns and make sure the current active viewport index is still available, if not, return the default\n *\n * @param {Number} numRows\n * @param {Number} numColumns\n * @param {Number} currentActiveViewportIndex\n * @returns\n */\nconst getActiveViewportIndex = (\n numRows,\n numColumns,\n currentActiveViewportIndex\n) => {\n const numberOfViewports = numRows * numColumns;\n\n return currentActiveViewportIndex > numberOfViewports - 1\n ? DEFAULT_STATE.activeViewportIndex\n : currentActiveViewportIndex;\n};\n\n/**\n * The definition of a viewport action.\n *\n * @typedef {Object} ViewportAction\n * @property {string} type -\n * @property {Object} data -\n * @property {Object} layout -\n * @property {number} viewportIndex -\n * @property {Object} viewportSpecificData -\n */\n\n/**\n * @param {Object} [state=DEFAULT_STATE] The current viewport state.\n * @param {ViewportAction} action A viewport action.\n */\nconst viewports = (state = DEFAULT_STATE, action) => {\n let useActiveViewport = false;\n\n switch (action.type) {\n /**\n * Sets the active viewport index.\n *\n * @return {Object} New state.\n */\n case SET_VIEWPORT_ACTIVE: {\n const activeViewportIndex = getActiveViewportIndex(\n state.numRows,\n state.numColumns,\n action.viewportIndex\n );\n return {...state, activeViewportIndex};\n }\n\n /**\n * Sets viewport layout.\n *\n * @return {Object} New state.\n */\n case SET_VIEWPORT_LAYOUT: {\n const {numRows, numColumns} = action;\n const viewportSpecificData = findActiveViewportSpecificData(\n numRows,\n numColumns,\n state.viewportSpecificData\n );\n const activeViewportIndex = getActiveViewportIndex(\n numRows,\n numColumns,\n state.activeViewportIndex\n );\n\n return {\n ...state,\n numRows: action.numRows,\n numColumns: action.numColumns,\n layout: {viewports: [...action.viewports]},\n viewportSpecificData,\n activeViewportIndex\n };\n }\n\n /**\n * Sets viewport layout and data.\n *\n * @return {Object} New state.\n */\n case SET_VIEWPORT_LAYOUT_AND_DATA: {\n const {numRows, numColumns} = action;\n const viewportSpecificData = findActiveViewportSpecificData(\n numRows,\n numColumns,\n action.viewportSpecificData\n );\n const activeViewportIndex = getActiveViewportIndex(\n numRows,\n numColumns,\n state.activeViewportIndex\n );\n\n return {\n ...state,\n numRows: action.numRows,\n numColumns: action.numColumns,\n layout: {viewports: [...action.viewports]},\n viewportSpecificData,\n activeViewportIndex\n };\n }\n\n /**\n * Sets viewport specific data of active viewport.\n *\n * @return {Object} New state.\n */\n case SET_VIEWPORT: {\n const layout = cloneDeep(state.layout);\n\n const viewportSpecificData = cloneDeep(state.viewportSpecificData);\n viewportSpecificData[action.viewportIndex] = merge(\n {},\n viewportSpecificData[action.viewportIndex],\n action.viewportSpecificData\n );\n\n if (action.viewportSpecificData && action.viewportSpecificData.plugin && !layout.viewports[action.viewportIndex].plugin) {\n layout.viewports[action.viewportIndex].plugin =\n action.viewportSpecificData.plugin;\n }\n\n return {...state, layout, viewportSpecificData};\n }\n\n /**\n * Sets viewport specific data of active/any viewport.\n *\n * @return {Object} New state.\n */\n case SET_ACTIVE_SPECIFIC_DATA:\n useActiveViewport = true;\n // Allow fall-through\n // eslint-disable-next-line\n case SET_SPECIFIC_DATA: {\n const layout = cloneDeep(state.layout);\n const viewportIndex = useActiveViewport\n ? state.activeViewportIndex\n : action.viewportIndex;\n\n const viewportSpecificData = cloneDeep(state.viewportSpecificData);\n viewportSpecificData[viewportIndex] = {\n ...action.viewportSpecificData\n };\n\n if (action.viewportSpecificData && action.viewportSpecificData.plugin) {\n layout.viewports[viewportIndex].plugin =\n action.viewportSpecificData.plugin;\n }\n\n return {...state, layout, viewportSpecificData};\n }\n\n /**\n * Clears viewport specific data of any viewport.\n *\n * @return {Object} New state.\n */\n case CLEAR_VIEWPORT: {\n const viewportSpecificData = cloneDeep(state.viewportSpecificData);\n\n if (action.viewportIndex) {\n viewportSpecificData[action.viewportIndex] = {};\n return {...state, viewportSpecificData};\n }\n return DEFAULT_STATE;\n }\n\n /**\n * Returns the current application state.\n *\n * @return {Object} The current state.\n */\n default: {\n return state;\n }\n }\n};\n\nexport default viewports;\n","import actions from './actions';\nimport reducers from './reducers';\n\nconst redux = {\n reducers,\n actions\n};\n\nexport default redux;\n","import extensions from './extensions';\nimport loading from './loading';\nimport preferences from './preferences';\nimport servers from './servers';\nimport studies from './studies';\nimport timepointManager from './timepointManager';\nimport viewports from './viewports';\n\nconst reducers = {\n extensions,\n loading,\n preferences,\n servers,\n studies,\n timepointManager,\n viewports\n};\n\nexport default reducers;\n","// TODO: This is duplicated in TypeSafeCollection\nfunction isObject(subject) {\n return (\n subject instanceof Object ||\n (typeof subject === 'object' && subject !== null)\n );\n}\n\n// TODO: This is duplicated in TypeSafeCollection\nfunction isString(subject) {\n return typeof subject === 'string';\n}\n\n// Search for some string inside any object or array\nfunction search(object, query, property = null, result = []) {\n // Create the search pattern\n const pattern = new RegExp(query.trim(), 'i');\n\n Object.keys(object).forEach((key) => {\n const item = object[key];\n\n // Stop here if item is empty\n if (!item) {\n return;\n }\n\n // Get the value to be compared\n const value = isString(property) ? item[property] : item;\n\n // Check if the value match the pattern\n if (isString(value) && pattern.test(value)) {\n // Add the current item to the result\n result.push(item);\n }\n\n if (isObject(item)) {\n // Search recursively the item if the current item is an object\n search(item, query, property, result);\n }\n });\n\n // Return the found items\n return result;\n}\n\n// Encode any string into a safe format for HTML id attribute\nfunction encodeId(input) {\n const string = input && input.toString ? input.toString() : input;\n\n // Return an underscore if the given string is empty or if it's not a string\n if (string === '' || typeof string !== 'string') {\n return '_';\n }\n\n // Create a converter to replace non accepted chars\n const converter = (match) => `_${match[0].charCodeAt(0).toString(16)}_`;\n\n // Encode the given string and return it\n return string.replace(/[^a-zA-Z0-9-]/g, converter);\n}\n\nconst string = {\n search,\n encodeId\n};\n\nexport default string;\n","import handleError from './handleError';\nimport isCharacterKeyPress from './isCharacterKeyPress';\nimport getOffset from './getOffset';\nimport getScrollbarSize from './getScrollbarSize';\n\nconst ui = {\n getScrollbarSize,\n getOffset,\n isCharacterKeyPress,\n handleError\n};\n\nexport default ui;\n","/**\n * Get the vertical and horizontal scrollbar sizes\n * Got from https://stackoverflow.com/questions/986937/how-can-i-get-the-browsers-scrollbar-sizes\n *\n * @returns {Array} Array containing the scrollbar horizontal and vertical sizes\n */\nexport default function getScrollbarSize() {\n const inner = document.createElement('p');\n inner.style.width = '100%';\n inner.style.height = '100%';\n\n const outer = document.createElement('div');\n outer.style.position = 'absolute';\n outer.style.top = '0px';\n outer.style.left = '0px';\n outer.style.visibility = 'hidden';\n outer.style.width = '100px';\n outer.style.height = '100px';\n outer.style.overflow = 'hidden';\n outer.appendChild(inner);\n\n document.body.appendChild(outer);\n\n const w1 = inner.offsetWidth;\n const h1 = inner.offsetHeight;\n outer.style.overflow = 'scroll';\n let w2 = inner.offsetWidth;\n let h2 = inner.offsetHeight;\n\n if (w1 === w2) {\n w2 = outer.clientWidth;\n }\n\n if (h1 === h2) {\n h2 = outer.clientHeight;\n }\n\n document.body.removeChild(outer);\n\n return [w1 - w2, h1 - h2];\n}\n","/**\n * Get the offset for the given element\n *\n * @param {Object} element DOM element which will have the offser calculated\n * @returns {Object} Object containing the top and left offset\n */\nexport default function getOffset(element) {\n let top = 0;\n let left = 0;\n if (element.offsetParent) {\n do {\n left += element.offsetLeft;\n top += element.offsetTop;\n } while ((element = element.offsetParent));\n }\n\n return {\n left,\n top\n };\n}\n","/**\n * Check if the pressed key combination will result in a character input\n * Got from https://stackoverflow.com/questions/4179708/how-to-detect-if-the-pressed-key-will-produce-a-character-inside-an-input-text\n *\n * @returns {Boolean} Whether the pressed key combination will input a character or not\n */\nexport default function isCharacterKeyPress(event) {\n if (typeof event.which === 'undefined') {\n // This is IE, which only fires keypress events for printable keys\n return true;\n } if (typeof event.which === 'number' && event.which > 0) {\n // In other browsers except old versions of WebKit, event.which is\n // only greater than zero if the keypress is a printable key.\n // We need to filter out backspace and ctrl/alt/meta key combinations\n return (\n !event.ctrlKey && !event.metaKey && !event.altKey && event.which !== 8\n );\n }\n\n return false;\n}\n","import log from '../log';\n\nexport default function handleError(error) {\n let {title, message} = error;\n\n if (!title) {\n if (error instanceof Error) {\n title = error.name;\n }\n }\n\n if (!message) {\n if (error instanceof Error) {\n message = error.message;\n }\n }\n\n const data = {\n title,\n message,\n class: 'themed',\n hideConfirm: true,\n cancelLabel: 'Dismiss',\n cancelClass: 'btn-secondary',\n ...error || {}\n };\n\n log.error(error);\n // TODO: Find a better way to handle errors instead of displaying a dialog for all of them.\n // OHIF.ui.showDialog('dialogForm', data);\n}\n","import './lib';\n\nimport {ExtensionManager, MODULE_TYPES} from './extensions';\nimport {ServicesManager,\n UINotificationService,\n UIModalService,\n UIDialogService,\n MeasurementService\n} from './services';\nimport classes, {CommandsManager, HotkeysManager} from './classes';\n\nimport DICOMWeb from './DICOMWeb';\nimport DICOMSR from './DICOMSR';\nimport cornerstone from './cornerstone';\nimport hangingProtocols from './hanging-protocols';\nimport header from './header';\nimport log from './log';\nimport measurements from './measurements';\nimport metadata from './classes/metadata';\nimport object from './object';\nimport redux from './redux';\nimport string from './string';\nimport studies from './studies';\nimport ui from './ui';\nimport user from './user';\nimport utils, {hotkeys} from './utils';\n\nconst ViewerCore = {\n MODULE_TYPES,\n //\n CommandsManager,\n ExtensionManager,\n HotkeysManager,\n ServicesManager,\n //\n utils,\n hotkeys,\n studies,\n redux,\n classes,\n metadata,\n header,\n cornerstone,\n string,\n ui,\n user,\n object,\n log,\n DICOMWeb,\n DICOMSR,\n viewer: {},\n measurements,\n hangingProtocols,\n //\n UINotificationService,\n UIModalService,\n UIDialogService,\n MeasurementService\n};\n\nexport {\n MODULE_TYPES,\n //\n CommandsManager,\n ExtensionManager,\n HotkeysManager,\n ServicesManager,\n //\n utils,\n hotkeys,\n studies,\n redux,\n classes,\n metadata,\n header,\n cornerstone,\n string,\n ui,\n user,\n object,\n log,\n DICOMWeb,\n DICOMSR,\n measurements,\n hangingProtocols,\n //\n UINotificationService,\n UIModalService,\n UIDialogService,\n MeasurementService\n};\n\nexport {ViewerCore};\n\nexport default ViewerCore;\n","module.exports = __WEBPACK_EXTERNAL_MODULE__275__;"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack://viewerCore/webpack/universalModuleDefinition","webpack://viewerCore/webpack/bootstrap","webpack://viewerCore/../node_modules/@babel/runtime/helpers/classCallCheck.js","webpack://viewerCore/../node_modules/@babel/runtime/helpers/createClass.js","webpack://viewerCore/../node_modules/@babel/runtime/regenerator/index.js","webpack://viewerCore/../node_modules/@babel/runtime/helpers/getPrototypeOf.js","webpack://viewerCore/../node_modules/@babel/runtime/helpers/defineProperty.js","webpack://viewerCore/../node_modules/@babel/runtime/helpers/asyncToGenerator.js","webpack://viewerCore/../node_modules/@babel/runtime/helpers/inherits.js","webpack://viewerCore/external \"cornerstone-core\"","webpack://viewerCore/../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js","webpack://viewerCore/../node_modules/@babel/runtime/helpers/typeof.js","webpack://viewerCore/../node_modules/@babel/runtime/helpers/toConsumableArray.js","webpack://viewerCore/../node_modules/lodash/cloneDeep.js","webpack://viewerCore/external \"dcmjs\"","webpack://viewerCore/../node_modules/@babel/runtime/helpers/slicedToArray.js","webpack://viewerCore/../node_modules/lodash/_root.js","webpack://viewerCore/../node_modules/lodash/isArray.js","webpack://viewerCore/../node_modules/lodash/isObject.js","webpack://viewerCore/../node_modules/lodash/isObjectLike.js","webpack://viewerCore/external \"cornerstone-tools\"","webpack://viewerCore/../node_modules/validate.js/validate.js","webpack://viewerCore/../node_modules/lodash/_getNative.js","webpack://viewerCore/../node_modules/@babel/runtime/helpers/assertThisInitialized.js","webpack://viewerCore/../node_modules/lodash/_baseGetTag.js","webpack://viewerCore/../node_modules/ajv/lib/compile/util.js","webpack://viewerCore/../node_modules/lodash/eq.js","webpack://viewerCore/../node_modules/lodash/_Symbol.js","webpack://viewerCore/../node_modules/lodash/_copyObject.js","webpack://viewerCore/external \"cornerstone-math\"","webpack://viewerCore/../node_modules/lodash/_Stack.js","webpack://viewerCore/../node_modules/lodash/_ListCache.js","webpack://viewerCore/../node_modules/lodash/_assocIndexOf.js","webpack://viewerCore/../node_modules/lodash/_nativeCreate.js","webpack://viewerCore/../node_modules/lodash/_getMapData.js","webpack://viewerCore/../node_modules/lodash/keys.js","webpack://viewerCore/../node_modules/lodash/isBuffer.js","webpack://viewerCore/../node_modules/webpack/buildin/module.js","webpack://viewerCore/../node_modules/lodash/isArrayLike.js","webpack://viewerCore/../node_modules/lodash/keysIn.js","webpack://viewerCore/../node_modules/lodash/_getTag.js","webpack://viewerCore/../node_modules/lodash/_toKey.js","webpack://viewerCore/../node_modules/query-string/index.js","webpack://viewerCore/../node_modules/mousetrap/mousetrap.js","webpack://viewerCore/external \"dicom-parser\"","webpack://viewerCore/../node_modules/@babel/runtime/helpers/setPrototypeOf.js","webpack://viewerCore/../node_modules/lodash/_Map.js","webpack://viewerCore/../node_modules/lodash/isFunction.js","webpack://viewerCore/../node_modules/lodash/_MapCache.js","webpack://viewerCore/../node_modules/lodash/_baseAssignValue.js","webpack://viewerCore/../node_modules/lodash/isArguments.js","webpack://viewerCore/../node_modules/lodash/_isIndex.js","webpack://viewerCore/../node_modules/lodash/isTypedArray.js","webpack://viewerCore/../node_modules/lodash/isLength.js","webpack://viewerCore/../node_modules/lodash/_baseUnary.js","webpack://viewerCore/../node_modules/lodash/_nodeUtil.js","webpack://viewerCore/../node_modules/lodash/_isPrototype.js","webpack://viewerCore/../node_modules/lodash/_getSymbols.js","webpack://viewerCore/../node_modules/lodash/_getPrototype.js","webpack://viewerCore/../node_modules/lodash/_cloneArrayBuffer.js","webpack://viewerCore/../node_modules/lodash/_setToArray.js","webpack://viewerCore/../node_modules/lodash/_isKey.js","webpack://viewerCore/../node_modules/lodash/isSymbol.js","webpack://viewerCore/../node_modules/lodash/identity.js","webpack://viewerCore/../node_modules/ajv/lib/compile/resolve.js","webpack://viewerCore/../node_modules/fast-deep-equal/index.js","webpack://viewerCore/../node_modules/ajv/lib/compile/error_classes.js","webpack://viewerCore/../node_modules/@babel/runtime/helpers/construct.js","webpack://viewerCore/../node_modules/lodash/uniqBy.js","webpack://viewerCore/../node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js","webpack://viewerCore/../node_modules/@babel/runtime/helpers/arrayLikeToArray.js","webpack://viewerCore/../node_modules/@babel/runtime/helpers/AwaitValue.js","webpack://viewerCore/../node_modules/lodash/_freeGlobal.js","webpack://viewerCore/../node_modules/lodash/_toSource.js","webpack://viewerCore/../node_modules/lodash/_assignValue.js","webpack://viewerCore/../node_modules/lodash/_defineProperty.js","webpack://viewerCore/../node_modules/lodash/_arrayLikeKeys.js","webpack://viewerCore/../node_modules/lodash/_overArg.js","webpack://viewerCore/../node_modules/lodash/_cloneBuffer.js","webpack://viewerCore/../node_modules/lodash/_copyArray.js","webpack://viewerCore/../node_modules/lodash/stubArray.js","webpack://viewerCore/../node_modules/lodash/_getSymbolsIn.js","webpack://viewerCore/../node_modules/lodash/_arrayPush.js","webpack://viewerCore/../node_modules/lodash/_getAllKeys.js","webpack://viewerCore/../node_modules/lodash/_baseGetAllKeys.js","webpack://viewerCore/../node_modules/lodash/_Set.js","webpack://viewerCore/../node_modules/lodash/_Uint8Array.js","webpack://viewerCore/../node_modules/lodash/_cloneTypedArray.js","webpack://viewerCore/../node_modules/lodash/_initCloneObject.js","webpack://viewerCore/../node_modules/lodash/_baseIsEqual.js","webpack://viewerCore/../node_modules/lodash/_equalArrays.js","webpack://viewerCore/../node_modules/lodash/_SetCache.js","webpack://viewerCore/../node_modules/lodash/_cacheHas.js","webpack://viewerCore/../node_modules/lodash/_isStrictComparable.js","webpack://viewerCore/../node_modules/lodash/_matchesStrictComparable.js","webpack://viewerCore/../node_modules/lodash/_baseGet.js","webpack://viewerCore/../node_modules/lodash/_castPath.js","webpack://viewerCore/../node_modules/lodash/_assignMergeValue.js","webpack://viewerCore/../node_modules/lodash/_safeGet.js","webpack://viewerCore/../node_modules/ajv/lib/compile/schema_obj.js","webpack://viewerCore/../node_modules/fast-json-stable-stringify/index.js","webpack://viewerCore/../node_modules/ajv/lib/dotjs/validate.js","webpack://viewerCore/../node_modules/ajv/lib/dotjs/_limit.js","webpack://viewerCore/../node_modules/ajv/lib/dotjs/_limitItems.js","webpack://viewerCore/../node_modules/ajv/lib/dotjs/_limitLength.js","webpack://viewerCore/../node_modules/ajv/lib/dotjs/_limitProperties.js","webpack://viewerCore/../node_modules/webpack/buildin/amd-define.js","webpack://viewerCore/../node_modules/@babel/runtime/helpers/wrapNativeSuper.js","webpack://viewerCore/../node_modules/@babel/runtime/helpers/asyncIterator.js","webpack://viewerCore/../node_modules/@babel/runtime/helpers/wrapAsyncGenerator.js","webpack://viewerCore/../node_modules/lodash/merge.js","webpack://viewerCore/../node_modules/ajv/lib/ajv.js","webpack://viewerCore/../node_modules/@babel/runtime/helpers/arrayWithHoles.js","webpack://viewerCore/../node_modules/@babel/runtime/helpers/iterableToArrayLimit.js","webpack://viewerCore/../node_modules/@babel/runtime/helpers/nonIterableRest.js","webpack://viewerCore/../node_modules/@babel/runtime/helpers/arrayWithoutHoles.js","webpack://viewerCore/../node_modules/@babel/runtime/helpers/iterableToArray.js","webpack://viewerCore/../node_modules/@babel/runtime/helpers/nonIterableSpread.js","webpack://viewerCore/../node_modules/regenerator-runtime/runtime.js","webpack://viewerCore/../node_modules/strict-uri-encode/index.js","webpack://viewerCore/../node_modules/decode-uri-component/index.js","webpack://viewerCore/../node_modules/split-on-first/index.js","webpack://viewerCore/../node_modules/@babel/runtime/helpers/isNativeFunction.js","webpack://viewerCore/../node_modules/@babel/runtime/helpers/isNativeReflectConstruct.js","webpack://viewerCore/../node_modules/@babel/runtime/helpers/awaitAsyncGenerator.js","webpack://viewerCore/../node_modules/@babel/runtime/helpers/AsyncGenerator.js","webpack://viewerCore/../node_modules/lodash/_baseClone.js","webpack://viewerCore/../node_modules/lodash/_listCacheClear.js","webpack://viewerCore/../node_modules/lodash/_listCacheDelete.js","webpack://viewerCore/../node_modules/lodash/_listCacheGet.js","webpack://viewerCore/../node_modules/lodash/_listCacheHas.js","webpack://viewerCore/../node_modules/lodash/_listCacheSet.js","webpack://viewerCore/../node_modules/lodash/_stackClear.js","webpack://viewerCore/../node_modules/lodash/_stackDelete.js","webpack://viewerCore/../node_modules/lodash/_stackGet.js","webpack://viewerCore/../node_modules/lodash/_stackHas.js","webpack://viewerCore/../node_modules/lodash/_stackSet.js","webpack://viewerCore/../node_modules/lodash/_baseIsNative.js","webpack://viewerCore/../node_modules/webpack/buildin/global.js","webpack://viewerCore/../node_modules/lodash/_getRawTag.js","webpack://viewerCore/../node_modules/lodash/_objectToString.js","webpack://viewerCore/../node_modules/lodash/_isMasked.js","webpack://viewerCore/../node_modules/lodash/_coreJsData.js","webpack://viewerCore/../node_modules/lodash/_getValue.js","webpack://viewerCore/../node_modules/lodash/_mapCacheClear.js","webpack://viewerCore/../node_modules/lodash/_Hash.js","webpack://viewerCore/../node_modules/lodash/_hashClear.js","webpack://viewerCore/../node_modules/lodash/_hashDelete.js","webpack://viewerCore/../node_modules/lodash/_hashGet.js","webpack://viewerCore/../node_modules/lodash/_hashHas.js","webpack://viewerCore/../node_modules/lodash/_hashSet.js","webpack://viewerCore/../node_modules/lodash/_mapCacheDelete.js","webpack://viewerCore/../node_modules/lodash/_isKeyable.js","webpack://viewerCore/../node_modules/lodash/_mapCacheGet.js","webpack://viewerCore/../node_modules/lodash/_mapCacheHas.js","webpack://viewerCore/../node_modules/lodash/_mapCacheSet.js","webpack://viewerCore/../node_modules/lodash/_arrayEach.js","webpack://viewerCore/../node_modules/lodash/_baseAssign.js","webpack://viewerCore/../node_modules/lodash/_baseTimes.js","webpack://viewerCore/../node_modules/lodash/_baseIsArguments.js","webpack://viewerCore/../node_modules/lodash/stubFalse.js","webpack://viewerCore/../node_modules/lodash/_baseIsTypedArray.js","webpack://viewerCore/../node_modules/lodash/_baseKeys.js","webpack://viewerCore/../node_modules/lodash/_nativeKeys.js","webpack://viewerCore/../node_modules/lodash/_baseAssignIn.js","webpack://viewerCore/../node_modules/lodash/_baseKeysIn.js","webpack://viewerCore/../node_modules/lodash/_nativeKeysIn.js","webpack://viewerCore/../node_modules/lodash/_copySymbols.js","webpack://viewerCore/../node_modules/lodash/_arrayFilter.js","webpack://viewerCore/../node_modules/lodash/_copySymbolsIn.js","webpack://viewerCore/../node_modules/lodash/_getAllKeysIn.js","webpack://viewerCore/../node_modules/lodash/_DataView.js","webpack://viewerCore/../node_modules/lodash/_Promise.js","webpack://viewerCore/../node_modules/lodash/_WeakMap.js","webpack://viewerCore/../node_modules/lodash/_initCloneArray.js","webpack://viewerCore/../node_modules/lodash/_initCloneByTag.js","webpack://viewerCore/../node_modules/lodash/_cloneDataView.js","webpack://viewerCore/../node_modules/lodash/_cloneRegExp.js","webpack://viewerCore/../node_modules/lodash/_cloneSymbol.js","webpack://viewerCore/../node_modules/lodash/_baseCreate.js","webpack://viewerCore/../node_modules/lodash/isMap.js","webpack://viewerCore/../node_modules/lodash/_baseIsMap.js","webpack://viewerCore/../node_modules/lodash/isSet.js","webpack://viewerCore/../node_modules/lodash/_baseIsSet.js","webpack://viewerCore/../node_modules/lodash/_baseIteratee.js","webpack://viewerCore/../node_modules/lodash/_baseMatches.js","webpack://viewerCore/../node_modules/lodash/_baseIsMatch.js","webpack://viewerCore/../node_modules/lodash/_baseIsEqualDeep.js","webpack://viewerCore/../node_modules/lodash/_setCacheAdd.js","webpack://viewerCore/../node_modules/lodash/_setCacheHas.js","webpack://viewerCore/../node_modules/lodash/_arraySome.js","webpack://viewerCore/../node_modules/lodash/_equalByTag.js","webpack://viewerCore/../node_modules/lodash/_mapToArray.js","webpack://viewerCore/../node_modules/lodash/_equalObjects.js","webpack://viewerCore/../node_modules/lodash/_getMatchData.js","webpack://viewerCore/../node_modules/lodash/_baseMatchesProperty.js","webpack://viewerCore/../node_modules/lodash/get.js","webpack://viewerCore/../node_modules/lodash/_stringToPath.js","webpack://viewerCore/../node_modules/lodash/_memoizeCapped.js","webpack://viewerCore/../node_modules/lodash/memoize.js","webpack://viewerCore/../node_modules/lodash/toString.js","webpack://viewerCore/../node_modules/lodash/_baseToString.js","webpack://viewerCore/../node_modules/lodash/_arrayMap.js","webpack://viewerCore/../node_modules/lodash/hasIn.js","webpack://viewerCore/../node_modules/lodash/_baseHasIn.js","webpack://viewerCore/../node_modules/lodash/_hasPath.js","webpack://viewerCore/../node_modules/lodash/property.js","webpack://viewerCore/../node_modules/lodash/_baseProperty.js","webpack://viewerCore/../node_modules/lodash/_basePropertyDeep.js","webpack://viewerCore/../node_modules/lodash/_baseUniq.js","webpack://viewerCore/../node_modules/lodash/_arrayIncludes.js","webpack://viewerCore/../node_modules/lodash/_baseIndexOf.js","webpack://viewerCore/../node_modules/lodash/_baseFindIndex.js","webpack://viewerCore/../node_modules/lodash/_baseIsNaN.js","webpack://viewerCore/../node_modules/lodash/_strictIndexOf.js","webpack://viewerCore/../node_modules/lodash/_arrayIncludesWith.js","webpack://viewerCore/../node_modules/lodash/_createSet.js","webpack://viewerCore/../node_modules/lodash/noop.js","webpack://viewerCore/../node_modules/lodash/_baseMerge.js","webpack://viewerCore/../node_modules/lodash/_baseFor.js","webpack://viewerCore/../node_modules/lodash/_createBaseFor.js","webpack://viewerCore/../node_modules/lodash/_baseMergeDeep.js","webpack://viewerCore/../node_modules/lodash/isArrayLikeObject.js","webpack://viewerCore/../node_modules/lodash/isPlainObject.js","webpack://viewerCore/../node_modules/lodash/toPlainObject.js","webpack://viewerCore/../node_modules/lodash/_createAssigner.js","webpack://viewerCore/../node_modules/lodash/_baseRest.js","webpack://viewerCore/../node_modules/lodash/_overRest.js","webpack://viewerCore/../node_modules/lodash/_apply.js","webpack://viewerCore/../node_modules/lodash/_setToString.js","webpack://viewerCore/../node_modules/lodash/_baseSetToString.js","webpack://viewerCore/../node_modules/lodash/constant.js","webpack://viewerCore/../node_modules/lodash/_shortOut.js","webpack://viewerCore/../node_modules/lodash/_isIterateeCall.js","webpack://viewerCore/../node_modules/ajv/lib/compile/index.js","webpack://viewerCore/../node_modules/uri-js/dist/es5/uri.all.js","webpack://viewerCore/../node_modules/ajv/lib/compile/ucs2length.js","webpack://viewerCore/../node_modules/json-schema-traverse/index.js","webpack://viewerCore/../node_modules/ajv/lib/cache.js","webpack://viewerCore/../node_modules/ajv/lib/compile/formats.js","webpack://viewerCore/../node_modules/ajv/lib/compile/rules.js","webpack://viewerCore/../node_modules/ajv/lib/dotjs/index.js","webpack://viewerCore/../node_modules/ajv/lib/dotjs/ref.js","webpack://viewerCore/../node_modules/ajv/lib/dotjs/allOf.js","webpack://viewerCore/../node_modules/ajv/lib/dotjs/anyOf.js","webpack://viewerCore/../node_modules/ajv/lib/dotjs/comment.js","webpack://viewerCore/../node_modules/ajv/lib/dotjs/const.js","webpack://viewerCore/../node_modules/ajv/lib/dotjs/contains.js","webpack://viewerCore/../node_modules/ajv/lib/dotjs/dependencies.js","webpack://viewerCore/../node_modules/ajv/lib/dotjs/enum.js","webpack://viewerCore/../node_modules/ajv/lib/dotjs/format.js","webpack://viewerCore/../node_modules/ajv/lib/dotjs/if.js","webpack://viewerCore/../node_modules/ajv/lib/dotjs/items.js","webpack://viewerCore/../node_modules/ajv/lib/dotjs/multipleOf.js","webpack://viewerCore/../node_modules/ajv/lib/dotjs/not.js","webpack://viewerCore/../node_modules/ajv/lib/dotjs/oneOf.js","webpack://viewerCore/../node_modules/ajv/lib/dotjs/pattern.js","webpack://viewerCore/../node_modules/ajv/lib/dotjs/properties.js","webpack://viewerCore/../node_modules/ajv/lib/dotjs/propertyNames.js","webpack://viewerCore/../node_modules/ajv/lib/dotjs/required.js","webpack://viewerCore/../node_modules/ajv/lib/dotjs/uniqueItems.js","webpack://viewerCore/../node_modules/ajv/lib/data.js","webpack://viewerCore/../node_modules/ajv/lib/compile/async.js","webpack://viewerCore/../node_modules/ajv/lib/keyword.js","webpack://viewerCore/../node_modules/ajv/lib/dotjs/custom.js","webpack://viewerCore/../node_modules/ajv/lib/definition_schema.js","webpack://viewerCore/./extensions/MODULE_TYPES.js","webpack://viewerCore/./log.js","webpack://viewerCore/./extensions/ExtensionManager.js","webpack://viewerCore/./services/ServicesManager.js","webpack://viewerCore/./services/UINotificationService/index.js","webpack://viewerCore/./services/UIModalService/index.js","webpack://viewerCore/./services/UIDialogService/index.js","webpack://viewerCore/./utils/guid.js","webpack://viewerCore/./services/MeasurementService/MeasurementService.js","webpack://viewerCore/./utils/hotkeys/pausePlugin.js","webpack://viewerCore/./services/MeasurementService/index.js","webpack://viewerCore/./classes/CommandsManager.js","webpack://viewerCore/./utils/hotkeys/recordPlugin.js","webpack://viewerCore/./utils/hotkeys/index.js","webpack://viewerCore/./classes/HotkeysManager.js","webpack://viewerCore/./user.js","webpack://viewerCore/./DICOMWeb/index.js","webpack://viewerCore/./DICOMWeb/getAttribute.js","webpack://viewerCore/./DICOMWeb/getAuthorizationHeader.js","webpack://viewerCore/./DICOMWeb/getModalities.js","webpack://viewerCore/./DICOMWeb/getName.js","webpack://viewerCore/./DICOMWeb/getNumber.js","webpack://viewerCore/./DICOMWeb/getString.js","webpack://viewerCore/./classes/OHIFError.js","webpack://viewerCore/./classes/ImageSet.js","webpack://viewerCore/./classes/metadata/Metadata.js","webpack://viewerCore/./classes/metadata/InstanceMetadata.js","webpack://viewerCore/./classes/metadata/SeriesMetadata.js","webpack://viewerCore/../node_modules/dicomweb-client/build/dicomweb-client.es.js","webpack://viewerCore/./utils/isDisplaySetReconstructable.js","webpack://viewerCore/./utils/isLowPriorityModality.js","webpack://viewerCore/./errorHandler.js","webpack://viewerCore/./utils/getImageSetCalculatedSpacings.js","webpack://viewerCore/./classes/metadata/StudyMetadata.js","webpack://viewerCore/./utils/cornerstoneWADOImageLoader.js","webpack://viewerCore/./utils/getWADORSImageId.js","webpack://viewerCore/./utils/getImageId.js","webpack://viewerCore/./utils/str2ab.js","webpack://viewerCore/./utils/metadataProvider/fetchPaletteColorLookupTableData.js","webpack://viewerCore/./utils/metadataProvider/unpackOverlay.js","webpack://viewerCore/./utils/metadataProvider/fetchOverlayData.js","webpack://viewerCore/./classes/MetadataProvider.js","webpack://viewerCore/./utils/metadataProvider/getPixelSpacingInformation.js","webpack://viewerCore/./utils/StackManager.js","webpack://viewerCore/./classes/StudyLoadingListener.js","webpack://viewerCore/./classes/TypeSafeCollection.js","webpack://viewerCore/./utils/studyMetadataManager.js","webpack://viewerCore/./classes/StudyMetadataSource.js","webpack://viewerCore/./studies/services/wado/getReferencedSeriesSequence.js","webpack://viewerCore/./studies/services/wado/studyInstanceHelpers.js","webpack://viewerCore/./studies/services/wado/retrieveMetadataLoader.js","webpack://viewerCore/./studies/services/wado/retrieveMetadataLoaderSync.js","webpack://viewerCore/./studies/getSeriesInfo.js","webpack://viewerCore/./studies/sortStudy.js","webpack://viewerCore/./studies/services/wado/retrieveMetadataLoaderAsync.js","webpack://viewerCore/./studies/services/wado/retrieveMetadata.js","webpack://viewerCore/./studies/retrieveStudyMetadata.js","webpack://viewerCore/./classes/OHIFStudyMetadataSource.js","webpack://viewerCore/./classes/index.js","webpack://viewerCore/./classes/StudyPrefetcher.js","webpack://viewerCore/./studies/services/qido/instances.js","webpack://viewerCore/./studies/services/qido/studies.js","webpack://viewerCore/./studies/services/index.js","webpack://viewerCore/./studies/searchStudies.js","webpack://viewerCore/./studies/index.js","webpack://viewerCore/./studies/retrieveStudiesMetadata.js","webpack://viewerCore/./studies/getStudyBoxData.js","webpack://viewerCore/./utils/absoluteUrl.js","webpack://viewerCore/./utils/addServers.js","webpack://viewerCore/./utils/b64toBlob.js","webpack://viewerCore/./utils/dicomLoaderService.js","webpack://viewerCore/./utils/loadAndCacheDerivedDisplaySets.js","webpack://viewerCore/./utils/sortBy.js","webpack://viewerCore/./utils/urlUtil.js","webpack://viewerCore/./utils/splitSeries.js","webpack://viewerCore/./utils/index.js","webpack://viewerCore/./utils/objectPath.js","webpack://viewerCore/./utils/writeScript.js","webpack://viewerCore/./utils/makeCancelable.js","webpack://viewerCore/./DICOMSR/utils/findInstanceMetadataBySopInstanceUid.js","webpack://viewerCore/./DICOMSR/parseDicomStructuredReport.js","webpack://viewerCore/./measurements/tools/arrowAnnotate.js","webpack://viewerCore/./measurements/tools/bidirectional.js","webpack://viewerCore/./measurements/tools/ellipticalRoi.js","webpack://viewerCore/./measurements/tools/circleRoi.js","webpack://viewerCore/./measurements/tools/freehandMouse.js","webpack://viewerCore/./measurements/tools/length.js","webpack://viewerCore/./measurements/tools/nonTarget.js","webpack://viewerCore/./measurements/tools/rectangleRoi.js","webpack://viewerCore/./measurements/tools/angle.js","webpack://viewerCore/./measurements/tools/targetCR.js","webpack://viewerCore/./measurements/tools/targetNE.js","webpack://viewerCore/./measurements/tools/targetUN.js","webpack://viewerCore/./measurements/tools/cobbAngle.js","webpack://viewerCore/./measurements/tools/probe.js","webpack://viewerCore/./measurements/toolGroups/allTools.js","webpack://viewerCore/./measurements/configuration.js","webpack://viewerCore/./measurements/dataExchange.js","webpack://viewerCore/./measurements/classes/TimepointApi.js","webpack://viewerCore/./measurements/lib/getLabel.js","webpack://viewerCore/./measurements/lib/getDescription.js","webpack://viewerCore/./measurements/lib/getImageIdForImagePath.js","webpack://viewerCore/./measurements/classes/MeasurementApi.js","webpack://viewerCore/./measurements/conformance/criteria/BaseCriterion.js","webpack://viewerCore/./measurements/conformance/criteria/Location.js","webpack://viewerCore/./measurements/conformance/criteria/MaxTargetsPerOrgan.js","webpack://viewerCore/./measurements/conformance/criteria/MaxTargets.js","webpack://viewerCore/./measurements/conformance/criteria/MeasurementsLength.js","webpack://viewerCore/./measurements/conformance/criteria/Modality.js","webpack://viewerCore/./measurements/conformance/criteria/NonTargetResponse.js","webpack://viewerCore/./measurements/conformance/criteria/TargetType.js","webpack://viewerCore/./measurements/conformance/CriteriaEvaluator.js","webpack://viewerCore/./measurements/conformance/evaluations/index.js","webpack://viewerCore/./measurements/conformance/ConformanceCriteria.js","webpack://viewerCore/./measurements/lib/getImageAttributes.js","webpack://viewerCore/./measurements/measurementHandlers/handleSingleMeasurementAdded.js","webpack://viewerCore/./measurements/measurementHandlers/handleChildMeasurementAdded.js","webpack://viewerCore/./measurements/measurementHandlers/handleSingleMeasurementModified.js","webpack://viewerCore/./measurements/measurementHandlers/handleChildMeasurementModified.js","webpack://viewerCore/./measurements/measurementHandlers/handleSingleMeasurementRemoved.js","webpack://viewerCore/./measurements/measurementHandlers/handleChildMeasurementRemoved.js","webpack://viewerCore/./measurements/measurementHandlers/index.js","webpack://viewerCore/./measurements/toolGroups/targets.js","webpack://viewerCore/./measurements/toolGroups/nonTargets.js","webpack://viewerCore/./measurements/toolGroups/temp.js","webpack://viewerCore/./measurements/ltTools.js","webpack://viewerCore/./measurements/index.js","webpack://viewerCore/./DICOMSR/utils/isToolSupported.js","webpack://viewerCore/./DICOMSR/parseMeasurementsData.js","webpack://viewerCore/./DICOMSR/utils/getAllDisplaySets.js","webpack://viewerCore/./DICOMSR/handleStructuredReport.js","webpack://viewerCore/./DICOMSR/utils/findMostRecentStructuredReport.js","webpack://viewerCore/./DICOMSR/index.js","webpack://viewerCore/./DICOMSR/dataExchange.js","webpack://viewerCore/./cornerstone.js","webpack://viewerCore/./classes/metadata/OHIFInstanceMetadata.js","webpack://viewerCore/./classes/metadata/OHIFSeriesMetadata.js","webpack://viewerCore/./classes/metadata/OHIFStudyMetadata.js","webpack://viewerCore/./classes/metadata/index.js","webpack://viewerCore/./utils/isImage.js","webpack://viewerCore/./utils/sopClassDictionary.js","webpack://viewerCore/./hanging-protocols/lib/validate.js","webpack://viewerCore/./hanging-protocols/customAttributes.js","webpack://viewerCore/./hanging-protocols/HPMatcher.js","webpack://viewerCore/./hanging-protocols/customViewportSettings.js","webpack://viewerCore/./hanging-protocols/lib/comparators.js","webpack://viewerCore/./hanging-protocols/classes/Rule.js","webpack://viewerCore/./hanging-protocols/classes/rules.js","webpack://viewerCore/./hanging-protocols/lib/removeFromArray.js","webpack://viewerCore/./hanging-protocols/classes/ViewportStructure.js","webpack://viewerCore/./hanging-protocols/classes/Viewport.js","webpack://viewerCore/./hanging-protocols/classes/Stage.js","webpack://viewerCore/./hanging-protocols/classes/Protocol.js","webpack://viewerCore/./hanging-protocols/ProtocolEngine.js","webpack://viewerCore/./hanging-protocols/lib/sortByScore.js","webpack://viewerCore/./hanging-protocols/protocolStore/classes/ProtocolStore.js","webpack://viewerCore/./hanging-protocols/protocolStore/defaultProtocol.js","webpack://viewerCore/./hanging-protocols/index.js","webpack://viewerCore/./hanging-protocols/protocolStore/classes/ProtocolStrategy.js","webpack://viewerCore/./header.js","webpack://viewerCore/./object.js","webpack://viewerCore/./redux/actions.js","webpack://viewerCore/./redux/constants/ActionTypes.js","webpack://viewerCore/./redux/reducers/extensions.js","webpack://viewerCore/./redux/reducers/loading.js","webpack://viewerCore/./redux/reducers/preferences.js","webpack://viewerCore/./redux/reducers/servers.js","webpack://viewerCore/./redux/reducers/studies.js","webpack://viewerCore/./redux/reducers/timepointManager.js","webpack://viewerCore/./redux/reducers/viewports.js","webpack://viewerCore/./redux/index.js","webpack://viewerCore/./redux/reducers/index.js","webpack://viewerCore/./string.js","webpack://viewerCore/./ui/index.js","webpack://viewerCore/./ui/getScrollbarSize.js","webpack://viewerCore/./ui/getOffset.js","webpack://viewerCore/./ui/isCharacterKeyPress.js","webpack://viewerCore/./ui/handleError.js","webpack://viewerCore/./index.js","webpack://viewerCore/external \"cornerstone-wado-image-loader\""],"names":["root","factory","exports","module","require","define","amd","window","__WEBPACK_EXTERNAL_MODULE__7__","__WEBPACK_EXTERNAL_MODULE__12__","__WEBPACK_EXTERNAL_MODULE__18__","__WEBPACK_EXTERNAL_MODULE__28__","__WEBPACK_EXTERNAL_MODULE__43__","__WEBPACK_EXTERNAL_MODULE__275__","webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","installedModules","0","__webpack_require__","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","oe","err","console","error","jsonpArray","oldJsonpFunction","slice","s","instance","Constructor","TypeError","_defineProperties","target","props","descriptor","configurable","writable","protoProps","staticProps","_getPrototypeOf","setPrototypeOf","getPrototypeOf","__proto__","obj","asyncGeneratorStep","gen","resolve","reject","_next","_throw","arg","info","done","Promise","then","fn","self","this","args","arguments","apply","undefined","subClass","superClass","constructor","_typeof","assertThisInitialized","iterator","arrayWithoutHoles","iterableToArray","unsupportedIterableToArray","nonIterableSpread","arr","baseClone","CLONE_DEEP_FLAG","arrayWithHoles","iterableToArrayLimit","nonIterableRest","freeGlobal","freeSelf","Function","isArray","Array","type","validate","attributes","constraints","options","v","extend","results","runValidations","some","isPromise","Error","processValidationResults","forEach","source","attr","version","major","minor","patch","metadata","toString","format","isEmpty","EMPTY_STRING_REGEXP","validatorName","validators","validator","validatorOptions","isDomElement","isJqueryElement","collectFormValues","getDeepObjectValue","result","attribute","globalOptions","errors","pruneEmptyErrors","expandMultipleErrors","convertErrorMessages","formatters","async","WrapErrors","wrapErrors","cleanAttributes","waitForResults","single","fullMessages","reduce","memo","isNumber","isNaN","isFunction","isInteger","isBoolean","isObject","isDate","Date","isDefined","isString","jquery","querySelectorAll","querySelector","document","HTMLElement","nodeType","nodeName","test","str","vals","replace","FORMAT_REGEXP","m0","m1","m2","String","prettify","parseFloat","Math","round","toFixed","map","join","toLowerCase","stringifyValue","isHash","contains","indexOf","unique","array","filter","el","index","forEachKeyInKeypath","keypath","callback","escape","form","j","input","inputs","option","values","item","getAttribute","sanitizeFormValue","checked","multiple","selected","_val","selectedIndex","trim","nullify","capitalize","toUpperCase","ret","msg","errorInfo","groupErrorsByAttribute","list","flattenErrorsToArray","whitelist","whitelistCreator","last","cleanRecursive","w","ow","buildObjectWhitelist","exposeModule","warn","presence","allowEmpty","message","is","maximum","minimum","tokenizer","val","wrongLength","count","tooShort","tooLong","notValid","numericality","checks","greaterThan","greaterThanOrEqualTo","equalTo","lessThan","lessThanOrEqualTo","divisibleBy","strict","pattern","onlyInteger","RegExp","noStrings","notInteger","odd","notOdd","even","notEven","datetime","parse","earliest","NaN","latest","dateOnly","tooEarly","date","tooLate","match","flags","exec","inclusion","within","exclusion","email","PATTERN","equality","otherValue","comparator","v1","v2","url","schemes","allowLocal","regex","tld","detailed","flat","grouped","constraint","sort","baseIsNative","getValue","ReferenceError","getRawTag","objectToString","symToStringTag","checkDataType","dataType","negate","EQUAL","AND","OK","NOT","copy","to","checkDataTypes","dataTypes","code","types","toHash","null","number","integer","coerceToTypes","optionCoerceTypes","COERCE_TO_TYPES","getProperty","escapeQuotes","equal","ucs2length","varOccurences","dataVar","matches","varReplace","expr","cleanUpCode","out","EMPTY_ELSE","EMPTY_IF_NO_ELSE","EMPTY_IF_WITH_ELSE","finalCleanUpCode","ERRORS_REGEXP","REMOVE_ERRORS_ASYNC","RETURN_ASYNC","REMOVE_ERRORS","ROOTDATA_REGEXP","REMOVE_ROOTDATA","schemaHasRules","schema","rules","schemaHasRulesExcept","exceptKeyword","schemaUnknownRules","toQuotedString","getPathExpr","currentPath","jsonPointers","joinPaths","getPath","prop","path","escapeJsonPointer","getData","$data","lvl","paths","up","jsonPointer","JSON_POINTER","RELATIVE_JSON_POINTER","segments","split","segment","unescapeJsonPointer","unescapeFragment","decodeURIComponent","escapeFragment","encodeURIComponent","hash","IDENTIFIER","SINGLE_QUOTE","a","b","other","assignValue","baseAssignValue","customizer","isNew","newValue","ListCache","stackClear","stackDelete","stackGet","stackHas","stackSet","Stack","entries","__data__","size","clear","has","set","listCacheClear","listCacheDelete","listCacheGet","listCacheHas","listCacheSet","entry","eq","nativeCreate","getNative","isKeyable","arrayLikeKeys","baseKeys","isArrayLike","stubFalse","freeExports","freeModule","Buffer","isBuffer","webpackPolyfill","deprecate","children","isLength","baseKeysIn","DataView","Map","Set","WeakMap","baseGetTag","toSource","dataViewCtorString","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","getTag","ArrayBuffer","Ctor","ctorString","isSymbol","strictUriEncode","decodeComponent","splitOnFirst","validateArrayFormatSeparator","encode","decode","removeHash","hashStart","extract","queryStart","parseValue","parseNumbers","Number","parseBooleans","assign","arrayFormat","arrayFormatSeparator","formatter","accumulator","concat","parserForArrayFormat","param","includes","keys","k","Boolean","keysSorter","stringify","shouldFilter","skipNull","skipEmptyString","encoderForArrayFormat","objectCopy","x","parseUrl","query","stringifyUrl","queryFromUrl","parsedQueryFromUrl","getHash","queryString","_REVERSE_MAP","_MAP","8","9","13","16","17","18","20","27","32","33","34","35","36","37","38","39","40","45","46","91","93","224","_KEYCODE_MAP","106","107","109","110","111","186","187","188","189","190","191","192","219","220","221","222","_SHIFT_MAP","_SPECIAL_ALIASES","navigator","platform","Mousetrap","action","_bindMultiple","unbind","trigger","_directMap","reset","_callbacks","stopCallback","e","element","className","_belongsTo","ancestor","parentNode","composedPath","initialEventTarget","tagName","isContentEditable","handleKey","_handleKey","addKeycodes","init","documentMousetrap","method","charAt","_addEvent","addEventListener","attachEvent","_characterFromEvent","character","fromCharCode","which","shiftKey","_isModifier","_pickBestAction","modifiers","_getReverseMap","_getKeyInfo","combination","_keysFromString","targetElement","_resetTimer","_sequenceLevels","_ignoreNextKeyup","_ignoreNextKeypress","_nextExpectedAction","_resetSequences","doNotReset","activeSequences","_getMatches","sequenceName","level","modifiers1","modifiers2","seq","metaKey","ctrlKey","deleteCombo","combo","deleteSequence","splice","_fireCallback","sequence","srcElement","preventDefault","returnValue","_preventDefault","stopPropagation","cancelBubble","_stopPropagation","_handleKeyEvent","keyCode","altKey","_eventModifiers","_bindSequence","_increaseSequence","nextAction","clearTimeout","setTimeout","_callbackAndReset","wrappedCallback","_bindSingle","callbacks","maxLevel","processedSequenceCallback","max","ignoreThisKeypress","combinations","_setPrototypeOf","tag","mapCacheClear","mapCacheDelete","mapCacheGet","mapCacheHas","mapCacheSet","MapCache","baseIsArguments","isObjectLike","objectProto","propertyIsEnumerable","isArguments","reIsUint","baseIsTypedArray","baseUnary","nodeUtil","nodeIsTypedArray","isTypedArray","func","freeProcess","process","binding","arrayFilter","stubArray","nativeGetSymbols","getOwnPropertySymbols","getSymbols","symbol","getPrototype","overArg","Uint8Array","arrayBuffer","byteLength","reIsDeepProp","reIsPlainProp","URI","util","SchemaObject","traverse","compile","ref","refVal","_refs","_schemas","inlineRef","_opts","inlineRefs","_compile","baseId","res","resolveSchema","refPath","_getFullPath","getFullPath","_getId","id","normalizeId","resolveRecursive","getJsonPointer","parsedRef","resolveUrl","fullPath","ids","schemaId","baseIds","fullPaths","localRefs","allKeys","sch","jsonPtr","rootSchema","parentJsonPtr","parentKeyword","parentSchema","keyIndex","PREVENT_SCOPE_CHANGE","fragment","parts","part","$ref","SIMPLE_INLINED","limit","checkNoRef","countKeys","Infinity","normalize","serialize","TRAILING_SLASH_HASH","valueOf","MissingRefError","missingRef","missingSchema","errorSubclass","Subclass","Validation","ajv","validation","MissingRef","isNativeReflectConstruct","_construct","Parent","Class","Reflect","construct","baseIteratee","baseUniq","iteratee","arrayLikeToArray","minLen","from","len","arr2","wrapped","global","funcToString","objValue","baseTimes","isIndex","inherited","isArr","isArg","isBuff","isType","skipIndexes","transform","allocUnsafe","buffer","isDeep","arrayPush","getSymbolsIn","offset","baseGetAllKeys","keysFunc","symbolsFunc","cloneArrayBuffer","typedArray","byteOffset","baseCreate","isPrototype","baseIsEqualDeep","baseIsEqual","bitmask","stack","SetCache","arraySome","cacheHas","equalFunc","isPartial","arrLength","othLength","stacked","seen","arrValue","othValue","compared","othIndex","setCacheAdd","setCacheHas","add","cache","srcValue","castPath","toKey","isKey","stringToPath","opts","cmp","f","cycles","node","aobj","bobj","toJSON","isFinite","JSON","seenIndex","it","$keyword","$ruleType","$async","$refKeywords","RULES","all","$id","strictKeywords","$unknownKwd","keywords","$keywordsMsg","logger","isTop","sourceCode","processCode","$lvl","$dataLvl","dataLevel","$schema","$schemaPath","schemaPath","$errSchemaPath","errSchemaPath","$breakOnError","allErrors","$valid","$$outStack","createErrors","messages","verbose","__err","pop","compositeRule","$top","rootId","dataPathArr","default","useDefaults","strictDefaults","$defaultMsg","$closingBraces1","$closingBraces2","$typeSchema","$typeIsArray","nullable","extendRefs","$comment","coerceTypes","$coerceToTypes","$rulesGroup","$shouldUseGroup","$method","$dataType","$coerced","$bracesCoercion","arr1","$type","$i","l1","$parentData","i2","l2","properties","arr3","$propertyKey","i3","l3","$sch","$passData","useDefault","items","arr4","l4","arr5","$rule","i5","l5","$shouldUseRule","$code","keyword","implements","impl","$ruleImplementsSomeKeyword","$schemaValue","$isData","$isMax","$exclusiveKeyword","$schemaExcl","$isDataExcl","$op","$notOp","$errorKeyword","$schemaValueExcl","$exclusive","$exclType","$exclIsNumber","$opStr","$opExpr","unicode","isNativeFunction","_wrapNativeSuper","_cache","Wrapper","iterable","asyncIterator","AsyncGenerator","baseMerge","merge","createAssigner","srcIndex","compileSchema","Cache","stableStringify","formats","$dataMetaSchema","Ajv","schemaKeyRef","getSchema","schemaObj","_addSchema","valid","_meta","addSchema","_skipValidation","checkUnique","addMetaSchema","skipValidation","validateSchema","throwOrLogError","defaultMeta","meta","META_SCHEMA_ID","errorsText","keyRef","_getSchemaObj","_fragments","_getSchemaFragment","removeSchema","_removeAllSchemas","del","cacheKey","addFormat","_formats","separator","text","dataPath","shouldAddSchema","cached","addUsedSchema","recursiveMeta","willValidate","put","compiling","callValidate","currentOpts","_metaOpts","refs","_validate","compileAsync","customKeyword","addKeyword","getKeyword","removeKeyword","remove","validateKeyword","errorClasses","ValidationError","META_IGNORE_OPTIONS","META_SUPPORT_DATA","log","noop","setLogger","_loadingSchemas","_compilations","_get$IdOrId","_get$Id","chooseGetId","loopRequired","errorDataPath","_errorDataPathProperty","metaOpts","getMetaSchemaOptions","addInitialFormats","addInitialKeywords","$dataSchema","metaSchema","addDefaultMetaSchema","optsSchemas","schemas","addInitialSchemas","_arr","_n","_d","_e","_s","_i","next","iter","runtime","Op","hasOwn","$Symbol","iteratorSymbol","asyncIteratorSymbol","toStringTagSymbol","wrap","innerFn","outerFn","tryLocsList","protoGenerator","Generator","generator","context","Context","_invoke","state","doneResult","delegate","delegateResult","maybeInvokeDelegate","ContinueSentinel","sent","_sent","dispatchException","abrupt","record","tryCatch","makeInvokeMethod","GeneratorFunction","GeneratorFunctionPrototype","IteratorPrototype","getProto","NativeIteratorPrototype","Gp","defineIteratorMethods","AsyncIterator","PromiseImpl","previousPromise","callInvokeWithMethodAndArg","invoke","__await","unwrapped","resultName","nextLoc","pushTryEntry","locs","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","resetTryEntry","completion","iteratorMethod","displayName","isGeneratorFunction","genFun","ctor","mark","awrap","reverse","skipTempReset","prev","stop","rootRecord","rval","exception","handle","loc","caught","hasCatch","hasFinally","finallyEntry","complete","finish","thrown","delegateYield","regeneratorRuntime","accidentalStrictMode","charCodeAt","singleMatcher","multiMatcher","decodeComponents","components","left","right","tokens","encodedURI","replaceMap","customDecodeURIComponent","string","separatorIndex","sham","Proxy","AwaitValue","front","back","resume","wrappedAwait","settle","request","arrayEach","baseAssign","baseAssignIn","cloneBuffer","copyArray","copySymbols","copySymbolsIn","getAllKeys","getAllKeysIn","initCloneArray","initCloneByTag","initCloneObject","isMap","isSet","cloneableTags","isFlat","isFull","isFunc","subValue","keysIn","assocIndexOf","pairs","LARGE_ARRAY_SIZE","isMasked","reIsHostCtor","funcProto","reIsNative","g","nativeObjectToString","isOwn","unmasked","uid","coreJsData","maskSrcKey","IE_PROTO","Hash","hashClear","hashDelete","hashGet","hashHas","hashSet","getMapData","copyObject","typedArrayTags","nativeKeys","nativeKeysIn","isProto","predicate","resIndex","cloneDataView","cloneRegExp","cloneSymbol","cloneTypedArray","dataView","reFlags","regexp","lastIndex","symbolProto","symbolValueOf","objectCreate","proto","baseIsMap","nodeIsMap","baseIsSet","nodeIsSet","baseMatches","baseMatchesProperty","identity","baseIsMatch","getMatchData","matchesStrictComparable","matchData","noCustomizer","COMPARE_PARTIAL_FLAG","equalArrays","equalByTag","equalObjects","objectTag","objIsArr","othIsArr","objTag","othTag","objIsObj","othIsObj","isSameTag","objIsWrapped","othIsWrapped","objUnwrapped","othUnwrapped","mapToArray","setToArray","convert","objProps","objLength","skipCtor","objCtor","othCtor","isStrictComparable","hasIn","baseGet","defaultValue","memoizeCapped","rePropName","reEscapeChar","quote","subString","memoize","resolver","memoized","baseToString","arrayMap","symbolToString","baseHasIn","hasPath","hasFunc","baseProperty","basePropertyDeep","arrayIncludes","arrayIncludesWith","createSet","isCommon","outer","computed","baseIndexOf","baseFindIndex","baseIsNaN","strictIndexOf","fromIndex","fromRight","assignMergeValue","baseFor","baseMergeDeep","safeGet","createBaseFor","isArrayLikeObject","isPlainObject","toPlainObject","mergeFunc","isTyped","objectCtorString","baseRest","isIterateeCall","assigner","sources","guard","overRest","setToString","start","nativeMax","otherArgs","thisArg","baseSetToString","shortOut","constant","nativeNow","now","lastCalled","stamp","remaining","validateGenerator","checkCompiling","compIndex","endCompiling","patternCode","patterns","defaultCode","refValCode","customRuleCode","vars","statement","patternsHash","defaults","defaultsHash","customRules","compilation","localCompile","cv","_schema","_root","isRoot","errorPath","resolveRef","usePattern","useCustomRule","makeValidate","_refVal","refCode","refIndex","resolvedRef","rootRefId","addLocalRef","localSchema","refId","replaceLocalRef","removeLocalRef","inline","regexStr","valueStr","rule","deps","definition","dependencies","every","macro","_len","sets","_key","xl","subexp","typeOf","buildExps","isIRI","HEXDIG$$","PCT_ENCODED$","SUB_DELIMS$$","RESERVED$$","IPRIVATE$$","UNRESERVED$$","SCHEME$","USERINFO$","DEC_OCTET_RELAXED$","IPV4ADDRESS$","H16$","LS32$","IPV6ADDRESS1$","IPV6ADDRESS2$","IPV6ADDRESS3$","IPV6ADDRESS4$","IPV6ADDRESS5$","IPV6ADDRESS6$","IPV6ADDRESS7$","IPV6ADDRESS8$","IPV6ADDRESS9$","IPV6ADDRESS$","ZONEID$","IPV6ADDRZ_RELAXED$","IPVFUTURE$","IP_LITERAL$","REG_NAME$","HOST$","PORT$","DIGIT$$","AUTHORITY$","PCHAR$","SEGMENT$","SEGMENT_NZ$","SEGMENT_NZ_NC$","PATH_ABEMPTY$","PATH_ABSOLUTE$","PATH_NOSCHEME$","PATH_ROOTLESS$","PATH_EMPTY$","QUERY$","FRAGMENT$","HIER_PART$","URI$","RELATIVE_PART$","RELATIVE$","NOT_SCHEME","NOT_USERINFO","NOT_HOST","NOT_PATH","NOT_PATH_NOSCHEME","NOT_QUERY","NOT_FRAGMENT","ESCAPE","UNRESERVED","OTHER_CHARS","PCT_ENCODED","IPV4ADDRESS","IPV6ADDRESS","URI_PROTOCOL","IRI_PROTOCOL","slicedToArray","sliceIterator","maxInt","regexPunycode","regexNonASCII","regexSeparators","floor","stringFromCharCode","error$1","RangeError","mapDomain","encoded","ucs2decode","output","counter","extra","digitToBasic","digit","flag","adapt","delta","numPoints","firstTime","baseMinusTMin","base","codePoint","inputLength","bias","basic","lastIndexOf","oldi","baseMinusT","fromCodePoint","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_step","_iterator","_currentValue2","return","basicLength","handledCPCount","_iteratorNormalCompletion2","_didIteratorError2","_iteratorError2","_step2","_iterator2","currentValue","handledCPCountPlusOne","_iteratorNormalCompletion3","_didIteratorError3","_iteratorError3","_step3","_iterator3","_currentValue","q","qMinusT","punycode","SCHEMES","pctEncChar","chr","pctDecChars","newStr","il","parseInt","substr","c2","_c","c3","_normalizeComponentEncoding","protocol","decodeUnreserved","decStr","scheme","userinfo","host","_stripLeadingZeros","_normalizeIPv4","address","_normalizeIPv6","_matches2","zone","_address$toLowerCase$","_address$toLowerCase$2","first","firstFields","lastFields","isLastFieldIPv4Address","fieldCount","lastFieldsStart","fields","longestZeroFields","acc","field","lastLongest","newHost","newFirst","newLast","URI_PARSE","NO_MATCH_IS_UNDEFINED","uriString","iri","reference","port","schemeHandler","unicodeSupport","domainHost","_recomposeAuthority","uriTokens","_","$1","$2","RDS1","RDS2","RDS3","RDS5","removeDotSegments","im","authority","absolutePath","resolveComponents","relative","skipNormalization","tolerant","unescapeComponent","handler","handler$1","O","VCHAR$$","NOT_LOCAL_PART","NOT_HFNAME","NOT_HFVALUE","handler$2","mailtoComponents","unknownHeaders","headers","hfields","hfield","toAddrs","_x","_xl","subject","body","_x2","_xl2","addr","setInterval","toAddr","atIdx","localPart","domain","URN_PARSE","handler$3","urnComponents","nid","nss","urnScheme","uriComponents","UUID","handler$4","uuidComponents","uuid","baseURI","relativeURI","schemelessOptions","uri","uriA","uriB","escapeComponent","pos","cb","_traverse","pre","post","arrayKeywords","propsKeywords","skipKeywords","additionalItems","additionalProperties","propertyNames","not","allOf","anyOf","oneOf","definitions","patternProperties","enum","const","required","exclusiveMaximum","exclusiveMinimum","multipleOf","maxLength","minLength","maxItems","minItems","uniqueItems","maxProperties","minProperties","DATE","DAYS","TIME","HOSTNAME","URITEMPLATE","URL","JSON_POINTER_URI_FRAGMENT","year","month","day","isLeapYear","time","full","hour","minute","second","timeZone","fast","hostname","ipv4","ipv6","dateTime","DATE_TIME_SEPARATOR","NOT_URI_FRAGMENT","Z_ANCHOR","ruleModules","ALL","group","implKeywords","custom","$refCode","$refVal","$message","missingRefs","$it","$nextValid","passContext","__callValidate","$closingBraces","$currentBaseId","$allSchemasEmpty","$errs","$wasComposite","$idx","$dataNxt","$nextData","$nonEmptySchema","$schemaDeps","$propertyDeps","$ownProperties","ownProperties","$property","$deps","$currentErrorPath","$useData","$prop","$propertyPath","$missingProperty","$vSchema","$unknownFormats","unknownFormats","$allowUnknown","$format","$isObject","$formatType","$formatRef","$thenSch","$elseSch","$thenPresent","$elsePresent","$ifClause","$additionalItems","$currErrSchemaPath","multipleOfPrecision","$allErrorsOption","$prevValid","$passingSchemas","$key","$dataProperties","$schemaKeys","$pProperties","$pPropertyKeys","$aProperties","$someProperties","$noAdditional","$additionalIsSchema","$removeAdditional","removeAdditional","$checkAdditional","$required","$requiredHash","i1","$pProperty","$additionalProperty","$useDefaults","$hasDefault","i4","$invalidName","$propertySch","$loopRequired","$itemType","KEYWORDS","keywordsJsonPointers","loadSchema","loadMetaSchemaOf","_compileAsync","loadMissingSchema","added","schemaPromise","removePromise","definitionSchema","_addRule","ruleGroup","rg","throwError","_validateKeyword","$compile","$inline","$macro","$ruleValidate","$validateCode","$definition","$rDef","$validateSchema","$ruleErrs","$ruleErr","$asyncKeyword","statements","$parentDataProperty","def_callRuleValidate","modifying","def_customError","simpleTypes","COMMANDS","PANEL","SOP_CLASS_HANDLER","TOOLBAR","VIEWPORT","trace","debug","timeEnd","ExtensionManager","commandsManager","servicesManager","appConfig","registeredExtensionIds","moduleTypeNames","MODULE_TYPES","_commandsManager","_servicesManager","_appConfig","moduleType","extensions","extension","ohifExtension","configuration","registerExtension","extensionId","random","preRegistration","extensionModule","_getExtensionModule","_initSpecialModuleTypes","lower","getModuleFnName","getModuleFn","ex","defaultContext","_initCommandsModule","commandDefinitions","getContext","createContext","commandName","commandDefinition","registerCommand","ServicesManager","services","registeredServiceNames","service","ohifService","registerService","serviceShowRequestQueue","publicAPI","hide","serviceImplementation","_hide","show","title","duration","position","autoClose","_show","setServiceImplementation","hideImplementation","showImplementation","showArguments","content","contentProps","shouldCloseOnEsc","isOpen","closeButton","customClassName","dismiss","_dismiss","dismissAll","_dismissAll","onStart","onDrag","onStop","centralize","preservePosition","isDraggable","showOverlay","defaultPosition","_create","dismissImplementation","dismissAllImplementation","createImplementation","guid","getFourRandomValues","substring","_originalStopCallback","MEASUREMENT_SCHEMA_KEYS","EVENTS","MEASUREMENT_UPDATED","MEASUREMENT_ADDED","VALUE_TYPES","POLYLINE","POINT","ELLIPSE","MULTIPOINT","CIRCLE","MeasurementService","_arrayOfObjects","mappings","measurements","listeners","measurement","addOrUpdate","measurementId","getAnnotation","matchingCriteria","toSourceSchema","toMeasurementSchema","_isValidSource","mapping","_getSourceInfo","_getMappingByMeasurementSource","getMeasurement","matchingMapping","_getMatchingMapping","sourceMeasurement","sourceInfo","_sourceHasMappings","find","_isValidMeasurement","internalId","newMeasurement","modifiedTimestamp","_broadcastChange","eventName","_isValidEvent","listenerId","subscription","unsubscribe","_unsubscribe","points","hasListeners","hasCallbacks","listener","measurementData","CommandsManager","getAppState","getActiveContexts","contexts","_getAppState","_getActiveContexts","contextName","clearContext","foundCommand","activeContext","getCommand","commandFn","storeContexts","definitionOptions","commandParams","appState","_recordedSequence","_recordedSequenceCallback","_currentRecordedKeys","_recordedCharacterKey","_origHandleKey","recording","_recordCurrentCombo","_recordKey","_finishRecording","y","_normalizeSequence","stopRecord","startRecording","recordPlugin","paused","pause","unpause","HotkeysManager","hotkeyDefinitions","hotkeyDefaults","isEnabled","event","hotkeys","_getValidDefinitions","registerHotkeys","UINotificationService","_parseToArrayLike","hotkeyDefinitionsObj","entryValue","_parseToHotKeyObj","propertyName","propertyValue","label","previouslyRegisteredDefinition","previouslyRegisteredKeys","_unbindHotkeys","_bindHotkeys","setHotkeys","combinedKey","evt","runCommand","user","userLoggedIn","getUserId","getName","getAccessToken","login","logout","setData","DICOMWeb","Value","padFour","convertToInt","getAuthorizationHeader","requestOptions","accessToken","auth","Authorization","btoa","getModalities","Modality","ModalitiesInStudy","modalities","vr","Alphabetic","getNumber","getString","OHIFError","_getImagePositionPatient","image","ImagePositionPatient","ImageSet","images","sortingCallback","referenceImagePositionPatient","refIppVec","Vector3","ImageOrientationPatient","scanAxisNormal","cross","distanceImagePairs","ippVec","distance","clone","sub","dot","sortedImages","Metadata","_data","_uid","_custom","attributeMap","_hasOwn","InstanceMetadata","defineProperties","_imageId","_definePublicProperties","getSOPInstanceUID","getTagValue","tagOrProperty","getIndexedValue","idx","frame","hasIndexValues","splitValues","isValidIndex","indexedValue","SeriesMetadata","_seriesInstanceUID","_instances","_firstInstance","getSeriesInstanceUID","getInstanceByUID","found","getInstanceByIndex","isValidUID","isValidCallback","series","stringToUint8Array","containsToken","token","findToken","maxSearchLength","searchLength","min","s4","multipartDecode","response","headerIndex","boundaryString","header","identifyBoundary","itemLimit","uint8ArrayToString","boundaryIndex","boundary","boundaryLength","headerTokenIndex","isEmptyObject","getFirstResult","getFirstResultIfLengthGtOne","MEDIATYPES","api","DICOMwebClient","_classCallCheck","baseURL","username","password","qidoURLPrefix","qidoURL","wadoURLPrefix","wadoURL","stowURLPrefix","stowURL","params","mediaType","sepIndex","mediaTypeType","_assertMediaTypeIsValid","mediaTypes","supportedMediaTypes","fieldValueParts","transferSyntaxUID","fieldValue","endsWith","expectedMediaTypes","actualType","_parseMediaType","expectedMediaType","expectedType","byteRange","commonMediaTypes","startsWith","_this","XMLHttpRequest","open","responseType","setRequestHeader","userHeaders","onloadstart","onloadend","onreadystatechange","readyState","status","progressCallback","onprogress","send","_httpRequest","urlWithQueryParams","_parseQueryParameters","Accept","_httpGet","acceptHeaderFieldValue","_buildAcceptHeaderFieldValue","rendered","Range","_buildRangeHeaderFieldValue","_buildMultipartAcceptHeaderFieldValue","defaultMediaType","acceptableMediaTypes","_httpPost","queryParams","_httpGetApplicationJson","studyInstanceUID","seriesInstanceUID","contentType","transferSyntax","sopInstanceUID","paramString","frameNumbers","_httpGetMultipartApplicationOctetStream","commonMediaType","_getCommonMediaType","_httpGetMultipartImage","_httpGetMultipartVideo","_httpGetImage","_httpGetVideo","_httpGetText","_httpGetApplicationPdf","_httpGetMultipartApplicationDicom","BulkDataURI","_multipartEncode","datasets","contentTypeString","footer","headerArray","footerArray","headerLength","footerLength","contentArrays","datasetBuffer","contentArray","contentLength","multipartArray","multipartEncode","isDisplaySetReconstructable","instances","firstInstance","isMultiframe","NumberOfFrames","constructableModalities","firstImage","firstImageRows","Rows","firstImageColumns","Columns","firstImageSamplesPerPixel","SamplesPerPixel","firstImageOrientationPatient","firstImagePositionPatient","_isSameOrientation","lastIpp","missingFrames","processSingleframe","iop1","iop2","abs","iopTolerance","LOW_PRIORITY_MODALITIES","freeze","isLowPriorityModality","errorHandler","getHTTPErrorHandler","getImageSetCalculatedSpacings","imageSet","num","imagePos","imageOrient","xPos","yPos","zPos","dst_normal_IOP_x","dst_normal_IOP_y","dst_normal_IOP_z","calculatedSpacings","mostUnique","spacings","thisPosition","newZ","unique_values","fill","spacing","maxCountIndex","_getImageSetCalculatedSpacings","StudyMetadata","_studyInstanceUID","_series","_displaySets","_derivedDisplaySets","_firstSeries","getStudyInstanceUID","sopClassHandlerModules","study","displaySets","getInstanceCount","displaySet","seriesData","setAttributes","displaySetInstanceUID","SeriesInstanceUID","SeriesDescription","SeriesNumber","combinedId","sopClassUIDs","uniqueSopClassUIDsInSeries","forEachInstance","instanceSopClassUID","getSopClassUIDs","sopClassHandlerExtensions","SOPClassUID","handlersForSopClassUID","plugin","errorInterceptor","dicomWebClient","dwc","wadoRoot","getDisplaySetFromSeries","getFirstInstance","_getDisplaySetFromSopClassModule","sopClassModule","isDerived","_addDerivedDisplaySet","stackableInstances","isMultiFrame","makeDisplaySet","isClip","StudyInstanceUID","numImageFrames","InstanceNumber","AcquisitionDatetime","isSingleImageModality","setAttribute","referencedSeriesInstanceUID","referencedFrameOfReferenceUID","filteredDerivedDisplaySets","ReferencedSeriesSequence","ReferencedSeries","ReferencedFrameOfReferenceUID","getSeriesCount","forEachSeries","displaySetsForSeries","_createDisplaySetsForSeries","sortDisplaySetList","containsSeries","addDisplaySet","sortDisplaySets","getSeriesByUID","isSubSeries","getSeriesIndexByCustomId","getCustomSeriesInstanceUID","sum","displaySetsMapping","forEachDisplaySet","getSeries","seriesIndex","getSeriesByIndex","findDisplaySet","getImageId","firstSeries","getFirstSeries","findInstance","findSeriesAndInstanceByInstance","customId","findIndex","SeriesDate","SeriesTime","getSeriesNumber","getSeriesDescription","frameRate","sortBy","getImage","isReconstructable","sortByImagePositionPatient","seriesSortingCriteria","isLowPriorityA","isLowPriorityB","sortBySeriesNumber","getCornerstoneWADOImageLoader","getWADORSImageId","wadorsuri","getWADORSImageUrl","updateQueryStringParameter","thumbnail","renderingAttr","imageId","wadouri","str2ab","strLen","bytes","fetchPaletteColorLookupTableData","server","PaletteColorLookupTableUID","RedPaletteColorLookupTableDescriptor","GreenPaletteColorLookupTableDescriptor","BluePaletteColorLookupTableDescriptor","RedPaletteColorLookupTableData","GreenPaletteColorLookupTableData","BluePaletteColorLookupTableData","_paletteColorCache","promises","_getPaletteColor","maxAge","paletteColorLookupTableData","lutDescriptor","numLutEntries","bits","readUInt16","byteArray","arrayBufferToPaletteColorLUT","arraybuffer","lut","config","retrieveBulkData","InlineBinary","atob","unpackOverlay","bitArray","byteIndex","bitIndex","bitByteIndex","fetchOverlayData","OverlayDataPromises","OverlayDataTags","overlayGroup","groupStr","OverlayDataTag","_getOverlayData","dicomWeb","metadataProvider","dicomJSONDatasetOrP10ArrayBuffer","dicomData","dcmjs","DicomMessage","readFile","dicomJSONDataset","dict","naturalizedDataset","DicomMetaDictionary","naturalizeDataset","SOPInstanceUID","_getAndCacheStudy","_getAndCacheSeriesFromStudy","_getAndCacheInstanceFromStudy","_checkBulkDataAndInlineBinaries","uids","imageIdToUIDs","studies","PhotometricInterpretation","_getUIDsFromImageID","_getInstanceData","fallback","_getInstance","INSTANCE","getTagFromInstance","naturalizedTagOrWADOImageLoaderTag","_getCornerstoneWADOImageLoaderTag","wadoImageLoaderTag","WADO_IMAGE_LOADER_TAGS","GENERAL_SERIES_MODULE","seriesDate","seriesTime","dicomParser","parseDA","parseTM","modality","seriesNumber","seriesDescription","PATIENT_STUDY_MODULE","patientAge","PatientAge","patientSize","PatientSize","patientWeight","PatientWeight","IMAGE_PLANE_MODULE","rowPixelSpacing","columnPixelSpacing","rowCosines","columnCosines","PixelSpacing","ImagerPixelSpacing","PixelSpacingCalibrationType","PixelSpacingCalibrationDescription","EstimatedRadiographicMagnificationFactor","SequenceOfUltrasoundRegions","isProjection","TYPES","CorrectedImagerPixelSpacing","pixelSpacing","PhysicalDeltaX","PhysicalDeltaY","getPixelSpacingInformation","frameOfReferenceUID","FrameOfReferenceUID","rows","columns","imageOrientationPatient","imagePositionPatient","sliceThickness","SliceThickness","sliceLocation","SliceLocation","IMAGE_PIXEL_MODULE","samplesPerPixel","photometricInterpretation","bitsAllocated","BitsAllocated","bitsStored","BitsStored","highBit","HighBit","pixelRepresentation","PixelRepresentation","planarConfiguration","PlanarConfiguration","pixelAspectRatio","PixelAspectRatio","smallestPixelValue","SmallestPixelValue","largestPixelValue","LargestPixelValue","redPaletteColorLookupTableDescriptor","greenPaletteColorLookupTableDescriptor","bluePaletteColorLookupTableDescriptor","redPaletteColorLookupTableData","greenPaletteColorLookupTableData","bluePaletteColorLookupTableData","VOI_LUT_MODULE","WindowCenter","WindowWidth","windowCenter","windowWidth","MODALITY_LUT_MODULE","rescaleIntercept","RescaleIntercept","rescaleSlope","RescaleSlope","rescaleType","RescaleType","SOP_COMMON_MODULE","sopClassUID","PET_ISOTOPE_MODULE","RadiopharmaceuticalInformationSequence","RadiopharmaceuticalInformation","RadiopharmaceuticalStartTime","RadionuclideTotalDose","RadionuclideHalfLife","radiopharmaceuticalInfo","radiopharmaceuticalStartTime","radionuclideTotalDose","radionuclideHalfLife","OVERLAY_PLANE_MODULE","overlays","OverlayData","OverlayRowsTag","OverlayColumnsTag","OverlayType","OverlayOriginTag","OverlayDescriptionTag","OverlayLabelTag","ROIAreaTag","ROIMeanTag","ROIStandardDeviationTag","OverlayOrigin","overlay","pixelData","description","roiArea","roiMean","roiStandardDeviation","PATIENT_MODULE","patientName","PatientName","patientId","PatientID","GENERAL_IMAGE_MODULE","instanceNumber","lossyImageCompression","LossyImageCompression","lossyImageCompressionRatio","LossyImageCompressionRatio","lossyImageCompressionMethod","LossyImageCompressionMethod","GENERAL_STUDY_MODULE","studyDescription","StudyDescription","studyDate","StudyDate","studyTime","StudyTime","accessionNumber","AccessionNumber","CINE_MODULE","frameTime","FrameTime","splitImageId","qs","studyUID","seriesUID","objectUID","stackMap","stackUpdatedCallbacks","createAndAddStack","numImages","imageIds","imageIndex","metaData","naturalizedInstance","frameNumber","addImageIdToUIDs","StackManager","clearStacks","makeAndAddStack","findStack","findOrCreateStack","getAllStacks","addStackUpdatedCallback","getConfiguration","setConfiguration","BaseLoadingListener","getNewId","startListening","statsItemsLimit","stats","total","elapsedTime","speed","_setProgressData","_clearProgressById","_addStatsData","_updateProgress","newItem","oldestItem","getTime","progressId","_getProgressId","stopListening","_clearProgress","timeSlice","randomNumber","DICOMFileLoadingListener","_imageLoadProgressEventHandler","eventData","detail","dataSetUrl","_convertImageIdToDataSetUrl","bytesDiff","loaded","_lastLoaded","_dataSetUrl","_getDataSetUrl","_checkCachedData","cornerstoneWADOImageLoader","dataSet","dataSetCacheManager","dataSetLength","percentComplete","imageLoadProgressEventName","_getImageLoadProgressEventName","imageLoadProgressEventHandler","_imageLoadProgressEventHandle","cornerstone","events","imageLoadProgressEventHandle","removeEventListener","progressData","multiFrame","bytesLoaded","bytesTotal","bytesPerSecond","StackLoadingListener","imageDataMap","_convertImageIdsArrayToMap","framesStatus","_createArray","loadedCount","imageIdsMap","IMAGE_LOADED","IMAGE_CACHE_PROMISE_REMOVED","_updateFrameStatus","imageLoadedEventName","_getImageLoadedEventName","imageCachePromiseRemovedEventName","_getImageCachePromiseRemoveEventName","imageLoadedEventHandler","_imageLoadedEventHandler","imageCachePromiseRemovedEventHandler","_imageCachePromiseRemovedEventHandler","imageData","totalFramesCount","loadedFramesCount","loadingFramesCount","framesPerSecond","progressBar","ch","StudyLoadingListener","stackMetaData","_createListener","addStack","addStudy","displaySetInstanceUIDs","destroy","_getSchema","colonIndex","_instance","TypeSafeCollection","_operationCount","_elementList","_handlers","silent","payload","_elements","handlers","_isFunction","insert","_elementWithPayload","_invalidate","_elementWithId","_trigger","propertyMap","findAllEntriesBy","foundCount","removed","_isObject","_compareToPropertyMapStrict","_sortListBy","_isString","_getPropertyValue","targetObject","fragments","fragmentCount","firstFragment","remainingFragments","specifiers","order","_isValidSortingSpecifier","specifierCount","specifier","aValue","bValue","studyMetadataList","studyMetadata","findBy","purge","removeAll","StudyMetadataSource","getReferencedSeriesSequence","referencedSeriesSequenceRaw","referencedSeriesSequence","referencedSeries","referencedInstanceSequenceRaw","referencedInstanceSequence","referencedInstance","referencedSOPClassUID","referencedSOPInstanceUID","createStudy","aSopInstance","seriesMap","seriesLoader","wadoUriRoot","qidoRoot","NumberOfStudyRelatedInstances","InstitutionName","buildInstanceWadoUrl","buildInstanceWadoRsUri","buildInstanceFrameWadoRsUri","baseWadoRsUri","makeSOPInstance","addInstance","sopInstance","imageRendering","thumbnailRendering","wadoRSMetadata","wadorsImageId","wadors","metaDataManager","addInstancesToStudy","sopInstanceList","createStudyFromSOPInstanceList","firstSopInstance","RetrieveMetadataLoader","filters","configLoad","preLoad","preLoadData","load","loadData","posLoad","postLoadData","loaders","loader","RetrieveMetadataLoaderSync","client","retrieveSeriesMetadata","retrieveStudyMetadata","getLoaders","runLoaders","INFO","getSeriesInfo","isLowPriority","seriesSortCriteria","seriesInfoSortingCriteria","secondSeries","instancesSortCriteria","sortingCriteria","sortStudySeries","sortStudyInstances","instancesList","instancesSortingCriteria","attachSeriesLoader","hasNext","sopInstances","makeSeriesAsyncLoader","seriesInstanceUIDList","RetrieveMetadataLoaderAsync","preLoaders","searchForSeries","getPreLoaders","seriesSorted","seriesInstanceUIDsMap","seriesAsyncLoader","asyncLoader","seriesDataFromQIDO","enableStudyLazyLoad","retrieveMetadataLoader","execLoad","RetrieveMetadata","StudyMetaDataPromises","promise","OHIFStudyMetadataSource","OHIF","viewer","Studies","_updateStudyCollections","getByInstanceUID","studyInfo","createDisplaySets","setDisplaySets","getDisplaySets","studyMetadataManager","classes","MetadataProvider","StudyPrefetcher","prefetchDisplaySetsTimeout","lastActiveViewportElement","cacheFullHandler","stopPrefetching","prefetchDisplaySets","cornerstoneTools","requestPoolManager","clearRequestStack","timeout","prefetchDisplaySetsHandler","displaySetsToPrefetch","getDisplaySetsToPrefetch","displaySetCount","getImageIdsFromDisplaySets","prefetchImageIds","nonCachedImageIds","filterCachedImageIds","addRequest","startGrabbing","instanceMetadata","displaySetImage","getActiveViewportImage","getStudy","prefetchOrder","topdown","downward","closest","activeDisplaySet","selectedDisplaySets","begin","end","activeDisplaySetIndex","getImageIdsFromDisplaySet","numFrames","isImageCached","imageCache","sizeInBytes","resultDataToStudyMetadata","resultData","dateToString","getFullYear","getMonth","getDate","repeat","resultDataToStudies","referringPhysicianName","PatientBirthdate","patientSex","studyId","numberOfStudyRelatedSeries","numberOfStudyRelatedInstances","qidoSupportsIncludeField","serverSupportsQIDOIncludeField","commaSeparatedFields","parameters","fuzzymatching","includefield","studyDateFrom","studyDateTo","dateFrom","dateTo","studyUIDs","getQIDOQueryParams","searchForStudies","WADO","QIDO","Instances","searchForInstances","studySearchPromises","loadingDict","deleteStudyMetadataPromise","retrieveStudiesMetadata","studyInstanceUIDs","getStudyBoxData","searchStudies","promiseKeyObj","promiseKey","sortStudy","deepSort","absoluteUrl","location","origin","absoluteUrlParts","rootUrlPrefixIndex","addServers","servers","store","serverType","endpoint","dispatch","b64toBlob","b64Data","sliceSize","byteCharacters","byteArrays","byteNumbers","blob","Blob","imageObj","findImageIdOnStudies","someInvalidStrings","strings","getImageInstance","dataset","getImageInstanceId","imageInstance","fetchIt","fetch","cornerstoneRetriever","loadAndCacheImage","wadorsRetriever","retrieveInstance","dicomLoaderService","localFile","loadFileRequest","getDicomDataMethod","loaderRegExp","loaderType","getImageLoaderType","authorizationHeaders","wadoUri","getLocalData","getDataByImageType","getDataByDatasetType","loaderIterator","getLoaderIterator","loadAndCacheDerivedDisplaySets","referencedDisplaySet","derivedDisplaySets","getDerivedDatasets","displaySetsPerModality","isLoaded","recentDisplaySet","recentDateTime","n_fields","A","B","primer","toLowerCaseFirstLetter","word","toParse","lib","getQueryFilters","search","searchParameters","isValidPath","paramPatternPiece","parseParam","paramStr","_paramDecoded","strToDecode","decoded","replaceParam","paramKey","paramValue","paramPattern","processMRSeries","manufacturer","manufacturerLowerCase","subSeriesInstances","splitInstances","Manufacturer","MR","descriptionSuffix","subInstances","SubSeriesIndex","ruleSet","rulesLength","uniqueValues","indexes","getMetadataValueFromRule","valString","getValueString","subSeriesIndex","objectKeys","utils","ObjectPath","getPathComponents","isValidObject","currentObject","isValid","writeScript","fileName","script","createElement","src","onload","appendChild","DicomLoaderService","urlUtil","makeCancelable","thenable","isCanceled","cancel","splitSeries","findInstanceMetadataBySopInstanceUID","instanceFound","getImagePath","frameIndex","parseDicomStructuredReport","part10SRArrayBuffer","storedMeasurementByToolType","Cornerstone","MeasurementReport","generateToolState","measurementNumber","toolName","sopInstanceUid","_study","imagePath","toolData","timepointId","toolType","_id","arrowAnnotate","toolGroup","cornerstoneToolType","measurementTable","displayFunction","caseProgress","include","evaluate","bidirectional","shortestDiameter","longestDiameter","ellipticalRoi","meanValue","cachedStats","mean","circleRoi","freehandMouse","meanStdDev","lengthValue","unit","nonTarget","rectangleRoi","angle","rAngle","targetCR","targetNE","targetUN","cobbAngle","probe","handles","childTools","tools","measurementApiDefaultConfig","measurementTools","newLesions","toolGroupId","dataExchange","retrieve","timepointIds","timepointData","update","disassociate","TIMEPOINT_TYPE_NAMES","prebaseline","baseline","followup","TimepointApi","currentTimepointId","Instance","initialize","comparisonTimepointKey","timepoints","onTimepointsUpdated","timepoint","visitNumber","tp1","tp2","visitDate","tp","timepointType","retrievalFn","timepointIndex","reason","storeFn","disassociateFn","retrieveTimepoints","removeFn","tpIndex","updateFn","locked","current","prior","comparisonTimepoint","comparison","userComparison","nextBaselineAfterCurrent","currentTimepoint","allNextTimepoints","latestInitialBeforeNextFUIndex","timepointToCheck","latestInitialTimepointAfterCurrent","visitDateToCheck","preBaselineTimepointIds","baselineTimepointIds","currentVisitDate","nadir","timepointKey","resultIncludes","timepointTypeName","calculateVisitNumber","timepointName","currentIndex","parenthesis","1","parenthesisText","lesionNamingNumber","MeasurementApi","timepointApi","temporaryDeletedMeasurement","getTemporaryDeletedMeasurements","addTemporaryDeletedMeasurements","temporaryDeleted","clearTemporaryDeletedMeasurement","toolsGroupsMap","tool","getToolsGroupsMap","measurementLabel","getLabel","labels","toolState","globalImageIdSpecificToolStateManager","saveToolState","getToolConfiguration","childToolKey","childMeasurement","syncMeasurementAndToolData","getImageIdForImagePath","currentToolState","alreadyExists","restoreToolState","toolGroups","toolGroupTools","getToolGroupTools","onMeasurementsUpdated","measurementTypeId","addMeasurement","syncMeasurementsAndToolData","getEnabledElements","enabledElement","updateImage","processMeasurementData","isToolIncluded","timepointFilter","sortedMeasurements","toolId","toolItemId","toolConfig","parentTool","currentMeasurement","initialTimepointIds","initialtpid","lesionExistsAtTimepoints","groupId","toolGroupMeasurement","isNewLesionsMeasurement","maxTargetMeasurementNumber","calculateLesionMaxMeasurementNumber","maxNonTargetMeasurementNumber","maxNewTargetMeasurementNumber","calculateNewLesionMaxMeasurementNumber","maxNewNonTargetMeasurementNumber","additionalData","TrialPatientLocationUID","childToolTypes","childToolType","collectionToUpdate","propertyFilter","increment","updateNumbering","groupCollection","collection","relatedMeasurement","emptyItem","groupTool","createdAt","measurementsInTimepoint","calculateLesionNamingNumber","calculateMeasurementNumber","addedMeasurement","updateObject","getPreviousMeasurement","isSplitLesion","isNodal","getDescription","hasDuplicateMeasurementNumber","toolIndex","updated","persist","groupIndex","timepointsWithDeletedMeasurement","lesionNamingNumberFilter","tGroup","childTool","updateMeasurementNumberForAllMeasurements","filterKeys","groupItems","filterKey","groupItem","measurementsData","measurementEntries","measurementEntry","mEntry","onMeasurementRemoved","syncFilter","syncFilterKeys","syncFilterKey","BaseCriterion","criterionName","passed","isGlobal","baselineMeasurementNumbers","newTargetNumbers","newTarget","targets","LocationSchema","LocationCriterion","nonTargets","generateResponse","MaxTargetsPerOrganSchema","MaxTargetsPerOrganCriterion","targetsPerOrgan","getNewTargetNumbers","MaxTargetsSchema","locationIn","locationNotIn","MaxTargetsCriterion","measurementNumbers","lesionType","plural","amount","MeasurementsLengthSchema","longAxis","shortAxis","longAxisSliceThicknessMultiplier","shortAxisSliceThicknessMultiplier","modalityIn","modalityNotIn","MeasurementsLengthCriterion","longMultiplier","shortMultiplier","childToolsCount","child","ModalitySchema","measurementTypes","ModalityCriterion","modalitiesSet","validationMethod","invalidModalities","measurementType","uniqueModalities","uniqueModalitiesText","modalityText","NonTargetResponseSchema","NonTargetResponseCriterion","TargetTypeSchema","TargetTypeCriterion","Criteria","initialCriteria","CriteriaEvaluator","criteriaObject","criteriaValidator","getCriteriaValidator","criteria","criterionkey","optionsObject","Criterion","criterion","newTargetMatch","criterionDefinition","nonconformities","criterionResult","criterionKey","criterionDefinitions","recist11","evaluations","initialEvaluations","ConformanceCriteria","measurementApi","groupedNonConformities","maxTargets","maxNewTargets","loadStudy","trialCriteriaType","baselinePromise","followupPromise","baselineData","followupData","mergedData","resultBoth","validateTimepoint","resultBaseline","resultFollowup","groupNonConformities","groups","nonConformity","globals","groupName","measureNumber","evaluators","getEvaluators","evaluator","getMaxTargets","resultItem","trialCriteriaTypeId","evaluation","evaluationTimepoint","studyPromises","fillData","evaluationKey","evaluationDefinitions","getEnabledElement","handleSingleMeasurementAdded","cancelled","getImageAttributes","userId","imageAttributes","parentMeasurement","updateMeasurement","viewport","getViewport","handleSingleMeasurementRemoved","deleteMeasurements","measurementIndex","getEventData","MeasurementHandlers","handleChildMeasurementAdded","handleSingleMeasurementModified","handleChildMeasurementModified","handleChildMeasurementRemoved","onAdded","getInstance","onModified","onRemoved","cloneDeep","temp","ltTools","isToolSupported","adapters","parseMeasurementsData","unsupportedTools","annotation","generateReport","getAllDisplaySets","allDisplaySets","retrieveMeasurementFromSR","serverUrl","stowSRFromMeasurements","DicomDict","FileMetaInformationVersion","MediaStorageSOPClassUID","MediaStorageSOPInstanceUID","TransferSyntaxUID","ImplementationClassUID","ImplementationVersionName","denaturalized","denaturalizeDataset","dicomDict","part10Buffer","write","storeInstances","isStructuredReportSeries","compareSeriesDate","series1","series2","findMostRecentStructuredReport","mostRecentStructuredReport","DICOMSR","retrieveMeasurements","latestSeries","storeMeasurements","firstMeasurementKey","firstMeasurement","OHIFInstanceMetadata","_sopInstanceUID","bypassCache","rawValue","instanceData","OHIFSeriesMetadata","OHIFStudyMetadata","addSeries","imagesTypes","equals","doesNotEqual","doesNotContain","CustomAttributeRetrievalCallbacks","HPMatcher","metadataInstance","details","failed","requiredFailed","score","customAttribute","setCustomAttribute","errorMessages","testConstraint","attributeValue","customAttributeExists","getCustomAttribute","weight","CustomViewportSettings","comparators","validatorOption","EQUALS_REGEXP","Rule","_constraintInfo","_validatorAndValue","constraintInfo","ruleConstraint","isRuleForPrior","ruleValidatorAndValue","getConstraintValidatorAndValue","intValue","validatorAndValue","getConstraintInfo","currentValidator","ProtocolMatchingRule","StudyMatchingRule","SeriesMatchingRule","ImageMatchingRule","removeFromArray","indexToRemove","ViewportStructure","Viewport","viewportSettings","imageMatchingRules","seriesMatchingRules","studyMatchingRules","ruleObject","fromObject","Stage","viewportStructure","viewports","createdDate","currentStage","clonedStage","viewportObject","Protocol","hasUpdatedPriorsInformation","modifiedDate","createdBy","modifiedBy","availableTo","editableBy","protocolMatchingRules","stages","numberOfPriorsReferenced","skipCache","stage","priorsReferenced","getNumberOfPriorsReferenced","updateNumberOfPriorsReferenced","stageObject","currentProtocol","clonedProtocol","protocolWasModified","ProtocolEngine","protocolStore","priorStudies","studyMetadataSource","matchedProtocols","matchedProtocolScores","newStageIds","getBestProtocolMatch","setHangingProtocol","matched","studyInstance","numberOfAvailablePriors","getNumberOfAvailablePriors","getObjectID","getProtocol","_clearMatchedProtocols","findMatchByStudy","matchedDetail","highestScoringProtocolId","_largestKeyByValue","updateProtocolMatches","bestMatch","_getHighestScoringProtocol","studyObjectID","getAvailableStudyPriors","priors","viewportIndex","instanceMatchingRules","matchingScores","currentStudy","highestStudyMatchingScore","highestSeriesMatchingScore","priorStudy","validatorType","abstractPriorValue","studyIndex","priorStudyObjectID","updateViewports","studyMatchDetails","seriesMatchDetails","instanceMatchDetails","matchDetails","totalMatchScore","currentSOPInstanceUID","imageDetails","currentImageIdIndex","matchingScore","sortingInfo","getUID","sortingFunction","numRows","numColumns","setLayout","numViewports","getNumProtocolStages","stageModel","getCurrentStageModel","getLayoutTemplateName","layoutProps","viewportData","matchImages","cornerstoneViewportParams","viewportSettingsKeys","currentViewportData","customSettings","renderedCallback","customSetting","currentMatch","currentPosition","scoresLength","setViewportSpecificData","viewportSpecificData","newProtocol","isPrototypeOf","numberOfStages","stageAction","isPreviousStageAvailable","isNextStageAvailable","setCurrentProtocolStage","ProtocolStore","strategy","onReady","protocolId","getProtocolInstance","addProtocol","updateProtocol","removeProtocol","protocolObject","protocolInstance","defaultProtocol","oneByOne","getDefaultProtocol","hangingProtocols","ProtocolStrategy","defaultsAdded","addCustomAttribute","attributeId","attributeName","addCustomViewportSetting","settingId","settingName","getNestedObject","shallowObject","nestedObject","propertyArray","currentProperty","getShallowObject","putValues","baseKey","resultObject","currentKey","actions","setViewportActive","setViewportLayoutAndData","clearViewportSpecificData","setActiveViewportSpecificData","setStudyLoadingProgress","clearStudyLoadingProgress","setUserPreferences","setExtensionData","setTimepoints","setMeasurements","setStudyData","setServers","defaultState","extensionName","currentData","incomingData","progress","lastUpdated","loading","windowLevelData","2","3","4","5","6","7","10","generalPreferences","preferences","uniqBy","active","newServer","newServers","studyData","updatedStudyData","timepointManager","DEFAULT_STATE","activeViewportIndex","layout","findActiveViewportSpecificData","currentViewportSpecificData","numberOfViewports","getActiveViewportIndex","currentActiveViewportIndex","redux","reducers","useActiveViewport","encodeId","ui","getScrollbarSize","inner","style","width","height","top","visibility","overflow","w1","offsetWidth","h1","offsetHeight","w2","h2","clientWidth","clientHeight","removeChild","getOffset","offsetParent","offsetLeft","offsetTop","isCharacterKeyPress","handleError","class","hideConfirm","cancelLabel","cancelClass","ViewerCore","UIModalService","UIDialogService"],"mappings":"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","file":"dist/index.umd.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"cornerstone-core\"), require(\"dcmjs\"), require(\"cornerstone-tools\"), require(\"cornerstone-math\"), require(\"dicom-parser\"), require(\"cornerstone-wado-image-loader\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"cornerstone-core\", \"dcmjs\", \"cornerstone-tools\", \"cornerstone-math\", \"dicom-parser\", \"cornerstone-wado-image-loader\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"viewerCore\"] = factory(require(\"cornerstone-core\"), require(\"dcmjs\"), require(\"cornerstone-tools\"), require(\"cornerstone-math\"), require(\"dicom-parser\"), require(\"cornerstone-wado-image-loader\"));\n\telse\n\t\troot[\"viewerCore\"] = factory(root[\"cornerstone-core\"], root[\"dcmjs\"], root[\"cornerstone-tools\"], root[\"cornerstone-math\"], root[\"dicom-parser\"], root[\"cornerstone-wado-image-loader\"]);\n})(window, function(__WEBPACK_EXTERNAL_MODULE__7__, __WEBPACK_EXTERNAL_MODULE__12__, __WEBPACK_EXTERNAL_MODULE__18__, __WEBPACK_EXTERNAL_MODULE__28__, __WEBPACK_EXTERNAL_MODULE__43__, __WEBPACK_EXTERNAL_MODULE__275__) {\nreturn "," \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t};\n\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t0: 0\n \t};\n\n\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"dist/\" + chunkId + \".index.umd.js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = window[\"webpackJsonpviewerCore\"] = window[\"webpackJsonpviewerCore\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 268);\n","function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nmodule.exports = _classCallCheck;","function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nmodule.exports = _createClass;","module.exports = require(\"regenerator-runtime\");\n","function _getPrototypeOf(o) {\n module.exports = _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}\n\nmodule.exports = _getPrototypeOf;","function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nmodule.exports = _defineProperty;","function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n\n if (info.done) {\n resolve(value);\n } else {\n Promise.resolve(value).then(_next, _throw);\n }\n}\n\nfunction _asyncToGenerator(fn) {\n return function () {\n var self = this,\n args = arguments;\n return new Promise(function (resolve, reject) {\n var gen = fn.apply(self, args);\n\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n\n _next(undefined);\n });\n };\n}\n\nmodule.exports = _asyncToGenerator;","var setPrototypeOf = require(\"./setPrototypeOf\");\n\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n if (superClass) setPrototypeOf(subClass, superClass);\n}\n\nmodule.exports = _inherits;","module.exports = __WEBPACK_EXTERNAL_MODULE__7__;","var _typeof = require(\"../helpers/typeof\");\n\nvar assertThisInitialized = require(\"./assertThisInitialized\");\n\nfunction _possibleConstructorReturn(self, call) {\n if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n return call;\n }\n\n return assertThisInitialized(self);\n}\n\nmodule.exports = _possibleConstructorReturn;","function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n module.exports = _typeof = function _typeof(obj) {\n return typeof obj;\n };\n } else {\n module.exports = _typeof = function _typeof(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n}\n\nmodule.exports = _typeof;","var arrayWithoutHoles = require(\"./arrayWithoutHoles\");\n\nvar iterableToArray = require(\"./iterableToArray\");\n\nvar unsupportedIterableToArray = require(\"./unsupportedIterableToArray\");\n\nvar nonIterableSpread = require(\"./nonIterableSpread\");\n\nfunction _toConsumableArray(arr) {\n return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread();\n}\n\nmodule.exports = _toConsumableArray;","var baseClone = require('./_baseClone');\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n CLONE_SYMBOLS_FLAG = 4;\n\n/**\n * This method is like `_.clone` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @returns {*} Returns the deep cloned value.\n * @see _.clone\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var deep = _.cloneDeep(objects);\n * console.log(deep[0] === objects[0]);\n * // => false\n */\nfunction cloneDeep(value) {\n return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n}\n\nmodule.exports = cloneDeep;\n","module.exports = __WEBPACK_EXTERNAL_MODULE__12__;","var arrayWithHoles = require(\"./arrayWithHoles\");\n\nvar iterableToArrayLimit = require(\"./iterableToArrayLimit\");\n\nvar unsupportedIterableToArray = require(\"./unsupportedIterableToArray\");\n\nvar nonIterableRest = require(\"./nonIterableRest\");\n\nfunction _slicedToArray(arr, i) {\n return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();\n}\n\nmodule.exports = _slicedToArray;","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","module.exports = __WEBPACK_EXTERNAL_MODULE__18__;","/*!\n * validate.js 0.12.0\n *\n * (c) 2013-2017 Nicklas Ansman, 2013 Wrapp\n * Validate.js may be freely distributed under the MIT license.\n * For all details and documentation:\n * http://validatejs.org/\n */\n\n(function(exports, module, define) {\n \"use strict\";\n\n // The main function that calls the validators specified by the constraints.\n // The options are the following:\n // - format (string) - An option that controls how the returned value is formatted\n // * flat - Returns a flat array of just the error messages\n // * grouped - Returns the messages grouped by attribute (default)\n // * detailed - Returns an array of the raw validation data\n // - fullMessages (boolean) - If `true` (default) the attribute name is prepended to the error.\n //\n // Please note that the options are also passed to each validator.\n var validate = function(attributes, constraints, options) {\n options = v.extend({}, v.options, options);\n\n var results = v.runValidations(attributes, constraints, options)\n , attr\n , validator;\n\n if (results.some(function(r) { return v.isPromise(r.error); })) {\n throw new Error(\"Use validate.async if you want support for promises\");\n }\n return validate.processValidationResults(results, options);\n };\n\n var v = validate;\n\n // Copies over attributes from one or more sources to a single destination.\n // Very much similar to underscore's extend.\n // The first argument is the target object and the remaining arguments will be\n // used as sources.\n v.extend = function(obj) {\n [].slice.call(arguments, 1).forEach(function(source) {\n for (var attr in source) {\n obj[attr] = source[attr];\n }\n });\n return obj;\n };\n\n v.extend(validate, {\n // This is the version of the library as a semver.\n // The toString function will allow it to be coerced into a string\n version: {\n major: 0,\n minor: 12,\n patch: 0,\n metadata: null,\n toString: function() {\n var version = v.format(\"%{major}.%{minor}.%{patch}\", v.version);\n if (!v.isEmpty(v.version.metadata)) {\n version += \"+\" + v.version.metadata;\n }\n return version;\n }\n },\n\n // Below is the dependencies that are used in validate.js\n\n // The constructor of the Promise implementation.\n // If you are using Q.js, RSVP or any other A+ compatible implementation\n // override this attribute to be the constructor of that promise.\n // Since jQuery promises aren't A+ compatible they won't work.\n Promise: typeof Promise !== \"undefined\" ? Promise : /* istanbul ignore next */ null,\n\n EMPTY_STRING_REGEXP: /^\\s*$/,\n\n // Runs the validators specified by the constraints object.\n // Will return an array of the format:\n // [{attribute: \"\", error: \"\"}, ...]\n runValidations: function(attributes, constraints, options) {\n var results = []\n , attr\n , validatorName\n , value\n , validators\n , validator\n , validatorOptions\n , error;\n\n if (v.isDomElement(attributes) || v.isJqueryElement(attributes)) {\n attributes = v.collectFormValues(attributes);\n }\n\n // Loops through each constraints, finds the correct validator and run it.\n for (attr in constraints) {\n value = v.getDeepObjectValue(attributes, attr);\n // This allows the constraints for an attribute to be a function.\n // The function will be called with the value, attribute name, the complete dict of\n // attributes as well as the options and constraints passed in.\n // This is useful when you want to have different\n // validations depending on the attribute value.\n validators = v.result(constraints[attr], value, attributes, attr, options, constraints);\n\n for (validatorName in validators) {\n validator = v.validators[validatorName];\n\n if (!validator) {\n error = v.format(\"Unknown validator %{name}\", {name: validatorName});\n throw new Error(error);\n }\n\n validatorOptions = validators[validatorName];\n // This allows the options to be a function. The function will be\n // called with the value, attribute name, the complete dict of\n // attributes as well as the options and constraints passed in.\n // This is useful when you want to have different\n // validations depending on the attribute value.\n validatorOptions = v.result(validatorOptions, value, attributes, attr, options, constraints);\n if (!validatorOptions) {\n continue;\n }\n results.push({\n attribute: attr,\n value: value,\n validator: validatorName,\n globalOptions: options,\n attributes: attributes,\n options: validatorOptions,\n error: validator.call(validator,\n value,\n validatorOptions,\n attr,\n attributes,\n options)\n });\n }\n }\n\n return results;\n },\n\n // Takes the output from runValidations and converts it to the correct\n // output format.\n processValidationResults: function(errors, options) {\n errors = v.pruneEmptyErrors(errors, options);\n errors = v.expandMultipleErrors(errors, options);\n errors = v.convertErrorMessages(errors, options);\n\n var format = options.format || \"grouped\";\n\n if (typeof v.formatters[format] === 'function') {\n errors = v.formatters[format](errors);\n } else {\n throw new Error(v.format(\"Unknown format %{format}\", options));\n }\n\n return v.isEmpty(errors) ? undefined : errors;\n },\n\n // Runs the validations with support for promises.\n // This function will return a promise that is settled when all the\n // validation promises have been completed.\n // It can be called even if no validations returned a promise.\n async: function(attributes, constraints, options) {\n options = v.extend({}, v.async.options, options);\n\n var WrapErrors = options.wrapErrors || function(errors) {\n return errors;\n };\n\n // Removes unknown attributes\n if (options.cleanAttributes !== false) {\n attributes = v.cleanAttributes(attributes, constraints);\n }\n\n var results = v.runValidations(attributes, constraints, options);\n\n return new v.Promise(function(resolve, reject) {\n v.waitForResults(results).then(function() {\n var errors = v.processValidationResults(results, options);\n if (errors) {\n reject(new WrapErrors(errors, options, attributes, constraints));\n } else {\n resolve(attributes);\n }\n }, function(err) {\n reject(err);\n });\n });\n },\n\n single: function(value, constraints, options) {\n options = v.extend({}, v.single.options, options, {\n format: \"flat\",\n fullMessages: false\n });\n return v({single: value}, {single: constraints}, options);\n },\n\n // Returns a promise that is resolved when all promises in the results array\n // are settled. The promise returned from this function is always resolved,\n // never rejected.\n // This function modifies the input argument, it replaces the promises\n // with the value returned from the promise.\n waitForResults: function(results) {\n // Create a sequence of all the results starting with a resolved promise.\n return results.reduce(function(memo, result) {\n // If this result isn't a promise skip it in the sequence.\n if (!v.isPromise(result.error)) {\n return memo;\n }\n\n return memo.then(function() {\n return result.error.then(function(error) {\n result.error = error || null;\n });\n });\n }, new v.Promise(function(r) { r(); })); // A resolved promise\n },\n\n // If the given argument is a call: function the and: function return the value\n // otherwise just return the value. Additional arguments will be passed as\n // arguments to the function.\n // Example:\n // ```\n // result('foo') // 'foo'\n // result(Math.max, 1, 2) // 2\n // ```\n result: function(value) {\n var args = [].slice.call(arguments, 1);\n if (typeof value === 'function') {\n value = value.apply(null, args);\n }\n return value;\n },\n\n // Checks if the value is a number. This function does not consider NaN a\n // number like many other `isNumber` functions do.\n isNumber: function(value) {\n return typeof value === 'number' && !isNaN(value);\n },\n\n // Returns false if the object is not a function\n isFunction: function(value) {\n return typeof value === 'function';\n },\n\n // A simple check to verify that the value is an integer. Uses `isNumber`\n // and a simple modulo check.\n isInteger: function(value) {\n return v.isNumber(value) && value % 1 === 0;\n },\n\n // Checks if the value is a boolean\n isBoolean: function(value) {\n return typeof value === 'boolean';\n },\n\n // Uses the `Object` function to check if the given argument is an object.\n isObject: function(obj) {\n return obj === Object(obj);\n },\n\n // Simply checks if the object is an instance of a date\n isDate: function(obj) {\n return obj instanceof Date;\n },\n\n // Returns false if the object is `null` of `undefined`\n isDefined: function(obj) {\n return obj !== null && obj !== undefined;\n },\n\n // Checks if the given argument is a promise. Anything with a `then`\n // function is considered a promise.\n isPromise: function(p) {\n return !!p && v.isFunction(p.then);\n },\n\n isJqueryElement: function(o) {\n return o && v.isString(o.jquery);\n },\n\n isDomElement: function(o) {\n if (!o) {\n return false;\n }\n\n if (!o.querySelectorAll || !o.querySelector) {\n return false;\n }\n\n if (v.isObject(document) && o === document) {\n return true;\n }\n\n // http://stackoverflow.com/a/384380/699304\n /* istanbul ignore else */\n if (typeof HTMLElement === \"object\") {\n return o instanceof HTMLElement;\n } else {\n return o &&\n typeof o === \"object\" &&\n o !== null &&\n o.nodeType === 1 &&\n typeof o.nodeName === \"string\";\n }\n },\n\n isEmpty: function(value) {\n var attr;\n\n // Null and undefined are empty\n if (!v.isDefined(value)) {\n return true;\n }\n\n // functions are non empty\n if (v.isFunction(value)) {\n return false;\n }\n\n // Whitespace only strings are empty\n if (v.isString(value)) {\n return v.EMPTY_STRING_REGEXP.test(value);\n }\n\n // For arrays we use the length property\n if (v.isArray(value)) {\n return value.length === 0;\n }\n\n // Dates have no attributes but aren't empty\n if (v.isDate(value)) {\n return false;\n }\n\n // If we find at least one property we consider it non empty\n if (v.isObject(value)) {\n for (attr in value) {\n return false;\n }\n return true;\n }\n\n return false;\n },\n\n // Formats the specified strings with the given values like so:\n // ```\n // format(\"Foo: %{foo}\", {foo: \"bar\"}) // \"Foo bar\"\n // ```\n // If you want to write %{...} without having it replaced simply\n // prefix it with % like this `Foo: %%{foo}` and it will be returned\n // as `\"Foo: %{foo}\"`\n format: v.extend(function(str, vals) {\n if (!v.isString(str)) {\n return str;\n }\n return str.replace(v.format.FORMAT_REGEXP, function(m0, m1, m2) {\n if (m1 === '%') {\n return \"%{\" + m2 + \"}\";\n } else {\n return String(vals[m2]);\n }\n });\n }, {\n // Finds %{key} style patterns in the given string\n FORMAT_REGEXP: /(%?)%\\{([^\\}]+)\\}/g\n }),\n\n // \"Prettifies\" the given string.\n // Prettifying means replacing [.\\_-] with spaces as well as splitting\n // camel case words.\n prettify: function(str) {\n if (v.isNumber(str)) {\n // If there are more than 2 decimals round it to two\n if ((str * 100) % 1 === 0) {\n return \"\" + str;\n } else {\n return parseFloat(Math.round(str * 100) / 100).toFixed(2);\n }\n }\n\n if (v.isArray(str)) {\n return str.map(function(s) { return v.prettify(s); }).join(\", \");\n }\n\n if (v.isObject(str)) {\n return str.toString();\n }\n\n // Ensure the string is actually a string\n str = \"\" + str;\n\n return str\n // Splits keys separated by periods\n .replace(/([^\\s])\\.([^\\s])/g, '$1 $2')\n // Removes backslashes\n .replace(/\\\\+/g, '')\n // Replaces - and - with space\n .replace(/[_-]/g, ' ')\n // Splits camel cased words\n .replace(/([a-z])([A-Z])/g, function(m0, m1, m2) {\n return \"\" + m1 + \" \" + m2.toLowerCase();\n })\n .toLowerCase();\n },\n\n stringifyValue: function(value, options) {\n var prettify = options && options.prettify || v.prettify;\n return prettify(value);\n },\n\n isString: function(value) {\n return typeof value === 'string';\n },\n\n isArray: function(value) {\n return {}.toString.call(value) === '[object Array]';\n },\n\n // Checks if the object is a hash, which is equivalent to an object that\n // is neither an array nor a function.\n isHash: function(value) {\n return v.isObject(value) && !v.isArray(value) && !v.isFunction(value);\n },\n\n contains: function(obj, value) {\n if (!v.isDefined(obj)) {\n return false;\n }\n if (v.isArray(obj)) {\n return obj.indexOf(value) !== -1;\n }\n return value in obj;\n },\n\n unique: function(array) {\n if (!v.isArray(array)) {\n return array;\n }\n return array.filter(function(el, index, array) {\n return array.indexOf(el) == index;\n });\n },\n\n forEachKeyInKeypath: function(object, keypath, callback) {\n if (!v.isString(keypath)) {\n return undefined;\n }\n\n var key = \"\"\n , i\n , escape = false;\n\n for (i = 0; i < keypath.length; ++i) {\n switch (keypath[i]) {\n case '.':\n if (escape) {\n escape = false;\n key += '.';\n } else {\n object = callback(object, key, false);\n key = \"\";\n }\n break;\n\n case '\\\\':\n if (escape) {\n escape = false;\n key += '\\\\';\n } else {\n escape = true;\n }\n break;\n\n default:\n escape = false;\n key += keypath[i];\n break;\n }\n }\n\n return callback(object, key, true);\n },\n\n getDeepObjectValue: function(obj, keypath) {\n if (!v.isObject(obj)) {\n return undefined;\n }\n\n return v.forEachKeyInKeypath(obj, keypath, function(obj, key) {\n if (v.isObject(obj)) {\n return obj[key];\n }\n });\n },\n\n // This returns an object with all the values of the form.\n // It uses the input name as key and the value as value\n // So for example this:\n // \n // would return:\n // {email: \"foo@bar.com\"}\n collectFormValues: function(form, options) {\n var values = {}\n , i\n , j\n , input\n , inputs\n , option\n , value;\n\n if (v.isJqueryElement(form)) {\n form = form[0];\n }\n\n if (!form) {\n return values;\n }\n\n options = options || {};\n\n inputs = form.querySelectorAll(\"input[name], textarea[name]\");\n for (i = 0; i < inputs.length; ++i) {\n input = inputs.item(i);\n\n if (v.isDefined(input.getAttribute(\"data-ignored\"))) {\n continue;\n }\n\n name = input.name.replace(/\\./g, \"\\\\\\\\.\");\n value = v.sanitizeFormValue(input.value, options);\n if (input.type === \"number\") {\n value = value ? +value : null;\n } else if (input.type === \"checkbox\") {\n if (input.attributes.value) {\n if (!input.checked) {\n value = values[name] || null;\n }\n } else {\n value = input.checked;\n }\n } else if (input.type === \"radio\") {\n if (!input.checked) {\n value = values[name] || null;\n }\n }\n values[name] = value;\n }\n\n inputs = form.querySelectorAll(\"select[name]\");\n for (i = 0; i < inputs.length; ++i) {\n input = inputs.item(i);\n if (v.isDefined(input.getAttribute(\"data-ignored\"))) {\n continue;\n }\n\n if (input.multiple) {\n value = [];\n for (j in input.options) {\n option = input.options[j];\n if (option && option.selected) {\n value.push(v.sanitizeFormValue(option.value, options));\n }\n }\n } else {\n var _val = typeof input.options[input.selectedIndex] !== 'undefined' ? input.options[input.selectedIndex].value : '';\n value = v.sanitizeFormValue(_val, options);\n }\n values[input.name] = value;\n }\n\n return values;\n },\n\n sanitizeFormValue: function(value, options) {\n if (options.trim && v.isString(value)) {\n value = value.trim();\n }\n\n if (options.nullify !== false && value === \"\") {\n return null;\n }\n return value;\n },\n\n capitalize: function(str) {\n if (!v.isString(str)) {\n return str;\n }\n return str[0].toUpperCase() + str.slice(1);\n },\n\n // Remove all errors who's error attribute is empty (null or undefined)\n pruneEmptyErrors: function(errors) {\n return errors.filter(function(error) {\n return !v.isEmpty(error.error);\n });\n },\n\n // In\n // [{error: [\"err1\", \"err2\"], ...}]\n // Out\n // [{error: \"err1\", ...}, {error: \"err2\", ...}]\n //\n // All attributes in an error with multiple messages are duplicated\n // when expanding the errors.\n expandMultipleErrors: function(errors) {\n var ret = [];\n errors.forEach(function(error) {\n // Removes errors without a message\n if (v.isArray(error.error)) {\n error.error.forEach(function(msg) {\n ret.push(v.extend({}, error, {error: msg}));\n });\n } else {\n ret.push(error);\n }\n });\n return ret;\n },\n\n // Converts the error mesages by prepending the attribute name unless the\n // message is prefixed by ^\n convertErrorMessages: function(errors, options) {\n options = options || {};\n\n var ret = []\n , prettify = options.prettify || v.prettify;\n errors.forEach(function(errorInfo) {\n var error = v.result(errorInfo.error,\n errorInfo.value,\n errorInfo.attribute,\n errorInfo.options,\n errorInfo.attributes,\n errorInfo.globalOptions);\n\n if (!v.isString(error)) {\n ret.push(errorInfo);\n return;\n }\n\n if (error[0] === '^') {\n error = error.slice(1);\n } else if (options.fullMessages !== false) {\n error = v.capitalize(prettify(errorInfo.attribute)) + \" \" + error;\n }\n error = error.replace(/\\\\\\^/g, \"^\");\n error = v.format(error, {\n value: v.stringifyValue(errorInfo.value, options)\n });\n ret.push(v.extend({}, errorInfo, {error: error}));\n });\n return ret;\n },\n\n // In:\n // [{attribute: \"\", ...}]\n // Out:\n // {\"\": [{attribute: \"\", ...}]}\n groupErrorsByAttribute: function(errors) {\n var ret = {};\n errors.forEach(function(error) {\n var list = ret[error.attribute];\n if (list) {\n list.push(error);\n } else {\n ret[error.attribute] = [error];\n }\n });\n return ret;\n },\n\n // In:\n // [{error: \"\", ...}, {error: \"\", ...}]\n // Out:\n // [\"\", \"\"]\n flattenErrorsToArray: function(errors) {\n return errors\n .map(function(error) { return error.error; })\n .filter(function(value, index, self) {\n return self.indexOf(value) === index;\n });\n },\n\n cleanAttributes: function(attributes, whitelist) {\n function whitelistCreator(obj, key, last) {\n if (v.isObject(obj[key])) {\n return obj[key];\n }\n return (obj[key] = last ? true : {});\n }\n\n function buildObjectWhitelist(whitelist) {\n var ow = {}\n , lastObject\n , attr;\n for (attr in whitelist) {\n if (!whitelist[attr]) {\n continue;\n }\n v.forEachKeyInKeypath(ow, attr, whitelistCreator);\n }\n return ow;\n }\n\n function cleanRecursive(attributes, whitelist) {\n if (!v.isObject(attributes)) {\n return attributes;\n }\n\n var ret = v.extend({}, attributes)\n , w\n , attribute;\n\n for (attribute in attributes) {\n w = whitelist[attribute];\n\n if (v.isObject(w)) {\n ret[attribute] = cleanRecursive(ret[attribute], w);\n } else if (!w) {\n delete ret[attribute];\n }\n }\n return ret;\n }\n\n if (!v.isObject(whitelist) || !v.isObject(attributes)) {\n return {};\n }\n\n whitelist = buildObjectWhitelist(whitelist);\n return cleanRecursive(attributes, whitelist);\n },\n\n exposeModule: function(validate, root, exports, module, define) {\n if (exports) {\n if (module && module.exports) {\n exports = module.exports = validate;\n }\n exports.validate = validate;\n } else {\n root.validate = validate;\n if (validate.isFunction(define) && define.amd) {\n define([], function () { return validate; });\n }\n }\n },\n\n warn: function(msg) {\n if (typeof console !== \"undefined\" && console.warn) {\n console.warn(\"[validate.js] \" + msg);\n }\n },\n\n error: function(msg) {\n if (typeof console !== \"undefined\" && console.error) {\n console.error(\"[validate.js] \" + msg);\n }\n }\n });\n\n validate.validators = {\n // Presence validates that the value isn't empty\n presence: function(value, options) {\n options = v.extend({}, this.options, options);\n if (options.allowEmpty !== false ? !v.isDefined(value) : v.isEmpty(value)) {\n return options.message || this.message || \"can't be blank\";\n }\n },\n length: function(value, options, attribute) {\n // Empty values are allowed\n if (!v.isDefined(value)) {\n return;\n }\n\n options = v.extend({}, this.options, options);\n\n var is = options.is\n , maximum = options.maximum\n , minimum = options.minimum\n , tokenizer = options.tokenizer || function(val) { return val; }\n , err\n , errors = [];\n\n value = tokenizer(value);\n var length = value.length;\n if(!v.isNumber(length)) {\n v.error(v.format(\"Attribute %{attr} has a non numeric value for `length`\", {attr: attribute}));\n return options.message || this.notValid || \"has an incorrect length\";\n }\n\n // Is checks\n if (v.isNumber(is) && length !== is) {\n err = options.wrongLength ||\n this.wrongLength ||\n \"is the wrong length (should be %{count} characters)\";\n errors.push(v.format(err, {count: is}));\n }\n\n if (v.isNumber(minimum) && length < minimum) {\n err = options.tooShort ||\n this.tooShort ||\n \"is too short (minimum is %{count} characters)\";\n errors.push(v.format(err, {count: minimum}));\n }\n\n if (v.isNumber(maximum) && length > maximum) {\n err = options.tooLong ||\n this.tooLong ||\n \"is too long (maximum is %{count} characters)\";\n errors.push(v.format(err, {count: maximum}));\n }\n\n if (errors.length > 0) {\n return options.message || errors;\n }\n },\n numericality: function(value, options, attribute, attributes, globalOptions) {\n // Empty values are fine\n if (!v.isDefined(value)) {\n return;\n }\n\n options = v.extend({}, this.options, options);\n\n var errors = []\n , name\n , count\n , checks = {\n greaterThan: function(v, c) { return v > c; },\n greaterThanOrEqualTo: function(v, c) { return v >= c; },\n equalTo: function(v, c) { return v === c; },\n lessThan: function(v, c) { return v < c; },\n lessThanOrEqualTo: function(v, c) { return v <= c; },\n divisibleBy: function(v, c) { return v % c === 0; }\n }\n , prettify = options.prettify ||\n (globalOptions && globalOptions.prettify) ||\n v.prettify;\n\n // Strict will check that it is a valid looking number\n if (v.isString(value) && options.strict) {\n var pattern = \"^-?(0|[1-9]\\\\d*)\";\n if (!options.onlyInteger) {\n pattern += \"(\\\\.\\\\d+)?\";\n }\n pattern += \"$\";\n\n if (!(new RegExp(pattern).test(value))) {\n return options.message ||\n options.notValid ||\n this.notValid ||\n this.message ||\n \"must be a valid number\";\n }\n }\n\n // Coerce the value to a number unless we're being strict.\n if (options.noStrings !== true && v.isString(value) && !v.isEmpty(value)) {\n value = +value;\n }\n\n // If it's not a number we shouldn't continue since it will compare it.\n if (!v.isNumber(value)) {\n return options.message ||\n options.notValid ||\n this.notValid ||\n this.message ||\n \"is not a number\";\n }\n\n // Same logic as above, sort of. Don't bother with comparisons if this\n // doesn't pass.\n if (options.onlyInteger && !v.isInteger(value)) {\n return options.message ||\n options.notInteger ||\n this.notInteger ||\n this.message ||\n \"must be an integer\";\n }\n\n for (name in checks) {\n count = options[name];\n if (v.isNumber(count) && !checks[name](value, count)) {\n // This picks the default message if specified\n // For example the greaterThan check uses the message from\n // this.notGreaterThan so we capitalize the name and prepend \"not\"\n var key = \"not\" + v.capitalize(name);\n var msg = options[key] ||\n this[key] ||\n this.message ||\n \"must be %{type} %{count}\";\n\n errors.push(v.format(msg, {\n count: count,\n type: prettify(name)\n }));\n }\n }\n\n if (options.odd && value % 2 !== 1) {\n errors.push(options.notOdd ||\n this.notOdd ||\n this.message ||\n \"must be odd\");\n }\n if (options.even && value % 2 !== 0) {\n errors.push(options.notEven ||\n this.notEven ||\n this.message ||\n \"must be even\");\n }\n\n if (errors.length) {\n return options.message || errors;\n }\n },\n datetime: v.extend(function(value, options) {\n if (!v.isFunction(this.parse) || !v.isFunction(this.format)) {\n throw new Error(\"Both the parse and format functions needs to be set to use the datetime/date validator\");\n }\n\n // Empty values are fine\n if (!v.isDefined(value)) {\n return;\n }\n\n options = v.extend({}, this.options, options);\n\n var err\n , errors = []\n , earliest = options.earliest ? this.parse(options.earliest, options) : NaN\n , latest = options.latest ? this.parse(options.latest, options) : NaN;\n\n value = this.parse(value, options);\n\n // 86400000 is the number of milliseconds in a day, this is used to remove\n // the time from the date\n if (isNaN(value) || options.dateOnly && value % 86400000 !== 0) {\n err = options.notValid ||\n options.message ||\n this.notValid ||\n \"must be a valid date\";\n return v.format(err, {value: arguments[0]});\n }\n\n if (!isNaN(earliest) && value < earliest) {\n err = options.tooEarly ||\n options.message ||\n this.tooEarly ||\n \"must be no earlier than %{date}\";\n err = v.format(err, {\n value: this.format(value, options),\n date: this.format(earliest, options)\n });\n errors.push(err);\n }\n\n if (!isNaN(latest) && value > latest) {\n err = options.tooLate ||\n options.message ||\n this.tooLate ||\n \"must be no later than %{date}\";\n err = v.format(err, {\n date: this.format(latest, options),\n value: this.format(value, options)\n });\n errors.push(err);\n }\n\n if (errors.length) {\n return v.unique(errors);\n }\n }, {\n parse: null,\n format: null\n }),\n date: function(value, options) {\n options = v.extend({}, options, {dateOnly: true});\n return v.validators.datetime.call(v.validators.datetime, value, options);\n },\n format: function(value, options) {\n if (v.isString(options) || (options instanceof RegExp)) {\n options = {pattern: options};\n }\n\n options = v.extend({}, this.options, options);\n\n var message = options.message || this.message || \"is invalid\"\n , pattern = options.pattern\n , match;\n\n // Empty values are allowed\n if (!v.isDefined(value)) {\n return;\n }\n if (!v.isString(value)) {\n return message;\n }\n\n if (v.isString(pattern)) {\n pattern = new RegExp(options.pattern, options.flags);\n }\n match = pattern.exec(value);\n if (!match || match[0].length != value.length) {\n return message;\n }\n },\n inclusion: function(value, options) {\n // Empty values are fine\n if (!v.isDefined(value)) {\n return;\n }\n if (v.isArray(options)) {\n options = {within: options};\n }\n options = v.extend({}, this.options, options);\n if (v.contains(options.within, value)) {\n return;\n }\n var message = options.message ||\n this.message ||\n \"^%{value} is not included in the list\";\n return v.format(message, {value: value});\n },\n exclusion: function(value, options) {\n // Empty values are fine\n if (!v.isDefined(value)) {\n return;\n }\n if (v.isArray(options)) {\n options = {within: options};\n }\n options = v.extend({}, this.options, options);\n if (!v.contains(options.within, value)) {\n return;\n }\n var message = options.message || this.message || \"^%{value} is restricted\";\n return v.format(message, {value: value});\n },\n email: v.extend(function(value, options) {\n options = v.extend({}, this.options, options);\n var message = options.message || this.message || \"is not a valid email\";\n // Empty values are fine\n if (!v.isDefined(value)) {\n return;\n }\n if (!v.isString(value)) {\n return message;\n }\n if (!this.PATTERN.exec(value)) {\n return message;\n }\n }, {\n PATTERN: /^[a-z0-9\\u007F-\\uffff!#$%&'*+\\/=?^_`{|}~-]+(?:\\.[a-z0-9\\u007F-\\uffff!#$%&'*+\\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z]{2,}$/i\n }),\n equality: function(value, options, attribute, attributes, globalOptions) {\n if (!v.isDefined(value)) {\n return;\n }\n\n if (v.isString(options)) {\n options = {attribute: options};\n }\n options = v.extend({}, this.options, options);\n var message = options.message ||\n this.message ||\n \"is not equal to %{attribute}\";\n\n if (v.isEmpty(options.attribute) || !v.isString(options.attribute)) {\n throw new Error(\"The attribute must be a non empty string\");\n }\n\n var otherValue = v.getDeepObjectValue(attributes, options.attribute)\n , comparator = options.comparator || function(v1, v2) {\n return v1 === v2;\n }\n , prettify = options.prettify ||\n (globalOptions && globalOptions.prettify) ||\n v.prettify;\n\n if (!comparator(value, otherValue, options, attribute, attributes)) {\n return v.format(message, {attribute: prettify(options.attribute)});\n }\n },\n\n // A URL validator that is used to validate URLs with the ability to\n // restrict schemes and some domains.\n url: function(value, options) {\n if (!v.isDefined(value)) {\n return;\n }\n\n options = v.extend({}, this.options, options);\n\n var message = options.message || this.message || \"is not a valid url\"\n , schemes = options.schemes || this.schemes || ['http', 'https']\n , allowLocal = options.allowLocal || this.allowLocal || false;\n\n if (!v.isString(value)) {\n return message;\n }\n\n // https://gist.github.com/dperini/729294\n var regex =\n \"^\" +\n // protocol identifier\n \"(?:(?:\" + schemes.join(\"|\") + \")://)\" +\n // user:pass authentication\n \"(?:\\\\S+(?::\\\\S*)?@)?\" +\n \"(?:\";\n\n var tld = \"(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff]{2,}))\";\n\n if (allowLocal) {\n tld += \"?\";\n } else {\n regex +=\n // IP address exclusion\n // private & local networks\n \"(?!(?:10|127)(?:\\\\.\\\\d{1,3}){3})\" +\n \"(?!(?:169\\\\.254|192\\\\.168)(?:\\\\.\\\\d{1,3}){2})\" +\n \"(?!172\\\\.(?:1[6-9]|2\\\\d|3[0-1])(?:\\\\.\\\\d{1,3}){2})\";\n }\n\n regex +=\n // IP address dotted notation octets\n // excludes loopback network 0.0.0.0\n // excludes reserved space >= 224.0.0.0\n // excludes network & broacast addresses\n // (first & last IP address of each class)\n \"(?:[1-9]\\\\d?|1\\\\d\\\\d|2[01]\\\\d|22[0-3])\" +\n \"(?:\\\\.(?:1?\\\\d{1,2}|2[0-4]\\\\d|25[0-5])){2}\" +\n \"(?:\\\\.(?:[1-9]\\\\d?|1\\\\d\\\\d|2[0-4]\\\\d|25[0-4]))\" +\n \"|\" +\n // host name\n \"(?:(?:[a-z\\\\u00a1-\\\\uffff0-9]-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)\" +\n // domain name\n \"(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff0-9]-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)*\" +\n tld +\n \")\" +\n // port number\n \"(?::\\\\d{2,5})?\" +\n // resource path\n \"(?:[/?#]\\\\S*)?\" +\n \"$\";\n\n var PATTERN = new RegExp(regex, 'i');\n if (!PATTERN.exec(value)) {\n return message;\n }\n }\n };\n\n validate.formatters = {\n detailed: function(errors) {return errors;},\n flat: v.flattenErrorsToArray,\n grouped: function(errors) {\n var attr;\n\n errors = v.groupErrorsByAttribute(errors);\n for (attr in errors) {\n errors[attr] = v.flattenErrorsToArray(errors[attr]);\n }\n return errors;\n },\n constraint: function(errors) {\n var attr;\n errors = v.groupErrorsByAttribute(errors);\n for (attr in errors) {\n errors[attr] = errors[attr].map(function(result) {\n return result.validator;\n }).sort();\n }\n return errors;\n }\n };\n\n validate.exposeModule(validate, this, exports, module, define);\n}).call(this,\n typeof exports !== 'undefined' ? /* istanbul ignore next */ exports : null,\n typeof module !== 'undefined' ? /* istanbul ignore next */ module : null,\n typeof define !== 'undefined' ? /* istanbul ignore next */ define : null);\n","var baseIsNative = require('./_baseIsNative'),\n getValue = require('./_getValue');\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n","function _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return self;\n}\n\nmodule.exports = _assertThisInitialized;","var Symbol = require('./_Symbol'),\n getRawTag = require('./_getRawTag'),\n objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n","'use strict';\n\n\nmodule.exports = {\n copy: copy,\n checkDataType: checkDataType,\n checkDataTypes: checkDataTypes,\n coerceToTypes: coerceToTypes,\n toHash: toHash,\n getProperty: getProperty,\n escapeQuotes: escapeQuotes,\n equal: require('fast-deep-equal'),\n ucs2length: require('./ucs2length'),\n varOccurences: varOccurences,\n varReplace: varReplace,\n cleanUpCode: cleanUpCode,\n finalCleanUpCode: finalCleanUpCode,\n schemaHasRules: schemaHasRules,\n schemaHasRulesExcept: schemaHasRulesExcept,\n schemaUnknownRules: schemaUnknownRules,\n toQuotedString: toQuotedString,\n getPathExpr: getPathExpr,\n getPath: getPath,\n getData: getData,\n unescapeFragment: unescapeFragment,\n unescapeJsonPointer: unescapeJsonPointer,\n escapeFragment: escapeFragment,\n escapeJsonPointer: escapeJsonPointer\n};\n\n\nfunction copy(o, to) {\n to = to || {};\n for (var key in o) to[key] = o[key];\n return to;\n}\n\n\nfunction checkDataType(dataType, data, negate) {\n var EQUAL = negate ? ' !== ' : ' === '\n , AND = negate ? ' || ' : ' && '\n , OK = negate ? '!' : ''\n , NOT = negate ? '' : '!';\n switch (dataType) {\n case 'null': return data + EQUAL + 'null';\n case 'array': return OK + 'Array.isArray(' + data + ')';\n case 'object': return '(' + OK + data + AND +\n 'typeof ' + data + EQUAL + '\"object\"' + AND +\n NOT + 'Array.isArray(' + data + '))';\n case 'integer': return '(typeof ' + data + EQUAL + '\"number\"' + AND +\n NOT + '(' + data + ' % 1)' +\n AND + data + EQUAL + data + ')';\n default: return 'typeof ' + data + EQUAL + '\"' + dataType + '\"';\n }\n}\n\n\nfunction checkDataTypes(dataTypes, data) {\n switch (dataTypes.length) {\n case 1: return checkDataType(dataTypes[0], data, true);\n default:\n var code = '';\n var types = toHash(dataTypes);\n if (types.array && types.object) {\n code = types.null ? '(': '(!' + data + ' || ';\n code += 'typeof ' + data + ' !== \"object\")';\n delete types.null;\n delete types.array;\n delete types.object;\n }\n if (types.number) delete types.integer;\n for (var t in types)\n code += (code ? ' && ' : '' ) + checkDataType(t, data, true);\n\n return code;\n }\n}\n\n\nvar COERCE_TO_TYPES = toHash([ 'string', 'number', 'integer', 'boolean', 'null' ]);\nfunction coerceToTypes(optionCoerceTypes, dataTypes) {\n if (Array.isArray(dataTypes)) {\n var types = [];\n for (var i=0; i= lvl) throw new Error('Cannot access property/index ' + up + ' levels up, current level is ' + lvl);\n return paths[lvl - up];\n }\n\n if (up > lvl) throw new Error('Cannot access data ' + up + ' levels up, current level is ' + lvl);\n data = 'data' + ((lvl - up) || '');\n if (!jsonPointer) return data;\n }\n\n var expr = data;\n var segments = jsonPointer.split('/');\n for (var i=0; i true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nmodule.exports = eq;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n","var assignValue = require('./_assignValue'),\n baseAssignValue = require('./_baseAssignValue');\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object, customizer) {\n var isNew = !object;\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n\n var newValue = customizer\n ? customizer(object[key], source[key], key, object, source)\n : undefined;\n\n if (newValue === undefined) {\n newValue = source[key];\n }\n if (isNew) {\n baseAssignValue(object, key, newValue);\n } else {\n assignValue(object, key, newValue);\n }\n }\n return object;\n}\n\nmodule.exports = copyObject;\n","module.exports = __WEBPACK_EXTERNAL_MODULE__28__;","var ListCache = require('./_ListCache'),\n stackClear = require('./_stackClear'),\n stackDelete = require('./_stackDelete'),\n stackGet = require('./_stackGet'),\n stackHas = require('./_stackHas'),\n stackSet = require('./_stackSet');\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nmodule.exports = Stack;\n","var listCacheClear = require('./_listCacheClear'),\n listCacheDelete = require('./_listCacheDelete'),\n listCacheGet = require('./_listCacheGet'),\n listCacheHas = require('./_listCacheHas'),\n listCacheSet = require('./_listCacheSet');\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nmodule.exports = ListCache;\n","var eq = require('./eq');\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\nmodule.exports = assocIndexOf;\n","var getNative = require('./_getNative');\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nmodule.exports = nativeCreate;\n","var isKeyable = require('./_isKeyable');\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\nmodule.exports = getMapData;\n","var arrayLikeKeys = require('./_arrayLikeKeys'),\n baseKeys = require('./_baseKeys'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nmodule.exports = keys;\n","var root = require('./_root'),\n stubFalse = require('./stubFalse');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nmodule.exports = isBuffer;\n","module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n","var isFunction = require('./isFunction'),\n isLength = require('./isLength');\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nmodule.exports = isArrayLike;\n","var arrayLikeKeys = require('./_arrayLikeKeys'),\n baseKeysIn = require('./_baseKeysIn'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\nmodule.exports = keysIn;\n","var DataView = require('./_DataView'),\n Map = require('./_Map'),\n Promise = require('./_Promise'),\n Set = require('./_Set'),\n WeakMap = require('./_WeakMap'),\n baseGetTag = require('./_baseGetTag'),\n toSource = require('./_toSource');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n setTag = '[object Set]',\n weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = baseGetTag(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : '';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n}\n\nmodule.exports = getTag;\n","var isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = toKey;\n","'use strict';\nconst strictUriEncode = require('strict-uri-encode');\nconst decodeComponent = require('decode-uri-component');\nconst splitOnFirst = require('split-on-first');\n\nconst isNullOrUndefined = value => value === null || value === undefined;\n\nfunction encoderForArrayFormat(options) {\n\tswitch (options.arrayFormat) {\n\t\tcase 'index':\n\t\t\treturn key => (result, value) => {\n\t\t\t\tconst index = result.length;\n\n\t\t\t\tif (\n\t\t\t\t\tvalue === undefined ||\n\t\t\t\t\t(options.skipNull && value === null) ||\n\t\t\t\t\t(options.skipEmptyString && value === '')\n\t\t\t\t) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\n\t\t\t\tif (value === null) {\n\t\t\t\t\treturn [...result, [encode(key, options), '[', index, ']'].join('')];\n\t\t\t\t}\n\n\t\t\t\treturn [\n\t\t\t\t\t...result,\n\t\t\t\t\t[encode(key, options), '[', encode(index, options), ']=', encode(value, options)].join('')\n\t\t\t\t];\n\t\t\t};\n\n\t\tcase 'bracket':\n\t\t\treturn key => (result, value) => {\n\t\t\t\tif (\n\t\t\t\t\tvalue === undefined ||\n\t\t\t\t\t(options.skipNull && value === null) ||\n\t\t\t\t\t(options.skipEmptyString && value === '')\n\t\t\t\t) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\n\t\t\t\tif (value === null) {\n\t\t\t\t\treturn [...result, [encode(key, options), '[]'].join('')];\n\t\t\t\t}\n\n\t\t\t\treturn [...result, [encode(key, options), '[]=', encode(value, options)].join('')];\n\t\t\t};\n\n\t\tcase 'comma':\n\t\tcase 'separator':\n\t\t\treturn key => (result, value) => {\n\t\t\t\tif (value === null || value === undefined || value.length === 0) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\n\t\t\t\tif (result.length === 0) {\n\t\t\t\t\treturn [[encode(key, options), '=', encode(value, options)].join('')];\n\t\t\t\t}\n\n\t\t\t\treturn [[result, encode(value, options)].join(options.arrayFormatSeparator)];\n\t\t\t};\n\n\t\tdefault:\n\t\t\treturn key => (result, value) => {\n\t\t\t\tif (\n\t\t\t\t\tvalue === undefined ||\n\t\t\t\t\t(options.skipNull && value === null) ||\n\t\t\t\t\t(options.skipEmptyString && value === '')\n\t\t\t\t) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\n\t\t\t\tif (value === null) {\n\t\t\t\t\treturn [...result, encode(key, options)];\n\t\t\t\t}\n\n\t\t\t\treturn [...result, [encode(key, options), '=', encode(value, options)].join('')];\n\t\t\t};\n\t}\n}\n\nfunction parserForArrayFormat(options) {\n\tlet result;\n\n\tswitch (options.arrayFormat) {\n\t\tcase 'index':\n\t\t\treturn (key, value, accumulator) => {\n\t\t\t\tresult = /\\[(\\d*)\\]$/.exec(key);\n\n\t\t\t\tkey = key.replace(/\\[\\d*\\]$/, '');\n\n\t\t\t\tif (!result) {\n\t\t\t\t\taccumulator[key] = value;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (accumulator[key] === undefined) {\n\t\t\t\t\taccumulator[key] = {};\n\t\t\t\t}\n\n\t\t\t\taccumulator[key][result[1]] = value;\n\t\t\t};\n\n\t\tcase 'bracket':\n\t\t\treturn (key, value, accumulator) => {\n\t\t\t\tresult = /(\\[\\])$/.exec(key);\n\t\t\t\tkey = key.replace(/\\[\\]$/, '');\n\n\t\t\t\tif (!result) {\n\t\t\t\t\taccumulator[key] = value;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (accumulator[key] === undefined) {\n\t\t\t\t\taccumulator[key] = [value];\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\taccumulator[key] = [].concat(accumulator[key], value);\n\t\t\t};\n\n\t\tcase 'comma':\n\t\tcase 'separator':\n\t\t\treturn (key, value, accumulator) => {\n\t\t\t\tconst isArray = typeof value === 'string' && value.split('').indexOf(options.arrayFormatSeparator) > -1;\n\t\t\t\tconst newValue = isArray ? value.split(options.arrayFormatSeparator).map(item => decode(item, options)) : value === null ? value : decode(value, options);\n\t\t\t\taccumulator[key] = newValue;\n\t\t\t};\n\n\t\tdefault:\n\t\t\treturn (key, value, accumulator) => {\n\t\t\t\tif (accumulator[key] === undefined) {\n\t\t\t\t\taccumulator[key] = value;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\taccumulator[key] = [].concat(accumulator[key], value);\n\t\t\t};\n\t}\n}\n\nfunction validateArrayFormatSeparator(value) {\n\tif (typeof value !== 'string' || value.length !== 1) {\n\t\tthrow new TypeError('arrayFormatSeparator must be single character string');\n\t}\n}\n\nfunction encode(value, options) {\n\tif (options.encode) {\n\t\treturn options.strict ? strictUriEncode(value) : encodeURIComponent(value);\n\t}\n\n\treturn value;\n}\n\nfunction decode(value, options) {\n\tif (options.decode) {\n\t\treturn decodeComponent(value);\n\t}\n\n\treturn value;\n}\n\nfunction keysSorter(input) {\n\tif (Array.isArray(input)) {\n\t\treturn input.sort();\n\t}\n\n\tif (typeof input === 'object') {\n\t\treturn keysSorter(Object.keys(input))\n\t\t\t.sort((a, b) => Number(a) - Number(b))\n\t\t\t.map(key => input[key]);\n\t}\n\n\treturn input;\n}\n\nfunction removeHash(input) {\n\tconst hashStart = input.indexOf('#');\n\tif (hashStart !== -1) {\n\t\tinput = input.slice(0, hashStart);\n\t}\n\n\treturn input;\n}\n\nfunction getHash(url) {\n\tlet hash = '';\n\tconst hashStart = url.indexOf('#');\n\tif (hashStart !== -1) {\n\t\thash = url.slice(hashStart);\n\t}\n\n\treturn hash;\n}\n\nfunction extract(input) {\n\tinput = removeHash(input);\n\tconst queryStart = input.indexOf('?');\n\tif (queryStart === -1) {\n\t\treturn '';\n\t}\n\n\treturn input.slice(queryStart + 1);\n}\n\nfunction parseValue(value, options) {\n\tif (options.parseNumbers && !Number.isNaN(Number(value)) && (typeof value === 'string' && value.trim() !== '')) {\n\t\tvalue = Number(value);\n\t} else if (options.parseBooleans && value !== null && (value.toLowerCase() === 'true' || value.toLowerCase() === 'false')) {\n\t\tvalue = value.toLowerCase() === 'true';\n\t}\n\n\treturn value;\n}\n\nfunction parse(input, options) {\n\toptions = Object.assign({\n\t\tdecode: true,\n\t\tsort: true,\n\t\tarrayFormat: 'none',\n\t\tarrayFormatSeparator: ',',\n\t\tparseNumbers: false,\n\t\tparseBooleans: false\n\t}, options);\n\n\tvalidateArrayFormatSeparator(options.arrayFormatSeparator);\n\n\tconst formatter = parserForArrayFormat(options);\n\n\t// Create an object with no prototype\n\tconst ret = Object.create(null);\n\n\tif (typeof input !== 'string') {\n\t\treturn ret;\n\t}\n\n\tinput = input.trim().replace(/^[?#&]/, '');\n\n\tif (!input) {\n\t\treturn ret;\n\t}\n\n\tfor (const param of input.split('&')) {\n\t\tlet [key, value] = splitOnFirst(options.decode ? param.replace(/\\+/g, ' ') : param, '=');\n\n\t\t// Missing `=` should be `null`:\n\t\t// http://w3.org/TR/2012/WD-url-20120524/#collect-url-parameters\n\t\tvalue = value === undefined ? null : ['comma', 'separator'].includes(options.arrayFormat) ? value : decode(value, options);\n\t\tformatter(decode(key, options), value, ret);\n\t}\n\n\tfor (const key of Object.keys(ret)) {\n\t\tconst value = ret[key];\n\t\tif (typeof value === 'object' && value !== null) {\n\t\t\tfor (const k of Object.keys(value)) {\n\t\t\t\tvalue[k] = parseValue(value[k], options);\n\t\t\t}\n\t\t} else {\n\t\t\tret[key] = parseValue(value, options);\n\t\t}\n\t}\n\n\tif (options.sort === false) {\n\t\treturn ret;\n\t}\n\n\treturn (options.sort === true ? Object.keys(ret).sort() : Object.keys(ret).sort(options.sort)).reduce((result, key) => {\n\t\tconst value = ret[key];\n\t\tif (Boolean(value) && typeof value === 'object' && !Array.isArray(value)) {\n\t\t\t// Sort object keys, not values\n\t\t\tresult[key] = keysSorter(value);\n\t\t} else {\n\t\t\tresult[key] = value;\n\t\t}\n\n\t\treturn result;\n\t}, Object.create(null));\n}\n\nexports.extract = extract;\nexports.parse = parse;\n\nexports.stringify = (object, options) => {\n\tif (!object) {\n\t\treturn '';\n\t}\n\n\toptions = Object.assign({\n\t\tencode: true,\n\t\tstrict: true,\n\t\tarrayFormat: 'none',\n\t\tarrayFormatSeparator: ','\n\t}, options);\n\n\tvalidateArrayFormatSeparator(options.arrayFormatSeparator);\n\n\tconst shouldFilter = key => (\n\t\t(options.skipNull && isNullOrUndefined(object[key])) ||\n\t\t(options.skipEmptyString && object[key] === '')\n\t);\n\n\tconst formatter = encoderForArrayFormat(options);\n\n\tconst objectCopy = {};\n\n\tfor (const key of Object.keys(object)) {\n\t\tif (!shouldFilter(key)) {\n\t\t\tobjectCopy[key] = object[key];\n\t\t}\n\t}\n\n\tconst keys = Object.keys(objectCopy);\n\n\tif (options.sort !== false) {\n\t\tkeys.sort(options.sort);\n\t}\n\n\treturn keys.map(key => {\n\t\tconst value = object[key];\n\n\t\tif (value === undefined) {\n\t\t\treturn '';\n\t\t}\n\n\t\tif (value === null) {\n\t\t\treturn encode(key, options);\n\t\t}\n\n\t\tif (Array.isArray(value)) {\n\t\t\treturn value\n\t\t\t\t.reduce(formatter(key), [])\n\t\t\t\t.join('&');\n\t\t}\n\n\t\treturn encode(key, options) + '=' + encode(value, options);\n\t}).filter(x => x.length > 0).join('&');\n};\n\nexports.parseUrl = (input, options) => {\n\treturn {\n\t\turl: removeHash(input).split('?')[0] || '',\n\t\tquery: parse(extract(input), options)\n\t};\n};\n\nexports.stringifyUrl = (input, options) => {\n\tconst url = removeHash(input.url).split('?')[0] || '';\n\tconst queryFromUrl = exports.extract(input.url);\n\tconst parsedQueryFromUrl = exports.parse(queryFromUrl);\n\tconst hash = getHash(input.url);\n\tconst query = Object.assign(parsedQueryFromUrl, input.query);\n\tlet queryString = exports.stringify(query, options);\n\tif (queryString) {\n\t\tqueryString = `?${queryString}`;\n\t}\n\n\treturn `${url}${queryString}${hash}`;\n};\n","/*global define:false */\n/**\n * Copyright 2012-2017 Craig Campbell\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Mousetrap is a simple keyboard shortcut library for Javascript with\n * no external dependencies\n *\n * @version 1.6.5\n * @url craig.is/killing/mice\n */\n(function(window, document, undefined) {\n\n // Check if mousetrap is used inside browser, if not, return\n if (!window) {\n return;\n }\n\n /**\n * mapping of special keycodes to their corresponding keys\n *\n * everything in this dictionary cannot use keypress events\n * so it has to be here to map to the correct keycodes for\n * keyup/keydown events\n *\n * @type {Object}\n */\n var _MAP = {\n 8: 'backspace',\n 9: 'tab',\n 13: 'enter',\n 16: 'shift',\n 17: 'ctrl',\n 18: 'alt',\n 20: 'capslock',\n 27: 'esc',\n 32: 'space',\n 33: 'pageup',\n 34: 'pagedown',\n 35: 'end',\n 36: 'home',\n 37: 'left',\n 38: 'up',\n 39: 'right',\n 40: 'down',\n 45: 'ins',\n 46: 'del',\n 91: 'meta',\n 93: 'meta',\n 224: 'meta'\n };\n\n /**\n * mapping for special characters so they can support\n *\n * this dictionary is only used incase you want to bind a\n * keyup or keydown event to one of these keys\n *\n * @type {Object}\n */\n var _KEYCODE_MAP = {\n 106: '*',\n 107: '+',\n 109: '-',\n 110: '.',\n 111 : '/',\n 186: ';',\n 187: '=',\n 188: ',',\n 189: '-',\n 190: '.',\n 191: '/',\n 192: '`',\n 219: '[',\n 220: '\\\\',\n 221: ']',\n 222: '\\''\n };\n\n /**\n * this is a mapping of keys that require shift on a US keypad\n * back to the non shift equivelents\n *\n * this is so you can use keyup events with these keys\n *\n * note that this will only work reliably on US keyboards\n *\n * @type {Object}\n */\n var _SHIFT_MAP = {\n '~': '`',\n '!': '1',\n '@': '2',\n '#': '3',\n '$': '4',\n '%': '5',\n '^': '6',\n '&': '7',\n '*': '8',\n '(': '9',\n ')': '0',\n '_': '-',\n '+': '=',\n ':': ';',\n '\\\"': '\\'',\n '<': ',',\n '>': '.',\n '?': '/',\n '|': '\\\\'\n };\n\n /**\n * this is a list of special strings you can use to map\n * to modifier keys when you specify your keyboard shortcuts\n *\n * @type {Object}\n */\n var _SPECIAL_ALIASES = {\n 'option': 'alt',\n 'command': 'meta',\n 'return': 'enter',\n 'escape': 'esc',\n 'plus': '+',\n 'mod': /Mac|iPod|iPhone|iPad/.test(navigator.platform) ? 'meta' : 'ctrl'\n };\n\n /**\n * variable to store the flipped version of _MAP from above\n * needed to check if we should use keypress or not when no action\n * is specified\n *\n * @type {Object|undefined}\n */\n var _REVERSE_MAP;\n\n /**\n * loop through the f keys, f1 to f19 and add them to the map\n * programatically\n */\n for (var i = 1; i < 20; ++i) {\n _MAP[111 + i] = 'f' + i;\n }\n\n /**\n * loop through to map numbers on the numeric keypad\n */\n for (i = 0; i <= 9; ++i) {\n\n // This needs to use a string cause otherwise since 0 is falsey\n // mousetrap will never fire for numpad 0 pressed as part of a keydown\n // event.\n //\n // @see https://github.com/ccampbell/mousetrap/pull/258\n _MAP[i + 96] = i.toString();\n }\n\n /**\n * cross browser add event method\n *\n * @param {Element|HTMLDocument} object\n * @param {string} type\n * @param {Function} callback\n * @returns void\n */\n function _addEvent(object, type, callback) {\n if (object.addEventListener) {\n object.addEventListener(type, callback, false);\n return;\n }\n\n object.attachEvent('on' + type, callback);\n }\n\n /**\n * takes the event and returns the key character\n *\n * @param {Event} e\n * @return {string}\n */\n function _characterFromEvent(e) {\n\n // for keypress events we should return the character as is\n if (e.type == 'keypress') {\n var character = String.fromCharCode(e.which);\n\n // if the shift key is not pressed then it is safe to assume\n // that we want the character to be lowercase. this means if\n // you accidentally have caps lock on then your key bindings\n // will continue to work\n //\n // the only side effect that might not be desired is if you\n // bind something like 'A' cause you want to trigger an\n // event when capital A is pressed caps lock will no longer\n // trigger the event. shift+a will though.\n if (!e.shiftKey) {\n character = character.toLowerCase();\n }\n\n return character;\n }\n\n // for non keypress events the special maps are needed\n if (_MAP[e.which]) {\n return _MAP[e.which];\n }\n\n if (_KEYCODE_MAP[e.which]) {\n return _KEYCODE_MAP[e.which];\n }\n\n // if it is not in the special map\n\n // with keydown and keyup events the character seems to always\n // come in as an uppercase character whether you are pressing shift\n // or not. we should make sure it is always lowercase for comparisons\n return String.fromCharCode(e.which).toLowerCase();\n }\n\n /**\n * checks if two arrays are equal\n *\n * @param {Array} modifiers1\n * @param {Array} modifiers2\n * @returns {boolean}\n */\n function _modifiersMatch(modifiers1, modifiers2) {\n return modifiers1.sort().join(',') === modifiers2.sort().join(',');\n }\n\n /**\n * takes a key event and figures out what the modifiers are\n *\n * @param {Event} e\n * @returns {Array}\n */\n function _eventModifiers(e) {\n var modifiers = [];\n\n if (e.shiftKey) {\n modifiers.push('shift');\n }\n\n if (e.altKey) {\n modifiers.push('alt');\n }\n\n if (e.ctrlKey) {\n modifiers.push('ctrl');\n }\n\n if (e.metaKey) {\n modifiers.push('meta');\n }\n\n return modifiers;\n }\n\n /**\n * prevents default for this event\n *\n * @param {Event} e\n * @returns void\n */\n function _preventDefault(e) {\n if (e.preventDefault) {\n e.preventDefault();\n return;\n }\n\n e.returnValue = false;\n }\n\n /**\n * stops propogation for this event\n *\n * @param {Event} e\n * @returns void\n */\n function _stopPropagation(e) {\n if (e.stopPropagation) {\n e.stopPropagation();\n return;\n }\n\n e.cancelBubble = true;\n }\n\n /**\n * determines if the keycode specified is a modifier key or not\n *\n * @param {string} key\n * @returns {boolean}\n */\n function _isModifier(key) {\n return key == 'shift' || key == 'ctrl' || key == 'alt' || key == 'meta';\n }\n\n /**\n * reverses the map lookup so that we can look for specific keys\n * to see what can and can't use keypress\n *\n * @return {Object}\n */\n function _getReverseMap() {\n if (!_REVERSE_MAP) {\n _REVERSE_MAP = {};\n for (var key in _MAP) {\n\n // pull out the numeric keypad from here cause keypress should\n // be able to detect the keys from the character\n if (key > 95 && key < 112) {\n continue;\n }\n\n if (_MAP.hasOwnProperty(key)) {\n _REVERSE_MAP[_MAP[key]] = key;\n }\n }\n }\n return _REVERSE_MAP;\n }\n\n /**\n * picks the best action based on the key combination\n *\n * @param {string} key - character for key\n * @param {Array} modifiers\n * @param {string=} action passed in\n */\n function _pickBestAction(key, modifiers, action) {\n\n // if no action was picked in we should try to pick the one\n // that we think would work best for this key\n if (!action) {\n action = _getReverseMap()[key] ? 'keydown' : 'keypress';\n }\n\n // modifier keys don't work as expected with keypress,\n // switch to keydown\n if (action == 'keypress' && modifiers.length) {\n action = 'keydown';\n }\n\n return action;\n }\n\n /**\n * Converts from a string key combination to an array\n *\n * @param {string} combination like \"command+shift+l\"\n * @return {Array}\n */\n function _keysFromString(combination) {\n if (combination === '+') {\n return ['+'];\n }\n\n combination = combination.replace(/\\+{2}/g, '+plus');\n return combination.split('+');\n }\n\n /**\n * Gets info for a specific key combination\n *\n * @param {string} combination key combination (\"command+s\" or \"a\" or \"*\")\n * @param {string=} action\n * @returns {Object}\n */\n function _getKeyInfo(combination, action) {\n var keys;\n var key;\n var i;\n var modifiers = [];\n\n // take the keys from this pattern and figure out what the actual\n // pattern is all about\n keys = _keysFromString(combination);\n\n for (i = 0; i < keys.length; ++i) {\n key = keys[i];\n\n // normalize key names\n if (_SPECIAL_ALIASES[key]) {\n key = _SPECIAL_ALIASES[key];\n }\n\n // if this is not a keypress event then we should\n // be smart about using shift keys\n // this will only work for US keyboards however\n if (action && action != 'keypress' && _SHIFT_MAP[key]) {\n key = _SHIFT_MAP[key];\n modifiers.push('shift');\n }\n\n // if this key is a modifier then add it to the list of modifiers\n if (_isModifier(key)) {\n modifiers.push(key);\n }\n }\n\n // depending on what the key combination is\n // we will try to pick the best event for it\n action = _pickBestAction(key, modifiers, action);\n\n return {\n key: key,\n modifiers: modifiers,\n action: action\n };\n }\n\n function _belongsTo(element, ancestor) {\n if (element === null || element === document) {\n return false;\n }\n\n if (element === ancestor) {\n return true;\n }\n\n return _belongsTo(element.parentNode, ancestor);\n }\n\n function Mousetrap(targetElement) {\n var self = this;\n\n targetElement = targetElement || document;\n\n if (!(self instanceof Mousetrap)) {\n return new Mousetrap(targetElement);\n }\n\n /**\n * element to attach key events to\n *\n * @type {Element}\n */\n self.target = targetElement;\n\n /**\n * a list of all the callbacks setup via Mousetrap.bind()\n *\n * @type {Object}\n */\n self._callbacks = {};\n\n /**\n * direct map of string combinations to callbacks used for trigger()\n *\n * @type {Object}\n */\n self._directMap = {};\n\n /**\n * keeps track of what level each sequence is at since multiple\n * sequences can start out with the same sequence\n *\n * @type {Object}\n */\n var _sequenceLevels = {};\n\n /**\n * variable to store the setTimeout call\n *\n * @type {null|number}\n */\n var _resetTimer;\n\n /**\n * temporary state where we will ignore the next keyup\n *\n * @type {boolean|string}\n */\n var _ignoreNextKeyup = false;\n\n /**\n * temporary state where we will ignore the next keypress\n *\n * @type {boolean}\n */\n var _ignoreNextKeypress = false;\n\n /**\n * are we currently inside of a sequence?\n * type of action (\"keyup\" or \"keydown\" or \"keypress\") or false\n *\n * @type {boolean|string}\n */\n var _nextExpectedAction = false;\n\n /**\n * resets all sequence counters except for the ones passed in\n *\n * @param {Object} doNotReset\n * @returns void\n */\n function _resetSequences(doNotReset) {\n doNotReset = doNotReset || {};\n\n var activeSequences = false,\n key;\n\n for (key in _sequenceLevels) {\n if (doNotReset[key]) {\n activeSequences = true;\n continue;\n }\n _sequenceLevels[key] = 0;\n }\n\n if (!activeSequences) {\n _nextExpectedAction = false;\n }\n }\n\n /**\n * finds all callbacks that match based on the keycode, modifiers,\n * and action\n *\n * @param {string} character\n * @param {Array} modifiers\n * @param {Event|Object} e\n * @param {string=} sequenceName - name of the sequence we are looking for\n * @param {string=} combination\n * @param {number=} level\n * @returns {Array}\n */\n function _getMatches(character, modifiers, e, sequenceName, combination, level) {\n var i;\n var callback;\n var matches = [];\n var action = e.type;\n\n // if there are no events related to this keycode\n if (!self._callbacks[character]) {\n return [];\n }\n\n // if a modifier key is coming up on its own we should allow it\n if (action == 'keyup' && _isModifier(character)) {\n modifiers = [character];\n }\n\n // loop through all callbacks for the key that was pressed\n // and see if any of them match\n for (i = 0; i < self._callbacks[character].length; ++i) {\n callback = self._callbacks[character][i];\n\n // if a sequence name is not specified, but this is a sequence at\n // the wrong level then move onto the next match\n if (!sequenceName && callback.seq && _sequenceLevels[callback.seq] != callback.level) {\n continue;\n }\n\n // if the action we are looking for doesn't match the action we got\n // then we should keep going\n if (action != callback.action) {\n continue;\n }\n\n // if this is a keypress event and the meta key and control key\n // are not pressed that means that we need to only look at the\n // character, otherwise check the modifiers as well\n //\n // chrome will not fire a keypress if meta or control is down\n // safari will fire a keypress if meta or meta+shift is down\n // firefox will fire a keypress if meta or control is down\n if ((action == 'keypress' && !e.metaKey && !e.ctrlKey) || _modifiersMatch(modifiers, callback.modifiers)) {\n\n // when you bind a combination or sequence a second time it\n // should overwrite the first one. if a sequenceName or\n // combination is specified in this call it does just that\n //\n // @todo make deleting its own method?\n var deleteCombo = !sequenceName && callback.combo == combination;\n var deleteSequence = sequenceName && callback.seq == sequenceName && callback.level == level;\n if (deleteCombo || deleteSequence) {\n self._callbacks[character].splice(i, 1);\n }\n\n matches.push(callback);\n }\n }\n\n return matches;\n }\n\n /**\n * actually calls the callback function\n *\n * if your callback function returns false this will use the jquery\n * convention - prevent default and stop propogation on the event\n *\n * @param {Function} callback\n * @param {Event} e\n * @returns void\n */\n function _fireCallback(callback, e, combo, sequence) {\n\n // if this event should not happen stop here\n if (self.stopCallback(e, e.target || e.srcElement, combo, sequence)) {\n return;\n }\n\n if (callback(e, combo) === false) {\n _preventDefault(e);\n _stopPropagation(e);\n }\n }\n\n /**\n * handles a character key event\n *\n * @param {string} character\n * @param {Array} modifiers\n * @param {Event} e\n * @returns void\n */\n self._handleKey = function(character, modifiers, e) {\n var callbacks = _getMatches(character, modifiers, e);\n var i;\n var doNotReset = {};\n var maxLevel = 0;\n var processedSequenceCallback = false;\n\n // Calculate the maxLevel for sequences so we can only execute the longest callback sequence\n for (i = 0; i < callbacks.length; ++i) {\n if (callbacks[i].seq) {\n maxLevel = Math.max(maxLevel, callbacks[i].level);\n }\n }\n\n // loop through matching callbacks for this key event\n for (i = 0; i < callbacks.length; ++i) {\n\n // fire for all sequence callbacks\n // this is because if for example you have multiple sequences\n // bound such as \"g i\" and \"g t\" they both need to fire the\n // callback for matching g cause otherwise you can only ever\n // match the first one\n if (callbacks[i].seq) {\n\n // only fire callbacks for the maxLevel to prevent\n // subsequences from also firing\n //\n // for example 'a option b' should not cause 'option b' to fire\n // even though 'option b' is part of the other sequence\n //\n // any sequences that do not match here will be discarded\n // below by the _resetSequences call\n if (callbacks[i].level != maxLevel) {\n continue;\n }\n\n processedSequenceCallback = true;\n\n // keep a list of which sequences were matches for later\n doNotReset[callbacks[i].seq] = 1;\n _fireCallback(callbacks[i].callback, e, callbacks[i].combo, callbacks[i].seq);\n continue;\n }\n\n // if there were no sequence matches but we are still here\n // that means this is a regular match so we should fire that\n if (!processedSequenceCallback) {\n _fireCallback(callbacks[i].callback, e, callbacks[i].combo);\n }\n }\n\n // if the key you pressed matches the type of sequence without\n // being a modifier (ie \"keyup\" or \"keypress\") then we should\n // reset all sequences that were not matched by this event\n //\n // this is so, for example, if you have the sequence \"h a t\" and you\n // type \"h e a r t\" it does not match. in this case the \"e\" will\n // cause the sequence to reset\n //\n // modifier keys are ignored because you can have a sequence\n // that contains modifiers such as \"enter ctrl+space\" and in most\n // cases the modifier key will be pressed before the next key\n //\n // also if you have a sequence such as \"ctrl+b a\" then pressing the\n // \"b\" key will trigger a \"keypress\" and a \"keydown\"\n //\n // the \"keydown\" is expected when there is a modifier, but the\n // \"keypress\" ends up matching the _nextExpectedAction since it occurs\n // after and that causes the sequence to reset\n //\n // we ignore keypresses in a sequence that directly follow a keydown\n // for the same character\n var ignoreThisKeypress = e.type == 'keypress' && _ignoreNextKeypress;\n if (e.type == _nextExpectedAction && !_isModifier(character) && !ignoreThisKeypress) {\n _resetSequences(doNotReset);\n }\n\n _ignoreNextKeypress = processedSequenceCallback && e.type == 'keydown';\n };\n\n /**\n * handles a keydown event\n *\n * @param {Event} e\n * @returns void\n */\n function _handleKeyEvent(e) {\n\n // normalize e.which for key events\n // @see http://stackoverflow.com/questions/4285627/javascript-keycode-vs-charcode-utter-confusion\n if (typeof e.which !== 'number') {\n e.which = e.keyCode;\n }\n\n var character = _characterFromEvent(e);\n\n // no character found then stop\n if (!character) {\n return;\n }\n\n // need to use === for the character check because the character can be 0\n if (e.type == 'keyup' && _ignoreNextKeyup === character) {\n _ignoreNextKeyup = false;\n return;\n }\n\n self.handleKey(character, _eventModifiers(e), e);\n }\n\n /**\n * called to set a 1 second timeout on the specified sequence\n *\n * this is so after each key press in the sequence you have 1 second\n * to press the next key before you have to start over\n *\n * @returns void\n */\n function _resetSequenceTimer() {\n clearTimeout(_resetTimer);\n _resetTimer = setTimeout(_resetSequences, 1000);\n }\n\n /**\n * binds a key sequence to an event\n *\n * @param {string} combo - combo specified in bind call\n * @param {Array} keys\n * @param {Function} callback\n * @param {string=} action\n * @returns void\n */\n function _bindSequence(combo, keys, callback, action) {\n\n // start off by adding a sequence level record for this combination\n // and setting the level to 0\n _sequenceLevels[combo] = 0;\n\n /**\n * callback to increase the sequence level for this sequence and reset\n * all other sequences that were active\n *\n * @param {string} nextAction\n * @returns {Function}\n */\n function _increaseSequence(nextAction) {\n return function() {\n _nextExpectedAction = nextAction;\n ++_sequenceLevels[combo];\n _resetSequenceTimer();\n };\n }\n\n /**\n * wraps the specified callback inside of another function in order\n * to reset all sequence counters as soon as this sequence is done\n *\n * @param {Event} e\n * @returns void\n */\n function _callbackAndReset(e) {\n _fireCallback(callback, e, combo);\n\n // we should ignore the next key up if the action is key down\n // or keypress. this is so if you finish a sequence and\n // release the key the final key will not trigger a keyup\n if (action !== 'keyup') {\n _ignoreNextKeyup = _characterFromEvent(e);\n }\n\n // weird race condition if a sequence ends with the key\n // another sequence begins with\n setTimeout(_resetSequences, 10);\n }\n\n // loop through keys one at a time and bind the appropriate callback\n // function. for any key leading up to the final one it should\n // increase the sequence. after the final, it should reset all sequences\n //\n // if an action is specified in the original bind call then that will\n // be used throughout. otherwise we will pass the action that the\n // next key in the sequence should match. this allows a sequence\n // to mix and match keypress and keydown events depending on which\n // ones are better suited to the key provided\n for (var i = 0; i < keys.length; ++i) {\n var isFinal = i + 1 === keys.length;\n var wrappedCallback = isFinal ? _callbackAndReset : _increaseSequence(action || _getKeyInfo(keys[i + 1]).action);\n _bindSingle(keys[i], wrappedCallback, action, combo, i);\n }\n }\n\n /**\n * binds a single keyboard combination\n *\n * @param {string} combination\n * @param {Function} callback\n * @param {string=} action\n * @param {string=} sequenceName - name of sequence if part of sequence\n * @param {number=} level - what part of the sequence the command is\n * @returns void\n */\n function _bindSingle(combination, callback, action, sequenceName, level) {\n\n // store a direct mapped reference for use with Mousetrap.trigger\n self._directMap[combination + ':' + action] = callback;\n\n // make sure multiple spaces in a row become a single space\n combination = combination.replace(/\\s+/g, ' ');\n\n var sequence = combination.split(' ');\n var info;\n\n // if this pattern is a sequence of keys then run through this method\n // to reprocess each pattern one key at a time\n if (sequence.length > 1) {\n _bindSequence(combination, sequence, callback, action);\n return;\n }\n\n info = _getKeyInfo(combination, action);\n\n // make sure to initialize array if this is the first time\n // a callback is added for this key\n self._callbacks[info.key] = self._callbacks[info.key] || [];\n\n // remove an existing match if there is one\n _getMatches(info.key, info.modifiers, {type: info.action}, sequenceName, combination, level);\n\n // add this call back to the array\n // if it is a sequence put it at the beginning\n // if not put it at the end\n //\n // this is important because the way these are processed expects\n // the sequence ones to come first\n self._callbacks[info.key][sequenceName ? 'unshift' : 'push']({\n callback: callback,\n modifiers: info.modifiers,\n action: info.action,\n seq: sequenceName,\n level: level,\n combo: combination\n });\n }\n\n /**\n * binds multiple combinations to the same callback\n *\n * @param {Array} combinations\n * @param {Function} callback\n * @param {string|undefined} action\n * @returns void\n */\n self._bindMultiple = function(combinations, callback, action) {\n for (var i = 0; i < combinations.length; ++i) {\n _bindSingle(combinations[i], callback, action);\n }\n };\n\n // start!\n _addEvent(targetElement, 'keypress', _handleKeyEvent);\n _addEvent(targetElement, 'keydown', _handleKeyEvent);\n _addEvent(targetElement, 'keyup', _handleKeyEvent);\n }\n\n /**\n * binds an event to mousetrap\n *\n * can be a single key, a combination of keys separated with +,\n * an array of keys, or a sequence of keys separated by spaces\n *\n * be sure to list the modifier keys first to make sure that the\n * correct key ends up getting bound (the last key in the pattern)\n *\n * @param {string|Array} keys\n * @param {Function} callback\n * @param {string=} action - 'keypress', 'keydown', or 'keyup'\n * @returns void\n */\n Mousetrap.prototype.bind = function(keys, callback, action) {\n var self = this;\n keys = keys instanceof Array ? keys : [keys];\n self._bindMultiple.call(self, keys, callback, action);\n return self;\n };\n\n /**\n * unbinds an event to mousetrap\n *\n * the unbinding sets the callback function of the specified key combo\n * to an empty function and deletes the corresponding key in the\n * _directMap dict.\n *\n * TODO: actually remove this from the _callbacks dictionary instead\n * of binding an empty function\n *\n * the keycombo+action has to be exactly the same as\n * it was defined in the bind method\n *\n * @param {string|Array} keys\n * @param {string} action\n * @returns void\n */\n Mousetrap.prototype.unbind = function(keys, action) {\n var self = this;\n return self.bind.call(self, keys, function() {}, action);\n };\n\n /**\n * triggers an event that has already been bound\n *\n * @param {string} keys\n * @param {string=} action\n * @returns void\n */\n Mousetrap.prototype.trigger = function(keys, action) {\n var self = this;\n if (self._directMap[keys + ':' + action]) {\n self._directMap[keys + ':' + action]({}, keys);\n }\n return self;\n };\n\n /**\n * resets the library back to its initial state. this is useful\n * if you want to clear out the current keyboard shortcuts and bind\n * new ones - for example if you switch to another page\n *\n * @returns void\n */\n Mousetrap.prototype.reset = function() {\n var self = this;\n self._callbacks = {};\n self._directMap = {};\n return self;\n };\n\n /**\n * should we stop this event before firing off callbacks\n *\n * @param {Event} e\n * @param {Element} element\n * @return {boolean}\n */\n Mousetrap.prototype.stopCallback = function(e, element) {\n var self = this;\n\n // if the element has the class \"mousetrap\" then no need to stop\n if ((' ' + element.className + ' ').indexOf(' mousetrap ') > -1) {\n return false;\n }\n\n if (_belongsTo(element, self.target)) {\n return false;\n }\n\n // Events originating from a shadow DOM are re-targetted and `e.target` is the shadow host,\n // not the initial event target in the shadow tree. Note that not all events cross the\n // shadow boundary.\n // For shadow trees with `mode: 'open'`, the initial event target is the first element in\n // the event’s composed path. For shadow trees with `mode: 'closed'`, the initial event\n // target cannot be obtained.\n if ('composedPath' in e && typeof e.composedPath === 'function') {\n // For open shadow trees, update `element` so that the following check works.\n var initialEventTarget = e.composedPath()[0];\n if (initialEventTarget !== e.target) {\n element = initialEventTarget;\n }\n }\n\n // stop for input, select, and textarea\n return element.tagName == 'INPUT' || element.tagName == 'SELECT' || element.tagName == 'TEXTAREA' || element.isContentEditable;\n };\n\n /**\n * exposes _handleKey publicly so it can be overwritten by extensions\n */\n Mousetrap.prototype.handleKey = function() {\n var self = this;\n return self._handleKey.apply(self, arguments);\n };\n\n /**\n * allow custom key mappings\n */\n Mousetrap.addKeycodes = function(object) {\n for (var key in object) {\n if (object.hasOwnProperty(key)) {\n _MAP[key] = object[key];\n }\n }\n _REVERSE_MAP = null;\n };\n\n /**\n * Init the global mousetrap functions\n *\n * This method is needed to allow the global mousetrap functions to work\n * now that mousetrap is a constructor function.\n */\n Mousetrap.init = function() {\n var documentMousetrap = Mousetrap(document);\n for (var method in documentMousetrap) {\n if (method.charAt(0) !== '_') {\n Mousetrap[method] = (function(method) {\n return function() {\n return documentMousetrap[method].apply(documentMousetrap, arguments);\n };\n } (method));\n }\n }\n };\n\n Mousetrap.init();\n\n // expose mousetrap to the global object\n window.Mousetrap = Mousetrap;\n\n // expose as a common js module\n if (typeof module !== 'undefined' && module.exports) {\n module.exports = Mousetrap;\n }\n\n // expose mousetrap as an AMD module\n if (typeof define === 'function' && define.amd) {\n define(function() {\n return Mousetrap;\n });\n }\n}) (typeof window !== 'undefined' ? window : null, typeof window !== 'undefined' ? document : null);\n","module.exports = __WEBPACK_EXTERNAL_MODULE__43__;","function _setPrototypeOf(o, p) {\n module.exports = _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n}\n\nmodule.exports = _setPrototypeOf;","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nmodule.exports = Map;\n","var baseGetTag = require('./_baseGetTag'),\n isObject = require('./isObject');\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;\n","var mapCacheClear = require('./_mapCacheClear'),\n mapCacheDelete = require('./_mapCacheDelete'),\n mapCacheGet = require('./_mapCacheGet'),\n mapCacheHas = require('./_mapCacheHas'),\n mapCacheSet = require('./_mapCacheSet');\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nmodule.exports = MapCache;\n","var defineProperty = require('./_defineProperty');\n\n/**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n if (key == '__proto__' && defineProperty) {\n defineProperty(object, key, {\n 'configurable': true,\n 'enumerable': true,\n 'value': value,\n 'writable': true\n });\n } else {\n object[key] = value;\n }\n}\n\nmodule.exports = baseAssignValue;\n","var baseIsArguments = require('./_baseIsArguments'),\n isObjectLike = require('./isObjectLike');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\nmodule.exports = isArguments;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\nmodule.exports = isIndex;\n","var baseIsTypedArray = require('./_baseIsTypedArray'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nmodule.exports = isTypedArray;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isLength;\n","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\nmodule.exports = baseUnary;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\nmodule.exports = nodeUtil;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\nmodule.exports = isPrototype;\n","var arrayFilter = require('./_arrayFilter'),\n stubArray = require('./stubArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n if (object == null) {\n return [];\n }\n object = Object(object);\n return arrayFilter(nativeGetSymbols(object), function(symbol) {\n return propertyIsEnumerable.call(object, symbol);\n });\n};\n\nmodule.exports = getSymbols;\n","var overArg = require('./_overArg');\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\nmodule.exports = getPrototype;\n","var Uint8Array = require('./_Uint8Array');\n\n/**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\nfunction cloneArrayBuffer(arrayBuffer) {\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n return result;\n}\n\nmodule.exports = cloneArrayBuffer;\n","/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n}\n\nmodule.exports = setToArray;\n","var isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\nmodule.exports = isKey;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nmodule.exports = identity;\n","'use strict';\n\nvar URI = require('uri-js')\n , equal = require('fast-deep-equal')\n , util = require('./util')\n , SchemaObject = require('./schema_obj')\n , traverse = require('json-schema-traverse');\n\nmodule.exports = resolve;\n\nresolve.normalizeId = normalizeId;\nresolve.fullPath = getFullPath;\nresolve.url = resolveUrl;\nresolve.ids = resolveIds;\nresolve.inlineRef = inlineRef;\nresolve.schema = resolveSchema;\n\n/**\n * [resolve and compile the references ($ref)]\n * @this Ajv\n * @param {Function} compile reference to schema compilation funciton (localCompile)\n * @param {Object} root object with information about the root schema for the current schema\n * @param {String} ref reference to resolve\n * @return {Object|Function} schema object (if the schema can be inlined) or validation function\n */\nfunction resolve(compile, root, ref) {\n /* jshint validthis: true */\n var refVal = this._refs[ref];\n if (typeof refVal == 'string') {\n if (this._refs[refVal]) refVal = this._refs[refVal];\n else return resolve.call(this, compile, root, refVal);\n }\n\n refVal = refVal || this._schemas[ref];\n if (refVal instanceof SchemaObject) {\n return inlineRef(refVal.schema, this._opts.inlineRefs)\n ? refVal.schema\n : refVal.validate || this._compile(refVal);\n }\n\n var res = resolveSchema.call(this, root, ref);\n var schema, v, baseId;\n if (res) {\n schema = res.schema;\n root = res.root;\n baseId = res.baseId;\n }\n\n if (schema instanceof SchemaObject) {\n v = schema.validate || compile.call(this, schema.schema, root, undefined, baseId);\n } else if (schema !== undefined) {\n v = inlineRef(schema, this._opts.inlineRefs)\n ? schema\n : compile.call(this, schema, root, undefined, baseId);\n }\n\n return v;\n}\n\n\n/**\n * Resolve schema, its root and baseId\n * @this Ajv\n * @param {Object} root root object with properties schema, refVal, refs\n * @param {String} ref reference to resolve\n * @return {Object} object with properties schema, root, baseId\n */\nfunction resolveSchema(root, ref) {\n /* jshint validthis: true */\n var p = URI.parse(ref)\n , refPath = _getFullPath(p)\n , baseId = getFullPath(this._getId(root.schema));\n if (Object.keys(root.schema).length === 0 || refPath !== baseId) {\n var id = normalizeId(refPath);\n var refVal = this._refs[id];\n if (typeof refVal == 'string') {\n return resolveRecursive.call(this, root, refVal, p);\n } else if (refVal instanceof SchemaObject) {\n if (!refVal.validate) this._compile(refVal);\n root = refVal;\n } else {\n refVal = this._schemas[id];\n if (refVal instanceof SchemaObject) {\n if (!refVal.validate) this._compile(refVal);\n if (id == normalizeId(ref))\n return { schema: refVal, root: root, baseId: baseId };\n root = refVal;\n } else {\n return;\n }\n }\n if (!root.schema) return;\n baseId = getFullPath(this._getId(root.schema));\n }\n return getJsonPointer.call(this, p, baseId, root.schema, root);\n}\n\n\n/* @this Ajv */\nfunction resolveRecursive(root, ref, parsedRef) {\n /* jshint validthis: true */\n var res = resolveSchema.call(this, root, ref);\n if (res) {\n var schema = res.schema;\n var baseId = res.baseId;\n root = res.root;\n var id = this._getId(schema);\n if (id) baseId = resolveUrl(baseId, id);\n return getJsonPointer.call(this, parsedRef, baseId, schema, root);\n }\n}\n\n\nvar PREVENT_SCOPE_CHANGE = util.toHash(['properties', 'patternProperties', 'enum', 'dependencies', 'definitions']);\n/* @this Ajv */\nfunction getJsonPointer(parsedRef, baseId, schema, root) {\n /* jshint validthis: true */\n parsedRef.fragment = parsedRef.fragment || '';\n if (parsedRef.fragment.slice(0,1) != '/') return;\n var parts = parsedRef.fragment.split('/');\n\n for (var i = 1; i < parts.length; i++) {\n var part = parts[i];\n if (part) {\n part = util.unescapeFragment(part);\n schema = schema[part];\n if (schema === undefined) break;\n var id;\n if (!PREVENT_SCOPE_CHANGE[part]) {\n id = this._getId(schema);\n if (id) baseId = resolveUrl(baseId, id);\n if (schema.$ref) {\n var $ref = resolveUrl(baseId, schema.$ref);\n var res = resolveSchema.call(this, root, $ref);\n if (res) {\n schema = res.schema;\n root = res.root;\n baseId = res.baseId;\n }\n }\n }\n }\n }\n if (schema !== undefined && schema !== root.schema)\n return { schema: schema, root: root, baseId: baseId };\n}\n\n\nvar SIMPLE_INLINED = util.toHash([\n 'type', 'format', 'pattern',\n 'maxLength', 'minLength',\n 'maxProperties', 'minProperties',\n 'maxItems', 'minItems',\n 'maximum', 'minimum',\n 'uniqueItems', 'multipleOf',\n 'required', 'enum'\n]);\nfunction inlineRef(schema, limit) {\n if (limit === false) return false;\n if (limit === undefined || limit === true) return checkNoRef(schema);\n else if (limit) return countKeys(schema) <= limit;\n}\n\n\nfunction checkNoRef(schema) {\n var item;\n if (Array.isArray(schema)) {\n for (var i=0; i [2.1, 1.2]\n *\n * // The `_.property` iteratee shorthand.\n * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 1 }, { 'x': 2 }]\n */\nfunction uniqBy(array, iteratee) {\n return (array && array.length) ? baseUniq(array, baseIteratee(iteratee, 2)) : [];\n}\n\nmodule.exports = uniqBy;\n","var arrayLikeToArray = require(\"./arrayLikeToArray\");\n\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(n);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}\n\nmodule.exports = _unsupportedIterableToArray;","function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n\n return arr2;\n}\n\nmodule.exports = _arrayLikeToArray;","function _AwaitValue(value) {\n this.wrapped = value;\n}\n\nmodule.exports = _AwaitValue;","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nmodule.exports = toSource;\n","var baseAssignValue = require('./_baseAssignValue'),\n eq = require('./eq');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\nmodule.exports = assignValue;\n","var getNative = require('./_getNative');\n\nvar defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n}());\n\nmodule.exports = defineProperty;\n","var baseTimes = require('./_baseTimes'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isIndex = require('./_isIndex'),\n isTypedArray = require('./isTypedArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = arrayLikeKeys;\n","/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\nmodule.exports = overArg;\n","var root = require('./_root');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined,\n allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined;\n\n/**\n * Creates a clone of `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\nfunction cloneBuffer(buffer, isDeep) {\n if (isDeep) {\n return buffer.slice();\n }\n var length = buffer.length,\n result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n buffer.copy(result);\n return result;\n}\n\nmodule.exports = cloneBuffer;\n","/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction copyArray(source, array) {\n var index = -1,\n length = source.length;\n\n array || (array = Array(length));\n while (++index < length) {\n array[index] = source[index];\n }\n return array;\n}\n\nmodule.exports = copyArray;\n","/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n return [];\n}\n\nmodule.exports = stubArray;\n","var arrayPush = require('./_arrayPush'),\n getPrototype = require('./_getPrototype'),\n getSymbols = require('./_getSymbols'),\n stubArray = require('./stubArray');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own and inherited enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n var result = [];\n while (object) {\n arrayPush(result, getSymbols(object));\n object = getPrototype(object);\n }\n return result;\n};\n\nmodule.exports = getSymbolsIn;\n","/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n}\n\nmodule.exports = arrayPush;\n","var baseGetAllKeys = require('./_baseGetAllKeys'),\n getSymbols = require('./_getSymbols'),\n keys = require('./keys');\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n return baseGetAllKeys(object, keys, getSymbols);\n}\n\nmodule.exports = getAllKeys;\n","var arrayPush = require('./_arrayPush'),\n isArray = require('./isArray');\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\nmodule.exports = baseGetAllKeys;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nmodule.exports = Set;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nmodule.exports = Uint8Array;\n","var cloneArrayBuffer = require('./_cloneArrayBuffer');\n\n/**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\nfunction cloneTypedArray(typedArray, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n}\n\nmodule.exports = cloneTypedArray;\n","var baseCreate = require('./_baseCreate'),\n getPrototype = require('./_getPrototype'),\n isPrototype = require('./_isPrototype');\n\n/**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneObject(object) {\n return (typeof object.constructor == 'function' && !isPrototype(object))\n ? baseCreate(getPrototype(object))\n : {};\n}\n\nmodule.exports = initCloneObject;\n","var baseIsEqualDeep = require('./_baseIsEqualDeep'),\n isObjectLike = require('./isObjectLike');\n\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Unordered comparison\n * 2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, bitmask, customizer, stack) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n}\n\nmodule.exports = baseIsEqual;\n","var SetCache = require('./_SetCache'),\n arraySome = require('./_arraySome'),\n cacheHas = require('./_cacheHas');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(array);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var index = -1,\n result = true,\n seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n stack.set(array, other);\n stack.set(other, array);\n\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, arrValue, index, other, array, stack)\n : customizer(arrValue, othValue, index, array, other, stack);\n }\n if (compared !== undefined) {\n if (compared) {\n continue;\n }\n result = false;\n break;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (seen) {\n if (!arraySome(other, function(othValue, othIndex) {\n if (!cacheHas(seen, othIndex) &&\n (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n return seen.push(othIndex);\n }\n })) {\n result = false;\n break;\n }\n } else if (!(\n arrValue === othValue ||\n equalFunc(arrValue, othValue, bitmask, customizer, stack)\n )) {\n result = false;\n break;\n }\n }\n stack['delete'](array);\n stack['delete'](other);\n return result;\n}\n\nmodule.exports = equalArrays;\n","var MapCache = require('./_MapCache'),\n setCacheAdd = require('./_setCacheAdd'),\n setCacheHas = require('./_setCacheHas');\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\nmodule.exports = SetCache;\n","/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n return cache.has(key);\n}\n\nmodule.exports = cacheHas;\n","var isObject = require('./isObject');\n\n/**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n * equality comparisons, else `false`.\n */\nfunction isStrictComparable(value) {\n return value === value && !isObject(value);\n}\n\nmodule.exports = isStrictComparable;\n","/**\n * A specialized version of `matchesProperty` for source values suitable\n * for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction matchesStrictComparable(key, srcValue) {\n return function(object) {\n if (object == null) {\n return false;\n }\n return object[key] === srcValue &&\n (srcValue !== undefined || (key in Object(object)));\n };\n}\n\nmodule.exports = matchesStrictComparable;\n","var castPath = require('./_castPath'),\n toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\nmodule.exports = baseGet;\n","var isArray = require('./isArray'),\n isKey = require('./_isKey'),\n stringToPath = require('./_stringToPath'),\n toString = require('./toString');\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value, object) {\n if (isArray(value)) {\n return value;\n }\n return isKey(value, object) ? [value] : stringToPath(toString(value));\n}\n\nmodule.exports = castPath;\n","var baseAssignValue = require('./_baseAssignValue'),\n eq = require('./eq');\n\n/**\n * This function is like `assignValue` except that it doesn't assign\n * `undefined` values.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignMergeValue(object, key, value) {\n if ((value !== undefined && !eq(object[key], value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\nmodule.exports = assignMergeValue;\n","/**\n * Gets the value at `key`, unless `key` is \"__proto__\" or \"constructor\".\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction safeGet(object, key) {\n if (key === 'constructor' && typeof object[key] === 'function') {\n return;\n }\n\n if (key == '__proto__') {\n return;\n }\n\n return object[key];\n}\n\nmodule.exports = safeGet;\n","'use strict';\n\nvar util = require('./util');\n\nmodule.exports = SchemaObject;\n\nfunction SchemaObject(obj) {\n util.copy(obj, this);\n}\n","'use strict';\n\nmodule.exports = function (data, opts) {\n if (!opts) opts = {};\n if (typeof opts === 'function') opts = { cmp: opts };\n var cycles = (typeof opts.cycles === 'boolean') ? opts.cycles : false;\n\n var cmp = opts.cmp && (function (f) {\n return function (node) {\n return function (a, b) {\n var aobj = { key: a, value: node[a] };\n var bobj = { key: b, value: node[b] };\n return f(aobj, bobj);\n };\n };\n })(opts.cmp);\n\n var seen = [];\n return (function stringify (node) {\n if (node && node.toJSON && typeof node.toJSON === 'function') {\n node = node.toJSON();\n }\n\n if (node === undefined) return;\n if (typeof node == 'number') return isFinite(node) ? '' + node : 'null';\n if (typeof node !== 'object') return JSON.stringify(node);\n\n var i, out;\n if (Array.isArray(node)) {\n out = '[';\n for (i = 0; i < node.length; i++) {\n if (i) out += ',';\n out += stringify(node[i]) || 'null';\n }\n return out + ']';\n }\n\n if (node === null) return 'null';\n\n if (seen.indexOf(node) !== -1) {\n if (cycles) return JSON.stringify('__cycle__');\n throw new TypeError('Converting circular structure to JSON');\n }\n\n var seenIndex = seen.push(node) - 1;\n var keys = Object.keys(node).sort(cmp && cmp(node));\n out = '';\n for (i = 0; i < keys.length; i++) {\n var key = keys[i];\n var value = stringify(node[key]);\n\n if (!value) continue;\n if (out) out += ',';\n out += JSON.stringify(key) + ':' + value;\n }\n seen.splice(seenIndex, 1);\n return '{' + out + '}';\n })(data);\n};\n","'use strict';\nmodule.exports = function generate_validate(it, $keyword, $ruleType) {\n var out = '';\n var $async = it.schema.$async === true,\n $refKeywords = it.util.schemaHasRulesExcept(it.schema, it.RULES.all, '$ref'),\n $id = it.self._getId(it.schema);\n if (it.opts.strictKeywords) {\n var $unknownKwd = it.util.schemaUnknownRules(it.schema, it.RULES.keywords);\n if ($unknownKwd) {\n var $keywordsMsg = 'unknown keyword: ' + $unknownKwd;\n if (it.opts.strictKeywords === 'log') it.logger.warn($keywordsMsg);\n else throw new Error($keywordsMsg);\n }\n }\n if (it.isTop) {\n out += ' var validate = ';\n if ($async) {\n it.async = true;\n out += 'async ';\n }\n out += 'function(data, dataPath, parentData, parentDataProperty, rootData) { \\'use strict\\'; ';\n if ($id && (it.opts.sourceCode || it.opts.processCode)) {\n out += ' ' + ('/\\*# sourceURL=' + $id + ' */') + ' ';\n }\n }\n if (typeof it.schema == 'boolean' || !($refKeywords || it.schema.$ref)) {\n var $keyword = 'false schema';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $errorKeyword;\n var $data = 'data' + ($dataLvl || '');\n var $valid = 'valid' + $lvl;\n if (it.schema === false) {\n if (it.isTop) {\n $breakOnError = true;\n } else {\n out += ' var ' + ($valid) + ' = false; ';\n }\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ($errorKeyword || 'false schema') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'boolean schema is false\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n } else {\n if (it.isTop) {\n if ($async) {\n out += ' return data; ';\n } else {\n out += ' validate.errors = null; return true; ';\n }\n } else {\n out += ' var ' + ($valid) + ' = true; ';\n }\n }\n if (it.isTop) {\n out += ' }; return validate; ';\n }\n return out;\n }\n if (it.isTop) {\n var $top = it.isTop,\n $lvl = it.level = 0,\n $dataLvl = it.dataLevel = 0,\n $data = 'data';\n it.rootId = it.resolve.fullPath(it.self._getId(it.root.schema));\n it.baseId = it.baseId || it.rootId;\n delete it.isTop;\n it.dataPathArr = [undefined];\n if (it.schema.default !== undefined && it.opts.useDefaults && it.opts.strictDefaults) {\n var $defaultMsg = 'default is ignored in the schema root';\n if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg);\n else throw new Error($defaultMsg);\n }\n out += ' var vErrors = null; ';\n out += ' var errors = 0; ';\n out += ' if (rootData === undefined) rootData = data; ';\n } else {\n var $lvl = it.level,\n $dataLvl = it.dataLevel,\n $data = 'data' + ($dataLvl || '');\n if ($id) it.baseId = it.resolve.url(it.baseId, $id);\n if ($async && !it.async) throw new Error('async schema in sync schema');\n out += ' var errs_' + ($lvl) + ' = errors;';\n }\n var $valid = 'valid' + $lvl,\n $breakOnError = !it.opts.allErrors,\n $closingBraces1 = '',\n $closingBraces2 = '';\n var $errorKeyword;\n var $typeSchema = it.schema.type,\n $typeIsArray = Array.isArray($typeSchema);\n if ($typeSchema && it.opts.nullable && it.schema.nullable === true) {\n if ($typeIsArray) {\n if ($typeSchema.indexOf('null') == -1) $typeSchema = $typeSchema.concat('null');\n } else if ($typeSchema != 'null') {\n $typeSchema = [$typeSchema, 'null'];\n $typeIsArray = true;\n }\n }\n if ($typeIsArray && $typeSchema.length == 1) {\n $typeSchema = $typeSchema[0];\n $typeIsArray = false;\n }\n if (it.schema.$ref && $refKeywords) {\n if (it.opts.extendRefs == 'fail') {\n throw new Error('$ref: validation keywords used in schema at path \"' + it.errSchemaPath + '\" (see option extendRefs)');\n } else if (it.opts.extendRefs !== true) {\n $refKeywords = false;\n it.logger.warn('$ref: keywords ignored in schema at path \"' + it.errSchemaPath + '\"');\n }\n }\n if (it.schema.$comment && it.opts.$comment) {\n out += ' ' + (it.RULES.all.$comment.code(it, '$comment'));\n }\n if ($typeSchema) {\n if (it.opts.coerceTypes) {\n var $coerceToTypes = it.util.coerceToTypes(it.opts.coerceTypes, $typeSchema);\n }\n var $rulesGroup = it.RULES.types[$typeSchema];\n if ($coerceToTypes || $typeIsArray || $rulesGroup === true || ($rulesGroup && !$shouldUseGroup($rulesGroup))) {\n var $schemaPath = it.schemaPath + '.type',\n $errSchemaPath = it.errSchemaPath + '/type';\n var $schemaPath = it.schemaPath + '.type',\n $errSchemaPath = it.errSchemaPath + '/type',\n $method = $typeIsArray ? 'checkDataTypes' : 'checkDataType';\n out += ' if (' + (it.util[$method]($typeSchema, $data, true)) + ') { ';\n if ($coerceToTypes) {\n var $dataType = 'dataType' + $lvl,\n $coerced = 'coerced' + $lvl;\n out += ' var ' + ($dataType) + ' = typeof ' + ($data) + '; ';\n if (it.opts.coerceTypes == 'array') {\n out += ' if (' + ($dataType) + ' == \\'object\\' && Array.isArray(' + ($data) + ')) ' + ($dataType) + ' = \\'array\\'; ';\n }\n out += ' var ' + ($coerced) + ' = undefined; ';\n var $bracesCoercion = '';\n var arr1 = $coerceToTypes;\n if (arr1) {\n var $type, $i = -1,\n l1 = arr1.length - 1;\n while ($i < l1) {\n $type = arr1[$i += 1];\n if ($i) {\n out += ' if (' + ($coerced) + ' === undefined) { ';\n $bracesCoercion += '}';\n }\n if (it.opts.coerceTypes == 'array' && $type != 'array') {\n out += ' if (' + ($dataType) + ' == \\'array\\' && ' + ($data) + '.length == 1) { ' + ($coerced) + ' = ' + ($data) + ' = ' + ($data) + '[0]; ' + ($dataType) + ' = typeof ' + ($data) + '; } ';\n }\n if ($type == 'string') {\n out += ' if (' + ($dataType) + ' == \\'number\\' || ' + ($dataType) + ' == \\'boolean\\') ' + ($coerced) + ' = \\'\\' + ' + ($data) + '; else if (' + ($data) + ' === null) ' + ($coerced) + ' = \\'\\'; ';\n } else if ($type == 'number' || $type == 'integer') {\n out += ' if (' + ($dataType) + ' == \\'boolean\\' || ' + ($data) + ' === null || (' + ($dataType) + ' == \\'string\\' && ' + ($data) + ' && ' + ($data) + ' == +' + ($data) + ' ';\n if ($type == 'integer') {\n out += ' && !(' + ($data) + ' % 1)';\n }\n out += ')) ' + ($coerced) + ' = +' + ($data) + '; ';\n } else if ($type == 'boolean') {\n out += ' if (' + ($data) + ' === \\'false\\' || ' + ($data) + ' === 0 || ' + ($data) + ' === null) ' + ($coerced) + ' = false; else if (' + ($data) + ' === \\'true\\' || ' + ($data) + ' === 1) ' + ($coerced) + ' = true; ';\n } else if ($type == 'null') {\n out += ' if (' + ($data) + ' === \\'\\' || ' + ($data) + ' === 0 || ' + ($data) + ' === false) ' + ($coerced) + ' = null; ';\n } else if (it.opts.coerceTypes == 'array' && $type == 'array') {\n out += ' if (' + ($dataType) + ' == \\'string\\' || ' + ($dataType) + ' == \\'number\\' || ' + ($dataType) + ' == \\'boolean\\' || ' + ($data) + ' == null) ' + ($coerced) + ' = [' + ($data) + ']; ';\n }\n }\n }\n out += ' ' + ($bracesCoercion) + ' if (' + ($coerced) + ' === undefined) { ';\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ($errorKeyword || 'type') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \\'';\n if ($typeIsArray) {\n out += '' + ($typeSchema.join(\",\"));\n } else {\n out += '' + ($typeSchema);\n }\n out += '\\' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should be ';\n if ($typeIsArray) {\n out += '' + ($typeSchema.join(\",\"));\n } else {\n out += '' + ($typeSchema);\n }\n out += '\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += ' } else { ';\n var $parentData = $dataLvl ? 'data' + (($dataLvl - 1) || '') : 'parentData',\n $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty';\n out += ' ' + ($data) + ' = ' + ($coerced) + '; ';\n if (!$dataLvl) {\n out += 'if (' + ($parentData) + ' !== undefined)';\n }\n out += ' ' + ($parentData) + '[' + ($parentDataProperty) + '] = ' + ($coerced) + '; } ';\n } else {\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ($errorKeyword || 'type') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \\'';\n if ($typeIsArray) {\n out += '' + ($typeSchema.join(\",\"));\n } else {\n out += '' + ($typeSchema);\n }\n out += '\\' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should be ';\n if ($typeIsArray) {\n out += '' + ($typeSchema.join(\",\"));\n } else {\n out += '' + ($typeSchema);\n }\n out += '\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n }\n out += ' } ';\n }\n }\n if (it.schema.$ref && !$refKeywords) {\n out += ' ' + (it.RULES.all.$ref.code(it, '$ref')) + ' ';\n if ($breakOnError) {\n out += ' } if (errors === ';\n if ($top) {\n out += '0';\n } else {\n out += 'errs_' + ($lvl);\n }\n out += ') { ';\n $closingBraces2 += '}';\n }\n } else {\n var arr2 = it.RULES;\n if (arr2) {\n var $rulesGroup, i2 = -1,\n l2 = arr2.length - 1;\n while (i2 < l2) {\n $rulesGroup = arr2[i2 += 1];\n if ($shouldUseGroup($rulesGroup)) {\n if ($rulesGroup.type) {\n out += ' if (' + (it.util.checkDataType($rulesGroup.type, $data)) + ') { ';\n }\n if (it.opts.useDefaults) {\n if ($rulesGroup.type == 'object' && it.schema.properties) {\n var $schema = it.schema.properties,\n $schemaKeys = Object.keys($schema);\n var arr3 = $schemaKeys;\n if (arr3) {\n var $propertyKey, i3 = -1,\n l3 = arr3.length - 1;\n while (i3 < l3) {\n $propertyKey = arr3[i3 += 1];\n var $sch = $schema[$propertyKey];\n if ($sch.default !== undefined) {\n var $passData = $data + it.util.getProperty($propertyKey);\n if (it.compositeRule) {\n if (it.opts.strictDefaults) {\n var $defaultMsg = 'default is ignored for: ' + $passData;\n if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg);\n else throw new Error($defaultMsg);\n }\n } else {\n out += ' if (' + ($passData) + ' === undefined ';\n if (it.opts.useDefaults == 'empty') {\n out += ' || ' + ($passData) + ' === null || ' + ($passData) + ' === \\'\\' ';\n }\n out += ' ) ' + ($passData) + ' = ';\n if (it.opts.useDefaults == 'shared') {\n out += ' ' + (it.useDefault($sch.default)) + ' ';\n } else {\n out += ' ' + (JSON.stringify($sch.default)) + ' ';\n }\n out += '; ';\n }\n }\n }\n }\n } else if ($rulesGroup.type == 'array' && Array.isArray(it.schema.items)) {\n var arr4 = it.schema.items;\n if (arr4) {\n var $sch, $i = -1,\n l4 = arr4.length - 1;\n while ($i < l4) {\n $sch = arr4[$i += 1];\n if ($sch.default !== undefined) {\n var $passData = $data + '[' + $i + ']';\n if (it.compositeRule) {\n if (it.opts.strictDefaults) {\n var $defaultMsg = 'default is ignored for: ' + $passData;\n if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg);\n else throw new Error($defaultMsg);\n }\n } else {\n out += ' if (' + ($passData) + ' === undefined ';\n if (it.opts.useDefaults == 'empty') {\n out += ' || ' + ($passData) + ' === null || ' + ($passData) + ' === \\'\\' ';\n }\n out += ' ) ' + ($passData) + ' = ';\n if (it.opts.useDefaults == 'shared') {\n out += ' ' + (it.useDefault($sch.default)) + ' ';\n } else {\n out += ' ' + (JSON.stringify($sch.default)) + ' ';\n }\n out += '; ';\n }\n }\n }\n }\n }\n }\n var arr5 = $rulesGroup.rules;\n if (arr5) {\n var $rule, i5 = -1,\n l5 = arr5.length - 1;\n while (i5 < l5) {\n $rule = arr5[i5 += 1];\n if ($shouldUseRule($rule)) {\n var $code = $rule.code(it, $rule.keyword, $rulesGroup.type);\n if ($code) {\n out += ' ' + ($code) + ' ';\n if ($breakOnError) {\n $closingBraces1 += '}';\n }\n }\n }\n }\n }\n if ($breakOnError) {\n out += ' ' + ($closingBraces1) + ' ';\n $closingBraces1 = '';\n }\n if ($rulesGroup.type) {\n out += ' } ';\n if ($typeSchema && $typeSchema === $rulesGroup.type && !$coerceToTypes) {\n out += ' else { ';\n var $schemaPath = it.schemaPath + '.type',\n $errSchemaPath = it.errSchemaPath + '/type';\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ($errorKeyword || 'type') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \\'';\n if ($typeIsArray) {\n out += '' + ($typeSchema.join(\",\"));\n } else {\n out += '' + ($typeSchema);\n }\n out += '\\' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should be ';\n if ($typeIsArray) {\n out += '' + ($typeSchema.join(\",\"));\n } else {\n out += '' + ($typeSchema);\n }\n out += '\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += ' } ';\n }\n }\n if ($breakOnError) {\n out += ' if (errors === ';\n if ($top) {\n out += '0';\n } else {\n out += 'errs_' + ($lvl);\n }\n out += ') { ';\n $closingBraces2 += '}';\n }\n }\n }\n }\n }\n if ($breakOnError) {\n out += ' ' + ($closingBraces2) + ' ';\n }\n if ($top) {\n if ($async) {\n out += ' if (errors === 0) return data; ';\n out += ' else throw new ValidationError(vErrors); ';\n } else {\n out += ' validate.errors = vErrors; ';\n out += ' return errors === 0; ';\n }\n out += ' }; return validate;';\n } else {\n out += ' var ' + ($valid) + ' = errors === errs_' + ($lvl) + ';';\n }\n out = it.util.cleanUpCode(out);\n if ($top) {\n out = it.util.finalCleanUpCode(out, $async);\n }\n\n function $shouldUseGroup($rulesGroup) {\n var rules = $rulesGroup.rules;\n for (var i = 0; i < rules.length; i++)\n if ($shouldUseRule(rules[i])) return true;\n }\n\n function $shouldUseRule($rule) {\n return it.schema[$rule.keyword] !== undefined || ($rule.implements && $ruleImplementsSomeKeyword($rule));\n }\n\n function $ruleImplementsSomeKeyword($rule) {\n var impl = $rule.implements;\n for (var i = 0; i < impl.length; i++)\n if (it.schema[impl[i]] !== undefined) return true;\n }\n return out;\n}\n","'use strict';\nmodule.exports = function generate__limit(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $errorKeyword;\n var $data = 'data' + ($dataLvl || '');\n var $isData = it.opts.$data && $schema && $schema.$data,\n $schemaValue;\n if ($isData) {\n out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';\n $schemaValue = 'schema' + $lvl;\n } else {\n $schemaValue = $schema;\n }\n var $isMax = $keyword == 'maximum',\n $exclusiveKeyword = $isMax ? 'exclusiveMaximum' : 'exclusiveMinimum',\n $schemaExcl = it.schema[$exclusiveKeyword],\n $isDataExcl = it.opts.$data && $schemaExcl && $schemaExcl.$data,\n $op = $isMax ? '<' : '>',\n $notOp = $isMax ? '>' : '<',\n $errorKeyword = undefined;\n if ($isDataExcl) {\n var $schemaValueExcl = it.util.getData($schemaExcl.$data, $dataLvl, it.dataPathArr),\n $exclusive = 'exclusive' + $lvl,\n $exclType = 'exclType' + $lvl,\n $exclIsNumber = 'exclIsNumber' + $lvl,\n $opExpr = 'op' + $lvl,\n $opStr = '\\' + ' + $opExpr + ' + \\'';\n out += ' var schemaExcl' + ($lvl) + ' = ' + ($schemaValueExcl) + '; ';\n $schemaValueExcl = 'schemaExcl' + $lvl;\n out += ' var ' + ($exclusive) + '; var ' + ($exclType) + ' = typeof ' + ($schemaValueExcl) + '; if (' + ($exclType) + ' != \\'boolean\\' && ' + ($exclType) + ' != \\'undefined\\' && ' + ($exclType) + ' != \\'number\\') { ';\n var $errorKeyword = $exclusiveKeyword;\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ($errorKeyword || '_exclusiveLimit') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'' + ($exclusiveKeyword) + ' should be boolean\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += ' } else if ( ';\n if ($isData) {\n out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \\'number\\') || ';\n }\n out += ' ' + ($exclType) + ' == \\'number\\' ? ( (' + ($exclusive) + ' = ' + ($schemaValue) + ' === undefined || ' + ($schemaValueExcl) + ' ' + ($op) + '= ' + ($schemaValue) + ') ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaValueExcl) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) : ( (' + ($exclusive) + ' = ' + ($schemaValueExcl) + ' === true) ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaValue) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) || ' + ($data) + ' !== ' + ($data) + ') { var op' + ($lvl) + ' = ' + ($exclusive) + ' ? \\'' + ($op) + '\\' : \\'' + ($op) + '=\\'; ';\n if ($schema === undefined) {\n $errorKeyword = $exclusiveKeyword;\n $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword;\n $schemaValue = $schemaValueExcl;\n $isData = $isDataExcl;\n }\n } else {\n var $exclIsNumber = typeof $schemaExcl == 'number',\n $opStr = $op;\n if ($exclIsNumber && $isData) {\n var $opExpr = '\\'' + $opStr + '\\'';\n out += ' if ( ';\n if ($isData) {\n out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \\'number\\') || ';\n }\n out += ' ( ' + ($schemaValue) + ' === undefined || ' + ($schemaExcl) + ' ' + ($op) + '= ' + ($schemaValue) + ' ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaExcl) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) || ' + ($data) + ' !== ' + ($data) + ') { ';\n } else {\n if ($exclIsNumber && $schema === undefined) {\n $exclusive = true;\n $errorKeyword = $exclusiveKeyword;\n $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword;\n $schemaValue = $schemaExcl;\n $notOp += '=';\n } else {\n if ($exclIsNumber) $schemaValue = Math[$isMax ? 'min' : 'max']($schemaExcl, $schema);\n if ($schemaExcl === ($exclIsNumber ? $schemaValue : true)) {\n $exclusive = true;\n $errorKeyword = $exclusiveKeyword;\n $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword;\n $notOp += '=';\n } else {\n $exclusive = false;\n $opStr += '=';\n }\n }\n var $opExpr = '\\'' + $opStr + '\\'';\n out += ' if ( ';\n if ($isData) {\n out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \\'number\\') || ';\n }\n out += ' ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' || ' + ($data) + ' !== ' + ($data) + ') { ';\n }\n }\n $errorKeyword = $errorKeyword || $keyword;\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ($errorKeyword || '_limit') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { comparison: ' + ($opExpr) + ', limit: ' + ($schemaValue) + ', exclusive: ' + ($exclusive) + ' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should be ' + ($opStr) + ' ';\n if ($isData) {\n out += '\\' + ' + ($schemaValue);\n } else {\n out += '' + ($schemaValue) + '\\'';\n }\n }\n if (it.opts.verbose) {\n out += ' , schema: ';\n if ($isData) {\n out += 'validate.schema' + ($schemaPath);\n } else {\n out += '' + ($schema);\n }\n out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += ' } ';\n if ($breakOnError) {\n out += ' else { ';\n }\n return out;\n}\n","'use strict';\nmodule.exports = function generate__limitItems(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $errorKeyword;\n var $data = 'data' + ($dataLvl || '');\n var $isData = it.opts.$data && $schema && $schema.$data,\n $schemaValue;\n if ($isData) {\n out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';\n $schemaValue = 'schema' + $lvl;\n } else {\n $schemaValue = $schema;\n }\n var $op = $keyword == 'maxItems' ? '>' : '<';\n out += 'if ( ';\n if ($isData) {\n out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \\'number\\') || ';\n }\n out += ' ' + ($data) + '.length ' + ($op) + ' ' + ($schemaValue) + ') { ';\n var $errorKeyword = $keyword;\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ($errorKeyword || '_limitItems') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should NOT have ';\n if ($keyword == 'maxItems') {\n out += 'more';\n } else {\n out += 'fewer';\n }\n out += ' than ';\n if ($isData) {\n out += '\\' + ' + ($schemaValue) + ' + \\'';\n } else {\n out += '' + ($schema);\n }\n out += ' items\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: ';\n if ($isData) {\n out += 'validate.schema' + ($schemaPath);\n } else {\n out += '' + ($schema);\n }\n out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += '} ';\n if ($breakOnError) {\n out += ' else { ';\n }\n return out;\n}\n","'use strict';\nmodule.exports = function generate__limitLength(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $errorKeyword;\n var $data = 'data' + ($dataLvl || '');\n var $isData = it.opts.$data && $schema && $schema.$data,\n $schemaValue;\n if ($isData) {\n out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';\n $schemaValue = 'schema' + $lvl;\n } else {\n $schemaValue = $schema;\n }\n var $op = $keyword == 'maxLength' ? '>' : '<';\n out += 'if ( ';\n if ($isData) {\n out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \\'number\\') || ';\n }\n if (it.opts.unicode === false) {\n out += ' ' + ($data) + '.length ';\n } else {\n out += ' ucs2length(' + ($data) + ') ';\n }\n out += ' ' + ($op) + ' ' + ($schemaValue) + ') { ';\n var $errorKeyword = $keyword;\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ($errorKeyword || '_limitLength') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should NOT be ';\n if ($keyword == 'maxLength') {\n out += 'longer';\n } else {\n out += 'shorter';\n }\n out += ' than ';\n if ($isData) {\n out += '\\' + ' + ($schemaValue) + ' + \\'';\n } else {\n out += '' + ($schema);\n }\n out += ' characters\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: ';\n if ($isData) {\n out += 'validate.schema' + ($schemaPath);\n } else {\n out += '' + ($schema);\n }\n out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += '} ';\n if ($breakOnError) {\n out += ' else { ';\n }\n return out;\n}\n","'use strict';\nmodule.exports = function generate__limitProperties(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $errorKeyword;\n var $data = 'data' + ($dataLvl || '');\n var $isData = it.opts.$data && $schema && $schema.$data,\n $schemaValue;\n if ($isData) {\n out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';\n $schemaValue = 'schema' + $lvl;\n } else {\n $schemaValue = $schema;\n }\n var $op = $keyword == 'maxProperties' ? '>' : '<';\n out += 'if ( ';\n if ($isData) {\n out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \\'number\\') || ';\n }\n out += ' Object.keys(' + ($data) + ').length ' + ($op) + ' ' + ($schemaValue) + ') { ';\n var $errorKeyword = $keyword;\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ($errorKeyword || '_limitProperties') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should NOT have ';\n if ($keyword == 'maxProperties') {\n out += 'more';\n } else {\n out += 'fewer';\n }\n out += ' than ';\n if ($isData) {\n out += '\\' + ' + ($schemaValue) + ' + \\'';\n } else {\n out += '' + ($schema);\n }\n out += ' properties\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: ';\n if ($isData) {\n out += 'validate.schema' + ($schemaPath);\n } else {\n out += '' + ($schema);\n }\n out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += '} ';\n if ($breakOnError) {\n out += ' else { ';\n }\n return out;\n}\n","module.exports = function() {\n\tthrow new Error(\"define cannot be used indirect\");\n};\n","var getPrototypeOf = require(\"./getPrototypeOf\");\n\nvar setPrototypeOf = require(\"./setPrototypeOf\");\n\nvar isNativeFunction = require(\"./isNativeFunction\");\n\nvar construct = require(\"./construct\");\n\nfunction _wrapNativeSuper(Class) {\n var _cache = typeof Map === \"function\" ? new Map() : undefined;\n\n module.exports = _wrapNativeSuper = function _wrapNativeSuper(Class) {\n if (Class === null || !isNativeFunction(Class)) return Class;\n\n if (typeof Class !== \"function\") {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n if (typeof _cache !== \"undefined\") {\n if (_cache.has(Class)) return _cache.get(Class);\n\n _cache.set(Class, Wrapper);\n }\n\n function Wrapper() {\n return construct(Class, arguments, getPrototypeOf(this).constructor);\n }\n\n Wrapper.prototype = Object.create(Class.prototype, {\n constructor: {\n value: Wrapper,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n return setPrototypeOf(Wrapper, Class);\n };\n\n return _wrapNativeSuper(Class);\n}\n\nmodule.exports = _wrapNativeSuper;","function _asyncIterator(iterable) {\n var method;\n\n if (typeof Symbol !== \"undefined\") {\n if (Symbol.asyncIterator) {\n method = iterable[Symbol.asyncIterator];\n if (method != null) return method.call(iterable);\n }\n\n if (Symbol.iterator) {\n method = iterable[Symbol.iterator];\n if (method != null) return method.call(iterable);\n }\n }\n\n throw new TypeError(\"Object is not async iterable\");\n}\n\nmodule.exports = _asyncIterator;","var AsyncGenerator = require(\"./AsyncGenerator\");\n\nfunction _wrapAsyncGenerator(fn) {\n return function () {\n return new AsyncGenerator(fn.apply(this, arguments));\n };\n}\n\nmodule.exports = _wrapAsyncGenerator;","var baseMerge = require('./_baseMerge'),\n createAssigner = require('./_createAssigner');\n\n/**\n * This method is like `_.assign` except that it recursively merges own and\n * inherited enumerable string keyed properties of source objects into the\n * destination object. Source properties that resolve to `undefined` are\n * skipped if a destination value exists. Array and plain object properties\n * are merged recursively. Other objects and value types are overridden by\n * assignment. Source objects are applied from left to right. Subsequent\n * sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {\n * 'a': [{ 'b': 2 }, { 'd': 4 }]\n * };\n *\n * var other = {\n * 'a': [{ 'c': 3 }, { 'e': 5 }]\n * };\n *\n * _.merge(object, other);\n * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n */\nvar merge = createAssigner(function(object, source, srcIndex) {\n baseMerge(object, source, srcIndex);\n});\n\nmodule.exports = merge;\n","'use strict';\n\nvar compileSchema = require('./compile')\n , resolve = require('./compile/resolve')\n , Cache = require('./cache')\n , SchemaObject = require('./compile/schema_obj')\n , stableStringify = require('fast-json-stable-stringify')\n , formats = require('./compile/formats')\n , rules = require('./compile/rules')\n , $dataMetaSchema = require('./data')\n , util = require('./compile/util');\n\nmodule.exports = Ajv;\n\nAjv.prototype.validate = validate;\nAjv.prototype.compile = compile;\nAjv.prototype.addSchema = addSchema;\nAjv.prototype.addMetaSchema = addMetaSchema;\nAjv.prototype.validateSchema = validateSchema;\nAjv.prototype.getSchema = getSchema;\nAjv.prototype.removeSchema = removeSchema;\nAjv.prototype.addFormat = addFormat;\nAjv.prototype.errorsText = errorsText;\n\nAjv.prototype._addSchema = _addSchema;\nAjv.prototype._compile = _compile;\n\nAjv.prototype.compileAsync = require('./compile/async');\nvar customKeyword = require('./keyword');\nAjv.prototype.addKeyword = customKeyword.add;\nAjv.prototype.getKeyword = customKeyword.get;\nAjv.prototype.removeKeyword = customKeyword.remove;\nAjv.prototype.validateKeyword = customKeyword.validate;\n\nvar errorClasses = require('./compile/error_classes');\nAjv.ValidationError = errorClasses.Validation;\nAjv.MissingRefError = errorClasses.MissingRef;\nAjv.$dataMetaSchema = $dataMetaSchema;\n\nvar META_SCHEMA_ID = 'http://json-schema.org/draft-07/schema';\n\nvar META_IGNORE_OPTIONS = [ 'removeAdditional', 'useDefaults', 'coerceTypes', 'strictDefaults' ];\nvar META_SUPPORT_DATA = ['/properties'];\n\n/**\n * Creates validator instance.\n * Usage: `Ajv(opts)`\n * @param {Object} opts optional options\n * @return {Object} ajv instance\n */\nfunction Ajv(opts) {\n if (!(this instanceof Ajv)) return new Ajv(opts);\n opts = this._opts = util.copy(opts) || {};\n setLogger(this);\n this._schemas = {};\n this._refs = {};\n this._fragments = {};\n this._formats = formats(opts.format);\n\n this._cache = opts.cache || new Cache;\n this._loadingSchemas = {};\n this._compilations = [];\n this.RULES = rules();\n this._getId = chooseGetId(opts);\n\n opts.loopRequired = opts.loopRequired || Infinity;\n if (opts.errorDataPath == 'property') opts._errorDataPathProperty = true;\n if (opts.serialize === undefined) opts.serialize = stableStringify;\n this._metaOpts = getMetaSchemaOptions(this);\n\n if (opts.formats) addInitialFormats(this);\n if (opts.keywords) addInitialKeywords(this);\n addDefaultMetaSchema(this);\n if (typeof opts.meta == 'object') this.addMetaSchema(opts.meta);\n if (opts.nullable) this.addKeyword('nullable', {metaSchema: {type: 'boolean'}});\n addInitialSchemas(this);\n}\n\n\n\n/**\n * Validate data using schema\n * Schema will be compiled and cached (using serialized JSON as key. [fast-json-stable-stringify](https://github.com/epoberezkin/fast-json-stable-stringify) is used to serialize.\n * @this Ajv\n * @param {String|Object} schemaKeyRef key, ref or schema object\n * @param {Any} data to be validated\n * @return {Boolean} validation result. Errors from the last validation will be available in `ajv.errors` (and also in compiled schema: `schema.errors`).\n */\nfunction validate(schemaKeyRef, data) {\n var v;\n if (typeof schemaKeyRef == 'string') {\n v = this.getSchema(schemaKeyRef);\n if (!v) throw new Error('no schema with key or ref \"' + schemaKeyRef + '\"');\n } else {\n var schemaObj = this._addSchema(schemaKeyRef);\n v = schemaObj.validate || this._compile(schemaObj);\n }\n\n var valid = v(data);\n if (v.$async !== true) this.errors = v.errors;\n return valid;\n}\n\n\n/**\n * Create validating function for passed schema.\n * @this Ajv\n * @param {Object} schema schema object\n * @param {Boolean} _meta true if schema is a meta-schema. Used internally to compile meta schemas of custom keywords.\n * @return {Function} validating function\n */\nfunction compile(schema, _meta) {\n var schemaObj = this._addSchema(schema, undefined, _meta);\n return schemaObj.validate || this._compile(schemaObj);\n}\n\n\n/**\n * Adds schema to the instance.\n * @this Ajv\n * @param {Object|Array} schema schema or array of schemas. If array is passed, `key` and other parameters will be ignored.\n * @param {String} key Optional schema key. Can be passed to `validate` method instead of schema object or id/ref. One schema per instance can have empty `id` and `key`.\n * @param {Boolean} _skipValidation true to skip schema validation. Used internally, option validateSchema should be used instead.\n * @param {Boolean} _meta true if schema is a meta-schema. Used internally, addMetaSchema should be used instead.\n * @return {Ajv} this for method chaining\n */\nfunction addSchema(schema, key, _skipValidation, _meta) {\n if (Array.isArray(schema)){\n for (var i=0; i} errors optional array of validation errors, if not passed errors from the instance are used.\n * @param {Object} options optional options with properties `separator` and `dataVar`.\n * @return {String} human readable string with all errors descriptions\n */\nfunction errorsText(errors, options) {\n errors = errors || this.errors;\n if (!errors) return 'No errors';\n options = options || {};\n var separator = options.separator === undefined ? ', ' : options.separator;\n var dataVar = options.dataVar === undefined ? 'data' : options.dataVar;\n\n var text = '';\n for (var i=0; i result for the\n // current iteration.\n result.value = unwrapped;\n resolve(result);\n }, function(error) {\n // If a rejected Promise was yielded, throw the rejection back\n // into the async generator function so it can be handled there.\n return invoke(\"throw\", error, resolve, reject);\n });\n }\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new PromiseImpl(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n return this;\n };\n exports.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n exports.async = function(innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n if (PromiseImpl === void 0) PromiseImpl = Promise;\n\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList),\n PromiseImpl\n );\n\n return exports.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n // Note: [\"return\"] must be used for ES3 parsing compatibility.\n if (delegate.iterator[\"return\"]) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n Gp[toStringTagSymbol] = \"Generator\";\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n Gp[iteratorSymbol] = function() {\n return this;\n };\n\n Gp.toString = function() {\n return \"[object Generator]\";\n };\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n exports.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n exports.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n\n // Regardless of whether this script is executing as a CommonJS module\n // or not, return the runtime object so that we can declare the variable\n // regeneratorRuntime in the outer scope, which allows this module to be\n // injected easily by `bin/regenerator --include-runtime script.js`.\n return exports;\n\n}(\n // If this script is executing as a CommonJS module, use module.exports\n // as the regeneratorRuntime namespace. Otherwise create a new empty\n // object. Either way, the resulting object will be used to initialize\n // the regeneratorRuntime variable at the top of this file.\n typeof module === \"object\" ? module.exports : {}\n));\n\ntry {\n regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n // This module should not be running in strict mode, so the above\n // assignment should always work unless something is misconfigured. Just\n // in case runtime.js accidentally runs in strict mode, we can escape\n // strict mode using a global Function call. This could conceivably fail\n // if a Content Security Policy forbids using Function, but in that case\n // the proper solution is to fix the accidental strict mode problem. If\n // you've misconfigured your bundler to force strict mode and applied a\n // CSP to forbid Function, and you're not willing to fix either of those\n // problems, please detail your unique predicament in a GitHub issue.\n Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n}\n","'use strict';\nmodule.exports = str => encodeURIComponent(str).replace(/[!'()*]/g, x => `%${x.charCodeAt(0).toString(16).toUpperCase()}`);\n","'use strict';\nvar token = '%[a-f0-9]{2}';\nvar singleMatcher = new RegExp(token, 'gi');\nvar multiMatcher = new RegExp('(' + token + ')+', 'gi');\n\nfunction decodeComponents(components, split) {\n\ttry {\n\t\t// Try to decode the entire string first\n\t\treturn decodeURIComponent(components.join(''));\n\t} catch (err) {\n\t\t// Do nothing\n\t}\n\n\tif (components.length === 1) {\n\t\treturn components;\n\t}\n\n\tsplit = split || 1;\n\n\t// Split the array in 2 parts\n\tvar left = components.slice(0, split);\n\tvar right = components.slice(split);\n\n\treturn Array.prototype.concat.call([], decodeComponents(left), decodeComponents(right));\n}\n\nfunction decode(input) {\n\ttry {\n\t\treturn decodeURIComponent(input);\n\t} catch (err) {\n\t\tvar tokens = input.match(singleMatcher);\n\n\t\tfor (var i = 1; i < tokens.length; i++) {\n\t\t\tinput = decodeComponents(tokens, i).join('');\n\n\t\t\ttokens = input.match(singleMatcher);\n\t\t}\n\n\t\treturn input;\n\t}\n}\n\nfunction customDecodeURIComponent(input) {\n\t// Keep track of all the replacements and prefill the map with the `BOM`\n\tvar replaceMap = {\n\t\t'%FE%FF': '\\uFFFD\\uFFFD',\n\t\t'%FF%FE': '\\uFFFD\\uFFFD'\n\t};\n\n\tvar match = multiMatcher.exec(input);\n\twhile (match) {\n\t\ttry {\n\t\t\t// Decode as big chunks as possible\n\t\t\treplaceMap[match[0]] = decodeURIComponent(match[0]);\n\t\t} catch (err) {\n\t\t\tvar result = decode(match[0]);\n\n\t\t\tif (result !== match[0]) {\n\t\t\t\treplaceMap[match[0]] = result;\n\t\t\t}\n\t\t}\n\n\t\tmatch = multiMatcher.exec(input);\n\t}\n\n\t// Add `%C2` at the end of the map to make sure it does not replace the combinator before everything else\n\treplaceMap['%C2'] = '\\uFFFD';\n\n\tvar entries = Object.keys(replaceMap);\n\n\tfor (var i = 0; i < entries.length; i++) {\n\t\t// Replace all decoded components\n\t\tvar key = entries[i];\n\t\tinput = input.replace(new RegExp(key, 'g'), replaceMap[key]);\n\t}\n\n\treturn input;\n}\n\nmodule.exports = function (encodedURI) {\n\tif (typeof encodedURI !== 'string') {\n\t\tthrow new TypeError('Expected `encodedURI` to be of type `string`, got `' + typeof encodedURI + '`');\n\t}\n\n\ttry {\n\t\tencodedURI = encodedURI.replace(/\\+/g, ' ');\n\n\t\t// Try the built in decoder first\n\t\treturn decodeURIComponent(encodedURI);\n\t} catch (err) {\n\t\t// Fallback to a more advanced decoder\n\t\treturn customDecodeURIComponent(encodedURI);\n\t}\n};\n","'use strict';\n\nmodule.exports = (string, separator) => {\n\tif (!(typeof string === 'string' && typeof separator === 'string')) {\n\t\tthrow new TypeError('Expected the arguments to be of type `string`');\n\t}\n\n\tif (separator === '') {\n\t\treturn [string];\n\t}\n\n\tconst separatorIndex = string.indexOf(separator);\n\n\tif (separatorIndex === -1) {\n\t\treturn [string];\n\t}\n\n\treturn [\n\t\tstring.slice(0, separatorIndex),\n\t\tstring.slice(separatorIndex + separator.length)\n\t];\n};\n","function _isNativeFunction(fn) {\n return Function.toString.call(fn).indexOf(\"[native code]\") !== -1;\n}\n\nmodule.exports = _isNativeFunction;","function _isNativeReflectConstruct() {\n if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === \"function\") return true;\n\n try {\n Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n}\n\nmodule.exports = _isNativeReflectConstruct;","var AwaitValue = require(\"./AwaitValue\");\n\nfunction _awaitAsyncGenerator(value) {\n return new AwaitValue(value);\n}\n\nmodule.exports = _awaitAsyncGenerator;","var AwaitValue = require(\"./AwaitValue\");\n\nfunction AsyncGenerator(gen) {\n var front, back;\n\n function send(key, arg) {\n return new Promise(function (resolve, reject) {\n var request = {\n key: key,\n arg: arg,\n resolve: resolve,\n reject: reject,\n next: null\n };\n\n if (back) {\n back = back.next = request;\n } else {\n front = back = request;\n resume(key, arg);\n }\n });\n }\n\n function resume(key, arg) {\n try {\n var result = gen[key](arg);\n var value = result.value;\n var wrappedAwait = value instanceof AwaitValue;\n Promise.resolve(wrappedAwait ? value.wrapped : value).then(function (arg) {\n if (wrappedAwait) {\n resume(key === \"return\" ? \"return\" : \"next\", arg);\n return;\n }\n\n settle(result.done ? \"return\" : \"normal\", arg);\n }, function (err) {\n resume(\"throw\", err);\n });\n } catch (err) {\n settle(\"throw\", err);\n }\n }\n\n function settle(type, value) {\n switch (type) {\n case \"return\":\n front.resolve({\n value: value,\n done: true\n });\n break;\n\n case \"throw\":\n front.reject(value);\n break;\n\n default:\n front.resolve({\n value: value,\n done: false\n });\n break;\n }\n\n front = front.next;\n\n if (front) {\n resume(front.key, front.arg);\n } else {\n back = null;\n }\n }\n\n this._invoke = send;\n\n if (typeof gen[\"return\"] !== \"function\") {\n this[\"return\"] = undefined;\n }\n}\n\nif (typeof Symbol === \"function\" && Symbol.asyncIterator) {\n AsyncGenerator.prototype[Symbol.asyncIterator] = function () {\n return this;\n };\n}\n\nAsyncGenerator.prototype.next = function (arg) {\n return this._invoke(\"next\", arg);\n};\n\nAsyncGenerator.prototype[\"throw\"] = function (arg) {\n return this._invoke(\"throw\", arg);\n};\n\nAsyncGenerator.prototype[\"return\"] = function (arg) {\n return this._invoke(\"return\", arg);\n};\n\nmodule.exports = AsyncGenerator;","var Stack = require('./_Stack'),\n arrayEach = require('./_arrayEach'),\n assignValue = require('./_assignValue'),\n baseAssign = require('./_baseAssign'),\n baseAssignIn = require('./_baseAssignIn'),\n cloneBuffer = require('./_cloneBuffer'),\n copyArray = require('./_copyArray'),\n copySymbols = require('./_copySymbols'),\n copySymbolsIn = require('./_copySymbolsIn'),\n getAllKeys = require('./_getAllKeys'),\n getAllKeysIn = require('./_getAllKeysIn'),\n getTag = require('./_getTag'),\n initCloneArray = require('./_initCloneArray'),\n initCloneByTag = require('./_initCloneByTag'),\n initCloneObject = require('./_initCloneObject'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isMap = require('./isMap'),\n isObject = require('./isObject'),\n isSet = require('./isSet'),\n keys = require('./keys');\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n CLONE_FLAT_FLAG = 2,\n CLONE_SYMBOLS_FLAG = 4;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values supported by `_.clone`. */\nvar cloneableTags = {};\ncloneableTags[argsTag] = cloneableTags[arrayTag] =\ncloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\ncloneableTags[boolTag] = cloneableTags[dateTag] =\ncloneableTags[float32Tag] = cloneableTags[float64Tag] =\ncloneableTags[int8Tag] = cloneableTags[int16Tag] =\ncloneableTags[int32Tag] = cloneableTags[mapTag] =\ncloneableTags[numberTag] = cloneableTags[objectTag] =\ncloneableTags[regexpTag] = cloneableTags[setTag] =\ncloneableTags[stringTag] = cloneableTags[symbolTag] =\ncloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\ncloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\ncloneableTags[errorTag] = cloneableTags[funcTag] =\ncloneableTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n * traversed objects.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Deep clone\n * 2 - Flatten inherited properties\n * 4 - Clone symbols\n * @param {Function} [customizer] The function to customize cloning.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The parent object of `value`.\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n * @returns {*} Returns the cloned value.\n */\nfunction baseClone(value, bitmask, customizer, key, object, stack) {\n var result,\n isDeep = bitmask & CLONE_DEEP_FLAG,\n isFlat = bitmask & CLONE_FLAT_FLAG,\n isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n if (customizer) {\n result = object ? customizer(value, key, object, stack) : customizer(value);\n }\n if (result !== undefined) {\n return result;\n }\n if (!isObject(value)) {\n return value;\n }\n var isArr = isArray(value);\n if (isArr) {\n result = initCloneArray(value);\n if (!isDeep) {\n return copyArray(value, result);\n }\n } else {\n var tag = getTag(value),\n isFunc = tag == funcTag || tag == genTag;\n\n if (isBuffer(value)) {\n return cloneBuffer(value, isDeep);\n }\n if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n result = (isFlat || isFunc) ? {} : initCloneObject(value);\n if (!isDeep) {\n return isFlat\n ? copySymbolsIn(value, baseAssignIn(result, value))\n : copySymbols(value, baseAssign(result, value));\n }\n } else {\n if (!cloneableTags[tag]) {\n return object ? value : {};\n }\n result = initCloneByTag(value, tag, isDeep);\n }\n }\n // Check for circular references and return its corresponding clone.\n stack || (stack = new Stack);\n var stacked = stack.get(value);\n if (stacked) {\n return stacked;\n }\n stack.set(value, result);\n\n if (isSet(value)) {\n value.forEach(function(subValue) {\n result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n });\n } else if (isMap(value)) {\n value.forEach(function(subValue, key) {\n result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n }\n\n var keysFunc = isFull\n ? (isFlat ? getAllKeysIn : getAllKeys)\n : (isFlat ? keysIn : keys);\n\n var props = isArr ? undefined : keysFunc(value);\n arrayEach(props || value, function(subValue, key) {\n if (props) {\n key = subValue;\n subValue = value[key];\n }\n // Recursively populate clone (susceptible to call stack limits).\n assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n return result;\n}\n\nmodule.exports = baseClone;\n","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\nmodule.exports = listCacheClear;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\nmodule.exports = listCacheDelete;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\nmodule.exports = listCacheGet;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\nmodule.exports = listCacheSet;\n","var ListCache = require('./_ListCache');\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache;\n this.size = 0;\n}\n\nmodule.exports = stackClear;\n","/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n\n this.size = data.size;\n return result;\n}\n\nmodule.exports = stackDelete;\n","/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\nmodule.exports = stackGet;\n","/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\nmodule.exports = stackHas;\n","var ListCache = require('./_ListCache'),\n Map = require('./_Map'),\n MapCache = require('./_MapCache');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n}\n\nmodule.exports = stackSet;\n","var isFunction = require('./isFunction'),\n isMasked = require('./_isMasked'),\n isObject = require('./isObject'),\n toSource = require('./_toSource');\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","var coreJsData = require('./_coreJsData');\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n","var root = require('./_root');\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nmodule.exports = coreJsData;\n","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n","var Hash = require('./_Hash'),\n ListCache = require('./_ListCache'),\n Map = require('./_Map');\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\nmodule.exports = mapCacheClear;\n","var hashClear = require('./_hashClear'),\n hashDelete = require('./_hashDelete'),\n hashGet = require('./_hashGet'),\n hashHas = require('./_hashHas'),\n hashSet = require('./_hashSet');\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nmodule.exports = Hash;\n","var nativeCreate = require('./_nativeCreate');\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\nmodule.exports = hashClear;\n","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = hashDelete;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nmodule.exports = hashGet;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nmodule.exports = hashHas;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\nmodule.exports = hashSet;\n","var getMapData = require('./_getMapData');\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = mapCacheDelete;\n","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\nmodule.exports = isKeyable;\n","var getMapData = require('./_getMapData');\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\nmodule.exports = mapCacheGet;\n","var getMapData = require('./_getMapData');\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\nmodule.exports = mapCacheHas;\n","var getMapData = require('./_getMapData');\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\nmodule.exports = mapCacheSet;\n","/**\n * A specialized version of `_.forEach` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\nfunction arrayEach(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (iteratee(array[index], index, array) === false) {\n break;\n }\n }\n return array;\n}\n\nmodule.exports = arrayEach;\n","var copyObject = require('./_copyObject'),\n keys = require('./keys');\n\n/**\n * The base implementation of `_.assign` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssign(object, source) {\n return object && copyObject(source, keys(source), object);\n}\n\nmodule.exports = baseAssign;\n","/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\nmodule.exports = baseTimes;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nmodule.exports = baseIsArguments;\n","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nmodule.exports = stubFalse;\n","var baseGetTag = require('./_baseGetTag'),\n isLength = require('./isLength'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nmodule.exports = baseIsTypedArray;\n","var isPrototype = require('./_isPrototype'),\n nativeKeys = require('./_nativeKeys');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = baseKeys;\n","var overArg = require('./_overArg');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\nmodule.exports = nativeKeys;\n","var copyObject = require('./_copyObject'),\n keysIn = require('./keysIn');\n\n/**\n * The base implementation of `_.assignIn` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssignIn(object, source) {\n return object && copyObject(source, keysIn(source), object);\n}\n\nmodule.exports = baseAssignIn;\n","var isObject = require('./isObject'),\n isPrototype = require('./_isPrototype'),\n nativeKeysIn = require('./_nativeKeysIn');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeysIn(object) {\n if (!isObject(object)) {\n return nativeKeysIn(object);\n }\n var isProto = isPrototype(object),\n result = [];\n\n for (var key in object) {\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = baseKeysIn;\n","/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction nativeKeysIn(object) {\n var result = [];\n if (object != null) {\n for (var key in Object(object)) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = nativeKeysIn;\n","var copyObject = require('./_copyObject'),\n getSymbols = require('./_getSymbols');\n\n/**\n * Copies own symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbols(source, object) {\n return copyObject(source, getSymbols(source), object);\n}\n\nmodule.exports = copySymbols;\n","/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\n\nmodule.exports = arrayFilter;\n","var copyObject = require('./_copyObject'),\n getSymbolsIn = require('./_getSymbolsIn');\n\n/**\n * Copies own and inherited symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbolsIn(source, object) {\n return copyObject(source, getSymbolsIn(source), object);\n}\n\nmodule.exports = copySymbolsIn;\n","var baseGetAllKeys = require('./_baseGetAllKeys'),\n getSymbolsIn = require('./_getSymbolsIn'),\n keysIn = require('./keysIn');\n\n/**\n * Creates an array of own and inherited enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeysIn(object) {\n return baseGetAllKeys(object, keysIn, getSymbolsIn);\n}\n\nmodule.exports = getAllKeysIn;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView');\n\nmodule.exports = DataView;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Promise = getNative(root, 'Promise');\n\nmodule.exports = Promise;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nmodule.exports = WeakMap;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */\nfunction initCloneArray(array) {\n var length = array.length,\n result = new array.constructor(length);\n\n // Add properties assigned by `RegExp#exec`.\n if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n result.index = array.index;\n result.input = array.input;\n }\n return result;\n}\n\nmodule.exports = initCloneArray;\n","var cloneArrayBuffer = require('./_cloneArrayBuffer'),\n cloneDataView = require('./_cloneDataView'),\n cloneRegExp = require('./_cloneRegExp'),\n cloneSymbol = require('./_cloneSymbol'),\n cloneTypedArray = require('./_cloneTypedArray');\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneByTag(object, tag, isDeep) {\n var Ctor = object.constructor;\n switch (tag) {\n case arrayBufferTag:\n return cloneArrayBuffer(object);\n\n case boolTag:\n case dateTag:\n return new Ctor(+object);\n\n case dataViewTag:\n return cloneDataView(object, isDeep);\n\n case float32Tag: case float64Tag:\n case int8Tag: case int16Tag: case int32Tag:\n case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n return cloneTypedArray(object, isDeep);\n\n case mapTag:\n return new Ctor;\n\n case numberTag:\n case stringTag:\n return new Ctor(object);\n\n case regexpTag:\n return cloneRegExp(object);\n\n case setTag:\n return new Ctor;\n\n case symbolTag:\n return cloneSymbol(object);\n }\n}\n\nmodule.exports = initCloneByTag;\n","var cloneArrayBuffer = require('./_cloneArrayBuffer');\n\n/**\n * Creates a clone of `dataView`.\n *\n * @private\n * @param {Object} dataView The data view to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned data view.\n */\nfunction cloneDataView(dataView, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n}\n\nmodule.exports = cloneDataView;\n","/** Used to match `RegExp` flags from their coerced string values. */\nvar reFlags = /\\w*$/;\n\n/**\n * Creates a clone of `regexp`.\n *\n * @private\n * @param {Object} regexp The regexp to clone.\n * @returns {Object} Returns the cloned regexp.\n */\nfunction cloneRegExp(regexp) {\n var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n result.lastIndex = regexp.lastIndex;\n return result;\n}\n\nmodule.exports = cloneRegExp;\n","var Symbol = require('./_Symbol');\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * Creates a clone of the `symbol` object.\n *\n * @private\n * @param {Object} symbol The symbol object to clone.\n * @returns {Object} Returns the cloned symbol object.\n */\nfunction cloneSymbol(symbol) {\n return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n}\n\nmodule.exports = cloneSymbol;\n","var isObject = require('./isObject');\n\n/** Built-in value references. */\nvar objectCreate = Object.create;\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nvar baseCreate = (function() {\n function object() {}\n return function(proto) {\n if (!isObject(proto)) {\n return {};\n }\n if (objectCreate) {\n return objectCreate(proto);\n }\n object.prototype = proto;\n var result = new object;\n object.prototype = undefined;\n return result;\n };\n}());\n\nmodule.exports = baseCreate;\n","var baseIsMap = require('./_baseIsMap'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsMap = nodeUtil && nodeUtil.isMap;\n\n/**\n * Checks if `value` is classified as a `Map` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n * @example\n *\n * _.isMap(new Map);\n * // => true\n *\n * _.isMap(new WeakMap);\n * // => false\n */\nvar isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\nmodule.exports = isMap;\n","var getTag = require('./_getTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]';\n\n/**\n * The base implementation of `_.isMap` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n */\nfunction baseIsMap(value) {\n return isObjectLike(value) && getTag(value) == mapTag;\n}\n\nmodule.exports = baseIsMap;\n","var baseIsSet = require('./_baseIsSet'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsSet = nodeUtil && nodeUtil.isSet;\n\n/**\n * Checks if `value` is classified as a `Set` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n * @example\n *\n * _.isSet(new Set);\n * // => true\n *\n * _.isSet(new WeakSet);\n * // => false\n */\nvar isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\nmodule.exports = isSet;\n","var getTag = require('./_getTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar setTag = '[object Set]';\n\n/**\n * The base implementation of `_.isSet` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n */\nfunction baseIsSet(value) {\n return isObjectLike(value) && getTag(value) == setTag;\n}\n\nmodule.exports = baseIsSet;\n","var baseMatches = require('./_baseMatches'),\n baseMatchesProperty = require('./_baseMatchesProperty'),\n identity = require('./identity'),\n isArray = require('./isArray'),\n property = require('./property');\n\n/**\n * The base implementation of `_.iteratee`.\n *\n * @private\n * @param {*} [value=_.identity] The value to convert to an iteratee.\n * @returns {Function} Returns the iteratee.\n */\nfunction baseIteratee(value) {\n // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n if (typeof value == 'function') {\n return value;\n }\n if (value == null) {\n return identity;\n }\n if (typeof value == 'object') {\n return isArray(value)\n ? baseMatchesProperty(value[0], value[1])\n : baseMatches(value);\n }\n return property(value);\n}\n\nmodule.exports = baseIteratee;\n","var baseIsMatch = require('./_baseIsMatch'),\n getMatchData = require('./_getMatchData'),\n matchesStrictComparable = require('./_matchesStrictComparable');\n\n/**\n * The base implementation of `_.matches` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatches(source) {\n var matchData = getMatchData(source);\n if (matchData.length == 1 && matchData[0][2]) {\n return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n }\n return function(object) {\n return object === source || baseIsMatch(object, source, matchData);\n };\n}\n\nmodule.exports = baseMatches;\n","var Stack = require('./_Stack'),\n baseIsEqual = require('./_baseIsEqual');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Array} matchData The property names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\nfunction baseIsMatch(object, source, matchData, customizer) {\n var index = matchData.length,\n length = index,\n noCustomizer = !customizer;\n\n if (object == null) {\n return !length;\n }\n object = Object(object);\n while (index--) {\n var data = matchData[index];\n if ((noCustomizer && data[2])\n ? data[1] !== object[data[0]]\n : !(data[0] in object)\n ) {\n return false;\n }\n }\n while (++index < length) {\n data = matchData[index];\n var key = data[0],\n objValue = object[key],\n srcValue = data[1];\n\n if (noCustomizer && data[2]) {\n if (objValue === undefined && !(key in object)) {\n return false;\n }\n } else {\n var stack = new Stack;\n if (customizer) {\n var result = customizer(objValue, srcValue, key, object, source, stack);\n }\n if (!(result === undefined\n ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n : result\n )) {\n return false;\n }\n }\n }\n return true;\n}\n\nmodule.exports = baseIsMatch;\n","var Stack = require('./_Stack'),\n equalArrays = require('./_equalArrays'),\n equalByTag = require('./_equalByTag'),\n equalObjects = require('./_equalObjects'),\n getTag = require('./_getTag'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isTypedArray = require('./isTypedArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = objIsArr ? arrayTag : getTag(object),\n othTag = othIsArr ? arrayTag : getTag(other);\n\n objTag = objTag == argsTag ? objectTag : objTag;\n othTag = othTag == argsTag ? objectTag : othTag;\n\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && isBuffer(object)) {\n if (!isBuffer(other)) {\n return false;\n }\n objIsArr = true;\n objIsObj = false;\n }\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack);\n return (objIsArr || isTypedArray(object))\n ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n }\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n\n stack || (stack = new Stack);\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n }\n }\n if (!isSameTag) {\n return false;\n }\n stack || (stack = new Stack);\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n}\n\nmodule.exports = baseIsEqualDeep;\n","/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n}\n\nmodule.exports = setCacheAdd;\n","/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n return this.__data__.has(value);\n}\n\nmodule.exports = setCacheHas;\n","/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\nfunction arraySome(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n}\n\nmodule.exports = arraySome;\n","var Symbol = require('./_Symbol'),\n Uint8Array = require('./_Uint8Array'),\n eq = require('./eq'),\n equalArrays = require('./_equalArrays'),\n mapToArray = require('./_mapToArray'),\n setToArray = require('./_setToArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]';\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n switch (tag) {\n case dataViewTag:\n if ((object.byteLength != other.byteLength) ||\n (object.byteOffset != other.byteOffset)) {\n return false;\n }\n object = object.buffer;\n other = other.buffer;\n\n case arrayBufferTag:\n if ((object.byteLength != other.byteLength) ||\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n return false;\n }\n return true;\n\n case boolTag:\n case dateTag:\n case numberTag:\n // Coerce booleans to `1` or `0` and dates to milliseconds.\n // Invalid dates are coerced to `NaN`.\n return eq(+object, +other);\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings, primitives and objects,\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n // for more details.\n return object == (other + '');\n\n case mapTag:\n var convert = mapToArray;\n\n case setTag:\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n convert || (convert = setToArray);\n\n if (object.size != other.size && !isPartial) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked) {\n return stacked == other;\n }\n bitmask |= COMPARE_UNORDERED_FLAG;\n\n // Recursively compare objects (susceptible to call stack limits).\n stack.set(object, other);\n var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n stack['delete'](object);\n return result;\n\n case symbolTag:\n if (symbolValueOf) {\n return symbolValueOf.call(object) == symbolValueOf.call(other);\n }\n }\n return false;\n}\n\nmodule.exports = equalByTag;\n","/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n\n map.forEach(function(value, key) {\n result[++index] = [key, value];\n });\n return result;\n}\n\nmodule.exports = mapToArray;\n","var getAllKeys = require('./_getAllKeys');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n objProps = getAllKeys(object),\n objLength = objProps.length,\n othProps = getAllKeys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isPartial) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var result = true;\n stack.set(object, other);\n stack.set(other, object);\n\n var skipCtor = isPartial;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, objValue, key, other, object, stack)\n : customizer(objValue, othValue, key, object, other, stack);\n }\n // Recursively compare objects (susceptible to call stack limits).\n if (!(compared === undefined\n ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n : compared\n )) {\n result = false;\n break;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (result && !skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `Object` object instances with different constructors are not equal.\n if (objCtor != othCtor &&\n ('constructor' in object && 'constructor' in other) &&\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n result = false;\n }\n }\n stack['delete'](object);\n stack['delete'](other);\n return result;\n}\n\nmodule.exports = equalObjects;\n","var isStrictComparable = require('./_isStrictComparable'),\n keys = require('./keys');\n\n/**\n * Gets the property names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\nfunction getMatchData(object) {\n var result = keys(object),\n length = result.length;\n\n while (length--) {\n var key = result[length],\n value = object[key];\n\n result[length] = [key, value, isStrictComparable(value)];\n }\n return result;\n}\n\nmodule.exports = getMatchData;\n","var baseIsEqual = require('./_baseIsEqual'),\n get = require('./get'),\n hasIn = require('./hasIn'),\n isKey = require('./_isKey'),\n isStrictComparable = require('./_isStrictComparable'),\n matchesStrictComparable = require('./_matchesStrictComparable'),\n toKey = require('./_toKey');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatchesProperty(path, srcValue) {\n if (isKey(path) && isStrictComparable(srcValue)) {\n return matchesStrictComparable(toKey(path), srcValue);\n }\n return function(object) {\n var objValue = get(object, path);\n return (objValue === undefined && objValue === srcValue)\n ? hasIn(object, path)\n : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n };\n}\n\nmodule.exports = baseMatchesProperty;\n","var baseGet = require('./_baseGet');\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n}\n\nmodule.exports = get;\n","var memoizeCapped = require('./_memoizeCapped');\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n var result = [];\n if (string.charCodeAt(0) === 46 /* . */) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, subString) {\n result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n});\n\nmodule.exports = stringToPath;\n","var memoize = require('./memoize');\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n var result = memoize(func, function(key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n return key;\n });\n\n var cache = result.cache;\n return result;\n}\n\nmodule.exports = memoizeCapped;\n","var MapCache = require('./_MapCache');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nmodule.exports = memoize;\n","var baseToString = require('./_baseToString');\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\nmodule.exports = toString;\n","var Symbol = require('./_Symbol'),\n arrayMap = require('./_arrayMap'),\n isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = baseToString;\n","/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\nmodule.exports = arrayMap;\n","var baseHasIn = require('./_baseHasIn'),\n hasPath = require('./_hasPath');\n\n/**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\nfunction hasIn(object, path) {\n return object != null && hasPath(object, path, baseHasIn);\n}\n\nmodule.exports = hasIn;\n","/**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHasIn(object, key) {\n return object != null && key in Object(object);\n}\n\nmodule.exports = baseHasIn;\n","var castPath = require('./_castPath'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isIndex = require('./_isIndex'),\n isLength = require('./isLength'),\n toKey = require('./_toKey');\n\n/**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\nfunction hasPath(object, path, hasFunc) {\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n result = false;\n\n while (++index < length) {\n var key = toKey(path[index]);\n if (!(result = object != null && hasFunc(object, key))) {\n break;\n }\n object = object[key];\n }\n if (result || ++index != length) {\n return result;\n }\n length = object == null ? 0 : object.length;\n return !!length && isLength(length) && isIndex(key, length) &&\n (isArray(object) || isArguments(object));\n}\n\nmodule.exports = hasPath;\n","var baseProperty = require('./_baseProperty'),\n basePropertyDeep = require('./_basePropertyDeep'),\n isKey = require('./_isKey'),\n toKey = require('./_toKey');\n\n/**\n * Creates a function that returns the value at `path` of a given object.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var objects = [\n * { 'a': { 'b': 2 } },\n * { 'a': { 'b': 1 } }\n * ];\n *\n * _.map(objects, _.property('a.b'));\n * // => [2, 1]\n *\n * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n * // => [1, 2]\n */\nfunction property(path) {\n return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n}\n\nmodule.exports = property;\n","/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\nmodule.exports = baseProperty;\n","var baseGet = require('./_baseGet');\n\n/**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyDeep(path) {\n return function(object) {\n return baseGet(object, path);\n };\n}\n\nmodule.exports = basePropertyDeep;\n","var SetCache = require('./_SetCache'),\n arrayIncludes = require('./_arrayIncludes'),\n arrayIncludesWith = require('./_arrayIncludesWith'),\n cacheHas = require('./_cacheHas'),\n createSet = require('./_createSet'),\n setToArray = require('./_setToArray');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\nfunction baseUniq(array, iteratee, comparator) {\n var index = -1,\n includes = arrayIncludes,\n length = array.length,\n isCommon = true,\n result = [],\n seen = result;\n\n if (comparator) {\n isCommon = false;\n includes = arrayIncludesWith;\n }\n else if (length >= LARGE_ARRAY_SIZE) {\n var set = iteratee ? null : createSet(array);\n if (set) {\n return setToArray(set);\n }\n isCommon = false;\n includes = cacheHas;\n seen = new SetCache;\n }\n else {\n seen = iteratee ? [] : result;\n }\n outer:\n while (++index < length) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n value = (comparator || value !== 0) ? value : 0;\n if (isCommon && computed === computed) {\n var seenIndex = seen.length;\n while (seenIndex--) {\n if (seen[seenIndex] === computed) {\n continue outer;\n }\n }\n if (iteratee) {\n seen.push(computed);\n }\n result.push(value);\n }\n else if (!includes(seen, computed, comparator)) {\n if (seen !== result) {\n seen.push(computed);\n }\n result.push(value);\n }\n }\n return result;\n}\n\nmodule.exports = baseUniq;\n","var baseIndexOf = require('./_baseIndexOf');\n\n/**\n * A specialized version of `_.includes` for arrays without support for\n * specifying an index to search from.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludes(array, value) {\n var length = array == null ? 0 : array.length;\n return !!length && baseIndexOf(array, value, 0) > -1;\n}\n\nmodule.exports = arrayIncludes;\n","var baseFindIndex = require('./_baseFindIndex'),\n baseIsNaN = require('./_baseIsNaN'),\n strictIndexOf = require('./_strictIndexOf');\n\n/**\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseIndexOf(array, value, fromIndex) {\n return value === value\n ? strictIndexOf(array, value, fromIndex)\n : baseFindIndex(array, baseIsNaN, fromIndex);\n}\n\nmodule.exports = baseIndexOf;\n","/**\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseFindIndex(array, predicate, fromIndex, fromRight) {\n var length = array.length,\n index = fromIndex + (fromRight ? 1 : -1);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (predicate(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n}\n\nmodule.exports = baseFindIndex;\n","/**\n * The base implementation of `_.isNaN` without support for number objects.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n */\nfunction baseIsNaN(value) {\n return value !== value;\n}\n\nmodule.exports = baseIsNaN;\n","/**\n * A specialized version of `_.indexOf` which performs strict equality\n * comparisons of values, i.e. `===`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction strictIndexOf(array, value, fromIndex) {\n var index = fromIndex - 1,\n length = array.length;\n\n while (++index < length) {\n if (array[index] === value) {\n return index;\n }\n }\n return -1;\n}\n\nmodule.exports = strictIndexOf;\n","/**\n * This function is like `arrayIncludes` except that it accepts a comparator.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludesWith(array, value, comparator) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (comparator(value, array[index])) {\n return true;\n }\n }\n return false;\n}\n\nmodule.exports = arrayIncludesWith;\n","var Set = require('./_Set'),\n noop = require('./noop'),\n setToArray = require('./_setToArray');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Creates a set object of `values`.\n *\n * @private\n * @param {Array} values The values to add to the set.\n * @returns {Object} Returns the new set.\n */\nvar createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n return new Set(values);\n};\n\nmodule.exports = createSet;\n","/**\n * This method returns `undefined`.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Util\n * @example\n *\n * _.times(2, _.noop);\n * // => [undefined, undefined]\n */\nfunction noop() {\n // No operation performed.\n}\n\nmodule.exports = noop;\n","var Stack = require('./_Stack'),\n assignMergeValue = require('./_assignMergeValue'),\n baseFor = require('./_baseFor'),\n baseMergeDeep = require('./_baseMergeDeep'),\n isObject = require('./isObject'),\n keysIn = require('./keysIn'),\n safeGet = require('./_safeGet');\n\n/**\n * The base implementation of `_.merge` without support for multiple sources.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} [customizer] The function to customize merged values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\nfunction baseMerge(object, source, srcIndex, customizer, stack) {\n if (object === source) {\n return;\n }\n baseFor(source, function(srcValue, key) {\n stack || (stack = new Stack);\n if (isObject(srcValue)) {\n baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n }\n else {\n var newValue = customizer\n ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)\n : undefined;\n\n if (newValue === undefined) {\n newValue = srcValue;\n }\n assignMergeValue(object, key, newValue);\n }\n }, keysIn);\n}\n\nmodule.exports = baseMerge;\n","var createBaseFor = require('./_createBaseFor');\n\n/**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\nmodule.exports = baseFor;\n","/**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n return function(object, iteratee, keysFunc) {\n var index = -1,\n iterable = Object(object),\n props = keysFunc(object),\n length = props.length;\n\n while (length--) {\n var key = props[fromRight ? length : ++index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n}\n\nmodule.exports = createBaseFor;\n","var assignMergeValue = require('./_assignMergeValue'),\n cloneBuffer = require('./_cloneBuffer'),\n cloneTypedArray = require('./_cloneTypedArray'),\n copyArray = require('./_copyArray'),\n initCloneObject = require('./_initCloneObject'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isArrayLikeObject = require('./isArrayLikeObject'),\n isBuffer = require('./isBuffer'),\n isFunction = require('./isFunction'),\n isObject = require('./isObject'),\n isPlainObject = require('./isPlainObject'),\n isTypedArray = require('./isTypedArray'),\n safeGet = require('./_safeGet'),\n toPlainObject = require('./toPlainObject');\n\n/**\n * A specialized version of `baseMerge` for arrays and objects which performs\n * deep merges and tracks traversed objects enabling objects with circular\n * references to be merged.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {string} key The key of the value to merge.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} mergeFunc The function to merge values.\n * @param {Function} [customizer] The function to customize assigned values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\nfunction baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\n var objValue = safeGet(object, key),\n srcValue = safeGet(source, key),\n stacked = stack.get(srcValue);\n\n if (stacked) {\n assignMergeValue(object, key, stacked);\n return;\n }\n var newValue = customizer\n ? customizer(objValue, srcValue, (key + ''), object, source, stack)\n : undefined;\n\n var isCommon = newValue === undefined;\n\n if (isCommon) {\n var isArr = isArray(srcValue),\n isBuff = !isArr && isBuffer(srcValue),\n isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n newValue = srcValue;\n if (isArr || isBuff || isTyped) {\n if (isArray(objValue)) {\n newValue = objValue;\n }\n else if (isArrayLikeObject(objValue)) {\n newValue = copyArray(objValue);\n }\n else if (isBuff) {\n isCommon = false;\n newValue = cloneBuffer(srcValue, true);\n }\n else if (isTyped) {\n isCommon = false;\n newValue = cloneTypedArray(srcValue, true);\n }\n else {\n newValue = [];\n }\n }\n else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n newValue = objValue;\n if (isArguments(objValue)) {\n newValue = toPlainObject(objValue);\n }\n else if (!isObject(objValue) || isFunction(objValue)) {\n newValue = initCloneObject(srcValue);\n }\n }\n else {\n isCommon = false;\n }\n }\n if (isCommon) {\n // Recursively merge objects and arrays (susceptible to call stack limits).\n stack.set(srcValue, newValue);\n mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n stack['delete'](srcValue);\n }\n assignMergeValue(object, key, newValue);\n}\n\nmodule.exports = baseMergeDeep;\n","var isArrayLike = require('./isArrayLike'),\n isObjectLike = require('./isObjectLike');\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\nmodule.exports = isArrayLikeObject;\n","var baseGetTag = require('./_baseGetTag'),\n getPrototype = require('./_getPrototype'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to infer the `Object` constructor. */\nvar objectCtorString = funcToString.call(Object);\n\n/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n return false;\n }\n var proto = getPrototype(value);\n if (proto === null) {\n return true;\n }\n var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n funcToString.call(Ctor) == objectCtorString;\n}\n\nmodule.exports = isPlainObject;\n","var copyObject = require('./_copyObject'),\n keysIn = require('./keysIn');\n\n/**\n * Converts `value` to a plain object flattening inherited enumerable string\n * keyed properties of `value` to own properties of the plain object.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Object} Returns the converted plain object.\n * @example\n *\n * function Foo() {\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.assign({ 'a': 1 }, new Foo);\n * // => { 'a': 1, 'b': 2 }\n *\n * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n * // => { 'a': 1, 'b': 2, 'c': 3 }\n */\nfunction toPlainObject(value) {\n return copyObject(value, keysIn(value));\n}\n\nmodule.exports = toPlainObject;\n","var baseRest = require('./_baseRest'),\n isIterateeCall = require('./_isIterateeCall');\n\n/**\n * Creates a function like `_.assign`.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\nfunction createAssigner(assigner) {\n return baseRest(function(object, sources) {\n var index = -1,\n length = sources.length,\n customizer = length > 1 ? sources[length - 1] : undefined,\n guard = length > 2 ? sources[2] : undefined;\n\n customizer = (assigner.length > 3 && typeof customizer == 'function')\n ? (length--, customizer)\n : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n customizer = length < 3 ? undefined : customizer;\n length = 1;\n }\n object = Object(object);\n while (++index < length) {\n var source = sources[index];\n if (source) {\n assigner(object, source, index, customizer);\n }\n }\n return object;\n });\n}\n\nmodule.exports = createAssigner;\n","var identity = require('./identity'),\n overRest = require('./_overRest'),\n setToString = require('./_setToString');\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\n}\n\nmodule.exports = baseRest;\n","var apply = require('./_apply');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n}\n\nmodule.exports = overRest;\n","/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\nmodule.exports = apply;\n","var baseSetToString = require('./_baseSetToString'),\n shortOut = require('./_shortOut');\n\n/**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar setToString = shortOut(baseSetToString);\n\nmodule.exports = setToString;\n","var constant = require('./constant'),\n defineProperty = require('./_defineProperty'),\n identity = require('./identity');\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n};\n\nmodule.exports = baseSetToString;\n","/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n return function() {\n return value;\n };\n}\n\nmodule.exports = constant;\n","/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n HOT_SPAN = 16;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeNow = Date.now;\n\n/**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n var count = 0,\n lastCalled = 0;\n\n return function() {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n return func.apply(undefined, arguments);\n };\n}\n\nmodule.exports = shortOut;\n","var eq = require('./eq'),\n isArrayLike = require('./isArrayLike'),\n isIndex = require('./_isIndex'),\n isObject = require('./isObject');\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n}\n\nmodule.exports = isIterateeCall;\n","'use strict';\n\nvar resolve = require('./resolve')\n , util = require('./util')\n , errorClasses = require('./error_classes')\n , stableStringify = require('fast-json-stable-stringify');\n\nvar validateGenerator = require('../dotjs/validate');\n\n/**\n * Functions below are used inside compiled validations function\n */\n\nvar ucs2length = util.ucs2length;\nvar equal = require('fast-deep-equal');\n\n// this error is thrown by async schemas to return validation errors via exception\nvar ValidationError = errorClasses.Validation;\n\nmodule.exports = compile;\n\n\n/**\n * Compiles schema to validation function\n * @this Ajv\n * @param {Object} schema schema object\n * @param {Object} root object with information about the root schema for this schema\n * @param {Object} localRefs the hash of local references inside the schema (created by resolve.id), used for inline resolution\n * @param {String} baseId base ID for IDs in the schema\n * @return {Function} validation function\n */\nfunction compile(schema, root, localRefs, baseId) {\n /* jshint validthis: true, evil: true */\n /* eslint no-shadow: 0 */\n var self = this\n , opts = this._opts\n , refVal = [ undefined ]\n , refs = {}\n , patterns = []\n , patternsHash = {}\n , defaults = []\n , defaultsHash = {}\n , customRules = [];\n\n root = root || { schema: schema, refVal: refVal, refs: refs };\n\n var c = checkCompiling.call(this, schema, root, baseId);\n var compilation = this._compilations[c.index];\n if (c.compiling) return (compilation.callValidate = callValidate);\n\n var formats = this._formats;\n var RULES = this.RULES;\n\n try {\n var v = localCompile(schema, root, localRefs, baseId);\n compilation.validate = v;\n var cv = compilation.callValidate;\n if (cv) {\n cv.schema = v.schema;\n cv.errors = null;\n cv.refs = v.refs;\n cv.refVal = v.refVal;\n cv.root = v.root;\n cv.$async = v.$async;\n if (opts.sourceCode) cv.source = v.source;\n }\n return v;\n } finally {\n endCompiling.call(this, schema, root, baseId);\n }\n\n /* @this {*} - custom context, see passContext option */\n function callValidate() {\n /* jshint validthis: true */\n var validate = compilation.validate;\n var result = validate.apply(this, arguments);\n callValidate.errors = validate.errors;\n return result;\n }\n\n function localCompile(_schema, _root, localRefs, baseId) {\n var isRoot = !_root || (_root && _root.schema == _schema);\n if (_root.schema != root.schema)\n return compile.call(self, _schema, _root, localRefs, baseId);\n\n var $async = _schema.$async === true;\n\n var sourceCode = validateGenerator({\n isTop: true,\n schema: _schema,\n isRoot: isRoot,\n baseId: baseId,\n root: _root,\n schemaPath: '',\n errSchemaPath: '#',\n errorPath: '\"\"',\n MissingRefError: errorClasses.MissingRef,\n RULES: RULES,\n validate: validateGenerator,\n util: util,\n resolve: resolve,\n resolveRef: resolveRef,\n usePattern: usePattern,\n useDefault: useDefault,\n useCustomRule: useCustomRule,\n opts: opts,\n formats: formats,\n logger: self.logger,\n self: self\n });\n\n sourceCode = vars(refVal, refValCode) + vars(patterns, patternCode)\n + vars(defaults, defaultCode) + vars(customRules, customRuleCode)\n + sourceCode;\n\n if (opts.processCode) sourceCode = opts.processCode(sourceCode);\n // console.log('\\n\\n\\n *** \\n', JSON.stringify(sourceCode));\n var validate;\n try {\n var makeValidate = new Function(\n 'self',\n 'RULES',\n 'formats',\n 'root',\n 'refVal',\n 'defaults',\n 'customRules',\n 'equal',\n 'ucs2length',\n 'ValidationError',\n sourceCode\n );\n\n validate = makeValidate(\n self,\n RULES,\n formats,\n root,\n refVal,\n defaults,\n customRules,\n equal,\n ucs2length,\n ValidationError\n );\n\n refVal[0] = validate;\n } catch(e) {\n self.logger.error('Error compiling schema, function code:', sourceCode);\n throw e;\n }\n\n validate.schema = _schema;\n validate.errors = null;\n validate.refs = refs;\n validate.refVal = refVal;\n validate.root = isRoot ? validate : _root;\n if ($async) validate.$async = true;\n if (opts.sourceCode === true) {\n validate.source = {\n code: sourceCode,\n patterns: patterns,\n defaults: defaults\n };\n }\n\n return validate;\n }\n\n function resolveRef(baseId, ref, isRoot) {\n ref = resolve.url(baseId, ref);\n var refIndex = refs[ref];\n var _refVal, refCode;\n if (refIndex !== undefined) {\n _refVal = refVal[refIndex];\n refCode = 'refVal[' + refIndex + ']';\n return resolvedRef(_refVal, refCode);\n }\n if (!isRoot && root.refs) {\n var rootRefId = root.refs[ref];\n if (rootRefId !== undefined) {\n _refVal = root.refVal[rootRefId];\n refCode = addLocalRef(ref, _refVal);\n return resolvedRef(_refVal, refCode);\n }\n }\n\n refCode = addLocalRef(ref);\n var v = resolve.call(self, localCompile, root, ref);\n if (v === undefined) {\n var localSchema = localRefs && localRefs[ref];\n if (localSchema) {\n v = resolve.inlineRef(localSchema, opts.inlineRefs)\n ? localSchema\n : compile.call(self, localSchema, root, localRefs, baseId);\n }\n }\n\n if (v === undefined) {\n removeLocalRef(ref);\n } else {\n replaceLocalRef(ref, v);\n return resolvedRef(v, refCode);\n }\n }\n\n function addLocalRef(ref, v) {\n var refId = refVal.length;\n refVal[refId] = v;\n refs[ref] = refId;\n return 'refVal' + refId;\n }\n\n function removeLocalRef(ref) {\n delete refs[ref];\n }\n\n function replaceLocalRef(ref, v) {\n var refId = refs[ref];\n refVal[refId] = v;\n }\n\n function resolvedRef(refVal, code) {\n return typeof refVal == 'object' || typeof refVal == 'boolean'\n ? { code: code, schema: refVal, inline: true }\n : { code: code, $async: refVal && !!refVal.$async };\n }\n\n function usePattern(regexStr) {\n var index = patternsHash[regexStr];\n if (index === undefined) {\n index = patternsHash[regexStr] = patterns.length;\n patterns[index] = regexStr;\n }\n return 'pattern' + index;\n }\n\n function useDefault(value) {\n switch (typeof value) {\n case 'boolean':\n case 'number':\n return '' + value;\n case 'string':\n return util.toQuotedString(value);\n case 'object':\n if (value === null) return 'null';\n var valueStr = stableStringify(value);\n var index = defaultsHash[valueStr];\n if (index === undefined) {\n index = defaultsHash[valueStr] = defaults.length;\n defaults[index] = value;\n }\n return 'default' + index;\n }\n }\n\n function useCustomRule(rule, schema, parentSchema, it) {\n if (self._opts.validateSchema !== false) {\n var deps = rule.definition.dependencies;\n if (deps && !deps.every(function(keyword) {\n return Object.prototype.hasOwnProperty.call(parentSchema, keyword);\n }))\n throw new Error('parent schema must have all required keywords: ' + deps.join(','));\n\n var validateSchema = rule.definition.validateSchema;\n if (validateSchema) {\n var valid = validateSchema(schema);\n if (!valid) {\n var message = 'keyword schema is invalid: ' + self.errorsText(validateSchema.errors);\n if (self._opts.validateSchema == 'log') self.logger.error(message);\n else throw new Error(message);\n }\n }\n }\n\n var compile = rule.definition.compile\n , inline = rule.definition.inline\n , macro = rule.definition.macro;\n\n var validate;\n if (compile) {\n validate = compile.call(self, schema, parentSchema, it);\n } else if (macro) {\n validate = macro.call(self, schema, parentSchema, it);\n if (opts.validateSchema !== false) self.validateSchema(validate, true);\n } else if (inline) {\n validate = inline.call(self, it, rule.keyword, schema, parentSchema);\n } else {\n validate = rule.definition.validate;\n if (!validate) return;\n }\n\n if (validate === undefined)\n throw new Error('custom keyword \"' + rule.keyword + '\"failed to compile');\n\n var index = customRules.length;\n customRules[index] = validate;\n\n return {\n code: 'customRule' + index,\n validate: validate\n };\n }\n}\n\n\n/**\n * Checks if the schema is currently compiled\n * @this Ajv\n * @param {Object} schema schema to compile\n * @param {Object} root root object\n * @param {String} baseId base schema ID\n * @return {Object} object with properties \"index\" (compilation index) and \"compiling\" (boolean)\n */\nfunction checkCompiling(schema, root, baseId) {\n /* jshint validthis: true */\n var index = compIndex.call(this, schema, root, baseId);\n if (index >= 0) return { index: index, compiling: true };\n index = this._compilations.length;\n this._compilations[index] = {\n schema: schema,\n root: root,\n baseId: baseId\n };\n return { index: index, compiling: false };\n}\n\n\n/**\n * Removes the schema from the currently compiled list\n * @this Ajv\n * @param {Object} schema schema to compile\n * @param {Object} root root object\n * @param {String} baseId base schema ID\n */\nfunction endCompiling(schema, root, baseId) {\n /* jshint validthis: true */\n var i = compIndex.call(this, schema, root, baseId);\n if (i >= 0) this._compilations.splice(i, 1);\n}\n\n\n/**\n * Index of schema compilation in the currently compiled list\n * @this Ajv\n * @param {Object} schema schema to compile\n * @param {Object} root root object\n * @param {String} baseId base schema ID\n * @return {Integer} compilation index\n */\nfunction compIndex(schema, root, baseId) {\n /* jshint validthis: true */\n for (var i=0; i 1) {\n sets[0] = sets[0].slice(0, -1);\n var xl = sets.length - 1;\n for (var x = 1; x < xl; ++x) {\n sets[x] = sets[x].slice(1, -1);\n }\n sets[xl] = sets[xl].slice(1);\n return sets.join('');\n } else {\n return sets[0];\n }\n}\nfunction subexp(str) {\n return \"(?:\" + str + \")\";\n}\nfunction typeOf(o) {\n return o === undefined ? \"undefined\" : o === null ? \"null\" : Object.prototype.toString.call(o).split(\" \").pop().split(\"]\").shift().toLowerCase();\n}\nfunction toUpperCase(str) {\n return str.toUpperCase();\n}\nfunction toArray(obj) {\n return obj !== undefined && obj !== null ? obj instanceof Array ? obj : typeof obj.length !== \"number\" || obj.split || obj.setInterval || obj.call ? [obj] : Array.prototype.slice.call(obj) : [];\n}\nfunction assign(target, source) {\n var obj = target;\n if (source) {\n for (var key in source) {\n obj[key] = source[key];\n }\n }\n return obj;\n}\n\nfunction buildExps(isIRI) {\n var ALPHA$$ = \"[A-Za-z]\",\n CR$ = \"[\\\\x0D]\",\n DIGIT$$ = \"[0-9]\",\n DQUOTE$$ = \"[\\\\x22]\",\n HEXDIG$$ = merge(DIGIT$$, \"[A-Fa-f]\"),\n //case-insensitive\n LF$$ = \"[\\\\x0A]\",\n SP$$ = \"[\\\\x20]\",\n PCT_ENCODED$ = subexp(subexp(\"%[EFef]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%[89A-Fa-f]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%\" + HEXDIG$$ + HEXDIG$$)),\n //expanded\n GEN_DELIMS$$ = \"[\\\\:\\\\/\\\\?\\\\#\\\\[\\\\]\\\\@]\",\n SUB_DELIMS$$ = \"[\\\\!\\\\$\\\\&\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\;\\\\=]\",\n RESERVED$$ = merge(GEN_DELIMS$$, SUB_DELIMS$$),\n UCSCHAR$$ = isIRI ? \"[\\\\xA0-\\\\u200D\\\\u2010-\\\\u2029\\\\u202F-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFEF]\" : \"[]\",\n //subset, excludes bidi control characters\n IPRIVATE$$ = isIRI ? \"[\\\\uE000-\\\\uF8FF]\" : \"[]\",\n //subset\n UNRESERVED$$ = merge(ALPHA$$, DIGIT$$, \"[\\\\-\\\\.\\\\_\\\\~]\", UCSCHAR$$),\n SCHEME$ = subexp(ALPHA$$ + merge(ALPHA$$, DIGIT$$, \"[\\\\+\\\\-\\\\.]\") + \"*\"),\n USERINFO$ = subexp(subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:]\")) + \"*\"),\n DEC_OCTET$ = subexp(subexp(\"25[0-5]\") + \"|\" + subexp(\"2[0-4]\" + DIGIT$$) + \"|\" + subexp(\"1\" + DIGIT$$ + DIGIT$$) + \"|\" + subexp(\"[1-9]\" + DIGIT$$) + \"|\" + DIGIT$$),\n DEC_OCTET_RELAXED$ = subexp(subexp(\"25[0-5]\") + \"|\" + subexp(\"2[0-4]\" + DIGIT$$) + \"|\" + subexp(\"1\" + DIGIT$$ + DIGIT$$) + \"|\" + subexp(\"0?[1-9]\" + DIGIT$$) + \"|0?0?\" + DIGIT$$),\n //relaxed parsing rules\n IPV4ADDRESS$ = subexp(DEC_OCTET_RELAXED$ + \"\\\\.\" + DEC_OCTET_RELAXED$ + \"\\\\.\" + DEC_OCTET_RELAXED$ + \"\\\\.\" + DEC_OCTET_RELAXED$),\n H16$ = subexp(HEXDIG$$ + \"{1,4}\"),\n LS32$ = subexp(subexp(H16$ + \"\\\\:\" + H16$) + \"|\" + IPV4ADDRESS$),\n IPV6ADDRESS1$ = subexp(subexp(H16$ + \"\\\\:\") + \"{6}\" + LS32$),\n // 6( h16 \":\" ) ls32\n IPV6ADDRESS2$ = subexp(\"\\\\:\\\\:\" + subexp(H16$ + \"\\\\:\") + \"{5}\" + LS32$),\n // \"::\" 5( h16 \":\" ) ls32\n IPV6ADDRESS3$ = subexp(subexp(H16$) + \"?\\\\:\\\\:\" + subexp(H16$ + \"\\\\:\") + \"{4}\" + LS32$),\n //[ h16 ] \"::\" 4( h16 \":\" ) ls32\n IPV6ADDRESS4$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,1}\" + H16$) + \"?\\\\:\\\\:\" + subexp(H16$ + \"\\\\:\") + \"{3}\" + LS32$),\n //[ *1( h16 \":\" ) h16 ] \"::\" 3( h16 \":\" ) ls32\n IPV6ADDRESS5$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,2}\" + H16$) + \"?\\\\:\\\\:\" + subexp(H16$ + \"\\\\:\") + \"{2}\" + LS32$),\n //[ *2( h16 \":\" ) h16 ] \"::\" 2( h16 \":\" ) ls32\n IPV6ADDRESS6$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,3}\" + H16$) + \"?\\\\:\\\\:\" + H16$ + \"\\\\:\" + LS32$),\n //[ *3( h16 \":\" ) h16 ] \"::\" h16 \":\" ls32\n IPV6ADDRESS7$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,4}\" + H16$) + \"?\\\\:\\\\:\" + LS32$),\n //[ *4( h16 \":\" ) h16 ] \"::\" ls32\n IPV6ADDRESS8$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,5}\" + H16$) + \"?\\\\:\\\\:\" + H16$),\n //[ *5( h16 \":\" ) h16 ] \"::\" h16\n IPV6ADDRESS9$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,6}\" + H16$) + \"?\\\\:\\\\:\"),\n //[ *6( h16 \":\" ) h16 ] \"::\"\n IPV6ADDRESS$ = subexp([IPV6ADDRESS1$, IPV6ADDRESS2$, IPV6ADDRESS3$, IPV6ADDRESS4$, IPV6ADDRESS5$, IPV6ADDRESS6$, IPV6ADDRESS7$, IPV6ADDRESS8$, IPV6ADDRESS9$].join(\"|\")),\n ZONEID$ = subexp(subexp(UNRESERVED$$ + \"|\" + PCT_ENCODED$) + \"+\"),\n //RFC 6874\n IPV6ADDRZ$ = subexp(IPV6ADDRESS$ + \"\\\\%25\" + ZONEID$),\n //RFC 6874\n IPV6ADDRZ_RELAXED$ = subexp(IPV6ADDRESS$ + subexp(\"\\\\%25|\\\\%(?!\" + HEXDIG$$ + \"{2})\") + ZONEID$),\n //RFC 6874, with relaxed parsing rules\n IPVFUTURE$ = subexp(\"[vV]\" + HEXDIG$$ + \"+\\\\.\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:]\") + \"+\"),\n IP_LITERAL$ = subexp(\"\\\\[\" + subexp(IPV6ADDRZ_RELAXED$ + \"|\" + IPV6ADDRESS$ + \"|\" + IPVFUTURE$) + \"\\\\]\"),\n //RFC 6874\n REG_NAME$ = subexp(subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$)) + \"*\"),\n HOST$ = subexp(IP_LITERAL$ + \"|\" + IPV4ADDRESS$ + \"(?!\" + REG_NAME$ + \")\" + \"|\" + REG_NAME$),\n PORT$ = subexp(DIGIT$$ + \"*\"),\n AUTHORITY$ = subexp(subexp(USERINFO$ + \"@\") + \"?\" + HOST$ + subexp(\"\\\\:\" + PORT$) + \"?\"),\n PCHAR$ = subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:\\\\@]\")),\n SEGMENT$ = subexp(PCHAR$ + \"*\"),\n SEGMENT_NZ$ = subexp(PCHAR$ + \"+\"),\n SEGMENT_NZ_NC$ = subexp(subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\@]\")) + \"+\"),\n PATH_ABEMPTY$ = subexp(subexp(\"\\\\/\" + SEGMENT$) + \"*\"),\n PATH_ABSOLUTE$ = subexp(\"\\\\/\" + subexp(SEGMENT_NZ$ + PATH_ABEMPTY$) + \"?\"),\n //simplified\n PATH_NOSCHEME$ = subexp(SEGMENT_NZ_NC$ + PATH_ABEMPTY$),\n //simplified\n PATH_ROOTLESS$ = subexp(SEGMENT_NZ$ + PATH_ABEMPTY$),\n //simplified\n PATH_EMPTY$ = \"(?!\" + PCHAR$ + \")\",\n PATH$ = subexp(PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_NOSCHEME$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$),\n QUERY$ = subexp(subexp(PCHAR$ + \"|\" + merge(\"[\\\\/\\\\?]\", IPRIVATE$$)) + \"*\"),\n FRAGMENT$ = subexp(subexp(PCHAR$ + \"|[\\\\/\\\\?]\") + \"*\"),\n HIER_PART$ = subexp(subexp(\"\\\\/\\\\/\" + AUTHORITY$ + PATH_ABEMPTY$) + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$),\n URI$ = subexp(SCHEME$ + \"\\\\:\" + HIER_PART$ + subexp(\"\\\\?\" + QUERY$) + \"?\" + subexp(\"\\\\#\" + FRAGMENT$) + \"?\"),\n RELATIVE_PART$ = subexp(subexp(\"\\\\/\\\\/\" + AUTHORITY$ + PATH_ABEMPTY$) + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_NOSCHEME$ + \"|\" + PATH_EMPTY$),\n RELATIVE$ = subexp(RELATIVE_PART$ + subexp(\"\\\\?\" + QUERY$) + \"?\" + subexp(\"\\\\#\" + FRAGMENT$) + \"?\"),\n URI_REFERENCE$ = subexp(URI$ + \"|\" + RELATIVE$),\n ABSOLUTE_URI$ = subexp(SCHEME$ + \"\\\\:\" + HIER_PART$ + subexp(\"\\\\?\" + QUERY$) + \"?\"),\n GENERIC_REF$ = \"^(\" + SCHEME$ + \")\\\\:\" + subexp(subexp(\"\\\\/\\\\/(\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?)\") + \"?(\" + PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$ + \")\") + subexp(\"\\\\?(\" + QUERY$ + \")\") + \"?\" + subexp(\"\\\\#(\" + FRAGMENT$ + \")\") + \"?$\",\n RELATIVE_REF$ = \"^(){0}\" + subexp(subexp(\"\\\\/\\\\/(\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?)\") + \"?(\" + PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_NOSCHEME$ + \"|\" + PATH_EMPTY$ + \")\") + subexp(\"\\\\?(\" + QUERY$ + \")\") + \"?\" + subexp(\"\\\\#(\" + FRAGMENT$ + \")\") + \"?$\",\n ABSOLUTE_REF$ = \"^(\" + SCHEME$ + \")\\\\:\" + subexp(subexp(\"\\\\/\\\\/(\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?)\") + \"?(\" + PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$ + \")\") + subexp(\"\\\\?(\" + QUERY$ + \")\") + \"?$\",\n SAMEDOC_REF$ = \"^\" + subexp(\"\\\\#(\" + FRAGMENT$ + \")\") + \"?$\",\n AUTHORITY_REF$ = \"^\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?$\";\n return {\n NOT_SCHEME: new RegExp(merge(\"[^]\", ALPHA$$, DIGIT$$, \"[\\\\+\\\\-\\\\.]\"), \"g\"),\n NOT_USERINFO: new RegExp(merge(\"[^\\\\%\\\\:]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n NOT_HOST: new RegExp(merge(\"[^\\\\%\\\\[\\\\]\\\\:]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n NOT_PATH: new RegExp(merge(\"[^\\\\%\\\\/\\\\:\\\\@]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n NOT_PATH_NOSCHEME: new RegExp(merge(\"[^\\\\%\\\\/\\\\@]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n NOT_QUERY: new RegExp(merge(\"[^\\\\%]\", UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:\\\\@\\\\/\\\\?]\", IPRIVATE$$), \"g\"),\n NOT_FRAGMENT: new RegExp(merge(\"[^\\\\%]\", UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:\\\\@\\\\/\\\\?]\"), \"g\"),\n ESCAPE: new RegExp(merge(\"[^]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n UNRESERVED: new RegExp(UNRESERVED$$, \"g\"),\n OTHER_CHARS: new RegExp(merge(\"[^\\\\%]\", UNRESERVED$$, RESERVED$$), \"g\"),\n PCT_ENCODED: new RegExp(PCT_ENCODED$, \"g\"),\n IPV4ADDRESS: new RegExp(\"^(\" + IPV4ADDRESS$ + \")$\"),\n IPV6ADDRESS: new RegExp(\"^\\\\[?(\" + IPV6ADDRESS$ + \")\" + subexp(subexp(\"\\\\%25|\\\\%(?!\" + HEXDIG$$ + \"{2})\") + \"(\" + ZONEID$ + \")\") + \"?\\\\]?$\") //RFC 6874, with relaxed parsing rules\n };\n}\nvar URI_PROTOCOL = buildExps(false);\n\nvar IRI_PROTOCOL = buildExps(true);\n\nvar slicedToArray = function () {\n function sliceIterator(arr, i) {\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"]) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n }\n\n return function (arr, i) {\n if (Array.isArray(arr)) {\n return arr;\n } else if (Symbol.iterator in Object(arr)) {\n return sliceIterator(arr, i);\n } else {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n }\n };\n}();\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar toConsumableArray = function (arr) {\n if (Array.isArray(arr)) {\n for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n\n return arr2;\n } else {\n return Array.from(arr);\n }\n};\n\n/** Highest positive signed 32-bit float value */\n\nvar maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\n\n/** Bootstring parameters */\nvar base = 36;\nvar tMin = 1;\nvar tMax = 26;\nvar skew = 38;\nvar damp = 700;\nvar initialBias = 72;\nvar initialN = 128; // 0x80\nvar delimiter = '-'; // '\\x2D'\n\n/** Regular expressions */\nvar regexPunycode = /^xn--/;\nvar regexNonASCII = /[^\\0-\\x7E]/; // non-ASCII chars\nvar regexSeparators = /[\\x2E\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\n\n/** Error messages */\nvar errors = {\n\t'overflow': 'Overflow: input needs wider integers to process',\n\t'not-basic': 'Illegal input >= 0x80 (not a basic code point)',\n\t'invalid-input': 'Invalid input'\n};\n\n/** Convenience shortcuts */\nvar baseMinusTMin = base - tMin;\nvar floor = Math.floor;\nvar stringFromCharCode = String.fromCharCode;\n\n/*--------------------------------------------------------------------------*/\n\n/**\n * A generic error utility function.\n * @private\n * @param {String} type The error type.\n * @returns {Error} Throws a `RangeError` with the applicable error message.\n */\nfunction error$1(type) {\n\tthrow new RangeError(errors[type]);\n}\n\n/**\n * A generic `Array#map` utility function.\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} callback The function that gets called for every array\n * item.\n * @returns {Array} A new array of values returned by the callback function.\n */\nfunction map(array, fn) {\n\tvar result = [];\n\tvar length = array.length;\n\twhile (length--) {\n\t\tresult[length] = fn(array[length]);\n\t}\n\treturn result;\n}\n\n/**\n * A simple `Array#map`-like wrapper to work with domain name strings or email\n * addresses.\n * @private\n * @param {String} domain The domain name or email address.\n * @param {Function} callback The function that gets called for every\n * character.\n * @returns {Array} A new string of characters returned by the callback\n * function.\n */\nfunction mapDomain(string, fn) {\n\tvar parts = string.split('@');\n\tvar result = '';\n\tif (parts.length > 1) {\n\t\t// In email addresses, only the domain name should be punycoded. Leave\n\t\t// the local part (i.e. everything up to `@`) intact.\n\t\tresult = parts[0] + '@';\n\t\tstring = parts[1];\n\t}\n\t// Avoid `split(regex)` for IE8 compatibility. See #17.\n\tstring = string.replace(regexSeparators, '\\x2E');\n\tvar labels = string.split('.');\n\tvar encoded = map(labels, fn).join('.');\n\treturn result + encoded;\n}\n\n/**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n * @see `punycode.ucs2.encode`\n * @see \n * @memberOf punycode.ucs2\n * @name decode\n * @param {String} string The Unicode input string (UCS-2).\n * @returns {Array} The new array of code points.\n */\nfunction ucs2decode(string) {\n\tvar output = [];\n\tvar counter = 0;\n\tvar length = string.length;\n\twhile (counter < length) {\n\t\tvar value = string.charCodeAt(counter++);\n\t\tif (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t\t\t// It's a high surrogate, and there is a next character.\n\t\t\tvar extra = string.charCodeAt(counter++);\n\t\t\tif ((extra & 0xFC00) == 0xDC00) {\n\t\t\t\t// Low surrogate.\n\t\t\t\toutput.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t\t\t} else {\n\t\t\t\t// It's an unmatched surrogate; only append this code unit, in case the\n\t\t\t\t// next code unit is the high surrogate of a surrogate pair.\n\t\t\t\toutput.push(value);\n\t\t\t\tcounter--;\n\t\t\t}\n\t\t} else {\n\t\t\toutput.push(value);\n\t\t}\n\t}\n\treturn output;\n}\n\n/**\n * Creates a string based on an array of numeric code points.\n * @see `punycode.ucs2.decode`\n * @memberOf punycode.ucs2\n * @name encode\n * @param {Array} codePoints The array of numeric code points.\n * @returns {String} The new Unicode string (UCS-2).\n */\nvar ucs2encode = function ucs2encode(array) {\n\treturn String.fromCodePoint.apply(String, toConsumableArray(array));\n};\n\n/**\n * Converts a basic code point into a digit/integer.\n * @see `digitToBasic()`\n * @private\n * @param {Number} codePoint The basic numeric code point value.\n * @returns {Number} The numeric value of a basic code point (for use in\n * representing integers) in the range `0` to `base - 1`, or `base` if\n * the code point does not represent a value.\n */\nvar basicToDigit = function basicToDigit(codePoint) {\n\tif (codePoint - 0x30 < 0x0A) {\n\t\treturn codePoint - 0x16;\n\t}\n\tif (codePoint - 0x41 < 0x1A) {\n\t\treturn codePoint - 0x41;\n\t}\n\tif (codePoint - 0x61 < 0x1A) {\n\t\treturn codePoint - 0x61;\n\t}\n\treturn base;\n};\n\n/**\n * Converts a digit/integer into a basic code point.\n * @see `basicToDigit()`\n * @private\n * @param {Number} digit The numeric value of a basic code point.\n * @returns {Number} The basic code point whose value (when used for\n * representing integers) is `digit`, which needs to be in the range\n * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is\n * used; else, the lowercase form is used. The behavior is undefined\n * if `flag` is non-zero and `digit` has no uppercase form.\n */\nvar digitToBasic = function digitToBasic(digit, flag) {\n\t// 0..25 map to ASCII a..z or A..Z\n\t// 26..35 map to ASCII 0..9\n\treturn digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);\n};\n\n/**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * https://tools.ietf.org/html/rfc3492#section-3.4\n * @private\n */\nvar adapt = function adapt(delta, numPoints, firstTime) {\n\tvar k = 0;\n\tdelta = firstTime ? floor(delta / damp) : delta >> 1;\n\tdelta += floor(delta / numPoints);\n\tfor (; /* no initialization */delta > baseMinusTMin * tMax >> 1; k += base) {\n\t\tdelta = floor(delta / baseMinusTMin);\n\t}\n\treturn floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n};\n\n/**\n * Converts a Punycode string of ASCII-only symbols to a string of Unicode\n * symbols.\n * @memberOf punycode\n * @param {String} input The Punycode string of ASCII-only symbols.\n * @returns {String} The resulting string of Unicode symbols.\n */\nvar decode = function decode(input) {\n\t// Don't use UCS-2.\n\tvar output = [];\n\tvar inputLength = input.length;\n\tvar i = 0;\n\tvar n = initialN;\n\tvar bias = initialBias;\n\n\t// Handle the basic code points: let `basic` be the number of input code\n\t// points before the last delimiter, or `0` if there is none, then copy\n\t// the first basic code points to the output.\n\n\tvar basic = input.lastIndexOf(delimiter);\n\tif (basic < 0) {\n\t\tbasic = 0;\n\t}\n\n\tfor (var j = 0; j < basic; ++j) {\n\t\t// if it's not a basic code point\n\t\tif (input.charCodeAt(j) >= 0x80) {\n\t\t\terror$1('not-basic');\n\t\t}\n\t\toutput.push(input.charCodeAt(j));\n\t}\n\n\t// Main decoding loop: start just after the last delimiter if any basic code\n\t// points were copied; start at the beginning otherwise.\n\n\tfor (var index = basic > 0 ? basic + 1 : 0; index < inputLength;) /* no final expression */{\n\n\t\t// `index` is the index of the next character to be consumed.\n\t\t// Decode a generalized variable-length integer into `delta`,\n\t\t// which gets added to `i`. The overflow checking is easier\n\t\t// if we increase `i` as we go, then subtract off its starting\n\t\t// value at the end to obtain `delta`.\n\t\tvar oldi = i;\n\t\tfor (var w = 1, k = base;; /* no condition */k += base) {\n\n\t\t\tif (index >= inputLength) {\n\t\t\t\terror$1('invalid-input');\n\t\t\t}\n\n\t\t\tvar digit = basicToDigit(input.charCodeAt(index++));\n\n\t\t\tif (digit >= base || digit > floor((maxInt - i) / w)) {\n\t\t\t\terror$1('overflow');\n\t\t\t}\n\n\t\t\ti += digit * w;\n\t\t\tvar t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;\n\n\t\t\tif (digit < t) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tvar baseMinusT = base - t;\n\t\t\tif (w > floor(maxInt / baseMinusT)) {\n\t\t\t\terror$1('overflow');\n\t\t\t}\n\n\t\t\tw *= baseMinusT;\n\t\t}\n\n\t\tvar out = output.length + 1;\n\t\tbias = adapt(i - oldi, out, oldi == 0);\n\n\t\t// `i` was supposed to wrap around from `out` to `0`,\n\t\t// incrementing `n` each time, so we'll fix that now:\n\t\tif (floor(i / out) > maxInt - n) {\n\t\t\terror$1('overflow');\n\t\t}\n\n\t\tn += floor(i / out);\n\t\ti %= out;\n\n\t\t// Insert `n` at position `i` of the output.\n\t\toutput.splice(i++, 0, n);\n\t}\n\n\treturn String.fromCodePoint.apply(String, output);\n};\n\n/**\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\n * Punycode string of ASCII-only symbols.\n * @memberOf punycode\n * @param {String} input The string of Unicode symbols.\n * @returns {String} The resulting Punycode string of ASCII-only symbols.\n */\nvar encode = function encode(input) {\n\tvar output = [];\n\n\t// Convert the input in UCS-2 to an array of Unicode code points.\n\tinput = ucs2decode(input);\n\n\t// Cache the length.\n\tvar inputLength = input.length;\n\n\t// Initialize the state.\n\tvar n = initialN;\n\tvar delta = 0;\n\tvar bias = initialBias;\n\n\t// Handle the basic code points.\n\tvar _iteratorNormalCompletion = true;\n\tvar _didIteratorError = false;\n\tvar _iteratorError = undefined;\n\n\ttry {\n\t\tfor (var _iterator = input[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n\t\t\tvar _currentValue2 = _step.value;\n\n\t\t\tif (_currentValue2 < 0x80) {\n\t\t\t\toutput.push(stringFromCharCode(_currentValue2));\n\t\t\t}\n\t\t}\n\t} catch (err) {\n\t\t_didIteratorError = true;\n\t\t_iteratorError = err;\n\t} finally {\n\t\ttry {\n\t\t\tif (!_iteratorNormalCompletion && _iterator.return) {\n\t\t\t\t_iterator.return();\n\t\t\t}\n\t\t} finally {\n\t\t\tif (_didIteratorError) {\n\t\t\t\tthrow _iteratorError;\n\t\t\t}\n\t\t}\n\t}\n\n\tvar basicLength = output.length;\n\tvar handledCPCount = basicLength;\n\n\t// `handledCPCount` is the number of code points that have been handled;\n\t// `basicLength` is the number of basic code points.\n\n\t// Finish the basic string with a delimiter unless it's empty.\n\tif (basicLength) {\n\t\toutput.push(delimiter);\n\t}\n\n\t// Main encoding loop:\n\twhile (handledCPCount < inputLength) {\n\n\t\t// All non-basic code points < n have been handled already. Find the next\n\t\t// larger one:\n\t\tvar m = maxInt;\n\t\tvar _iteratorNormalCompletion2 = true;\n\t\tvar _didIteratorError2 = false;\n\t\tvar _iteratorError2 = undefined;\n\n\t\ttry {\n\t\t\tfor (var _iterator2 = input[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n\t\t\t\tvar currentValue = _step2.value;\n\n\t\t\t\tif (currentValue >= n && currentValue < m) {\n\t\t\t\t\tm = currentValue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Increase `delta` enough to advance the decoder's state to ,\n\t\t\t// but guard against overflow.\n\t\t} catch (err) {\n\t\t\t_didIteratorError2 = true;\n\t\t\t_iteratorError2 = err;\n\t\t} finally {\n\t\t\ttry {\n\t\t\t\tif (!_iteratorNormalCompletion2 && _iterator2.return) {\n\t\t\t\t\t_iterator2.return();\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tif (_didIteratorError2) {\n\t\t\t\t\tthrow _iteratorError2;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tvar handledCPCountPlusOne = handledCPCount + 1;\n\t\tif (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n\t\t\terror$1('overflow');\n\t\t}\n\n\t\tdelta += (m - n) * handledCPCountPlusOne;\n\t\tn = m;\n\n\t\tvar _iteratorNormalCompletion3 = true;\n\t\tvar _didIteratorError3 = false;\n\t\tvar _iteratorError3 = undefined;\n\n\t\ttry {\n\t\t\tfor (var _iterator3 = input[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {\n\t\t\t\tvar _currentValue = _step3.value;\n\n\t\t\t\tif (_currentValue < n && ++delta > maxInt) {\n\t\t\t\t\terror$1('overflow');\n\t\t\t\t}\n\t\t\t\tif (_currentValue == n) {\n\t\t\t\t\t// Represent delta as a generalized variable-length integer.\n\t\t\t\t\tvar q = delta;\n\t\t\t\t\tfor (var k = base;; /* no condition */k += base) {\n\t\t\t\t\t\tvar t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;\n\t\t\t\t\t\tif (q < t) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvar qMinusT = q - t;\n\t\t\t\t\t\tvar baseMinusT = base - t;\n\t\t\t\t\t\toutput.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0)));\n\t\t\t\t\t\tq = floor(qMinusT / baseMinusT);\n\t\t\t\t\t}\n\n\t\t\t\t\toutput.push(stringFromCharCode(digitToBasic(q, 0)));\n\t\t\t\t\tbias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n\t\t\t\t\tdelta = 0;\n\t\t\t\t\t++handledCPCount;\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (err) {\n\t\t\t_didIteratorError3 = true;\n\t\t\t_iteratorError3 = err;\n\t\t} finally {\n\t\t\ttry {\n\t\t\t\tif (!_iteratorNormalCompletion3 && _iterator3.return) {\n\t\t\t\t\t_iterator3.return();\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tif (_didIteratorError3) {\n\t\t\t\t\tthrow _iteratorError3;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t++delta;\n\t\t++n;\n\t}\n\treturn output.join('');\n};\n\n/**\n * Converts a Punycode string representing a domain name or an email address\n * to Unicode. Only the Punycoded parts of the input will be converted, i.e.\n * it doesn't matter if you call it on a string that has already been\n * converted to Unicode.\n * @memberOf punycode\n * @param {String} input The Punycoded domain name or email address to\n * convert to Unicode.\n * @returns {String} The Unicode representation of the given Punycode\n * string.\n */\nvar toUnicode = function toUnicode(input) {\n\treturn mapDomain(input, function (string) {\n\t\treturn regexPunycode.test(string) ? decode(string.slice(4).toLowerCase()) : string;\n\t});\n};\n\n/**\n * Converts a Unicode string representing a domain name or an email address to\n * Punycode. Only the non-ASCII parts of the domain name will be converted,\n * i.e. it doesn't matter if you call it with a domain that's already in\n * ASCII.\n * @memberOf punycode\n * @param {String} input The domain name or email address to convert, as a\n * Unicode string.\n * @returns {String} The Punycode representation of the given domain name or\n * email address.\n */\nvar toASCII = function toASCII(input) {\n\treturn mapDomain(input, function (string) {\n\t\treturn regexNonASCII.test(string) ? 'xn--' + encode(string) : string;\n\t});\n};\n\n/*--------------------------------------------------------------------------*/\n\n/** Define the public API */\nvar punycode = {\n\t/**\n * A string representing the current Punycode.js version number.\n * @memberOf punycode\n * @type String\n */\n\t'version': '2.1.0',\n\t/**\n * An object of methods to convert from JavaScript's internal character\n * representation (UCS-2) to Unicode code points, and back.\n * @see \n * @memberOf punycode\n * @type Object\n */\n\t'ucs2': {\n\t\t'decode': ucs2decode,\n\t\t'encode': ucs2encode\n\t},\n\t'decode': decode,\n\t'encode': encode,\n\t'toASCII': toASCII,\n\t'toUnicode': toUnicode\n};\n\n/**\n * URI.js\n *\n * @fileoverview An RFC 3986 compliant, scheme extendable URI parsing/validating/resolving library for JavaScript.\n * @author Gary Court\n * @see http://github.com/garycourt/uri-js\n */\n/**\n * Copyright 2011 Gary Court. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY GARY COURT ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND\n * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GARY COURT OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * The views and conclusions contained in the software and documentation are those of the\n * authors and should not be interpreted as representing official policies, either expressed\n * or implied, of Gary Court.\n */\nvar SCHEMES = {};\nfunction pctEncChar(chr) {\n var c = chr.charCodeAt(0);\n var e = void 0;\n if (c < 16) e = \"%0\" + c.toString(16).toUpperCase();else if (c < 128) e = \"%\" + c.toString(16).toUpperCase();else if (c < 2048) e = \"%\" + (c >> 6 | 192).toString(16).toUpperCase() + \"%\" + (c & 63 | 128).toString(16).toUpperCase();else e = \"%\" + (c >> 12 | 224).toString(16).toUpperCase() + \"%\" + (c >> 6 & 63 | 128).toString(16).toUpperCase() + \"%\" + (c & 63 | 128).toString(16).toUpperCase();\n return e;\n}\nfunction pctDecChars(str) {\n var newStr = \"\";\n var i = 0;\n var il = str.length;\n while (i < il) {\n var c = parseInt(str.substr(i + 1, 2), 16);\n if (c < 128) {\n newStr += String.fromCharCode(c);\n i += 3;\n } else if (c >= 194 && c < 224) {\n if (il - i >= 6) {\n var c2 = parseInt(str.substr(i + 4, 2), 16);\n newStr += String.fromCharCode((c & 31) << 6 | c2 & 63);\n } else {\n newStr += str.substr(i, 6);\n }\n i += 6;\n } else if (c >= 224) {\n if (il - i >= 9) {\n var _c = parseInt(str.substr(i + 4, 2), 16);\n var c3 = parseInt(str.substr(i + 7, 2), 16);\n newStr += String.fromCharCode((c & 15) << 12 | (_c & 63) << 6 | c3 & 63);\n } else {\n newStr += str.substr(i, 9);\n }\n i += 9;\n } else {\n newStr += str.substr(i, 3);\n i += 3;\n }\n }\n return newStr;\n}\nfunction _normalizeComponentEncoding(components, protocol) {\n function decodeUnreserved(str) {\n var decStr = pctDecChars(str);\n return !decStr.match(protocol.UNRESERVED) ? str : decStr;\n }\n if (components.scheme) components.scheme = String(components.scheme).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_SCHEME, \"\");\n if (components.userinfo !== undefined) components.userinfo = String(components.userinfo).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_USERINFO, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n if (components.host !== undefined) components.host = String(components.host).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_HOST, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n if (components.path !== undefined) components.path = String(components.path).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(components.scheme ? protocol.NOT_PATH : protocol.NOT_PATH_NOSCHEME, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n if (components.query !== undefined) components.query = String(components.query).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_QUERY, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n if (components.fragment !== undefined) components.fragment = String(components.fragment).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_FRAGMENT, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n return components;\n}\n\nfunction _stripLeadingZeros(str) {\n return str.replace(/^0*(.*)/, \"$1\") || \"0\";\n}\nfunction _normalizeIPv4(host, protocol) {\n var matches = host.match(protocol.IPV4ADDRESS) || [];\n\n var _matches = slicedToArray(matches, 2),\n address = _matches[1];\n\n if (address) {\n return address.split(\".\").map(_stripLeadingZeros).join(\".\");\n } else {\n return host;\n }\n}\nfunction _normalizeIPv6(host, protocol) {\n var matches = host.match(protocol.IPV6ADDRESS) || [];\n\n var _matches2 = slicedToArray(matches, 3),\n address = _matches2[1],\n zone = _matches2[2];\n\n if (address) {\n var _address$toLowerCase$ = address.toLowerCase().split('::').reverse(),\n _address$toLowerCase$2 = slicedToArray(_address$toLowerCase$, 2),\n last = _address$toLowerCase$2[0],\n first = _address$toLowerCase$2[1];\n\n var firstFields = first ? first.split(\":\").map(_stripLeadingZeros) : [];\n var lastFields = last.split(\":\").map(_stripLeadingZeros);\n var isLastFieldIPv4Address = protocol.IPV4ADDRESS.test(lastFields[lastFields.length - 1]);\n var fieldCount = isLastFieldIPv4Address ? 7 : 8;\n var lastFieldsStart = lastFields.length - fieldCount;\n var fields = Array(fieldCount);\n for (var x = 0; x < fieldCount; ++x) {\n fields[x] = firstFields[x] || lastFields[lastFieldsStart + x] || '';\n }\n if (isLastFieldIPv4Address) {\n fields[fieldCount - 1] = _normalizeIPv4(fields[fieldCount - 1], protocol);\n }\n var allZeroFields = fields.reduce(function (acc, field, index) {\n if (!field || field === \"0\") {\n var lastLongest = acc[acc.length - 1];\n if (lastLongest && lastLongest.index + lastLongest.length === index) {\n lastLongest.length++;\n } else {\n acc.push({ index: index, length: 1 });\n }\n }\n return acc;\n }, []);\n var longestZeroFields = allZeroFields.sort(function (a, b) {\n return b.length - a.length;\n })[0];\n var newHost = void 0;\n if (longestZeroFields && longestZeroFields.length > 1) {\n var newFirst = fields.slice(0, longestZeroFields.index);\n var newLast = fields.slice(longestZeroFields.index + longestZeroFields.length);\n newHost = newFirst.join(\":\") + \"::\" + newLast.join(\":\");\n } else {\n newHost = fields.join(\":\");\n }\n if (zone) {\n newHost += \"%\" + zone;\n }\n return newHost;\n } else {\n return host;\n }\n}\nvar URI_PARSE = /^(?:([^:\\/?#]+):)?(?:\\/\\/((?:([^\\/?#@]*)@)?(\\[[^\\/?#\\]]+\\]|[^\\/?#:]*)(?:\\:(\\d*))?))?([^?#]*)(?:\\?([^#]*))?(?:#((?:.|\\n|\\r)*))?/i;\nvar NO_MATCH_IS_UNDEFINED = \"\".match(/(){0}/)[1] === undefined;\nfunction parse(uriString) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n var components = {};\n var protocol = options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL;\n if (options.reference === \"suffix\") uriString = (options.scheme ? options.scheme + \":\" : \"\") + \"//\" + uriString;\n var matches = uriString.match(URI_PARSE);\n if (matches) {\n if (NO_MATCH_IS_UNDEFINED) {\n //store each component\n components.scheme = matches[1];\n components.userinfo = matches[3];\n components.host = matches[4];\n components.port = parseInt(matches[5], 10);\n components.path = matches[6] || \"\";\n components.query = matches[7];\n components.fragment = matches[8];\n //fix port number\n if (isNaN(components.port)) {\n components.port = matches[5];\n }\n } else {\n //IE FIX for improper RegExp matching\n //store each component\n components.scheme = matches[1] || undefined;\n components.userinfo = uriString.indexOf(\"@\") !== -1 ? matches[3] : undefined;\n components.host = uriString.indexOf(\"//\") !== -1 ? matches[4] : undefined;\n components.port = parseInt(matches[5], 10);\n components.path = matches[6] || \"\";\n components.query = uriString.indexOf(\"?\") !== -1 ? matches[7] : undefined;\n components.fragment = uriString.indexOf(\"#\") !== -1 ? matches[8] : undefined;\n //fix port number\n if (isNaN(components.port)) {\n components.port = uriString.match(/\\/\\/(?:.|\\n)*\\:(?:\\/|\\?|\\#|$)/) ? matches[4] : undefined;\n }\n }\n if (components.host) {\n //normalize IP hosts\n components.host = _normalizeIPv6(_normalizeIPv4(components.host, protocol), protocol);\n }\n //determine reference type\n if (components.scheme === undefined && components.userinfo === undefined && components.host === undefined && components.port === undefined && !components.path && components.query === undefined) {\n components.reference = \"same-document\";\n } else if (components.scheme === undefined) {\n components.reference = \"relative\";\n } else if (components.fragment === undefined) {\n components.reference = \"absolute\";\n } else {\n components.reference = \"uri\";\n }\n //check for reference errors\n if (options.reference && options.reference !== \"suffix\" && options.reference !== components.reference) {\n components.error = components.error || \"URI is not a \" + options.reference + \" reference.\";\n }\n //find scheme handler\n var schemeHandler = SCHEMES[(options.scheme || components.scheme || \"\").toLowerCase()];\n //check if scheme can't handle IRIs\n if (!options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport)) {\n //if host component is a domain name\n if (components.host && (options.domainHost || schemeHandler && schemeHandler.domainHost)) {\n //convert Unicode IDN -> ASCII IDN\n try {\n components.host = punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase());\n } catch (e) {\n components.error = components.error || \"Host's domain name can not be converted to ASCII via punycode: \" + e;\n }\n }\n //convert IRI -> URI\n _normalizeComponentEncoding(components, URI_PROTOCOL);\n } else {\n //normalize encodings\n _normalizeComponentEncoding(components, protocol);\n }\n //perform scheme specific parsing\n if (schemeHandler && schemeHandler.parse) {\n schemeHandler.parse(components, options);\n }\n } else {\n components.error = components.error || \"URI can not be parsed.\";\n }\n return components;\n}\n\nfunction _recomposeAuthority(components, options) {\n var protocol = options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL;\n var uriTokens = [];\n if (components.userinfo !== undefined) {\n uriTokens.push(components.userinfo);\n uriTokens.push(\"@\");\n }\n if (components.host !== undefined) {\n //normalize IP hosts, add brackets and escape zone separator for IPv6\n uriTokens.push(_normalizeIPv6(_normalizeIPv4(String(components.host), protocol), protocol).replace(protocol.IPV6ADDRESS, function (_, $1, $2) {\n return \"[\" + $1 + ($2 ? \"%25\" + $2 : \"\") + \"]\";\n }));\n }\n if (typeof components.port === \"number\") {\n uriTokens.push(\":\");\n uriTokens.push(components.port.toString(10));\n }\n return uriTokens.length ? uriTokens.join(\"\") : undefined;\n}\n\nvar RDS1 = /^\\.\\.?\\//;\nvar RDS2 = /^\\/\\.(\\/|$)/;\nvar RDS3 = /^\\/\\.\\.(\\/|$)/;\nvar RDS5 = /^\\/?(?:.|\\n)*?(?=\\/|$)/;\nfunction removeDotSegments(input) {\n var output = [];\n while (input.length) {\n if (input.match(RDS1)) {\n input = input.replace(RDS1, \"\");\n } else if (input.match(RDS2)) {\n input = input.replace(RDS2, \"/\");\n } else if (input.match(RDS3)) {\n input = input.replace(RDS3, \"/\");\n output.pop();\n } else if (input === \".\" || input === \"..\") {\n input = \"\";\n } else {\n var im = input.match(RDS5);\n if (im) {\n var s = im[0];\n input = input.slice(s.length);\n output.push(s);\n } else {\n throw new Error(\"Unexpected dot segment condition\");\n }\n }\n }\n return output.join(\"\");\n}\n\nfunction serialize(components) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n var protocol = options.iri ? IRI_PROTOCOL : URI_PROTOCOL;\n var uriTokens = [];\n //find scheme handler\n var schemeHandler = SCHEMES[(options.scheme || components.scheme || \"\").toLowerCase()];\n //perform scheme specific serialization\n if (schemeHandler && schemeHandler.serialize) schemeHandler.serialize(components, options);\n if (components.host) {\n //if host component is an IPv6 address\n if (protocol.IPV6ADDRESS.test(components.host)) {}\n //TODO: normalize IPv6 address as per RFC 5952\n\n //if host component is a domain name\n else if (options.domainHost || schemeHandler && schemeHandler.domainHost) {\n //convert IDN via punycode\n try {\n components.host = !options.iri ? punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase()) : punycode.toUnicode(components.host);\n } catch (e) {\n components.error = components.error || \"Host's domain name can not be converted to \" + (!options.iri ? \"ASCII\" : \"Unicode\") + \" via punycode: \" + e;\n }\n }\n }\n //normalize encoding\n _normalizeComponentEncoding(components, protocol);\n if (options.reference !== \"suffix\" && components.scheme) {\n uriTokens.push(components.scheme);\n uriTokens.push(\":\");\n }\n var authority = _recomposeAuthority(components, options);\n if (authority !== undefined) {\n if (options.reference !== \"suffix\") {\n uriTokens.push(\"//\");\n }\n uriTokens.push(authority);\n if (components.path && components.path.charAt(0) !== \"/\") {\n uriTokens.push(\"/\");\n }\n }\n if (components.path !== undefined) {\n var s = components.path;\n if (!options.absolutePath && (!schemeHandler || !schemeHandler.absolutePath)) {\n s = removeDotSegments(s);\n }\n if (authority === undefined) {\n s = s.replace(/^\\/\\//, \"/%2F\"); //don't allow the path to start with \"//\"\n }\n uriTokens.push(s);\n }\n if (components.query !== undefined) {\n uriTokens.push(\"?\");\n uriTokens.push(components.query);\n }\n if (components.fragment !== undefined) {\n uriTokens.push(\"#\");\n uriTokens.push(components.fragment);\n }\n return uriTokens.join(\"\"); //merge tokens into a string\n}\n\nfunction resolveComponents(base, relative) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var skipNormalization = arguments[3];\n\n var target = {};\n if (!skipNormalization) {\n base = parse(serialize(base, options), options); //normalize base components\n relative = parse(serialize(relative, options), options); //normalize relative components\n }\n options = options || {};\n if (!options.tolerant && relative.scheme) {\n target.scheme = relative.scheme;\n //target.authority = relative.authority;\n target.userinfo = relative.userinfo;\n target.host = relative.host;\n target.port = relative.port;\n target.path = removeDotSegments(relative.path || \"\");\n target.query = relative.query;\n } else {\n if (relative.userinfo !== undefined || relative.host !== undefined || relative.port !== undefined) {\n //target.authority = relative.authority;\n target.userinfo = relative.userinfo;\n target.host = relative.host;\n target.port = relative.port;\n target.path = removeDotSegments(relative.path || \"\");\n target.query = relative.query;\n } else {\n if (!relative.path) {\n target.path = base.path;\n if (relative.query !== undefined) {\n target.query = relative.query;\n } else {\n target.query = base.query;\n }\n } else {\n if (relative.path.charAt(0) === \"/\") {\n target.path = removeDotSegments(relative.path);\n } else {\n if ((base.userinfo !== undefined || base.host !== undefined || base.port !== undefined) && !base.path) {\n target.path = \"/\" + relative.path;\n } else if (!base.path) {\n target.path = relative.path;\n } else {\n target.path = base.path.slice(0, base.path.lastIndexOf(\"/\") + 1) + relative.path;\n }\n target.path = removeDotSegments(target.path);\n }\n target.query = relative.query;\n }\n //target.authority = base.authority;\n target.userinfo = base.userinfo;\n target.host = base.host;\n target.port = base.port;\n }\n target.scheme = base.scheme;\n }\n target.fragment = relative.fragment;\n return target;\n}\n\nfunction resolve(baseURI, relativeURI, options) {\n var schemelessOptions = assign({ scheme: 'null' }, options);\n return serialize(resolveComponents(parse(baseURI, schemelessOptions), parse(relativeURI, schemelessOptions), schemelessOptions, true), schemelessOptions);\n}\n\nfunction normalize(uri, options) {\n if (typeof uri === \"string\") {\n uri = serialize(parse(uri, options), options);\n } else if (typeOf(uri) === \"object\") {\n uri = parse(serialize(uri, options), options);\n }\n return uri;\n}\n\nfunction equal(uriA, uriB, options) {\n if (typeof uriA === \"string\") {\n uriA = serialize(parse(uriA, options), options);\n } else if (typeOf(uriA) === \"object\") {\n uriA = serialize(uriA, options);\n }\n if (typeof uriB === \"string\") {\n uriB = serialize(parse(uriB, options), options);\n } else if (typeOf(uriB) === \"object\") {\n uriB = serialize(uriB, options);\n }\n return uriA === uriB;\n}\n\nfunction escapeComponent(str, options) {\n return str && str.toString().replace(!options || !options.iri ? URI_PROTOCOL.ESCAPE : IRI_PROTOCOL.ESCAPE, pctEncChar);\n}\n\nfunction unescapeComponent(str, options) {\n return str && str.toString().replace(!options || !options.iri ? URI_PROTOCOL.PCT_ENCODED : IRI_PROTOCOL.PCT_ENCODED, pctDecChars);\n}\n\nvar handler = {\n scheme: \"http\",\n domainHost: true,\n parse: function parse(components, options) {\n //report missing host\n if (!components.host) {\n components.error = components.error || \"HTTP URIs must have a host.\";\n }\n return components;\n },\n serialize: function serialize(components, options) {\n //normalize the default port\n if (components.port === (String(components.scheme).toLowerCase() !== \"https\" ? 80 : 443) || components.port === \"\") {\n components.port = undefined;\n }\n //normalize the empty path\n if (!components.path) {\n components.path = \"/\";\n }\n //NOTE: We do not parse query strings for HTTP URIs\n //as WWW Form Url Encoded query strings are part of the HTML4+ spec,\n //and not the HTTP spec.\n return components;\n }\n};\n\nvar handler$1 = {\n scheme: \"https\",\n domainHost: handler.domainHost,\n parse: handler.parse,\n serialize: handler.serialize\n};\n\nvar O = {};\nvar isIRI = true;\n//RFC 3986\nvar UNRESERVED$$ = \"[A-Za-z0-9\\\\-\\\\.\\\\_\\\\~\" + (isIRI ? \"\\\\xA0-\\\\u200D\\\\u2010-\\\\u2029\\\\u202F-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFEF\" : \"\") + \"]\";\nvar HEXDIG$$ = \"[0-9A-Fa-f]\"; //case-insensitive\nvar PCT_ENCODED$ = subexp(subexp(\"%[EFef]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%[89A-Fa-f]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%\" + HEXDIG$$ + HEXDIG$$)); //expanded\n//RFC 5322, except these symbols as per RFC 6068: @ : / ? # [ ] & ; =\n//const ATEXT$$ = \"[A-Za-z0-9\\\\!\\\\#\\\\$\\\\%\\\\&\\\\'\\\\*\\\\+\\\\-\\\\/\\\\=\\\\?\\\\^\\\\_\\\\`\\\\{\\\\|\\\\}\\\\~]\";\n//const WSP$$ = \"[\\\\x20\\\\x09]\";\n//const OBS_QTEXT$$ = \"[\\\\x01-\\\\x08\\\\x0B\\\\x0C\\\\x0E-\\\\x1F\\\\x7F]\"; //(%d1-8 / %d11-12 / %d14-31 / %d127)\n//const QTEXT$$ = merge(\"[\\\\x21\\\\x23-\\\\x5B\\\\x5D-\\\\x7E]\", OBS_QTEXT$$); //%d33 / %d35-91 / %d93-126 / obs-qtext\n//const VCHAR$$ = \"[\\\\x21-\\\\x7E]\";\n//const WSP$$ = \"[\\\\x20\\\\x09]\";\n//const OBS_QP$ = subexp(\"\\\\\\\\\" + merge(\"[\\\\x00\\\\x0D\\\\x0A]\", OBS_QTEXT$$)); //%d0 / CR / LF / obs-qtext\n//const FWS$ = subexp(subexp(WSP$$ + \"*\" + \"\\\\x0D\\\\x0A\") + \"?\" + WSP$$ + \"+\");\n//const QUOTED_PAIR$ = subexp(subexp(\"\\\\\\\\\" + subexp(VCHAR$$ + \"|\" + WSP$$)) + \"|\" + OBS_QP$);\n//const QUOTED_STRING$ = subexp('\\\\\"' + subexp(FWS$ + \"?\" + QCONTENT$) + \"*\" + FWS$ + \"?\" + '\\\\\"');\nvar ATEXT$$ = \"[A-Za-z0-9\\\\!\\\\$\\\\%\\\\'\\\\*\\\\+\\\\-\\\\^\\\\_\\\\`\\\\{\\\\|\\\\}\\\\~]\";\nvar QTEXT$$ = \"[\\\\!\\\\$\\\\%\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\-\\\\.0-9\\\\<\\\\>A-Z\\\\x5E-\\\\x7E]\";\nvar VCHAR$$ = merge(QTEXT$$, \"[\\\\\\\"\\\\\\\\]\");\nvar SOME_DELIMS$$ = \"[\\\\!\\\\$\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\;\\\\:\\\\@]\";\nvar UNRESERVED = new RegExp(UNRESERVED$$, \"g\");\nvar PCT_ENCODED = new RegExp(PCT_ENCODED$, \"g\");\nvar NOT_LOCAL_PART = new RegExp(merge(\"[^]\", ATEXT$$, \"[\\\\.]\", '[\\\\\"]', VCHAR$$), \"g\");\nvar NOT_HFNAME = new RegExp(merge(\"[^]\", UNRESERVED$$, SOME_DELIMS$$), \"g\");\nvar NOT_HFVALUE = NOT_HFNAME;\nfunction decodeUnreserved(str) {\n var decStr = pctDecChars(str);\n return !decStr.match(UNRESERVED) ? str : decStr;\n}\nvar handler$2 = {\n scheme: \"mailto\",\n parse: function parse$$1(components, options) {\n var mailtoComponents = components;\n var to = mailtoComponents.to = mailtoComponents.path ? mailtoComponents.path.split(\",\") : [];\n mailtoComponents.path = undefined;\n if (mailtoComponents.query) {\n var unknownHeaders = false;\n var headers = {};\n var hfields = mailtoComponents.query.split(\"&\");\n for (var x = 0, xl = hfields.length; x < xl; ++x) {\n var hfield = hfields[x].split(\"=\");\n switch (hfield[0]) {\n case \"to\":\n var toAddrs = hfield[1].split(\",\");\n for (var _x = 0, _xl = toAddrs.length; _x < _xl; ++_x) {\n to.push(toAddrs[_x]);\n }\n break;\n case \"subject\":\n mailtoComponents.subject = unescapeComponent(hfield[1], options);\n break;\n case \"body\":\n mailtoComponents.body = unescapeComponent(hfield[1], options);\n break;\n default:\n unknownHeaders = true;\n headers[unescapeComponent(hfield[0], options)] = unescapeComponent(hfield[1], options);\n break;\n }\n }\n if (unknownHeaders) mailtoComponents.headers = headers;\n }\n mailtoComponents.query = undefined;\n for (var _x2 = 0, _xl2 = to.length; _x2 < _xl2; ++_x2) {\n var addr = to[_x2].split(\"@\");\n addr[0] = unescapeComponent(addr[0]);\n if (!options.unicodeSupport) {\n //convert Unicode IDN -> ASCII IDN\n try {\n addr[1] = punycode.toASCII(unescapeComponent(addr[1], options).toLowerCase());\n } catch (e) {\n mailtoComponents.error = mailtoComponents.error || \"Email address's domain name can not be converted to ASCII via punycode: \" + e;\n }\n } else {\n addr[1] = unescapeComponent(addr[1], options).toLowerCase();\n }\n to[_x2] = addr.join(\"@\");\n }\n return mailtoComponents;\n },\n serialize: function serialize$$1(mailtoComponents, options) {\n var components = mailtoComponents;\n var to = toArray(mailtoComponents.to);\n if (to) {\n for (var x = 0, xl = to.length; x < xl; ++x) {\n var toAddr = String(to[x]);\n var atIdx = toAddr.lastIndexOf(\"@\");\n var localPart = toAddr.slice(0, atIdx).replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_LOCAL_PART, pctEncChar);\n var domain = toAddr.slice(atIdx + 1);\n //convert IDN via punycode\n try {\n domain = !options.iri ? punycode.toASCII(unescapeComponent(domain, options).toLowerCase()) : punycode.toUnicode(domain);\n } catch (e) {\n components.error = components.error || \"Email address's domain name can not be converted to \" + (!options.iri ? \"ASCII\" : \"Unicode\") + \" via punycode: \" + e;\n }\n to[x] = localPart + \"@\" + domain;\n }\n components.path = to.join(\",\");\n }\n var headers = mailtoComponents.headers = mailtoComponents.headers || {};\n if (mailtoComponents.subject) headers[\"subject\"] = mailtoComponents.subject;\n if (mailtoComponents.body) headers[\"body\"] = mailtoComponents.body;\n var fields = [];\n for (var name in headers) {\n if (headers[name] !== O[name]) {\n fields.push(name.replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFNAME, pctEncChar) + \"=\" + headers[name].replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFVALUE, pctEncChar));\n }\n }\n if (fields.length) {\n components.query = fields.join(\"&\");\n }\n return components;\n }\n};\n\nvar URN_PARSE = /^([^\\:]+)\\:(.*)/;\n//RFC 2141\nvar handler$3 = {\n scheme: \"urn\",\n parse: function parse$$1(components, options) {\n var matches = components.path && components.path.match(URN_PARSE);\n var urnComponents = components;\n if (matches) {\n var scheme = options.scheme || urnComponents.scheme || \"urn\";\n var nid = matches[1].toLowerCase();\n var nss = matches[2];\n var urnScheme = scheme + \":\" + (options.nid || nid);\n var schemeHandler = SCHEMES[urnScheme];\n urnComponents.nid = nid;\n urnComponents.nss = nss;\n urnComponents.path = undefined;\n if (schemeHandler) {\n urnComponents = schemeHandler.parse(urnComponents, options);\n }\n } else {\n urnComponents.error = urnComponents.error || \"URN can not be parsed.\";\n }\n return urnComponents;\n },\n serialize: function serialize$$1(urnComponents, options) {\n var scheme = options.scheme || urnComponents.scheme || \"urn\";\n var nid = urnComponents.nid;\n var urnScheme = scheme + \":\" + (options.nid || nid);\n var schemeHandler = SCHEMES[urnScheme];\n if (schemeHandler) {\n urnComponents = schemeHandler.serialize(urnComponents, options);\n }\n var uriComponents = urnComponents;\n var nss = urnComponents.nss;\n uriComponents.path = (nid || options.nid) + \":\" + nss;\n return uriComponents;\n }\n};\n\nvar UUID = /^[0-9A-Fa-f]{8}(?:\\-[0-9A-Fa-f]{4}){3}\\-[0-9A-Fa-f]{12}$/;\n//RFC 4122\nvar handler$4 = {\n scheme: \"urn:uuid\",\n parse: function parse(urnComponents, options) {\n var uuidComponents = urnComponents;\n uuidComponents.uuid = uuidComponents.nss;\n uuidComponents.nss = undefined;\n if (!options.tolerant && (!uuidComponents.uuid || !uuidComponents.uuid.match(UUID))) {\n uuidComponents.error = uuidComponents.error || \"UUID is not valid.\";\n }\n return uuidComponents;\n },\n serialize: function serialize(uuidComponents, options) {\n var urnComponents = uuidComponents;\n //normalize UUID\n urnComponents.nss = (uuidComponents.uuid || \"\").toLowerCase();\n return urnComponents;\n }\n};\n\nSCHEMES[handler.scheme] = handler;\nSCHEMES[handler$1.scheme] = handler$1;\nSCHEMES[handler$2.scheme] = handler$2;\nSCHEMES[handler$3.scheme] = handler$3;\nSCHEMES[handler$4.scheme] = handler$4;\n\nexports.SCHEMES = SCHEMES;\nexports.pctEncChar = pctEncChar;\nexports.pctDecChars = pctDecChars;\nexports.parse = parse;\nexports.removeDotSegments = removeDotSegments;\nexports.serialize = serialize;\nexports.resolveComponents = resolveComponents;\nexports.resolve = resolve;\nexports.normalize = normalize;\nexports.equal = equal;\nexports.escapeComponent = escapeComponent;\nexports.unescapeComponent = unescapeComponent;\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n//# sourceMappingURL=uri.all.js.map\n","'use strict';\n\n// https://mathiasbynens.be/notes/javascript-encoding\n// https://github.com/bestiejs/punycode.js - punycode.ucs2.decode\nmodule.exports = function ucs2length(str) {\n var length = 0\n , len = str.length\n , pos = 0\n , value;\n while (pos < len) {\n length++;\n value = str.charCodeAt(pos++);\n if (value >= 0xD800 && value <= 0xDBFF && pos < len) {\n // high surrogate, and there is a next character\n value = str.charCodeAt(pos);\n if ((value & 0xFC00) == 0xDC00) pos++; // low surrogate\n }\n }\n return length;\n};\n","'use strict';\n\nvar traverse = module.exports = function (schema, opts, cb) {\n // Legacy support for v0.3.1 and earlier.\n if (typeof opts == 'function') {\n cb = opts;\n opts = {};\n }\n\n cb = opts.cb || cb;\n var pre = (typeof cb == 'function') ? cb : cb.pre || function() {};\n var post = cb.post || function() {};\n\n _traverse(opts, pre, post, schema, '', schema);\n};\n\n\ntraverse.keywords = {\n additionalItems: true,\n items: true,\n contains: true,\n additionalProperties: true,\n propertyNames: true,\n not: true\n};\n\ntraverse.arrayKeywords = {\n items: true,\n allOf: true,\n anyOf: true,\n oneOf: true\n};\n\ntraverse.propsKeywords = {\n definitions: true,\n properties: true,\n patternProperties: true,\n dependencies: true\n};\n\ntraverse.skipKeywords = {\n default: true,\n enum: true,\n const: true,\n required: true,\n maximum: true,\n minimum: true,\n exclusiveMaximum: true,\n exclusiveMinimum: true,\n multipleOf: true,\n maxLength: true,\n minLength: true,\n pattern: true,\n format: true,\n maxItems: true,\n minItems: true,\n uniqueItems: true,\n maxProperties: true,\n minProperties: true\n};\n\n\nfunction _traverse(opts, pre, post, schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex) {\n if (schema && typeof schema == 'object' && !Array.isArray(schema)) {\n pre(schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex);\n for (var key in schema) {\n var sch = schema[key];\n if (Array.isArray(sch)) {\n if (key in traverse.arrayKeywords) {\n for (var i=0; i%\\\\^`{|}]|%[0-9a-f]{2})|\\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\\*)?)*\\})*$/i;\n// For the source: https://gist.github.com/dperini/729294\n// For test cases: https://mathiasbynens.be/demo/url-regex\n// @todo Delete current URL in favour of the commented out URL rule when this issue is fixed https://github.com/eslint/eslint/issues/7983.\n// var URL = /^(?:(?:https?|ftp):\\/\\/)(?:\\S+(?::\\S*)?@)?(?:(?!10(?:\\.\\d{1,3}){3})(?!127(?:\\.\\d{1,3}){3})(?!169\\.254(?:\\.\\d{1,3}){2})(?!192\\.168(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u{00a1}-\\u{ffff}0-9]+-?)*[a-z\\u{00a1}-\\u{ffff}0-9]+)(?:\\.(?:[a-z\\u{00a1}-\\u{ffff}0-9]+-?)*[a-z\\u{00a1}-\\u{ffff}0-9]+)*(?:\\.(?:[a-z\\u{00a1}-\\u{ffff}]{2,})))(?::\\d{2,5})?(?:\\/[^\\s]*)?$/iu;\nvar URL = /^(?:(?:http[s\\u017F]?|ftp):\\/\\/)(?:(?:[\\0-\\x08\\x0E-\\x1F!-\\x9F\\xA1-\\u167F\\u1681-\\u1FFF\\u200B-\\u2027\\u202A-\\u202E\\u2030-\\u205E\\u2060-\\u2FFF\\u3001-\\uD7FF\\uE000-\\uFEFE\\uFF00-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF])+(?::(?:[\\0-\\x08\\x0E-\\x1F!-\\x9F\\xA1-\\u167F\\u1681-\\u1FFF\\u200B-\\u2027\\u202A-\\u202E\\u2030-\\u205E\\u2060-\\u2FFF\\u3001-\\uD7FF\\uE000-\\uFEFE\\uFF00-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF])*)?@)?(?:(?!10(?:\\.[0-9]{1,3}){3})(?!127(?:\\.[0-9]{1,3}){3})(?!169\\.254(?:\\.[0-9]{1,3}){2})(?!192\\.168(?:\\.[0-9]{1,3}){2})(?!172\\.(?:1[6-9]|2[0-9]|3[01])(?:\\.[0-9]{1,3}){2})(?:[1-9][0-9]?|1[0-9][0-9]|2[01][0-9]|22[0-3])(?:\\.(?:1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])){2}(?:\\.(?:[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-4]))|(?:(?:(?:[0-9KSa-z\\xA1-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF])+-?)*(?:[0-9KSa-z\\xA1-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF])+)(?:\\.(?:(?:[0-9KSa-z\\xA1-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF])+-?)*(?:[0-9KSa-z\\xA1-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF])+)*(?:\\.(?:(?:[KSa-z\\xA1-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]){2,})))(?::[0-9]{2,5})?(?:\\/(?:[\\0-\\x08\\x0E-\\x1F!-\\x9F\\xA1-\\u167F\\u1681-\\u1FFF\\u200B-\\u2027\\u202A-\\u202E\\u2030-\\u205E\\u2060-\\u2FFF\\u3001-\\uD7FF\\uE000-\\uFEFE\\uFF00-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF])*)?$/i;\nvar UUID = /^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i;\nvar JSON_POINTER = /^(?:\\/(?:[^~/]|~0|~1)*)*$/;\nvar JSON_POINTER_URI_FRAGMENT = /^#(?:\\/(?:[a-z0-9_\\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i;\nvar RELATIVE_JSON_POINTER = /^(?:0|[1-9][0-9]*)(?:#|(?:\\/(?:[^~/]|~0|~1)*)*)$/;\n\n\nmodule.exports = formats;\n\nfunction formats(mode) {\n mode = mode == 'full' ? 'full' : 'fast';\n return util.copy(formats[mode]);\n}\n\n\nformats.fast = {\n // date: http://tools.ietf.org/html/rfc3339#section-5.6\n date: /^\\d\\d\\d\\d-[0-1]\\d-[0-3]\\d$/,\n // date-time: http://tools.ietf.org/html/rfc3339#section-5.6\n time: /^(?:[0-2]\\d:[0-5]\\d:[0-5]\\d|23:59:60)(?:\\.\\d+)?(?:z|[+-]\\d\\d(?::?\\d\\d)?)?$/i,\n 'date-time': /^\\d\\d\\d\\d-[0-1]\\d-[0-3]\\d[t\\s](?:[0-2]\\d:[0-5]\\d:[0-5]\\d|23:59:60)(?:\\.\\d+)?(?:z|[+-]\\d\\d(?::?\\d\\d)?)$/i,\n // uri: https://github.com/mafintosh/is-my-json-valid/blob/master/formats.js\n uri: /^(?:[a-z][a-z0-9+-.]*:)(?:\\/?\\/)?[^\\s]*$/i,\n 'uri-reference': /^(?:(?:[a-z][a-z0-9+-.]*:)?\\/?\\/)?(?:[^\\\\\\s#][^\\s#]*)?(?:#[^\\\\\\s]*)?$/i,\n 'uri-template': URITEMPLATE,\n url: URL,\n // email (sources from jsen validator):\n // http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address#answer-8829363\n // http://www.w3.org/TR/html5/forms.html#valid-e-mail-address (search for 'willful violation')\n email: /^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i,\n hostname: HOSTNAME,\n // optimized https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html\n ipv4: /^(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$/,\n // optimized http://stackoverflow.com/questions/53497/regular-expression-that-matches-valid-ipv6-addresses\n ipv6: /^\\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(?:%.+)?\\s*$/i,\n regex: regex,\n // uuid: http://tools.ietf.org/html/rfc4122\n uuid: UUID,\n // JSON-pointer: https://tools.ietf.org/html/rfc6901\n // uri fragment: https://tools.ietf.org/html/rfc3986#appendix-A\n 'json-pointer': JSON_POINTER,\n 'json-pointer-uri-fragment': JSON_POINTER_URI_FRAGMENT,\n // relative JSON-pointer: http://tools.ietf.org/html/draft-luff-relative-json-pointer-00\n 'relative-json-pointer': RELATIVE_JSON_POINTER\n};\n\n\nformats.full = {\n date: date,\n time: time,\n 'date-time': date_time,\n uri: uri,\n 'uri-reference': URIREF,\n 'uri-template': URITEMPLATE,\n url: URL,\n email: /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i,\n hostname: HOSTNAME,\n ipv4: /^(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$/,\n ipv6: /^\\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(?:%.+)?\\s*$/i,\n regex: regex,\n uuid: UUID,\n 'json-pointer': JSON_POINTER,\n 'json-pointer-uri-fragment': JSON_POINTER_URI_FRAGMENT,\n 'relative-json-pointer': RELATIVE_JSON_POINTER\n};\n\n\nfunction isLeapYear(year) {\n // https://tools.ietf.org/html/rfc3339#appendix-C\n return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);\n}\n\n\nfunction date(str) {\n // full-date from http://tools.ietf.org/html/rfc3339#section-5.6\n var matches = str.match(DATE);\n if (!matches) return false;\n\n var year = +matches[1];\n var month = +matches[2];\n var day = +matches[3];\n\n return month >= 1 && month <= 12 && day >= 1 &&\n day <= (month == 2 && isLeapYear(year) ? 29 : DAYS[month]);\n}\n\n\nfunction time(str, full) {\n var matches = str.match(TIME);\n if (!matches) return false;\n\n var hour = matches[1];\n var minute = matches[2];\n var second = matches[3];\n var timeZone = matches[5];\n return ((hour <= 23 && minute <= 59 && second <= 59) ||\n (hour == 23 && minute == 59 && second == 60)) &&\n (!full || timeZone);\n}\n\n\nvar DATE_TIME_SEPARATOR = /t|\\s/i;\nfunction date_time(str) {\n // http://tools.ietf.org/html/rfc3339#section-5.6\n var dateTime = str.split(DATE_TIME_SEPARATOR);\n return dateTime.length == 2 && date(dateTime[0]) && time(dateTime[1], true);\n}\n\n\nvar NOT_URI_FRAGMENT = /\\/|:/;\nfunction uri(str) {\n // http://jmrware.com/articles/2009/uri_regexp/URI_regex.html + optional protocol + required \".\"\n return NOT_URI_FRAGMENT.test(str) && URI.test(str);\n}\n\n\nvar Z_ANCHOR = /[^\\\\]\\\\Z/;\nfunction regex(str) {\n if (Z_ANCHOR.test(str)) return false;\n try {\n new RegExp(str);\n return true;\n } catch(e) {\n return false;\n }\n}\n","'use strict';\n\nvar ruleModules = require('../dotjs')\n , toHash = require('./util').toHash;\n\nmodule.exports = function rules() {\n var RULES = [\n { type: 'number',\n rules: [ { 'maximum': ['exclusiveMaximum'] },\n { 'minimum': ['exclusiveMinimum'] }, 'multipleOf', 'format'] },\n { type: 'string',\n rules: [ 'maxLength', 'minLength', 'pattern', 'format' ] },\n { type: 'array',\n rules: [ 'maxItems', 'minItems', 'items', 'contains', 'uniqueItems' ] },\n { type: 'object',\n rules: [ 'maxProperties', 'minProperties', 'required', 'dependencies', 'propertyNames',\n { 'properties': ['additionalProperties', 'patternProperties'] } ] },\n { rules: [ '$ref', 'const', 'enum', 'not', 'anyOf', 'oneOf', 'allOf', 'if' ] }\n ];\n\n var ALL = [ 'type', '$comment' ];\n var KEYWORDS = [\n '$schema', '$id', 'id', '$data', '$async', 'title',\n 'description', 'default', 'definitions',\n 'examples', 'readOnly', 'writeOnly',\n 'contentMediaType', 'contentEncoding',\n 'additionalItems', 'then', 'else'\n ];\n var TYPES = [ 'number', 'integer', 'string', 'array', 'object', 'boolean', 'null' ];\n RULES.all = toHash(ALL);\n RULES.types = toHash(TYPES);\n\n RULES.forEach(function (group) {\n group.rules = group.rules.map(function (keyword) {\n var implKeywords;\n if (typeof keyword == 'object') {\n var key = Object.keys(keyword)[0];\n implKeywords = keyword[key];\n keyword = key;\n implKeywords.forEach(function (k) {\n ALL.push(k);\n RULES.all[k] = true;\n });\n }\n ALL.push(keyword);\n var rule = RULES.all[keyword] = {\n keyword: keyword,\n code: ruleModules[keyword],\n implements: implKeywords\n };\n return rule;\n });\n\n RULES.all.$comment = {\n keyword: '$comment',\n code: ruleModules.$comment\n };\n\n if (group.type) RULES.types[group.type] = group;\n });\n\n RULES.keywords = toHash(ALL.concat(KEYWORDS));\n RULES.custom = {};\n\n return RULES;\n};\n","'use strict';\n\n//all requires must be explicit because browserify won't work with dynamic requires\nmodule.exports = {\n '$ref': require('./ref'),\n allOf: require('./allOf'),\n anyOf: require('./anyOf'),\n '$comment': require('./comment'),\n const: require('./const'),\n contains: require('./contains'),\n dependencies: require('./dependencies'),\n 'enum': require('./enum'),\n format: require('./format'),\n 'if': require('./if'),\n items: require('./items'),\n maximum: require('./_limit'),\n minimum: require('./_limit'),\n maxItems: require('./_limitItems'),\n minItems: require('./_limitItems'),\n maxLength: require('./_limitLength'),\n minLength: require('./_limitLength'),\n maxProperties: require('./_limitProperties'),\n minProperties: require('./_limitProperties'),\n multipleOf: require('./multipleOf'),\n not: require('./not'),\n oneOf: require('./oneOf'),\n pattern: require('./pattern'),\n properties: require('./properties'),\n propertyNames: require('./propertyNames'),\n required: require('./required'),\n uniqueItems: require('./uniqueItems'),\n validate: require('./validate')\n};\n","'use strict';\nmodule.exports = function generate_ref(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $data = 'data' + ($dataLvl || '');\n var $valid = 'valid' + $lvl;\n var $async, $refCode;\n if ($schema == '#' || $schema == '#/') {\n if (it.isRoot) {\n $async = it.async;\n $refCode = 'validate';\n } else {\n $async = it.root.schema.$async === true;\n $refCode = 'root.refVal[0]';\n }\n } else {\n var $refVal = it.resolveRef(it.baseId, $schema, it.isRoot);\n if ($refVal === undefined) {\n var $message = it.MissingRefError.message(it.baseId, $schema);\n if (it.opts.missingRefs == 'fail') {\n it.logger.error($message);\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('$ref') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { ref: \\'' + (it.util.escapeQuotes($schema)) + '\\' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'can\\\\\\'t resolve reference ' + (it.util.escapeQuotes($schema)) + '\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: ' + (it.util.toQuotedString($schema)) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n if ($breakOnError) {\n out += ' if (false) { ';\n }\n } else if (it.opts.missingRefs == 'ignore') {\n it.logger.warn($message);\n if ($breakOnError) {\n out += ' if (true) { ';\n }\n } else {\n throw new it.MissingRefError(it.baseId, $schema, $message);\n }\n } else if ($refVal.inline) {\n var $it = it.util.copy(it);\n $it.level++;\n var $nextValid = 'valid' + $it.level;\n $it.schema = $refVal.schema;\n $it.schemaPath = '';\n $it.errSchemaPath = $schema;\n var $code = it.validate($it).replace(/validate\\.schema/g, $refVal.code);\n out += ' ' + ($code) + ' ';\n if ($breakOnError) {\n out += ' if (' + ($nextValid) + ') { ';\n }\n } else {\n $async = $refVal.$async === true || (it.async && $refVal.$async !== false);\n $refCode = $refVal.code;\n }\n }\n if ($refCode) {\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = '';\n if (it.opts.passContext) {\n out += ' ' + ($refCode) + '.call(this, ';\n } else {\n out += ' ' + ($refCode) + '( ';\n }\n out += ' ' + ($data) + ', (dataPath || \\'\\')';\n if (it.errorPath != '\"\"') {\n out += ' + ' + (it.errorPath);\n }\n var $parentData = $dataLvl ? 'data' + (($dataLvl - 1) || '') : 'parentData',\n $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty';\n out += ' , ' + ($parentData) + ' , ' + ($parentDataProperty) + ', rootData) ';\n var __callValidate = out;\n out = $$outStack.pop();\n if ($async) {\n if (!it.async) throw new Error('async schema referenced by sync schema');\n if ($breakOnError) {\n out += ' var ' + ($valid) + '; ';\n }\n out += ' try { await ' + (__callValidate) + '; ';\n if ($breakOnError) {\n out += ' ' + ($valid) + ' = true; ';\n }\n out += ' } catch (e) { if (!(e instanceof ValidationError)) throw e; if (vErrors === null) vErrors = e.errors; else vErrors = vErrors.concat(e.errors); errors = vErrors.length; ';\n if ($breakOnError) {\n out += ' ' + ($valid) + ' = false; ';\n }\n out += ' } ';\n if ($breakOnError) {\n out += ' if (' + ($valid) + ') { ';\n }\n } else {\n out += ' if (!' + (__callValidate) + ') { if (vErrors === null) vErrors = ' + ($refCode) + '.errors; else vErrors = vErrors.concat(' + ($refCode) + '.errors); errors = vErrors.length; } ';\n if ($breakOnError) {\n out += ' else { ';\n }\n }\n }\n return out;\n}\n","'use strict';\nmodule.exports = function generate_allOf(it, $keyword, $ruleType) {\n var out = ' ';\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $it = it.util.copy(it);\n var $closingBraces = '';\n $it.level++;\n var $nextValid = 'valid' + $it.level;\n var $currentBaseId = $it.baseId,\n $allSchemasEmpty = true;\n var arr1 = $schema;\n if (arr1) {\n var $sch, $i = -1,\n l1 = arr1.length - 1;\n while ($i < l1) {\n $sch = arr1[$i += 1];\n if ((it.opts.strictKeywords ? typeof $sch == 'object' && Object.keys($sch).length > 0 : it.util.schemaHasRules($sch, it.RULES.all))) {\n $allSchemasEmpty = false;\n $it.schema = $sch;\n $it.schemaPath = $schemaPath + '[' + $i + ']';\n $it.errSchemaPath = $errSchemaPath + '/' + $i;\n out += ' ' + (it.validate($it)) + ' ';\n $it.baseId = $currentBaseId;\n if ($breakOnError) {\n out += ' if (' + ($nextValid) + ') { ';\n $closingBraces += '}';\n }\n }\n }\n }\n if ($breakOnError) {\n if ($allSchemasEmpty) {\n out += ' if (true) { ';\n } else {\n out += ' ' + ($closingBraces.slice(0, -1)) + ' ';\n }\n }\n out = it.util.cleanUpCode(out);\n return out;\n}\n","'use strict';\nmodule.exports = function generate_anyOf(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $data = 'data' + ($dataLvl || '');\n var $valid = 'valid' + $lvl;\n var $errs = 'errs__' + $lvl;\n var $it = it.util.copy(it);\n var $closingBraces = '';\n $it.level++;\n var $nextValid = 'valid' + $it.level;\n var $noEmptySchema = $schema.every(function($sch) {\n return (it.opts.strictKeywords ? typeof $sch == 'object' && Object.keys($sch).length > 0 : it.util.schemaHasRules($sch, it.RULES.all));\n });\n if ($noEmptySchema) {\n var $currentBaseId = $it.baseId;\n out += ' var ' + ($errs) + ' = errors; var ' + ($valid) + ' = false; ';\n var $wasComposite = it.compositeRule;\n it.compositeRule = $it.compositeRule = true;\n var arr1 = $schema;\n if (arr1) {\n var $sch, $i = -1,\n l1 = arr1.length - 1;\n while ($i < l1) {\n $sch = arr1[$i += 1];\n $it.schema = $sch;\n $it.schemaPath = $schemaPath + '[' + $i + ']';\n $it.errSchemaPath = $errSchemaPath + '/' + $i;\n out += ' ' + (it.validate($it)) + ' ';\n $it.baseId = $currentBaseId;\n out += ' ' + ($valid) + ' = ' + ($valid) + ' || ' + ($nextValid) + '; if (!' + ($valid) + ') { ';\n $closingBraces += '}';\n }\n }\n it.compositeRule = $it.compositeRule = $wasComposite;\n out += ' ' + ($closingBraces) + ' if (!' + ($valid) + ') { var err = '; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('anyOf') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should match some schema in anyOf\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError(vErrors); ';\n } else {\n out += ' validate.errors = vErrors; return false; ';\n }\n }\n out += ' } else { errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } ';\n if (it.opts.allErrors) {\n out += ' } ';\n }\n out = it.util.cleanUpCode(out);\n } else {\n if ($breakOnError) {\n out += ' if (true) { ';\n }\n }\n return out;\n}\n","'use strict';\nmodule.exports = function generate_comment(it, $keyword, $ruleType) {\n var out = ' ';\n var $schema = it.schema[$keyword];\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $comment = it.util.toQuotedString($schema);\n if (it.opts.$comment === true) {\n out += ' console.log(' + ($comment) + ');';\n } else if (typeof it.opts.$comment == 'function') {\n out += ' self._opts.$comment(' + ($comment) + ', ' + (it.util.toQuotedString($errSchemaPath)) + ', validate.root.schema);';\n }\n return out;\n}\n","'use strict';\nmodule.exports = function generate_const(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $data = 'data' + ($dataLvl || '');\n var $valid = 'valid' + $lvl;\n var $isData = it.opts.$data && $schema && $schema.$data,\n $schemaValue;\n if ($isData) {\n out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';\n $schemaValue = 'schema' + $lvl;\n } else {\n $schemaValue = $schema;\n }\n if (!$isData) {\n out += ' var schema' + ($lvl) + ' = validate.schema' + ($schemaPath) + ';';\n }\n out += 'var ' + ($valid) + ' = equal(' + ($data) + ', schema' + ($lvl) + '); if (!' + ($valid) + ') { ';\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('const') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { allowedValue: schema' + ($lvl) + ' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should be equal to constant\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += ' }';\n if ($breakOnError) {\n out += ' else { ';\n }\n return out;\n}\n","'use strict';\nmodule.exports = function generate_contains(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $data = 'data' + ($dataLvl || '');\n var $valid = 'valid' + $lvl;\n var $errs = 'errs__' + $lvl;\n var $it = it.util.copy(it);\n var $closingBraces = '';\n $it.level++;\n var $nextValid = 'valid' + $it.level;\n var $idx = 'i' + $lvl,\n $dataNxt = $it.dataLevel = it.dataLevel + 1,\n $nextData = 'data' + $dataNxt,\n $currentBaseId = it.baseId,\n $nonEmptySchema = (it.opts.strictKeywords ? typeof $schema == 'object' && Object.keys($schema).length > 0 : it.util.schemaHasRules($schema, it.RULES.all));\n out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';';\n if ($nonEmptySchema) {\n var $wasComposite = it.compositeRule;\n it.compositeRule = $it.compositeRule = true;\n $it.schema = $schema;\n $it.schemaPath = $schemaPath;\n $it.errSchemaPath = $errSchemaPath;\n out += ' var ' + ($nextValid) + ' = false; for (var ' + ($idx) + ' = 0; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { ';\n $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true);\n var $passData = $data + '[' + $idx + ']';\n $it.dataPathArr[$dataNxt] = $idx;\n var $code = it.validate($it);\n $it.baseId = $currentBaseId;\n if (it.util.varOccurences($code, $nextData) < 2) {\n out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';\n } else {\n out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';\n }\n out += ' if (' + ($nextValid) + ') break; } ';\n it.compositeRule = $it.compositeRule = $wasComposite;\n out += ' ' + ($closingBraces) + ' if (!' + ($nextValid) + ') {';\n } else {\n out += ' if (' + ($data) + '.length == 0) {';\n }\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('contains') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should contain a valid item\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += ' } else { ';\n if ($nonEmptySchema) {\n out += ' errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } ';\n }\n if (it.opts.allErrors) {\n out += ' } ';\n }\n out = it.util.cleanUpCode(out);\n return out;\n}\n","'use strict';\nmodule.exports = function generate_dependencies(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $data = 'data' + ($dataLvl || '');\n var $errs = 'errs__' + $lvl;\n var $it = it.util.copy(it);\n var $closingBraces = '';\n $it.level++;\n var $nextValid = 'valid' + $it.level;\n var $schemaDeps = {},\n $propertyDeps = {},\n $ownProperties = it.opts.ownProperties;\n for ($property in $schema) {\n var $sch = $schema[$property];\n var $deps = Array.isArray($sch) ? $propertyDeps : $schemaDeps;\n $deps[$property] = $sch;\n }\n out += 'var ' + ($errs) + ' = errors;';\n var $currentErrorPath = it.errorPath;\n out += 'var missing' + ($lvl) + ';';\n for (var $property in $propertyDeps) {\n $deps = $propertyDeps[$property];\n if ($deps.length) {\n out += ' if ( ' + ($data) + (it.util.getProperty($property)) + ' !== undefined ';\n if ($ownProperties) {\n out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', \\'' + (it.util.escapeQuotes($property)) + '\\') ';\n }\n if ($breakOnError) {\n out += ' && ( ';\n var arr1 = $deps;\n if (arr1) {\n var $propertyKey, $i = -1,\n l1 = arr1.length - 1;\n while ($i < l1) {\n $propertyKey = arr1[$i += 1];\n if ($i) {\n out += ' || ';\n }\n var $prop = it.util.getProperty($propertyKey),\n $useData = $data + $prop;\n out += ' ( ( ' + ($useData) + ' === undefined ';\n if ($ownProperties) {\n out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \\'' + (it.util.escapeQuotes($propertyKey)) + '\\') ';\n }\n out += ') && (missing' + ($lvl) + ' = ' + (it.util.toQuotedString(it.opts.jsonPointers ? $propertyKey : $prop)) + ') ) ';\n }\n }\n out += ')) { ';\n var $propertyPath = 'missing' + $lvl,\n $missingProperty = '\\' + ' + $propertyPath + ' + \\'';\n if (it.opts._errorDataPathProperty) {\n it.errorPath = it.opts.jsonPointers ? it.util.getPathExpr($currentErrorPath, $propertyPath, true) : $currentErrorPath + ' + ' + $propertyPath;\n }\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('dependencies') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { property: \\'' + (it.util.escapeQuotes($property)) + '\\', missingProperty: \\'' + ($missingProperty) + '\\', depsCount: ' + ($deps.length) + ', deps: \\'' + (it.util.escapeQuotes($deps.length == 1 ? $deps[0] : $deps.join(\", \"))) + '\\' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should have ';\n if ($deps.length == 1) {\n out += 'property ' + (it.util.escapeQuotes($deps[0]));\n } else {\n out += 'properties ' + (it.util.escapeQuotes($deps.join(\", \")));\n }\n out += ' when property ' + (it.util.escapeQuotes($property)) + ' is present\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n } else {\n out += ' ) { ';\n var arr2 = $deps;\n if (arr2) {\n var $propertyKey, i2 = -1,\n l2 = arr2.length - 1;\n while (i2 < l2) {\n $propertyKey = arr2[i2 += 1];\n var $prop = it.util.getProperty($propertyKey),\n $missingProperty = it.util.escapeQuotes($propertyKey),\n $useData = $data + $prop;\n if (it.opts._errorDataPathProperty) {\n it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers);\n }\n out += ' if ( ' + ($useData) + ' === undefined ';\n if ($ownProperties) {\n out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \\'' + (it.util.escapeQuotes($propertyKey)) + '\\') ';\n }\n out += ') { var err = '; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('dependencies') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { property: \\'' + (it.util.escapeQuotes($property)) + '\\', missingProperty: \\'' + ($missingProperty) + '\\', depsCount: ' + ($deps.length) + ', deps: \\'' + (it.util.escapeQuotes($deps.length == 1 ? $deps[0] : $deps.join(\", \"))) + '\\' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should have ';\n if ($deps.length == 1) {\n out += 'property ' + (it.util.escapeQuotes($deps[0]));\n } else {\n out += 'properties ' + (it.util.escapeQuotes($deps.join(\", \")));\n }\n out += ' when property ' + (it.util.escapeQuotes($property)) + ' is present\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } ';\n }\n }\n }\n out += ' } ';\n if ($breakOnError) {\n $closingBraces += '}';\n out += ' else { ';\n }\n }\n }\n it.errorPath = $currentErrorPath;\n var $currentBaseId = $it.baseId;\n for (var $property in $schemaDeps) {\n var $sch = $schemaDeps[$property];\n if ((it.opts.strictKeywords ? typeof $sch == 'object' && Object.keys($sch).length > 0 : it.util.schemaHasRules($sch, it.RULES.all))) {\n out += ' ' + ($nextValid) + ' = true; if ( ' + ($data) + (it.util.getProperty($property)) + ' !== undefined ';\n if ($ownProperties) {\n out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', \\'' + (it.util.escapeQuotes($property)) + '\\') ';\n }\n out += ') { ';\n $it.schema = $sch;\n $it.schemaPath = $schemaPath + it.util.getProperty($property);\n $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($property);\n out += ' ' + (it.validate($it)) + ' ';\n $it.baseId = $currentBaseId;\n out += ' } ';\n if ($breakOnError) {\n out += ' if (' + ($nextValid) + ') { ';\n $closingBraces += '}';\n }\n }\n }\n if ($breakOnError) {\n out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {';\n }\n out = it.util.cleanUpCode(out);\n return out;\n}\n","'use strict';\nmodule.exports = function generate_enum(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $data = 'data' + ($dataLvl || '');\n var $valid = 'valid' + $lvl;\n var $isData = it.opts.$data && $schema && $schema.$data,\n $schemaValue;\n if ($isData) {\n out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';\n $schemaValue = 'schema' + $lvl;\n } else {\n $schemaValue = $schema;\n }\n var $i = 'i' + $lvl,\n $vSchema = 'schema' + $lvl;\n if (!$isData) {\n out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + ';';\n }\n out += 'var ' + ($valid) + ';';\n if ($isData) {\n out += ' if (schema' + ($lvl) + ' === undefined) ' + ($valid) + ' = true; else if (!Array.isArray(schema' + ($lvl) + ')) ' + ($valid) + ' = false; else {';\n }\n out += '' + ($valid) + ' = false;for (var ' + ($i) + '=0; ' + ($i) + '<' + ($vSchema) + '.length; ' + ($i) + '++) if (equal(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + '])) { ' + ($valid) + ' = true; break; }';\n if ($isData) {\n out += ' } ';\n }\n out += ' if (!' + ($valid) + ') { ';\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('enum') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { allowedValues: schema' + ($lvl) + ' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should be equal to one of the allowed values\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += ' }';\n if ($breakOnError) {\n out += ' else { ';\n }\n return out;\n}\n","'use strict';\nmodule.exports = function generate_format(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $data = 'data' + ($dataLvl || '');\n if (it.opts.format === false) {\n if ($breakOnError) {\n out += ' if (true) { ';\n }\n return out;\n }\n var $isData = it.opts.$data && $schema && $schema.$data,\n $schemaValue;\n if ($isData) {\n out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';\n $schemaValue = 'schema' + $lvl;\n } else {\n $schemaValue = $schema;\n }\n var $unknownFormats = it.opts.unknownFormats,\n $allowUnknown = Array.isArray($unknownFormats);\n if ($isData) {\n var $format = 'format' + $lvl,\n $isObject = 'isObject' + $lvl,\n $formatType = 'formatType' + $lvl;\n out += ' var ' + ($format) + ' = formats[' + ($schemaValue) + ']; var ' + ($isObject) + ' = typeof ' + ($format) + ' == \\'object\\' && !(' + ($format) + ' instanceof RegExp) && ' + ($format) + '.validate; var ' + ($formatType) + ' = ' + ($isObject) + ' && ' + ($format) + '.type || \\'string\\'; if (' + ($isObject) + ') { ';\n if (it.async) {\n out += ' var async' + ($lvl) + ' = ' + ($format) + '.async; ';\n }\n out += ' ' + ($format) + ' = ' + ($format) + '.validate; } if ( ';\n if ($isData) {\n out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \\'string\\') || ';\n }\n out += ' (';\n if ($unknownFormats != 'ignore') {\n out += ' (' + ($schemaValue) + ' && !' + ($format) + ' ';\n if ($allowUnknown) {\n out += ' && self._opts.unknownFormats.indexOf(' + ($schemaValue) + ') == -1 ';\n }\n out += ') || ';\n }\n out += ' (' + ($format) + ' && ' + ($formatType) + ' == \\'' + ($ruleType) + '\\' && !(typeof ' + ($format) + ' == \\'function\\' ? ';\n if (it.async) {\n out += ' (async' + ($lvl) + ' ? await ' + ($format) + '(' + ($data) + ') : ' + ($format) + '(' + ($data) + ')) ';\n } else {\n out += ' ' + ($format) + '(' + ($data) + ') ';\n }\n out += ' : ' + ($format) + '.test(' + ($data) + '))))) {';\n } else {\n var $format = it.formats[$schema];\n if (!$format) {\n if ($unknownFormats == 'ignore') {\n it.logger.warn('unknown format \"' + $schema + '\" ignored in schema at path \"' + it.errSchemaPath + '\"');\n if ($breakOnError) {\n out += ' if (true) { ';\n }\n return out;\n } else if ($allowUnknown && $unknownFormats.indexOf($schema) >= 0) {\n if ($breakOnError) {\n out += ' if (true) { ';\n }\n return out;\n } else {\n throw new Error('unknown format \"' + $schema + '\" is used in schema at path \"' + it.errSchemaPath + '\"');\n }\n }\n var $isObject = typeof $format == 'object' && !($format instanceof RegExp) && $format.validate;\n var $formatType = $isObject && $format.type || 'string';\n if ($isObject) {\n var $async = $format.async === true;\n $format = $format.validate;\n }\n if ($formatType != $ruleType) {\n if ($breakOnError) {\n out += ' if (true) { ';\n }\n return out;\n }\n if ($async) {\n if (!it.async) throw new Error('async format in sync schema');\n var $formatRef = 'formats' + it.util.getProperty($schema) + '.validate';\n out += ' if (!(await ' + ($formatRef) + '(' + ($data) + '))) { ';\n } else {\n out += ' if (! ';\n var $formatRef = 'formats' + it.util.getProperty($schema);\n if ($isObject) $formatRef += '.validate';\n if (typeof $format == 'function') {\n out += ' ' + ($formatRef) + '(' + ($data) + ') ';\n } else {\n out += ' ' + ($formatRef) + '.test(' + ($data) + ') ';\n }\n out += ') { ';\n }\n }\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('format') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { format: ';\n if ($isData) {\n out += '' + ($schemaValue);\n } else {\n out += '' + (it.util.toQuotedString($schema));\n }\n out += ' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should match format \"';\n if ($isData) {\n out += '\\' + ' + ($schemaValue) + ' + \\'';\n } else {\n out += '' + (it.util.escapeQuotes($schema));\n }\n out += '\"\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: ';\n if ($isData) {\n out += 'validate.schema' + ($schemaPath);\n } else {\n out += '' + (it.util.toQuotedString($schema));\n }\n out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += ' } ';\n if ($breakOnError) {\n out += ' else { ';\n }\n return out;\n}\n","'use strict';\nmodule.exports = function generate_if(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $data = 'data' + ($dataLvl || '');\n var $valid = 'valid' + $lvl;\n var $errs = 'errs__' + $lvl;\n var $it = it.util.copy(it);\n $it.level++;\n var $nextValid = 'valid' + $it.level;\n var $thenSch = it.schema['then'],\n $elseSch = it.schema['else'],\n $thenPresent = $thenSch !== undefined && (it.opts.strictKeywords ? typeof $thenSch == 'object' && Object.keys($thenSch).length > 0 : it.util.schemaHasRules($thenSch, it.RULES.all)),\n $elsePresent = $elseSch !== undefined && (it.opts.strictKeywords ? typeof $elseSch == 'object' && Object.keys($elseSch).length > 0 : it.util.schemaHasRules($elseSch, it.RULES.all)),\n $currentBaseId = $it.baseId;\n if ($thenPresent || $elsePresent) {\n var $ifClause;\n $it.createErrors = false;\n $it.schema = $schema;\n $it.schemaPath = $schemaPath;\n $it.errSchemaPath = $errSchemaPath;\n out += ' var ' + ($errs) + ' = errors; var ' + ($valid) + ' = true; ';\n var $wasComposite = it.compositeRule;\n it.compositeRule = $it.compositeRule = true;\n out += ' ' + (it.validate($it)) + ' ';\n $it.baseId = $currentBaseId;\n $it.createErrors = true;\n out += ' errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } ';\n it.compositeRule = $it.compositeRule = $wasComposite;\n if ($thenPresent) {\n out += ' if (' + ($nextValid) + ') { ';\n $it.schema = it.schema['then'];\n $it.schemaPath = it.schemaPath + '.then';\n $it.errSchemaPath = it.errSchemaPath + '/then';\n out += ' ' + (it.validate($it)) + ' ';\n $it.baseId = $currentBaseId;\n out += ' ' + ($valid) + ' = ' + ($nextValid) + '; ';\n if ($thenPresent && $elsePresent) {\n $ifClause = 'ifClause' + $lvl;\n out += ' var ' + ($ifClause) + ' = \\'then\\'; ';\n } else {\n $ifClause = '\\'then\\'';\n }\n out += ' } ';\n if ($elsePresent) {\n out += ' else { ';\n }\n } else {\n out += ' if (!' + ($nextValid) + ') { ';\n }\n if ($elsePresent) {\n $it.schema = it.schema['else'];\n $it.schemaPath = it.schemaPath + '.else';\n $it.errSchemaPath = it.errSchemaPath + '/else';\n out += ' ' + (it.validate($it)) + ' ';\n $it.baseId = $currentBaseId;\n out += ' ' + ($valid) + ' = ' + ($nextValid) + '; ';\n if ($thenPresent && $elsePresent) {\n $ifClause = 'ifClause' + $lvl;\n out += ' var ' + ($ifClause) + ' = \\'else\\'; ';\n } else {\n $ifClause = '\\'else\\'';\n }\n out += ' } ';\n }\n out += ' if (!' + ($valid) + ') { var err = '; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('if') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { failingKeyword: ' + ($ifClause) + ' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should match \"\\' + ' + ($ifClause) + ' + \\'\" schema\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError(vErrors); ';\n } else {\n out += ' validate.errors = vErrors; return false; ';\n }\n }\n out += ' } ';\n if ($breakOnError) {\n out += ' else { ';\n }\n out = it.util.cleanUpCode(out);\n } else {\n if ($breakOnError) {\n out += ' if (true) { ';\n }\n }\n return out;\n}\n","'use strict';\nmodule.exports = function generate_items(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $data = 'data' + ($dataLvl || '');\n var $valid = 'valid' + $lvl;\n var $errs = 'errs__' + $lvl;\n var $it = it.util.copy(it);\n var $closingBraces = '';\n $it.level++;\n var $nextValid = 'valid' + $it.level;\n var $idx = 'i' + $lvl,\n $dataNxt = $it.dataLevel = it.dataLevel + 1,\n $nextData = 'data' + $dataNxt,\n $currentBaseId = it.baseId;\n out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';';\n if (Array.isArray($schema)) {\n var $additionalItems = it.schema.additionalItems;\n if ($additionalItems === false) {\n out += ' ' + ($valid) + ' = ' + ($data) + '.length <= ' + ($schema.length) + '; ';\n var $currErrSchemaPath = $errSchemaPath;\n $errSchemaPath = it.errSchemaPath + '/additionalItems';\n out += ' if (!' + ($valid) + ') { ';\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('additionalItems') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schema.length) + ' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should NOT have more than ' + ($schema.length) + ' items\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += ' } ';\n $errSchemaPath = $currErrSchemaPath;\n if ($breakOnError) {\n $closingBraces += '}';\n out += ' else { ';\n }\n }\n var arr1 = $schema;\n if (arr1) {\n var $sch, $i = -1,\n l1 = arr1.length - 1;\n while ($i < l1) {\n $sch = arr1[$i += 1];\n if ((it.opts.strictKeywords ? typeof $sch == 'object' && Object.keys($sch).length > 0 : it.util.schemaHasRules($sch, it.RULES.all))) {\n out += ' ' + ($nextValid) + ' = true; if (' + ($data) + '.length > ' + ($i) + ') { ';\n var $passData = $data + '[' + $i + ']';\n $it.schema = $sch;\n $it.schemaPath = $schemaPath + '[' + $i + ']';\n $it.errSchemaPath = $errSchemaPath + '/' + $i;\n $it.errorPath = it.util.getPathExpr(it.errorPath, $i, it.opts.jsonPointers, true);\n $it.dataPathArr[$dataNxt] = $i;\n var $code = it.validate($it);\n $it.baseId = $currentBaseId;\n if (it.util.varOccurences($code, $nextData) < 2) {\n out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';\n } else {\n out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';\n }\n out += ' } ';\n if ($breakOnError) {\n out += ' if (' + ($nextValid) + ') { ';\n $closingBraces += '}';\n }\n }\n }\n }\n if (typeof $additionalItems == 'object' && (it.opts.strictKeywords ? typeof $additionalItems == 'object' && Object.keys($additionalItems).length > 0 : it.util.schemaHasRules($additionalItems, it.RULES.all))) {\n $it.schema = $additionalItems;\n $it.schemaPath = it.schemaPath + '.additionalItems';\n $it.errSchemaPath = it.errSchemaPath + '/additionalItems';\n out += ' ' + ($nextValid) + ' = true; if (' + ($data) + '.length > ' + ($schema.length) + ') { for (var ' + ($idx) + ' = ' + ($schema.length) + '; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { ';\n $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true);\n var $passData = $data + '[' + $idx + ']';\n $it.dataPathArr[$dataNxt] = $idx;\n var $code = it.validate($it);\n $it.baseId = $currentBaseId;\n if (it.util.varOccurences($code, $nextData) < 2) {\n out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';\n } else {\n out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';\n }\n if ($breakOnError) {\n out += ' if (!' + ($nextValid) + ') break; ';\n }\n out += ' } } ';\n if ($breakOnError) {\n out += ' if (' + ($nextValid) + ') { ';\n $closingBraces += '}';\n }\n }\n } else if ((it.opts.strictKeywords ? typeof $schema == 'object' && Object.keys($schema).length > 0 : it.util.schemaHasRules($schema, it.RULES.all))) {\n $it.schema = $schema;\n $it.schemaPath = $schemaPath;\n $it.errSchemaPath = $errSchemaPath;\n out += ' for (var ' + ($idx) + ' = ' + (0) + '; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { ';\n $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true);\n var $passData = $data + '[' + $idx + ']';\n $it.dataPathArr[$dataNxt] = $idx;\n var $code = it.validate($it);\n $it.baseId = $currentBaseId;\n if (it.util.varOccurences($code, $nextData) < 2) {\n out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';\n } else {\n out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';\n }\n if ($breakOnError) {\n out += ' if (!' + ($nextValid) + ') break; ';\n }\n out += ' }';\n }\n if ($breakOnError) {\n out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {';\n }\n out = it.util.cleanUpCode(out);\n return out;\n}\n","'use strict';\nmodule.exports = function generate_multipleOf(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $data = 'data' + ($dataLvl || '');\n var $isData = it.opts.$data && $schema && $schema.$data,\n $schemaValue;\n if ($isData) {\n out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';\n $schemaValue = 'schema' + $lvl;\n } else {\n $schemaValue = $schema;\n }\n out += 'var division' + ($lvl) + ';if (';\n if ($isData) {\n out += ' ' + ($schemaValue) + ' !== undefined && ( typeof ' + ($schemaValue) + ' != \\'number\\' || ';\n }\n out += ' (division' + ($lvl) + ' = ' + ($data) + ' / ' + ($schemaValue) + ', ';\n if (it.opts.multipleOfPrecision) {\n out += ' Math.abs(Math.round(division' + ($lvl) + ') - division' + ($lvl) + ') > 1e-' + (it.opts.multipleOfPrecision) + ' ';\n } else {\n out += ' division' + ($lvl) + ' !== parseInt(division' + ($lvl) + ') ';\n }\n out += ' ) ';\n if ($isData) {\n out += ' ) ';\n }\n out += ' ) { ';\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('multipleOf') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { multipleOf: ' + ($schemaValue) + ' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should be multiple of ';\n if ($isData) {\n out += '\\' + ' + ($schemaValue);\n } else {\n out += '' + ($schemaValue) + '\\'';\n }\n }\n if (it.opts.verbose) {\n out += ' , schema: ';\n if ($isData) {\n out += 'validate.schema' + ($schemaPath);\n } else {\n out += '' + ($schema);\n }\n out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += '} ';\n if ($breakOnError) {\n out += ' else { ';\n }\n return out;\n}\n","'use strict';\nmodule.exports = function generate_not(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $data = 'data' + ($dataLvl || '');\n var $errs = 'errs__' + $lvl;\n var $it = it.util.copy(it);\n $it.level++;\n var $nextValid = 'valid' + $it.level;\n if ((it.opts.strictKeywords ? typeof $schema == 'object' && Object.keys($schema).length > 0 : it.util.schemaHasRules($schema, it.RULES.all))) {\n $it.schema = $schema;\n $it.schemaPath = $schemaPath;\n $it.errSchemaPath = $errSchemaPath;\n out += ' var ' + ($errs) + ' = errors; ';\n var $wasComposite = it.compositeRule;\n it.compositeRule = $it.compositeRule = true;\n $it.createErrors = false;\n var $allErrorsOption;\n if ($it.opts.allErrors) {\n $allErrorsOption = $it.opts.allErrors;\n $it.opts.allErrors = false;\n }\n out += ' ' + (it.validate($it)) + ' ';\n $it.createErrors = true;\n if ($allErrorsOption) $it.opts.allErrors = $allErrorsOption;\n it.compositeRule = $it.compositeRule = $wasComposite;\n out += ' if (' + ($nextValid) + ') { ';\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('not') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should NOT be valid\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += ' } else { errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } ';\n if (it.opts.allErrors) {\n out += ' } ';\n }\n } else {\n out += ' var err = '; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('not') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should NOT be valid\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n if ($breakOnError) {\n out += ' if (false) { ';\n }\n }\n return out;\n}\n","'use strict';\nmodule.exports = function generate_oneOf(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $data = 'data' + ($dataLvl || '');\n var $valid = 'valid' + $lvl;\n var $errs = 'errs__' + $lvl;\n var $it = it.util.copy(it);\n var $closingBraces = '';\n $it.level++;\n var $nextValid = 'valid' + $it.level;\n var $currentBaseId = $it.baseId,\n $prevValid = 'prevValid' + $lvl,\n $passingSchemas = 'passingSchemas' + $lvl;\n out += 'var ' + ($errs) + ' = errors , ' + ($prevValid) + ' = false , ' + ($valid) + ' = false , ' + ($passingSchemas) + ' = null; ';\n var $wasComposite = it.compositeRule;\n it.compositeRule = $it.compositeRule = true;\n var arr1 = $schema;\n if (arr1) {\n var $sch, $i = -1,\n l1 = arr1.length - 1;\n while ($i < l1) {\n $sch = arr1[$i += 1];\n if ((it.opts.strictKeywords ? typeof $sch == 'object' && Object.keys($sch).length > 0 : it.util.schemaHasRules($sch, it.RULES.all))) {\n $it.schema = $sch;\n $it.schemaPath = $schemaPath + '[' + $i + ']';\n $it.errSchemaPath = $errSchemaPath + '/' + $i;\n out += ' ' + (it.validate($it)) + ' ';\n $it.baseId = $currentBaseId;\n } else {\n out += ' var ' + ($nextValid) + ' = true; ';\n }\n if ($i) {\n out += ' if (' + ($nextValid) + ' && ' + ($prevValid) + ') { ' + ($valid) + ' = false; ' + ($passingSchemas) + ' = [' + ($passingSchemas) + ', ' + ($i) + ']; } else { ';\n $closingBraces += '}';\n }\n out += ' if (' + ($nextValid) + ') { ' + ($valid) + ' = ' + ($prevValid) + ' = true; ' + ($passingSchemas) + ' = ' + ($i) + '; }';\n }\n }\n it.compositeRule = $it.compositeRule = $wasComposite;\n out += '' + ($closingBraces) + 'if (!' + ($valid) + ') { var err = '; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('oneOf') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { passingSchemas: ' + ($passingSchemas) + ' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should match exactly one schema in oneOf\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError(vErrors); ';\n } else {\n out += ' validate.errors = vErrors; return false; ';\n }\n }\n out += '} else { errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; }';\n if (it.opts.allErrors) {\n out += ' } ';\n }\n return out;\n}\n","'use strict';\nmodule.exports = function generate_pattern(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $data = 'data' + ($dataLvl || '');\n var $isData = it.opts.$data && $schema && $schema.$data,\n $schemaValue;\n if ($isData) {\n out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';\n $schemaValue = 'schema' + $lvl;\n } else {\n $schemaValue = $schema;\n }\n var $regexp = $isData ? '(new RegExp(' + $schemaValue + '))' : it.usePattern($schema);\n out += 'if ( ';\n if ($isData) {\n out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \\'string\\') || ';\n }\n out += ' !' + ($regexp) + '.test(' + ($data) + ') ) { ';\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('pattern') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { pattern: ';\n if ($isData) {\n out += '' + ($schemaValue);\n } else {\n out += '' + (it.util.toQuotedString($schema));\n }\n out += ' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should match pattern \"';\n if ($isData) {\n out += '\\' + ' + ($schemaValue) + ' + \\'';\n } else {\n out += '' + (it.util.escapeQuotes($schema));\n }\n out += '\"\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: ';\n if ($isData) {\n out += 'validate.schema' + ($schemaPath);\n } else {\n out += '' + (it.util.toQuotedString($schema));\n }\n out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += '} ';\n if ($breakOnError) {\n out += ' else { ';\n }\n return out;\n}\n","'use strict';\nmodule.exports = function generate_properties(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $data = 'data' + ($dataLvl || '');\n var $errs = 'errs__' + $lvl;\n var $it = it.util.copy(it);\n var $closingBraces = '';\n $it.level++;\n var $nextValid = 'valid' + $it.level;\n var $key = 'key' + $lvl,\n $idx = 'idx' + $lvl,\n $dataNxt = $it.dataLevel = it.dataLevel + 1,\n $nextData = 'data' + $dataNxt,\n $dataProperties = 'dataProperties' + $lvl;\n var $schemaKeys = Object.keys($schema || {}),\n $pProperties = it.schema.patternProperties || {},\n $pPropertyKeys = Object.keys($pProperties),\n $aProperties = it.schema.additionalProperties,\n $someProperties = $schemaKeys.length || $pPropertyKeys.length,\n $noAdditional = $aProperties === false,\n $additionalIsSchema = typeof $aProperties == 'object' && Object.keys($aProperties).length,\n $removeAdditional = it.opts.removeAdditional,\n $checkAdditional = $noAdditional || $additionalIsSchema || $removeAdditional,\n $ownProperties = it.opts.ownProperties,\n $currentBaseId = it.baseId;\n var $required = it.schema.required;\n if ($required && !(it.opts.$data && $required.$data) && $required.length < it.opts.loopRequired) var $requiredHash = it.util.toHash($required);\n out += 'var ' + ($errs) + ' = errors;var ' + ($nextValid) + ' = true;';\n if ($ownProperties) {\n out += ' var ' + ($dataProperties) + ' = undefined;';\n }\n if ($checkAdditional) {\n if ($ownProperties) {\n out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; ';\n } else {\n out += ' for (var ' + ($key) + ' in ' + ($data) + ') { ';\n }\n if ($someProperties) {\n out += ' var isAdditional' + ($lvl) + ' = !(false ';\n if ($schemaKeys.length) {\n if ($schemaKeys.length > 8) {\n out += ' || validate.schema' + ($schemaPath) + '.hasOwnProperty(' + ($key) + ') ';\n } else {\n var arr1 = $schemaKeys;\n if (arr1) {\n var $propertyKey, i1 = -1,\n l1 = arr1.length - 1;\n while (i1 < l1) {\n $propertyKey = arr1[i1 += 1];\n out += ' || ' + ($key) + ' == ' + (it.util.toQuotedString($propertyKey)) + ' ';\n }\n }\n }\n }\n if ($pPropertyKeys.length) {\n var arr2 = $pPropertyKeys;\n if (arr2) {\n var $pProperty, $i = -1,\n l2 = arr2.length - 1;\n while ($i < l2) {\n $pProperty = arr2[$i += 1];\n out += ' || ' + (it.usePattern($pProperty)) + '.test(' + ($key) + ') ';\n }\n }\n }\n out += ' ); if (isAdditional' + ($lvl) + ') { ';\n }\n if ($removeAdditional == 'all') {\n out += ' delete ' + ($data) + '[' + ($key) + ']; ';\n } else {\n var $currentErrorPath = it.errorPath;\n var $additionalProperty = '\\' + ' + $key + ' + \\'';\n if (it.opts._errorDataPathProperty) {\n it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers);\n }\n if ($noAdditional) {\n if ($removeAdditional) {\n out += ' delete ' + ($data) + '[' + ($key) + ']; ';\n } else {\n out += ' ' + ($nextValid) + ' = false; ';\n var $currErrSchemaPath = $errSchemaPath;\n $errSchemaPath = it.errSchemaPath + '/additionalProperties';\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('additionalProperties') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { additionalProperty: \\'' + ($additionalProperty) + '\\' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'';\n if (it.opts._errorDataPathProperty) {\n out += 'is an invalid additional property';\n } else {\n out += 'should NOT have additional properties';\n }\n out += '\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n $errSchemaPath = $currErrSchemaPath;\n if ($breakOnError) {\n out += ' break; ';\n }\n }\n } else if ($additionalIsSchema) {\n if ($removeAdditional == 'failing') {\n out += ' var ' + ($errs) + ' = errors; ';\n var $wasComposite = it.compositeRule;\n it.compositeRule = $it.compositeRule = true;\n $it.schema = $aProperties;\n $it.schemaPath = it.schemaPath + '.additionalProperties';\n $it.errSchemaPath = it.errSchemaPath + '/additionalProperties';\n $it.errorPath = it.opts._errorDataPathProperty ? it.errorPath : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers);\n var $passData = $data + '[' + $key + ']';\n $it.dataPathArr[$dataNxt] = $key;\n var $code = it.validate($it);\n $it.baseId = $currentBaseId;\n if (it.util.varOccurences($code, $nextData) < 2) {\n out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';\n } else {\n out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';\n }\n out += ' if (!' + ($nextValid) + ') { errors = ' + ($errs) + '; if (validate.errors !== null) { if (errors) validate.errors.length = errors; else validate.errors = null; } delete ' + ($data) + '[' + ($key) + ']; } ';\n it.compositeRule = $it.compositeRule = $wasComposite;\n } else {\n $it.schema = $aProperties;\n $it.schemaPath = it.schemaPath + '.additionalProperties';\n $it.errSchemaPath = it.errSchemaPath + '/additionalProperties';\n $it.errorPath = it.opts._errorDataPathProperty ? it.errorPath : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers);\n var $passData = $data + '[' + $key + ']';\n $it.dataPathArr[$dataNxt] = $key;\n var $code = it.validate($it);\n $it.baseId = $currentBaseId;\n if (it.util.varOccurences($code, $nextData) < 2) {\n out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';\n } else {\n out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';\n }\n if ($breakOnError) {\n out += ' if (!' + ($nextValid) + ') break; ';\n }\n }\n }\n it.errorPath = $currentErrorPath;\n }\n if ($someProperties) {\n out += ' } ';\n }\n out += ' } ';\n if ($breakOnError) {\n out += ' if (' + ($nextValid) + ') { ';\n $closingBraces += '}';\n }\n }\n var $useDefaults = it.opts.useDefaults && !it.compositeRule;\n if ($schemaKeys.length) {\n var arr3 = $schemaKeys;\n if (arr3) {\n var $propertyKey, i3 = -1,\n l3 = arr3.length - 1;\n while (i3 < l3) {\n $propertyKey = arr3[i3 += 1];\n var $sch = $schema[$propertyKey];\n if ((it.opts.strictKeywords ? typeof $sch == 'object' && Object.keys($sch).length > 0 : it.util.schemaHasRules($sch, it.RULES.all))) {\n var $prop = it.util.getProperty($propertyKey),\n $passData = $data + $prop,\n $hasDefault = $useDefaults && $sch.default !== undefined;\n $it.schema = $sch;\n $it.schemaPath = $schemaPath + $prop;\n $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($propertyKey);\n $it.errorPath = it.util.getPath(it.errorPath, $propertyKey, it.opts.jsonPointers);\n $it.dataPathArr[$dataNxt] = it.util.toQuotedString($propertyKey);\n var $code = it.validate($it);\n $it.baseId = $currentBaseId;\n if (it.util.varOccurences($code, $nextData) < 2) {\n $code = it.util.varReplace($code, $nextData, $passData);\n var $useData = $passData;\n } else {\n var $useData = $nextData;\n out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ';\n }\n if ($hasDefault) {\n out += ' ' + ($code) + ' ';\n } else {\n if ($requiredHash && $requiredHash[$propertyKey]) {\n out += ' if ( ' + ($useData) + ' === undefined ';\n if ($ownProperties) {\n out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \\'' + (it.util.escapeQuotes($propertyKey)) + '\\') ';\n }\n out += ') { ' + ($nextValid) + ' = false; ';\n var $currentErrorPath = it.errorPath,\n $currErrSchemaPath = $errSchemaPath,\n $missingProperty = it.util.escapeQuotes($propertyKey);\n if (it.opts._errorDataPathProperty) {\n it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers);\n }\n $errSchemaPath = it.errSchemaPath + '/required';\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('required') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \\'' + ($missingProperty) + '\\' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'';\n if (it.opts._errorDataPathProperty) {\n out += 'is a required property';\n } else {\n out += 'should have required property \\\\\\'' + ($missingProperty) + '\\\\\\'';\n }\n out += '\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n $errSchemaPath = $currErrSchemaPath;\n it.errorPath = $currentErrorPath;\n out += ' } else { ';\n } else {\n if ($breakOnError) {\n out += ' if ( ' + ($useData) + ' === undefined ';\n if ($ownProperties) {\n out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \\'' + (it.util.escapeQuotes($propertyKey)) + '\\') ';\n }\n out += ') { ' + ($nextValid) + ' = true; } else { ';\n } else {\n out += ' if (' + ($useData) + ' !== undefined ';\n if ($ownProperties) {\n out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', \\'' + (it.util.escapeQuotes($propertyKey)) + '\\') ';\n }\n out += ' ) { ';\n }\n }\n out += ' ' + ($code) + ' } ';\n }\n }\n if ($breakOnError) {\n out += ' if (' + ($nextValid) + ') { ';\n $closingBraces += '}';\n }\n }\n }\n }\n if ($pPropertyKeys.length) {\n var arr4 = $pPropertyKeys;\n if (arr4) {\n var $pProperty, i4 = -1,\n l4 = arr4.length - 1;\n while (i4 < l4) {\n $pProperty = arr4[i4 += 1];\n var $sch = $pProperties[$pProperty];\n if ((it.opts.strictKeywords ? typeof $sch == 'object' && Object.keys($sch).length > 0 : it.util.schemaHasRules($sch, it.RULES.all))) {\n $it.schema = $sch;\n $it.schemaPath = it.schemaPath + '.patternProperties' + it.util.getProperty($pProperty);\n $it.errSchemaPath = it.errSchemaPath + '/patternProperties/' + it.util.escapeFragment($pProperty);\n if ($ownProperties) {\n out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; ';\n } else {\n out += ' for (var ' + ($key) + ' in ' + ($data) + ') { ';\n }\n out += ' if (' + (it.usePattern($pProperty)) + '.test(' + ($key) + ')) { ';\n $it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers);\n var $passData = $data + '[' + $key + ']';\n $it.dataPathArr[$dataNxt] = $key;\n var $code = it.validate($it);\n $it.baseId = $currentBaseId;\n if (it.util.varOccurences($code, $nextData) < 2) {\n out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';\n } else {\n out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';\n }\n if ($breakOnError) {\n out += ' if (!' + ($nextValid) + ') break; ';\n }\n out += ' } ';\n if ($breakOnError) {\n out += ' else ' + ($nextValid) + ' = true; ';\n }\n out += ' } ';\n if ($breakOnError) {\n out += ' if (' + ($nextValid) + ') { ';\n $closingBraces += '}';\n }\n }\n }\n }\n }\n if ($breakOnError) {\n out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {';\n }\n out = it.util.cleanUpCode(out);\n return out;\n}\n","'use strict';\nmodule.exports = function generate_propertyNames(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $data = 'data' + ($dataLvl || '');\n var $errs = 'errs__' + $lvl;\n var $it = it.util.copy(it);\n var $closingBraces = '';\n $it.level++;\n var $nextValid = 'valid' + $it.level;\n out += 'var ' + ($errs) + ' = errors;';\n if ((it.opts.strictKeywords ? typeof $schema == 'object' && Object.keys($schema).length > 0 : it.util.schemaHasRules($schema, it.RULES.all))) {\n $it.schema = $schema;\n $it.schemaPath = $schemaPath;\n $it.errSchemaPath = $errSchemaPath;\n var $key = 'key' + $lvl,\n $idx = 'idx' + $lvl,\n $i = 'i' + $lvl,\n $invalidName = '\\' + ' + $key + ' + \\'',\n $dataNxt = $it.dataLevel = it.dataLevel + 1,\n $nextData = 'data' + $dataNxt,\n $dataProperties = 'dataProperties' + $lvl,\n $ownProperties = it.opts.ownProperties,\n $currentBaseId = it.baseId;\n if ($ownProperties) {\n out += ' var ' + ($dataProperties) + ' = undefined; ';\n }\n if ($ownProperties) {\n out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; ';\n } else {\n out += ' for (var ' + ($key) + ' in ' + ($data) + ') { ';\n }\n out += ' var startErrs' + ($lvl) + ' = errors; ';\n var $passData = $key;\n var $wasComposite = it.compositeRule;\n it.compositeRule = $it.compositeRule = true;\n var $code = it.validate($it);\n $it.baseId = $currentBaseId;\n if (it.util.varOccurences($code, $nextData) < 2) {\n out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';\n } else {\n out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';\n }\n it.compositeRule = $it.compositeRule = $wasComposite;\n out += ' if (!' + ($nextValid) + ') { for (var ' + ($i) + '=startErrs' + ($lvl) + '; ' + ($i) + ' 0 : it.util.schemaHasRules($propertySch, it.RULES.all)))) {\n $required[$required.length] = $property;\n }\n }\n }\n } else {\n var $required = $schema;\n }\n }\n if ($isData || $required.length) {\n var $currentErrorPath = it.errorPath,\n $loopRequired = $isData || $required.length >= it.opts.loopRequired,\n $ownProperties = it.opts.ownProperties;\n if ($breakOnError) {\n out += ' var missing' + ($lvl) + '; ';\n if ($loopRequired) {\n if (!$isData) {\n out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + '; ';\n }\n var $i = 'i' + $lvl,\n $propertyPath = 'schema' + $lvl + '[' + $i + ']',\n $missingProperty = '\\' + ' + $propertyPath + ' + \\'';\n if (it.opts._errorDataPathProperty) {\n it.errorPath = it.util.getPathExpr($currentErrorPath, $propertyPath, it.opts.jsonPointers);\n }\n out += ' var ' + ($valid) + ' = true; ';\n if ($isData) {\n out += ' if (schema' + ($lvl) + ' === undefined) ' + ($valid) + ' = true; else if (!Array.isArray(schema' + ($lvl) + ')) ' + ($valid) + ' = false; else {';\n }\n out += ' for (var ' + ($i) + ' = 0; ' + ($i) + ' < ' + ($vSchema) + '.length; ' + ($i) + '++) { ' + ($valid) + ' = ' + ($data) + '[' + ($vSchema) + '[' + ($i) + ']] !== undefined ';\n if ($ownProperties) {\n out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + ']) ';\n }\n out += '; if (!' + ($valid) + ') break; } ';\n if ($isData) {\n out += ' } ';\n }\n out += ' if (!' + ($valid) + ') { ';\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('required') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \\'' + ($missingProperty) + '\\' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'';\n if (it.opts._errorDataPathProperty) {\n out += 'is a required property';\n } else {\n out += 'should have required property \\\\\\'' + ($missingProperty) + '\\\\\\'';\n }\n out += '\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += ' } else { ';\n } else {\n out += ' if ( ';\n var arr2 = $required;\n if (arr2) {\n var $propertyKey, $i = -1,\n l2 = arr2.length - 1;\n while ($i < l2) {\n $propertyKey = arr2[$i += 1];\n if ($i) {\n out += ' || ';\n }\n var $prop = it.util.getProperty($propertyKey),\n $useData = $data + $prop;\n out += ' ( ( ' + ($useData) + ' === undefined ';\n if ($ownProperties) {\n out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \\'' + (it.util.escapeQuotes($propertyKey)) + '\\') ';\n }\n out += ') && (missing' + ($lvl) + ' = ' + (it.util.toQuotedString(it.opts.jsonPointers ? $propertyKey : $prop)) + ') ) ';\n }\n }\n out += ') { ';\n var $propertyPath = 'missing' + $lvl,\n $missingProperty = '\\' + ' + $propertyPath + ' + \\'';\n if (it.opts._errorDataPathProperty) {\n it.errorPath = it.opts.jsonPointers ? it.util.getPathExpr($currentErrorPath, $propertyPath, true) : $currentErrorPath + ' + ' + $propertyPath;\n }\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('required') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \\'' + ($missingProperty) + '\\' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'';\n if (it.opts._errorDataPathProperty) {\n out += 'is a required property';\n } else {\n out += 'should have required property \\\\\\'' + ($missingProperty) + '\\\\\\'';\n }\n out += '\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += ' } else { ';\n }\n } else {\n if ($loopRequired) {\n if (!$isData) {\n out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + '; ';\n }\n var $i = 'i' + $lvl,\n $propertyPath = 'schema' + $lvl + '[' + $i + ']',\n $missingProperty = '\\' + ' + $propertyPath + ' + \\'';\n if (it.opts._errorDataPathProperty) {\n it.errorPath = it.util.getPathExpr($currentErrorPath, $propertyPath, it.opts.jsonPointers);\n }\n if ($isData) {\n out += ' if (' + ($vSchema) + ' && !Array.isArray(' + ($vSchema) + ')) { var err = '; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('required') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \\'' + ($missingProperty) + '\\' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'';\n if (it.opts._errorDataPathProperty) {\n out += 'is a required property';\n } else {\n out += 'should have required property \\\\\\'' + ($missingProperty) + '\\\\\\'';\n }\n out += '\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else if (' + ($vSchema) + ' !== undefined) { ';\n }\n out += ' for (var ' + ($i) + ' = 0; ' + ($i) + ' < ' + ($vSchema) + '.length; ' + ($i) + '++) { if (' + ($data) + '[' + ($vSchema) + '[' + ($i) + ']] === undefined ';\n if ($ownProperties) {\n out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + ']) ';\n }\n out += ') { var err = '; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('required') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \\'' + ($missingProperty) + '\\' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'';\n if (it.opts._errorDataPathProperty) {\n out += 'is a required property';\n } else {\n out += 'should have required property \\\\\\'' + ($missingProperty) + '\\\\\\'';\n }\n out += '\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } ';\n if ($isData) {\n out += ' } ';\n }\n } else {\n var arr3 = $required;\n if (arr3) {\n var $propertyKey, i3 = -1,\n l3 = arr3.length - 1;\n while (i3 < l3) {\n $propertyKey = arr3[i3 += 1];\n var $prop = it.util.getProperty($propertyKey),\n $missingProperty = it.util.escapeQuotes($propertyKey),\n $useData = $data + $prop;\n if (it.opts._errorDataPathProperty) {\n it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers);\n }\n out += ' if ( ' + ($useData) + ' === undefined ';\n if ($ownProperties) {\n out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \\'' + (it.util.escapeQuotes($propertyKey)) + '\\') ';\n }\n out += ') { var err = '; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('required') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \\'' + ($missingProperty) + '\\' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'';\n if (it.opts._errorDataPathProperty) {\n out += 'is a required property';\n } else {\n out += 'should have required property \\\\\\'' + ($missingProperty) + '\\\\\\'';\n }\n out += '\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } ';\n }\n }\n }\n }\n it.errorPath = $currentErrorPath;\n } else if ($breakOnError) {\n out += ' if (true) {';\n }\n return out;\n}\n","'use strict';\nmodule.exports = function generate_uniqueItems(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $data = 'data' + ($dataLvl || '');\n var $valid = 'valid' + $lvl;\n var $isData = it.opts.$data && $schema && $schema.$data,\n $schemaValue;\n if ($isData) {\n out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';\n $schemaValue = 'schema' + $lvl;\n } else {\n $schemaValue = $schema;\n }\n if (($schema || $isData) && it.opts.uniqueItems !== false) {\n if ($isData) {\n out += ' var ' + ($valid) + '; if (' + ($schemaValue) + ' === false || ' + ($schemaValue) + ' === undefined) ' + ($valid) + ' = true; else if (typeof ' + ($schemaValue) + ' != \\'boolean\\') ' + ($valid) + ' = false; else { ';\n }\n out += ' var i = ' + ($data) + '.length , ' + ($valid) + ' = true , j; if (i > 1) { ';\n var $itemType = it.schema.items && it.schema.items.type,\n $typeIsArray = Array.isArray($itemType);\n if (!$itemType || $itemType == 'object' || $itemType == 'array' || ($typeIsArray && ($itemType.indexOf('object') >= 0 || $itemType.indexOf('array') >= 0))) {\n out += ' outer: for (;i--;) { for (j = i; j--;) { if (equal(' + ($data) + '[i], ' + ($data) + '[j])) { ' + ($valid) + ' = false; break outer; } } } ';\n } else {\n out += ' var itemIndices = {}, item; for (;i--;) { var item = ' + ($data) + '[i]; ';\n var $method = 'checkDataType' + ($typeIsArray ? 's' : '');\n out += ' if (' + (it.util[$method]($itemType, 'item', true)) + ') continue; ';\n if ($typeIsArray) {\n out += ' if (typeof item == \\'string\\') item = \\'\"\\' + item; ';\n }\n out += ' if (typeof itemIndices[item] == \\'number\\') { ' + ($valid) + ' = false; j = itemIndices[item]; break; } itemIndices[item] = i; } ';\n }\n out += ' } ';\n if ($isData) {\n out += ' } ';\n }\n out += ' if (!' + ($valid) + ') { ';\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('uniqueItems') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { i: i, j: j } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should NOT have duplicate items (items ## \\' + j + \\' and \\' + i + \\' are identical)\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: ';\n if ($isData) {\n out += 'validate.schema' + ($schemaPath);\n } else {\n out += '' + ($schema);\n }\n out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += ' } ';\n if ($breakOnError) {\n out += ' else { ';\n }\n } else {\n if ($breakOnError) {\n out += ' if (true) { ';\n }\n }\n return out;\n}\n","'use strict';\n\nvar KEYWORDS = [\n 'multipleOf',\n 'maximum',\n 'exclusiveMaximum',\n 'minimum',\n 'exclusiveMinimum',\n 'maxLength',\n 'minLength',\n 'pattern',\n 'additionalItems',\n 'maxItems',\n 'minItems',\n 'uniqueItems',\n 'maxProperties',\n 'minProperties',\n 'required',\n 'additionalProperties',\n 'enum',\n 'format',\n 'const'\n];\n\nmodule.exports = function (metaSchema, keywordsJsonPointers) {\n for (var i=0; i {\n this.modules[moduleType] = [];\n });\n }\n\n /**\n * An array of extensions, or an array of arrays that contains extension\n * configuration pairs.\n *\n * @param {Object[]} extensions - Array of extensions\n */\n registerExtensions(extensions) {\n extensions.forEach((extension) => {\n const hasConfiguration = Array.isArray(extension);\n\n if (hasConfiguration) {\n const [ohifExtension, configuration] = extension;\n this.registerExtension(ohifExtension, configuration);\n } else {\n this.registerExtension(extension);\n }\n });\n }\n\n /**\n *\n * TODO: Id Management: SopClassHandlers currently refer to viewport module by id; setting the extension id as viewport module id is a workaround for now\n * @param {Object} extension\n * @param {Object} configuration\n */\n registerExtension(extension, configuration = {}) {\n if (!extension) {\n log.warn(\n 'Attempting to register a null/undefined extension. Exiting early.'\n );\n return;\n }\n\n let extensionId = extension.id;\n\n if (!extensionId) {\n extensionId = Math.random()\n .toString(36)\n .substr(2, 5);\n\n log.warn(`Extension ID not set. Using random string ID: ${extensionId}`);\n }\n\n if (this.registeredExtensionIds.includes(extensionId)) {\n log.warn(\n `Extension ID ${extensionId} has already been registered. Exiting before duplicating modules.`\n );\n return;\n }\n\n // preRegistrationHook\n if (extension.preRegistration) {\n extension.preRegistration({\n servicesManager: this._servicesManager,\n commandsManager: this._commandsManager,\n appConfig: this._appConfig,\n configuration\n });\n }\n\n // Register Modules\n this.moduleTypeNames.forEach((moduleType) => {\n const extensionModule = this._getExtensionModule(\n moduleType,\n extension,\n extensionId,\n configuration\n );\n if (extensionModule) {\n this._initSpecialModuleTypes(moduleType, extensionModule);\n\n this.modules[moduleType].push({\n extensionId,\n module: extensionModule\n });\n }\n });\n\n // Track extension registration\n this.registeredExtensionIds.push(extensionId);\n }\n\n /**\n * @private\n * @param {string} moduleType\n * @param {Object} extension\n * @param {string} extensionId - Used for logging warnings\n */\n _getExtensionModule(moduleType, extension, extensionId, configuration) {\n const getModuleFnName = `get${_capitalizeFirstCharacter(moduleType)}`;\n const getModuleFn = extension[getModuleFnName];\n\n if (!getModuleFn) {\n return;\n }\n\n try {\n const extensionModule = getModuleFn({\n servicesManager: this._servicesManager,\n commandsManager: this._commandsManager,\n appConfig: this._appConfig,\n configuration\n });\n\n if (!extensionModule) {\n log.warn(\n `Null or undefined returned when registering the ${getModuleFnName} module for the ${extensionId} extension`\n );\n }\n\n return extensionModule;\n } catch (ex) {\n log.error(\n `Exception thrown while trying to call ${getModuleFnName} for the ${extensionId} extension`\n );\n }\n }\n\n _initSpecialModuleTypes(moduleType, extensionModule) {\n switch (moduleType) {\n case 'commandsModule': {\n const {definitions, defaultContext} = extensionModule;\n if (!definitions || Object.keys(definitions).length === 0) {\n log.warn('Commands Module contains no command definitions');\n return;\n }\n this._initCommandsModule(definitions, defaultContext);\n break;\n }\n default:\n // code block\n }\n }\n\n /**\n *\n * @private\n * @param {Object[]} commandDefinitions\n */\n _initCommandsModule(commandDefinitions, defaultContext = 'VIEWER') {\n if (!this._commandsManager.getContext(defaultContext)) {\n this._commandsManager.createContext(defaultContext);\n }\n\n Object.keys(commandDefinitions).forEach((commandName) => {\n const commandDefinition = commandDefinitions[commandName];\n const commandHasContextThatDoesNotExist =\n commandDefinition.context &&\n !this._commandsManager.getContext(commandDefinition.context);\n\n if (commandHasContextThatDoesNotExist) {\n this._commandsManager.createContext(commandDefinition.context);\n }\n\n this._commandsManager.registerCommand(\n commandDefinition.context || defaultContext,\n commandName,\n commandDefinition\n );\n });\n }\n}\n\n/**\n * @private\n * @param {string} lower\n */\nfunction _capitalizeFirstCharacter(lower) {\n return lower.charAt(0).toUpperCase() + lower.substr(1);\n}\n","import log from '../log';\n\nexport default class ServicesManager {\n constructor() {\n this.services = {};\n this.registeredServiceNames = [];\n }\n\n /**\n * Registers a new service.\n *\n * @param {Object} service\n * @param {Object} configuration\n */\n registerService(service, configuration = {}) {\n if (!service) {\n log.warn(\n 'Attempting to register a null/undefined service. Exiting early.'\n );\n return;\n }\n\n if (!service.name) {\n log.warn('Service name not set. Exiting early.');\n return;\n }\n\n if (this.registeredServiceNames.includes(service.name)) {\n log.warn(\n `Service name ${service.name} has already been registered. Exiting before duplicating services.`\n );\n return;\n }\n\n if (service.create) {\n this.services[service.name] = service.create({\n configuration\n });\n } else {\n log.warn('Service create factory function not defined. Exiting early.');\n return;\n }\n\n /* Track service registration */\n this.registeredServiceNames.push(service.name);\n }\n\n /**\n * An array of services, or an array of arrays that contains service\n * configuration pairs.\n *\n * @param {Object[]} services - Array of services\n */\n registerServices(services) {\n services.forEach((service) => {\n const hasConfiguration = Array.isArray(service);\n\n if (hasConfiguration) {\n const [ohifService, configuration] = service;\n this.registerService(ohifService, configuration);\n } else {\n this.registerService(service);\n }\n });\n }\n}\n","/**\n * A UI Notification\n *\n * @typedef {Object} Notification\n * @property {string} title -\n * @property {string} message -\n * @property {number} [duration=5000] - in ms\n * @property {string} [position=\"bottomRight\"] -\"topLeft\" | \"topCenter | \"topRight\" | \"bottomLeft\" | \"bottomCenter\" | \"bottomRight\"\n * @property {string} [type=\"info\"] - \"info\" | \"error\" | \"warning\" | \"success\"\n * @property {boolean} [autoClose=true]\n */\n\nconst name = 'UINotificationService';\n\nconst serviceShowRequestQueue = [];\n\nconst publicAPI = {\n name,\n hide: _hide,\n show: _show,\n setServiceImplementation\n};\n\nconst serviceImplementation = {\n _hide: () => console.warn('hide() NOT IMPLEMENTED'),\n _show: (showArguments) => {\n serviceShowRequestQueue.push(showArguments);\n\n console.warn('show() NOT IMPLEMENTED');\n }\n};\n\n/**\n * Create and show a new UI notification; returns the\n * ID of the created notification.\n *\n * @param {Notification} notification { title, message, duration, position, type, autoClose}\n * @returns {number} id\n */\nfunction _show({\n title,\n message,\n duration = 5000,\n position = 'bottomRight',\n type = 'info',\n autoClose = true\n}) {\n return serviceImplementation._show({\n title,\n message,\n duration,\n position,\n type,\n autoClose\n });\n}\n\n/**\n * Hides/dismisses the notification, if currently shown\n *\n * @param {number} id - id of the notification to hide/dismiss\n * @returns undefined\n */\nfunction _hide(id) {\n return serviceImplementation._hide({id});\n}\n\n/**\n *\n *\n * @param {*} {\n * hide: hideImplementation,\n * show: showImplementation,\n * }\n */\nfunction setServiceImplementation({\n hide: hideImplementation,\n show: showImplementation\n}) {\n if (hideImplementation) {\n serviceImplementation._hide = hideImplementation;\n }\n if (showImplementation) {\n serviceImplementation._show = showImplementation;\n\n while (serviceShowRequestQueue.length > 0) {\n const showArguments = serviceShowRequestQueue.pop();\n serviceImplementation._show(showArguments);\n }\n }\n}\n\nexport default {\n name,\n create: ({configuration = {}}) => publicAPI\n};\n","/**\n * UI Modal\n *\n * @typedef {Object} ModalProps\n * @property {ReactElement|HTMLElement} [content=null] Modal content.\n * @property {Object} [contentProps=null] Modal content props.\n * @property {boolean} [shouldCloseOnEsc=false] Modal is dismissible via the esc key.\n * @property {boolean} [isOpen=true] Make the Modal visible or hidden.\n * @property {boolean} [closeButton=true] Should the modal body render the close button.\n * @property {string} [title=null] Should the modal render the title independently of the body content.\n * @property {string} [customClassName=null] The custom class to style the modal.\n */\n\nconst name = 'UIModalService';\n\nconst publicAPI = {\n name,\n hide: _hide,\n show: _show,\n setServiceImplementation\n};\n\nconst serviceImplementation = {\n _hide: () => console.warn('hide() NOT IMPLEMENTED'),\n _show: () => console.warn('show() NOT IMPLEMENTED')\n};\n\n/**\n * Show a new UI modal;\n *\n * @param {ModalProps} props { content, contentProps, shouldCloseOnEsc, isOpen, closeButton, title, customClassName }\n */\nfunction _show({\n content = null,\n contentProps = null,\n shouldCloseOnEsc = false,\n isOpen = true,\n closeButton = true,\n title = null,\n customClassName = null\n}) {\n return serviceImplementation._show({\n content,\n contentProps,\n shouldCloseOnEsc,\n isOpen,\n closeButton,\n title,\n customClassName\n });\n}\n\n/**\n * Hides/dismisses the modal, if currently shown\n *\n * @returns void\n */\nfunction _hide() {\n return serviceImplementation._hide();\n}\n\n/**\n *\n *\n * @param {*} {\n * hide: hideImplementation,\n * show: showImplementation,\n * }\n */\nfunction setServiceImplementation({\n hide: hideImplementation,\n show: showImplementation\n}) {\n if (hideImplementation) {\n serviceImplementation._hide = hideImplementation;\n }\n if (showImplementation) {\n serviceImplementation._show = showImplementation;\n }\n}\n\nexport default {\n name,\n create: ({configuration = {}}) => publicAPI\n};\n","/**\n * A UI Element Position\n *\n * @typedef {Object} ElementPosition\n * @property {number} top -\n * @property {number} left -\n * @property {number} right -\n * @property {number} bottom -\n */\n\n/**\n * UI Dialog\n *\n * @typedef {Object} DialogProps\n * @property {string} id The dialog id.\n * @property {ReactElement|HTMLElement} content The dialog content.\n * @property {Object} contentProps The dialog content props.\n * @property {boolean} [isDraggable=true] Controls if dialog content is draggable or not.\n * @property {boolean} [showOverlay=false] Controls dialog overlay.\n * @property {boolean} [centralize=false] Center the dialog on the screen.\n * @property {boolean} [preservePosition=true] Use last position instead of default.\n * @property {ElementPosition} defaultPosition Specifies the `x` and `y` that the dragged item should start at.\n * @property {Function} onStart Called when dragging starts. If `false` is returned any handler, the action will cancel.\n * @property {Function} onStop Called when dragging stops.\n * @property {Function} onDrag Called while dragging.\n */\n\nconst name = 'UIDialogService';\n\nconst publicAPI = {\n name,\n dismiss: _dismiss,\n dismissAll: _dismissAll,\n create: _create,\n setServiceImplementation\n};\n\nconst serviceImplementation = {\n _dismiss: () => console.warn('dismiss() NOT IMPLEMENTED'),\n _dismissAll: () => console.warn('dismissAll() NOT IMPLEMENTED'),\n _create: () => console.warn('create() NOT IMPLEMENTED')\n};\n\n/**\n * Show a new UI dialog;\n *\n * @param {DialogProps} props { id, content, contentProps, onStart, onDrag, onStop, centralize, isDraggable, showOverlay, preservePosition, defaultPosition }\n */\nfunction _create({\n id,\n content,\n contentProps,\n onStart,\n onDrag,\n onStop,\n centralize = false,\n preservePosition = true,\n isDraggable = true,\n showOverlay = false,\n defaultPosition\n}) {\n return serviceImplementation._create({\n id,\n content,\n contentProps,\n onStart,\n onDrag,\n onStop,\n centralize,\n preservePosition,\n isDraggable,\n showOverlay,\n defaultPosition\n });\n}\n\n/**\n * Destroys all dialogs, if any\n *\n * @returns void\n */\nfunction _dismissAll() {\n return serviceImplementation._dismissAll();\n}\n\n/**\n * Destroy the dialog, if currently created\n *\n * @returns void\n */\nfunction _dismiss({id}) {\n return serviceImplementation._dismiss({id});\n}\n\n/**\n *\n *\n * @param {*} {\n * dismiss: dismissImplementation,\n * dismissAll: dismissAllImplementation,\n * create: createImplementation,\n * }\n */\nfunction setServiceImplementation({\n dismiss: dismissImplementation,\n dismissAll: dismissAllImplementation,\n create: createImplementation\n}) {\n if (dismissImplementation) {\n serviceImplementation._dismiss = dismissImplementation;\n }\n if (dismissAllImplementation) {\n serviceImplementation._dismissAll = dismissAllImplementation;\n }\n if (createImplementation) {\n serviceImplementation._create = createImplementation;\n }\n}\n\nexport default {\n name,\n create: ({configuration = {}}) => publicAPI\n};\n","/**\r\n * Create a random GUID\r\n *\r\n * @return {string}\r\n */\r\nconst guid = () => {\r\n const getFourRandomValues = () => {\r\n return Math.floor((1 + Math.random()) * 0x10000)\r\n .toString(16)\r\n .substring(1);\r\n };\r\n return (\r\n getFourRandomValues() +\r\n getFourRandomValues() +\r\n '-' +\r\n getFourRandomValues() +\r\n '-' +\r\n getFourRandomValues() +\r\n '-' +\r\n getFourRandomValues() +\r\n '-' +\r\n getFourRandomValues() +\r\n getFourRandomValues() +\r\n getFourRandomValues()\r\n );\r\n};\r\n\r\nexport default guid;\r\n","import log from '../../log';\nimport guid from '../../utils/guid';\n\n/**\n * Measurement source schema\n *\n * @typedef {Object} MeasurementSource\n * @property {number} id -\n * @property {string} name -\n * @property {string} version -\n */\n\n/**\n * Measurement schema\n *\n * @typedef {Object} Measurement\n * @property {number} id -\n * @property {string} sopInstanceUid -\n * @property {string} FrameOfReferenceUID -\n * @property {string} referenceSeriesUID -\n * @property {string} label -\n * @property {string} description -\n * @property {string} type -\n * @property {string} unit -\n * @property {number} area -\n * @property {Array} points -\n * @property {MeasurementSource} source -\n */\n\n/* Measurement schema keys for object validation. */\nconst MEASUREMENT_SCHEMA_KEYS = [\n 'id',\n 'SOPInstanceUID',\n 'FrameOfReferenceUID',\n 'referenceSeriesUID',\n 'label',\n 'description',\n 'type',\n 'unit',\n 'area', // TODO: Add concept names instead (descriptor)\n 'points',\n 'source'\n];\n\nconst EVENTS = {\n MEASUREMENT_UPDATED: 'event::measurement_updated',\n MEASUREMENT_ADDED: 'event::measurement_added'\n};\n\nconst VALUE_TYPES = {\n POLYLINE: 'value_type::polyline',\n POINT: 'value_type::point',\n ELLIPSE: 'value_type::ellipse',\n MULTIPOINT: 'value_type::multipoint',\n CIRCLE: 'value_type::circle'\n};\n\nclass MeasurementService {\n constructor() {\n this.sources = {};\n this.mappings = {};\n this.measurements = {};\n this.listeners = {};\n Object.defineProperty(this, 'EVENTS', {\n value: EVENTS,\n writable: false,\n enumerable: true,\n configurable: false\n });\n Object.defineProperty(this, 'VALUE_TYPES', {\n value: VALUE_TYPES,\n writable: false,\n enumerable: true,\n configurable: false\n });\n }\n\n /**\n * Get all measurements.\n *\n * @return {Measurement[]} Array of measurements\n */\n getMeasurements() {\n const measurements = this._arrayOfObjects(this.measurements);\n return (\n measurements &&\n measurements.map((m) => this.measurements[Object.keys(m)[0]])\n );\n }\n\n /**\n * Get specific measurement by its id.\n *\n * @param {string} id If of the measurement\n * @return {Measurement} Measurement instance\n */\n getMeasurement(id) {\n let measurement = null;\n const measurements = this.measurements[id];\n\n if (measurements && Object.keys(measurements).length > 0) {\n measurement = this.measurements[id];\n }\n\n return measurement;\n }\n\n /**\n * Create a new source.\n *\n * @param {string} name Name of the source\n * @param {string} version Source name\n * @return {MeasurementSource} Measurement source instance\n */\n createSource(name, version) {\n if (!name) {\n log.warn('Source name not provided. Exiting early.');\n return;\n }\n\n if (!version) {\n log.warn('Source version not provided. Exiting early.');\n return;\n }\n\n const id = guid();\n const source = {\n id,\n name,\n version\n };\n source.addOrUpdate = (definition, measurement) => this.addOrUpdate(source, definition, measurement);\n source.getAnnotation = (definition, measurementId) => this.getAnnotation(source, definition, measurementId);\n\n log.info(`New '${name}@${version}' source added.`);\n this.sources[id] = source;\n\n return source;\n }\n\n /**\n * Add a new measurement matching criteria along with mapping functions.\n *\n * @param {MeasurementSource} source Measurement source instance\n * @param {string} definition Definition of the measurement (Annotation Type)\n * @param {MatchingCriteria} matchingCriteria The matching criteria\n * @param {Function} toSourceSchema Mapping function to source schema\n * @param {Function} toMeasurementSchema Mapping function to measurement schema\n * @return void\n */\n addMapping(\n source,\n definition,\n matchingCriteria,\n toSourceSchema,\n toMeasurementSchema\n ) {\n if (!this._isValidSource(source)) {\n log.warn('Invalid source. Exiting early.');\n return;\n }\n\n if (!matchingCriteria) {\n log.warn('Matching criteria not provided. Exiting early.');\n return;\n }\n\n if (!definition) {\n log.warn('Definition not provided. Exiting early.');\n return;\n }\n\n if (!toSourceSchema) {\n log.warn('Source mapping function not provided. Exiting early.');\n return;\n }\n\n if (!toMeasurementSchema) {\n log.warn('Measurement mapping function not provided. Exiting early.');\n return;\n }\n\n const mapping = {\n matchingCriteria,\n definition,\n toSourceSchema,\n toMeasurementSchema\n };\n\n if (Array.isArray(this.mappings[source.id])) {\n this.mappings[source.id].push(mapping);\n } else {\n this.mappings[source.id] = [mapping];\n }\n\n log.info(\n `New measurement mapping added to source '${this._getSourceInfo(\n source\n )}'.`\n );\n }\n\n /**\n * Get annotation for specific source.\n *\n * @param {MeasurementSource} source Measurement source instance\n * @param {string} definition The source definition\n * @param {string} measurementId The measurement service measurement id\n * @return {Object} Source measurement schema\n */\n getAnnotation(source, definition, measurementId) {\n if (!this._isValidSource(source)) {\n log.warn('Invalid source. Exiting early.');\n return;\n }\n\n if (!definition) {\n log.warn('No source definition provided. Exiting early.');\n return;\n }\n\n const mapping = this._getMappingByMeasurementSource(\n measurementId,\n definition\n );\n if (mapping) return mapping.toSourceSchema(measurement, definition);\n\n const measurement = this.getMeasurement(measurementId);\n const matchingMapping = this._getMatchingMapping(\n source,\n definition,\n measurement\n );\n\n if (matchingMapping) {\n log.info('Matching mapping found:', matchingMapping);\n const {toSourceSchema, definition} = matchingMapping;\n return toSourceSchema(measurement, definition);\n }\n }\n\n /**\n * Adds or update persisted measurements.\n *\n * @param {MeasurementSource} source The measurement source instance\n * @param {string} definition The source definition\n * @param {Measurement} measurement The source measurement\n * @return {string} A measurement id\n */\n addOrUpdate(source, definition, sourceMeasurement) {\n if (!this._isValidSource(source)) {\n log.warn('Invalid source. Exiting early.');\n return;\n }\n\n const sourceInfo = this._getSourceInfo(source);\n\n if (!definition) {\n console.log('TEST');\n log.warn('No source definition provided. Exiting early.');\n return;\n }\n\n if (!this._sourceHasMappings(source)) {\n log.warn(\n `No measurement mappings found for '${sourceInfo}' source. Exiting early.`\n );\n return;\n }\n\n let measurement = {};\n try {\n const sourceMappings = this.mappings[source.id];\n const {toMeasurementSchema} = sourceMappings.find(\n (mapping) => mapping.definition === definition\n );\n\n /* Convert measurement */\n measurement = toMeasurementSchema(sourceMeasurement);\n\n /* Assign measurement source instance */\n measurement.source = source;\n } catch (error) {\n log.warn(\n `Failed to map '${sourceInfo}' measurement for definition ${definition}:`,\n error.message\n );\n return;\n }\n\n if (!this._isValidMeasurement(measurement)) {\n log.warn(\n `Attempting to add or update a invalid measurement provided by '${sourceInfo}'. Exiting early.`\n );\n return;\n }\n\n let internalId = sourceMeasurement.id;\n if (!internalId) {\n internalId = guid();\n log.warn(`Measurement ID not found. Generating UID: ${internalId}`);\n }\n\n const newMeasurement = {\n ...measurement,\n modifiedTimestamp: Math.floor(Date.now() / 1000),\n id: internalId\n };\n\n if (this.measurements[internalId]) {\n log.info(\n 'Measurement already defined. Updating measurement.',\n newMeasurement\n );\n this.measurements[internalId] = newMeasurement;\n this._broadcastChange(\n this.EVENTS.MEASUREMENT_UPDATED,\n source,\n newMeasurement\n );\n } else {\n log.info('Measurement added.', newMeasurement);\n this.measurements[internalId] = newMeasurement;\n this._broadcastChange(\n this.EVENTS.MEASUREMENT_ADDED,\n source,\n newMeasurement\n );\n }\n\n return newMeasurement.id;\n }\n\n /**\n * Subscribe to measurement updates.\n *\n * @param {string} eventName The name of the event\n * @param {Function} callback Events callback\n * @return {Object} Observable object with actions\n */\n subscribe(eventName, callback) {\n if (this._isValidEvent(eventName)) {\n const listenerId = guid();\n const subscription = {id: listenerId, callback};\n\n console.info(`Subscribing to '${eventName}'.`);\n if (Array.isArray(this.listeners[eventName])) {\n this.listeners[eventName].push(subscription);\n } else {\n this.listeners[eventName] = [subscription];\n }\n\n return {\n unsubscribe: () => this._unsubscribe(eventName, listenerId)\n };\n }\n throw new Error(`Event ${eventName} not supported.`);\n }\n\n _getMappingByMeasurementSource(measurementId, definition) {\n const measurement = this.getMeasurement(measurementId);\n if (this._isValidSource(measurement.source)) {\n return this.mappings[measurement.source.id].find(\n (m) => m.definition === definition\n );\n }\n }\n\n /**\n * Get measurement mapping function if matching criteria.\n *\n * @param {MeasurementSource} source Measurement source instance\n * @param {string} definition The source definition\n * @param {string} measurement The measurement serice measurement\n * @return {Object} The mapping based on matched criteria\n */\n _getMatchingMapping(source, definition, measurement) {\n const sourceMappings = this.mappings[source.id];\n\n const sourceMappingsByDefinition = sourceMappings.filter(\n (mapping) => mapping.definition === definition\n );\n\n /* Criteria Matching */\n return sourceMappingsByDefinition.find(({matchingCriteria}) => (\n measurement.points &&\n measurement.points.length === matchingCriteria.points\n ));\n }\n\n /**\n * Returns formatted string with source info.\n *\n * @param {MeasurementSource} source Measurement source\n * @return {string} Source information\n */\n _getSourceInfo(source) {\n return `${source.name}@${source.version}`;\n }\n\n /**\n * Checks if given source is valid.\n *\n * @param {MeasurementSource} source Measurement source\n * @return {boolean} Measurement source validation\n */\n _isValidSource(source) {\n return source && this.sources[source.id];\n }\n\n /**\n * Checks if a given source has mappings.\n *\n * @param {MeasurementSource} source The measurement source\n * @return {boolean} Validation if source has mappings\n */\n _sourceHasMappings(source) {\n return (\n Array.isArray(this.mappings[source.id]) && this.mappings[source.id].length\n );\n }\n\n /**\n * Broadcasts measurement changes.\n *\n * @param {string} measurementId The measurement id\n * @param {MeasurementSource} source The measurement source\n * @param {string} eventName The event name\n * @return void\n */\n _broadcastChange(eventName, source, measurement) {\n const hasListeners = Object.keys(this.listeners).length > 0;\n const hasCallbacks = Array.isArray(this.listeners[eventName]);\n\n if (hasListeners && hasCallbacks) {\n this.listeners[eventName].forEach((listener) => {\n listener.callback({source, measurement});\n });\n }\n }\n\n /**\n * Unsubscribe to measurement updates.\n *\n * @param {string} eventName The name of the event\n * @param {string} listenerId The listeners id\n * @return void\n */\n _unsubscribe(eventName, listenerId) {\n if (!this.listeners[eventName]) {\n return;\n }\n\n const listeners = this.listeners[eventName];\n if (Array.isArray(listeners)) {\n this.listeners[eventName] = listeners.filter(\n ({id}) => id !== listenerId\n );\n } else {\n this.listeners[eventName] = undefined;\n }\n }\n\n /**\n * Check if a given measurement data is valid.\n *\n * @param {Measurement} measurementData Measurement data\n * @return {boolean} Measurement validation\n */\n _isValidMeasurement(measurementData) {\n Object.keys(measurementData).forEach((key) => {\n if (!MEASUREMENT_SCHEMA_KEYS.includes(key)) {\n log.warn(`Invalid measurement key: ${key}`);\n return false;\n }\n });\n\n return true;\n }\n\n /**\n * Check if a given measurement service event is valid.\n *\n * @param {string} eventName The name of the event\n * @return {boolean} Event name validation\n */\n _isValidEvent(eventName) {\n return Object.values(this.EVENTS).includes(eventName);\n }\n\n /**\n * Converts object of objects to array.\n *\n * @return {Array} Array of objects\n */\n _arrayOfObjects = (obj) => Object.entries(obj).map((e) => ({[e[0]]: e[1]}));\n}\n\nexport default MeasurementService;\nexport {EVENTS, VALUE_TYPES};\n","/**\r\n * adds a pause and unpause method to Mousetrap\r\n * this allows you to enable or disable keyboard shortcuts\r\n * without having to reset Mousetrap and rebind everything\r\n *\r\n * https://github.com/ccampbell/mousetrap/blob/master/plugins/pause/mousetrap-pause.js\r\n */\r\nexport default function (Mousetrap) {\r\n const _originalStopCallback = Mousetrap.prototype.stopCallback;\r\n\r\n Mousetrap.prototype.stopCallback = function (e, element, combo) {\r\n const self = this;\r\n\r\n if (self.paused) {\r\n return true;\r\n }\r\n\r\n return _originalStopCallback.call(self, e, element, combo);\r\n };\r\n\r\n Mousetrap.prototype.pause = function () {\r\n const self = this;\r\n self.paused = true;\r\n };\r\n\r\n Mousetrap.prototype.unpause = function () {\r\n const self = this;\r\n self.paused = false;\r\n };\r\n\r\n Mousetrap.init();\r\n}\r\n","import MeasurementService from './MeasurementService';\n\nexport default {\n name: 'MeasurementService',\n create: ({configuration = {}}) => new MeasurementService()\n};\n","import log from '../log.js';\n\n/**\n * The definition of a command\n *\n * @typedef {Object} CommandDefinition\n * @property {Function} commandFn - Command to call\n * @property {Array} storeContexts - Array of string of modules required from store\n * @property {Object} options - Object of params to pass action\n */\n\n/**\n * The Commands Manager tracks named commands (or functions) that are scoped to\n * a context. When we attempt to run a command with a given name, we look for it\n * in our active contexts. If found, we run the command, passing in any application\n * or call specific data specified in the command's definition.\n *\n * NOTE: A more robust version of the CommandsManager lives in v1. If you're looking\n * to extend this class, please check it's source before adding new methods.\n */\nexport class CommandsManager {\n constructor({ getAppState, getActiveContexts } = {}) {\n this.contexts = {};\n\n if (!getAppState || !getActiveContexts) {\n log.warn('CommandsManager was instantiated without getAppState() or getActiveContexts()');\n }\n\n this._getAppState = getAppState;\n this._getActiveContexts = getActiveContexts;\n }\n\n /**\n * Allows us to create commands \"per context\". An example would be the \"Cornerstone\"\n * context having a `SaveImage` command, and the \"VTK\" context having a `SaveImage`\n * command. The distinction of a context allows us to call the command in either\n * context, and have faith that the correct command will be run.\n *\n * @method\n * @param {string} contextName - Namespace for commands\n * @returns {undefined}\n */\n createContext(contextName) {\n if (!contextName) {\n return;\n }\n\n if (this.contexts[contextName]) {\n return this.clearContext(contextName);\n }\n\n this.contexts[contextName] = {};\n }\n\n /**\n * Returns all command definitions for a given context\n *\n * @method\n * @param {string} contextName - Namespace for commands\n * @returns {Object} - the matched context\n */\n getContext(contextName) {\n const context = this.contexts[contextName];\n\n if (!context) {\n return;\n }\n\n return context;\n }\n\n /**\n * Clears all registered commands for a given context.\n *\n * @param {string} contextName - Namespace for commands\n * @returns {undefined}\n */\n clearContext(contextName) {\n if (!contextName) {\n return;\n }\n\n this.contexts[contextName] = {};\n }\n\n /**\n * Register a new command with the command manager. Scoped to a context, and\n * with a definition to assist command callers w/ providing the necessary params\n *\n * @method\n * @param {string} contextName - Namespace for command; often scoped to the extension that added it\n * @param {string} commandName - Unique name identifying the command\n * @param {CommandDefinition} definition - {@link CommandDefinition}\n */\n registerCommand(contextName, commandName, definition) {\n if (typeof definition !== 'object') {\n return;\n }\n\n const context = this.getContext(contextName);\n if (!context) {\n return;\n }\n\n context[commandName] = definition;\n }\n\n /**\n * Finds a command with the provided name if it exists in the specified context,\n * or a currently active context.\n *\n * @method\n * @param {String} commandName - Command to find\n * @param {String} [contextName] - Specific command to look in. Defaults to current activeContexts\n */\n getCommand(commandName, contextName) {\n let contexts = [];\n\n if (contextName) {\n const context = this.getContext(contextName);\n if (context) {\n contexts.push(context);\n }\n } else {\n const activeContexts = this._getActiveContexts();\n activeContexts.forEach((activeContext) => {\n const context = this.getContext(activeContext);\n if (context) {\n contexts.push(context);\n }\n });\n }\n\n if (contexts.length === 0) {\n return;\n }\n\n let foundCommand;\n contexts.forEach((context) => {\n if (context[commandName]) {\n foundCommand = context[commandName];\n }\n });\n\n return foundCommand;\n }\n\n /**\n *\n * @method\n * @param {String} commandName\n * @param {Object} [options={}] - Extra options to pass the command. Like a mousedown event\n * @param {String} [contextName]\n */\n runCommand(commandName, options = {}, contextName) {\n const definition = this.getCommand(commandName, contextName);\n if (!definition) {\n log.warn(`Command \"${commandName}\" not found in current context`);\n return;\n }\n\n const { commandFn, storeContexts = [] } = definition;\n const definitionOptions = definition.options;\n\n let commandParams = {};\n const appState = this._getAppState();\n storeContexts.forEach((context) => {\n commandParams[context] = appState[context];\n });\n\n commandParams = Object.assign(\n {},\n commandParams, // Required store contexts\n definitionOptions, // \"Command configuration\"\n options // \"Time of call\" info\n );\n\n if (typeof commandFn !== 'function') {\n log.warn(`No commandFn was defined for command \"${commandName}\"`);\n return;\n } \n return commandFn(commandParams);\n \n }\n}\n\nexport default CommandsManager;\n","/**\r\n * This extension allows you to record a sequence using Mousetrap.\r\n * {@link https://craig.is/killing/mice}\r\n *\r\n * @author Dan Tao \r\n */\r\nexport default function (Mousetrap) {\r\n /**\r\n * the sequence currently being recorded\r\n *\r\n * @type {Array}\r\n */\r\n let _recordedSequence = [],\r\n /**\r\n * a callback to invoke after recording a sequence\r\n *\r\n * @type {Function|null}\r\n */\r\n _recordedSequenceCallback = null,\r\n /**\r\n * a list of all of the keys currently held down\r\n *\r\n * @type {Array}\r\n */\r\n _currentRecordedKeys = [],\r\n /**\r\n * temporary state where we remember if we've already captured a\r\n * character key in the current combo\r\n *\r\n * @type {boolean}\r\n */\r\n _recordedCharacterKey = false,\r\n /**\r\n * a handle for the timer of the current recording\r\n *\r\n * @type {null|number}\r\n */\r\n _recordTimer = null;\r\n const /**\r\n * the original handleKey method to override when Mousetrap.record() is\r\n * called\r\n *\r\n * @type {Function}\r\n */\r\n _origHandleKey = Mousetrap.prototype.handleKey;\r\n\r\n /**\r\n * handles a character key event\r\n *\r\n * @param {string} character\r\n * @param {Array} modifiers\r\n * @param {Event} e\r\n * @returns void\r\n */\r\n function _handleKey(character, modifiers, e) {\r\n const self = this;\r\n\r\n if (!self.recording) {\r\n _origHandleKey.apply(self, arguments);\r\n return;\r\n }\r\n\r\n // remember this character if we're currently recording a sequence\r\n if (e.type === 'keydown') {\r\n if (character.length === 1 && _recordedCharacterKey) {\r\n _recordCurrentCombo();\r\n }\r\n\r\n for (let i = 0; i < modifiers.length; ++i) {\r\n _recordKey(modifiers[i]);\r\n }\r\n _recordKey(character);\r\n\r\n // once a key is released, all keys that were held down at the time\r\n // count as a keypress\r\n } else if (e.type === 'keyup' && _currentRecordedKeys.length > 0) {\r\n _recordCurrentCombo();\r\n }\r\n }\r\n\r\n /**\r\n * marks a character key as held down while recording a sequence\r\n *\r\n * @param {string} key\r\n * @returns void\r\n */\r\n function _recordKey(key) {\r\n // one-off implementation of Array.indexOf, since IE6-9 don't support it\r\n for (let i = 0; i < _currentRecordedKeys.length; ++i) {\r\n if (_currentRecordedKeys[i] === key) {\r\n return;\r\n }\r\n }\r\n\r\n _currentRecordedKeys.push(key);\r\n\r\n if (key.length === 1) {\r\n _recordedCharacterKey = true;\r\n }\r\n }\r\n\r\n /**\r\n * marks whatever key combination that's been recorded so far as finished\r\n * and gets ready for the next combo\r\n *\r\n * @returns void\r\n */\r\n function _recordCurrentCombo() {\r\n _recordedSequence.push(_currentRecordedKeys);\r\n _currentRecordedKeys = [];\r\n _recordedCharacterKey = false;\r\n _finishRecording();\r\n }\r\n\r\n /**\r\n * ensures each combo in a sequence is in a predictable order and formats\r\n * key combos to be '+'-delimited\r\n *\r\n * modifies the sequence in-place\r\n *\r\n * @param {Array} sequence\r\n * @returns void\r\n */\r\n function _normalizeSequence(sequence) {\r\n for (let i = 0; i < sequence.length; ++i) {\r\n sequence[i].sort(function (x, y) {\r\n // modifier keys always come first, in alphabetical order\r\n if (x.length > 1 && y.length === 1) {\r\n return -1;\r\n } else if (x.length === 1 && y.length > 1) {\r\n return 1;\r\n }\r\n\r\n // character keys come next (list should contain no duplicates,\r\n // so no need for equality check)\r\n return x > y ? 1 : -1;\r\n });\r\n\r\n sequence[i] = sequence[i].join('+');\r\n }\r\n }\r\n\r\n /**\r\n * finishes the current recording, passes the recorded sequence to the stored\r\n * callback, and sets Mousetrap.handleKey back to its original function\r\n *\r\n * @returns void\r\n */\r\n function _finishRecording() {\r\n if (_recordedSequenceCallback) {\r\n _normalizeSequence(_recordedSequence);\r\n _recordedSequenceCallback(_recordedSequence);\r\n }\r\n\r\n // reset all recorded state\r\n _recordedSequence = [];\r\n _recordedSequenceCallback = null;\r\n _currentRecordedKeys = [];\r\n }\r\n\r\n /**\r\n * called to set a 1 second timeout on the current recording\r\n *\r\n * this is so after each key press in the sequence the recording will wait for\r\n * 1 more second before executing the callback\r\n *\r\n * @returns void\r\n */\r\n function _restartRecordTimer() {\r\n clearTimeout(_recordTimer);\r\n _recordTimer = setTimeout(_finishRecording, 1000);\r\n }\r\n\r\n /**\r\n * records the next sequence and passes it to a callback once it's\r\n * completed\r\n *\r\n * @param {Function} callback\r\n * @returns void\r\n */\r\n Mousetrap.prototype.record = function (callback) {\r\n const self = this;\r\n self.recording = true;\r\n _recordedSequenceCallback = function () {\r\n self.recording = false;\r\n callback.apply(self, arguments);\r\n };\r\n };\r\n\r\n /**\r\n * stop recording\r\n *\r\n * @param {Function} callback\r\n * @returns void\r\n */\r\n Mousetrap.prototype.stopRecord = function () {\r\n const self = this;\r\n self.recording = false;\r\n };\r\n\r\n /**\r\n * start recording\r\n *\r\n * @param {Function} callback\r\n * @returns void\r\n */\r\n Mousetrap.prototype.startRecording = function () {\r\n const self = this;\r\n self.recording = true;\r\n };\r\n\r\n Mousetrap.prototype.handleKey = function () {\r\n const self = this;\r\n _handleKey.apply(self, arguments);\r\n };\r\n\r\n Mousetrap.init();\r\n}\r\n","import Mousetrap from 'mousetrap';\r\nimport pausePlugin from './pausePlugin';\r\nimport recordPlugin from './recordPlugin';\r\n\r\nrecordPlugin(Mousetrap);\r\npausePlugin(Mousetrap);\r\n\r\nexport default Mousetrap;\r\n","import hotkeys from './../utils/hotkeys';\nimport log from './../log.js';\n\n/**\n *\n *\n * @typedef {Object} HotkeyDefinition\n * @property {String} commandName - Command to call\n * @property {String} label - Display name for hotkey\n * @property {String[]} keys - Keys to bind; Follows Mousetrap.js binding syntax\n */\n\nexport class HotkeysManager {\n constructor(commandsManager, servicesManager) {\n this.hotkeyDefinitions = {};\n this.hotkeyDefaults = [];\n this.isEnabled = true;\n\n if (!commandsManager) {\n log.warn(\n 'HotkeysManager instantiated without a commandsManager. Hotkeys will be unable to find and run commands.'\n );\n }\n\n this._servicesManager = servicesManager;\n this._commandsManager = commandsManager;\n }\n\n /**\n * Exposes Mousetrap.js's `.record` method, added by the record plugin.\n *\n * @param {*} event\n */\n record(event) {\n return hotkeys.record(event);\n }\n\n /**\n * Disables all hotkeys. Hotkeys added while disabled will not listen for\n * input.\n */\n disable() {\n this.isEnabled = false;\n hotkeys.pause();\n }\n\n /**\n * Enables all hotkeys.\n */\n enable() {\n this.isEnabled = true;\n hotkeys.unpause();\n }\n\n /**\n * Registers a list of hotkeydefinitions.\n *\n * @param {HotkeyDefinition[] | Object} [hotkeyDefinitions=[]] Contains hotkeys definitions\n */\n setHotkeys(hotkeyDefinitions = []) {\n try {\n const definitions = this._getValidDefinitions(hotkeyDefinitions);\n\n definitions.forEach((definition) => this.registerHotkeys(definition));\n } catch (error) {\n const {UINotificationService} = this._servicesManager.services;\n UINotificationService.show({\n title: 'Hotkeys Manager',\n message: 'Erro while setting hotkeys',\n type: 'error'\n });\n }\n }\n\n /**\n * Set default hotkey bindings. These\n * values are used in `this.restoreDefaultBindings`.\n *\n * @param {HotkeyDefinition[] | Object} [hotkeyDefinitions=[]] Contains hotkeys definitions\n */\n setDefaultHotKeys(hotkeyDefinitions = []) {\n const definitions = this._getValidDefinitions(hotkeyDefinitions);\n\n this.hotkeyDefaults = definitions;\n }\n\n /**\n * Take hotkey definitions that can be an array or object and make sure that it\n * returns an array of hotkeys\n *\n * @param {HotkeyDefinition[] | Object} [hotkeyDefinitions=[]] Contains hotkeys definitions\n */\n _getValidDefinitions(hotkeyDefinitions) {\n const definitions = Array.isArray(hotkeyDefinitions)\n ? [...hotkeyDefinitions]\n : this._parseToArrayLike(hotkeyDefinitions);\n\n return definitions;\n }\n\n /**\n * It parses given object containing hotkeyDefinition to array like.\n * Each property of given object will be mapped to an object of an array. And its property name will be the value of a property named as commandName\n *\n * @param {HotkeyDefinition[] | Object} [hotkeyDefinitions={}] Contains hotkeys definitions\n * @returns {HotkeyDefinition[]}\n */\n _parseToArrayLike(hotkeyDefinitionsObj = {}) {\n const copy = {...hotkeyDefinitionsObj};\n return Object.entries(copy).map((entryValue) =>\n this._parseToHotKeyObj(entryValue[0], entryValue[1])\n );\n }\n\n /**\n * Return HotkeyDefinition object like based on given property name and property value\n * @param {string} propertyName property name of hotkey definition object\n * @param {object} propertyValue property value of hotkey definition object\n *\n * @example\n *\n * const hotKeyObj = {hotKeyDefA: {keys:[],....}}\n *\n * const parsed = _parseToHotKeyObj(Object.keys(hotKeyDefA)[0], hotKeyObj[hotKeyDefA]);\n * {\n * commandName: hotKeyDefA,\n * keys: [],\n * ....\n * }\n *\n */\n _parseToHotKeyObj(propertyName, propertyValue) {\n return {\n commandName: propertyName,\n ...propertyValue\n };\n }\n\n /**\n * (unbinds and) binds the specified command to one or more key combinations.\n * When a hotkey combination is triggered, the command name and active contexts\n * are used to locate the correct command to call.\n *\n * @param {HotkeyDefinition} commandName\n * @param {String} extension\n * @returns {undefined}\n */\n registerHotkeys({commandName, keys, label} = {}) {\n if (!commandName) {\n log.warn(`No command was defined for hotkey \"${keys}\"`);\n return;\n }\n\n const previouslyRegisteredDefinition = this.hotkeyDefinitions[commandName];\n\n if (previouslyRegisteredDefinition) {\n const previouslyRegisteredKeys = previouslyRegisteredDefinition.keys;\n this._unbindHotkeys(commandName, previouslyRegisteredKeys);\n log.info(`Unbinding ${commandName} from ${previouslyRegisteredKeys}`);\n }\n\n // Set definition & bind\n this.hotkeyDefinitions[commandName] = {keys, label};\n this._bindHotkeys(commandName, keys);\n log.info(`Binding ${commandName} to ${keys}`);\n }\n\n /**\n * Uses most recent\n *\n * @returns {undefined}\n */\n restoreDefaultBindings() {\n this.setHotkeys(this.hotkeyDefaults);\n }\n\n /**\n *\n */\n destroy() {\n this.hotkeyDefaults = [];\n this.hotkeyDefinitions = {};\n hotkeys.reset();\n }\n\n /**\n * Binds one or more set of hotkey combinations for a given command\n *\n * @private\n * @param {string} commandName - The name of the command to trigger when hotkeys are used\n * @param {string[]} keys - One or more key combinations that should trigger command\n * @returns {undefined}\n */\n _bindHotkeys(commandName, keys) {\n const isKeyDefined = keys === '' || keys === undefined;\n if (isKeyDefined) {\n return;\n }\n\n const isKeyArray = keys instanceof Array;\n // const combinedKeys = isKeyArray ? keys.join('+') : keys;\n // hotkeys.bind(combinedKeys, evt => {\n // evt.preventDefault();\n // evt.stopPropagation();\n // this._commandsManager.runCommand(commandName, { evt });\n // });\n\n // TungLT fix for bind multi key with single command\n const combinedKeys = isKeyArray ? keys : [keys];\n combinedKeys.forEach((combinedKey) => hotkeys.bind(combinedKey, (evt) => {\n evt.preventDefault();\n evt.stopPropagation();\n this._commandsManager.runCommand(commandName, {evt});\n }));\n }\n\n /**\n * unbinds one or more set of hotkey combinations for a given command\n *\n * @private\n * @param {string} commandName - The name of the previously bound command\n * @param {string[]} keys - One or more sets of previously bound keys\n * @returns {undefined}\n */\n _unbindHotkeys(commandName, keys) {\n const isKeyDefined = keys !== '' && keys !== undefined;\n if (!isKeyDefined) {\n return;\n }\n\n const isKeyArray = keys instanceof Array;\n const combinedKeys = isKeyArray ? keys : [keys];\n combinedKeys.forEach((combinedKey) => hotkeys.unbind(combinedKey));\n\n // if (isKeyArray) {\n // const combinedKeys = keys.join('+');\n // this._unbindHotkeys(commandName, combinedKeys);\n // return;\n // }\n //\n // hotkeys.unbind(keys);\n }\n}\n\nexport default HotkeysManager;\n\n// Commands Contexts:\n\n// --> Name and Priority\n// GLOBAL: 0\n// VIEWER::CORNERSTONE: 1\n// VIEWER::VTK: 1\n","// These should be overridden by the implementation\nconst user = {\n userLoggedIn: () => false,\n getUserId: () => null,\n getName: () => null,\n getAccessToken: () => null,\n login: () => new Promise((resolve, reject) => reject()),\n logout: () => new Promise((resolve, reject) => reject()),\n getData: (key) => null,\n setData: (key, value) => null\n};\n\nexport default user;\n","import getAttribute from './getAttribute';\nimport getAuthorizationHeader from './getAuthorizationHeader';\nimport getModalities from './getModalities';\nimport getName from './getName';\nimport getNumber from './getNumber';\nimport getString from './getString';\n\nconst DICOMWeb = {\n getAttribute,\n getAuthorizationHeader,\n getModalities,\n getName,\n getNumber,\n getString\n};\n\nexport default DICOMWeb;\n","/**\n * Returns the specified element as a dicom attribute group/element.\n *\n * @param element - The group/element of the element (e.g. '00280009')\n * @param [defaultValue] - The value to return if the element is not present\n * @returns {*}\n */\nexport default function getAttribute(element, defaultValue) {\n if (!element) {\n return defaultValue;\n }\n // Value is not present if the attribute has a zero length value\n if (!element.Value) {\n return defaultValue;\n }\n // Sanity check to make sure we have at least one entry in the array.\n if (!element.Value.length) {\n return defaultValue;\n }\n\n return convertToInt(element.Value);\n}\n\nfunction convertToInt(input) {\n function padFour(input) {\n const l = input.length;\n\n if (l == 0) return '0000';\n if (l == 1) return `000${input}`;\n if (l == 2) return `00${input}`;\n if (l == 3) return `0${input}`;\n\n return input;\n }\n\n let output = '';\n for (let i = 0; i < input.length; i++) {\n for (let j = 0; j < input[i].length; j++) {\n output += padFour(input[i].charCodeAt(j).toString(16));\n }\n }\n\n return parseInt(output, 16);\n}\n","// Commenting this out for now since it looks like Rollup is pulling in the\n// Node.js version instead of the Browser version of this package\n// import { btoa } from 'isomorphic-base64';\nimport user from '../user';\n\n/**\n * Returns the Authorization header as part of an Object.\n *\n * @export\n * @param {Object} [server={}]\n * @param {Object} [server.requestOptions]\n * @param {string|function} [server.requestOptions.auth]\n * @returns {Object} { Authorization }\n */\nexport default function getAuthorizationHeader({requestOptions} = {}) {\n const headers = {};\n\n // Check for OHIF.user since this can also be run on the server\n const accessToken = user && user.getAccessToken && user.getAccessToken();\n\n if (requestOptions && requestOptions.auth) {\n if (typeof requestOptions.auth === 'function') {\n // Custom Auth Header\n headers.Authorization = requestOptions.auth(requestOptions);\n } else {\n // HTTP Basic Auth (user:password)\n headers.Authorization = `Basic ${btoa(requestOptions.auth)}`;\n }\n } else if (accessToken) {\n headers.Authorization = accessToken;\n }\n\n return headers;\n}\n","export default function getModalities(Modality, ModalitiesInStudy) {\n if (!Modality && !ModalitiesInStudy) {\n return {};\n }\n\n const modalities = Modality || {\n vr: 'CS',\n Value: []\n };\n\n if (ModalitiesInStudy) {\n if (modalities.vr && modalities.vr === ModalitiesInStudy.vr) {\n for (let i = 0; i < ModalitiesInStudy.Value.length; i++) {\n const value = ModalitiesInStudy.Value[i];\n if (modalities.Value.indexOf(value) === -1) {\n modalities.Value.push(value);\n }\n }\n } else {\n return ModalitiesInStudy;\n }\n }\n\n return modalities;\n}\n","/**\n * Returns the Alphabetic version of a PN\n *\n * @param element - The group/element of the element (e.g. '00200013')\n * @param [defaultValue] - The default value to return if the element is not found\n * @returns {*}\n */\nexport default function getName(element, defaultValue) {\n if (!element) {\n return defaultValue;\n }\n // Value is not present if the attribute has a zero length value\n if (!element.Value) {\n return defaultValue;\n }\n // Sanity check to make sure we have at least one entry in the array.\n if (!element.Value.length) {\n return defaultValue;\n }\n // Return the Alphabetic component group\n if (element.Value[0].Alphabetic) {\n return element.Value[0].Alphabetic;\n }\n // Orthanc does not return PN properly so this is a temporary workaround\n return element.Value[0];\n}\n","/**\n * Returns the first string value as a Javascript Number\n * @param element - The group/element of the element (e.g. '00200013')\n * @param [defaultValue] - The default value to return if the element does not exist\n * @returns {*}\n */\nexport default function getNumber(element, defaultValue) {\n if (!element) {\n return defaultValue;\n }\n // Value is not present if the attribute has a zero length value\n if (!element.Value) {\n return defaultValue;\n }\n // Sanity check to make sure we have at least one entry in the array.\n if (!element.Value.length) {\n return defaultValue;\n }\n\n return parseFloat(element.Value[0]);\n}\n","/**\n * Returns the specified element as a string. Multi-valued elements will be separated by a backslash\n *\n * @param element - The group/element of the element (e.g. '00200013')\n * @param [defaultValue] - The value to return if the element is not present\n * @returns {*}\n */\nexport default function getString(element, defaultValue) {\n if (!element) {\n return defaultValue;\n }\n // Value is not present if the attribute has a zero length value\n if (!element.Value) {\n return defaultValue;\n }\n // Sanity check to make sure we have at least one entry in the array.\n if (!element.Value.length) {\n return defaultValue;\n }\n // Join the array together separated by backslash\n // NOTE: Orthanc does not correctly split values into an array so the join is a no-op\n return element.Value.join('\\\\');\n}\n","// @TODO: improve this object\n/**\n * Objects to be used to throw errors\n */\nclass OHIFError extends Error {\n constructor(message) {\n super();\n this.message = message;\n this.stack = new Error().stack;\n this.name = this.constructor.name;\n }\n}\n\nexport default OHIFError;\n","import guid from '../utils/guid.js';\r\nimport OHIFError from './OHIFError';\r\nimport {Vector3} from 'cornerstone-math';\r\n\r\nconst OBJECT = 'object';\r\n\r\n/**\r\n * This class defines an ImageSet object which will be used across the viewer. This object represents\r\n * a list of images that are associated by any arbitrary criteria being thus content agnostic. Besides the\r\n * main attributes (images and uid) it allows additional attributes to be appended to it (currently\r\n * indiscriminately, but this should be changed).\r\n */\r\nclass ImageSet {\r\n constructor(images) {\r\n if (Array.isArray(images) !== true) {\r\n throw new OHIFError('ImageSet expects an array of images');\r\n }\r\n\r\n // @property \"images\"\r\n Object.defineProperty(this, 'images', {\r\n enumerable: false,\r\n configurable: false,\r\n writable: false,\r\n value: images\r\n });\r\n\r\n // @property \"uid\"\r\n Object.defineProperty(this, 'uid', {\r\n enumerable: false,\r\n configurable: false,\r\n writable: false,\r\n value: guid() // Unique ID of the instance\r\n });\r\n }\r\n\r\n getUID() {\r\n return this.uid;\r\n }\r\n\r\n setAttribute(attribute, value) {\r\n this[attribute] = value;\r\n }\r\n\r\n getAttribute(attribute) {\r\n return this[attribute];\r\n }\r\n\r\n setAttributes(attributes) {\r\n if (typeof attributes === OBJECT && attributes !== null) {\r\n const imageSet = this;\r\n for (let attribute in attributes) {\r\n if (Object.prototype.hasOwnProperty.call(attributes, attribute)) {\r\n imageSet[attribute] = attributes[attribute];\r\n }\r\n }\r\n }\r\n }\r\n\r\n getImage(index) {\r\n return this.images[index];\r\n }\r\n\r\n sortBy(sortingCallback) {\r\n return this.images.sort(sortingCallback);\r\n }\r\n\r\n sortByImagePositionPatient() {\r\n const images = this.images;\r\n const referenceImagePositionPatient = _getImagePositionPatient(images[0]);\r\n\r\n const refIppVec = new Vector3(\r\n referenceImagePositionPatient[0],\r\n referenceImagePositionPatient[1],\r\n referenceImagePositionPatient[2]\r\n );\r\n\r\n const ImageOrientationPatient = _getImageOrientationPatient(images[0]);\r\n\r\n const scanAxisNormal = new Vector3(\r\n ImageOrientationPatient[0],\r\n ImageOrientationPatient[1],\r\n ImageOrientationPatient[2]\r\n ).cross(\r\n new Vector3(\r\n ImageOrientationPatient[3],\r\n ImageOrientationPatient[4],\r\n ImageOrientationPatient[5]\r\n )\r\n );\r\n\r\n const distanceImagePairs = images.map(function (image) {\r\n const ippVec = new Vector3(..._getImagePositionPatient(image));\r\n const positionVector = refIppVec.clone().sub(ippVec);\r\n const distance = positionVector.dot(scanAxisNormal);\r\n\r\n return {\r\n distance,\r\n image\r\n };\r\n });\r\n\r\n distanceImagePairs.sort(function (a, b) {\r\n return b.distance - a.distance;\r\n });\r\n\r\n const sortedImages = distanceImagePairs.map((a) => a.image);\r\n\r\n images.sort(function (a, b) {\r\n return sortedImages.indexOf(a) - sortedImages.indexOf(b);\r\n });\r\n }\r\n}\r\n\r\nfunction _getImagePositionPatient(image) {\r\n return image.getData().metadata.ImagePositionPatient;\r\n}\r\n\r\nfunction _getImageOrientationPatient(image) {\r\n return image.getData().metadata.ImageOrientationPatient;\r\n}\r\n\r\nexport default ImageSet;\r\n","/**\r\n * Constants\r\n */\r\n\r\nconst STRING = 'string';\r\nconst NUMBER = 'number';\r\nconst FUNCTION = 'function';\r\nconst OBJECT = 'object';\r\n\r\n/**\r\n * Class Definition\r\n */\r\n\r\nexport class Metadata {\r\n /**\r\n * Constructor and Instance Methods\r\n */\r\n\r\n constructor(data, uid) {\r\n // Define the main \"_data\" private property as an immutable property.\r\n // IMPORTANT: This property can only be set during instance construction.\r\n Object.defineProperty(this, '_data', {\r\n configurable: false,\r\n enumerable: false,\r\n writable: false,\r\n value: data\r\n });\r\n\r\n // Define the main \"_uid\" private property as an immutable property.\r\n // IMPORTANT: This property can only be set during instance construction.\r\n Object.defineProperty(this, '_uid', {\r\n configurable: false,\r\n enumerable: false,\r\n writable: false,\r\n value: uid\r\n });\r\n\r\n // Define \"_custom\" properties as an immutable property.\r\n // IMPORTANT: This property can only be set during instance construction.\r\n Object.defineProperty(this, '_custom', {\r\n configurable: false,\r\n enumerable: false,\r\n writable: false,\r\n value: Object.create(null)\r\n });\r\n }\r\n\r\n getData() {\r\n return this._data;\r\n }\r\n\r\n getDataProperty(propertyName) {\r\n let propertyValue;\r\n const _data = this._data;\r\n if (\r\n _data instanceof Object ||\r\n (typeof _data === OBJECT && _data !== null)\r\n ) {\r\n propertyValue = _data[propertyName];\r\n }\r\n return propertyValue;\r\n }\r\n\r\n /**\r\n * Get unique object ID\r\n */\r\n getObjectID() {\r\n return this._uid;\r\n }\r\n\r\n /**\r\n * Set custom attribute value\r\n * @param {String} attribute Custom attribute name\r\n * @param {Any} value Custom attribute value\r\n */\r\n setCustomAttribute(attribute, value) {\r\n this._custom[attribute] = value;\r\n }\r\n\r\n /**\r\n * Get custom attribute value\r\n * @param {String} attribute Custom attribute name\r\n * @return {Any} Custom attribute value\r\n */\r\n getCustomAttribute(attribute) {\r\n return this._custom[attribute];\r\n }\r\n\r\n /**\r\n * Check if a custom attribute exists\r\n * @param {String} attribute Custom attribute name\r\n * @return {Boolean} True if custom attribute exists or false if not\r\n */\r\n customAttributeExists(attribute) {\r\n return attribute in this._custom;\r\n }\r\n\r\n /**\r\n * Set custom attributes in batch mode.\r\n * @param {Object} attributeMap An object whose own properties will be used as custom attributes.\r\n */\r\n setCustomAttributes(attributeMap) {\r\n const _hasOwn = Object.prototype.hasOwnProperty;\r\n const _custom = this._custom;\r\n for (let attribute in attributeMap) {\r\n if (_hasOwn.call(attributeMap, attribute)) {\r\n _custom[attribute] = attributeMap[attribute];\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Static Methods\r\n */\r\n\r\n static isValidUID(uid) {\r\n return typeof uid === STRING && uid.length > 0;\r\n }\r\n\r\n static isValidIndex(index) {\r\n return typeof index === NUMBER && index >= 0 && (index | 0) === index;\r\n }\r\n\r\n static isValidCallback(callback) {\r\n return typeof callback === FUNCTION;\r\n }\r\n}\r\n","import { Metadata } from './Metadata';\r\nimport OHIFError from '../OHIFError.js';\r\n\r\n/**\r\n * ATTENTION! This class should never depend on StudyMetadata or SeriesMetadata classes as this could\r\n * possibly cause circular dependency issues.\r\n */\r\n\r\nconst UNDEFINED = 'undefined';\r\nconst STRING = 'string';\r\n\r\nexport class InstanceMetadata extends Metadata {\r\n constructor(data, uid) {\r\n super(data, uid);\r\n // Initialize Private Properties\r\n Object.defineProperties(this, {\r\n _imageId: {\r\n configurable: true, // configurable so that it can be redefined in sub-classes...\r\n enumerable: false,\r\n writable: true,\r\n value: null\r\n }\r\n });\r\n // Initialize Public Properties\r\n this._definePublicProperties();\r\n }\r\n\r\n /**\r\n * Private Methods\r\n */\r\n\r\n /**\r\n * Define Public Properties\r\n * This method should only be called during initialization (inside the class constructor)\r\n */\r\n _definePublicProperties() {\r\n /**\r\n * Property: this.SOPInstanceUID\r\n * Same as this.getSOPInstanceUID()\r\n * It's specially useful in contexts where a method call is not suitable like in search criteria. For example:\r\n * sopInstanceCollection.findBy({\r\n * SOPInstanceUID: '1.2.3.4.5.6.77777.8888888.99999999999.0'\r\n * });\r\n */\r\n Object.defineProperty(this, 'SOPInstanceUID', {\r\n configurable: false,\r\n enumerable: false,\r\n get: function () {\r\n return this.getSOPInstanceUID();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Public Methods\r\n */\r\n\r\n /**\r\n * Returns the StudyInstanceUID of the current instance. This method is basically a shorthand the full \"getTagValue\" method call.\r\n */\r\n getStudyInstanceUID() {\r\n return this.getTagValue('StudyInstanceUID', null);\r\n }\r\n\r\n /**\r\n * Returns the SeriesInstanceUID of the current instance. This method is basically a shorthand the full \"getTagValue\" method call.\r\n */\r\n getSeriesInstanceUID() {\r\n return this.getTagValue('SeriesInstanceUID', null);\r\n }\r\n\r\n /**\r\n * Returns the SOPInstanceUID of the current instance.\r\n */\r\n getSOPInstanceUID() {\r\n return this.getTagValue('SOPInstanceUID', null);\r\n }\r\n\r\n // @TODO: Improve this... (E.g.: blob data)\r\n getStringValue(tagOrProperty, index, defaultValue) {\r\n let value = this.getTagValue(tagOrProperty, defaultValue);\r\n\r\n if (typeof value !== STRING && typeof value !== UNDEFINED) {\r\n value = value.toString();\r\n }\r\n\r\n return InstanceMetadata.getIndexedValue(value, index, defaultValue);\r\n }\r\n\r\n // @TODO: Improve this... (E.g.: blob data)\r\n getFloatValue(tagOrProperty, index, defaultValue) {\r\n let value = this.getTagValue(tagOrProperty, defaultValue);\r\n value = InstanceMetadata.getIndexedValue(value, index, defaultValue);\r\n\r\n if (value instanceof Array) {\r\n value.forEach((val, idx) => {\r\n value[idx] = parseFloat(val);\r\n });\r\n\r\n return value;\r\n }\r\n\r\n return typeof value === STRING ? parseFloat(value) : value;\r\n }\r\n\r\n // @TODO: Improve this... (E.g.: blob data)\r\n getIntValue(tagOrProperty, index, defaultValue) {\r\n let value = this.getTagValue(tagOrProperty, defaultValue);\r\n value = InstanceMetadata.getIndexedValue(value, index, defaultValue);\r\n\r\n if (value instanceof Array) {\r\n value.forEach((val, idx) => {\r\n value[idx] = parseFloat(val);\r\n });\r\n\r\n return value;\r\n }\r\n\r\n return typeof value === STRING ? parseInt(value) : value;\r\n }\r\n\r\n /**\r\n * This function should be overriden by specialized classes in order to allow client libraries or viewers to take advantage of the Study Metadata API.\r\n */\r\n getTagValue(tagOrProperty, defaultValue) {\r\n /**\r\n * Please override this method on a specialized class.\r\n */\r\n throw new OHIFError(\r\n 'InstanceMetadata::getTagValue is not overriden. Please, override it in a specialized class. See OHIFInstanceMetadata for example'\r\n );\r\n }\r\n\r\n /**\r\n * Compares the current instance with another one.\r\n * @param {InstanceMetadata} instance An instance of the InstanceMetadata class.\r\n * @returns {boolean} Returns true if both instances refer to the same instance.\r\n */\r\n equals(instance) {\r\n const self = this;\r\n return instance === self || (instance instanceof InstanceMetadata && instance.getSOPInstanceUID() === self.getSOPInstanceUID());\r\n }\r\n\r\n /**\r\n * Check if the tagOrProperty exists\r\n * @param {String} tagOrProperty tag or property be checked\r\n * @return {Boolean} True if the tag or property exists or false if doesn't\r\n */\r\n tagExists(tagOrProperty) {\r\n /**\r\n * Please override this method\r\n */\r\n throw new OHIFError(\r\n 'InstanceMetadata::tagExists is not overriden. Please, override it in a specialized class. See OHIFInstanceMetadata for example'\r\n );\r\n }\r\n\r\n /**\r\n * Get custom image id of a sop instance\r\n * @return {Any} sop instance image id\r\n */\r\n getImageId(frame) {\r\n /**\r\n * Please override this method\r\n */\r\n throw new OHIFError(\r\n 'InstanceMetadata::getImageId is not overriden. Please, override it in a specialized class. See OHIFInstanceMetadata for example'\r\n );\r\n }\r\n\r\n /**\r\n * Static Methods\r\n */\r\n\r\n /**\r\n * Get an value based that can be index based. This function is called by all getters. See above functions.\r\n * - If value is a String and has indexes:\r\n * - If undefined index: returns an array of the split values.\r\n * - If defined index:\r\n * - If invalid: returns defaultValue\r\n * - If valid: returns the indexed value\r\n * - If value is not a String, returns default value.\r\n */\r\n static getIndexedValue(value, index, defaultValue) {\r\n let result = defaultValue;\r\n\r\n if (typeof value === STRING) {\r\n const hasIndexValues = value.indexOf('\\\\') !== -1;\r\n\r\n result = value;\r\n\r\n if (hasIndexValues) {\r\n const splitValues = value.split('\\\\');\r\n if (Metadata.isValidIndex(index)) {\r\n const indexedValue = splitValues[index];\r\n\r\n result = typeof indexedValue !== STRING ? defaultValue : indexedValue;\r\n } else {\r\n result = splitValues;\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n","import { Metadata } from './Metadata';\r\nimport { InstanceMetadata } from './InstanceMetadata';\r\n\r\nexport class SeriesMetadata extends Metadata {\r\n constructor(data, uid) {\r\n super(data, uid);\r\n // Initialize Private Properties\r\n Object.defineProperties(this, {\r\n _seriesInstanceUID: {\r\n configurable: true, // configurable so that it can be redefined in sub-classes...\r\n enumerable: false,\r\n writable: true,\r\n value: null\r\n },\r\n _instances: {\r\n configurable: false,\r\n enumerable: false,\r\n writable: false,\r\n value: []\r\n },\r\n _firstInstance: {\r\n configurable: false,\r\n enumerable: false,\r\n writable: true,\r\n value: null\r\n }\r\n });\r\n // Initialize Public Properties\r\n this._definePublicProperties();\r\n }\r\n\r\n /**\r\n * Private Methods\r\n */\r\n\r\n /**\r\n * Define Public Properties\r\n * This method should only be called during initialization (inside the class constructor)\r\n */\r\n _definePublicProperties() {\r\n /**\r\n * Property: this.seriesInstanceUID\r\n * Same as this.getSeriesInstanceUID()\r\n * It's specially useful in contexts where a method call is not suitable like in search criteria. For example:\r\n * seriesCollection.findBy({\r\n * seriesInstanceUID: '1.2.3.4.5.6.77777.8888888.99999999999.0'\r\n * });\r\n */\r\n Object.defineProperty(this, 'seriesInstanceUID', {\r\n configurable: false,\r\n enumerable: false,\r\n get: function () {\r\n return this.getSeriesInstanceUID();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Public Methods\r\n */\r\n\r\n /**\r\n * Returns the SeriesInstanceUID of the current series.\r\n */\r\n getSeriesInstanceUID() {\r\n return this._seriesInstanceUID;\r\n }\r\n\r\n /**\r\n * Append an instance to the current series.\r\n * @param {InstanceMetadata} instance The instance to be added to the current series.\r\n * @returns {boolean} Returns true on success, false otherwise.\r\n */\r\n addInstance(instance) {\r\n let result = false;\r\n if (instance instanceof InstanceMetadata && this.getInstanceByUID(instance.getSOPInstanceUID()) === void 0) {\r\n this._instances.push(instance);\r\n result = true;\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Get the first instance of the current series retaining a consistent result across multiple calls.\r\n * @return {InstanceMetadata} An instance of the InstanceMetadata class or null if it does not exist.\r\n */\r\n getFirstInstance() {\r\n let instance = this._firstInstance;\r\n if (!(instance instanceof InstanceMetadata)) {\r\n instance = null;\r\n const found = this.getInstanceByIndex(0);\r\n if (found instanceof InstanceMetadata) {\r\n this._firstInstance = found;\r\n instance = found;\r\n }\r\n }\r\n return instance;\r\n }\r\n\r\n /**\r\n * Find an instance by index.\r\n * @param {number} index An integer representing a list index.\r\n * @returns {InstanceMetadata} Returns a InstanceMetadata instance when found or undefined otherwise.\r\n */\r\n getInstanceByIndex(index) {\r\n let found; // undefined by default...\r\n if (Metadata.isValidIndex(index)) {\r\n found = this._instances[index];\r\n }\r\n return found;\r\n }\r\n\r\n /**\r\n * Find an instance by SOPInstanceUID.\r\n * @param {string} uid An UID string.\r\n * @returns {InstanceMetadata} Returns a InstanceMetadata instance when found or undefined otherwise.\r\n */\r\n getInstanceByUID(uid) {\r\n let found; // undefined by default...\r\n if (Metadata.isValidUID(uid)) {\r\n found = this._instances.find((instance) => {\r\n return instance.getSOPInstanceUID() === uid;\r\n });\r\n }\r\n return found;\r\n }\r\n\r\n /**\r\n * Retrieve the number of instances within the current series.\r\n * @returns {number} The number of instances in the current series.\r\n */\r\n getInstanceCount() {\r\n return this._instances.length;\r\n }\r\n\r\n /**\r\n * Invokes the supplied callback for each instance in the current series passing\r\n * two arguments: instance (an InstanceMetadata instance) and index (the integer\r\n * index of the instance within the current series)\r\n * @param {function} callback The callback function which will be invoked for each instance in the series.\r\n * @returns {undefined} Nothing is returned.\r\n */\r\n forEachInstance(callback) {\r\n if (Metadata.isValidCallback(callback)) {\r\n this._instances.forEach((instance, index) => {\r\n callback.call(null, instance, index);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Find the index of an instance inside the series.\r\n * @param {InstanceMetadata} instance An instance of the SeriesMetadata class.\r\n * @returns {number} The index of the instance inside the series or -1 if not found.\r\n */\r\n indexOfInstance(instance) {\r\n return this._instances.indexOf(instance);\r\n }\r\n\r\n /**\r\n * Search the associated instances using the supplied callback as criteria. The callback is passed\r\n * two arguments: instance (a InstanceMetadata instance) and index (the integer\r\n * index of the instance within its series)\r\n * @param {function} callback The callback function which will be invoked for each instance.\r\n * @returns {InstanceMetadata|undefined} If an instance is found based on callback criteria it\r\n * returns a InstanceMetadata. \"undefined\" is returned otherwise\r\n */\r\n findInstance(callback) {\r\n if (Metadata.isValidCallback(callback)) {\r\n return this._instances.find((instance, index) => {\r\n return callback.call(null, instance, index);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Compares the current series with another one.\r\n * @param {SeriesMetadata} series An instance of the SeriesMetadata class.\r\n * @returns {boolean} Returns true if both instances refer to the same series.\r\n */\r\n equals(series) {\r\n const self = this;\r\n return series === self || (series instanceof SeriesMetadata && series.getSeriesInstanceUID() === self.getSeriesInstanceUID());\r\n }\r\n}\r\n","function _typeof(obj) {\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\n/**\n * Converts a Uint8Array to a String.\n * @param {Uint8Array} array that should be converted\n * @param {Number} offset array offset in case only subset of array items should\n be extracted (default: 0)\n * @param {Number} limit maximum number of array items that should be extracted\n (defaults to length of array)\n * @returns {String}\n */\nfunction uint8ArrayToString(arr) {\n var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var limit = arguments.length > 2 ? arguments[2] : undefined;\n var itemLimit = limit || arr.length - offset;\n var str = \"\";\n\n for (var i = offset; i < offset + itemLimit; i++) {\n str += String.fromCharCode(arr[i]);\n }\n\n return str;\n}\n/**\n * Converts a String to a Uint8Array.\n * @param {String} str string that should be converted\n * @returns {Uint8Array}\n */\n\n\nfunction stringToUint8Array(str) {\n var arr = new Uint8Array(str.length);\n\n for (var i = 0, j = str.length; i < j; i++) {\n arr[i] = str.charCodeAt(i);\n }\n\n return arr;\n}\n/**\n * Identifies the boundary in a multipart/related message header.\n * @param {String} header message header\n * @returns {String} boundary\n */\n\n\nfunction identifyBoundary(header) {\n var parts = header.split(\"\\r\\n\");\n\n for (var i = 0; i < parts.length; i++) {\n if (parts[i].substr(0, 2) === \"--\") {\n return parts[i];\n }\n }\n\n return null;\n}\n/**\n * Checks whether a given token is contained by a message at a given offset.\n * @param {Uint8Array} message message content\n * @param {Uint8Array} token substring that should be present\n * @param {Number} offset offset in message content from where search should start\n * @returns {Boolean} whether message contains token at offset\n */\n\n\nfunction containsToken(message, token) {\n var offset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n\n if (offset + token.length > message.length) {\n return false;\n }\n\n var index = offset;\n\n for (var i = 0; i < token.length; i++) {\n if (token[i] !== message[index]) {\n return false;\n }\n\n index += 1;\n }\n\n return true;\n}\n/**\n * Finds a given token in a message at a given offset.\n * @param {Uint8Array} message message content\n * @param {Uint8Array} token substring that should be found\n * @param {String} offset message body offset from where search should start\n * @returns {Boolean} whether message has a part at given offset or not\n */\n\n\nfunction findToken(message, token) {\n var offset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n var maxSearchLength = arguments.length > 3 ? arguments[3] : undefined;\n var searchLength = message.length;\n\n if (maxSearchLength) {\n searchLength = Math.min(offset + maxSearchLength, message.length);\n }\n\n for (var i = offset; i < searchLength; i++) {\n // If the first value of the message matches\n // the first value of the token, check if\n // this is the full token.\n if (message[i] === token[0]) {\n if (containsToken(message, token, i)) {\n return i;\n }\n }\n }\n\n return -1;\n}\n/**\n * Create a random GUID\n *\n * @return {string}\n */\n\n\nfunction guid() {\n function s4() {\n return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);\n }\n\n return \"\".concat(s4() + s4(), \"-\").concat(s4(), \"-\").concat(s4(), \"-\").concat(s4(), \"-\").concat(s4()).concat(s4()).concat(s4());\n}\n/**\n * @typedef {Object} MultipartEncodedData\n * @property {ArrayBuffer} data The encoded Multipart Data\n * @property {String} boundary The boundary used to divide pieces of the encoded data\n */\n\n/**\n * Encode one or more DICOM datasets into a single body so it can be\n * sent using the Multipart Content-Type.\n *\n * @param {ArrayBuffer[]} datasets Array containing each file to be encoded in the\n multipart body, passed as ArrayBuffers.\n * @param {String} [boundary] Optional string to define a boundary between each part\n of the multipart body. If this is not specified, a random\n GUID will be generated.\n * @return {MultipartEncodedData} The Multipart encoded data returned as an Object. This\n contains both the data itself, and the boundary string\n used to divide it.\n */\n\n\nfunction multipartEncode(datasets) {\n var boundary = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : guid();\n var contentType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"application/dicom\";\n var contentTypeString = \"Content-Type: \".concat(contentType);\n var header = \"\\r\\n--\".concat(boundary, \"\\r\\n\").concat(contentTypeString, \"\\r\\n\\r\\n\");\n var footer = \"\\r\\n--\".concat(boundary, \"--\");\n var headerArray = stringToUint8Array(header);\n var footerArray = stringToUint8Array(footer);\n var headerLength = headerArray.length;\n var footerLength = footerArray.length;\n var length = 0; // Calculate the total length for the final array\n\n var contentArrays = datasets.map(function (datasetBuffer) {\n var contentArray = new Uint8Array(datasetBuffer);\n var contentLength = contentArray.length;\n length += headerLength + contentLength + footerLength;\n return contentArray;\n }); // Allocate the array\n\n var multipartArray = new Uint8Array(length); // Set the initial header\n\n multipartArray.set(headerArray, 0); // Write each dataset into the multipart array\n\n var position = 0;\n contentArrays.forEach(function (contentArray) {\n multipartArray.set(headerArray, position);\n multipartArray.set(contentArray, position + headerLength);\n position += headerLength + contentArray.length;\n });\n multipartArray.set(footerArray, position);\n return {\n data: multipartArray.buffer,\n boundary: boundary\n };\n}\n/**\n * Decode a Multipart encoded ArrayBuffer and return the components as an Array.\n *\n * @param {ArrayBuffer} response Data encoded as a 'multipart/related' message\n * @returns {Array} The content\n */\n\n\nfunction multipartDecode(response) {\n var message = new Uint8Array(response);\n /* Set a maximum length to search for the header boundaries, otherwise\n findToken can run for a long time\n */\n\n var maxSearchLength = 1000; // First look for the multipart mime header\n\n var separator = stringToUint8Array(\"\\r\\n\\r\\n\");\n var headerIndex = findToken(message, separator, 0, maxSearchLength);\n\n if (headerIndex === -1) {\n throw new Error(\"Response message has no multipart mime header\");\n }\n\n var header = uint8ArrayToString(message, 0, headerIndex);\n var boundaryString = identifyBoundary(header);\n\n if (!boundaryString) {\n throw new Error(\"Header of response message does not specify boundary\");\n }\n\n var boundary = stringToUint8Array(boundaryString);\n var boundaryLength = boundary.length;\n var components = [];\n var offset = boundaryLength; // Loop until we cannot find any more boundaries\n\n var boundaryIndex;\n\n while (boundaryIndex !== -1) {\n // Search for the next boundary in the message, starting\n // from the current offset position\n boundaryIndex = findToken(message, boundary, offset); // If no further boundaries are found, stop here.\n\n if (boundaryIndex === -1) {\n break;\n }\n\n var headerTokenIndex = findToken(message, separator, offset, maxSearchLength);\n\n if (headerTokenIndex === -1) {\n throw new Error(\"Response message part has no mime header\");\n }\n\n offset = headerTokenIndex + separator.length; // Extract data from response message, excluding \"\\r\\n\"\n\n var spacingLength = 2;\n var data = response.slice(offset, boundaryIndex - spacingLength); // Add the data to the array of results\n\n components.push(data); // Move the offset to the end of the current section,\n // plus the identified boundary\n\n offset = boundaryIndex + boundaryLength;\n }\n\n return components;\n}\n\nfunction isObject(obj) {\n return _typeof(obj) === \"object\" && obj !== null;\n}\n\nfunction isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && obj.constructor === Object;\n}\n\nvar getFirstResult = function getFirstResult(result) {\n return result[0];\n};\n\nvar getFirstResultIfLengthGtOne = function getFirstResultIfLengthGtOne(result) {\n if (result.length > 1) {\n return result;\n }\n\n return result[0];\n};\n\nvar MEDIATYPES = {\n DICOM: \"application/dicom\",\n DICOM_JSON: \"application/dicom+json\",\n OCTET_STREAM: \"application/octet-stream\",\n PDF: \"application/pdf\",\n JPEG: \"image/jpeg\",\n PNG: \"image/png\"\n};\n/**\n * Class for interacting with DICOMweb RESTful services.\n */\n\nvar DICOMwebClient =\n/*#__PURE__*/\nfunction () {\n /**\n * @constructor\n * @param {Object} options (choices: \"url\", \"username\", \"password\", \"headers\")\n */\n function DICOMwebClient(options) {\n _classCallCheck(this, DICOMwebClient);\n\n this.baseURL = options.url;\n\n if (!this.baseURL) {\n console.error(\"no DICOMweb base url provided - calls will fail\");\n }\n\n if (\"username\" in options) {\n this.username = options.username;\n\n if (!(\"password\" in options)) {\n console.error(\"no password provided to authenticate with DICOMweb service\");\n }\n\n this.password = options.password;\n }\n\n if (\"qidoURLPrefix\" in options) {\n console.log(\"use URL prefix for QIDO-RS: \".concat(options.qidoURLPrefix));\n this.qidoURL = \"\".concat(this.baseURL, \"/\").concat(options.qidoURLPrefix);\n } else {\n this.qidoURL = this.baseURL;\n }\n\n if (\"wadoURLPrefix\" in options) {\n console.log(\"use URL prefix for WADO-RS: \".concat(options.wadoURLPrefix));\n this.wadoURL = \"\".concat(this.baseURL, \"/\").concat(options.wadoURLPrefix);\n } else {\n this.wadoURL = this.baseURL;\n }\n\n if (\"stowURLPrefix\" in options) {\n console.log(\"use URL prefix for STOW-RS: \".concat(options.stowURLPrefix));\n this.stowURL = \"\".concat(this.baseURL, \"/\").concat(options.stowURLPrefix);\n } else {\n this.stowURL = this.baseURL;\n }\n\n this.headers = options.headers || {};\n }\n\n _createClass(DICOMwebClient, [{\n key: \"_httpRequest\",\n value: function _httpRequest(url, method, headers) {\n var _this = this;\n\n var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n return new Promise(function (resolve, reject) {\n var request = new XMLHttpRequest();\n request.open(method, url, true);\n\n if (\"responseType\" in options) {\n request.responseType = options.responseType;\n }\n\n if (_typeof(headers) === \"object\") {\n Object.keys(headers).forEach(function (key) {\n request.setRequestHeader(key, headers[key]);\n });\n } // now add custom headers from the user\n // (e.g. access tokens)\n\n\n var userHeaders = _this.headers;\n Object.keys(userHeaders).forEach(function (key) {\n request.setRequestHeader(key, userHeaders[key]);\n }); // Event triggered when upload starts\n\n request.onloadstart = function onloadstart() {// console.log('upload started: ', url)\n }; // Event triggered when upload ends\n\n\n request.onloadend = function onloadend() {// console.log('upload finished')\n }; // Handle response message\n\n\n request.onreadystatechange = function onreadystatechange() {\n if (request.readyState === 4) {\n if (request.status === 200) {\n resolve(request.response);\n } else if (request.status === 202) {\n console.warn(\"some resources already existed: \", request);\n resolve(request.response);\n } else if (request.status === 204) {\n console.warn(\"empty response for request: \", request);\n resolve([]);\n } else {\n console.error(\"request failed: \", request);\n var error = new Error(\"request failed\");\n error.request = request;\n error.response = request.response;\n error.status = request.status;\n console.error(error);\n console.error(error.response);\n reject(error);\n }\n }\n }; // Event triggered while download progresses\n\n\n if (\"progressCallback\" in options) {\n if (typeof options.progressCallback === \"function\") {\n request.onprogress = options.progressCallback;\n }\n } // request.onprogress = function (event) {\n // const loaded = progress.loaded;\n // let total;\n // let percentComplete;\n // if (progress.lengthComputable) {\n // total = progress.total;\n // percentComplete = Math.round((loaded / total) * 100);\n // j\n // // console.log('download progress: ', percentComplete, ' %');\n // return(percentComplete);\n // };\n\n\n if (\"data\" in options) {\n request.send(options.data);\n } else {\n request.send();\n }\n });\n }\n }, {\n key: \"_httpGet\",\n value: function _httpGet(url, headers, responseType, progressCallback) {\n return this._httpRequest(url, \"get\", headers, {\n responseType: responseType,\n progressCallback: progressCallback\n });\n }\n }, {\n key: \"_httpGetApplicationJson\",\n value: function _httpGetApplicationJson(url) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var progressCallback = arguments.length > 2 ? arguments[2] : undefined;\n var urlWithQueryParams = url;\n\n if (_typeof(params) === \"object\") {\n if (!isEmptyObject(params)) {\n urlWithQueryParams += DICOMwebClient._parseQueryParameters(params);\n }\n }\n\n var headers = {\n Accept: MEDIATYPES.DICOM_JSON\n };\n var responseType = \"json\";\n return this._httpGet(urlWithQueryParams, headers, responseType, progressCallback);\n }\n /**\n * Performs an HTTP GET request that accepts a message with\n \"application/pdf\" media type.\n * @param {String} url\n * @param {Object[]} mediaTypes\n * @param {Object} params\n * @param {Function} progressCallback\n * @return {*}\n * @private\n */\n\n }, {\n key: \"_httpGetApplicationPdf\",\n value: function _httpGetApplicationPdf(url) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var progressCallback = arguments.length > 2 ? arguments[2] : undefined;\n var urlWithQueryParams = url;\n\n if (_typeof(params) === \"object\") {\n if (!isEmptyObject(params)) {\n urlWithQueryParams += DICOMwebClient._parseQueryParameters(params);\n }\n }\n\n var headers = {\n Accept: MEDIATYPES.PDF\n };\n var responseType = \"json\";\n return this._httpGet(urlWithQueryParams, headers, responseType, progressCallback);\n }\n /**\n * Performs an HTTP GET request that accepts a message with an image\n media type.\n *\n * @param {String} url\n * @param {Object[]} mediaTypes\n * @param {Object} params\n * @param {Function} progressCallback\n * @return {*}\n * @private\n */\n\n }, {\n key: \"_httpGetImage\",\n value: function _httpGetImage(url, mediaTypes) {\n var params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var progressCallback = arguments.length > 3 ? arguments[3] : undefined;\n var urlWithQueryParams = url;\n\n if (_typeof(params) === \"object\") {\n if (!isEmptyObject(params)) {\n urlWithQueryParams += DICOMwebClient._parseQueryParameters(params);\n }\n }\n\n var supportedMediaTypes = [\"image/\", \"image/*\", \"image/jpeg\", \"image/jp2\", \"image/gif\", \"image/png\"];\n\n var acceptHeaderFieldValue = DICOMwebClient._buildAcceptHeaderFieldValue(mediaTypes, supportedMediaTypes);\n\n var headers = {\n Accept: acceptHeaderFieldValue\n };\n var responseType = \"arraybuffer\";\n return this._httpGet(urlWithQueryParams, headers, responseType, progressCallback);\n }\n /**\n * Performs an HTTP GET request that accepts a message with a text\n media type.\n *\n * @param {String} url\n * @param {Object[]} mediaTypes\n * @param {Object} params\n * @param {Function} progressCallback\n * @return {*}\n * @private\n */\n\n }, {\n key: \"_httpGetText\",\n value: function _httpGetText(url, mediaTypes) {\n var params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var progressCallback = arguments.length > 3 ? arguments[3] : undefined;\n var urlWithQueryParams = url;\n\n if (_typeof(params) === \"object\") {\n if (!isEmptyObject(params)) {\n urlWithQueryParams += DICOMwebClient._parseQueryParameters(params);\n }\n }\n\n var supportedMediaTypes = [\"text/\", \"text/*\", \"text/html\", \"text/plain\", \"text/rtf\", \"text/xml\"];\n\n var acceptHeaderFieldValue = DICOMwebClient._buildAcceptHeaderFieldValue(mediaTypes, supportedMediaTypes);\n\n var headers = {\n Accept: acceptHeaderFieldValue\n };\n var responseType = \"arraybuffer\";\n return this._httpGet(urlWithQueryParams, headers, responseType, progressCallback);\n }\n /**\n * Performs an HTTP GET request that accepts a message with a video\n media type.\n *\n * @param {String} url\n * @param {Object[]} mediaTypes\n * @param {Object} params\n * @param {Function} progressCallback\n * @return {*}\n * @private\n */\n\n }, {\n key: \"_httpGetVideo\",\n value: function _httpGetVideo(url, mediaTypes) {\n var params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var progressCallback = arguments.length > 3 ? arguments[3] : undefined;\n var urlWithQueryParams = url;\n\n if (_typeof(params) === \"object\") {\n if (!isEmptyObject(params)) {\n urlWithQueryParams += DICOMwebClient._parseQueryParameters(params);\n }\n }\n\n var supportedMediaTypes = [\"video/\", \"video/*\", \"video/mpeg\", \"video/mp4\", \"video/H265\"];\n\n var acceptHeaderFieldValue = DICOMwebClient._buildAcceptHeaderFieldValue(mediaTypes, supportedMediaTypes);\n\n var headers = {\n Accept: acceptHeaderFieldValue\n };\n var responseType = \"arraybuffer\";\n return this._httpGet(urlWithQueryParams, headers, responseType, progressCallback);\n }\n /**\n * Asserts that a given media type is valid.\n *\n * @params {String} mediaType media type\n */\n\n }, {\n key: \"_httpGetMultipartImage\",\n\n /**\n * Performs an HTTP GET request that accepts a multipart message with an image media type.\n *\n * @param {String} url unique resource locator\n * @param {Object[]} mediaTypes acceptable media types and optionally the UIDs of the\n corresponding transfer syntaxes\n * @param {Array} byteRange start and end of byte range\n * @param {Object} params additional HTTP GET query parameters\n * @param {Boolean} rendered whether resource should be requested using rendered media types\n * @param {Function} progressCallback\n * @private\n * @returns {Array} content of HTTP message body parts\n */\n value: function _httpGetMultipartImage(url, mediaTypes, byteRange, params) {\n var rendered = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n var progressCallback = arguments.length > 5 ? arguments[5] : undefined;\n var headers = {};\n var supportedMediaTypes;\n\n if (rendered) {\n supportedMediaTypes = [\"image/jpeg\", \"image/gif\", \"image/png\", \"image/jp2\"];\n } else {\n supportedMediaTypes = {\n \"1.2.840.10008.1.2.5\": [\"image/x-dicom-rle\"],\n \"1.2.840.10008.1.2.4.50\": [\"image/jpeg\"],\n \"1.2.840.10008.1.2.4.51\": [\"image/jpeg\"],\n \"1.2.840.10008.1.2.4.57\": [\"image/jpeg\"],\n \"1.2.840.10008.1.2.4.70\": [\"image/jpeg\"],\n \"1.2.840.10008.1.2.4.80\": [\"image/x-jls\", \"image/jls\"],\n \"1.2.840.10008.1.2.4.81\": [\"image/x-jls\", \"image/jls\"],\n \"1.2.840.10008.1.2.4.90\": [\"image/jp2\"],\n \"1.2.840.10008.1.2.4.91\": [\"image/jp2\"],\n \"1.2.840.10008.1.2.4.92\": [\"image/jpx\"],\n \"1.2.840.10008.1.2.4.93\": [\"image/jpx\"]\n };\n\n if (byteRange) {\n headers.Range = DICOMwebClient._buildRangeHeaderFieldValue(byteRange);\n }\n }\n\n headers.Accept = DICOMwebClient._buildMultipartAcceptHeaderFieldValue(mediaTypes, supportedMediaTypes);\n return this._httpGet(url, headers, \"arraybuffer\", progressCallback).then(multipartDecode);\n }\n /**\n * Performs an HTTP GET request that accepts a multipart message with a video media type.\n *\n * @param {String} url unique resource locator\n * @param {Object[]} mediaTypes acceptable media types and optionally the UIDs of the\n corresponding transfer syntaxes\n * @param {Array} byteRange start and end of byte range\n * @param {Object} params additional HTTP GET query parameters\n * @param {Boolean} rendered whether resource should be requested using rendered media types\n * @param {Function} progressCallback\n * @private\n * @returns {Array} content of HTTP message body parts\n */\n\n }, {\n key: \"_httpGetMultipartVideo\",\n value: function _httpGetMultipartVideo(url, mediaTypes, byteRange, params) {\n var rendered = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n var progressCallback = arguments.length > 5 ? arguments[5] : undefined;\n var headers = {};\n var supportedMediaTypes;\n\n if (rendered) {\n supportedMediaTypes = [\"video/\", \"video/*\", \"video/mpeg2\", \"video/mp4\", \"video/H265\"];\n } else {\n supportedMediaTypes = {\n \"1.2.840.10008.1.2.4.100\": [\"video/mpeg2\"],\n \"1.2.840.10008.1.2.4.101\": [\"video/mpeg2\"],\n \"1.2.840.10008.1.2.4.102\": [\"video/mp4\"],\n \"1.2.840.10008.1.2.4.103\": [\"video/mp4\"],\n \"1.2.840.10008.1.2.4.104\": [\"video/mp4\"],\n \"1.2.840.10008.1.2.4.105\": [\"video/mp4\"],\n \"1.2.840.10008.1.2.4.106\": [\"video/mp4\"]\n };\n\n if (byteRange) {\n headers.Range = DICOMwebClient._buildRangeHeaderFieldValue(byteRange);\n }\n }\n\n headers.Accept = DICOMwebClient._buildMultipartAcceptHeaderFieldValue(mediaTypes, supportedMediaTypes);\n return this._httpGet(url, headers, \"arraybuffer\", progressCallback).then(multipartDecode);\n }\n /**\n * Performs a HTTP GET request that accepts a multipart message with \"application/dicom\" media type\n *\n * @param {String} url unique resource locator\n * @param {Object[]} mediaTypes acceptable media types and optionally the UIDs of the\n corresponding transfer syntaxes\n * @param {Object} params additional HTTP GET query parameters\n * @param {Function} progressCallback\n * @private\n * @returns {Array} content of HTTP message body parts\n */\n\n }, {\n key: \"_httpGetMultipartApplicationDicom\",\n value: function _httpGetMultipartApplicationDicom(url, mediaTypes, params, progressCallback) {\n var headers = {};\n var defaultMediaType = \"application/dicom\";\n var supportedMediaTypes = {\n \"1.2.840.10008.1.2.1\": [defaultMediaType],\n \"1.2.840.10008.1.2.5\": [defaultMediaType],\n \"1.2.840.10008.1.2.4.50\": [defaultMediaType],\n \"1.2.840.10008.1.2.4.51\": [defaultMediaType],\n \"1.2.840.10008.1.2.4.57\": [defaultMediaType],\n \"1.2.840.10008.1.2.4.70\": [defaultMediaType],\n \"1.2.840.10008.1.2.4.80\": [defaultMediaType],\n \"1.2.840.10008.1.2.4.81\": [defaultMediaType],\n \"1.2.840.10008.1.2.4.90\": [defaultMediaType],\n \"1.2.840.10008.1.2.4.91\": [defaultMediaType],\n \"1.2.840.10008.1.2.4.92\": [defaultMediaType],\n \"1.2.840.10008.1.2.4.93\": [defaultMediaType],\n \"1.2.840.10008.1.2.4.100\": [defaultMediaType],\n \"1.2.840.10008.1.2.4.101\": [defaultMediaType],\n \"1.2.840.10008.1.2.4.102\": [defaultMediaType],\n \"1.2.840.10008.1.2.4.103\": [defaultMediaType],\n \"1.2.840.10008.1.2.4.104\": [defaultMediaType],\n \"1.2.840.10008.1.2.4.105\": [defaultMediaType],\n \"1.2.840.10008.1.2.4.106\": [defaultMediaType]\n };\n var acceptableMediaTypes = mediaTypes;\n\n if (!mediaTypes) {\n acceptableMediaTypes = [{\n mediaType: defaultMediaType\n }];\n }\n\n headers.Accept = DICOMwebClient._buildMultipartAcceptHeaderFieldValue(acceptableMediaTypes, supportedMediaTypes);\n return this._httpGet(url, headers, \"arraybuffer\", progressCallback).then(multipartDecode);\n }\n /**\n * Performs a HTTP GET request that accepts a multipart message with \"application/octet-stream\" media type\n *\n * @param {String} url unique resource locator\n * @param {Object[]} mediaTypes acceptable media types and optionally the UIDs of the\n corresponding transfer syntaxes\n * @param {Array} byteRange start and end of byte range\n * @param {Object} params additional HTTP GET query parameters\n * @param {Function} progressCallback\n * @private\n * @returns {Array} content of HTTP message body parts\n */\n\n }, {\n key: \"_httpGetMultipartApplicationOctetStream\",\n value: function _httpGetMultipartApplicationOctetStream(url, mediaTypes, byteRange, params, progressCallback) {\n var headers = {};\n var defaultMediaType = \"application/octet-stream\";\n var supportedMediaTypes = {\n \"1.2.840.10008.1.2.1\": [defaultMediaType]\n };\n var acceptableMediaTypes = mediaTypes;\n\n if (!mediaTypes) {\n acceptableMediaTypes = [{\n mediaType: defaultMediaType\n }];\n }\n\n if (byteRange) {\n headers.Range = DICOMwebClient._buildRangeHeaderFieldValue(byteRange);\n }\n\n headers.Accept = DICOMwebClient._buildMultipartAcceptHeaderFieldValue(acceptableMediaTypes, supportedMediaTypes);\n return this._httpGet(url, headers, \"arraybuffer\", progressCallback).then(multipartDecode);\n }\n }, {\n key: \"_httpPost\",\n value: function _httpPost(url, headers, data, progressCallback) {\n return this._httpRequest(url, \"post\", headers, {\n data: data,\n progressCallback: progressCallback\n });\n }\n }, {\n key: \"_httpPostApplicationJson\",\n value: function _httpPostApplicationJson(url, data, progressCallback) {\n var headers = {\n \"Content-Type\": MEDIATYPES.DICOM_JSON\n };\n return this._httpPost(url, headers, data, progressCallback);\n }\n /**\n * Parses media type and extracts its type and subtype.\n *\n * @param mediaType e.g. image/jpeg\n * @private\n */\n\n }, {\n key: \"searchForStudies\",\n\n /**\n * Searches for DICOM studies.\n * @param {Object} options options object\n * @return {Array} study representations (http://dicom.nema.org/medical/dicom/current/output/chtml/part18/sect_6.7.html#table_6.7.1-2)\n */\n value: function searchForStudies() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n console.log(\"search for studies\");\n var url = \"\".concat(this.qidoURL, \"/studies\");\n\n if (\"queryParams\" in options) {\n url += DICOMwebClient._parseQueryParameters(options.queryParams);\n }\n\n return this._httpGetApplicationJson(url);\n }\n /**\n * Retrieves metadata for a DICOM study.\n * @param {Object} options options object\n * @returns {Array} metadata elements in DICOM JSON format for each instance\n belonging to the study\n */\n\n }, {\n key: \"retrieveStudyMetadata\",\n value: function retrieveStudyMetadata(options) {\n if (!(\"studyInstanceUID\" in options)) {\n throw new Error(\"Study Instance UID is required for retrieval of study metadata\");\n }\n\n console.log(\"retrieve metadata of study \".concat(options.studyInstanceUID));\n var url = \"\".concat(this.wadoURL, \"/studies/\").concat(options.studyInstanceUID, \"/metadata\");\n return this._httpGetApplicationJson(url);\n }\n /**\n * Searches for DICOM series.\n * @param {Object} options options object\n * @returns {Array} series representations (http://dicom.nema.org/medical/dicom/current/output/chtml/part18/sect_6.7.html#table_6.7.1-2a)\n */\n\n }, {\n key: \"searchForSeries\",\n value: function searchForSeries() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var url = this.qidoURL;\n\n if (\"studyInstanceUID\" in options) {\n console.log(\"search series of study \".concat(options.studyInstanceUID));\n url += \"/studies/\".concat(options.studyInstanceUID);\n }\n\n url += \"/series\";\n\n if (\"queryParams\" in options) {\n url += DICOMwebClient._parseQueryParameters(options.queryParams);\n }\n\n return this._httpGetApplicationJson(url);\n }\n /**\n * Retrieves metadata for a DICOM series.\n * @param {Object} options options object\n * @returns {Array} metadata elements in DICOM JSON format for each instance\n belonging to the series\n */\n\n }, {\n key: \"retrieveSeriesMetadata\",\n value: function retrieveSeriesMetadata(options) {\n if (!(\"studyInstanceUID\" in options)) {\n throw new Error(\"Study Instance UID is required for retrieval of series metadata\");\n }\n\n if (!(\"seriesInstanceUID\" in options)) {\n throw new Error(\"Series Instance UID is required for retrieval of series metadata\");\n }\n\n console.log(\"retrieve metadata of series \".concat(options.seriesInstanceUID));\n var url = \"\".concat(this.wadoURL, \"/studies/\").concat(options.studyInstanceUID, \"/series/\").concat(options.seriesInstanceUID, \"/metadata\");\n return this._httpGetApplicationJson(url);\n }\n /**\n * Searches for DICOM instances.\n * @param {Object} options options object\n * @returns {Array} instance representations (http://dicom.nema.org/medical/dicom/current/output/chtml/part18/sect_6.7.html#table_6.7.1-2b)\n */\n\n }, {\n key: \"searchForInstances\",\n value: function searchForInstances() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var url = this.qidoURL;\n\n if (\"studyInstanceUID\" in options) {\n url += \"/studies/\".concat(options.studyInstanceUID);\n\n if (\"seriesInstanceUID\" in options) {\n console.log(\"search for instances of series \".concat(options.seriesInstanceUID));\n url += \"/series/\".concat(options.seriesInstanceUID);\n } else {\n console.log(\"search for instances of study \".concat(options.studyInstanceUID));\n }\n } else {\n console.log(\"search for instances\");\n }\n\n url += \"/instances\";\n\n if (\"queryParams\" in options) {\n url += DICOMwebClient._parseQueryParameters(options.queryParams);\n }\n\n return this._httpGetApplicationJson(url);\n }\n /** Returns a WADO-URI URL for an instance\n * @param {Object} options options object\n * @returns {String} WADO-URI URL\n */\n\n }, {\n key: \"buildInstanceWadoURIUrl\",\n value: function buildInstanceWadoURIUrl(options) {\n if (!(\"studyInstanceUID\" in options)) {\n throw new Error(\"Study Instance UID is required.\");\n }\n\n if (!(\"seriesInstanceUID\" in options)) {\n throw new Error(\"Series Instance UID is required.\");\n }\n\n if (!(\"sopInstanceUID\" in options)) {\n throw new Error(\"SOP Instance UID is required.\");\n }\n\n var contentType = options.contentType || MEDIATYPES.DICOM;\n var transferSyntax = options.transferSyntax || \"*\";\n var params = [];\n params.push(\"requestType=WADO\");\n params.push(\"studyUID=\".concat(options.studyInstanceUID));\n params.push(\"seriesUID=\".concat(options.seriesInstanceUID));\n params.push(\"objectUID=\".concat(options.sopInstanceUID));\n params.push(\"contentType=\".concat(contentType));\n params.push(\"transferSyntax=\".concat(transferSyntax));\n var paramString = params.join(\"&\");\n return \"\".concat(this.wadoURL, \"?\").concat(paramString);\n }\n /**\n * Retrieves metadata for a DICOM instance.\n *\n * @param {Object} options object\n * @returns {Object} metadata elements in DICOM JSON format\n */\n\n }, {\n key: \"retrieveInstanceMetadata\",\n value: function retrieveInstanceMetadata(options) {\n if (!(\"studyInstanceUID\" in options)) {\n throw new Error(\"Study Instance UID is required for retrieval of instance metadata\");\n }\n\n if (!(\"seriesInstanceUID\" in options)) {\n throw new Error(\"Series Instance UID is required for retrieval of instance metadata\");\n }\n\n if (!(\"sopInstanceUID\" in options)) {\n throw new Error(\"SOP Instance UID is required for retrieval of instance metadata\");\n }\n\n console.log(\"retrieve metadata of instance \".concat(options.sopInstanceUID));\n var url = \"\".concat(this.wadoURL, \"/studies/\").concat(options.studyInstanceUID, \"/series/\").concat(options.seriesInstanceUID, \"/instances/\").concat(options.sopInstanceUID, \"/metadata\");\n return this._httpGetApplicationJson(url);\n }\n /**\n * Retrieves frames for a DICOM instance.\n * @param {Object} options options object\n * @returns {Array} frame items as byte arrays of the pixel data element\n */\n\n }, {\n key: \"retrieveInstanceFrames\",\n value: function retrieveInstanceFrames(options) {\n if (!(\"studyInstanceUID\" in options)) {\n throw new Error(\"Study Instance UID is required for retrieval of instance frames\");\n }\n\n if (!(\"seriesInstanceUID\" in options)) {\n throw new Error(\"Series Instance UID is required for retrieval of instance frames\");\n }\n\n if (!(\"sopInstanceUID\" in options)) {\n throw new Error(\"SOP Instance UID is required for retrieval of instance frames\");\n }\n\n if (!(\"frameNumbers\" in options)) {\n throw new Error(\"frame numbers are required for retrieval of instance frames\");\n }\n\n console.log(\"retrieve frames \".concat(options.frameNumbers.toString(), \" of instance \").concat(options.sopInstanceUID));\n var url = \"\".concat(this.wadoURL, \"/studies/\").concat(options.studyInstanceUID, \"/series/\").concat(options.seriesInstanceUID, \"/instances/\").concat(options.sopInstanceUID, \"/frames/\").concat(options.frameNumbers.toString());\n var mediaTypes = options.mediaTypes;\n\n if (!mediaTypes) {\n return this._httpGetMultipartApplicationOctetStream(url);\n }\n\n var commonMediaType = DICOMwebClient._getCommonMediaType(mediaTypes);\n\n if (commonMediaType === MEDIATYPES.OCTET_STREAM) {\n return this._httpGetMultipartApplicationOctetStream(url, mediaTypes);\n } else if (commonMediaType.startsWith(\"image\")) {\n return this._httpGetMultipartImage(url, mediaTypes);\n } else if (commonMediaType.startsWith(\"video\")) {\n return this._httpGetMultipartVideo(url, mediaTypes);\n }\n\n throw new Error(\"Media type \".concat(commonMediaType, \" is not supported for retrieval of frames.\"));\n }\n /**\n * Retrieves an individual, server-side rendered DICOM instance.\n *\n * @param {Object} options options object\n * @returns {Array} frame items as byte arrays of the pixel data element\n */\n\n }, {\n key: \"retrieveInstanceRendered\",\n value: function retrieveInstanceRendered(options) {\n if (!(\"studyInstanceUID\" in options)) {\n throw new Error(\"Study Instance UID is required for retrieval of rendered instance\");\n }\n\n if (!(\"seriesInstanceUID\" in options)) {\n throw new Error(\"Series Instance UID is required for retrieval of rendered instance\");\n }\n\n if (!(\"sopInstanceUID\" in options)) {\n throw new Error(\"SOP Instance UID is required for retrieval of rendered instance\");\n }\n\n var url = \"\".concat(this.wadoURL, \"/studies/\").concat(options.studyInstanceUID, \"/series/\").concat(options.seriesInstanceUID, \"/instances/\").concat(options.sopInstanceUID, \"/rendered\");\n var mediaTypes = options.mediaTypes,\n params = options.params;\n var headers = {};\n\n if (!mediaTypes) {\n var responseType = \"arraybuffer\";\n return this._httpGet(url, headers, responseType);\n }\n\n var commonMediaType = DICOMwebClient._getCommonMediaType(mediaTypes);\n\n if (commonMediaType.startsWith(\"image\")) {\n return this._httpGetImage(url, mediaTypes, params);\n } else if (commonMediaType.startsWith(\"video\")) {\n return this._httpGetVideo(url, mediaTypes, params);\n } else if (commonMediaType.startsWith(\"text\")) {\n return this._httpGetText(url, mediaTypes, params);\n } else if (commonMediaType === MEDIATYPES.PDF) {\n return this._httpGetApplicationPdf(url, params);\n }\n\n throw new Error(\"Media type \".concat(commonMediaType, \" is not supported for retrieval of rendered instance.\"));\n }\n /**\n * Retrieves rendered frames for a DICOM instance.\n * @param {Object} options options object\n * @returns {Array} frame items as byte arrays of the pixel data element\n */\n\n }, {\n key: \"retrieveInstanceFramesRendered\",\n value: function retrieveInstanceFramesRendered(options) {\n if (!(\"studyInstanceUID\" in options)) {\n throw new Error(\"Study Instance UID is required for retrieval of rendered instance frames\");\n }\n\n if (!(\"seriesInstanceUID\" in options)) {\n throw new Error(\"Series Instance UID is required for retrieval of rendered instance frames\");\n }\n\n if (!(\"sopInstanceUID\" in options)) {\n throw new Error(\"SOP Instance UID is required for retrieval of rendered instance frames\");\n }\n\n if (!(\"frameNumbers\" in options)) {\n throw new Error(\"frame numbers are required for retrieval of rendered instance frames\");\n }\n\n console.debug(\"retrieve rendered frames \".concat(options.frameNumbers.toString(), \" of instance \").concat(options.sopInstanceUID));\n var url = \"\".concat(this.wadoURL, \"/studies/\").concat(options.studyInstanceUID, \"/series/\").concat(options.seriesInstanceUID, \"/instances/\").concat(options.sopInstanceUID, \"/frames/\").concat(options.frameNumbers.toString(), \"/rendered\");\n var mediaTypes = options.mediaTypes;\n var headers = {};\n\n if (!mediaTypes) {\n var responseType = \"arraybuffer\";\n return this._httpGet(url, headers, responseType);\n }\n\n var commonMediaType = DICOMwebClient._getCommonMediaType(mediaTypes);\n\n if (commonMediaType.startsWith(\"image\")) {\n return this._httpGetImage(url, mediaTypes);\n } else if (commonMediaType.startsWith(\"video\")) {\n return this._httpGetVideo(url, mediaTypes);\n }\n\n throw new Error(\"Media type \".concat(commonMediaType, \" is not supported for retrieval of rendered frame.\"));\n }\n /**\n * Retrieves a DICOM instance.\n * @param {Object} options options object\n * @returns {ArrayBuffer} DICOM Part 10 file as Arraybuffer\n */\n\n }, {\n key: \"retrieveInstance\",\n value: function retrieveInstance(options) {\n if (!(\"studyInstanceUID\" in options)) {\n throw new Error(\"Study Instance UID is required\");\n }\n\n if (!(\"seriesInstanceUID\" in options)) {\n throw new Error(\"Series Instance UID is required\");\n }\n\n if (!(\"sopInstanceUID\" in options)) {\n throw new Error(\"SOP Instance UID is required\");\n }\n\n var url = \"\".concat(this.wadoURL, \"/studies/\").concat(options.studyInstanceUID, \"/series/\").concat(options.seriesInstanceUID, \"/instances/\").concat(options.sopInstanceUID);\n var mediaTypes = options.mediaTypes;\n\n if (!mediaTypes) {\n return this._httpGetMultipartApplicationDicom(url).then(getFirstResult);\n }\n\n var commonMediaType = DICOMwebClient._getCommonMediaType(mediaTypes);\n\n if (commonMediaType === MEDIATYPES.DICOM) {\n return this._httpGetMultipartApplicationDicom(url, mediaTypes).then(getFirstResult);\n } else if (commonMediaType === MEDIATYPES.OCTET_STREAM) {\n return this._httpGetMultipartApplicationOctetStream(url, mediaTypes).then(getFirstResult);\n } else if (commonMediaType.startsWith(\"image\")) {\n return this._httpGetMultipartImage(url, mediaTypes).then(getFirstResultIfLengthGtOne);\n } else if (commonMediaType.startsWith(\"video\")) {\n return this._httpGetMultipartVideo(url, mediaTypes).then(getFirstResultIfLengthGtOne);\n }\n\n throw new Error(\"Media type \".concat(commonMediaType, \" is not supported for retrieval of instance.\"));\n }\n /**\n * Retrieves a set of DICOM instance for a series.\n * @param {Object} options options object\n * @returns {ArrayBuffer[]} Array of DICOM Part 10 files as Arraybuffers\n */\n\n }, {\n key: \"retrieveSeries\",\n value: function retrieveSeries(options) {\n if (!(\"studyInstanceUID\" in options)) {\n throw new Error(\"Study Instance UID is required\");\n }\n\n if (!(\"seriesInstanceUID\" in options)) {\n throw new Error(\"Series Instance UID is required\");\n }\n\n var url = \"\".concat(this.wadoURL, \"/studies/\").concat(options.studyInstanceUID, \"/series/\").concat(options.seriesInstanceUID);\n var mediaTypes = options.mediaTypes;\n\n if (!mediaTypes) {\n return this._httpGetMultipartApplicationDicom(url);\n }\n\n var commonMediaType = DICOMwebClient._getCommonMediaType(mediaTypes);\n\n if (commonMediaType === MEDIATYPES.DICOM) {\n return this._httpGetMultipartApplicationDicom(url, mediaTypes);\n } else if (commonMediaType === MEDIATYPES.OCTET_STREAM) {\n return this._httpGetMultipartApplicationOctetStream(url, mediaTypes);\n } else if (commonMediaType.startsWith(\"image\")) {\n return this._httpGetMultipartImage(url, mediaTypes);\n } else if (commonMediaType.startsWith(\"video\")) {\n return this._httpGetMultipartVideo(url, mediaTypes);\n }\n\n throw new Error(\"Media type \".concat(commonMediaType, \" is not supported for retrieval of series.\"));\n }\n /**\n * Retrieves a set of DICOM instance for a study.\n * @param {Object} options options object\n * @returns {ArrayBuffer[]} Array of DICOM Part 10 files as Arraybuffers\n */\n\n }, {\n key: \"retrieveStudy\",\n value: function retrieveStudy(options) {\n if (!(\"studyInstanceUID\" in options)) {\n throw new Error(\"Study Instance UID is required\");\n }\n\n var url = \"\".concat(this.wadoURL, \"/studies/\").concat(options.studyInstanceUID);\n var mediaTypes = options.mediaTypes;\n\n if (!mediaTypes) {\n return this._httpGetMultipartApplicationDicom(url);\n }\n\n var commonMediaType = DICOMwebClient._getCommonMediaType(mediaTypes);\n\n if (commonMediaType === MEDIATYPES.DICOM) {\n return this._httpGetMultipartApplicationDicom(url, mediaTypes);\n } else if (commonMediaType === MEDIATYPES.OCTET_STREAM) {\n return this._httpGetMultipartApplicationOctetStream(url, mediaTypes);\n } else if (commonMediaType.startsWith(\"image\")) {\n return this._httpGetMultipartImage(url, mediaTypes);\n } else if (commonMediaType.startsWith(\"video\")) {\n return this._httpGetMultipartVideo(url, mediaTypes);\n }\n\n throw new Error(\"Media type \".concat(commonMediaType, \" is not supported for retrieval of study.\"));\n }\n /**\n * Retrieves and parses BulkData from a BulkDataURI location.\n * Decodes the multipart encoded data and returns the resulting data\n * as an ArrayBuffer.\n *\n * See http://dicom.nema.org/medical/dicom/current/output/chtml/part18/sect_6.5.5.html\n *\n * @param {Object} options options object\n * @return {Promise}\n */\n\n }, {\n key: \"retrieveBulkData\",\n value: function retrieveBulkData(options) {\n if (!(\"BulkDataURI\" in options)) {\n throw new Error(\"BulkDataURI is required.\");\n }\n\n var url = options.BulkDataURI;\n var mediaTypes = options.mediaTypes,\n byteRange = options.byteRange;\n\n if (!mediaTypes) {\n return this._httpGetMultipartApplicationOctetStream(url, mediaTypes, byteRange);\n }\n\n var commonMediaType = DICOMwebClient._getCommonMediaType(mediaTypes);\n\n if (commonMediaType === MEDIATYPES.OCTET_STREAM) {\n return this._httpGetMultipartApplicationOctetStream(url, mediaTypes, byteRange);\n } else if (commonMediaType.startsWith(\"image\")) {\n return this._httpGetMultipartImage(url, mediaTypes, byteRange);\n }\n\n throw new Error(\"Media type \".concat(commonMediaType, \" is not supported for retrieval of bulk data.\"));\n }\n /**\n * Stores DICOM instances.\n *\n * @param {Object} options options object\n */\n\n }, {\n key: \"storeInstances\",\n value: function storeInstances(options) {\n if (!(\"datasets\" in options)) {\n throw new Error(\"datasets are required for storing\");\n }\n\n var url = \"\".concat(this.stowURL, \"/studies\");\n\n if (\"studyInstanceUID\" in options) {\n url += \"/\".concat(options.studyInstanceUID);\n }\n\n var _multipartEncode = multipartEncode(options.datasets),\n data = _multipartEncode.data,\n boundary = _multipartEncode.boundary;\n\n var headers = {\n \"Content-Type\": \"multipart/related; type=application/dicom; boundary=\".concat(boundary)\n };\n return this._httpPost(url, headers, data, options.progressCallback);\n }\n }], [{\n key: \"_parseQueryParameters\",\n value: function _parseQueryParameters() {\n var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var queryString = \"?\";\n Object.keys(params).forEach(function (key, index) {\n if (index !== 0) {\n queryString += \"&\";\n }\n\n queryString += \"\".concat(key, \"=\").concat(encodeURIComponent(params[key]));\n });\n return queryString;\n }\n }, {\n key: \"_assertMediaTypeIsValid\",\n value: function _assertMediaTypeIsValid(mediaType) {\n if (!mediaType) {\n throw new Error(\"Not a valid media type: \".concat(mediaType));\n }\n\n var sepIndex = mediaType.indexOf(\"/\");\n\n if (sepIndex === -1) {\n throw new Error(\"Not a valid media type: \".concat(mediaType));\n }\n\n var mediaTypeType = mediaType.slice(0, sepIndex);\n var types = [\"application\", \"image\", \"text\", \"video\"];\n\n if (!types.includes(mediaTypeType)) {\n throw new Error(\"Not a valid media type: \".concat(mediaType));\n }\n\n if (mediaType.slice(sepIndex + 1).includes(\"/\")) {\n throw new Error(\"Not a valid media type: \".concat(mediaType));\n }\n }\n }, {\n key: \"_parseMediaType\",\n value: function _parseMediaType(mediaType) {\n DICOMwebClient._assertMediaTypeIsValid(mediaType);\n\n return mediaType.split(\"/\");\n }\n /**\n * Builds an accept header field value for HTTP GET request messages.\n *\n * @param {Object[]} mediaTypes Acceptable media types\n * @param {Object[]} supportedMediaTypes Supported media types\n * @return {*}\n * @private\n */\n\n }, {\n key: \"_buildAcceptHeaderFieldValue\",\n value: function _buildAcceptHeaderFieldValue(mediaTypes, supportedMediaTypes) {\n if (!Array.isArray(mediaTypes)) {\n throw new Error(\"Acceptable media types must be provided as an Array\");\n }\n\n var fieldValueParts = mediaTypes.map(function (item) {\n var mediaType = item.mediaType;\n\n DICOMwebClient._assertMediaTypeIsValid(mediaType);\n\n if (!supportedMediaTypes.includes(mediaType)) {\n throw new Error(\"Media type \".concat(mediaType, \" is not supported for requested resource\"));\n }\n\n return mediaType;\n });\n return fieldValueParts.join(\", \");\n }\n /**\n * Builds an accept header field value for HTTP GET multipart request\n messages.\n *\n * @param {Object[]} mediaTypes Acceptable media types\n * @param {Object[]} supportedMediaTypes Supported media types\n * @private\n */\n\n }, {\n key: \"_buildMultipartAcceptHeaderFieldValue\",\n value: function _buildMultipartAcceptHeaderFieldValue(mediaTypes, supportedMediaTypes) {\n if (!Array.isArray(mediaTypes)) {\n throw new Error(\"Acceptable media types must be provided as an Array\");\n }\n\n if (!Array.isArray(supportedMediaTypes) && !isObject(supportedMediaTypes)) {\n throw new Error(\"Supported media types must be provided as an Array or an Object\");\n }\n\n var fieldValueParts = [];\n mediaTypes.forEach(function (item) {\n var transferSyntaxUID = item.transferSyntaxUID,\n mediaType = item.mediaType;\n\n DICOMwebClient._assertMediaTypeIsValid(mediaType);\n\n var fieldValue = \"multipart/related; type=\\\"\".concat(mediaType, \"\\\"\");\n\n if (isObject(supportedMediaTypes)) {\n // SupportedMediaTypes is a lookup table that maps Transfer Syntax UID\n // to one or more Media Types\n if (!Object.values(supportedMediaTypes).flat(1).includes(mediaType)) {\n if (!mediaType.endsWith(\"/*\") || !mediaType.endsWith(\"/\")) {\n throw new Error(\"Media type \".concat(mediaType, \" is not supported for requested resource\"));\n }\n }\n\n if (transferSyntaxUID) {\n if (transferSyntaxUID !== \"*\") {\n if (!Object.keys(supportedMediaTypes).includes(transferSyntaxUID)) {\n throw new Error(\"Transfer syntax \".concat(transferSyntaxUID, \" is not supported for requested resource\"));\n }\n\n var expectedMediaTypes = supportedMediaTypes[transferSyntaxUID];\n\n if (!expectedMediaTypes.includes(mediaType)) {\n var actualType = DICOMwebClient._parseMediaType(mediaType)[0];\n\n expectedMediaTypes.map(function (expectedMediaType) {\n var expectedType = DICOMwebClient._parseMediaType(expectedMediaType)[0];\n\n var haveSameType = actualType === expectedType;\n\n if (haveSameType && (mediaType.endsWith(\"/*\") || mediaType.endsWith(\"/\"))) {\n return;\n }\n\n throw new Error(\"Transfer syntax \".concat(transferSyntaxUID, \" is not supported for requested resource\"));\n });\n }\n }\n\n fieldValue += \"; transfer-syntax=\".concat(transferSyntaxUID);\n }\n } else if (Array.isArray(supportedMediaTypes) && !supportedMediaTypes.includes(mediaType)) {\n throw new Error(\"Media type \".concat(mediaType, \" is not supported for requested resource\"));\n }\n\n fieldValueParts.push(fieldValue);\n });\n return fieldValueParts.join(\", \");\n }\n /**\n * Builds a range header field value for HTTP GET request messages.\n *\n * @param {Array} byteRange start and end of byte range\n * @returns {String} range header field value\n */\n\n }, {\n key: \"_buildRangeHeaderFieldValue\",\n value: function _buildRangeHeaderFieldValue() {\n var byteRange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n\n if (byteRange.length === 1) {\n return \"bytes=\".concat(byteRange[0], \"-\");\n }\n\n if (byteRange.length === 2) {\n return \"bytes=\".concat(byteRange[0], \"-\").concat(byteRange[1]);\n }\n\n return \"bytes=0-\";\n }\n /**\n * Gets common type of acceptable media types and asserts that only\n one type is specified. For example, ``(\"image/jpeg\", \"image/jp2\")``\n will pass, but ``(\"image/jpeg\", \"video/mpeg2\")`` will raise an\n exception.\n * @param {String[]} acceptable media types and optionally the UIDs of the\n corresponding transfer syntaxes\n *\n */\n\n }, {\n key: \"_getCommonMediaType\",\n value: function _getCommonMediaType(mediaTypes) {\n if (!mediaTypes || !mediaTypes.length) {\n throw new Error(\"No acceptable media types provided\");\n }\n\n var commonMediaTypes = new Set();\n mediaTypes.forEach(function (item) {\n var mediaType = item.mediaType;\n\n if (mediaType.startsWith(\"application\")) {\n commonMediaTypes.add(mediaType);\n } else {\n var type = DICOMwebClient._parseMediaType(mediaType)[0];\n\n commonMediaTypes.add(\"\".concat(type, \"/\"));\n }\n });\n\n if (commonMediaTypes.size === 0) {\n throw new Error(\"No common acceptable media type could be identified.\");\n } else if (commonMediaTypes.size > 1) {\n throw new Error(\"Acceptable media types must have the same type.\");\n }\n\n return Array.from(commonMediaTypes)[0];\n }\n }]);\n\n return DICOMwebClient;\n}();\n\nfunction findSubstring(str, before, after) {\n var beforeIndex = str.lastIndexOf(before) + before.length;\n\n if (beforeIndex < before.length) {\n return null;\n }\n\n if (after !== undefined) {\n var afterIndex = str.lastIndexOf(after);\n\n if (afterIndex < 0) {\n return null;\n }\n\n return str.substring(beforeIndex, afterIndex);\n }\n\n return str.substring(beforeIndex);\n}\n\nfunction getStudyInstanceUIDFromUri(uri) {\n var uid = findSubstring(uri, \"studies/\", \"/series\");\n\n if (!uid) {\n uid = findSubstring(uri, \"studies/\");\n }\n\n if (!uid) {\n console.debug(\"Study Instance UID could not be dertermined from URI \\\"\".concat(uri, \"\\\"\"));\n }\n\n return uid;\n}\n\nfunction getSeriesInstanceUIDFromUri(uri) {\n var uid = findSubstring(uri, \"series/\", \"/instances\");\n\n if (!uid) {\n uid = findSubstring(uri, \"series/\");\n }\n\n if (!uid) {\n console.debug(\"Series Instance UID could not be dertermined from URI \\\"\".concat(uri, \"\\\"\"));\n }\n\n return uid;\n}\n\nfunction getSOPInstanceUIDFromUri(uri) {\n var uid = findSubstring(uri, \"/instances/\", \"/frames\");\n\n if (!uid) {\n uid = findSubstring(uri, \"/instances/\", \"/metadata\");\n }\n\n if (!uid) {\n uid = findSubstring(uri, \"/instances/\");\n }\n\n if (!uid) {\n console.debug(\"SOP Instance UID could not be dertermined from URI\\\"\".concat(uri, \"\\\"\"));\n }\n\n return uid;\n}\n\nfunction getFrameNumbersFromUri(uri) {\n var numbers = findSubstring(uri, \"/frames/\", \"/rendered\");\n\n if (!numbers) {\n numbers = findSubstring(uri, \"/frames/\");\n }\n\n if (numbers === undefined) {\n console.debug(\"Frames Numbers could not be dertermined from URI\\\"\".concat(uri, \"\\\"\"));\n }\n\n return numbers.split(\",\");\n}\n\nvar version = \"0.5.2\";\n\nvar api = {\n DICOMwebClient: DICOMwebClient\n};\nvar utils = {\n getStudyInstanceUIDFromUri: getStudyInstanceUIDFromUri,\n getSeriesInstanceUIDFromUri: getSeriesInstanceUIDFromUri,\n getSOPInstanceUIDFromUri: getSOPInstanceUIDFromUri,\n getFrameNumbersFromUri: getFrameNumbersFromUri\n};\n\nexport { api, utils, version };\n//# sourceMappingURL=dicomweb-client.es.js.map\n","/**\r\n * Checks if a series is reconstructable to a 3D volume.\r\n *\r\n * @param {Object[]} instances An array of `OHIFInstanceMetadata` objects.\r\n */\r\nexport default function isDisplaySetReconstructable(instances) {\r\n if (!instances.length) {\r\n return {value: false};\r\n }\r\n\r\n const firstInstance = instances[0].getData().metadata;\r\n\r\n const Modality = firstInstance.Modality;\r\n const isMultiframe = firstInstance.NumberOfFrames > 1;\r\n\r\n if (!constructableModalities.includes(Modality)) {\r\n return {value: false};\r\n }\r\n\r\n // Can't reconstruct if we only have one image.\r\n if (!isMultiframe && instances.length === 1) {\r\n return {value: false};\r\n }\r\n\r\n if (isMultiframe) {\r\n return processMultiframe(instances[0]);\r\n } \r\n return processSingleframe(instances);\r\n \r\n}\r\n\r\nfunction processMultiframe(instance) {\r\n //TODO: deal with multriframe checks! return false for now as can't reconstruct.\r\n return {value: false};\r\n}\r\n\r\nfunction processSingleframe(instances) {\r\n const firstImage = instances[0].getData().metadata;\r\n const firstImageRows = firstImage.Rows;\r\n const firstImageColumns = firstImage.Columns;\r\n const firstImageSamplesPerPixel = firstImage.SamplesPerPixel;\r\n const firstImageOrientationPatient = firstImage.ImageOrientationPatient;\r\n const firstImagePositionPatient = firstImage.ImagePositionPatient;\r\n\r\n // Can't reconstruct if we:\r\n // -- Have a different dimensions within a displaySet.\r\n // -- Have a different number of components within a displaySet.\r\n // -- Have different orientations within a displaySet.\r\n for (let i = 1; i < instances.length; i++) {\r\n const instance = instances[i].getData().metadata;\r\n const {\r\n Rows,\r\n Columns,\r\n SamplesPerPixel,\r\n ImageOrientationPatient\r\n } = instance;\r\n\r\n if (\r\n Rows !== firstImageRows ||\r\n Columns !== firstImageColumns ||\r\n SamplesPerPixel !== firstImageSamplesPerPixel ||\r\n !_isSameOrientation(ImageOrientationPatient, firstImageOrientationPatient)\r\n ) {\r\n return {value: false};\r\n }\r\n }\r\n\r\n let missingFrames = 0;\r\n\r\n // Check if frame spacing is approximately equal within a spacingTolerance.\r\n // If spacing is on a uniform grid but we are missing frames,\r\n // Allow reconstruction, but pass back the number of missing frames.\r\n if (instances.length > 2) {\r\n const lastIpp = instances[instances.length - 1].getData().metadata\r\n .ImagePositionPatient;\r\n\r\n // We can't reconstruct if we are missing ImagePositionPatient values\r\n if (!firstImagePositionPatient || !lastIpp) {\r\n return {value: false};\r\n }\r\n\r\n // const averageSpacingBetweenFrames = _getPerpendicularDistance(firstImagePositionPatient, lastIpp) / (instances.length - 1);\r\n\r\n // let previousImagePositionPatient = firstImagePositionPatient;\r\n // for (let i = 0; i < instances.length; i++) {\r\n // const instance = instances[i].getData().metadata;\r\n // const {ImagePositionPatient} = instance;\r\n // Temporary disable slice spacing issues, will assume a spacing value calculated from ImagePositionPatient and ImageOrientationPatient\r\n // const spacingBetweenFrames = _getPerpendicularDistance(\r\n // ImagePositionPatient,\r\n // previousImagePositionPatient\r\n // );\r\n // const spacingIssue = _getSpacingIssue(\r\n // spacingBetweenFrames,\r\n // averageSpacingBetweenFrames\r\n // );\r\n\r\n // if (spacingIssue) {\r\n // const issue = spacingIssue.issue;\r\n\r\n // if (issue === reconstructionIssues.MISSING_FRAMES) {\r\n // missingFrames += spacingIssue.missingFrames;\r\n // } else if (issue === reconstructionIssues.IRREGULAR_SPACING) {\r\n // return {value: false};\r\n // }\r\n // }\r\n\r\n // previousImagePositionPatient = ImagePositionPatient;\r\n // }\r\n }\r\n\r\n return {value: true, missingFrames};\r\n}\r\n\r\nfunction _isSameOrientation(iop1, iop2) {\r\n if (iop1 === undefined || !iop2 === undefined) {\r\n return;\r\n }\r\n\r\n return (\r\n Math.abs(iop1[0] - iop2[0]) < iopTolerance &&\r\n Math.abs(iop1[1] - iop2[1]) < iopTolerance &&\r\n Math.abs(iop1[2] - iop2[2]) < iopTolerance\r\n );\r\n}\r\n\r\n// TODO: Is 10% a reasonable spacingTolerance for spacing?\r\nconst spacingTolerance = 0.1;\r\nconst iopTolerance = 0.01;\r\n\r\n/**\r\n * Checks for spacing issues.\r\n *\r\n * @param {number} spacing The spacing between two frames.\r\n * @param {number} averageSpacing The average spacing between all frames.\r\n *\r\n * @returns {Object} An object containing the issue and extra information if necessary.\r\n */\r\nfunction _getSpacingIssue(spacing, averageSpacing) {\r\n const equalWithinTolerance =\r\n Math.abs(spacing - averageSpacing) < averageSpacing * spacingTolerance;\r\n\r\n if (equalWithinTolerance) {\r\n return;\r\n }\r\n\r\n const multipleOfAverageSpacing = spacing / averageSpacing;\r\n\r\n const numberOfSpacings = Math.round(multipleOfAverageSpacing);\r\n\r\n const errorForEachSpacing =\r\n Math.abs(spacing - numberOfSpacings * averageSpacing) / numberOfSpacings;\r\n\r\n if (errorForEachSpacing < spacingTolerance * averageSpacing) {\r\n return {\r\n issue: reconstructionIssues.MISSING_FRAMES,\r\n missingFrames: numberOfSpacings - 1\r\n };\r\n }\r\n\r\n return {issue: reconstructionIssues.IRREGULAR_SPACING};\r\n}\r\n\r\nfunction _getPerpendicularDistance(a, b) {\r\n return Math.sqrt(\r\n Math.pow(a[0] - b[0], 2) +\r\n Math.pow(a[1] - b[1], 2) +\r\n Math.pow(a[2] - b[2], 2)\r\n );\r\n}\r\n\r\nconst constructableModalities = ['MR', 'CT', 'PT', 'NM'];\r\nconst reconstructionIssues = {\r\n MISSING_FRAMES: 'missingframes',\r\n IRREGULAR_SPACING: 'irregularspacing'\r\n};\r\n","const LOW_PRIORITY_MODALITIES = Object.freeze(['SEG', 'KO', 'PR']);\r\n\r\nexport default function isLowPriorityModality(Modality) {\r\n return LOW_PRIORITY_MODALITIES.includes(Modality);\r\n}\r\n","// These should be overridden by the implementation\nconst errorHandler = {\n getHTTPErrorHandler: () => null\n};\n\nexport default errorHandler;\n","export default function getImageSetCalculatedSpacings(imageSet) {\n // console.log('getImageSetCalculatedSpacings', imageSet);\n const calculatedSpacings = {\n mostUnique: 0,\n max: 0,\n min: 0 \n };\n\n const spacings = [];\n for (let i = 0; i < imageSet.length; i++) {\n const metadata = imageSet[i].getData().metadata;\n const { ImagePositionPatient, ImageOrientationPatient } = metadata;\n if (!ImagePositionPatient || !ImageOrientationPatient) return;\n const thisPosition = _getZPosAlongPlaneDirection(ImagePositionPatient, ImageOrientationPatient);\n if (i > 0) {\n if (i !== imageSet.length - 1) spacings[i] = thisPosition;\n spacings[i-1] = _roundToTwo(Math.abs(thisPosition - spacings[i-1]));\n } else spacings.push(thisPosition);\n }\n\n // \n const { mostUnique, max, min } = _getImageSetCalculatedSpacings(spacings);\n calculatedSpacings.mostUnique = mostUnique;\n calculatedSpacings.max = max;\n calculatedSpacings.min = min;\n return calculatedSpacings;\n}\n\n// Compute true zPos along Plane normals from Image Position Patient (0020,0032) and Image Orientation Patient (0020,0037)\n// https://github.com/horosproject/horosplugins/blob/767f630607094e3ba3b814f788fc49736c70367d/VoxelVolume/VoxelVolumeFilter.m\nfunction _getZPosAlongPlaneDirection(imagePos, imageOrient) {\n // console.log('getZPosAlongPlaneDirection', imagePos, imageOrient);\n // image positions, normally this is the top-left coordinate of the image\n const xPos = imagePos[0];\n const yPos = imagePos[1];\n const zPos = imagePos[2];\n // normal vectors along X, Y, Z of the image\n /*\n \"C.7.6.2.1.1 Image Position And Image Orientation. The Image Position (0020,0032) specifies the x, y,\n and z coordinates of the upper left hand corner of the image; it is the center of the first voxel transmitted.\n Image Orientation (0020,0037) specifies the direction cosines of the first row and the first column with respect to the patient.\n These Attributes shall be provide as a pair. Row value for the x, y, and z axes respectively followed by the Column value for the x,\n y, and z axes respectively. The direction of the axes is defined fully by the patient's orientation. The x-axis is increasing to the\n left hand side of the patient. The y-axis is increasing to the posterior side of the patient.\n The z-axis is increasing toward the head of the patient. The patient based coordinate system is a right handed system,%\n i.e. the vector cross product of a unit vector along the positive x-axis and a unit vector along the positive y-axis is equal to a unit vector%\n along the positive z-axis.\"\n \n dst_nrm_dircos_x = dircos(2) * dircos(6) - dircos(3) * dircos(5);\n dst_nrm_dircos_y = dircos(3) * dircos(4) - dircos(1) * dircos(6);\n dst_nrm_dircos_z = dircos(1) * dircos(5) - dircos(2) * dircos(4);\n \n newx = dircos(1) * xpos + dircos(2)* ypos + dircos(3) * zpos;\n newy = dircos(4)* xpos + dircos(5)* ypos + dircos(6) * zpos;\n newz = dst_nrm_dircos_x * xpos + dst_nrm_dircos_y * ypos+ dst_nrm_dircos_z * zpos;\n */\n const dst_normal_IOP_x = imageOrient[2-1] * imageOrient[6-1] - imageOrient[3-1] * imageOrient[5-1];\n const dst_normal_IOP_y = imageOrient[3-1] * imageOrient[4-1] - imageOrient[1-1] * imageOrient[6-1];\n const dst_normal_IOP_z = imageOrient[1-1] * imageOrient[5-1] - imageOrient[2-1] * imageOrient[4-1];\n\n const newZ = dst_normal_IOP_x * xPos + dst_normal_IOP_y * yPos + dst_normal_IOP_z * zPos;\n return newZ;\n}\n\nfunction _roundToTwo(num) { \n return +(Math.round(num + 'e+2') + 'e-2');\n}\n// return an array of spacing between instances in the set\nfunction _getImageSetCalculatedSpacings(spacings) {\n // console.time('_getImageSetCalculatedSpacings');\n const unique_values = [...new Set(spacings)];\n const count = new Array(unique_values.length).fill(0);\n let max = 0;\n let min = Infinity;\n // console.log('_getImageSetCalculatedSpacings uniques', unique_values);\n spacings.forEach((spacing) => {\n if (spacing > max) max = spacing;\n if (spacing < min) min = spacing;\n unique_values.forEach((val, index) => {\n if (val === spacing) count[index]++;\n });\n });\n // console.log('_getImageSetCalculatedSpacings count', count);\n const maxCountIndex = count.indexOf(Math.max(...count));\n // console.timeEnd('_getImageSetCalculatedSpacings');\n return { mostUnique: unique_values[maxCountIndex], max: max, min: min };\n}","// - createStacks\r\nimport DICOMWeb from './../../DICOMWeb';\r\nimport ImageSet from './../ImageSet';\r\nimport { InstanceMetadata } from './InstanceMetadata';\r\nimport { Metadata } from './Metadata';\r\nimport OHIFError from '../OHIFError';\r\nimport { SeriesMetadata } from './SeriesMetadata';\r\n// - createStacks\r\nimport { api } from 'dicomweb-client';\r\n// - createStacks\r\nimport { isImage } from '../../utils/isImage';\r\nimport isDisplaySetReconstructable from '../../utils/isDisplaySetReconstructable';\r\nimport isLowPriorityModality from '../../utils/isLowPriorityModality';\r\nimport errorHandler from '../../errorHandler';\r\n// Mod by Triet\r\nimport getImageSetCalculatedSpacings from '../../utils/getImageSetCalculatedSpacings';\r\n\r\nexport class StudyMetadata extends Metadata {\r\n constructor(data, uid) {\r\n super(data, uid);\r\n // Initialize Private Properties\r\n Object.defineProperties(this, {\r\n _studyInstanceUID: {\r\n configurable: true, // configurable so that it can be redefined in sub-classes...\r\n enumerable: false,\r\n writable: true,\r\n value: null\r\n },\r\n _series: {\r\n configurable: false,\r\n enumerable: false,\r\n writable: false,\r\n value: []\r\n },\r\n _displaySets: {\r\n configurable: false,\r\n enumerable: false,\r\n writable: false,\r\n value: []\r\n },\r\n _derivedDisplaySets: {\r\n configurable: false,\r\n enumerable: false,\r\n writable: false,\r\n value: []\r\n },\r\n _firstSeries: {\r\n configurable: false,\r\n enumerable: false,\r\n writable: true,\r\n value: null\r\n },\r\n _firstInstance: {\r\n configurable: false,\r\n enumerable: false,\r\n writable: true,\r\n value: null\r\n }\r\n });\r\n // Initialize Public Properties\r\n this._definePublicProperties();\r\n }\r\n\r\n /**\r\n * Private Methods\r\n */\r\n\r\n /**\r\n * Define Public Properties\r\n * This method should only be called during initialization (inside the class constructor)\r\n */\r\n _definePublicProperties() {\r\n /**\r\n * Property: this.studyInstanceUID\r\n * Same as this.getStudyInstanceUID()\r\n * It's specially useful in contexts where a method call is not suitable like in search criteria. For example:\r\n * studyCollection.findBy({\r\n * studyInstanceUID: '1.2.3.4.5.6.77777.8888888.99999999999.0'\r\n * });\r\n */\r\n Object.defineProperty(this, 'studyInstanceUID', {\r\n configurable: false,\r\n enumerable: false,\r\n get: function () {\r\n return this.getStudyInstanceUID();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Public Methods\r\n */\r\n\r\n /**\r\n * Getter for displaySets\r\n * @return {Array} Array of display set object\r\n */\r\n getDisplaySets() {\r\n return this._displaySets.slice();\r\n }\r\n\r\n /**\r\n * Split a series metadata object into display sets\r\n * @param {Array} sopClassHandlerModules List of SOP Class Modules\r\n * @param {SeriesMetadata} series The series metadata object from which the display sets will be created\r\n * @returns {Array} The list of display sets created for the given series object\r\n */\r\n _createDisplaySetsForSeries(sopClassHandlerModules, series) {\r\n const study = this;\r\n const displaySets = [];\r\n const anyInstances = series.getInstanceCount() > 0;\r\n\r\n if (!anyInstances) {\r\n const displaySet = new ImageSet([]);\r\n const seriesData = series.getData();\r\n\r\n displaySet.setAttributes({\r\n displaySetInstanceUID: displaySet.uid,\r\n SeriesInstanceUID: seriesData.SeriesInstanceUID,\r\n SeriesDescription: seriesData.SeriesDescription,\r\n SeriesNumber: seriesData.SeriesNumber,\r\n Modality: seriesData.Modality,\r\n combinedId: series.combinedId\r\n });\r\n\r\n displaySets.push(displaySet);\r\n return displaySets;\r\n }\r\n\r\n const sopClassUIDs = getSopClassUIDs(series);\r\n\r\n if (sopClassHandlerModules && sopClassHandlerModules.length > 0) {\r\n const displaySet = _getDisplaySetFromSopClassModule(sopClassHandlerModules, series, study, sopClassUIDs);\r\n\r\n if (displaySet) {\r\n displaySet.sopClassModule = true;\r\n\r\n displaySet.isDerived ? this._addDerivedDisplaySet(displaySet) : displaySets.push(displaySet);\r\n displaySet.combinedId = series.combinedId;\r\n return displaySets;\r\n }\r\n }\r\n\r\n // WE NEED A BETTER WAY TO NOTE THAT THIS IS THE DEFAULT BEHAVIOR FOR LOADING\r\n // A DISPLAY SET IF THERE IS NO MATCHING SOP CLASS PLUGIN\r\n\r\n // Search through the instances (InstanceMetadata object) of this series\r\n // Split Multi-frame instances and Single-image modalities\r\n // into their own specific display sets. Place the rest of each\r\n // series into another display set.\r\n const stackableInstances = [];\r\n series.forEachInstance((instance) => {\r\n // All imaging modalities must have a valid value for SOPClassUID (x00080016) or Rows (x00280010)\r\n // Mod by Triet\r\n // Disable isImage checking to support showing HTML series\r\n // if (!isImage(instance.getTagValue('SOPClassUID')) && !instance.getTagValue('Rows')) {\r\n // return;\r\n // }\r\n \r\n let displaySet;\r\n\r\n if (isMultiFrame(instance)) {\r\n displaySet = makeDisplaySet(series, [instance]);\r\n\r\n displaySet.setAttributes({\r\n sopClassUIDs,\r\n isClip: true,\r\n SeriesInstanceUID: series.getSeriesInstanceUID(),\r\n StudyInstanceUID: study.getStudyInstanceUID(), // Include the study instance UID for drag/drop purposes\r\n numImageFrames: instance.getTagValue('NumberOfFrames'), // Override the default value of instances.length\r\n InstanceNumber: instance.getTagValue('InstanceNumber'), // Include the instance number\r\n AcquisitionDatetime: instance.getTagValue('AcquisitionDateTime') // Include the acquisition datetime\r\n });\r\n displaySets.push(displaySet);\r\n } else if (isSingleImageModality(instance.Modality)) {\r\n displaySet = makeDisplaySet(series, [instance]);\r\n displaySet.setAttributes({\r\n sopClassUIDs,\r\n StudyInstanceUID: study.getStudyInstanceUID(), // Include the study instance UID\r\n SeriesInstanceUID: series.getSeriesInstanceUID(),\r\n InstanceNumber: instance.getTagValue('InstanceNumber'), // Include the instance number\r\n AcquisitionDatetime: instance.getTagValue('AcquisitionDateTime') // Include the acquisition datetime\r\n });\r\n displaySets.push(displaySet);\r\n } else {\r\n stackableInstances.push(instance);\r\n }\r\n });\r\n\r\n if (stackableInstances.length) {\r\n const displaySet = makeDisplaySet(series, stackableInstances);\r\n displaySet.setAttribute('StudyInstanceUID', study.getStudyInstanceUID());\r\n displaySet.setAttributes({\r\n sopClassUIDs\r\n });\r\n displaySets.push(displaySet);\r\n }\r\n\r\n return displaySets;\r\n }\r\n\r\n /**\r\n * Adds the displaySets to the studies list of derived displaySets.\r\n * @param {object} displaySet The displaySet to append to the derived displaysets list.\r\n */\r\n _addDerivedDisplaySet(displaySet) {\r\n this._derivedDisplaySets.push(displaySet);\r\n // --> Perhaps that logic should exist in the extension sop class handler and this be a dumb list.\r\n // TODO -> Get x Modality by referencedSeriesInstanceUid, FoR, etc.\r\n }\r\n\r\n /**\r\n * Adds the displaySets to the studies list of derived displaySets.\r\n * @param {array} displaySets The displaySets array to append to the derived displaysets list.\r\n */\r\n _addDerivedDisplaySets(displaySets) {\r\n displaySets.map((displaySet) => this._derivedDisplaySets.push(displaySet));\r\n }\r\n\r\n /**\r\n * Returns a list of derived datasets in the study, filtered by the given filter.\r\n * @param {object} filter An object containing search filters\r\n * @param {object} filter.Modality\r\n * @param {object} filter.referencedSeriesInstanceUID\r\n * @param {object} filter.referencedFrameOfReferenceUID\r\n * @return {Array} filtered derived display sets\r\n */\r\n getDerivedDatasets(filter) {\r\n const { Modality, referencedSeriesInstanceUID, referencedFrameOfReferenceUID } = filter;\r\n\r\n let filteredDerivedDisplaySets = this._derivedDisplaySets;\r\n\r\n if (Modality) {\r\n filteredDerivedDisplaySets = filteredDerivedDisplaySets.filter((displaySet) => displaySet.Modality === Modality);\r\n }\r\n\r\n if (referencedSeriesInstanceUID) {\r\n filteredDerivedDisplaySets = filteredDerivedDisplaySets.filter((displaySet) => {\r\n if (!displaySet.metadata.ReferencedSeriesSequence) {\r\n return false;\r\n }\r\n\r\n const ReferencedSeriesSequence = Array.isArray(displaySet.metadata.ReferencedSeriesSequence)\r\n ? displaySet.metadata.ReferencedSeriesSequence\r\n : [displaySet.metadata.ReferencedSeriesSequence];\r\n\r\n return ReferencedSeriesSequence.some(\r\n (ReferencedSeries) => ReferencedSeries.SeriesInstanceUID === referencedSeriesInstanceUID\r\n );\r\n });\r\n }\r\n\r\n if (referencedFrameOfReferenceUID) {\r\n filteredDerivedDisplaySets = filteredDerivedDisplaySets.filter(\r\n (displaySet) => displaySet.ReferencedFrameOfReferenceUID === referencedFrameOfReferenceUID\r\n );\r\n }\r\n\r\n return filteredDerivedDisplaySets;\r\n }\r\n\r\n /**\r\n * Creates a set of displaySets to be placed in the Study Metadata\r\n * The displaySets that appear in the Study Metadata must represent\r\n * imaging modalities. A series may be split into one or more displaySets.\r\n *\r\n * Furthermore, for drag/drop functionality,\r\n * it is easiest if the stack objects also contain information about\r\n * which study they are linked to.\r\n *\r\n * @param {StudyMetadata} study The study instance metadata to be used\r\n * @returns {Array} An array of series to be placed in the Study Metadata\r\n */\r\n createDisplaySets(sopClassHandlerModules) {\r\n const displaySets = [];\r\n const anyDisplaySets = this.getSeriesCount();\r\n\r\n if (!anyDisplaySets) {\r\n return displaySets;\r\n }\r\n\r\n // Loop through the series (SeriesMetadata)\r\n this.forEachSeries((series) => {\r\n const displaySetsForSeries = this._createDisplaySetsForSeries(sopClassHandlerModules, series);\r\n\r\n displaySets.push(...displaySetsForSeries);\r\n });\r\n return sortDisplaySetList(displaySets);\r\n }\r\n\r\n sortDisplaySets() {\r\n sortDisplaySetList(this._displaySets);\r\n }\r\n\r\n /**\r\n * Method to append display sets from a given series to the internal list of display sets\r\n * @param {Array} sopClassHandlerModules A list of SOP Class Handler Modules\r\n * @param {SeriesMetadata} series The series metadata object from which the display sets will be created\r\n * @returns {boolean} Returns true on success or false on failure (e.g., the series does not belong to this study)\r\n */\r\n createAndAddDisplaySetsForSeries(sopClassHandlerModules, series) {\r\n if (!this.containsSeries(series)) {\r\n return false;\r\n }\r\n\r\n const displaySets = this._createDisplaySetsForSeries(sopClassHandlerModules, series);\r\n // Note: filtering in place because this._displaySets has writable: false\r\n // Mod: check for combined id instead of SeriesUID\r\n for (let i = this._displaySets.length - 1; i >= 0; i--) {\r\n const displaySet = this._displaySets[i];\r\n if (displaySet.combinedId === series.combinedId) {\r\n this._displaySets.splice(i, 1);\r\n }\r\n }\r\n\r\n displaySets.forEach((displaySet) => {\r\n this.addDisplaySet(displaySet);\r\n });\r\n\r\n this.sortDisplaySets();\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Set display sets\r\n * @param {Array} displaySets Array of display sets (ImageSet[])\r\n */\r\n setDisplaySets(displaySets) {\r\n if (Array.isArray(displaySets) && displaySets.length > 0) {\r\n // TODO: This is weird, can we just switch it to writable: true?\r\n this._displaySets.splice(0);\r\n\r\n displaySets.forEach((displaySet) => this.addDisplaySet(displaySet));\r\n this.sortDisplaySets();\r\n }\r\n }\r\n\r\n /**\r\n * Add a single display set to the list\r\n * @param {Object} displaySet Display set object\r\n * @returns {boolean} True on success, false on failure.\r\n */\r\n addDisplaySet(displaySet) {\r\n if (displaySet instanceof ImageSet || displaySet.sopClassModule) {\r\n this._displaySets.push(displaySet);\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Invokes the supplied callback for each display set in the current study passing\r\n * two arguments: display set (a ImageSet instance) and index (the integer\r\n * index of the display set within the current study)\r\n * @param {function} callback The callback function which will be invoked for each display set instance.\r\n * @returns {undefined} Nothing is returned.\r\n */\r\n forEachDisplaySet(callback) {\r\n if (Metadata.isValidCallback(callback)) {\r\n this._displaySets.forEach((displaySet, index) => {\r\n callback.call(null, displaySet, index);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Search the associated display sets using the supplied callback as criteria. The callback is passed\r\n * two arguments: display set (an ImageSet instance) and index (the integer\r\n * index of the display set within the current study)\r\n * @param {function} callback The callback function which will be invoked for each display set instance.\r\n * @returns {undefined} Nothing is returned.\r\n */\r\n findDisplaySet(callback) {\r\n if (Metadata.isValidCallback(callback)) {\r\n return this._displaySets.find((displaySet, index) => {\r\n return callback.call(null, displaySet, index);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Retrieve the number of display sets within the current study.\r\n * @returns {number} The number of display sets in the current study.\r\n */\r\n getDisplaySetCount() {\r\n return this._displaySets.length;\r\n }\r\n\r\n /**\r\n * Returns the StudyInstanceUID of the current study.\r\n */\r\n getStudyInstanceUID() {\r\n return this._studyInstanceUID;\r\n }\r\n\r\n /**\r\n * Getter for series\r\n * @return {Array} Array of SeriesMetadata object\r\n */\r\n getSeries() {\r\n return this._series.slice();\r\n }\r\n\r\n /**\r\n * Append a series to the current study.\r\n * @param {SeriesMetadata} series The series to be added to the current study.\r\n * @returns {boolean} Returns true on success, false otherwise.\r\n */\r\n addSeries(series) {\r\n let result = false;\r\n // Mod by Triet\r\n if (series instanceof SeriesMetadata && (this.getSeriesByUID(series.getSeriesInstanceUID()) === void 0 || series.isSubSeries())) {\r\n this._series.push(series);\r\n result = true;\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Update a series in the current study by SeriesInstanceUID.\r\n * @param {String} SeriesInstanceUID The SeriesInstanceUID to be updated\r\n * @param {SeriesMetadata} series The series to be added to the current study.\r\n * @returns {boolean} Returns true on success, false otherwise.\r\n */\r\n updateSeries(SeriesInstanceUID, series) {\r\n // const index = this._series.findIndex((series) => {\r\n // return series.getSeriesInstanceUID() === SeriesInstanceUID;\r\n // });\r\n\r\n // if (index < 0) {\r\n // return false;\r\n // }\r\n const index = this.getSeriesIndexByCustomId(series.getCustomSeriesInstanceUID());\r\n if (!(series instanceof SeriesMetadata)) {\r\n throw new Error('Series must be an instance of SeriesMetadata');\r\n }\r\n\r\n this._series[index] = series;\r\n return true;\r\n }\r\n\r\n /**\r\n * Find a series by index.\r\n * @param {number} index An integer representing a list index.\r\n * @returns {SeriesMetadata} Returns a SeriesMetadata instance when found or undefined otherwise.\r\n */\r\n getSeriesByIndex(index) {\r\n let found; // undefined by default...\r\n if (Metadata.isValidIndex(index)) {\r\n found = this._series[index];\r\n }\r\n return found;\r\n }\r\n\r\n /**\r\n * Find a series by SeriesInstanceUID.\r\n * @param {string} uid An UID string.\r\n * @returns {SeriesMetadata} Returns a SeriesMetadata instance when found or undefined otherwise.\r\n */\r\n getSeriesByUID(uid) {\r\n let found; // undefined by default...\r\n if (Metadata.isValidUID(uid)) {\r\n found = this._series.find((series) => {\r\n return series.getSeriesInstanceUID() === uid;\r\n });\r\n }\r\n return found;\r\n }\r\n\r\n containsSeries(series) {\r\n return series instanceof SeriesMetadata && this._series.indexOf(series) >= 0;\r\n }\r\n\r\n /**\r\n * Retrieve the number of series within the current study.\r\n * @returns {number} The number of series in the current study.\r\n */\r\n getSeriesCount() {\r\n return this._series.length;\r\n }\r\n\r\n /**\r\n * Retrieve the number of instances within the current study.\r\n * @returns {number} The number of instances in the current study.\r\n */\r\n getInstanceCount() {\r\n return this._series.reduce((sum, series) => {\r\n return sum + series.getInstanceCount();\r\n }, 0);\r\n }\r\n\r\n /**\r\n * Invokes the supplied callback for each series in the current study passing\r\n * two arguments: series (a SeriesMetadata instance) and index (the integer\r\n * index of the series within the current study)\r\n * @param {function} callback The callback function which will be invoked for each series instance.\r\n * @returns {undefined} Nothing is returned.\r\n */\r\n forEachSeries(callback) {\r\n if (Metadata.isValidCallback(callback)) {\r\n this._series.forEach((series, index) => {\r\n callback.call(null, series, index);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Find the index of a series inside the study.\r\n * @param {SeriesMetadata} series An instance of the SeriesMetadata class.\r\n * @returns {number} The index of the series inside the study or -1 if not found.\r\n */\r\n indexOfSeries(series) {\r\n return this._series.indexOf(series);\r\n }\r\n\r\n /**\r\n * It sorts the series based on display sets order. Each series must be an instance\r\n * of SeriesMetadata and each display sets must be an instance of ImageSet.\r\n * Useful example of usage:\r\n * Study data provided by backend does not sort series at all and client-side\r\n * needs series sorted by the same criteria used for sorting display sets.\r\n */\r\n sortSeriesByDisplaySets() {\r\n // Object for mapping display sets' index by SeriesInstanceUID\r\n const displaySetsMapping = {};\r\n\r\n // Loop through each display set to create the mapping\r\n this.forEachDisplaySet((displaySet, index) => {\r\n if (!(displaySet instanceof ImageSet)) {\r\n throw new OHIFError(`StudyMetadata::sortSeriesByDisplaySets display set at index ${index} is not an instance of ImageSet`);\r\n }\r\n\r\n // In case of multiframe studies, just get the first index occurence\r\n if (displaySetsMapping[displaySet.SeriesInstanceUID] === void 0) {\r\n displaySetsMapping[displaySet.SeriesInstanceUID] = index;\r\n }\r\n });\r\n\r\n // Clone of actual series\r\n const actualSeries = this.getSeries();\r\n\r\n actualSeries.forEach((series, index) => {\r\n if (!(series instanceof SeriesMetadata)) {\r\n throw new OHIFError(`StudyMetadata::sortSeriesByDisplaySets series at index ${index} is not an instance of SeriesMetadata`);\r\n }\r\n\r\n // Get the new series index\r\n const seriesIndex = displaySetsMapping[series.getSeriesInstanceUID()];\r\n\r\n // Update the series object with the new series position\r\n this._series[seriesIndex] = series;\r\n });\r\n }\r\n\r\n /**\r\n * Compares the current study instance with another one.\r\n * @param {StudyMetadata} study An instance of the StudyMetadata class.\r\n * @returns {boolean} Returns true if both instances refer to the same study.\r\n */\r\n equals(study) {\r\n const self = this;\r\n return study === self || (study instanceof StudyMetadata && study.getStudyInstanceUID() === self.getStudyInstanceUID());\r\n }\r\n\r\n /**\r\n * Get the first series of the current study retaining a consistent result across multiple calls.\r\n * @return {SeriesMetadata} An instance of the SeriesMetadata class or null if it does not exist.\r\n */\r\n getFirstSeries() {\r\n let series = this._firstSeries;\r\n if (!(series instanceof SeriesMetadata)) {\r\n series = null;\r\n const found = this.getSeriesByIndex(0);\r\n if (found instanceof SeriesMetadata) {\r\n this._firstSeries = found;\r\n series = found;\r\n }\r\n }\r\n return series;\r\n }\r\n\r\n /**\r\n * Get the first image id given display instance uid.\r\n * @return {string} The image id.\r\n */\r\n getFirstImageId(displaySetInstanceUID) {\r\n try {\r\n const displaySet = this.findDisplaySet((displaySet) => displaySet.displaySetInstanceUID === displaySetInstanceUID);\r\n return displaySet.images[0].getImageId();\r\n } catch (error) {\r\n console.error('Failed to retrieve image metadata');\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Get the first instance of the current study retaining a consistent result across multiple calls.\r\n * @return {InstanceMetadata} An instance of the InstanceMetadata class or null if it does not exist.\r\n */\r\n getFirstInstance() {\r\n let instance = this._firstInstance;\r\n if (!(instance instanceof InstanceMetadata)) {\r\n instance = null;\r\n const firstSeries = this.getFirstSeries();\r\n if (firstSeries instanceof SeriesMetadata) {\r\n const found = firstSeries.getFirstInstance();\r\n if (found instanceof InstanceMetadata) {\r\n this._firstInstance = found;\r\n instance = found;\r\n }\r\n }\r\n }\r\n return instance;\r\n }\r\n\r\n /**\r\n * Search the associated series to find an specific instance using the supplied callback as criteria.\r\n * The callback is passed two arguments: instance (a InstanceMetadata instance) and index (the integer\r\n * index of the instance within the current series)\r\n * @param {function} callback The callback function which will be invoked for each instance instance.\r\n * @returns {Object} Result object containing series (SeriesMetadata) and instance (InstanceMetadata)\r\n * objects or an empty object if not found.\r\n */\r\n findSeriesAndInstanceByInstance(callback) {\r\n let result;\r\n\r\n if (Metadata.isValidCallback(callback)) {\r\n let instance;\r\n\r\n const series = this._series.find((series) => {\r\n instance = series.findInstance(callback);\r\n return instance instanceof InstanceMetadata;\r\n });\r\n\r\n // No series found\r\n if (series instanceof SeriesMetadata) {\r\n result = {\r\n series,\r\n instance\r\n };\r\n }\r\n }\r\n\r\n return result || {};\r\n }\r\n\r\n /**\r\n * Find series by instance using the supplied callback as criteria. The callback is passed\r\n * two arguments: instance (a InstanceMetadata instance) and index (the integer index of\r\n * the instance within its series)\r\n * @param {function} callback The callback function which will be invoked for each instance.\r\n * @returns {SeriesMetadata|undefined} If a series is found based on callback criteria it\r\n * returns a SeriesMetadata. \"undefined\" is returned otherwise\r\n */\r\n findSeriesByInstance(callback) {\r\n const result = this.findSeriesAndInstanceByInstance(callback);\r\n\r\n return result.series;\r\n }\r\n\r\n /**\r\n * Find an instance using the supplied callback as criteria. The callback is passed\r\n * two arguments: instance (a InstanceMetadata instance) and index (the integer index of\r\n * the instance within its series)\r\n * @param {function} callback The callback function which will be invoked for each instance.\r\n * @returns {InstanceMetadata|undefined} If an instance is found based on callback criteria it\r\n * returns a InstanceMetadata. \"undefined\" is returned otherwise\r\n */\r\n findInstance(callback) {\r\n const result = this.findSeriesAndInstanceByInstance(callback);\r\n\r\n return result.instance;\r\n }\r\n\r\n // Mod by Triet\r\n /**\r\n * Check if the series with subseries exists under the custom id\r\n * @param {string} customId, SeriesUID + '_' + SubSeriesId\r\n */\r\n getSeriesIndexByCustomId(customId) {\r\n const index = this._series.findIndex((series) => {\r\n return series.combinedId === customId;\r\n });\r\n\r\n if (index < 0) {\r\n return null;\r\n }\r\n return index;\r\n }\r\n}\r\n\r\n/**\r\n *\r\n * @typedef StudyMetadata\r\n * @property {function} getSeriesCount - returns the number of series in the study\r\n * @property {function} forEachSeries - function that invokes callback with each series and index\r\n * @property {function} getStudyInstanceUID - returns the study's instance UID\r\n *\r\n */\r\n\r\n/**\r\n * @typedef SeriesMetadata\r\n * @property {function} getSeriesInstanceUID - returns the series's instance UID\r\n * @property {function} getData - ???\r\n * @property {function} forEachInstance - ???\r\n */\r\n\r\nconst dwc = api.DICOMwebClient;\r\n\r\nconst isMultiFrame = (instance) => {\r\n return instance.getTagValue('NumberOfFrames') > 1;\r\n};\r\n\r\nconst makeDisplaySet = (series, instances) => {\r\n const instance = instances[0];\r\n const imageSet = new ImageSet(instances);\r\n const seriesData = series.getData();\r\n\r\n // set appropriate attributes to image set...\r\n imageSet.setAttributes({\r\n displaySetInstanceUID: imageSet.uid, // create a local alias for the imageSet UID\r\n SeriesDate: seriesData.SeriesDate,\r\n SeriesTime: seriesData.SeriesTime,\r\n SeriesInstanceUID: series.getSeriesInstanceUID(),\r\n // SeriesNumber: instance.getTagValue('SeriesNumber'),\r\n // SeriesDescription: instance.getTagValue('SeriesDescription'),\r\n SeriesNumber: series.getSeriesNumber(),\r\n SeriesDescription: series.getSeriesDescription(),\r\n numImageFrames: instances.length,\r\n frameRate: instance.getTagValue('FrameTime'),\r\n Modality: instance.getTagValue('Modality'),\r\n isMultiFrame: isMultiFrame(instance)\r\n });\r\n\r\n // Sort the images in this series if needed\r\n const shallSort = true; //!OHIF.utils.ObjectPath.get(Meteor, 'settings.public.ui.sortSeriesByIncomingOrder');\r\n if (shallSort) {\r\n imageSet.sortBy((a, b) => {\r\n // Sort by InstanceNumber (0020,0013)\r\n return (parseInt(a.getTagValue('InstanceNumber', 0)) || 0) - (parseInt(b.getTagValue('InstanceNumber', 0)) || 0);\r\n });\r\n }\r\n\r\n // Include the first image instance number (after sorted)\r\n imageSet.setAttribute('InstanceNumber', imageSet.getImage(0).getTagValue('InstanceNumber'));\r\n\r\n const isReconstructable = isDisplaySetReconstructable(instances);\r\n\r\n imageSet.isReconstructable = isReconstructable.value;\r\n\r\n if (shallSort && imageSet.isReconstructable) {\r\n imageSet.sortByImagePositionPatient();\r\n }\r\n\r\n if (isReconstructable.missingFrames) {\r\n // TODO -> This is currently unused, but may be used for reconstructing\r\n // Volumes with gaps later on.\r\n imageSet.missingFrames = isReconstructable.missingFrames;\r\n }\r\n\r\n // Mod by Triet\r\n //Get calculated spacings between slices in the set\r\n const calculatedSpacings = getImageSetCalculatedSpacings(instances);\r\n imageSet.calculatedSpacings = calculatedSpacings;\r\n // console.log('Make Displayset', imageSet);\r\n\r\n return imageSet;\r\n};\r\n\r\nconst isSingleImageModality = (Modality) => {\r\n return Modality === 'CR' || Modality === 'MG' || Modality === 'DX';\r\n};\r\n\r\nfunction getSopClassUIDs(series) {\r\n const uniqueSopClassUIDsInSeries = new Set();\r\n series.forEachInstance((instance) => {\r\n const instanceSopClassUID = instance.getTagValue('SOPClassUID');\r\n\r\n uniqueSopClassUIDsInSeries.add(instanceSopClassUID);\r\n });\r\n const sopClassUIDs = Array.from(uniqueSopClassUIDsInSeries);\r\n\r\n return sopClassUIDs;\r\n}\r\n\r\n/**\r\n * @private\r\n * @param {SeriesMetadata} series\r\n * @param {StudyMetadata} study\r\n * @param {string[]} sopClassUIDs\r\n */\r\nfunction _getDisplaySetFromSopClassModule(\r\n sopClassHandlerExtensions, // TODO: Update Usage\r\n series,\r\n study,\r\n sopClassUIDs\r\n) {\r\n // TODO: For now only use the plugins if all instances have the same SOPClassUID\r\n if (sopClassUIDs.length !== 1) {\r\n console.warn('getDisplaySetFromSopClassPlugin: More than one SOPClassUID in the same series is not yet supported.');\r\n return;\r\n }\r\n\r\n const SOPClassUID = sopClassUIDs[0];\r\n const sopClassHandlerModules = sopClassHandlerExtensions.map((extension) => {\r\n return extension.module;\r\n });\r\n\r\n const handlersForSopClassUID = sopClassHandlerModules.filter((module) => {\r\n return module.sopClassUIDs.includes(SOPClassUID);\r\n });\r\n\r\n // TODO: Sort by something, so we can determine which plugin to use\r\n if (!handlersForSopClassUID || !handlersForSopClassUID.length) {\r\n return;\r\n }\r\n\r\n const plugin = handlersForSopClassUID[0];\r\n const headers = DICOMWeb.getAuthorizationHeader();\r\n const errorInterceptor = errorHandler.getHTTPErrorHandler();\r\n const dicomWebClient = new dwc({\r\n url: study.getData().wadoRoot,\r\n headers,\r\n errorInterceptor\r\n });\r\n\r\n let displaySet = plugin.getDisplaySetFromSeries(series, study, dicomWebClient, headers);\r\n if (displaySet && !displaySet.Modality) {\r\n const instance = series.getFirstInstance();\r\n displaySet.Modality = instance.getTagValue('Modality');\r\n }\r\n return displaySet;\r\n}\r\n\r\n/**\r\n * Sort series primarily by Modality (i.e., series with references to other\r\n * series like SEG, KO or PR are grouped in the end of the list) and then by\r\n * series number:\r\n *\r\n * --------\r\n * | CT #3 |\r\n * | CT #4 |\r\n * | CT #5 |\r\n * --------\r\n * | SEG #1 |\r\n * | SEG #2 |\r\n * --------\r\n *\r\n * @param {*} a - DisplaySet\r\n * @param {*} b - DisplaySet\r\n */\r\n\r\nfunction seriesSortingCriteria(a, b) {\r\n const isLowPriorityA = isLowPriorityModality(a.Modality);\r\n const isLowPriorityB = isLowPriorityModality(b.Modality);\r\n if (!isLowPriorityA && isLowPriorityB) {\r\n return -1;\r\n }\r\n if (isLowPriorityA && !isLowPriorityB) {\r\n return 1;\r\n }\r\n return sortBySeriesNumber(a, b);\r\n}\r\n\r\n/**\r\n * Sort series by series number. Series with low\r\n * @param {*} a - DisplaySet\r\n * @param {*} b - DisplaySet\r\n */\r\nfunction sortBySeriesNumber(a, b) {\r\n const seriesNumberAIsGreaterOrUndefined = a.SeriesNumber > b.SeriesNumber || (!a.SeriesNumber && b.SeriesNumber);\r\n\r\n return seriesNumberAIsGreaterOrUndefined ? 1 : -1;\r\n}\r\n\r\n/**\r\n * Sorts a list of display set objects\r\n * @param {Array} list A list of display sets to be sorted\r\n */\r\nfunction sortDisplaySetList(list) {\r\n return list.sort(seriesSortingCriteria);\r\n}\r\n","export function getCornerstoneWADOImageLoader() {\r\n return import(\r\n /* webpackChunkName: \"CornerstoneWADOImageLoader\" */ 'cornerstone-wado-image-loader'\r\n );\r\n}\r\n","function getWADORSImageUrl(instance, frame) {\r\n let wadorsuri = instance.wadorsuri;\r\n\r\n if (!wadorsuri) {\r\n return;\r\n }\r\n\r\n // Use null to obtain an imageId which represents the instance\r\n if (frame === null) {\r\n wadorsuri = wadorsuri.replace(/frames\\/(\\d+)/, '');\r\n } else {\r\n // We need to sum 1 because WADO-RS frame number is 1-based\r\n frame = frame ? parseInt(frame) + 1 : 1;\r\n\r\n // Replaces /frame/1 by /frame/{frame}\r\n wadorsuri = wadorsuri.replace(/frames\\/(\\d+)/, `frames/${frame}`);\r\n }\r\n\r\n return wadorsuri;\r\n}\r\n\r\n/**\r\n * Obtain an imageId for Cornerstone based on the WADO-RS scheme\r\n *\r\n * @param {object} instanceMetada metadata object (InstanceMetadata)\r\n * @param {(string\\|number)} [frame] the frame number\r\n * @returns {string} The imageId to be used by Cornerstone\r\n */\r\nexport default function getWADORSImageId(instance, frame) {\r\n const uri = getWADORSImageUrl(instance, frame);\r\n\r\n if (!uri) {\r\n return;\r\n }\r\n\r\n return `wadors:${uri}`;\r\n}\r\n","import getWADORSImageId from './getWADORSImageId';\r\n\r\n// https://stackoverflow.com/a/6021027/3895126\r\nfunction updateQueryStringParameter(uri, key, value) {\r\n const regex = new RegExp('([?&])' + key + '=.*?(&|$)', 'i');\r\n const separator = uri.indexOf('?') !== -1 ? '&' : '?';\r\n if (uri.match(regex)) {\r\n return uri.replace(regex, '$1' + key + '=' + value + '$2');\r\n } \r\n return uri + separator + key + '=' + value;\r\n \r\n}\r\n\r\n/**\r\n * Obtain an imageId for Cornerstone from an image instance\r\n *\r\n * @param instance\r\n * @param frame\r\n * @param thumbnail\r\n * @returns {string} The imageId to be used by Cornerstone\r\n */\r\nexport default function getImageId(instance, frame, thumbnail = false) {\r\n if (!instance) {\r\n return;\r\n }\r\n\r\n if (typeof instance.getImageId === 'function') {\r\n return instance.getImageId();\r\n }\r\n\r\n if (instance.url) {\r\n if (frame !== undefined) {\r\n instance.url = updateQueryStringParameter(instance.url, 'frame', frame);\r\n }\r\n\r\n return instance.url;\r\n }\r\n\r\n const renderingAttr = thumbnail ? 'thumbnailRendering' : 'imageRendering';\r\n\r\n if (\r\n !instance[renderingAttr] ||\r\n instance[renderingAttr] === 'wadouri' ||\r\n !instance.wadorsuri\r\n ) {\r\n let imageId = 'dicomweb:' + instance.wadouri;\r\n if (frame !== undefined) {\r\n imageId += '&frame=' + frame;\r\n }\r\n\r\n return imageId;\r\n } \r\n return getWADORSImageId(instance, frame, thumbnail); // WADO-RS Retrieve Frame\r\n \r\n}\r\n","/**\r\n * Convert String to ArrayBuffer\r\n *\r\n * @param {String} str Input String\r\n * @return {ArrayBuffer} Output converted ArrayBuffer\r\n */\r\nexport default function str2ab(str) {\r\n const strLen = str.length;\r\n const bytes = new Uint8Array(strLen);\r\n\r\n for (let i = 0; i < strLen; i++) {\r\n bytes[i] = str.charCodeAt(i);\r\n }\r\n\r\n return bytes.buffer;\r\n}\r\n","import {api} from 'dicomweb-client';\r\nimport DICOMWeb from '../../DICOMWeb';\r\nimport str2ab from '../str2ab';\r\n\r\nexport default async function fetchPaletteColorLookupTableData(\r\n instance,\r\n server\r\n) {\r\n const {\r\n PaletteColorLookupTableUID,\r\n RedPaletteColorLookupTableDescriptor,\r\n GreenPaletteColorLookupTableDescriptor,\r\n BluePaletteColorLookupTableDescriptor,\r\n RedPaletteColorLookupTableData,\r\n GreenPaletteColorLookupTableData,\r\n BluePaletteColorLookupTableData\r\n } = instance;\r\n\r\n return new Promise((resolve) => {\r\n let entry;\r\n if (_paletteColorCache.isValidUID(PaletteColorLookupTableUID)) {\r\n entry = _paletteColorCache.get(PaletteColorLookupTableUID);\r\n\r\n if (entry) {\r\n return resolve(entry);\r\n }\r\n }\r\n\r\n // no entry in cache... Fetch remote data.\r\n const promises = [\r\n _getPaletteColor(\r\n server,\r\n RedPaletteColorLookupTableData,\r\n RedPaletteColorLookupTableDescriptor\r\n ),\r\n _getPaletteColor(\r\n server,\r\n GreenPaletteColorLookupTableData,\r\n GreenPaletteColorLookupTableDescriptor\r\n ),\r\n _getPaletteColor(\r\n server,\r\n BluePaletteColorLookupTableData,\r\n BluePaletteColorLookupTableDescriptor\r\n )\r\n ];\r\n\r\n Promise.all(promises).then(\r\n ([\r\n RedPaletteColorLookupTableData,\r\n GreenPaletteColorLookupTableData,\r\n BluePaletteColorLookupTableData\r\n ]) => {\r\n // when PaletteColorLookupTableUID is present, the entry can be cached...\r\n _paletteColorCache.add({\r\n RedPaletteColorLookupTableData,\r\n GreenPaletteColorLookupTableData,\r\n BluePaletteColorLookupTableData,\r\n PaletteColorLookupTableUID\r\n });\r\n\r\n instance.RedPaletteColorLookupTableData = RedPaletteColorLookupTableData;\r\n instance.GreenPaletteColorLookupTableData = GreenPaletteColorLookupTableData;\r\n instance.BluePaletteColorLookupTableData = BluePaletteColorLookupTableData;\r\n\r\n resolve();\r\n }\r\n );\r\n });\r\n}\r\n\r\n/**\r\n * Simple cache schema for retrieved color palettes.\r\n */\r\nconst _paletteColorCache = {\r\n count: 0,\r\n maxAge: 24 * 60 * 60 * 1000, // 24h cache?\r\n entries: {},\r\n isValidUID: function(PaletteColorLookupTableUID) {\r\n return (\r\n typeof PaletteColorLookupTableUID === 'string' &&\r\n PaletteColorLookupTableUID.length > 0\r\n );\r\n },\r\n get: function(PaletteColorLookupTableUID) {\r\n let entry = null;\r\n if (Object.prototype.hasOwnProperty.call(this.entries, PaletteColorLookupTableUID)) {\r\n entry = this.entries[PaletteColorLookupTableUID];\r\n // check how the entry is...\r\n if (Date.now() - entry.time > this.maxAge) {\r\n // entry is too old... remove entry.\r\n delete this.entries[PaletteColorLookupTableUID];\r\n this.count--;\r\n entry = null;\r\n }\r\n }\r\n return entry;\r\n },\r\n add: function(entry) {\r\n if (this.isValidUID(entry.uid)) {\r\n let PaletteColorLookupTableUID = entry.uid;\r\n if (Object.prototype.hasOwnProperty.call(this.entries, PaletteColorLookupTableUID) !== true) {\r\n this.count++; // increment cache entry count...\r\n }\r\n entry.time = Date.now();\r\n this.entries[PaletteColorLookupTableUID] = entry;\r\n // @TODO: Add logic to get rid of old entries and reduce memory usage...\r\n }\r\n }\r\n};\r\n\r\nfunction _getPaletteColor(server, paletteColorLookupTableData, lutDescriptor) {\r\n const numLutEntries = lutDescriptor[0];\r\n const bits = lutDescriptor[2];\r\n\r\n const readUInt16 = (byteArray, position) => {\r\n return byteArray[position] + byteArray[position + 1] * 256;\r\n };\r\n\r\n const arrayBufferToPaletteColorLUT = (arraybuffer) => {\r\n const byteArray = new Uint8Array(arraybuffer);\r\n const lut = [];\r\n\r\n if (bits === 16) {\r\n for (let i = 0; i < numLutEntries; i++) {\r\n lut[i] = readUInt16(byteArray, i * 2);\r\n }\r\n } else {\r\n for (let i = 0; i < numLutEntries; i++) {\r\n lut[i] = byteArray[i];\r\n }\r\n }\r\n\r\n return lut;\r\n };\r\n\r\n if (paletteColorLookupTableData.BulkDataURI) {\r\n let uri = paletteColorLookupTableData.BulkDataURI;\r\n\r\n // TODO: Workaround for dcm4chee behind SSL-terminating proxy returning\r\n // incorrect bulk data URIs\r\n if (server.wadoRoot.indexOf('https') === 0 && !uri.includes('https')) {\r\n uri = uri.replace('http', 'https');\r\n }\r\n\r\n const config = {\r\n url: server.wadoRoot, //BulkDataURI is absolute, so this isn't used\r\n headers: DICOMWeb.getAuthorizationHeader(server)\r\n };\r\n const dicomWeb = new api.DICOMwebClient(config);\r\n const options = {\r\n BulkDataURI: uri\r\n };\r\n\r\n return dicomWeb\r\n .retrieveBulkData(options)\r\n .then((result) => result[0])\r\n .then(arrayBufferToPaletteColorLUT);\r\n } else if (paletteColorLookupTableData.InlineBinary) {\r\n const inlineBinaryData = atob(paletteColorLookupTableData.InlineBinary);\r\n const arraybuffer = str2ab(inlineBinaryData);\r\n\r\n return new Promise((resolve) => {\r\n resolve(arrayBufferToPaletteColorLUT(arraybuffer));\r\n });\r\n } \r\n return Promise.resolve(arrayBufferToPaletteColorLUT(paletteColorLookupTableData));\r\n \r\n}\r\n","export default function unpackOverlay(arrayBuffer) {\r\n const bitArray = new Uint8Array(arrayBuffer);\r\n const byteArray = new Uint8Array(8 * bitArray.length);\r\n\r\n for (let byteIndex = 0; byteIndex < byteArray.length; byteIndex++) {\r\n const bitIndex = byteIndex % 8;\r\n const bitByteIndex = Math.floor(byteIndex / 8);\r\n byteArray[byteIndex] =\r\n 1 * ((bitArray[bitByteIndex] & (1 << bitIndex)) >> bitIndex);\r\n }\r\n\r\n return byteArray;\r\n}\r\n","import {api} from 'dicomweb-client';\r\nimport DICOMWeb from '../../DICOMWeb';\r\nimport str2ab from '../str2ab';\r\nimport unpackOverlay from './unpackOverlay';\r\n\r\nexport default async function fetchOverlayData(instance, server) {\r\n const OverlayDataPromises = [];\r\n const OverlayDataTags = [];\r\n\r\n return new Promise((resolve) => {\r\n for (let overlayGroup = 0x00; overlayGroup <= 0x1e; overlayGroup += 0x02) {\r\n let groupStr = `60${overlayGroup.toString(16)}`;\r\n\r\n if (groupStr.length === 3) {\r\n groupStr = `600${overlayGroup.toString(16)}`;\r\n }\r\n\r\n const OverlayDataTag = `${groupStr}3000`;\r\n\r\n if (instance[OverlayDataTag] && instance[OverlayDataTag].InlineBinary) {\r\n const inlineBinaryData = atob(instance[OverlayDataTag].InlineBinary);\r\n const arraybuffer = str2ab(inlineBinaryData);\r\n\r\n instance[OverlayDataTag] = unpackOverlay(arraybuffer);\r\n } else if (instance[OverlayDataTag] && instance[OverlayDataTag].BulkDataURI) {\r\n OverlayDataPromises.push(\r\n _getOverlayData(instance[OverlayDataTag], server)\r\n );\r\n OverlayDataTags.push(OverlayDataTag);\r\n } else if (instance[OverlayDataTag] && instance[OverlayDataTag] instanceof ArrayBuffer) {\r\n instance[OverlayDataTag] = unpackOverlay(instance[OverlayDataTag]);\r\n }\r\n }\r\n\r\n if (OverlayDataPromises.length) {\r\n Promise.all(OverlayDataPromises).then((results) => {\r\n for (let i = 0; i < results.length; i++) {\r\n instance[OverlayDataTags[i]] = results[i];\r\n }\r\n\r\n resolve();\r\n });\r\n } else {\r\n resolve();\r\n }\r\n });\r\n}\r\n\r\nasync function _getOverlayData(tag, server) {\r\n const {BulkDataURI} = tag;\r\n\r\n let uri = BulkDataURI.slice(BulkDataURI.indexOf('/studies'), BulkDataURI.length);\r\n // replace BulkDataURI with correct host\r\n \r\n // TODO: Workaround for dcm4chee behind SSL-terminating proxy returning\r\n // incorrect bulk data URIs\r\n if (server.wadoRoot.indexOf('https') === 0 && !uri.includes('https')) {\r\n uri = uri.replace('http', 'https');\r\n }\r\n\r\n const config = {\r\n url: server.wadoRoot, //BulkDataURI is absolute, so this isn't used\r\n headers: DICOMWeb.getAuthorizationHeader(server)\r\n };\r\n const dicomWeb = new api.DICOMwebClient(config);\r\n const options = {\r\n BulkDataURI: `${server.wadoRoot}${uri}`\r\n };\r\n\r\n return dicomWeb\r\n .retrieveBulkData(options)\r\n .then((result) => result[0])\r\n .then(unpackOverlay);\r\n}\r\n\r\n\r\n","import * as dcmjs from 'dcmjs';\r\nimport queryString from 'query-string';\r\nimport dicomParser from 'dicom-parser';\r\nimport getPixelSpacingInformation from '../utils/metadataProvider/getPixelSpacingInformation';\r\nimport fetchPaletteColorLookupTableData from '../utils/metadataProvider/fetchPaletteColorLookupTableData';\r\nimport fetchOverlayData from '../utils/metadataProvider/fetchOverlayData';\r\n\r\nclass MetadataProvider {\r\n constructor() {\r\n // Define the main \"metadataLookup\" private property as an immutable property.\r\n Object.defineProperty(this, 'studies', {\r\n configurable: false,\r\n enumerable: false,\r\n writable: false,\r\n value: new Map()\r\n });\r\n Object.defineProperty(this, 'imageIdToUIDs', {\r\n configurable: false,\r\n enumerable: false,\r\n writable: false,\r\n value: new Map()\r\n });\r\n }\r\n\r\n async addInstance(dicomJSONDatasetOrP10ArrayBuffer, options = {}) {\r\n let dicomJSONDataset;\r\n\r\n // If Arraybuffer, parse to DICOMJSON before naturalizing.\r\n if (dicomJSONDatasetOrP10ArrayBuffer instanceof ArrayBuffer) {\r\n const dicomData = dcmjs.data.DicomMessage.readFile(dicomJSONDatasetOrP10ArrayBuffer);\r\n\r\n dicomJSONDataset = dicomData.dict;\r\n } else {\r\n dicomJSONDataset = dicomJSONDatasetOrP10ArrayBuffer;\r\n }\r\n\r\n // Check if dataset is already naturalized.\r\n\r\n let naturalizedDataset;\r\n\r\n if (dicomJSONDataset['SeriesInstanceUID'] === undefined) {\r\n naturalizedDataset = dcmjs.data.DicomMetaDictionary.naturalizeDataset(\r\n dicomJSONDataset\r\n );\r\n } else {\r\n naturalizedDataset = dicomJSONDataset;\r\n }\r\n\r\n // fix for iTech protocol\r\n if (options.StudyInstanceUID) naturalizedDataset.StudyInstanceUID = options.StudyInstanceUID;\r\n\r\n const {\r\n StudyInstanceUID,\r\n SeriesInstanceUID,\r\n SOPInstanceUID\r\n } = naturalizedDataset;\r\n\r\n const study = this._getAndCacheStudy(StudyInstanceUID);\r\n const series = this._getAndCacheSeriesFromStudy(study, SeriesInstanceUID);\r\n const instance = this._getAndCacheInstanceFromStudy(series, SOPInstanceUID);\r\n\r\n Object.assign(instance, naturalizedDataset);\r\n\r\n // TODO: comment by TungLT\r\n // Mod by Triet\r\n // uncomment to enable image overlay\r\n if (options.server) {\r\n await this._checkBulkDataAndInlineBinaries(instance, options.server);\r\n }\r\n\r\n return instance;\r\n }\r\n\r\n addImageIdToUIDs(imageId, uids) {\r\n // This method is a fallback for when you don't have WADO-URI or WADO-RS.\r\n // You can add instances fetched by any method by calling addInstance, and hook an imageId to point at it here.\r\n // An example would be dicom hosted at some random site.\r\n\r\n this.imageIdToUIDs.set(imageId, uids);\r\n }\r\n\r\n _getAndCacheStudy(StudyInstanceUID) {\r\n const studies = this.studies;\r\n\r\n let study = studies.get(StudyInstanceUID);\r\n\r\n if (!study) {\r\n study = {series: new Map()};\r\n studies.set(StudyInstanceUID, study);\r\n }\r\n\r\n return study;\r\n }\r\n\r\n _getAndCacheSeriesFromStudy(study, SeriesInstanceUID) {\r\n let series = study.series.get(SeriesInstanceUID);\r\n\r\n if (!series) {\r\n series = {instances: new Map()};\r\n study.series.set(SeriesInstanceUID, series);\r\n }\r\n\r\n return series;\r\n }\r\n\r\n _getAndCacheInstanceFromStudy(series, SOPInstanceUID) {\r\n let instance = series.instances.get(SOPInstanceUID);\r\n\r\n if (!instance) {\r\n instance = {};\r\n series.instances.set(SOPInstanceUID, instance);\r\n }\r\n\r\n return instance;\r\n }\r\n\r\n async _checkBulkDataAndInlineBinaries(instance, server) {\r\n await fetchOverlayData(instance, server);\r\n\r\n if (instance.PhotometricInterpretation === 'PALETTE COLOR') {\r\n await fetchPaletteColorLookupTableData(instance, server);\r\n }\r\n }\r\n\r\n _getInstance(imageId) {\r\n const uids = this._getUIDsFromImageID(imageId);\r\n\r\n if (!uids) {\r\n return;\r\n }\r\n\r\n const {StudyInstanceUID, SeriesInstanceUID, SOPInstanceUID} = uids;\r\n\r\n return this._getInstanceData(\r\n StudyInstanceUID,\r\n SeriesInstanceUID,\r\n SOPInstanceUID\r\n );\r\n }\r\n\r\n get(query, imageId, options = {fallback: false}) {\r\n const instance = this._getInstance(imageId);\r\n\r\n if (query === INSTANCE) {\r\n return instance;\r\n }\r\n\r\n return this.getTagFromInstance(query, instance, options);\r\n }\r\n\r\n getTag(query, imageId, options) {\r\n return this.get(query, imageId, options);\r\n }\r\n\r\n getInstance(imageId) {\r\n return this.get(INSTANCE, imageId);\r\n }\r\n\r\n getTagFromInstance(\r\n naturalizedTagOrWADOImageLoaderTag,\r\n instance\r\n ) {\r\n if (!instance) {\r\n return;\r\n }\r\n\r\n // If its a naturalized dcmjs tag present on the instance, return.\r\n if (instance[naturalizedTagOrWADOImageLoaderTag]) {\r\n return instance[naturalizedTagOrWADOImageLoaderTag];\r\n }\r\n\r\n // Maybe its a legacy CornerstoneWADOImageLoader tag then:\r\n return this._getCornerstoneWADOImageLoaderTag(\r\n naturalizedTagOrWADOImageLoaderTag,\r\n instance\r\n );\r\n }\r\n\r\n _getCornerstoneWADOImageLoaderTag(wadoImageLoaderTag, instance) {\r\n let metadata;\r\n\r\n switch (wadoImageLoaderTag) {\r\n case WADO_IMAGE_LOADER_TAGS.GENERAL_SERIES_MODULE:\r\n const {SeriesDate, SeriesTime} = instance;\r\n\r\n let seriesDate;\r\n let seriesTime;\r\n\r\n if (SeriesDate) {\r\n seriesDate = dicomParser.parseDA(SeriesDate);\r\n }\r\n\r\n if (SeriesTime) {\r\n seriesTime = dicomParser.parseTM(SeriesTime);\r\n }\r\n\r\n metadata = {\r\n modality: instance.Modality,\r\n seriesInstanceUID: instance.SeriesInstanceUID,\r\n seriesNumber: instance.SeriesNumber,\r\n studyInstanceUID: instance.StudyInstanceUID,\r\n seriesDate,\r\n seriesTime,\r\n seriesDescription: instance.SeriesDescription\r\n };\r\n break;\r\n case WADO_IMAGE_LOADER_TAGS.PATIENT_STUDY_MODULE:\r\n metadata = {\r\n patientAge: instance.PatientAge,\r\n patientSize: instance.PatientSize,\r\n patientWeight: instance.PatientWeight\r\n };\r\n break;\r\n case WADO_IMAGE_LOADER_TAGS.IMAGE_PLANE_MODULE:\r\n const {ImageOrientationPatient} = instance;\r\n\r\n // Fallback for DX images.\r\n // TODO: We should use the rest of the results of this function\r\n // to update the UI somehow\r\n const {PixelSpacing} = getPixelSpacingInformation(instance);\r\n\r\n let rowPixelSpacing;\r\n let columnPixelSpacing;\r\n\r\n let rowCosines;\r\n let columnCosines;\r\n\r\n if (PixelSpacing) {\r\n rowPixelSpacing = PixelSpacing[0];\r\n columnPixelSpacing = PixelSpacing[1];\r\n }\r\n\r\n if (ImageOrientationPatient) {\r\n rowCosines = ImageOrientationPatient.slice(0, 3);\r\n columnCosines = ImageOrientationPatient.slice(3, 6);\r\n }\r\n\r\n metadata = {\r\n frameOfReferenceUID: instance.FrameOfReferenceUID,\r\n rows: instance.Rows,\r\n columns: instance.Columns,\r\n imageOrientationPatient: ImageOrientationPatient,\r\n rowCosines,\r\n columnCosines,\r\n imagePositionPatient: instance.ImagePositionPatient,\r\n sliceThickness: instance.SliceThickness,\r\n sliceLocation: instance.SliceLocation,\r\n pixelSpacing: PixelSpacing,\r\n rowPixelSpacing,\r\n columnPixelSpacing\r\n };\r\n break;\r\n case WADO_IMAGE_LOADER_TAGS.IMAGE_PIXEL_MODULE:\r\n metadata = {\r\n samplesPerPixel: instance.SamplesPerPixel,\r\n photometricInterpretation: instance.PhotometricInterpretation,\r\n rows: instance.Rows,\r\n columns: instance.Columns,\r\n bitsAllocated: instance.BitsAllocated,\r\n bitsStored: instance.BitsStored,\r\n highBit: instance.HighBit,\r\n pixelRepresentation: instance.PixelRepresentation,\r\n planarConfiguration: instance.PlanarConfiguration,\r\n pixelAspectRatio: instance.PixelAspectRatio,\r\n smallestPixelValue: instance.SmallestPixelValue,\r\n largestPixelValue: instance.LargestPixelValue,\r\n redPaletteColorLookupTableDescriptor:\r\n instance.RedPaletteColorLookupTableDescriptor,\r\n greenPaletteColorLookupTableDescriptor:\r\n instance.GreenPaletteColorLookupTableDescriptor,\r\n bluePaletteColorLookupTableDescriptor:\r\n instance.BluePaletteColorLookupTableDescriptor,\r\n redPaletteColorLookupTableData:\r\n instance.RedPaletteColorLookupTableData,\r\n greenPaletteColorLookupTableData:\r\n instance.GreenPaletteColorLookupTableData,\r\n bluePaletteColorLookupTableData:\r\n instance.BluePaletteColorLookupTableData\r\n };\r\n\r\n break;\r\n case WADO_IMAGE_LOADER_TAGS.VOI_LUT_MODULE:\r\n const {WindowCenter, WindowWidth} = instance;\r\n\r\n const windowCenter = Array.isArray(WindowCenter)\r\n ? WindowCenter\r\n : [WindowCenter];\r\n const windowWidth = Array.isArray(WindowWidth)\r\n ? WindowWidth\r\n : [WindowWidth];\r\n\r\n metadata = {\r\n windowCenter,\r\n windowWidth\r\n };\r\n\r\n break;\r\n case WADO_IMAGE_LOADER_TAGS.MODALITY_LUT_MODULE:\r\n metadata = {\r\n rescaleIntercept: instance.RescaleIntercept,\r\n rescaleSlope: instance.RescaleSlope,\r\n rescaleType: instance.RescaleType\r\n };\r\n break;\r\n case WADO_IMAGE_LOADER_TAGS.SOP_COMMON_MODULE:\r\n metadata = {\r\n sopClassUID: instance.SOPClassUID,\r\n sopInstanceUID: instance.SOPInstanceUID\r\n };\r\n break;\r\n case WADO_IMAGE_LOADER_TAGS.PET_ISOTOPE_MODULE:\r\n const {RadiopharmaceuticalInformationSequence} = instance;\r\n\r\n if (RadiopharmaceuticalInformationSequence) {\r\n const RadiopharmaceuticalInformation = Array.isArray(\r\n RadiopharmaceuticalInformationSequence\r\n )\r\n ? RadiopharmaceuticalInformationSequence[0]\r\n : RadiopharmaceuticalInformationSequence;\r\n\r\n const {\r\n RadiopharmaceuticalStartTime,\r\n RadionuclideTotalDose,\r\n RadionuclideHalfLife\r\n } = RadiopharmaceuticalInformation;\r\n\r\n const radiopharmaceuticalInfo = {\r\n radiopharmaceuticalStartTime: dicomParser.parseTM(\r\n RadiopharmaceuticalStartTime\r\n ),\r\n radionuclideTotalDose: RadionuclideTotalDose,\r\n radionuclideHalfLife: RadionuclideHalfLife\r\n };\r\n metadata = {\r\n radiopharmaceuticalInfo\r\n };\r\n }\r\n\r\n break;\r\n case WADO_IMAGE_LOADER_TAGS.OVERLAY_PLANE_MODULE:\r\n const overlays = [];\r\n for (\r\n let overlayGroup = 0x00;\r\n overlayGroup <= 0x1e;\r\n overlayGroup += 0x02\r\n ) {\r\n let groupStr = `60${overlayGroup.toString(16)}`;\r\n\r\n if (groupStr.length === 3) {\r\n groupStr = `600${overlayGroup.toString(16)}`;\r\n }\r\n\r\n const OverlayDataTag = `${groupStr}3000`;\r\n const OverlayData = instance[OverlayDataTag];\r\n\r\n if (!OverlayData) {\r\n continue;\r\n }\r\n\r\n const OverlayRowsTag = `${groupStr}0010`;\r\n const OverlayColumnsTag = `${groupStr}0011`;\r\n const OverlayType = `${groupStr}0040`;\r\n const OverlayOriginTag = `${groupStr}0050`;\r\n const OverlayDescriptionTag = `${groupStr}0022`;\r\n const OverlayLabelTag = `${groupStr}1500`;\r\n const ROIAreaTag = `${groupStr}1301`;\r\n const ROIMeanTag = `${groupStr}1302`;\r\n const ROIStandardDeviationTag = `${groupStr}1303`;\r\n const OverlayOrigin = instance[OverlayOriginTag];\r\n\r\n const overlay = {\r\n rows: instance[OverlayRowsTag],\r\n columns: instance[OverlayColumnsTag],\r\n type: instance[OverlayType],\r\n x: OverlayOrigin[0],\r\n y: OverlayOrigin[1],\r\n pixelData: OverlayData,\r\n description: instance[OverlayDescriptionTag],\r\n label: instance[OverlayLabelTag],\r\n roiArea: instance[ROIAreaTag],\r\n roiMean: instance[ROIMeanTag],\r\n roiStandardDeviation: instance[ROIStandardDeviationTag],\r\n };\r\n\r\n overlays.push(overlay);\r\n }\r\n\r\n metadata = {\r\n overlays\r\n };\r\n\r\n break;\r\n\r\n case WADO_IMAGE_LOADER_TAGS.PATIENT_MODULE:\r\n const {PatientName} = instance;\r\n\r\n let patientName;\r\n if (PatientName) {\r\n patientName = PatientName.Alphabetic;\r\n }\r\n\r\n metadata = {\r\n patientName,\r\n patientId: instance.PatientID\r\n };\r\n\r\n break;\r\n\r\n case WADO_IMAGE_LOADER_TAGS.GENERAL_IMAGE_MODULE:\r\n metadata = {\r\n instanceNumber: instance.InstanceNumber,\r\n lossyImageCompression: instance.LossyImageCompression,\r\n lossyImageCompressionRatio: instance.LossyImageCompressionRatio,\r\n lossyImageCompressionMethod: instance.LossyImageCompressionMethod\r\n };\r\n\r\n break;\r\n case WADO_IMAGE_LOADER_TAGS.GENERAL_STUDY_MODULE:\r\n metadata = {\r\n studyDescription: instance.StudyDescription,\r\n studyDate: instance.StudyDate,\r\n studyTime: instance.StudyTime,\r\n accessionNumber: instance.AccessionNumber\r\n };\r\n\r\n break;\r\n case WADO_IMAGE_LOADER_TAGS.CINE_MODULE:\r\n metadata = {\r\n frameTime: instance.FrameTime\r\n };\r\n\r\n break;\r\n }\r\n\r\n return metadata;\r\n }\r\n\r\n _getInstanceData(StudyInstanceUID, SeriesInstanceUID, SOPInstanceUID) {\r\n const study = this.studies.get(StudyInstanceUID);\r\n\r\n if (!study) {\r\n return;\r\n }\r\n\r\n const series = study.series.get(SeriesInstanceUID);\r\n\r\n if (!series) {\r\n return;\r\n }\r\n\r\n const instance = series.instances.get(SOPInstanceUID);\r\n\r\n return instance;\r\n }\r\n\r\n _getUIDsFromImageID(imageId) {\r\n if (imageId.includes('wadors:')) {\r\n const strippedImageId = imageId.split('studies/')[1];\r\n const splitImageId = strippedImageId.split('/');\r\n\r\n return {\r\n StudyInstanceUID: splitImageId[0], // Note: splitImageId[1] === 'series'\r\n SeriesInstanceUID: splitImageId[2], // Note: splitImageId[3] === 'instances'\r\n SOPInstanceUID: splitImageId[4]\r\n };\r\n }\r\n if (imageId.includes('wado?requestType=WADO')) {\r\n const qs = queryString.parse(imageId);\r\n\r\n return {\r\n StudyInstanceUID: qs.studyUID,\r\n SeriesInstanceUID: qs.seriesUID,\r\n SOPInstanceUID: qs.objectUID\r\n };\r\n } \r\n // Maybe its a non-standard imageId\r\n return this.imageIdToUIDs.get(imageId);\r\n \r\n }\r\n}\r\n\r\nconst metadataProvider = new MetadataProvider();\r\n\r\nexport default metadataProvider;\r\n\r\nconst WADO_IMAGE_LOADER_TAGS = {\r\n // CornerstoneWADOImageLoader specific\r\n GENERAL_SERIES_MODULE: 'generalSeriesModule',\r\n PATIENT_STUDY_MODULE: 'patientStudyModule',\r\n IMAGE_PLANE_MODULE: 'imagePlaneModule',\r\n IMAGE_PIXEL_MODULE: 'imagePixelModule',\r\n VOI_LUT_MODULE: 'voiLutModule',\r\n MODALITY_LUT_MODULE: 'modalityLutModule',\r\n SOP_COMMON_MODULE: 'sopCommonModule',\r\n PET_ISOTOPE_MODULE: 'petIsotopeModule',\r\n OVERLAY_PLANE_MODULE: 'overlayPlaneModule',\r\n\r\n // react-cornerstone-viewport specifc\r\n PATIENT_MODULE: 'patientModule',\r\n GENERAL_IMAGE_MODULE: 'generalImageModule',\r\n GENERAL_STUDY_MODULE: 'generalStudyModule',\r\n CINE_MODULE: 'cineModule'\r\n};\r\n\r\nconst INSTANCE = 'instance';\r\n","import log from '../../log';\r\n\r\nexport default function getPixelSpacingInformation(instance) {\r\n // See http://gdcm.sourceforge.net/wiki/index.php/Imager_Pixel_Spacing\r\n\r\n // TODO: Add Ultrasound region spacing\r\n // TODO: Add manual calibration\r\n\r\n // TODO: Use ENUMS from dcmjs\r\n const projectionRadiographSOPClassUIDs = [\r\n '1.2.840.10008.5.1.4.1.1.1', //\tCR Image Storage\r\n '1.2.840.10008.5.1.4.1.1.1.1', //\tDigital X-Ray Image Storage – for Presentation\r\n '1.2.840.10008.5.1.4.1.1.1.1.1', //\tDigital X-Ray Image Storage – for Processing\r\n '1.2.840.10008.5.1.4.1.1.1.2', //\tDigital Mammography X-Ray Image Storage – for Presentation\r\n '1.2.840.10008.5.1.4.1.1.1.2.1', //\tDigital Mammography X-Ray Image Storage – for Processing\r\n '1.2.840.10008.5.1.4.1.1.1.3', //\tDigital Intra – oral X-Ray Image Storage – for Presentation\r\n '1.2.840.10008.5.1.4.1.1.1.3.1', //\tDigital Intra – oral X-Ray Image Storage – for Processing\r\n '1.2.840.10008.5.1.4.1.1.12.1', //\tX-Ray Angiographic Image Storage\r\n '1.2.840.10008.5.1.4.1.1.12.1.1', //\tEnhanced XA Image Storage\r\n '1.2.840.10008.5.1.4.1.1.12.2', //\tX-Ray Radiofluoroscopic Image Storage\r\n '1.2.840.10008.5.1.4.1.1.12.2.1', //\tEnhanced XRF Image Storage\r\n '1.2.840.10008.5.1.4.1.1.12.3' // X-Ray Angiographic Bi-plane Image Storage\tRetired\r\n ];\r\n\r\n const {\r\n PixelSpacing,\r\n ImagerPixelSpacing,\r\n SOPClassUID,\r\n PixelSpacingCalibrationType,\r\n PixelSpacingCalibrationDescription,\r\n EstimatedRadiographicMagnificationFactor,\r\n SequenceOfUltrasoundRegions\r\n } = instance;\r\n const isProjection = projectionRadiographSOPClassUIDs.includes(SOPClassUID);\r\n\r\n const TYPES = {\r\n NOT_APPLICABLE: 'NOT_APPLICABLE',\r\n UNKNOWN: 'UNKNOWN',\r\n CALIBRATED: 'CALIBRATED',\r\n DETECTOR: 'DETECTOR'\r\n };\r\n\r\n if (isProjection && !ImagerPixelSpacing) {\r\n // If only Pixel Spacing is present, and this is a projection radiograph,\r\n // PixelSpacing should be used, but the user should be informed that\r\n // what it means is unknown\r\n return {\r\n PixelSpacing,\r\n type: TYPES.UNKNOWN,\r\n isProjection\r\n };\r\n } else if (\r\n PixelSpacing &&\r\n ImagerPixelSpacing &&\r\n PixelSpacing === ImagerPixelSpacing\r\n ) {\r\n // If Imager Pixel Spacing and Pixel Spacing are present and they have the same values,\r\n // then the user should be informed that the measurements are at the detector plane\r\n return {\r\n PixelSpacing,\r\n type: TYPES.DETECTOR,\r\n isProjection\r\n };\r\n } else if (\r\n PixelSpacing &&\r\n ImagerPixelSpacing &&\r\n PixelSpacing !== ImagerPixelSpacing\r\n ) {\r\n // If Imager Pixel Spacing and Pixel Spacing are present and they have different values,\r\n // then the user should be informed that these are \"calibrated\"\r\n // (in some unknown manner if Pixel Spacing Calibration Type and/or\r\n // Pixel Spacing Calibration Description are absent)\r\n return {\r\n PixelSpacing,\r\n type: TYPES.CALIBRATED,\r\n isProjection,\r\n PixelSpacingCalibrationType,\r\n PixelSpacingCalibrationDescription\r\n };\r\n } else if (!PixelSpacing && ImagerPixelSpacing) {\r\n let CorrectedImagerPixelSpacing = ImagerPixelSpacing;\r\n if (EstimatedRadiographicMagnificationFactor) {\r\n // Note that in IHE Mammo profile compliant displays, the value of Imager Pixel Spacing is required to be corrected by\r\n // Estimated Radiographic Magnification Factor and the user informed of that.\r\n // TODO: should this correction be done before all of this logic?\r\n CorrectedImagerPixelSpacing = ImagerPixelSpacing.map(\r\n (pixelSpacing) => pixelSpacing / EstimatedRadiographicMagnificationFactor\r\n );\r\n } else {\r\n log.info(\r\n 'EstimatedRadiographicMagnificationFactor was not present. Unable to correct ImagerPixelSpacing.'\r\n );\r\n }\r\n\r\n return {\r\n PixelSpacing: CorrectedImagerPixelSpacing,\r\n isProjection\r\n };\r\n } else if (\r\n SequenceOfUltrasoundRegions &&\r\n typeof SequenceOfUltrasoundRegions === 'object'\r\n ) {\r\n const {PhysicalDeltaX, PhysicalDeltaY} = SequenceOfUltrasoundRegions;\r\n const USPixelSpacing = [PhysicalDeltaX * 10, PhysicalDeltaY * 10];\r\n\r\n return {\r\n PixelSpacing: USPixelSpacing\r\n };\r\n } else if (\r\n SequenceOfUltrasoundRegions &&\r\n Array.isArray(SequenceOfUltrasoundRegions) &&\r\n SequenceOfUltrasoundRegions.length > 1\r\n ) {\r\n log.warn(\r\n 'Sequence of Ultrasound Regions > one entry. This is not yet implemented, all measurements will be shown in pixels.'\r\n );\r\n } else if (isProjection === false && !ImagerPixelSpacing) {\r\n // If only Pixel Spacing is present, and this is not a projection radiograph,\r\n // we can stop here\r\n return {\r\n PixelSpacing,\r\n type: TYPES.NOT_APPLICABLE,\r\n isProjection\r\n };\r\n }\r\n\r\n log.info(\r\n 'Unknown combination of PixelSpacing and ImagerPixelSpacing identified. Unable to determine spacing.'\r\n );\r\n}\r\n","import OHIFError from '../classes/OHIFError.js';\r\nimport getImageId from './getImageId';\r\nimport metadataProvider from '../classes/MetadataProvider.js';\r\n\r\nlet stackMap = {};\r\nlet configuration = {};\r\nconst stackUpdatedCallbacks = [];\r\n\r\n/**\r\n * Loop through the current series and add metadata to the\r\n * Cornerstone meta data provider. This will be used to fill information\r\n * into the viewport overlays, and to calculate reference lines and orientation markers\r\n * @param {Object} stackMap stackMap object\r\n * @param {Object} study Study object\r\n * @param {Object} displaySet The set of images to make the stack from\r\n * @return {Array} Array with image IDs\r\n */\r\nfunction createAndAddStack(stackMap, study, displaySet, stackUpdatedCallbacks) {\r\n const images = displaySet.images;\r\n if (!images) {\r\n return;\r\n }\r\n\r\n const numImages = images.length;\r\n const imageIds = [];\r\n let imageId;\r\n\r\n displaySet.images.forEach((instance, imageIndex) => {\r\n const image = instance.getData();\r\n const metaData = {\r\n instance: image, // in this context, instance will be the data of the InstanceMetadata object...\r\n series: displaySet, // TODO: Check this\r\n study,\r\n numImages,\r\n imageIndex: imageIndex + 1\r\n };\r\n\r\n const naturalizedInstance = instance.getData().metadata;\r\n const NumberOfFrames = naturalizedInstance.NumberOfFrames;\r\n\r\n if (NumberOfFrames > 1) {\r\n for (let i = 0; i < NumberOfFrames; i++) {\r\n metaData.frameNumber = i;\r\n imageId = getImageId(image, i);\r\n imageIds.push(imageId);\r\n\r\n const {\r\n StudyInstanceUID,\r\n SeriesInstanceUID,\r\n SOPInstanceUID\r\n } = instance.getData().metadata;\r\n\r\n metadataProvider.addImageIdToUIDs(imageId, {\r\n StudyInstanceUID,\r\n SeriesInstanceUID,\r\n SOPInstanceUID\r\n });\r\n }\r\n } else {\r\n metaData.frameNumber = 1;\r\n imageId = getImageId(image);\r\n imageIds.push(imageId);\r\n\r\n const {\r\n StudyInstanceUID,\r\n SeriesInstanceUID,\r\n SOPInstanceUID\r\n } = naturalizedInstance;\r\n\r\n metadataProvider.addImageIdToUIDs(imageId, {\r\n StudyInstanceUID,\r\n SeriesInstanceUID,\r\n SOPInstanceUID\r\n });\r\n }\r\n });\r\n\r\n const stack = {\r\n StudyInstanceUID: study.StudyInstanceUID,\r\n displaySetInstanceUID: displaySet.displaySetInstanceUID,\r\n imageIds,\r\n frameRate: displaySet.frameRate,\r\n isClip: displaySet.isClip\r\n };\r\n\r\n stackMap[displaySet.displaySetInstanceUID] = stack;\r\n\r\n return stack;\r\n}\r\n\r\nconfiguration = {\r\n createAndAddStack\r\n};\r\n\r\n/**\r\n * This object contains all the functions needed for interacting with the stack manager.\r\n * Generally, findStack is the only function used. If you want to know when new stacks\r\n * come in, you can register a callback with addStackUpdatedCallback.\r\n */\r\nconst StackManager = {\r\n /**\r\n * Removes all current stacks\r\n */\r\n clearStacks() {\r\n stackMap = {};\r\n },\r\n /**\r\n * Create a stack from an image set, as well as add in the metadata on a per image bases.\r\n * @param study The study who's metadata will be added\r\n * @param displaySet The set of images to make the stack from\r\n * @return {Array} Array with image IDs\r\n */\r\n makeAndAddStack(study, displaySet) {\r\n return configuration.createAndAddStack(\r\n stackMap,\r\n study,\r\n displaySet,\r\n stackUpdatedCallbacks\r\n );\r\n },\r\n /**\r\n * Find a stack from the currently created stacks.\r\n * @param displaySetInstanceUID The UID of the stack to find.\r\n * @returns {*} undefined if not found, otherwise the stack object is returned.\r\n */\r\n findStack(displaySetInstanceUID) {\r\n return stackMap[displaySetInstanceUID];\r\n },\r\n /**\r\n * Find a stack or reate one if it has not been created yet\r\n * @param study The study who's metadata will be added\r\n * @param displaySet The set of images to make the stack from\r\n * @return {Array} Array with image IDs\r\n */\r\n findOrCreateStack(study, displaySet) {\r\n let stack = this.findStack(displaySet.displaySetInstanceUID);\r\n\r\n if (!stack || !stack.imageIds) {\r\n stack = this.makeAndAddStack(study, displaySet);\r\n }\r\n\r\n return stack;\r\n },\r\n /**\r\n * Gets the underlying map of displaySetInstanceUID to stack object.\r\n * WARNING: Do not change this object. It directly affects the manager.\r\n * @returns {{}} map of displaySetInstanceUID -> stack.\r\n */\r\n getAllStacks() {\r\n return stackMap;\r\n },\r\n /**\r\n * Adds in a callback to be called on a stack being added / updated.\r\n * @param callback must accept at minimum one argument,\r\n * which is the stack that was added / updated.\r\n */\r\n addStackUpdatedCallback(callback) {\r\n if (typeof callback !== 'function') {\r\n throw new OHIFError('callback must be provided as a function');\r\n }\r\n stackUpdatedCallbacks.push(callback);\r\n },\r\n /**\r\n * Return configuration\r\n */\r\n getConfiguration() {\r\n return configuration;\r\n },\r\n /**\r\n * Set configuration, in order to provide compatibility\r\n * with other systems by overriding this functions\r\n * @param {Object} config object with functions to be overrided\r\n *\r\n * For now, only makeAndAddStack can be overrided\r\n */\r\n setConfiguration(config) {\r\n configuration = config;\r\n }\r\n};\r\n\r\nexport {StackManager};\r\nexport default StackManager;\r\n","import cornerstone from 'cornerstone-core';\nimport { getCornerstoneWADOImageLoader } from '../utils/cornerstoneWADOImageLoader';\nimport StackManager from '../utils/StackManager';\n\nclass BaseLoadingListener {\n constructor(stack, options = {}) {\n this.id = BaseLoadingListener.getNewId();\n this.stack = stack;\n this.startListening();\n this.statsItemsLimit = options.statsItemsLimit || 2;\n this.stats = {\n items: [],\n total: 0,\n elapsedTime: 0,\n speed: 0\n };\n\n this._setProgressData = options._setProgressData;\n this._clearProgressById = options._clearProgressById;\n\n // Register the start point to make it possible to calculate\n // bytes/s or frames/s when the first byte or frame is received\n this._addStatsData(0);\n\n // Update the progress before starting the download\n // to make it possible to update the UI\n this._updateProgress();\n }\n\n _addStatsData(value) {\n const date = new Date();\n const stats = this.stats;\n const items = stats.items;\n const newItem = {\n value,\n date\n };\n\n items.push(newItem);\n stats.total += newItem.value;\n\n // Remove items until it gets below the limit\n while (items.length > this.statsItemsLimit) {\n const item = items.shift();\n stats.total -= item.value;\n }\n\n // Update the elapsedTime (seconds) based on first and last\n // elements and recalculate the speed (bytes/s or frames/s)\n if (items.length > 1) {\n const oldestItem = items[0];\n stats.elapsedTime = (newItem.date.getTime() - oldestItem.date.getTime()) / 1000;\n stats.speed = (stats.total - oldestItem.value) / stats.elapsedTime;\n }\n }\n\n _getProgressId() {\n const displaySetInstanceUID = this.stack.displaySetInstanceUID;\n return 'StackProgress:' + displaySetInstanceUID;\n }\n\n _clearProgress() {\n const progressId = this._getProgressId();\n this._clearProgressById(progressId);\n }\n\n startListening() {\n throw new Error('`startListening` must be implemented by child classes');\n }\n\n stopListening() {\n throw new Error('`stopListening` must be implemented by child classes');\n }\n\n destroy() {\n this.stopListening();\n this._clearProgress();\n }\n\n static getNewId() {\n const timeSlice = new Date().getTime().toString().slice(-8);\n const randomNumber = parseInt(Math.random() * 1000000000);\n\n return timeSlice.toString() + randomNumber.toString();\n }\n}\n\nclass DICOMFileLoadingListener extends BaseLoadingListener {\n constructor(stack, options) {\n super(stack, options);\n this._dataSetUrl = this._getDataSetUrl(stack);\n this._lastLoaded = 0;\n\n // Check how many instances has already been download (cached)\n this._checkCachedData();\n }\n\n async _checkCachedData() {\n const cornerstoneWADOImageLoader = await getCornerstoneWADOImageLoader();\n const dataSet = cornerstoneWADOImageLoader.wadouri.dataSetCacheManager.get(this._dataSetUrl);\n\n if (dataSet) {\n const dataSetLength = dataSet.byteArray.length;\n\n this._updateProgress({\n percentComplete: 100,\n loaded: dataSetLength,\n total: dataSetLength\n });\n }\n }\n\n _getImageLoadProgressEventName() {\n // TODO: Add this event as a constant in Cornerstone\n return 'cornerstoneimageloadprogress.' + this.id;\n }\n\n startListening() {\n const imageLoadProgressEventName = this._getImageLoadProgressEventName();\n\n this.imageLoadProgressEventHandler = this._imageLoadProgressEventHandle.bind(this);\n\n this.stopListening();\n\n cornerstone.events.addEventListener(imageLoadProgressEventName, this.imageLoadProgressEventHandle);\n }\n\n stopListening() {\n const imageLoadProgressEventName = this._getImageLoadProgressEventName();\n cornerstone.events.removeEventListener(imageLoadProgressEventName, this.imageLoadProgressEventHandle);\n }\n\n _imageLoadProgressEventHandler = (e) => {\n const eventData = e.detail;\n const dataSetUrl = this._convertImageIdToDataSetUrl(eventData.imageId);\n const bytesDiff = eventData.loaded - this._lastLoaded;\n\n if (!this._dataSetUrl === dataSetUrl) {\n return;\n }\n\n // Add the bytes downloaded to the stats\n this._addStatsData(bytesDiff);\n\n // Update the download progress\n this._updateProgress(eventData);\n\n // Cache the last eventData.loaded value\n this._lastLoaded = eventData.loaded;\n };\n\n _updateProgress(eventData) {\n const progressId = this._getProgressId();\n eventData = eventData || {};\n\n const progressData = {\n multiFrame: false,\n percentComplete: eventData.percentComplete,\n bytesLoaded: eventData.loaded,\n bytesTotal: eventData.total,\n bytesPerSecond: this.stats.speed\n };\n\n this._setProgressData(progressId, progressData);\n }\n\n _convertImageIdToDataSetUrl(imageId) {\n // Remove the prefix (\"dicomweb:\" or \"wadouri:\"\")\n imageId = imageId.replace(/^(dicomweb:|wadouri:)/i, '');\n\n // Remove \"frame=999&\" from the imageId\n imageId = imageId.replace(/frame=\\d+&?/i, '');\n\n // Remove the last \"&\" like in \"http://...?foo=1&bar=2&\"\n imageId = imageId.replace(/&$/, '');\n\n return imageId;\n }\n\n _getDataSetUrl(stack) {\n const imageId = stack.imageIds[0];\n return this._convertImageIdToDataSetUrl(imageId);\n }\n}\n\nclass StackLoadingListener extends BaseLoadingListener {\n constructor(stack, options = {}) {\n options.statsItemsLimit = 20;\n super(stack, options);\n\n this.imageDataMap = this._convertImageIdsArrayToMap(stack.imageIds);\n this.framesStatus = this._createArray(stack.imageIds.length, false);\n this.loadedCount = 0;\n\n // Check how many instances has already been download (cached)\n this._checkCachedData();\n }\n\n _convertImageIdsArrayToMap(imageIds) {\n const imageIdsMap = new Map();\n\n for (let i = 0; i < imageIds.length; i++) {\n imageIdsMap.set(imageIds[i], {\n index: i,\n loaded: false\n });\n }\n\n return imageIdsMap;\n }\n\n _createArray(length, defaultValue) {\n // `new Array(length)` is an anti-pattern in javascript because its\n // funny API. Otherwise I would go for `new Array(length).fill(false)`\n const array = [];\n\n for (let i = 0; i < length; i++) {\n array[i] = defaultValue;\n }\n\n return array;\n }\n\n _checkCachedData() {\n // const imageIds = this.stack.imageIds;\n // TODO: No way to check status of Promise.\n /*for(let i = 0; i < imageIds.length; i++) {\n const imageId = imageIds[i];\n\n const imagePromise = cornerstone.imageCache.getImageLoadObject(imageId).promise;\n\n if (imagePromise && (imagePromise.state() === 'resolved')) {\n this._updateFrameStatus(imageId, true);\n }\n }*/\n }\n\n _getImageLoadedEventName() {\n return `${cornerstone.EVENTS.IMAGE_LOADED}.${this.id}`;\n }\n\n _getImageCachePromiseRemoveEventName() {\n return `${cornerstone.EVENTS.IMAGE_CACHE_PROMISE_REMOVED}.${this.id}`;\n }\n\n _imageLoadedEventHandler(e) {\n this._updateFrameStatus(e.detail.image.imageId, true);\n }\n\n _imageCachePromiseRemovedEventHandler(e) {\n this._updateFrameStatus(e.detail.imageId, false);\n }\n\n startListening() {\n const imageLoadedEventName = this._getImageLoadedEventName();\n const imageCachePromiseRemovedEventName = this._getImageCachePromiseRemoveEventName();\n\n this.imageLoadedEventHandler = this._imageLoadedEventHandler.bind(this);\n this.imageCachePromiseRemovedEventHandler = this._imageCachePromiseRemovedEventHandler.bind(this);\n\n this.stopListening();\n\n cornerstone.events.addEventListener(imageLoadedEventName, this.imageLoadedEventHandler);\n cornerstone.events.addEventListener(imageCachePromiseRemovedEventName, this.imageCachePromiseRemovedEventHandler);\n }\n\n stopListening() {\n const imageLoadedEventName = this._getImageLoadedEventName();\n const imageCachePromiseRemovedEventName = this._getImageCachePromiseRemoveEventName();\n\n cornerstone.events.removeEventListener(imageLoadedEventName, this.imageLoadedEventHandler);\n cornerstone.events.removeEventListener(imageCachePromiseRemovedEventName, this.imageCachePromiseRemovedEventHandler);\n }\n\n _updateFrameStatus(imageId, loaded) {\n const imageData = this.imageDataMap.get(imageId);\n\n if (!imageData || imageData.loaded === loaded) {\n return;\n }\n\n // Add one more frame to the stats\n if (loaded) {\n this._addStatsData(1);\n }\n\n imageData.loaded = loaded;\n this.framesStatus[imageData.index] = loaded;\n this.loadedCount += loaded ? 1 : -1;\n this._updateProgress();\n }\n\n _setProgressData(progressId, progressData) {\n // TODO: This method (and _clearProgressById) need to access\n // the Redux store and should therefore be provided from the\n // application. I've added a workaround to pass this in through\n // the 'options' variable on instantiation, but this is really ugly.\n // We could consider making the StudyLoadingListener a higher-order\n // component which would set this stuff itself.\n throw new Error(\"The _setProgressData function must be provided in StudyLoadingListener's options\");\n }\n\n _clearProgressById(progressId) {\n throw new Error(\"The _clearProgressById function must be provided in StudyLoadingListener's options\");\n }\n\n _updateProgress() {\n const totalFramesCount = this.stack.imageIds.length;\n const loadedFramesCount = this.loadedCount;\n const loadingFramesCount = totalFramesCount - loadedFramesCount;\n const percentComplete = Math.round((loadedFramesCount / totalFramesCount) * 100);\n const progressId = this._getProgressId();\n const progressData = {\n multiFrame: true,\n totalFramesCount,\n loadedFramesCount,\n loadingFramesCount,\n percentComplete,\n framesPerSecond: this.stats.speed,\n framesStatus: this.framesStatus\n };\n\n this._setProgressData(progressId, progressData);\n }\n\n _logProgress() {\n const totalFramesCount = this.stack.imageIds.length;\n const displaySetInstanceUID = this.stack.displaySetInstanceUID;\n let progressBar = '[';\n\n for (let i = 0; i < totalFramesCount; i++) {\n const ch = this.framesStatus[i] ? '|' : '.';\n progressBar += `${ch}`;\n }\n\n progressBar += ']';\n console.info(`${displaySetInstanceUID}: ${progressBar}`);\n }\n}\n\nclass StudyLoadingListener {\n constructor(options) {\n this.listeners = {};\n this.options = options;\n }\n\n addStack(stack, stackMetaData) {\n // TODO: Make this work for plugins\n if (!stack) {\n //console.log('Skipping adding stack to StudyLoadingListener');\n return;\n }\n\n const displaySetInstanceUID = stack.displaySetInstanceUID;\n\n if (!this.listeners[displaySetInstanceUID]) {\n const listener = this._createListener(stack, stackMetaData);\n if (listener) {\n this.listeners[displaySetInstanceUID] = listener;\n }\n }\n }\n\n addStudy(study) {\n study.displaySets.forEach((displaySet) => {\n const stack = StackManager.findOrCreateStack(study, displaySet);\n\n // TODO: Make this work for plugins\n if (!stack) {\n console.warn('Skipping adding displaySet to StudyLoadingListener');\n console.warn(displaySet);\n return;\n }\n\n this.addStack(stack, {\n isMultiFrame: displaySet.isMultiFrame\n });\n });\n }\n\n addStudies(studies) {\n if (!studies || !studies.length) {\n return;\n }\n\n studies.forEach((study) => this.addStudy(study));\n }\n\n clear() {\n const displaySetInstanceUIDs = Object.keys(this.listeners);\n const length = displaySetInstanceUIDs.length;\n\n for (let i = 0; i < length; i++) {\n const displaySetInstanceUID = displaySetInstanceUIDs[i];\n const displaySet = this.listeners[displaySetInstanceUID];\n\n displaySet.destroy();\n }\n\n this.listeners = {};\n }\n\n _createListener(stack, stackMetaData) {\n const schema = this._getSchema(stack);\n\n // A StackLoadingListener can be created if it's wadors or not a multiframe\n // wadouri instance (single file) that means \"N\" files will have to be\n // downloaded where \"N\" is the number of frames. DICOMFileLoadingListener\n // is created only if it's a single DICOM file and there's no way to know\n // how many frames has already been loaded (bytes/s instead of frames/s).\n if (schema === 'wadors' || !stackMetaData.isMultiFrame) {\n return new StackLoadingListener(stack, this.options);\n }\n return new DICOMFileLoadingListener(stack, this.options);\n }\n\n _getSchema(stack) {\n const imageId = stack.imageIds[0];\n if (!imageId) return null;\n const colonIndex = imageId.indexOf(':');\n return imageId.substring(0, colonIndex);\n }\n\n // Singleton\n static getInstance(options) {\n if (!StudyLoadingListener._instance) {\n StudyLoadingListener._instance = new StudyLoadingListener(options);\n }\n\n return StudyLoadingListener._instance;\n }\n}\n\nexport { StudyLoadingListener, StackLoadingListener, DICOMFileLoadingListener };\n","import guid from '../utils/guid';\n\n/**\n * Constants\n */\nconst PROPERTY_SEPARATOR = '.';\nconst ORDER_ASC = 'asc';\nconst ORDER_DESC = 'desc';\nconst MIN_COUNT = 0x00000000;\nconst MAX_COUNT = 0x7fffffff;\n\n/**\n * Class Definition\n */\nexport class TypeSafeCollection {\n constructor() {\n this._operationCount = MIN_COUNT;\n this._elementList = [];\n this._handlers = Object.create(null);\n }\n\n /**\n * Private Methods\n */\n\n _invalidate() {\n const count = this._operationCount;\n this._operationCount = count < MAX_COUNT ? count + 1 : MIN_COUNT;\n }\n\n _elements(silent) {\n silent === true || this._operationCount;\n return this._elementList;\n }\n\n _elementWithPayload(payload, silent) {\n return this._elements(silent).find((item) => item.payload === payload);\n }\n\n _elementWithId(id, silent) {\n return this._elements(silent).find((item) => item.id === id);\n }\n\n _trigger(event, data) {\n let handlers = this._handlers;\n if (event in handlers) {\n handlers = handlers[event];\n if (!(handlers instanceof Array)) {\n return;\n }\n for (let i = 0, limit = handlers.length; i < limit; ++i) {\n const handler = handlers[i];\n if (_isFunction(handler)) {\n handler.call(null, data);\n }\n }\n }\n }\n\n /**\n * Public Methods\n */\n\n onInsert(callback) {\n if (_isFunction(callback)) {\n let handlers = this._handlers.insert;\n if (!(handlers instanceof Array)) {\n handlers = [];\n this._handlers.insert = handlers;\n }\n handlers.push(callback);\n }\n }\n\n /**\n * Update the payload associated with the given ID to be the new supplied payload.\n * @param {string} id The ID of the entry that will be updated.\n * @param {any} payload The element that will replace the previous payload.\n * @returns {boolean} Returns true if the given ID is present in the collection, false otherwise.\n */\n updateById(id, payload) {\n let result = false;\n let found = this._elementWithPayload(payload, true);\n if (found) {\n // nothing to do since the element is already in the collection...\n if (found.id === id) {\n // set result to true since the ids match...\n result = true;\n this._invalidate();\n }\n } else {\n found = this._elementWithId(id, true);\n if (found) {\n found.payload = payload;\n result = true;\n this._invalidate();\n }\n }\n return result;\n }\n\n /**\n * Signal that the given element has been changed by notifying reactive data-source observers.\n * This method is basically a means to invalidate the inernal reactive data-source.\n * @param {any} payload The element that has been altered.\n * @returns {boolean} Returns true if the element is present in the collection, false otherwise.\n */\n update(payload) {\n let result = false;\n const found = this._elementWithPayload(payload, true);\n if (found) {\n // nothing to do since the element is already in the collection...\n result = true;\n this._invalidate();\n }\n return result;\n }\n\n /**\n * Insert an element in the collection. On success, the element ID (a unique string) is returned. On failure, returns null.\n * A failure scenario only happens when the given payload is already present in the collection. Note that NO exceptions are thrown!\n * @param {any} payload The element to be stored.\n * @returns {string} The ID of the inserted element or null if the element already exists...\n */\n insert(payload) {\n let id = null;\n const found = this._elementWithPayload(payload, true);\n if (!found) {\n id = guid();\n this._elements(true).push({id, payload});\n this._invalidate();\n this._trigger('insert', {id, data: payload});\n }\n return id;\n }\n\n /**\n * Remove all elements from the collection.\n * @returns {void} No meaningful value is returned.\n */\n removeAll() {\n const all = this._elements(true);\n const length = all.length;\n for (let i = length - 1; i >= 0; i--) {\n const item = all[i];\n delete item.id;\n delete item.payload;\n all[i] = null;\n }\n all.splice(0, length);\n this._invalidate();\n }\n\n /**\n * Remove elements from the collection that match the criteria given in the property map.\n * @param {Object} propertyMap A property map that will be macthed against all collection elements.\n * @returns {Array} A list with all removed elements.\n */\n remove(propertyMap) {\n const found = this.findAllEntriesBy(propertyMap);\n const foundCount = found.length;\n const removed = [];\n if (foundCount > 0) {\n const all = this._elements(true);\n for (let i = foundCount - 1; i >= 0; i--) {\n const item = found[i];\n all.splice(item[2], 1);\n removed.push(item[0]);\n }\n this._invalidate();\n }\n return removed;\n }\n\n /**\n * Provides the ID of the given element inside the collection.\n * @param {any} payload The element being searched for.\n * @returns {string} The ID of the given element or undefined if the element is not present.\n */\n getElementId(payload) {\n const found = this._elementWithPayload(payload);\n return found && found.id;\n }\n\n /**\n * Provides the position of the given element in the internal list returning -1 if the element is not present.\n * @param {any} payload The element being searched for.\n * @returns {number} The position of the given element in the internal list. If the element is not present -1 is returned.\n */\n findById(id) {\n const found = this._elementWithId(id);\n return found && found.payload;\n }\n\n /**\n * Provides the position of the given element in the internal list returning -1 if the element is not present.\n * @param {any} payload The element being searched for.\n * @returns {number} The position of the given element in the internal list. If the element is not present -1 is returned.\n */\n indexOfElement(payload) {\n return this._elements().indexOf(this._elementWithPayload(payload, true));\n }\n\n /**\n * Provides the position of the element associated with the given ID in the internal list returning -1 if the element is not present.\n * @param {string} id The index of the element.\n * @returns {number} The position of the element associated with the given ID in the internal list. If the element is not present -1 is returned.\n */\n indexOfId(id) {\n return this._elements().indexOf(this._elementWithId(id, true));\n }\n\n /**\n * Provides a list-like approach to the collection returning an element by index.\n * @param {number} index The index of the element.\n * @returns {any} If out of bounds, undefined is returned. Otherwise the element in the given position is returned.\n */\n getElementByIndex(index) {\n const found = this._elements()[index >= 0 ? index : -1];\n return found && found.payload;\n }\n\n /**\n * Find an element by a criteria defined by the given callback function.\n * Attention!!! The reactive source will not be notified if no valid callback is supplied...\n * @param {function} callback A callback function which will define the search criteria. The callback\n * function will be passed the collection element, its ID and its index in this very order. The callback\n * shall return true when its criterea has been fulfilled.\n * @returns {any} The matched element or undefined if not match was found.\n */\n find(callback) {\n let found;\n if (_isFunction(callback)) {\n found = this._elements().find((item, index) => callback.call(this, item.payload, item.id, index));\n }\n return found && found.payload;\n }\n\n /**\n * Find the first element that strictly matches the specified property map.\n * @param {Object} propertyMap A property map that will be macthed against all collection elements.\n * @param {Object} options A set of options. Currently only \"options.sort\" option is supported.\n * @param {Object.SortingSpecifier} options.sort An optional sorting specifier. If a sorting specifier is supplied\n * but is not valid, an exception will be thrown.\n * @returns {Any} The matched element or undefined if not match was found.\n */\n findBy(propertyMap, options) {\n let found;\n if (_isObject(options)) {\n // if the \"options\" argument is provided and is a valid object,\n // it must be applied to the dataset before search...\n const all = this.all(options);\n if (all.length > 0) {\n if (_isObject(propertyMap)) {\n found = all.find((item) => _compareToPropertyMapStrict(propertyMap, item));\n } else {\n found = all[0]; // simply extract the first element...\n }\n }\n } else if (_isObject(propertyMap)) {\n found = this._elements().find((item) => _compareToPropertyMapStrict(propertyMap, item.payload));\n if (found) {\n found = found.payload;\n }\n }\n return found;\n }\n\n /**\n * Find all elements that strictly match the specified property map.\n * Attention!!! The reactive source will not be notified if no valid property map is supplied...\n * @param {Object} propertyMap A property map that will be macthed against all collection elements.\n * @returns {Array} An array of entries of all elements that match the given criteria. Each set in\n * in the array has the following format: [ elementData, elementId, elementIndex ].\n */\n findAllEntriesBy(propertyMap) {\n const found = [];\n if (_isObject(propertyMap)) {\n this._elements().forEach((item, index) => {\n if (_compareToPropertyMapStrict(propertyMap, item.payload)) {\n // Match! Add it to the found list...\n found.push([item.payload, item.id, index]);\n }\n });\n }\n return found;\n }\n\n /**\n * Find all elements that match a specified property map.\n * Attention!!! The reactive source will not be notified if no valid property map is supplied...\n * @param {Object} propertyMap A property map that will be macthed against all collection elements.\n * @param {Object} options A set of options. Currently only \"options.sort\" option is supported.\n * @param {Object.SortingSpecifier} options.sort An optional sorting specifier. If a sorting specifier is supplied\n * but is not valid, an exception will be thrown.\n * @returns {Array} An array with all elements that match the given criteria and sorted in the specified sorting order.\n */\n findAllBy(propertyMap, options) {\n const found = this.findAllEntriesBy(propertyMap).map((item) => item[0]); // Only payload is relevant...\n if (_isObject(options)) {\n if ('sort' in options) {\n _sortListBy(found, options.sort);\n }\n }\n return found;\n }\n\n /**\n * Executes the supplied callback function for each element of the collection.\n * Attention!!! The reactive source will not be notified if no valid property map is supplied...\n * @param {function} callback The callback function to be executed. The callback is passed the element,\n * its ID and its index in this very order.\n * @returns {void} Nothing is returned.\n */\n forEach(callback) {\n if (_isFunction(callback)) {\n this._elements().forEach((item, index) => {\n callback.call(this, item.payload, item.id, index);\n });\n }\n }\n\n /**\n * Count the number of elements currently in the collection.\n * @returns {number} The current number of elements in the collection.\n */\n count() {\n return this._elements().length;\n }\n\n /**\n * Returns a list with all elements of the collection optionally sorted by a sorting specifier criteria.\n * @param {Object} options A set of options. Currently only \"options.sort\" option is supported.\n * @param {Object.SortingSpecifier} options.sort An optional sorting specifier. If a sorting specifier is supplied\n * but is not valid, an exception will be thrown.\n * @returns {Array} An array with all elements stored in the collection.\n */\n all(options) {\n const list = this._elements().map((item) => item.payload);\n if (_isObject(options)) {\n if ('sort' in options) {\n _sortListBy(list, options.sort);\n }\n }\n return list;\n }\n}\n\n/**\n * Utility Functions\n */\n\n/**\n * Test if supplied argument is a valid object for current class purposes.\n * Atention! The underscore version of this function should not be used for performance reasons.\n */\nfunction _isObject(subject) {\n return (\n subject instanceof Object ||\n (typeof subject === 'object' && subject !== null)\n );\n}\n\n/**\n * Test if supplied argument is a valid string for current class purposes.\n * Atention! The underscore version of this function should not be used for performance reasons.\n */\nfunction _isString(subject) {\n return typeof subject === 'string';\n}\n\n/**\n * Test if supplied argument is a valid function for current class purposes.\n * Atention! The underscore version of this function should not be used for performance reasons.\n */\nfunction _isFunction(subject) {\n return typeof subject === 'function';\n}\n\n/**\n * Retrieve an object's property value by name. Composite property names (e.g., 'address.country.name') are accepted.\n * @param {Object} targetObject The object we want read the property from...\n * @param {String} propertyName The property to be read (e.g., 'address.street.name' or 'address.street.number'\n * to read object.address.street.name or object.address.street.number, respectively);\n * @returns {Any} Returns whatever the property holds or undefined if the property cannot be read or reached.\n */\nfunction _getPropertyValue(targetObject, propertyName) {\n let propertyValue; // undefined (the default return value)\n if (_isObject(targetObject) && _isString(propertyName)) {\n const fragments = propertyName.split(PROPERTY_SEPARATOR);\n const fragmentCount = fragments.length;\n if (fragmentCount > 0) {\n const firstFragment = fragments[0];\n const remainingFragments =\n fragmentCount > 1 ? fragments.slice(1).join(PROPERTY_SEPARATOR) : null;\n propertyValue = targetObject[firstFragment];\n if (remainingFragments !== null) {\n propertyValue = _getPropertyValue(propertyValue, remainingFragments);\n }\n }\n }\n return propertyValue;\n}\n\n/**\n * Compare a property map with a target object using strict comparison.\n * @param {Object} propertyMap The property map whose properties will be used for comparison. Composite\n * property names (e.g., 'address.country.name') will be tested against the \"resolved\" properties from the target object.\n * @param {Object} targetObject The target object whose properties will be tested.\n * @returns {boolean} Returns true if the properties match, false otherwise.\n */\nfunction _compareToPropertyMapStrict(propertyMap, targetObject) {\n let result = false;\n // \"for in\" loops do not thown exceptions for invalid data types...\n for (const propertyName in propertyMap) {\n if (Object.prototype.hasOwnProperty.call(propertyMap, propertyName)) {\n if (\n propertyMap[propertyName] !==\n _getPropertyValue(targetObject, propertyName)\n ) {\n result = false;\n break;\n } else if (result !== true) {\n result = true;\n }\n }\n }\n return result;\n}\n\n/**\n * Checks if a sorting specifier is valid.\n * A valid sorting specifier consists of an array of arrays being each subarray a pair\n * in the format [\"property name\", \"sorting order\"].\n * The following exemple can be used to sort studies by \"date\"\" and use \"time\" to break ties in descending order.\n * [ [ 'study.date', 'desc' ], [ 'study.time', 'desc' ] ]\n * @param {Array} specifiers The sorting specifier to be tested.\n * @returns {boolean} Returns true if the specifiers are valid, false otherwise.\n */\nfunction _isValidSortingSpecifier(specifiers) {\n let result = true;\n if (specifiers instanceof Array && specifiers.length > 0) {\n for (let i = specifiers.length - 1; i >= 0; i--) {\n const item = specifiers[i];\n if (item instanceof Array) {\n const property = item[0];\n const order = item[1];\n if (\n _isString(property) &&\n (order === ORDER_ASC || order === ORDER_DESC)\n ) {\n continue;\n }\n }\n result = false;\n break;\n }\n }\n return result;\n}\n\n/**\n * Sorts an array based on sorting specifier options.\n * @param {Array} list The that needs to be sorted.\n * @param {Array} specifiers An array of specifiers. Please read isValidSortingSpecifier method definition for further details.\n * @returns {void} No value is returned. The array is sorted in place.\n */\nfunction _sortListBy(list, specifiers) {\n if (list instanceof Array && _isValidSortingSpecifier(specifiers)) {\n const specifierCount = specifiers.length;\n list.sort((a, b) => {\n // callback name for stack traces...\n let index = 0;\n while (index < specifierCount) {\n const specifier = specifiers[index];\n const property = specifier[0];\n const order = specifier[1] === ORDER_DESC ? -1 : 1;\n const aValue = _getPropertyValue(a, property);\n const bValue = _getPropertyValue(b, property);\n // @TODO: should we check for the types being compared, like:\n // ~~ if (typeof aValue !== typeof bValue) continue;\n // Not sure because dates, for example, can be correctly compared to numbers...\n if (aValue < bValue) {\n return order * -1;\n }\n if (aValue > bValue) {\n return order * 1;\n }\n if (++index >= specifierCount) {\n return 0;\n }\n }\n });\n } else {\n throw new Error('Invalid Arguments');\n }\n}\n","import {TypeSafeCollection} from '../classes/TypeSafeCollection';\r\n\r\nconst studyMetadataList = new TypeSafeCollection();\r\n\r\nfunction add(studyMetadata) {\r\n studyMetadataList.insert(studyMetadata);\r\n}\r\n\r\nfunction get(studyInstanceUID) {\r\n return studyMetadataList.findBy({studyInstanceUID});\r\n}\r\n\r\nfunction all(options) {\r\n return studyMetadataList.all(options);\r\n}\r\n\r\nfunction remove(studyInstanceUID) {\r\n studyMetadataList.remove({studyInstanceUID});\r\n}\r\n\r\nfunction purge() {\r\n studyMetadataList.removeAll();\r\n}\r\n\r\nexport default {\r\n add,\r\n get,\r\n all,\r\n remove,\r\n purge\r\n};\r\n","import OHIFError from './OHIFError';\n\n/**\n * Abstract class to fetch study metadata.\n */\nexport class StudyMetadataSource {\n /**\n * Get study metadata for a study with given study InstanceUID.\n * @param {String} studyInstanceUID Study InstanceUID.\n */\n getByInstanceUID(studyInstanceUID) {\n /**\n * Please override this method on a specialized class.\n */\n throw new OHIFError(\n 'StudyMetadataSource::getByInstanceUID is not overriden. Please, override it in a specialized class. See OHIFStudyMetadataSource for example'\n );\n }\n\n /**\n * Load study info and study metadata for a given study into the viewer.\n * @param {StudyMetadata} study StudyMetadata object.\n */\n loadStudy(study) {\n /**\n * Please override this method on a specialized class.\n */\n throw new OHIFError(\n 'StudyMetadataSource::loadStudy is not overriden. Please, override it in a specialized class. See OHIFStudyMetadataSource for example'\n );\n }\n}\n","import DICOMWeb from '../../../DICOMWeb';\r\n\r\n/**\r\n * Function to get series sequence (sequence of pepeating items where each\r\n * item includes the attributes of one or more series) based on a given sopInstance.\r\n *\r\n * @param {Object} instance The sop instance\r\n * @returns {Promise} Referenced series sequence\r\n */\r\nconst getReferencedSeriesSequence = (instance) => {\r\n const referencedSeriesSequenceRaw = instance['00081115'];\r\n\r\n const referencedSeriesSequence = [];\r\n\r\n if (referencedSeriesSequenceRaw && referencedSeriesSequenceRaw.Value) {\r\n referencedSeriesSequenceRaw.Value.forEach((referencedSeries) => {\r\n const referencedSeriesInstanceUID = DICOMWeb.getString(\r\n referencedSeries['0020000E']\r\n );\r\n\r\n const referencedInstanceSequenceRaw = referencedSeries['0008114A'];\r\n const referencedInstanceSequence = [];\r\n\r\n referencedInstanceSequenceRaw.Value.forEach((referencedInstance) => {\r\n referencedInstanceSequence.push({\r\n referencedSOPClassUID: DICOMWeb.getString(\r\n referencedInstance['00081150']\r\n ),\r\n referencedSOPInstanceUID: DICOMWeb.getString(\r\n referencedInstance['00081155']\r\n )\r\n });\r\n });\r\n\r\n referencedSeriesSequence.push({\r\n referencedSeriesInstanceUID,\r\n referencedInstanceSequence\r\n });\r\n });\r\n }\r\n\r\n return referencedSeriesSequence;\r\n};\r\n\r\nexport default getReferencedSeriesSequence;\r\n","import DICOMWeb from '../../../DICOMWeb';\r\nimport metadataProvider from '../../../classes/MetadataProvider';\r\nimport getWADORSImageId from '../../../utils/getWADORSImageId';\r\nimport getReferencedSeriesSequence from './getReferencedSeriesSequence';\r\nimport { getCornerstoneWADOImageLoader } from '../../../utils/cornerstoneWADOImageLoader';\r\n\r\n// Modified by TungLT\r\n/**\r\n * Create a plain JS object that describes a study (a study descriptor object)\r\n * @param {Object} server Object with server configuration parameters\r\n * @param {Object} aSopInstance a SOP Instance from which study information will be added\r\n * @param {String} studyInstanceUID of study, need to replace dicom tag of instance - iTech's security\r\n */\r\nfunction createStudy(server, aSopInstance, studyInstanceUID) {\r\n // TODO: Pass a reference ID to the server instead of including the URLs here\r\n return {\r\n series: [],\r\n seriesMap: Object.create(null),\r\n seriesLoader: null,\r\n wadoUriRoot: server.wadoUriRoot,\r\n wadoRoot: server.wadoRoot,\r\n qidoRoot: server.qidoRoot,\r\n PatientName: DICOMWeb.getName(aSopInstance['00100010']),\r\n PatientID: DICOMWeb.getString(aSopInstance['00100020']),\r\n PatientAge: DICOMWeb.getNumber(aSopInstance['00101010']),\r\n PatientSize: DICOMWeb.getNumber(aSopInstance['00101020']),\r\n PatientWeight: DICOMWeb.getNumber(aSopInstance['00101030']),\r\n AccessionNumber: DICOMWeb.getString(aSopInstance['00080050']),\r\n StudyTime: DICOMWeb.getString(aSopInstance['00080030']),\r\n StudyDate: DICOMWeb.getString(aSopInstance['00080020']),\r\n FrameOfReferenceUID: DICOMWeb.getString(aSopInstance['00200052']),\r\n ReferencedSeriesSequence: getReferencedSeriesSequence(aSopInstance),\r\n modalities: DICOMWeb.getString(aSopInstance['00080061']), // TODO -> Rename this.. it'll take a while to not mess this one up.\r\n StudyDescription: DICOMWeb.getString(aSopInstance['00081030']),\r\n NumberOfStudyRelatedInstances: DICOMWeb.getString(aSopInstance['00201208']),\r\n StudyInstanceUID: studyInstanceUID || DICOMWeb.getString(aSopInstance['0020000D']),\r\n InstitutionName: DICOMWeb.getString(aSopInstance['00080080'])\r\n };\r\n}\r\n\r\n/** Returns a WADO url for an instance\r\n *\r\n * @param StudyInstanceUID\r\n * @param SeriesInstanceUID\r\n * @param SOPInstanceUID\r\n * @returns {string}\r\n */\r\nfunction buildInstanceWadoUrl(server, StudyInstanceUID, SeriesInstanceUID, SOPInstanceUID) {\r\n // TODO: This can be removed, since DICOMWebClient has the same function. Not urgent, though\r\n const params = [];\r\n\r\n params.push('requestType=WADO');\r\n params.push(`studyUID=${StudyInstanceUID}`);\r\n params.push(`seriesUID=${SeriesInstanceUID}`);\r\n params.push(`objectUID=${SOPInstanceUID}`);\r\n params.push('contentType=application/dicom');\r\n params.push('transferSyntax=*');\r\n\r\n const paramString = params.join('&');\r\n\r\n return `${server.wadoUriRoot}?${paramString}`;\r\n}\r\n\r\nfunction buildInstanceWadoRsUri(server, StudyInstanceUID, SeriesInstanceUID, SOPInstanceUID) {\r\n return `${server.wadoRoot}/studies/${StudyInstanceUID}/series/${SeriesInstanceUID}/instances/${SOPInstanceUID}`;\r\n}\r\n\r\nfunction buildInstanceFrameWadoRsUri(server, StudyInstanceUID, SeriesInstanceUID, SOPInstanceUID, frame) {\r\n const baseWadoRsUri = buildInstanceWadoRsUri(server, StudyInstanceUID, SeriesInstanceUID, SOPInstanceUID);\r\n frame = frame != null || 1;\r\n\r\n return `${baseWadoRsUri}/frames/${frame}`;\r\n}\r\n\r\nasync function makeSOPInstance(server, study, instance) {\r\n const naturalizedInstance = await metadataProvider.addInstance(instance, {\r\n server,\r\n StudyInstanceUID: study.StudyInstanceUID // TungLT mod\r\n });\r\n\r\n const { StudyInstanceUID, SeriesInstanceUID, SOPInstanceUID } = naturalizedInstance;\r\n\r\n let series = study.seriesMap[SeriesInstanceUID];\r\n\r\n if (!series) {\r\n series = {\r\n SeriesInstanceUID,\r\n SeriesDescription: naturalizedInstance.SeriesDescription,\r\n Modality: naturalizedInstance.Modality,\r\n SeriesNumber: naturalizedInstance.SeriesNumber,\r\n SeriesDate: naturalizedInstance.SeriesDate,\r\n SeriesTime: naturalizedInstance.SeriesTime,\r\n instances: []\r\n };\r\n study.seriesMap[SeriesInstanceUID] = series;\r\n study.series.push(series);\r\n }\r\n\r\n const wadouri = buildInstanceWadoUrl(server, StudyInstanceUID, SeriesInstanceUID, SOPInstanceUID);\r\n const baseWadoRsUri = buildInstanceWadoRsUri(server, StudyInstanceUID, SeriesInstanceUID, SOPInstanceUID);\r\n const wadorsuri = buildInstanceFrameWadoRsUri(server, StudyInstanceUID, SeriesInstanceUID, SOPInstanceUID);\r\n\r\n const sopInstance = {\r\n metadata: naturalizedInstance,\r\n baseWadoRsUri,\r\n wadouri,\r\n wadorsuri,\r\n wadoRoot: server.wadoRoot,\r\n imageRendering: server.imageRendering,\r\n thumbnailRendering: server.thumbnailRendering\r\n };\r\n\r\n series.instances.push(sopInstance);\r\n\r\n if (sopInstance.thumbnailRendering === 'wadors' || sopInstance.imageRendering === 'wadors') {\r\n // If using WADO-RS for either images or thumbnails,\r\n // Need to add this to cornerstoneWADOImageLoader's provider\r\n // (it won't be hit on cornerstone.metaData.get, but cornerstoneWADOImageLoader\r\n // will cry if you don't add data to cornerstoneWADOImageLoader.wadors.metaDataManager).\r\n\r\n const wadoRSMetadata = Object.assign(instance);\r\n\r\n const cornerstoneWADOImageLoader = await getCornerstoneWADOImageLoader();\r\n const { NumberOfFrames } = sopInstance.metadata;\r\n\r\n if (NumberOfFrames) {\r\n for (let i = 0; i < NumberOfFrames; i++) {\r\n const wadorsImageId = getWADORSImageId(sopInstance, i);\r\n\r\n cornerstoneWADOImageLoader.wadors.metaDataManager.add(wadorsImageId, wadoRSMetadata);\r\n }\r\n } else {\r\n const wadorsImageId = getWADORSImageId(sopInstance);\r\n\r\n cornerstoneWADOImageLoader.wadors.metaDataManager.add(wadorsImageId, wadoRSMetadata);\r\n }\r\n }\r\n\r\n return sopInstance;\r\n}\r\n\r\n/**\r\n * Add a list of SOP Instances to a given study object descriptor\r\n * @param {Object} server Object with server configuration parameters\r\n * @param {Object} study The study descriptor to which the given SOP instances will be added\r\n * @param {Array} sopInstanceList A list of SOP instance objects\r\n */\r\nasync function addInstancesToStudy(server, study, sopInstanceList) {\r\n return Promise.all(\r\n sopInstanceList.map(function (sopInstance) {\r\n return makeSOPInstance(server, study, sopInstance);\r\n })\r\n );\r\n}\r\n\r\n// TungLT modify\r\nconst createStudyFromSOPInstanceList = async (server, sopInstanceList, studyInstanceUID) => {\r\n if (Array.isArray(sopInstanceList) && sopInstanceList.length > 0) {\r\n const firstSopInstance = sopInstanceList[0];\r\n const study = createStudy(server, firstSopInstance, studyInstanceUID);\r\n await addInstancesToStudy(server, study, sopInstanceList);\r\n return study;\r\n }\r\n throw new Error('Failed to create study out of provided SOP instance list');\r\n};\r\n\r\nexport { createStudyFromSOPInstanceList, addInstancesToStudy };\r\n","/**\r\n * Class to define inheritance of load retrieve strategy.\r\n * The process can be async load (lazy) or sync load\r\n *\r\n * There are methods that must be implemented at consumer level\r\n * To retrieve study call execLoad\r\n */\r\nexport default class RetrieveMetadataLoader {\r\n /**\r\n * @constructor\r\n * @param {Object} server Object with server configuration parameters\r\n * @param {Array} studyInstanceUID Study instance ui to be retrieved\r\n * @param {Object} [filters] - Object containing filters to be applied on retrieve metadata process\r\n * @param {string} [filter.seriesInstanceUID] - series instance uid to filter results against\r\n */\r\n constructor(server, studyInstanceUID, filters = {}) {\r\n this.server = server;\r\n this.studyInstanceUID = studyInstanceUID;\r\n this.filters = filters;\r\n }\r\n\r\n async execLoad() {\r\n await this.configLoad();\r\n const preLoadData = await this.preLoad();\r\n const loadData = await this.load(preLoadData);\r\n const postLoadData = await this.posLoad(loadData);\r\n\r\n return postLoadData;\r\n }\r\n\r\n /**\r\n * It iterates over given loaders running each one. Loaders parameters must be bind when getting it.\r\n * @param {Array} loaders - array of loader to retrieve data.\r\n */\r\n async runLoaders(loaders) {\r\n let result;\r\n for (const loader of loaders) {\r\n result = await loader();\r\n if (result && result.length) {\r\n break; // closes iterator in case data is retrieved successfully\r\n }\r\n }\r\n\r\n if (loaders.next().done && !result) {\r\n throw new Error('RetrieveMetadataLoader failed');\r\n }\r\n\r\n return result;\r\n }\r\n\r\n // Methods to be overwrite\r\n async configLoad() {\r\n }\r\n\r\n async preLoad() {\r\n }\r\n\r\n async load(preLoadData) {\r\n }\r\n\r\n async posLoad(loadData) {\r\n }\r\n}\r\n","import { api } from 'dicomweb-client';\r\nimport DICOMWeb from '../../../DICOMWeb';\r\nimport { createStudyFromSOPInstanceList } from './studyInstanceHelpers';\r\nimport RetrieveMetadataLoader from './retrieveMetadataLoader';\r\n\r\n/**\r\n * Class for sync load of study metadata.\r\n * It inherits from RetrieveMetadataLoader\r\n *\r\n * A list of loaders (getLoaders) can be created so, it will be applied a fallback load strategy.\r\n * I.e Retrieve metadata using all loaders possibilities.\r\n */\r\nexport default class RetrieveMetadataLoaderSync extends RetrieveMetadataLoader {\r\n getOptions() {\r\n const { studyInstanceUID, filters } = this;\r\n\r\n const options = {\r\n studyInstanceUID\r\n };\r\n\r\n const { seriesInstanceUID } = filters;\r\n if (seriesInstanceUID) {\r\n options['seriesInstanceUID'] = seriesInstanceUID;\r\n }\r\n\r\n return options;\r\n }\r\n\r\n /**\r\n * @returns {Array} Array of loaders. To be consumed as queue\r\n */\r\n *getLoaders() {\r\n const loaders = [];\r\n const { studyInstanceUID, filters: { seriesInstanceUID } = {}, client } = this;\r\n\r\n if (seriesInstanceUID) {\r\n loaders.push(\r\n client.retrieveSeriesMetadata.bind(client, {\r\n studyInstanceUID,\r\n seriesInstanceUID\r\n })\r\n );\r\n }\r\n\r\n loaders.push(client.retrieveStudyMetadata.bind(client, { studyInstanceUID }));\r\n\r\n yield* loaders;\r\n }\r\n\r\n configLoad() {\r\n const { server } = this;\r\n const client = new api.DICOMwebClient({\r\n url: server.wadoRoot,\r\n headers: DICOMWeb.getAuthorizationHeader(server)\r\n });\r\n\r\n this.client = client;\r\n }\r\n\r\n async load(preLoadData) {\r\n const loaders = this.getLoaders();\r\n const result = this.runLoaders(loaders);\r\n return result;\r\n }\r\n\r\n async posLoad(loadData) {\r\n const { server, studyInstanceUID } = this;\r\n // TungLT: modify to fill custom combine studyInstanceUID into series\r\n // and instance model data to build exact image request URL\r\n return createStudyFromSOPInstanceList(server, loadData, studyInstanceUID);\r\n }\r\n}\r\n","import DICOMWeb from '../DICOMWeb';\nimport isLowPriorityModality from '../utils/isLowPriorityModality';\n\nconst INFO = Symbol('INFO');\n\n/**\n * Creates an object with processed series information and saves its reference\n * inside the series object itself.\n * @param {Object} series The raw series object\n * @returns {Object} object containing some useful info from given series\n */\nexport default function getSeriesInfo(series) {\n let info = series[INFO];\n if (!info) {\n const Modality = DICOMWeb.getString(series['00080060'], '').toUpperCase();\n info = Object.freeze({\n Modality,\n isLowPriority: isLowPriorityModality(Modality),\n SeriesInstanceUID: DICOMWeb.getString(series['0020000E']),\n SeriesNumber: DICOMWeb.getNumber(series['00200011'], 0) || 0\n });\n series[INFO] = info;\n }\n return info;\n}\n","import getSeriesInfo from './getSeriesInfo';\n\n/**\n * Series sorting criteria: series considered low priority are moved to the end\n * of the list and series number is used to break ties\n * @param {Object} firstSeries\n * @param {Object} secondSeries\n */\nfunction seriesInfoSortingCriteria(firstSeries, secondSeries) {\n const a = getSeriesInfo(firstSeries);\n const b = getSeriesInfo(secondSeries);\n if (!a.isLowPriority && b.isLowPriority) {\n return -1;\n }\n if (a.isLowPriority && !b.isLowPriority) {\n return 1;\n }\n return a.SeriesNumber - b.SeriesNumber;\n}\n\nconst seriesSortCriteria = {\n default: (a, b) => a.SeriesNumber - b.SeriesNumber,\n seriesInfoSortingCriteria\n};\n\nconst instancesSortCriteria = {\n default: (a, b) => a.InstanceNumber - b.InstanceNumber\n};\n\nconst sortingCriteria = {\n seriesSortCriteria,\n instancesSortCriteria\n};\n\n/**\n * Sorts given series (given param is modified)\n * The default criteria is based on series number in ascending order.\n *\n * @param {Array} series List of series\n * @param {function} seriesSortingCriteria method for sorting\n * @returns {Array} sorted series object\n */\nconst sortStudySeries = (\n series,\n seriesSortingCriteria = seriesSortCriteria.default\n) => series.sort(seriesSortingCriteria);\n\n/**\n * Sorts given instancesList (given param is modified)\n * The default criteria is based on instance number in ascending order.\n *\n * @param {Array} instancesList List of series\n * @param {function} instancesSortingCriteria method for sorting\n * @returns {Array} sorted instancesList object\n */\nconst sortStudyInstances = (\n instancesList,\n instancesSortingCriteria = instancesSortCriteria.default\n) => instancesList.sort(instancesSortingCriteria);\n\n/**\n * Sorts the series and instances (by default) inside a study instance based on sortingCriteria (given param is modified)\n * The default criteria is based on series and instance numbers in ascending order.\n *\n * @param {Object} study The study instance\n * @param {boolean} [deepSort = true] to sort instance also\n * @param {function} [seriesSortingCriteria = seriesSortCriteria.default] method for sorting series\n * @param {function} [instancesSortingCriteria = instancesSortCriteria.default] method for sorting instances\n * @returns {Object} sorted study object\n */\nexport default function sortStudy(\n study,\n deepSort = true,\n seriesSortingCriteria = seriesSortCriteria.default,\n instancesSortingCriteria = instancesSortCriteria.default\n) {\n if (!study || !study.series) {\n throw new Error('Insufficient study data was provided to sortStudy');\n }\n\n sortStudySeries(study.series, seriesSortingCriteria);\n\n if (deepSort) {\n study.series.forEach((series) => {\n sortStudyInstances(series.instances, instancesSortingCriteria);\n });\n }\n\n return study;\n}\n\nexport {sortStudySeries, sortStudyInstances, sortingCriteria};\n","import { api } from 'dicomweb-client';\r\nimport dcmjs from 'dcmjs';\r\nimport DICOMWeb from '../../../DICOMWeb/';\r\nimport RetrieveMetadataLoader from './retrieveMetadataLoader';\r\nimport { sortStudySeries, sortingCriteria } from '../../sortStudy';\r\nimport getSeriesInfo from '../../getSeriesInfo';\r\nimport { createStudyFromSOPInstanceList, addInstancesToStudy } from './studyInstanceHelpers';\r\n\r\nimport errorHandler from '../../../errorHandler';\r\n\r\nconst { naturalizeDataset } = dcmjs.data.DicomMetaDictionary;\r\n\r\n/**\r\n * Map series to an array of SeriesInstanceUID\r\n * @param {Arrays} series list of Series Instance UIDs\r\n * @returns {Arrays} A list of Series Instance UIDs\r\n */\r\nfunction mapStudySeries(series) {\r\n return series.map((series) => getSeriesInfo(series).SeriesInstanceUID);\r\n}\r\n\r\nfunction attachSeriesLoader(server, study, seriesLoader) {\r\n study.seriesLoader = Object.freeze({\r\n hasNext() {\r\n return seriesLoader.hasNext();\r\n },\r\n async next() {\r\n const series = await seriesLoader.next();\r\n await addInstancesToStudy(server, study, series.sopInstances, study.StudyInstanceUID);\r\n return study.seriesMap[series.seriesInstanceUID];\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Creates an immutable series loader object which loads each series sequentially using the iterator interface\r\n * @param {DICOMWebClient} dicomWebClient The DICOMWebClient instance to be used for series load\r\n * @param {string} studyInstanceUID The Study Instance UID from which series will be loaded\r\n * @param {Array} seriesInstanceUIDList A list of Series Instance UIDs\r\n * @returns {Object} Returns an object which supports loading of instances from each of given Series Instance UID\r\n */\r\nfunction makeSeriesAsyncLoader(dicomWebClient, studyInstanceUID, seriesInstanceUIDList) {\r\n return Object.freeze({\r\n hasNext() {\r\n return seriesInstanceUIDList.length > 0;\r\n },\r\n async next() {\r\n const seriesInstanceUID = seriesInstanceUIDList.shift();\r\n const sopInstances = await dicomWebClient.retrieveSeriesMetadata({\r\n studyInstanceUID,\r\n seriesInstanceUID\r\n });\r\n return { studyInstanceUID, seriesInstanceUID, sopInstances };\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Class for async load of study metadata.\r\n * It inherits from RetrieveMetadataLoader\r\n *\r\n * It loads the one series and then append to seriesLoader the others to be consumed/loaded\r\n */\r\nexport default class RetrieveMetadataLoaderAsync extends RetrieveMetadataLoader {\r\n configLoad() {\r\n const { server } = this;\r\n\r\n const client = new api.DICOMwebClient({\r\n url: server.qidoRoot,\r\n headers: DICOMWeb.getAuthorizationHeader(server),\r\n errorInterceptor: errorHandler.getHTTPErrorHandler()\r\n });\r\n\r\n this.client = client;\r\n }\r\n\r\n /**\r\n * @returns {Array} Array of preLoaders. To be consumed as queue\r\n */\r\n *getPreLoaders() {\r\n const preLoaders = [];\r\n const { studyInstanceUID, filters: { seriesInstanceUID } = {}, client } = this;\r\n\r\n if (seriesInstanceUID) {\r\n const options = {\r\n studyInstanceUID,\r\n queryParams: { SeriesInstanceUID: seriesInstanceUID }\r\n };\r\n preLoaders.push(client.searchForSeries.bind(client, options));\r\n }\r\n // Fallback preloader\r\n preLoaders.push(client.searchForSeries.bind(client, { studyInstanceUID }));\r\n\r\n yield* preLoaders;\r\n }\r\n\r\n async preLoad() {\r\n const preLoaders = this.getPreLoaders();\r\n\r\n // seriesData is the result of the QIDO-RS Search For Series request\r\n // It's an array of Objects containing DICOM Tag values at the Series level\r\n const seriesData = await this.runLoaders(preLoaders);\r\n\r\n const seriesSorted = sortStudySeries(seriesData, sortingCriteria.seriesSortCriteria.seriesInfoSortingCriteria);\r\n const seriesInstanceUIDsMap = mapStudySeries(seriesSorted);\r\n\r\n return {\r\n seriesInstanceUIDsMap,\r\n seriesData\r\n };\r\n }\r\n\r\n async load(preLoadData) {\r\n const { client, studyInstanceUID } = this;\r\n\r\n const seriesAsyncLoader = makeSeriesAsyncLoader(client, studyInstanceUID, preLoadData.seriesInstanceUIDsMap);\r\n\r\n const firstSeries = await seriesAsyncLoader.next();\r\n\r\n return {\r\n sopInstances: firstSeries.sopInstances,\r\n asyncLoader: seriesAsyncLoader,\r\n seriesData: preLoadData.seriesData\r\n };\r\n }\r\n\r\n async posLoad(loadData) {\r\n const { server, studyInstanceUID } = this;\r\n\r\n const { sopInstances, asyncLoader, seriesData } = loadData;\r\n\r\n // TungLT\r\n const study = await createStudyFromSOPInstanceList(server, sopInstances, studyInstanceUID);\r\n\r\n // TODO: Should this be in a helper\r\n const seriesDataNaturalized = seriesData.map(naturalizeDataset);\r\n\r\n seriesDataNaturalized.forEach((series, idx) => {\r\n const seriesDataFromQIDO = {\r\n SeriesInstanceUID: series.SeriesInstanceUID,\r\n SeriesDescription: series.SeriesDescription,\r\n SeriesNumber: series.SeriesNumber,\r\n Modality: series.Modality,\r\n instances: []\r\n };\r\n\r\n if (study.series[idx]) {\r\n study.series[idx] = Object.assign(seriesDataFromQIDO, study.series[idx]);\r\n } else {\r\n study.series[idx] = seriesDataFromQIDO;\r\n }\r\n\r\n study.seriesMap[series.SeriesInstanceUID] = study.series[idx];\r\n });\r\n\r\n if (asyncLoader.hasNext()) {\r\n attachSeriesLoader(server, study, asyncLoader);\r\n }\r\n\r\n return study;\r\n }\r\n}\r\n","import RetrieveMetadataLoaderSync from './retrieveMetadataLoaderSync';\r\nimport RetrieveMetadataLoaderAsync from './retrieveMetadataLoaderAsync';\r\n\r\n/**\r\n * Retrieve Study metadata from a DICOM server. If the server is configured to use lazy load, only the first series\r\n * will be loaded and the property \"studyLoader\" will be set to let consumer load remaining series as needed.\r\n *\r\n * @param {Object} server Object with server configuration parameters\r\n * @param {string} StudyInstanceUID The Study Instance UID of the study which needs to be loaded\r\n * @param {Object} [filters] - Object containing filters to be applied on retrieve metadata process\r\n * @param {string} [filter.seriesInstanceUID] - series instance uid to filter results against\r\n * @returns {Object} A study descriptor object\r\n */\r\nasync function RetrieveMetadata(server, StudyInstanceUID, filters = {}) {\r\n const RetrieveMetadataLoader =\r\n server.enableStudyLazyLoad !== false\r\n ? RetrieveMetadataLoaderAsync\r\n : RetrieveMetadataLoaderSync;\r\n\r\n const retrieveMetadataLoader = new RetrieveMetadataLoader(\r\n server,\r\n StudyInstanceUID,\r\n filters\r\n );\r\n const studyMetadata = retrieveMetadataLoader.execLoad();\r\n\r\n return studyMetadata;\r\n}\r\n\r\nexport default RetrieveMetadata;\r\n","import RetrieveMetadata from './services/wado/retrieveMetadata';\n\nconst moduleName = 'RetrieveStudyMetadata';\n// Cache for promises. Prevents unnecessary subsequent calls to the server\nconst StudyMetaDataPromises = new Map();\n\n/**\n * Retrieves study metadata\n *\n * @param {Object} server Object with server configuration parameters\n * @param {string} StudyInstanceUID The UID of the Study to be retrieved\n * @param {Object} [filters] - Object containing filters to be applied on retrieve metadata process\n * @param {string} [filter.seriesInstanceUID] - series instance uid to filter results against\n * @returns {Promise} that will be resolved with the metadata or rejected with the error\n */\nexport function retrieveStudyMetadata(server, StudyInstanceUID, filters) {\n // @TODO: Whenever a study metadata request has failed, its related promise will be rejected once and for all\n // and further requests for that metadata will always fail. On failure, we probably need to remove the\n // corresponding promise from the \"StudyMetaDataPromises\" map...\n\n if (!server) {\n throw new Error(`${moduleName}: Required 'server' parameter not provided.`);\n }\n if (!StudyInstanceUID) {\n throw new Error(\n `${moduleName}: Required 'StudyInstanceUID' parameter not provided.`\n );\n }\n\n // Already waiting on result? Return cached promise\n if (StudyMetaDataPromises.has(StudyInstanceUID)) {\n return StudyMetaDataPromises.get(StudyInstanceUID);\n }\n\n // Create a promise to handle the data retrieval\n const promise = new Promise((resolve, reject) => {\n RetrieveMetadata(server, StudyInstanceUID, filters).then((data) => {\n resolve(data);\n }, reject);\n });\n\n // Store the promise in cache\n StudyMetaDataPromises.set(StudyInstanceUID, promise);\n\n return promise;\n}\n\n/**\n * Delete the cached study metadata retrieval promise to ensure that the browser will\n * re-retrieve the study metadata when it is next requested\n *\n * @param {String} StudyInstanceUID The UID of the Study to be removed from cache\n *\n */\nexport function deleteStudyMetadataPromise(StudyInstanceUID) {\n if (StudyMetaDataPromises.has(StudyInstanceUID)) {\n StudyMetaDataPromises.delete(StudyInstanceUID);\n }\n}\n","import {studyMetadataManager} from '../utils';\n\nimport OHIFError from './OHIFError';\nimport {StudyMetadata} from './metadata/StudyMetadata';\nimport {StudyMetadataSource} from './StudyMetadataSource';\nimport {retrieveStudyMetadata} from '../studies/retrieveStudyMetadata';\n\nexport class OHIFStudyMetadataSource extends StudyMetadataSource {\n /**\n * Get study metadata for a study with given study InstanceUID\n * @param server\n * @param {String} studyInstanceUID Study InstanceUID\n * @return {Promise} A Promise object\n */\n getByInstanceUID(server, studyInstanceUID) {\n return retrieveStudyMetadata(server, studyInstanceUID);\n }\n\n /**\n * Load study info (OHIF.viewer.Studies) and study metadata (OHIF.viewer.StudyMetadataList) for a given study.\n * @param {StudyMetadata} study StudyMetadata object.\n */\n loadStudy(study) {\n if (!(study instanceof StudyMetadata)) {\n throw new OHIFError(\n 'OHIFStudyMetadataSource::loadStudy study is not an instance of StudyMetadata'\n );\n }\n\n return new Promise((resolve, reject) => {\n const studyInstanceUID = study.getStudyInstanceUID();\n\n if (study instanceof StudyMetadata) {\n const alreadyLoaded = OHIF.viewer.Studies.findBy({\n StudyInstanceUID: studyInstanceUID\n });\n\n if (!alreadyLoaded) {\n OHIFStudyMetadataSource._updateStudyCollections(study);\n }\n\n resolve(study);\n return;\n }\n\n this.getByInstanceUID(studyInstanceUID)\n .then((studyInfo) => {\n // Create study metadata object\n const studyMetadata = new StudyMetadata(\n studyInfo,\n studyInfo.StudyInstanceUID\n );\n\n // Get Study display sets\n const displaySets = studyMetadata.createDisplaySets();\n\n // Set studyMetadata display sets\n studyMetadata.setDisplaySets(displaySets);\n\n OHIFStudyMetadataSource._updateStudyCollections(studyMetadata);\n resolve(studyMetadata);\n })\n .catch(reject);\n });\n }\n\n // Static methods\n static _updateStudyCollections(studyMetadata) {\n const studyInfo = studyMetadata.getData();\n\n // Set some studyInfo properties\n studyInfo.selected = true;\n studyInfo.displaySets = studyMetadata.getDisplaySets();\n studyMetadataManager.add(studyMetadata);\n }\n}\n","import {InstanceMetadata, SeriesMetadata, StudyMetadata} from './metadata';\n\nimport CommandsManager from './CommandsManager';\nimport {DICOMFileLoadingListener, StackLoadingListener, StudyLoadingListener} from './StudyLoadingListener';\nimport HotkeysManager from './HotkeysManager';\nimport ImageSet from './ImageSet';\nimport MetadataProvider from './MetadataProvider';\nimport OHIFError from './OHIFError';\nimport {OHIFStudyMetadataSource} from './OHIFStudyMetadataSource';\n\n\nimport {StudyMetadataSource} from './StudyMetadataSource';\nimport {StudyPrefetcher} from './StudyPrefetcher';\nimport {TypeSafeCollection} from './TypeSafeCollection';\n\nexport {\n OHIFStudyMetadataSource,\n MetadataProvider,\n CommandsManager,\n HotkeysManager,\n ImageSet,\n StudyPrefetcher,\n StudyLoadingListener,\n StackLoadingListener,\n DICOMFileLoadingListener,\n StudyMetadata,\n SeriesMetadata,\n InstanceMetadata,\n TypeSafeCollection,\n OHIFError,\n StudyMetadataSource\n};\n\nconst classes = {\n OHIFStudyMetadataSource,\n MetadataProvider,\n CommandsManager,\n HotkeysManager,\n ImageSet,\n StudyPrefetcher,\n StudyLoadingListener,\n StackLoadingListener,\n DICOMFileLoadingListener,\n StudyMetadata,\n SeriesMetadata,\n InstanceMetadata,\n TypeSafeCollection,\n OHIFError,\n StudyMetadataSource\n};\n\nexport default classes;\n","import cornerstone from 'cornerstone-core';\nimport cornerstoneTools from 'cornerstone-tools';\nimport log from '../log';\nimport getImageId from '../utils/getImageId';\n\nexport class StudyPrefetcher {\n constructor(studies) {\n this.studies = studies || [];\n this.prefetchDisplaySetsTimeout = 300;\n this.lastActiveViewportElement = null;\n\n cornerstone.events.addEventListener(\n 'cornerstoneimagecachefull.StudyPrefetcher',\n this.cacheFullHandler.bind(this)\n );\n }\n\n destroy() {\n this.stopPrefetching();\n cornerstone.events.removeEventListener(\n 'cornerstoneimagecachefull.StudyPrefetcher',\n this.cacheFullHandler.bind(this)\n );\n }\n\n static getInstance() {\n if (!StudyPrefetcher.instance) {\n StudyPrefetcher.instance = new StudyPrefetcher([]);\n }\n\n return StudyPrefetcher.instance;\n }\n\n setStudies(studies) {\n this.stopPrefetching();\n this.studies = studies;\n }\n\n prefetch() {\n if (!this.studies || !this.studies.length) {\n return;\n }\n\n this.stopPrefetching();\n this.prefetchDisplaySets();\n }\n\n stopPrefetching() {\n cornerstoneTools.requestPoolManager.clearRequestStack('prefetch');\n }\n\n prefetchDisplaySetsAsync(timeout) {\n timeout = timeout || this.prefetchDisplaySetsTimeout;\n\n clearTimeout(this.prefetchDisplaySetsHandler);\n this.prefetchDisplaySetsHandler = setTimeout(() => {\n this.prefetchDisplaySets();\n }, timeout);\n }\n\n prefetchDisplaySets() {\n // TODO: Allow passing in config\n const config = {\n order: 'closest',\n displaySetCount: 1\n };\n\n const displaySetsToPrefetch = this.getDisplaySetsToPrefetch(config);\n const imageIds = this.getImageIdsFromDisplaySets(displaySetsToPrefetch);\n\n this.prefetchImageIds(imageIds);\n }\n\n prefetchImageIds(imageIds) {\n const nonCachedImageIds = this.filterCachedImageIds(imageIds);\n const requestPoolManager = cornerstoneTools.requestPoolManager;\n const requestType = 'prefetch';\n const preventCache = false;\n const noop = () => {\n };\n\n nonCachedImageIds.forEach((imageId) => {\n requestPoolManager.addRequest(\n {},\n imageId,\n requestType,\n preventCache,\n noop,\n noop\n );\n });\n\n requestPoolManager.startGrabbing();\n }\n\n // getStudy(image) {\n // const StudyInstanceUID = cornerstone.metaData.get(\n // 'StudyInstanceUID',\n // image.imageId\n // );\n // return OHIF.viewer.Studies.find(\n // (study) => study.StudyInstanceUID === StudyInstanceUID\n // );\n // }\n\n // getSeries(study, image) {\n // const SeriesInstanceUID = cornerstone.metaData.get(\n // 'SeriesInstanceUID',\n // image.imageId\n // );\n // const studyMetadata = OHIF.viewerbase.getStudyMetadata(study);\n\n // return studyMetadata.getSeriesByUID(SeriesInstanceUID);\n // }\n\n getInstance(series, image) {\n const instanceMetadata = cornerstone.metaData.get(\n 'instance',\n image.imageId\n );\n return series.getInstanceByUID(instanceMetadata.SOPInstanceUID);\n }\n\n getActiveDisplaySet(displaySets, instance) {\n return displaySets.find((displaySet) => displaySet.images.some((displaySetImage) => displaySetImage.SOPInstanceUID === instance.SOPInstanceUID));\n }\n\n getDisplaySetsToPrefetch(config) {\n const image = this.getActiveViewportImage();\n\n if (!image || !config || !config.displaySetCount) {\n return [];\n }\n\n const study = this.getStudy(image);\n // const series = this.getSeries(study, image);\n // const instance = this.getInstance(series, image);\n const displaySets = study.displaySets;\n const activeDisplaySet = null; // this.getActiveDisplaySet(displaySets, instance);\n const prefetchMethodMap = {\n topdown: 'getFirstDisplaySets',\n downward: 'getNextDisplaySets',\n closest: 'getClosestDisplaySets'\n };\n\n const prefetchOrder = config.order;\n const methodName = prefetchMethodMap[prefetchOrder];\n const getDisplaySets = this[methodName];\n\n if (!getDisplaySets) {\n if (prefetchOrder) {\n log.warn(`Invalid prefetch order configuration (${prefetchOrder})`);\n }\n\n return [];\n }\n\n return getDisplaySets.call(\n this,\n displaySets,\n activeDisplaySet,\n config.displaySetCount\n );\n }\n\n getFirstDisplaySets(displaySets, activeDisplaySet, displaySetCount) {\n const length = displaySets.length;\n const selectedDisplaySets = [];\n\n for (let i = 0; i < length && displaySetCount; i++) {\n const displaySet = displaySets[i];\n\n if (displaySet !== activeDisplaySet) {\n selectedDisplaySets.push(displaySet);\n displaySetCount--;\n }\n }\n\n return selectedDisplaySets;\n }\n\n getNextDisplaySets(displaySets, activeDisplaySet, displaySetCount) {\n const activeDisplaySetIndex = displaySets.indexOf(activeDisplaySet);\n const begin = activeDisplaySetIndex + 1;\n const end = Math.min(begin + displaySetCount, displaySets.length);\n\n return displaySets.slice(begin, end);\n }\n\n getClosestDisplaySets(displaySets, activeDisplaySet, displaySetCount) {\n const activeDisplaySetIndex = displaySets.indexOf(activeDisplaySet);\n const length = displaySets.length;\n const selectedDisplaySets = [];\n let left = activeDisplaySetIndex - 1;\n let right = activeDisplaySetIndex + 1;\n\n while ((left >= 0 || right < length) && displaySetCount) {\n if (left >= 0) {\n selectedDisplaySets.push(displaySets[left]);\n displaySetCount--;\n left--;\n }\n\n if (right < length && displaySetCount) {\n selectedDisplaySets.push(displaySets[right]);\n displaySetCount--;\n right++;\n }\n }\n\n return selectedDisplaySets;\n }\n\n getImageIdsFromDisplaySets(displaySets) {\n let imageIds = [];\n\n displaySets.forEach((displaySet) => {\n imageIds = imageIds.concat(this.getImageIdsFromDisplaySet(displaySet));\n });\n\n return imageIds;\n }\n\n getImageIdsFromDisplaySet(displaySet) {\n const imageIds = [];\n\n // TODO: This duplicates work done by the stack manager\n // Mod by Triet: add check for images in displaySet\n if (displaySet.images && displaySet.images.length) {\n displaySet.images.forEach((image) => {\n const numFrames = image.numFrames;\n if (numFrames > 1) {\n for (let i = 0; i < numFrames; i++) {\n const imageId = getImageId(image, i);\n imageIds.push(imageId);\n }\n } else {\n const imageId = getImageId(image);\n imageIds.push(imageId);\n }\n });\n }\n\n return imageIds;\n }\n\n filterCachedImageIds(imageIds) {\n return imageIds.filter((imageId) => !this.isImageCached(imageId));\n }\n\n isImageCached(imageId) {\n const image = cornerstone.imageCache.imageCache[imageId];\n return image && image.sizeInBytes;\n }\n\n cacheFullHandler() {\n log.warn('Cache full');\n this.stopPrefetching();\n }\n}\n","import {api} from 'dicomweb-client';\nimport DICOMWeb from '../../../DICOMWeb';\n\n/**\n * Parses data returned from a QIDO search and transforms it into\n * an array of series that are present in the study\n *\n * @param server The DICOM server\n * @param StudyInstanceUID\n * @param resultData\n * @returns {Array} Series List\n */\nfunction resultDataToStudyMetadata(server, StudyInstanceUID, resultData) {\n const seriesMap = {};\n const series = [];\n\n resultData.forEach((instance) => {\n // Use seriesMap to cache series data\n // If the series instance UID has already been used to\n // process series data, continue using that series\n const SeriesInstanceUID = DICOMWeb.getString(instance['0020000E']);\n let series = seriesMap[SeriesInstanceUID];\n\n // If no series data exists in the seriesMap cache variable,\n // process any available series data\n if (!series) {\n series = {\n SeriesInstanceUID,\n SeriesNumber: DICOMWeb.getString(instance['00200011']),\n instances: []\n };\n\n // Save this data in the seriesMap cache variable\n seriesMap[SeriesInstanceUID] = series;\n series.push(series);\n }\n\n // The uri for the dicomweb\n // NOTE: DCM4CHEE seems to return the data zipped\n // NOTE: Orthanc returns the data with multi-part mime which cornerstoneWADOImageLoader doesn't\n // know how to parse yet\n // var uri = DICOMWeb.getString(instance['00081190']);\n // uri = uri.replace('wado-rs', 'dicom-web');\n\n // manually create a WADO-URI from the UIDs\n // NOTE: Haven't been able to get Orthanc's WADO-URI to work yet - maybe its not configured?\n const SOPInstanceUID = DICOMWeb.getString(instance['00080018']);\n const uri =\n `${server.wadoUriRoot\n }?requestType=WADO&studyUID=${\n StudyInstanceUID\n }&seriesUID=${\n SeriesInstanceUID\n }&objectUID=${\n SOPInstanceUID\n }&contentType=application%2Fdicom`;\n\n // Add this instance to the current series\n series.instances.push({\n SOPClassUID: DICOMWeb.getString(instance['00080016']),\n SOPInstanceUID,\n uri,\n InstanceNumber: DICOMWeb.getString(instance['00200013'])\n });\n });\n return series;\n}\n\n/**\n * Retrieve a set of instances using a QIDO call\n * @param server\n * @param StudyInstanceUID\n * @throws ECONNREFUSED\n * @returns {{wadoUriRoot: String, StudyInstanceUID: String, series: Array}}\n */\nexport default function Instances(server, StudyInstanceUID) {\n // TODO: Are we using this function anywhere?? Can we remove it?\n\n const config = {\n url: server.qidoRoot,\n headers: DICOMWeb.getAuthorizationHeader(server)\n };\n const dicomWeb = new api.DICOMwebClient(config);\n const options = {\n studyInstanceUID: StudyInstanceUID\n };\n\n return dicomWeb.searchForInstances(options).then((result) => ({\n wadoUriRoot: server.wadoUriRoot,\n StudyInstanceUID,\n series: resultDataToStudyMetadata(server, StudyInstanceUID, result.data)\n }));\n}\n","import {api} from 'dicomweb-client';\nimport DICOMWeb from '../../../DICOMWeb';\n\n/**\n * Creates a QIDO date string for a date range query\n * Assumes the year is positive, at most 4 digits long.\n *\n * @param date The Date object to be formatted\n * @returns {string} The formatted date string\n */\nfunction dateToString(date) {\n if (!date) return '';\n let year = date.getFullYear().toString();\n let month = (date.getMonth() + 1).toString();\n let day = date.getDate().toString();\n year = '0'.repeat(4 - year.length).concat(year);\n month = '0'.repeat(2 - month.length).concat(month);\n day = '0'.repeat(2 - day.length).concat(day);\n return ''.concat(year, month, day);\n}\n\n/**\n * Produces a QIDO URL given server details and a set of specified search filter\n * items\n *\n * @param filter\n * @param serverSupportsQIDOIncludeField\n * @returns {string} The URL with encoded filter query data\n */\nfunction getQIDOQueryParams(filter, serverSupportsQIDOIncludeField) {\n const commaSeparatedFields = [\n '00081030', // Study Description\n '00080060' // Modality\n // Add more fields here if you want them in the result\n ].join(',');\n\n const parameters = {\n PatientName: filter.PatientName,\n PatientID: filter.PatientID,\n AccessionNumber: filter.AccessionNumber,\n StudyDescription: filter.StudyDescription,\n ModalitiesInStudy: filter.ModalitiesInStudy,\n limit: filter.limit,\n offset: filter.offset,\n fuzzymatching: filter.fuzzymatching,\n includefield: serverSupportsQIDOIncludeField ? commaSeparatedFields : 'all'\n };\n\n // build the StudyDate range parameter\n if (filter.studyDateFrom || filter.studyDateTo) {\n const dateFrom = dateToString(new Date(filter.studyDateFrom));\n const dateTo = dateToString(new Date(filter.studyDateTo));\n parameters.StudyDate = `${dateFrom}-${dateTo}`;\n }\n\n // Build the StudyInstanceUID parameter\n if (filter.StudyInstanceUID) {\n let studyUIDs = filter.StudyInstanceUID;\n studyUIDs = Array.isArray(studyUIDs) ? studyUIDs.join() : studyUIDs;\n studyUIDs = studyUIDs.replace(/[^0-9.]+/g, '\\\\');\n parameters.StudyInstanceUID = studyUIDs;\n }\n\n // Clean query params of undefined values.\n const params = {};\n Object.keys(parameters).forEach((key) => {\n if (parameters[key] !== undefined && parameters[key] !== '') {\n params[key] = parameters[key];\n }\n });\n\n return params;\n}\n\n/**\n * Parses resulting data from a QIDO call into a set of Study MetaData\n *\n * @param resultData\n * @returns {Array} An array of Study MetaData objects\n */\nfunction resultDataToStudies(resultData) {\n const studies = [];\n\n if (!resultData || !resultData.length) return;\n\n resultData.forEach((study) => studies.push({\n StudyInstanceUID: DICOMWeb.getString(study['0020000D']),\n // 00080005 = SpecificCharacterSet\n StudyDate: DICOMWeb.getString(study['00080020']),\n StudyTime: DICOMWeb.getString(study['00080030']),\n AccessionNumber: DICOMWeb.getString(study['00080050']),\n referringPhysicianName: DICOMWeb.getString(study['00080090']),\n // 00081190 = URL\n PatientName: DICOMWeb.getName(study['00100010']),\n PatientID: DICOMWeb.getString(study['00100020']),\n PatientBirthdate: DICOMWeb.getString(study['00100030']),\n patientSex: DICOMWeb.getString(study['00100040']),\n studyId: DICOMWeb.getString(study['00200010']),\n numberOfStudyRelatedSeries: DICOMWeb.getString(study['00201206']),\n numberOfStudyRelatedInstances: DICOMWeb.getString(study['00201208']),\n StudyDescription: DICOMWeb.getString(study['00081030']),\n // Modality: DICOMWeb.getString(study['00080060']),\n // ModalitiesInStudy: DICOMWeb.getString(study['00080061']),\n modalities: DICOMWeb.getString(\n DICOMWeb.getModalities(study['00080060'], study['00080061'])\n )\n }));\n\n return studies;\n}\n\nexport default function Studies(server, filter) {\n const config = {\n url: server.qidoRoot,\n headers: DICOMWeb.getAuthorizationHeader(server)\n };\n\n const dicomWeb = new api.DICOMwebClient(config);\n server.qidoSupportsIncludeField =\n server.qidoSupportsIncludeField === undefined\n ? true\n : server.qidoSupportsIncludeField;\n const queryParams = getQIDOQueryParams(\n filter,\n server.qidoSupportsIncludeField\n );\n const options = {\n queryParams\n };\n\n return dicomWeb.searchForStudies(options).then(resultDataToStudies);\n}\n","// DICOMWeb instance, study, and metadata retrieval\nimport Instances from './qido/instances';\nimport Studies from './qido/studies';\nimport RetrieveMetadata from './wado/retrieveMetadata';\n\nconst WADO = {\n RetrieveMetadata\n};\n\nconst QIDO = {\n Studies,\n Instances\n};\n\nexport {QIDO, WADO};\n","import Studies from './services/qido/studies';\n\nconst studySearchPromises = new Map();\n\n/**\n * Search for studies information by the given filter\n *\n * @param {Object} filter Filter that will be used on search\n * @returns {Promise} resolved with an array of studies information or rejected with an error\n */\nexport default function searchStudies(server, filter) {\n const promiseKeyObj = {\n qidoRoot: server.qidoRoot,\n filter\n };\n const promiseKey = JSON.stringify(promiseKeyObj);\n if (studySearchPromises.has(promiseKey)) {\n return studySearchPromises.get(promiseKey);\n }\n const promise = Studies(server, filter);\n\n studySearchPromises.set(promiseKey, promise);\n\n return promise;\n}\n","import {QIDO, WADO} from './services';\nimport {\n deleteStudyMetadataPromise,\n retrieveStudyMetadata\n} from './retrieveStudyMetadata';\n\nimport getStudyBoxData from './getStudyBoxData';\nimport retrieveStudiesMetadata from './retrieveStudiesMetadata';\nimport searchStudies from './searchStudies';\nimport sortStudy from './sortStudy';\n\nconst studies = {\n services: {\n QIDO,\n WADO\n },\n loadingDict: {},\n retrieveStudyMetadata,\n deleteStudyMetadataPromise,\n retrieveStudiesMetadata,\n getStudyBoxData,\n searchStudies,\n sortStudy\n};\n\nexport default studies;\n","import log from '../log';\nimport {retrieveStudyMetadata} from './retrieveStudyMetadata';\n\n/**\n * Retrieves metaData for multiple studies at once.\n *\n * This function calls retrieveStudyMetadata several times, asynchronously,\n * and waits for all of the results to be returned.\n *\n * @param {Object} server Object with server configuration parameters\n * @param {Array} studyInstanceUIDs The UIDs of the Studies to be retrieved\n * @param {Object} [filters] - Object containing filters to be applied on retrieve metadata process\n * @param {string} [filter.seriesInstanceUID] - series instance uid to filter results against\n * @returns {Promise} that will be resolved with the metadata or rejected with the error\n */\nexport default function retrieveStudiesMetadata(\n server,\n studyInstanceUIDs,\n filters\n) {\n // Create an empty array to store the Promises for each metaData retrieval call\n const promises = [];\n\n // Loop through the array of studyInstanceUIDs\n studyInstanceUIDs.forEach((StudyInstanceUID) => {\n // Send the call and resolve or reject the related promise based on its outcome\n const promise = retrieveStudyMetadata(server, StudyInstanceUID, filters);\n\n // Add the current promise to the array of promises\n promises.push(promise);\n });\n\n // When all of the promises are complete, this callback runs\n const promise = Promise.all(promises);\n\n // Warn the error on console if some retrieval failed\n promise.catch((error) => log.warn(error));\n\n return promise;\n}\n","/**\n * Overridable namespace to allow getting study boxes data externally.\n *\n * The function must handle the first parameter as a studyInformation object containing at least the\n * StudyInstanceUID attribute.\n *\n * Shall return a promise that will be resolved with an object containing those attributes:\n * - StudyInstanceUID {String}: copy of studyInformation.StudyInstanceUID\n * - modalities {String}: 2 uppercase letters for each Modality split by any non-alphabetical char(s)\n * - StudyDate {String}: date formatted as YYYYMMDD\n * - StudyDescription {String}: study description string\n */\n// TODO: What is this for?\nconst getStudyBoxData = false;\n\nexport default getStudyBoxData;\n","const absoluteUrl = (path) => {\r\n let absolutePath = '/';\r\n\r\n if (!path) return absolutePath;\r\n\r\n // TODO: Find another way to get root url\r\n const absoluteUrl = window.location.origin;\r\n const absoluteUrlParts = absoluteUrl.split('/');\r\n\r\n if (absoluteUrlParts.length > 4) {\r\n const rootUrlPrefixIndex = absoluteUrl.indexOf(absoluteUrlParts[3]);\r\n absolutePath += absoluteUrl.substring(rootUrlPrefixIndex) + path;\r\n } else {\r\n absolutePath += path;\r\n }\r\n\r\n return absolutePath.replace(/\\/\\/+/g, '/');\r\n};\r\n\r\nexport default absoluteUrl;\r\n","// TODO: figure out where else to put this function\r\nconst addServers = (servers, store) => {\r\n if (!servers || !store) {\r\n throw new Error('The servers and store must be defined');\r\n }\r\n\r\n Object.keys(servers).forEach((serverType) => {\r\n const endpoints = servers[serverType];\r\n endpoints.forEach((endpoint) => {\r\n const server = Object.assign({}, endpoint);\r\n server.type = serverType;\r\n\r\n store.dispatch({\r\n type: 'ADD_SERVER',\r\n server\r\n });\r\n });\r\n });\r\n};\r\n\r\nexport default addServers;\r\n","/* Enabled JPEG images downloading on IE11. */\r\nconst b64toBlob = (b64Data, contentType = '', sliceSize = 512) => {\r\n const byteCharacters = atob(b64Data);\r\n const byteArrays = [];\r\n\r\n for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {\r\n const slice = byteCharacters.slice(offset, offset + sliceSize);\r\n\r\n const byteNumbers = new Array(slice.length);\r\n for (let i = 0; i < slice.length; i++) {\r\n byteNumbers[i] = slice.charCodeAt(i);\r\n }\r\n\r\n const byteArray = new Uint8Array(byteNumbers);\r\n byteArrays.push(byteArray);\r\n }\r\n\r\n const blob = new Blob(byteArrays, {type: contentType});\r\n return blob;\r\n};\r\n\r\nexport default b64toBlob;\r\n","import cornerstone from 'cornerstone-core';\r\nimport {api} from 'dicomweb-client';\r\nimport DICOMWeb from '../DICOMWeb';\r\nimport {getCornerstoneWADOImageLoader} from './cornerstoneWADOImageLoader';\r\n\r\nconst getImageId = (imageObj) => {\r\n if (!imageObj) {\r\n return;\r\n }\r\n\r\n return typeof imageObj.getImageId === 'function'\r\n ? imageObj.getImageId()\r\n : imageObj.url;\r\n};\r\n\r\nconst findImageIdOnStudies = (studies, displaySetInstanceUID) => {\r\n const study = studies.find((study) => {\r\n const displaySet = study.displaySets.some(\r\n (displaySet) => displaySet.displaySetInstanceUID === displaySetInstanceUID\r\n );\r\n return displaySet;\r\n });\r\n const {series = []} = study;\r\n const {instances = []} = series[0] || {};\r\n const instance = instances[0];\r\n\r\n return getImageId(instance);\r\n};\r\n\r\nconst someInvalidStrings = (strings) => {\r\n const stringsArray = Array.isArray(strings) ? strings : [strings];\r\n const emptyString = (string) => !string;\r\n let invalid = stringsArray.some(emptyString);\r\n return invalid;\r\n};\r\n\r\nconst getImageInstance = (dataset) => {\r\n return dataset && dataset.images && dataset.images[0];\r\n};\r\n\r\nconst getImageInstanceId = (imageInstance) => {\r\n return getImageId(imageInstance);\r\n};\r\n\r\nconst fetchIt = (url, headers = DICOMWeb.getAuthorizationHeader()) => {\r\n return fetch(url, headers).then((response) => response.arrayBuffer());\r\n};\r\n\r\nconst cornerstoneRetriever = (imageId) => {\r\n return cornerstone.loadAndCacheImage(imageId).then((image) => {\r\n return image && image.data && image.data.byteArray.buffer;\r\n });\r\n};\r\n\r\nconst wadorsRetriever = (\r\n url,\r\n studyInstanceUID,\r\n seriesInstanceUID,\r\n sopInstanceUID,\r\n headers = DICOMWeb.getAuthorizationHeader()\r\n) => {\r\n const config = {\r\n url,\r\n headers\r\n };\r\n const dicomWeb = new api.DICOMwebClient(config);\r\n\r\n return dicomWeb.retrieveInstance({\r\n studyInstanceUID,\r\n seriesInstanceUID,\r\n sopInstanceUID\r\n });\r\n};\r\n\r\nconst getImageLoaderType = (imageId) => {\r\n const loaderRegExp = /^\\w+:/;\r\n const loaderType = loaderRegExp.exec(imageId);\r\n\r\n return (\r\n (loaderRegExp.lastIndex === 0 &&\r\n loaderType &&\r\n loaderType[0] &&\r\n loaderType[0].replace(':', '')) ||\r\n ''\r\n );\r\n};\r\n\r\nclass DicomLoaderService {\r\n async getLocalData(dataset, studies) {\r\n if (dataset && dataset.localFile) {\r\n // Use referenced imageInstance\r\n const imageInstance = getImageInstance(dataset);\r\n let imageId = getImageInstanceId(imageInstance);\r\n\r\n // or Try to get it from studies\r\n if (someInvalidStrings(imageId)) {\r\n imageId = findImageIdOnStudies(studies, dataset.displaySetInstanceUID);\r\n }\r\n\r\n if (!someInvalidStrings(imageId)) {\r\n const cornerstoneWADOImageLoader = await getCornerstoneWADOImageLoader();\r\n return cornerstoneWADOImageLoader.wadouri.loadFileRequest(imageId);\r\n }\r\n }\r\n }\r\n\r\n getDataByImageType(dataset) {\r\n const imageInstance = getImageInstance(dataset);\r\n\r\n if (imageInstance) {\r\n let imageId = getImageInstanceId(imageInstance);\r\n let getDicomDataMethod = fetchIt;\r\n const loaderType = getImageLoaderType(imageId);\r\n\r\n switch (loaderType) {\r\n case 'dicomfile':\r\n getDicomDataMethod = cornerstoneRetriever.bind(this, imageId);\r\n break;\r\n case 'wadors':\r\n const url = imageInstance.getData().wadoRoot;\r\n const studyInstanceUID = imageInstance.getStudyInstanceUID();\r\n const seriesInstanceUID = imageInstance.getSeriesInstanceUID();\r\n const sopInstanceUID = imageInstance.getSOPInstanceUID();\r\n const invalidParams = someInvalidStrings([\r\n url,\r\n studyInstanceUID,\r\n seriesInstanceUID,\r\n sopInstanceUID\r\n ]);\r\n if (invalidParams) {\r\n return;\r\n }\r\n\r\n getDicomDataMethod = wadorsRetriever.bind(\r\n this,\r\n url,\r\n studyInstanceUID,\r\n seriesInstanceUID,\r\n sopInstanceUID\r\n );\r\n break;\r\n case 'wadouri':\r\n // Strip out the image loader specifier\r\n imageId = imageId.substring(imageId.indexOf(':') + 1);\r\n\r\n if (someInvalidStrings(imageId)) {\r\n return;\r\n }\r\n getDicomDataMethod = fetchIt.bind(this, imageId);\r\n break;\r\n }\r\n\r\n return getDicomDataMethod();\r\n }\r\n }\r\n\r\n getDataByDatasetType(dataset) {\r\n const {\r\n StudyInstanceUID,\r\n SeriesInstanceUID,\r\n SOPInstanceUID,\r\n authorizationHeaders,\r\n wadoRoot,\r\n wadoUri\r\n } = dataset;\r\n // Retrieve wadors or just try to fetch wadouri\r\n if (!someInvalidStrings(wadoRoot)) {\r\n return wadorsRetriever(\r\n wadoRoot,\r\n StudyInstanceUID,\r\n SeriesInstanceUID,\r\n SOPInstanceUID,\r\n authorizationHeaders\r\n );\r\n } else if (!someInvalidStrings(wadoUri)) {\r\n return fetchIt(wadoUri, {headers: authorizationHeaders});\r\n }\r\n }\r\n\r\n async *getLoaderIterator(dataset, studies) {\r\n yield await this.getLocalData(dataset, studies);\r\n yield this.getDataByImageType(dataset);\r\n yield this.getDataByDatasetType(dataset);\r\n }\r\n\r\n async findDicomDataPromise(dataset, studies) {\r\n const loaderIterator = this.getLoaderIterator(dataset, studies);\r\n // it returns first valid retriever method.\r\n for await (const loader of loaderIterator) {\r\n if (loader) {\r\n return loader;\r\n }\r\n }\r\n\r\n // in case of no valid loader\r\n throw new Error('Invalid dicom data loader');\r\n }\r\n}\r\n\r\nconst dicomLoaderService = new DicomLoaderService();\r\n\r\nexport default dicomLoaderService;\r\n","import studyMetadataManager from './studyMetadataManager';\r\n\r\n/**\r\n * Study schema\r\n *\r\n * @typedef {Object} Study\r\n * @property {Array} seriesList -\r\n * @property {Object} seriesMap -\r\n * @property {Object} seriesLoader -\r\n * @property {string} wadoUriRoot -\r\n * @property {string} wadoRoot -\r\n * @property {string} qidoRoot -\r\n * @property {string} patientName -\r\n * @property {string} patientId -\r\n * @property {number} patientAge -\r\n * @property {number} patientSize -\r\n * @property {number} patientWeight -\r\n * @property {string} accessionNumber -\r\n * @property {string} studyDate -\r\n * @property {string} studyTime -\r\n * @property {string} modalities -\r\n * @property {string} studyDescription -\r\n * @property {string} imageCount -\r\n * @property {string} studyInstanceUid -\r\n * @property {string} institutionName -\r\n * @property {Array} displaySets -\r\n */\r\n\r\n/**\r\n * Factory function to load and cache derived display sets.\r\n *\r\n * @param {object} referencedDisplaySet Display set\r\n * @param {string} referencedDisplaySet.displaySetInstanceUid Display set instance uid\r\n * @param {string} referencedDisplaySet.seriesDate\r\n * @param {string} referencedDisplaySet.seriesTime\r\n * @param {string} referencedDisplaySet.seriesInstanceUid\r\n * @param {string} referencedDisplaySet.seriesNumber\r\n * @param {string} referencedDisplaySet.seriesDescription\r\n * @param {number} referencedDisplaySet.numImageFrames\r\n * @param {string} referencedDisplaySet.frameRate\r\n * @param {string} referencedDisplaySet.modality\r\n * @param {boolean} referencedDisplaySet.isMultiFrame\r\n * @param {number} referencedDisplaySet.instanceNumber\r\n * @param {boolean} referencedDisplaySet.isReconstructable\r\n * @param {string} referencedDisplaySet.studyInstanceUid\r\n * @param {Array} referencedDisplaySet.sopClassUids\r\n * @param {Study[]} studies Collection of studies\r\n * @returns void\r\n */\r\nconst loadAndCacheDerivedDisplaySets = (referencedDisplaySet, studies) => {\r\n const {StudyInstanceUID, SeriesInstanceUID} = referencedDisplaySet;\r\n\r\n const studyMetadata = studyMetadataManager.get(StudyInstanceUID);\r\n\r\n if (!studyMetadata) {\r\n return;\r\n }\r\n\r\n const derivedDisplaySets = studyMetadata.getDerivedDatasets({\r\n referencedSeriesInstanceUID: SeriesInstanceUID\r\n });\r\n\r\n if (!derivedDisplaySets.length) {\r\n return;\r\n }\r\n\r\n // Filter by type\r\n const displaySetsPerModality = {};\r\n\r\n derivedDisplaySets.forEach((displaySet) => {\r\n const Modality = displaySet.Modality;\r\n\r\n if (displaySetsPerModality[Modality] === undefined) {\r\n displaySetsPerModality[Modality] = [];\r\n }\r\n\r\n displaySetsPerModality[Modality].push(displaySet);\r\n });\r\n\r\n // For each type, see if any are loaded, if not load the most recent.\r\n Object.keys(displaySetsPerModality).forEach((key) => {\r\n const displaySets = displaySetsPerModality[key];\r\n const isLoaded = displaySets.some((displaySet) => displaySet.isLoaded);\r\n\r\n if (isLoaded) {\r\n return;\r\n }\r\n\r\n // find most recent and load it.\r\n let recentDateTime = 0;\r\n let recentDisplaySet;\r\n\r\n displaySets.forEach((displaySet) => {\r\n const dateTime = Number(\r\n `${displaySet.SeriesDate}${displaySet.SeriesTime}`\r\n );\r\n if (dateTime > recentDateTime) {\r\n recentDateTime = dateTime;\r\n recentDisplaySet = displaySet;\r\n }\r\n });\r\n\r\n recentDisplaySet.load(referencedDisplaySet, studies);\r\n });\r\n};\r\n\r\nexport default loadAndCacheDerivedDisplaySets;\r\n","// Return the array sorting function for its object's properties\r\nexport default function sortBy() {\r\n var fields = [].slice.call(arguments),\r\n n_fields = fields.length;\r\n\r\n return function(A, B) {\r\n var a, b, field, key, reverse, result, i;\r\n\r\n for (i = 0; i < n_fields; i++) {\r\n result = 0;\r\n field = fields[i];\r\n\r\n key = typeof field === 'string' ? field : field.name;\r\n\r\n a = A[key];\r\n b = B[key];\r\n\r\n if (typeof field.primer !== 'undefined') {\r\n a = field.primer(a);\r\n b = field.primer(b);\r\n }\r\n\r\n reverse = field.reverse ? -1 : 1;\r\n\r\n if (a < b) {\r\n result = reverse * -1;\r\n }\r\n\r\n if (a > b) {\r\n result = reverse * 1;\r\n }\r\n\r\n if (result !== 0) {\r\n break;\r\n }\r\n }\r\n\r\n return result;\r\n };\r\n}\r\n","import lib from 'query-string';\r\n\r\nconst PARAM_SEPARATOR = ';';\r\nconst PARAM_PATTERN_IDENTIFIER = ':';\r\n\r\nfunction toLowerCaseFirstLetter(word) {\r\n return word[0].toLowerCase() + word.slice(1);\r\n}\r\nconst getQueryFilters = (location = {}) => {\r\n const {search} = location;\r\n\r\n if (!search) {\r\n return;\r\n }\r\n\r\n const searchParameters = parse(search);\r\n const filters = {};\r\n\r\n Object.entries(searchParameters).forEach(([key, value]) => {\r\n filters[toLowerCaseFirstLetter(key)] = value;\r\n });\r\n\r\n return filters;\r\n};\r\n\r\nconst decode = (strToDecode = '') => {\r\n try {\r\n const decoded = window.atob(strToDecode);\r\n return decoded;\r\n } catch (e) {\r\n return strToDecode;\r\n }\r\n};\r\n\r\nconst parse = (toParse) => {\r\n if (toParse) {\r\n return lib.parse(toParse);\r\n }\r\n\r\n return {};\r\n};\r\nconst parseParam = (paramStr) => {\r\n const _paramDecoded = decode(paramStr);\r\n if (_paramDecoded && typeof _paramDecoded === 'string') {\r\n return _paramDecoded.split(PARAM_SEPARATOR);\r\n }\r\n};\r\n\r\nconst replaceParam = (path = '', paramKey, paramValue) => {\r\n const paramPattern = `${PARAM_PATTERN_IDENTIFIER}${paramKey}`;\r\n if (paramValue) {\r\n return path.replace(paramPattern, paramValue);\r\n }\r\n\r\n return path;\r\n};\r\n\r\nconst isValidPath = (path) => {\r\n const paramPatternPiece = `/${PARAM_PATTERN_IDENTIFIER}`;\r\n return path.indexOf(paramPatternPiece) < 0;\r\n};\r\n\r\nconst queryString = {\r\n getQueryFilters\r\n};\r\n\r\nconst paramString = {\r\n isValidPath,\r\n parseParam,\r\n replaceParam\r\n};\r\n\r\nexport {parse, queryString, paramString};\r\n","\n/** Process series metadata and split if necessary\n* @param {Object} series original series\n* @author Triet\n*/\n\nconst getManufacturer = (instance) => {\n const { metadata } = instance;\n return metadata.Manufacturer || metadata['00080070'] || '';\n};\n\nconst getSplitRules = (manufacturer) => {\n /** Define rules for each modality types and madufacturer\n * if the value of the defined Tag is different accross the instances, the instances will be split\n * into each Tag\n */\n const manufacturerLowerCase = manufacturer.toLowerCase();\n // console.log('manufacturer', manufacturerLowerCase);\n if (manufacturerLowerCase.indexOf('siemens') > -1) {\n return {\n MR: [\n 'ImageType',\n 'SequenceName',\n '0019100C', // SIEMENS b-value\n 'EchoTime',\n 'RepetitionTime'\n ]\n };\n }\n else if (manufacturerLowerCase.indexOf('philips') > -1) {\n return {\n MR: [\n 'ImageType', // \n '20011020', // pulse sequence name\n '20011003', // PHILIPS b-value\n 'EchoTime',\n 'RepetitionTime'\n ]\n };\n }\n // else if (manufacturerLowerCase === 'toshiba') {\n // return {};\n // }\n \n // default case\n return {\n MR: [\n 'ImageType',\n 'SequenceName',\n 'DiffusionBValue',\n 'EchoTime',\n 'RepetitionTime'\n ]\n };\n};\n\nconst seriesDescriptionSuffix = ' - Subseries ';\n\nexport default (series) => {\n // console.log('splitSeries', series);\n let result;\n const { instances, Modality } = series;\n if (instances && instances.length) {\n switch (Modality) {\n case 'MR':\n // console.log('splitSeries MR ne'); \n result = processMRSeries(series);\n return result;\n default:\n return [series];\n }\n } else return [series];\n};\n\nconst processMRSeries = (series) => {\n const subSeriesInstances = splitInstances(series.instances, getSplitRules(getManufacturer(series.instances[0])).MR);\n delete series.instance;\n let count = 0;\n let isSubSeries = false;\n let descriptionSuffix;\n // let SubSeriesIndex;\n if (subSeriesInstances.length > 1) {\n isSubSeries = true;\n descriptionSuffix = seriesDescriptionSuffix;\n }\n const subSeriesList = subSeriesInstances.map((subInstances) => {\n count++;\n return {\n ...series,\n SeriesDescription: isSubSeries ? series.SeriesDescription + descriptionSuffix + count : series.SeriesDescription,\n // SeriesInstanceUID: series.SeriesInstanceUID + '.' + count,\n SubSeriesIndex: isSubSeries ? '_' + count : '',\n isSubSeries: isSubSeries,\n instances: subInstances\n };\n });\n // console.log('processMRSeries', subSeriesList);\n return subSeriesList;\n};\n\nconst splitInstances = (instances, ruleSet) => {\n // console.log('instances', instances);\n // console.log('manufacturer', getManufacturer(instances[0]));\n let instancesList = [];\n const rulesLength = ruleSet.length;\n const uniqueValues = new Array(rulesLength).fill(new Set()); // list of possible unique values accross rule set\n const indexes = new Set(); // list of the subseries identifier\n instances.forEach((instance) => {\n let index = ''; // instance identifier\n for (let i = 0; i < rulesLength; i++) {\n // generate instance identifier for each rule\n const val = getMetadataValueFromRule(instance.metadata, ruleSet[i]);\n const valString = getValueString(val);\n uniqueValues[i].add(valString);\n index += [...uniqueValues[i]].indexOf(valString);\n }\n // if instance identifier is different from previous instances, make new subseries\n indexes.add(index);\n const subSeriesIndex = [...indexes].indexOf(index);\n // add instance to output array according to subseries index\n if (!instancesList[subSeriesIndex]) instancesList[subSeriesIndex] = [instance];\n else instancesList[subSeriesIndex].push(instance);\n });\n // console.log('processMRSeries uniqueValues', uniqueValues);\n // console.log('processMRSeries subSeries', instancesList);\n return instancesList;\n};\n\nconst getMetadataValueFromRule = (metadata, rule) => {\n const objectKeys = rule.split('.');\n // console.log('getMetadataValue objectKeys', objectKeys);\n let value = metadata[objectKeys[0]];\n for (let i = 1; i < objectKeys.length; i++) {\n value = value[objectKeys[i]];\n }\n return value;\n};\n\nconst getValueString = (val) => {\n // console.log('getValueString', val);\n if (Array.isArray(val)) {\n // array can't be differentiated in Set, so we have to flatten them\n // console.log(val.join('/'));\n return val.join('/');\n }\n return val;\n};\n","import absoluteUrl from './absoluteUrl';\r\nimport addServers from './addServers';\r\nimport b64toBlob from './b64toBlob';\r\nimport DicomLoaderService from './dicomLoaderService';\r\nimport getImageSetCalculatedSpacings from './getImageSetCalculatedSpacings';\r\nimport guid from './guid';\r\nimport hotkeys from './hotkeys';\r\nimport loadAndCacheDerivedDisplaySets from './loadAndCacheDerivedDisplaySets';\r\nimport makeCancelable from './makeCancelable';\r\nimport ObjectPath from './objectPath';\r\nimport sortBy from './sortBy';\r\nimport StackManager from './StackManager';\r\nimport studyMetadataManager from './studyMetadataManager';\r\nimport * as urlUtil from './urlUtil';\r\nimport writeScript from './writeScript';\r\nimport splitSeries from './splitSeries';\r\n\r\nconst utils = {\r\n guid,\r\n ObjectPath,\r\n absoluteUrl,\r\n addServers,\r\n sortBy,\r\n writeScript,\r\n b64toBlob,\r\n StackManager,\r\n studyMetadataManager,\r\n DicomLoaderService,\r\n urlUtil,\r\n loadAndCacheDerivedDisplaySets,\r\n makeCancelable,\r\n hotkeys,\r\n getImageSetCalculatedSpacings,\r\n splitSeries\r\n};\r\n\r\nexport {\r\n guid,\r\n ObjectPath,\r\n absoluteUrl,\r\n addServers,\r\n sortBy,\r\n writeScript,\r\n b64toBlob,\r\n StackManager,\r\n studyMetadataManager,\r\n DicomLoaderService,\r\n urlUtil,\r\n loadAndCacheDerivedDisplaySets,\r\n makeCancelable,\r\n hotkeys,\r\n getImageSetCalculatedSpacings,\r\n splitSeries\r\n};\r\n\r\nexport default utils;\r\n","export class ObjectPath {\r\n /**\r\n * Set an object property based on \"path\" (namespace) supplied creating\r\n * ... intermediary objects if they do not exist.\r\n * @param object {Object} An object where the properties specified on path should be set.\r\n * @param path {String} A string representing the property to be set, e.g. \"user.study.series.timepoint\".\r\n * @param value {Any} The value of the property that will be set.\r\n * @return {Boolean} Returns \"true\" on success, \"false\" if any intermediate component of the supplied path\r\n * ... is not a valid Object, in which case the property cannot be set. No excpetions are thrown.\r\n */\r\n static set(object, path, value) {\r\n let components = ObjectPath.getPathComponents(path),\r\n length = components !== null ? components.length : 0,\r\n result = false;\r\n\r\n if (length > 0 && ObjectPath.isValidObject(object)) {\r\n let i = 0,\r\n last = length - 1,\r\n currentObject = object;\r\n\r\n while (i < last) {\r\n let field = components[i];\r\n\r\n if (field in currentObject) {\r\n if (!ObjectPath.isValidObject(currentObject[field])) {\r\n break;\r\n }\r\n } else {\r\n currentObject[field] = {};\r\n }\r\n\r\n currentObject = currentObject[field];\r\n i++;\r\n }\r\n\r\n if (i === last) {\r\n currentObject[components[last]] = value;\r\n result = true;\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Get an object property based on \"path\" (namespace) supplied traversing the object\r\n * ... tree as necessary.\r\n * @param object {Object} An object where the properties specified might exist.\r\n * @param path {String} A string representing the property to be searched for, e.g. \"user.study.series.timepoint\".\r\n * @return {Any} The value of the property if found. By default, returns the special type \"undefined\".\r\n */\r\n static get(object, path) {\r\n let found, // undefined by default\r\n components = ObjectPath.getPathComponents(path),\r\n length = components !== null ? components.length : 0;\r\n\r\n if (length > 0 && ObjectPath.isValidObject(object)) {\r\n let i = 0,\r\n last = length - 1,\r\n currentObject = object;\r\n\r\n while (i < last) {\r\n let field = components[i];\r\n\r\n const isValid = ObjectPath.isValidObject(currentObject[field]);\r\n if (field in currentObject && isValid) {\r\n currentObject = currentObject[field];\r\n i++;\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n if (i === last && components[last] in currentObject) {\r\n found = currentObject[components[last]];\r\n }\r\n }\r\n\r\n return found;\r\n }\r\n\r\n /**\r\n * Check if the supplied argument is a real JavaScript Object instance.\r\n * @param object {Any} The subject to be tested.\r\n * @return {Boolean} Returns \"true\" if the object is a real Object instance and \"false\" otherwise.\r\n */\r\n static isValidObject(object) {\r\n return (\r\n typeof object === 'object' && object !== null && object instanceof Object\r\n );\r\n }\r\n\r\n static getPathComponents(path) {\r\n return typeof path === 'string' ? path.split('.') : null;\r\n }\r\n}\r\n\r\nexport default ObjectPath;\r\n","/* jshint -W060 */\r\nimport absoluteUrl from './absoluteUrl';\r\n\r\nexport default function writeScript(fileName, callback) {\r\n const script = document.createElement('script');\r\n script.src = absoluteUrl(fileName);\r\n script.onload = () => {\r\n if (typeof callback === 'function') {\r\n callback(script);\r\n }\r\n };\r\n\r\n document.body.appendChild(script);\r\n}\r\n","export default function makeCancelable(thenable) {\r\n let isCanceled = false;\r\n const promise = Promise.resolve(thenable).then(\r\n function(result) {\r\n if (isCanceled) throw Object.freeze({isCanceled});\r\n return result;\r\n },\r\n function(error) {\r\n if (isCanceled) throw Object.freeze({isCanceled, error});\r\n throw error;\r\n }\r\n );\r\n return Object.assign(Object.create(promise), {\r\n then: promise.then.bind(promise),\r\n cancel() {\r\n isCanceled = true;\r\n }\r\n });\r\n}\r\n","/**\n * Should Find the requested instance metadata into the displaySets and return\n *\n * @param {Array} displaySets - List of displaySets\n * @param {string} SOPInstanceUID - sopInstanceUID to look for\n * @returns {Object} - instance metadata found\n */\nconst findInstanceMetadataBySopInstanceUID = (displaySets, SOPInstanceUID) => {\n let instanceFound;\n\n displaySets.find((displaySet) => {\n if (!displaySet.images) return false;\n\n instanceFound = displaySet.images.find((instanceMetadata) => instanceMetadata.getSOPInstanceUID() === SOPInstanceUID);\n\n return !!instanceFound;\n });\n\n return instanceFound;\n};\n\nexport default findInstanceMetadataBySopInstanceUID;\n","import * as dcmjs from 'dcmjs';\n\nimport findInstanceMetadataBySopInstanceUID from './utils/findInstanceMetadataBySopInstanceUid';\n\n/**\n * Function to parse the part10 array buffer that comes from a DICOM Structured report into measurementData\n * measurementData format is a viewer specific format to be stored into the redux and consumed by other components\n * (e.g. measurement table)\n *\n * @param {ArrayBuffer} part10SRArrayBuffer\n * @param {Array} displaySets\n * @returns\n */\nconst parseDicomStructuredReport = (part10SRArrayBuffer, displaySets) => {\n // Get the dicom data as an Object\n\n const dicomData = dcmjs.data.DicomMessage.readFile(part10SRArrayBuffer);\n const dataset = dcmjs.data.DicomMetaDictionary.naturalizeDataset(\n dicomData.dict\n );\n\n const {MeasurementReport} = dcmjs.adapters.Cornerstone;\n const storedMeasurementByToolType = MeasurementReport.generateToolState(\n dataset\n );\n const measurementData = {};\n let measurementNumber = 0;\n\n Object.keys(storedMeasurementByToolType).forEach((toolName) => {\n const measurements = storedMeasurementByToolType[toolName];\n measurementData[toolName] = [];\n\n measurements.forEach((measurement) => {\n const instanceMetadata = findInstanceMetadataBySopInstanceUID(\n displaySets,\n measurement.sopInstanceUid\n );\n\n const {_study: study, _series: series} = instanceMetadata;\n const {StudyInstanceUID, PatientID} = study;\n const {SeriesInstanceUID} = series;\n const {sopInstanceUid, frameIndex} = measurement;\n const imagePath = getImagePath(\n StudyInstanceUID,\n SeriesInstanceUID,\n sopInstanceUid,\n frameIndex\n );\n\n const imageId = instanceMetadata.getImageId();\n if (!imageId) {\n return;\n }\n\n // TODO: We need the currentTimepointID set into the viewer\n const currentTimepointId = 'TimepointId';\n\n const toolData = {...measurement,\n imageId,\n imagePath,\n SOPInstanceUID: sopInstanceUid,\n SeriesInstanceUID,\n StudyInstanceUID,\n PatientID,\n measurementNumber: ++measurementNumber,\n timepointId: currentTimepointId,\n toolType: toolName,\n _id: imageId + measurementNumber};\n\n measurementData[toolName].push(toolData);\n });\n });\n\n return measurementData;\n};\n\n/**\n * Function to create imagePath with all imageData related\n *\n * @param {string} StudyInstanceUID\n * @param {string} SeriesInstanceUID\n * @param {string} SOPInstanceUID\n * @param {string} frameIndex\n * @returns\n */\nconst getImagePath = (\n StudyInstanceUID,\n SeriesInstanceUID,\n SOPInstanceUID,\n frameIndex\n) => [StudyInstanceUID, SeriesInstanceUID, SOPInstanceUID, frameIndex].join(\n '_'\n);\n\nexport default parseDicomStructuredReport;\n","const displayFunction = (data) => data.text || '';\n\nexport const arrowAnnotate = {\n id: 'ArrowAnnotate',\n name: 'ArrowAnnotate',\n toolGroup: 'allTools',\n cornerstoneToolType: 'ArrowAnnotate',\n options: {\n measurementTable: {\n displayFunction\n },\n caseProgress: {\n include: true,\n evaluate: true\n }\n }\n};\n","const displayFunction = (data) => {\n if (data.shortestDiameter) {\n // TODO: Make this check criteria again to see if we should display shortest x longest\n return `${data.longestDiameter} x ${data.shortestDiameter}`;\n }\n\n return data.longestDiameter;\n};\n\nexport const bidirectional = {\n id: 'Bidirectional',\n name: 'Target',\n toolGroup: 'allTools',\n cornerstoneToolType: 'Bidirectional',\n options: {\n measurementTable: {\n displayFunction\n },\n caseProgress: {\n include: true,\n evaluate: true\n }\n }\n};\n","const displayFunction = (data) => {\n let meanValue = '';\n const {cachedStats} = data;\n if (cachedStats && cachedStats.mean && !isNaN(cachedStats.mean)) {\n meanValue = `${cachedStats.mean.toFixed(2)} HU`;\n }\n return meanValue;\n};\n\nexport const ellipticalRoi = {\n id: 'EllipticalRoi',\n name: 'Ellipse',\n toolGroup: 'allTools',\n cornerstoneToolType: 'EllipticalRoi',\n options: {\n measurementTable: {\n displayFunction\n },\n caseProgress: {\n include: true,\n evaluate: true\n }\n }\n};\n","const displayFunction = (data) => {\n let meanValue = '';\n const {cachedStats} = data;\n if (cachedStats && cachedStats.mean && !isNaN(cachedStats.mean)) {\n meanValue = `${cachedStats.mean.toFixed(2)} HU`;\n }\n return meanValue;\n};\n\nexport const circleRoi = {\n id: 'CircleRoi',\n name: 'Circle',\n toolGroup: 'allTools',\n cornerstoneToolType: 'CircleRoi',\n options: {\n measurementTable: {\n displayFunction\n },\n caseProgress: {\n include: true,\n evaluate: true\n }\n }\n};\n","const displayFunction = (data) => {\n let meanValue = '';\n if (data.meanStdDev && data.meanStdDev.mean && !isNaN(data.meanStdDev.mean)) {\n meanValue = `${data.meanStdDev.mean.toFixed(2)} HU`;\n }\n return meanValue;\n};\n\nexport const freehandMouse = {\n id: 'FreehandRoi',\n name: 'Freehand',\n toolGroup: 'allTools',\n cornerstoneToolType: 'FreehandRoi',\n options: {\n measurementTable: {\n displayFunction\n },\n caseProgress: {\n include: true,\n evaluate: true\n }\n }\n};\n","const displayFunction = (data) => {\n let lengthValue = '';\n if (data.length && !isNaN(data.length)) {\n lengthValue = `${data.length.toFixed(2)} ${data.unit ? data.unit : 'mm'}`;\n }\n return lengthValue;\n};\n\nexport const length = {\n id: 'Length',\n name: 'Length',\n toolGroup: 'allTools',\n cornerstoneToolType: 'Length',\n options: {\n measurementTable: {\n displayFunction\n },\n caseProgress: {\n include: true,\n evaluate: true\n }\n }\n};\n","export const nonTarget = {\n id: 'NonTarget',\n name: 'Non-Target',\n toolGroup: 'allTools',\n cornerstoneToolType: 'NonTarget',\n options: {\n measurementTable: {\n displayFunction: (data) => data.response\n },\n caseProgress: {\n include: true,\n evaluate: true\n }\n }\n};\n","const displayFunction = (data) => {\n let meanValue = '';\n const {cachedStats} = data;\n if (cachedStats && cachedStats.mean && !isNaN(cachedStats.mean)) {\n meanValue = `${cachedStats.mean.toFixed(2)} HU`;\n }\n return meanValue;\n};\n\nexport const rectangleRoi = {\n id: 'RectangleRoi',\n name: 'Rectangle',\n toolGroup: 'allTools',\n cornerstoneToolType: 'RectangleRoi',\n options: {\n measurementTable: {\n displayFunction\n },\n caseProgress: {\n include: true,\n evaluate: true\n }\n }\n};\n","const displayFunction = (data) => {\n let text = '';\n if (data.rAngle && !isNaN(data.rAngle)) {\n text = data.rAngle.toFixed(2) + String.fromCharCode(0x00B0);\n }\n return text;\n};\n\nexport const angle = {\n id: 'Angle',\n name: 'Angle',\n toolGroup: 'allTools',\n cornerstoneToolType: 'Angle',\n options: {\n measurementTable: {\n displayFunction\n },\n caseProgress: {\n include: true,\n evaluate: true\n }\n }\n};\n","export const targetCR = {\n id: 'TargetCR',\n name: 'CR Target',\n toolGroup: 'allTools',\n cornerstoneToolType: 'TargetCR',\n options: {\n measurementTable: {\n displayFunction: (data) => data.response\n },\n caseProgress: {\n include: true,\n evaluate: true\n }\n }\n};\n","export const targetNE = {\n id: 'TargetNE',\n name: 'NE Target',\n toolGroup: 'allTools',\n cornerstoneToolType: 'TargetNE',\n options: {\n measurementTable: {\n displayFunction: (data) => data.response\n },\n caseProgress: {\n include: true,\n evaluate: true\n }\n }\n};\n","export const targetUN = {\n id: 'TargetUN',\n name: 'UN Target',\n toolGroup: 'allTools',\n cornerstoneToolType: 'TargetUN',\n options: {\n measurementTable: {\n displayFunction: (data) => data.response\n },\n caseProgress: {\n include: true,\n evaluate: true\n }\n }\n};\n","const displayFunction = (data) => {\r\n let text = '';\r\n if (data.rAngle && !isNaN(data.rAngle)) {\r\n text = data.rAngle.toFixed(2) + String.fromCharCode(0x00B0);\r\n }\r\n return text;\r\n};\r\n\r\nexport const cobbAngle = {\r\n id: 'CobbAngle',\r\n name: 'CobbAngle',\r\n toolGroup: 'allTools',\r\n cornerstoneToolType: 'CobbAngle',\r\n options: {\r\n measurementTable: {\r\n displayFunction\r\n },\r\n caseProgress: {\r\n include: true,\r\n evaluate: true\r\n }\r\n }\r\n};\r\n","const displayFunction = (data) => `Probe ${parseInt(data.handles.end.x)}, ${parseInt(data.handles.end.y)}`;\n\nexport const probe = {\n id: 'Probe',\n name: 'Probe',\n toolGroup: 'allTools',\n cornerstoneToolType: 'Probe',\n options: {\n measurementTable: {\n displayFunction\n },\n caseProgress: {\n include: true,\n evaluate: true\n }\n }\n};\n","import * as tools from '../tools';\n\nconst childTools = [];\nObject.keys(tools).forEach((key) => childTools.push(tools[key]));\n\nexport const allTools = {\n id: 'allTools',\n name: 'Measurements',\n childTools,\n options: {\n caseProgress: {\n include: true,\n evaluate: true\n }\n }\n};\n","import {allTools} from './toolGroups/allTools';\nimport {\n retrieveMeasurements,\n storeMeasurements,\n retrieveTimepoints,\n storeTimepoints,\n removeTimepoint,\n updateTimepoint,\n disassociateStudy\n} from './dataExchange';\n\nconst measurementApiDefaultConfig = {\n measurementTools: [allTools],\n newLesions: [\n {\n id: 'newTargets',\n name: 'New Targets',\n toolGroupId: 'targets'\n },\n {\n id: 'newNonTargets',\n name: 'New Non-Targets',\n toolGroupId: 'nonTargets'\n }\n ],\n dataExchange: {\n retrieve: retrieveMeasurements,\n store: storeMeasurements\n }\n};\n\nconst timepointApiDefaultConfig = {\n dataExchange: {\n retrieve: retrieveTimepoints,\n store: storeTimepoints,\n remove: removeTimepoint,\n update: updateTimepoint,\n disassociate: disassociateStudy\n }\n};\n\nexport {measurementApiDefaultConfig, timepointApiDefaultConfig};\n","import log from '../log';\n\nexport const retrieveMeasurements = (PatientID, timepointIds) => {\n log.error('retrieveMeasurements');\n return Promise.resolve();\n};\n\nexport const storeMeasurements = (measurementData, timepointIds) => {\n log.error('storeMeasurements');\n return Promise.resolve();\n};\n\nexport const retrieveTimepoints = (filter) => {\n log.error('retrieveTimepoints');\n return Promise.resolve();\n};\n\nexport const storeTimepoints = (timepointData) => {\n log.error('storeTimepoints');\n return Promise.resolve();\n};\n\nexport const updateTimepoint = (timepointData, query) => {\n log.error('updateTimepoint');\n return Promise.resolve();\n};\n\nexport const removeTimepoint = (timepointId) => {\n log.error('removeTimepoint');\n return Promise.resolve();\n};\n\nexport const disassociateStudy = (timepointIds, StudyInstanceUID) => {\n log.error('disassociateStudy');\n return Promise.resolve();\n};\n","import log from '../../log';\nimport { timepointApiDefaultConfig } from '../configuration';\n\nconst configuration = {\n ...timepointApiDefaultConfig\n};\n\nconst TIMEPOINT_TYPE_NAMES = {\n prebaseline: 'Pre-Baseline',\n baseline: 'Baseline',\n followup: 'Follow-up'\n};\n\nexport default class TimepointApi {\n static Instance;\n\n static setConfiguration(config) {\n Object.assign(configuration, config);\n }\n\n static getConfiguration() {\n return configuration;\n }\n\n constructor(currentTimepointId, options = {}) {\n if (TimepointApi.Instance) {\n TimepointApi.Instance.initialize(currentTimepointId, options);\n return TimepointApi.Instance;\n }\n\n this.initialize(currentTimepointId, options);\n TimepointApi.Instance = this;\n }\n\n static getInstance() {\n if (!this.Instance) {\n this.Instance = new TimepointApi();\n }\n return this.Instance;\n }\n\n initialize(currentTimepointId, options = {}) {\n this.currentTimepointId = currentTimepointId;\n this.comparisonTimepointKey = options.comparisonTimepointKey || 'baseline';\n this.options = options;\n this.timepoints = [];\n }\n\n onTimepointsUpdated() {\n if (typeof this.options.onTimepointsUpdated !== 'function') {\n log.warn('Timepoints update callback is not defined');\n return;\n }\n\n this.options.onTimepointsUpdated(Object.assign([], this.timepoints));\n }\n\n calculateVisitNumber(timepoint) {\n // Retrieve all of the relevant follow-up timepoints for this patient\n const sortedTimepoints = this.timepoints.sort((tp1, tp2) =>\n tp1.visitDate > tp2.visitDate ? 1 : -1\n );\n const filteredTimepoints = sortedTimepoints.find(\n (tp) =>\n tp.PatientID === timepoint.PatientID &&\n tp.timepointType === timepoint.timepointType\n );\n\n // Create an array of just timepointIds, so we can use indexOf\n // on it to find the current timepoint's relative position\n const timepointIds = filteredTimepoints.map(\n (timepoint) => timepoint.timepointId\n );\n\n // Calculate the index of the current timepoint in the array of all\n // relevant follow-up timepoints\n const visitNumber = timepointIds.indexOf(timepoint.timepointId) + 1;\n\n // If visitNumber is 0, it means that the current timepoint was not in the list\n if (!visitNumber) {\n throw new Error(\n 'Current timepoint was not in the list of relevant timepoints?'\n );\n }\n\n return visitNumber;\n }\n\n retrieveTimepoints(filter) {\n const retrievalFn = configuration.dataExchange.retrieve;\n if (typeof retrievalFn !== 'function') {\n log.error('Timepoint retrieval function has not been configured.');\n return;\n }\n\n return new Promise((resolve, reject) => {\n retrievalFn(filter)\n .then((timepointData) => {\n log.info('Timepoint data retrieval');\n\n timepointData.forEach((timepoint) => {\n const timepointIndex = this.timepoints.findIndex(\n (tp) => tp.timepointId === timepoint.timepointId\n );\n if (timepointIndex < 0) {\n this.timepoints.push(timepoint);\n } else {\n this.timepoints[timepointIndex] = timepoint;\n }\n });\n\n // Let others know that the timepoints are updated\n this.onTimepointsUpdated();\n\n resolve();\n })\n .catch((reason) => {\n log.error(`Timepoint retrieval function failed: ${reason}`);\n reject(reason);\n });\n });\n }\n\n storeTimepoints() {\n const storeFn = configuration.dataExchange.store;\n if (typeof storeFn !== 'function') {\n log.error('Timepoint store function has not been configured.');\n return;\n }\n\n log.info('Preparing to store timepoints');\n log.info(JSON.stringify(this.timepoints, null, 2));\n\n // storeFn(this.timepoints).then(() => log.info('Timepoint storage completed'));\n // TungLT: change logic to use result of storing timepoints data\n return storeFn(this.timepoints);\n }\n\n disassociateStudy(timepointIds, StudyInstanceUID) {\n const disassociateFn = configuration.dataExchange.disassociate;\n if (typeof disassociateFn !== 'function') {\n log.error('Study disassociate function has not been configured.');\n return;\n }\n\n disassociateFn(timepointIds, StudyInstanceUID).then(() => {\n log.info('Disassociation completed');\n\n this.timepoints = [];\n this.retrieveTimepoints({});\n });\n }\n\n removeTimepoint(timepointId) {\n const removeFn = configuration.dataExchange.remove;\n if (typeof removeFn !== 'function') {\n log.error('Timepoint remove function has not been configured.');\n return;\n }\n\n const timepointData = {\n timepointId\n };\n\n log.info('Preparing to remove timepoint');\n log.info(JSON.stringify(timepointData, null, 2));\n\n removeFn(timepointData).then(() => {\n log.info('Timepoint removal completed');\n\n const tpIndex = this.timepoints.findIndex(\n (tp) => tp.timepointId === timepointId\n );\n if (tpIndex > -1) {\n this.timepoints.splice(tpIndex, 1);\n }\n\n // Let others know that the timepoints are updated\n this.onTimepointsUpdated();\n });\n }\n\n updateTimepoint(timepointId, query) {\n const updateFn = configuration.dataExchange.update;\n if (typeof updateFn !== 'function') {\n log.error('Timepoint update function has not been configured.');\n return;\n }\n\n const timepointData = {\n timepointId\n };\n\n log.info('Preparing to update timepoint');\n log.info(JSON.stringify(timepointData, null, 2));\n log.info(JSON.stringify(query, null, 2));\n\n updateFn(timepointData, query).then(() => {\n log.info('Timepoint updated completed');\n\n const tpIndex = this.timepoints.findIndex(\n (tp) => tp.timepointId === timepointId\n );\n if (tpIndex > -1) {\n this.timepoints[tpIndex] = {\n ...this.timepoints[tpIndex],\n ...query\n };\n }\n\n // Let others know that the timepoints are updated\n this.onTimepointsUpdated();\n });\n }\n\n // Return all timepoints\n all(filter) {\n let timepointsToReturn;\n if (filter) {\n timepointsToReturn = this.timepoints.filter(filter);\n } else {\n timepointsToReturn = this.timepoints;\n }\n\n return timepointsToReturn.sort((tp1, tp2) =>\n tp1.visitDate < tp2.visitDate ? 1 : -1\n );\n }\n\n // Return only the current timepoint\n current() {\n return this.timepoints.find(\n (tp) => tp.timepointId === this.currentTimepointId\n );\n }\n\n lock() {\n const tpIndex = this.timepoints.findIndex(\n (tp) => tp.timepointId === this.currentTimepointId\n );\n if (tpIndex < 0) {\n return;\n }\n\n this.timepoints[tpIndex] = {\n ...this.timepoints[tpIndex],\n locked: true\n };\n }\n\n // Return the prior timepoint\n prior() {\n const current = this.current();\n if (!current) {\n return;\n }\n\n return this.all().find((tp) => tp.visitDate < current.visitDate);\n }\n\n // Return only the current and prior timepoints\n currentAndPrior() {\n const timepoints = [];\n\n const current = this.current();\n if (current) {\n timepoints.push(current);\n }\n\n const prior = this.prior();\n if (current && prior && prior.timepointId !== current.timepointId) {\n timepoints.push(prior);\n }\n\n return timepoints;\n }\n\n // Return the current and the comparison timepoints\n currentAndComparison(comparisonTimepointKey = this.comparisonTimepointKey) {\n const current = this.current();\n const comparisonTimepoint = this.comparison(comparisonTimepointKey);\n const timepoints = [current];\n\n if (\n comparisonTimepoint &&\n !timepoints.find(\n (tp) => tp.timepointId === comparisonTimepoint.timepointId\n )\n ) {\n timepoints.push(comparisonTimepoint);\n }\n\n return timepoints;\n }\n\n /**\n * Return true if there are 2 or more baseline timepoints before and at the current timepoint, otherwise false\n * @returns {boolean}\n */\n isRebaseline(timepointId) {\n const current = timepointId\n ? this.timepoints.find((tp) => tp.timepointId === timepointId)\n : this.current();\n if (!current) {\n return false;\n }\n\n const baselines = this.timepoints.filter(\n (tp) =>\n tp.timepointType === 'baseline' &&\n tp.visitDate <= current.visitDate\n );\n return baselines.length > 1;\n }\n\n /**\n * Return the next (closest future) baseline after current timepoint\n * @returns {*}\n */\n nextBaselineAfterCurrent() {\n const current = this.current();\n\n // Get all next timepoints newer than the current timepoint sorted by visitDate ascending\n const sortedTimepoints = this.timepoints.sort((tp1, tp2) =>\n tp1.visitDate > tp2.visitDate ? 1 : -1\n );\n return sortedTimepoints.find(\n (tp) =>\n tp.visitDate > current.visitDate &&\n tp.timepointType === 'baseline'\n );\n }\n\n /**\n * Set the current timepoint id\n * @param timepointId\n */\n setCurrentTimepointId(timepointId) {\n this.currentTimepointId = timepointId;\n }\n\n /**\n * Set the comparison timepoint that overrides the default comparison timepoint (called based on user selection in a viewport)\n * @param timepoint\n */\n setUserComparison(timepoint) {\n this.userComparison = timepoint;\n }\n\n /**\n * Return only the comparison timepoint\n * @param {String} [comparisonTimepointKey]\n * @return {*}\n */\n comparison(comparisonTimepointKey = this.comparisonTimepointKey) {\n // Return the comparison timepoint set by user if exists\n if (this.userComparison) {\n return this.userComparison;\n }\n\n const current = this.current();\n if (!current) {\n return;\n }\n\n // If current timepoint is prebaseline, the first (closest future) BL after current is comparison regardless of default comparison timepoint\n if (current.timepointType === 'prebaseline') {\n const nextBaselineAfterCurrent = this.nextBaselineAfterCurrent();\n // If there is a next baseline, make it comparison, otherwise comparison is done by default comparison timepoint\n if (nextBaselineAfterCurrent) {\n return nextBaselineAfterCurrent;\n }\n }\n\n // If current timepoint is baseline, the prior is comparison if exists regardless of default comparison timepoint\n if (current.timepointType === 'baseline') {\n const prior = this.prior();\n if (prior) {\n return prior;\n }\n }\n\n const comparison = this[comparisonTimepointKey]();\n\n // Do not return a comparison if it would be identical to\n // the current.\n if (comparison && comparison.timepointId === current.timepointId) {\n return;\n }\n\n return comparison;\n }\n\n /**\n * Return the latest initial (prebaseline or baseline) timepoint after current and before the next followup timepoint\n * @returns {*}\n */\n latestInitialTimepointAfterCurrent() {\n const currentTimepoint = this.current();\n\n // Skip if the current timepoint is FU since there is no initial timepoint after follow-up\n if (currentTimepoint.timepointType === 'followup') {\n return;\n }\n\n // Get all next timepoints newer than the current timepoint sorted by visitDate ascending\n const sortedTimepoints = this.timepoints.sort((tp1, tp2) =>\n tp1.visitDate > tp2.visitDate ? 1 : -1\n );\n const allNextTimepoints = sortedTimepoints.filter(\n (tp) => tp.visitDate > currentTimepoint.visitDate\n );\n\n const nextFollowupIndex = allNextTimepoints.findIndex(\n (tp) => tp.timepointType === 'followup'\n );\n const latestInitialBeforeNextFUIndex = nextFollowupIndex - 1;\n\n if (latestInitialBeforeNextFUIndex < 0) {\n // There is no FU and all next timepoints are initial, so return the last one\n return allNextTimepoints[allNextTimepoints.length - 1];\n }\n\n // Return the latest initial timepoint before the next FU\n return allNextTimepoints[latestInitialBeforeNextFUIndex];\n }\n\n /**\n * Return timepoint ids of initial timepoints which are prebaseline and baseline\n * @returns {*}\n */\n initialTimepointIds() {\n let timepointToCheck = this.current();\n\n // If the current timepoint is PBL or BL, then get the recent PBL/BL of the current timepoint by its first FU\n // If it does not exist, then there is no newer initial timepoint, so the current timepoint is used to determine initial timepoint ids\n if (\n timepointToCheck.timepointType === 'prebaseline' ||\n timepointToCheck.timepointType === 'baseline'\n ) {\n timepointToCheck =\n this.latestInitialTimepointAfterCurrent() || timepointToCheck;\n }\n\n const visitDateToCheck = timepointToCheck.visitDate;\n\n const preBaselineTimepoints =\n this.timepoints.filter(\n (tp) =>\n tp.timepointType === 'prebaseline' &&\n tp.visitDate <= visitDateToCheck\n ) || [];\n const preBaselineTimepointIds = preBaselineTimepoints.map(\n (timepoint) => timepoint.timepointId\n );\n\n const baselineTimepoints =\n this.timepoints.filter(\n (tp) =>\n tp.timepointType === 'baseline' &&\n tp.visitDate <= visitDateToCheck\n ) || [];\n const baselineTimepointIds = baselineTimepoints.map(\n (timepoint) => timepoint.timepointId\n );\n\n return preBaselineTimepointIds.concat(baselineTimepointIds);\n }\n\n // Return only the baseline timepoint\n baseline() {\n const currentVisitDate = this.current().visitDate;\n return this.all().find(\n (tp) =>\n tp.timepointType === 'baseline' &&\n tp.visitDate <= currentVisitDate\n );\n }\n\n /**\n * Return only the nadir timepoint. Must be prior to the current timepoint\n * @return {any}\n */\n nadir() {\n const current = this.current();\n const nadir = this.all().find(\n (tp) =>\n tp.timepointId !== current.timepointId &&\n tp.timepointKey === 'nadir' &&\n tp.visitDate <= current.visitDate\n );\n\n // If we have found a nadir, return that\n if (nadir) {\n return nadir;\n }\n\n // Otherwise, return the most recent baseline\n // This should only happen if we are only at FU1,\n // so the baseline is the nadir.\n return this.baseline();\n }\n\n // Return only the key timepoints (current, prior, nadir and baseline)\n key() {\n const result = [this.current()];\n const prior = this.prior();\n const nadir = this.nadir();\n const baseline = this.baseline();\n\n const resultIncludes = (timepoint) =>\n !!result.find((x) => x.timepointId === timepoint.timepointId);\n\n if (prior && resultIncludes(prior) === false) {\n result.push(prior);\n }\n\n if (nadir && resultIncludes(nadir) === false) {\n result.push(nadir);\n }\n\n if (baseline && resultIncludes(baseline) === false) {\n result.push(baseline);\n }\n\n return result;\n }\n\n // Return only the timepoints for the given study\n study(StudyInstanceUID) {\n return this.all().filter((timepoint) =>\n timepoint.studyInstanceUIDs.includes(StudyInstanceUID)\n );\n }\n\n // Return the timepoint's name\n name(timepoint) {\n const timepointTypeName = TIMEPOINT_TYPE_NAMES[timepoint.timepointType];\n\n // Check if this is a Baseline timepoint, if it is, return 'Baseline'\n if (timepoint.timepointType === 'baseline') {\n return 'Baseline';\n }\n if (timepoint.visitNumber) {\n return `${timepointTypeName} ${timepoint.visitNumber}`;\n }\n\n const visitNumber = this.calculateVisitNumber(timepoint);\n\n // Return the timepoint name as 'Follow-up N'\n return `${timepointTypeName} ${visitNumber}`;\n }\n\n // Build the timepoint title based on its date\n title(timepoint) {\n const timepointName = this.name(timepoint);\n\n const all = this.all();\n let index = -1;\n let currentIndex = null;\n for (let i = 0; i < all.length; i++) {\n const currentTimepoint = all[i];\n\n // Skip the iterations until we can't find the selected timepoint on study list\n if (this.currentTimepointId === currentTimepoint.timepointId) {\n currentIndex = 0;\n }\n\n if (currentIndex !== null) {\n index = currentIndex++;\n }\n\n // Break the loop if reached the timepoint to get the title\n if (currentTimepoint.timepointId === timepoint.timepointId) {\n break;\n }\n }\n\n const states = {\n 0: ['Current'],\n 1: ['Prior']\n };\n const parenthesis = states[index] || [];\n const nadir = this.nadir();\n\n if (nadir && nadir.timepointId === timepoint.timepointId) {\n parenthesis.push('Nadir');\n }\n\n let parenthesisText = '';\n if (parenthesis.length) {\n parenthesisText = `(${parenthesis.join(', ')})`;\n }\n\n return `${timepointName} ${parenthesisText}`;\n }\n\n // TungLT: create timeplate timepoint id for a template annotation group\n addTempTimepoint(timepoint) {\n this.timepoints.push(timepoint);\n this.onTimepointsUpdated();\n }\n}\n","export default function (measurement) {\n if (!measurement) {\n return;\n }\n\n switch (measurement.toolType) {\n case 'Bidirectional':\n case 'TargetCR':\n case 'TargetNE':\n case 'TargetUN':\n return `Target ${measurement.lesionNamingNumber}`;\n case 'NonTarget':\n return `Non-Target ${measurement.lesionNamingNumber}`;\n }\n}\n","export default function (measurement) {\n return measurement.description;\n}\n","import studyMetadataManager from '../../utils/studyMetadataManager';\n\nexport default function (imagePath, thumbnail = false) {\n const [\n StudyInstanceUID,\n SeriesInstanceUID,\n SOPInstanceUID,\n frameIndex\n ] = imagePath.split('_');\n const studyMetadata = studyMetadataManager.get(StudyInstanceUID);\n const series = studyMetadata.getSeriesByUID(SeriesInstanceUID);\n const instance = series.getInstanceByUID(SOPInstanceUID);\n return instance.getImageId(frameIndex, thumbnail);\n}\n","import cornerstoneTools from 'cornerstone-tools';\r\nimport cornerstone from 'cornerstone-core';\r\nimport log from '../../log';\r\nimport getLabel from '../lib/getLabel';\r\nimport getDescription from '../lib/getDescription';\r\nimport getImageIdForImagePath from '../lib/getImageIdForImagePath';\r\nimport guid from '../../utils/guid';\r\nimport studyMetadataManager from '../../utils/studyMetadataManager';\r\nimport {measurementApiDefaultConfig} from '../configuration';\r\n\r\nconst configuration = {\r\n ...measurementApiDefaultConfig\r\n};\r\n\r\nexport default class MeasurementApi {\r\n static Instance;\r\n\r\n temporaryDeletedMeasurement = {};\r\n\r\n /**\r\n * Set configuration: It should merge default configuration with any new one\r\n *\r\n * @static\r\n * @param {Object} config\r\n * @param {Object} config.server\r\n * @param {string} config.server.type - The server type\r\n * @param {string} config.server.wadoRoot - The server wado URL root\r\n * @param {Array} config.measurementTools\r\n * @param {string} config.measurementTools[].id - The tool group id\r\n * @param {string} config.measurementTools[].name - The tool group name\r\n * @param {Array} config.measurementTools[].childTools - The child tool's configuration\r\n * @param {Object} config.dataExchange\r\n * @param {Function} config.dataExchange.store - Function that store measurement data\r\n * @param {Function} config.dataExchange.retrieve - Function that retrieves measurement data\r\n *\r\n * @memberof MeasurementApi\r\n */\r\n static setConfiguration(config) {\r\n Object.assign(configuration, config);\r\n }\r\n\r\n static getConfiguration() {\r\n return configuration;\r\n }\r\n\r\n static getToolsGroupsMap() {\r\n const toolsGroupsMap = {};\r\n configuration.measurementTools.forEach((toolGroup) => {\r\n toolGroup.childTools.forEach(\r\n (tool) => (toolsGroupsMap[tool.id] = toolGroup.id)\r\n );\r\n });\r\n\r\n return toolsGroupsMap;\r\n }\r\n\r\n static getToolGroupTools(toolsGroupsMap) {\r\n const result = {};\r\n Object.keys(toolsGroupsMap).forEach((toolType) => {\r\n const toolGroupId = toolsGroupsMap[toolType];\r\n if (!result[toolGroupId]) {\r\n result[toolGroupId] = [];\r\n }\r\n\r\n result[toolGroupId].push(toolType);\r\n });\r\n\r\n return result;\r\n }\r\n\r\n static getToolConfiguration(toolType) {\r\n const configuration = MeasurementApi.getConfiguration();\r\n const toolsGroupsMap = MeasurementApi.getToolsGroupsMap();\r\n\r\n const toolGroupId = toolsGroupsMap[toolType];\r\n const toolGroup = configuration.measurementTools.find(\r\n (toolGroup) => toolGroup.id === toolGroupId\r\n );\r\n\r\n let tool;\r\n if (toolGroup) {\r\n tool = toolGroup.childTools.find((tool) => tool.id === toolType);\r\n }\r\n\r\n return {\r\n toolGroupId,\r\n toolGroup,\r\n tool\r\n };\r\n }\r\n\r\n static syncMeasurementAndToolData(measurement) {\r\n log.info('syncMeasurementAndToolData', measurement);\r\n\r\n const measurementLabel = getLabel(measurement);\r\n if (measurementLabel) {\r\n measurement.labels = [measurementLabel];\r\n }\r\n\r\n const toolState = cornerstoneTools.globalImageIdSpecificToolStateManager.saveToolState();\r\n\r\n // Stop here if the metadata for the measurement's study is not loaded yet\r\n const {StudyInstanceUID} = measurement;\r\n const metadata = studyMetadataManager.get(StudyInstanceUID);\r\n if (!metadata) return;\r\n\r\n // Iterate each child tool if the current tool has children\r\n const toolType = measurement.toolType;\r\n const {tool} = MeasurementApi.getToolConfiguration(toolType);\r\n if (Array.isArray(tool.childTools)) {\r\n tool.childTools.forEach((childToolKey) => {\r\n const childMeasurement = measurement[childToolKey];\r\n if (!childMeasurement) return;\r\n childMeasurement._id = measurement._id;\r\n childMeasurement.measurementNumber = measurement.measurementNumber;\r\n childMeasurement.lesionNamingNumber = measurement.lesionNamingNumber;\r\n\r\n MeasurementApi.syncMeasurementAndToolData(childMeasurement);\r\n });\r\n\r\n return;\r\n }\r\n\r\n const imageId = getImageIdForImagePath(measurement.imagePath);\r\n\r\n // If no tool state exists for this imageId, create an empty object to store it\r\n if (!toolState[imageId]) {\r\n toolState[imageId] = {};\r\n }\r\n\r\n const currentToolState = toolState[imageId][toolType];\r\n const toolData = currentToolState && currentToolState.data;\r\n\r\n // Check if we already have toolData for this imageId and toolType\r\n if (toolData && toolData.length) {\r\n // If we have toolData, we should search it for any data related to the current Measurement\r\n const toolData = toolState[imageId][toolType].data;\r\n\r\n // Create a flag so we know if we've successfully updated the Measurement in the toolData\r\n let alreadyExists = false;\r\n\r\n // Loop through the toolData to search for this Measurement\r\n toolData.forEach((tool) => {\r\n // Break the loop if this isn't the Measurement we are looking for\r\n if (tool._id !== measurement._id) {\r\n return;\r\n }\r\n\r\n // If we have found the Measurement, set the flag to True\r\n alreadyExists = true;\r\n\r\n // Update the toolData from the Measurement data\r\n Object.assign(tool, measurement);\r\n return false;\r\n });\r\n\r\n // If we have found the Measurement we intended to update, we can stop this function here\r\n if (alreadyExists === true) {\r\n return;\r\n }\r\n } else {\r\n // If no toolData exists for this toolType, create an empty array to hold some\r\n toolState[imageId][toolType] = {\r\n data: []\r\n };\r\n }\r\n\r\n // If we have reached this point, it means we haven't found the Measurement we are looking for\r\n // in the current toolData. This means we need to add it.\r\n\r\n // Add the MeasurementData into the toolData for this imageId\r\n toolState[imageId][toolType].data.push(measurement);\r\n\r\n cornerstoneTools.globalImageIdSpecificToolStateManager.restoreToolState(\r\n toolState\r\n );\r\n }\r\n\r\n static isToolIncluded(tool) {\r\n return (\r\n tool.options &&\r\n tool.options.caseProgress &&\r\n tool.options.caseProgress.include\r\n );\r\n }\r\n\r\n constructor(timepointApi, options = {}) {\r\n if (MeasurementApi.Instance) {\r\n MeasurementApi.Instance.initialize(timepointApi, options);\r\n return MeasurementApi.Instance;\r\n }\r\n\r\n this.initialize(timepointApi, options);\r\n MeasurementApi.Instance = this;\r\n }\r\n\r\n static getInstance() {\r\n if (!this.Instance) {\r\n this.Instance = new MeasurementApi();\r\n }\r\n return this.Instance;\r\n }\r\n\r\n initialize(timepointApi, options = {}) {\r\n this.timepointApi = timepointApi;\r\n this.options = options;\r\n this.toolGroups = {};\r\n this.tools = {};\r\n this.toolsGroupsMap = MeasurementApi.getToolsGroupsMap();\r\n this.toolGroupTools = MeasurementApi.getToolGroupTools(this.toolsGroupsMap);\r\n\r\n // Iterate over each tool group and create collection\r\n configuration.measurementTools.forEach((toolGroup) => {\r\n this.toolGroups[toolGroup.id] = [];\r\n\r\n // Iterate over each tool group child tools (e.g. bidirectional, targetCR, etc.) and create collection\r\n toolGroup.childTools.forEach((tool) => {\r\n this.tools[tool.id] = [];\r\n });\r\n });\r\n }\r\n\r\n onMeasurementsUpdated() {\r\n if (typeof this.options.onMeasurementsUpdated !== 'function') {\r\n log.warn('Measurements update callback is not defined');\r\n return;\r\n }\r\n\r\n this.options.onMeasurementsUpdated({...this.tools});\r\n }\r\n\r\n processMeasurementData(measurementData) {\r\n if (measurementData) {\r\n log.info('Measurement data retrieval');\r\n log.info(measurementData);\r\n\r\n Object.keys(measurementData).forEach((measurementTypeId) => {\r\n const measurements = measurementData[measurementTypeId];\r\n\r\n measurements.forEach((measurement) => {\r\n const {toolType} = measurement;\r\n\r\n this.addMeasurement(toolType, measurement);\r\n });\r\n });\r\n }\r\n\r\n // Synchronize the new tool data\r\n this.syncMeasurementsAndToolData();\r\n\r\n try {\r\n cornerstone.getEnabledElements().forEach((enabledElement) => {\r\n cornerstone.updateImage(enabledElement.element);\r\n });\r\n } catch (e) {\r\n log.error(e);\r\n }\r\n\r\n // Let others know that the measurements are updated\r\n this.onMeasurementsUpdated();\r\n }\r\n\r\n retrieveMeasurements(filter) {\r\n const retrievalFn = configuration.dataExchange.retrieve;\r\n const {server} = configuration;\r\n if (typeof retrievalFn !== 'function') {\r\n log.error('Measurement retrieval function has not been configured.');\r\n return;\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n retrievalFn(server, filter).then((measurementData) => {\r\n this.processMeasurementData(measurementData);\r\n resolve();\r\n }, reject);\r\n });\r\n }\r\n\r\n storeMeasurements(timepointId, options) {\r\n const {server} = configuration;\r\n const storeFn = configuration.dataExchange.store;\r\n if (typeof storeFn !== 'function') {\r\n log.error('Measurement store function has not been configured.');\r\n return;\r\n }\r\n\r\n const measurementData = {};\r\n configuration.measurementTools.forEach((toolGroup) => {\r\n // Skip the tool groups excluded from case progress\r\n if (!MeasurementApi.isToolIncluded(toolGroup)) {\r\n return;\r\n }\r\n\r\n toolGroup.childTools.forEach((tool) => {\r\n // Skip the tools excluded from case progress\r\n if (!MeasurementApi.isToolIncluded(tool)) {\r\n return;\r\n }\r\n\r\n if (!measurementData[toolGroup.id]) {\r\n measurementData[toolGroup.id] = [];\r\n }\r\n\r\n measurementData[toolGroup.id] = measurementData[toolGroup.id].concat(\r\n this.tools[tool.id]\r\n );\r\n });\r\n });\r\n\r\n const timepointFilter = timepointId\r\n ? (tp) => tp.timepointId === timepointId\r\n : null;\r\n const timepoints = this.timepointApi.all(timepointFilter);\r\n const timepointIds = timepoints.map((t) => t.timepointId);\r\n const PatientID = timepoints[0].PatientID;\r\n const filter = {\r\n PatientID,\r\n timepointIds\r\n };\r\n\r\n log.info('Saving Measurements for timepoints:', timepoints);\r\n return storeFn(measurementData, filter, server, options).then((measurementData) => {\r\n log.info('Measurement storage completed', measurementData);\r\n this.processMeasurementData(measurementData);\r\n return measurementData;\r\n });\r\n }\r\n\r\n calculateLesionNamingNumber(measurements) {\r\n const sortedMeasurements = measurements.sort((a, b) => {\r\n if (a.lesionNamingNumber > b.lesionNamingNumber) {\r\n return 1;\r\n }\r\n if (a.lesionNamingNumber < b.lesionNamingNumber) {\r\n return -1;\r\n }\r\n\r\n return 0;\r\n });\r\n\r\n // Calculate lesion naming number starting from 1 not to miss any measurement (as seen in MM)\r\n // A measurement from beginning of the list might be deleted, so a new measurement should replace that\r\n let i;\r\n for (i = 1; i < sortedMeasurements.length + 1; i++) {\r\n if (i < sortedMeasurements[i - 1].lesionNamingNumber) {\r\n break;\r\n }\r\n }\r\n\r\n return i;\r\n }\r\n\r\n fetch(toolGroupId, filter) {\r\n if (!this.toolGroups[toolGroupId]) {\r\n throw new Error(\r\n `MeasurementApi: No Collection with the id: ${toolGroupId}`\r\n );\r\n }\r\n\r\n let items;\r\n if (filter) {\r\n items = this.toolGroups[toolGroupId].filter(filter);\r\n } else {\r\n items = this.toolGroups[toolGroupId];\r\n }\r\n\r\n return items.map((item) => {\r\n if (item.toolId) {\r\n return this.tools[item.toolId].find(\r\n (tool) => tool._id === item.toolItemId\r\n );\r\n }\r\n\r\n return {lesionNamingNumber: item.lesionNamingNumber};\r\n });\r\n }\r\n\r\n getFirstMeasurement(timepointId) {\r\n // Get child tools from all included tool groups\r\n let childTools = [];\r\n configuration.measurementTools.forEach((toolGroup) => {\r\n // Skip the tool groups excluded from case progress\r\n if (!MeasurementApi.isToolIncluded(toolGroup)) {\r\n return false;\r\n }\r\n\r\n childTools = childTools.concat(toolGroup.childTools);\r\n });\r\n\r\n // Get all included child tools\r\n const includedChildTools = childTools.filter((tool) => MeasurementApi.isToolIncluded(tool));\r\n\r\n // Get the first measurement for the given timepoint\r\n let measurement;\r\n includedChildTools.every((tool) => {\r\n measurement = this.tools[tool.id].find(\r\n (t) => t.timepointId === timepointId && t.measurementNumber === 1\r\n );\r\n\r\n return !measurement;\r\n });\r\n\r\n // Return the found measurement object or undefined if not found\r\n return measurement;\r\n }\r\n\r\n lesionExistsAtTimepoints(lesionNamingNumber, toolGroupId, timepointIds) {\r\n // Retrieve all the data for the given tool group (e.g. 'targets')\r\n const measurementsAtTimepoint = this.fetch(toolGroupId, (tool) => timepointIds.includes(tool.timepointId));\r\n\r\n // Return whether or not any lesion at this timepoint has the same lesionNamingNumber\r\n return !!measurementsAtTimepoint.find(\r\n (m) => m.lesionNamingNumber === lesionNamingNumber\r\n );\r\n }\r\n\r\n isNewLesionsMeasurement(measurementData) {\r\n if (!measurementData) {\r\n return;\r\n }\r\n\r\n const toolConfig = MeasurementApi.getToolConfiguration(\r\n measurementData.toolType\r\n );\r\n const toolType = toolConfig.tool.parentTool || measurementData.toolType;\r\n const {timepointApi} = this;\r\n const currentMeasurement =\r\n this.tools[toolType].find((tool) => tool._id === measurementData._id) || {};\r\n const timepointId =\r\n currentMeasurement.timepointId || measurementData.timepointId;\r\n const lesionNamingNumber =\r\n currentMeasurement.lesionNamingNumber ||\r\n measurementData.lesionNamingNumber;\r\n\r\n // Stop here if the needed information is not set\r\n if (!timepointApi || !timepointId || !toolConfig) {\r\n return;\r\n }\r\n\r\n const {toolGroupId} = toolConfig;\r\n const current = timepointApi.timepoints.find(\r\n (tp) => tp.timepointId === timepointId\r\n );\r\n const initialTimepointIds = timepointApi.initialTimepointIds();\r\n\r\n // Stop here if there's no initial timepoint, or if the current is any initial\r\n if (\r\n !initialTimepointIds ||\r\n initialTimepointIds.length < 1 ||\r\n initialTimepointIds.some(\r\n (initialtpid) => initialtpid === current.timepointId\r\n )\r\n ) {\r\n return false;\r\n }\r\n\r\n return (\r\n this.lesionExistsAtTimepoints(\r\n lesionNamingNumber,\r\n toolGroupId,\r\n initialTimepointIds\r\n ) === false\r\n );\r\n }\r\n\r\n calculateLesionMaxMeasurementNumber(groupId, filter) {\r\n let measurements = [];\r\n if (groupId) {\r\n // Get the measurements of the group\r\n measurements = this.toolGroups[groupId] || [];\r\n } else {\r\n // Get all measurements of all groups\r\n measurements = Object.keys(this.toolGroups).reduce((acc, val) => {\r\n acc.push(...this.toolGroups[val]);\r\n return acc;\r\n }, []);\r\n }\r\n\r\n const sortedMeasurements = measurements.filter(filter).sort((tp1, tp2) => (tp1.measurementNumber < tp2.measurementNumber ? 1 : -1));\r\n\r\n for (let i = 0; i < sortedMeasurements.length; i++) {\r\n const toolGroupMeasurement = sortedMeasurements[i];\r\n const measurement = this.tools[toolGroupMeasurement.toolId].find(\r\n (tool) => tool._id === toolGroupMeasurement.toolItemId\r\n );\r\n const isNew = this.isNewLesionsMeasurement(measurement);\r\n if (!isNew) {\r\n return (measurement && measurement.measurementNumber) || 0;\r\n }\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n calculateNewLesionMaxMeasurementNumber(groupId, filter) {\r\n const sortedMeasurements = this.toolGroups[groupId]\r\n .filter(filter)\r\n .sort((tp1, tp2) => (tp1.measurementNumber < tp2.measurementNumber ? 1 : -1));\r\n\r\n for (let i = 0; i < sortedMeasurements.length; i++) {\r\n const toolGroupMeasurement = sortedMeasurements[i];\r\n const measurement = this.tools[toolGroupMeasurement.toolId].find(\r\n (tool) => tool._id === toolGroupMeasurement.toolItemId\r\n );\r\n const isNew = this.isNewLesionsMeasurement(measurement);\r\n if (isNew) {\r\n return measurement.measurementNumber;\r\n }\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n calculateMeasurementNumber(measurement) {\r\n const toolGroupId = this.toolsGroupsMap[measurement.toolType];\r\n\r\n const filter = (tool) => tool._id !== measurement._id;\r\n\r\n const isNew = this.isNewLesionsMeasurement(measurement);\r\n\r\n if (isNew) {\r\n const maxTargetMeasurementNumber = this.calculateLesionMaxMeasurementNumber(\r\n 'targets',\r\n filter\r\n );\r\n const maxNonTargetMeasurementNumber = this.calculateLesionMaxMeasurementNumber(\r\n 'nonTargets',\r\n filter\r\n );\r\n const maxNewTargetMeasurementNumber = this.calculateNewLesionMaxMeasurementNumber(\r\n 'targets',\r\n filter\r\n );\r\n if (toolGroupId === 'targets') {\r\n return Math.max(\r\n maxTargetMeasurementNumber,\r\n maxNonTargetMeasurementNumber,\r\n maxNewTargetMeasurementNumber\r\n );\r\n }\r\n if (toolGroupId === 'nonTargets') {\r\n const maxNewNonTargetMeasurementNumber = this.calculateNewLesionMaxMeasurementNumber(\r\n 'nonTargets',\r\n filter\r\n );\r\n return Math.max(\r\n maxTargetMeasurementNumber,\r\n maxNonTargetMeasurementNumber,\r\n maxNewTargetMeasurementNumber,\r\n maxNewNonTargetMeasurementNumber\r\n );\r\n }\r\n } else {\r\n const maxTargetMeasurementNumber = this.calculateLesionMaxMeasurementNumber(\r\n 'targets',\r\n filter\r\n );\r\n if (toolGroupId === 'targets') {\r\n return maxTargetMeasurementNumber;\r\n }\r\n if (toolGroupId === 'nonTargets') {\r\n const maxNonTargetMeasurementNumber = this.calculateLesionMaxMeasurementNumber(\r\n 'nonTargets',\r\n filter\r\n );\r\n return Math.max(\r\n maxTargetMeasurementNumber,\r\n maxNonTargetMeasurementNumber\r\n );\r\n }\r\n return this.calculateLesionMaxMeasurementNumber(null, filter);\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n getPreviousMeasurement(measurementData) {\r\n if (!measurementData) {\r\n return;\r\n }\r\n\r\n const {timepointId, toolType, lesionNamingNumber} = measurementData;\r\n if (!timepointId || !toolType || !lesionNamingNumber) {\r\n return;\r\n }\r\n\r\n const toolGroupId = this.toolsGroupsMap[measurementData.toolType];\r\n\r\n // TODO: Remove TrialPatientLocationUID from here and override it somehow\r\n // by dependant applications. Here we should use the location attribute instead of the uid\r\n let filter;\r\n const uid =\r\n measurementData.additionalData &&\r\n measurementData.additionalData.TrialPatientLocationUID;\r\n if (uid) {\r\n filter = (tool) => tool._id !== measurementData._id &&\r\n tool.additionalData &&\r\n tool.additionalData.TrialPatientLocationUID === uid;\r\n } else {\r\n filter = (tool) => tool._id !== measurementData._id &&\r\n tool.lesionNamingNumber === lesionNamingNumber;\r\n }\r\n\r\n const childToolTypes = this.toolGroupTools[toolGroupId];\r\n for (let i = 0; i < childToolTypes.length; i++) {\r\n const childToolType = childToolTypes[i];\r\n const toolCollection = this.tools[childToolType];\r\n const item = toolCollection.find(filter);\r\n\r\n if (item) {\r\n return item;\r\n }\r\n }\r\n }\r\n\r\n hasDuplicateMeasurementNumber(measurementData) {\r\n if (!measurementData) {\r\n return;\r\n }\r\n\r\n const {toolType, measurementNumber} = measurementData;\r\n if (!toolType || !measurementNumber) {\r\n return;\r\n }\r\n\r\n const filter = (tool) => tool._id !== measurementData._id &&\r\n tool.measurementNumber === measurementData.measurementNumber;\r\n\r\n return configuration.measurementTools\r\n .filter((toolGroup) => toolGroup.id !== 'temp')\r\n .some((toolGroup) => {\r\n if (this.toolGroups[toolGroup.id].find(filter)) {\r\n return true;\r\n }\r\n return toolGroup.childTools.some((tool) => {\r\n if (this.tools[tool.id].find(filter)) {\r\n return true;\r\n }\r\n });\r\n });\r\n }\r\n\r\n updateNumbering(collectionToUpdate, propertyFilter, propertyName, increment) {\r\n collectionToUpdate.filter(propertyFilter).forEach((item) => {\r\n item[propertyName] += increment;\r\n });\r\n }\r\n\r\n updateMeasurementNumberForAllMeasurements(measurement, increment) {\r\n const filter = (tool) => tool._id !== measurement._id &&\r\n tool.measurementNumber >= measurement.measurementNumber;\r\n\r\n configuration.measurementTools\r\n .filter((toolGroup) => toolGroup.id !== 'temp')\r\n .forEach((toolGroup) => {\r\n this.updateNumbering(\r\n this.toolGroups[toolGroup.id],\r\n filter,\r\n 'measurementNumber',\r\n increment\r\n );\r\n\r\n toolGroup.childTools.forEach((tool) => {\r\n this.updateNumbering(\r\n this.tools[tool.id],\r\n filter,\r\n 'measurementNumber',\r\n increment\r\n );\r\n });\r\n });\r\n }\r\n\r\n addMeasurement(toolType, measurement) {\r\n const toolGroup = this.toolsGroupsMap[toolType];\r\n const groupCollection = this.toolGroups[toolGroup];\r\n const collection = this.tools[toolType];\r\n\r\n // Get the related measurement by the measurement number and use its location if defined\r\n const relatedMeasurement = collection.find(\r\n (t) => t.lesionNamingNumber === measurement.lesionNamingNumber &&\r\n t.toolType === measurement.toolType\r\n );\r\n\r\n // Use the related measurement location if found and defined\r\n if (relatedMeasurement && relatedMeasurement.location) {\r\n measurement.location = relatedMeasurement.location;\r\n }\r\n\r\n // Use the related measurement description if found and defined\r\n if (relatedMeasurement && relatedMeasurement.description) {\r\n measurement.description = relatedMeasurement.description;\r\n }\r\n\r\n // TungLT stored measurement from MongoDB already have mapping _id property, which is generated from MeasurementApi\r\n if (!measurement._id)\r\n measurement._id = guid();\r\n\r\n // Get the timepoint\r\n let timepoint;\r\n if (measurement.StudyInstanceUID) {\r\n timepoint = this.timepointApi.study(measurement.StudyInstanceUID)[0];\r\n } else {\r\n const {timepointId} = measurement;\r\n timepoint = this.timepointApi.timepoints.find(\r\n (t) => t.timepointId === timepointId\r\n );\r\n }\r\n\r\n // Preventing errors thrown when non-associated (standalone) study is opened...\r\n // @TODO: Make sure this logic is correct.\r\n if (!timepoint) return;\r\n\r\n // Empty Item is the lesion just added in cornerstoneTools, but does not have measurement data yet\r\n const emptyItem = groupCollection.find(\r\n // (groupTool) => !groupTool.toolId && groupTool.timepointId === timepoint.timepointId\r\n // TungLT change logic to update measurement data after save to storage\r\n (groupTool) => groupTool.toolItemId === measurement._id && groupTool.timepointId === timepoint.timepointId\r\n );\r\n\r\n // Set the timepointId attribute to measurement to make it easier to filter measurements by timepoint\r\n measurement.timepointId = timepoint.timepointId;\r\n\r\n // Check if the measurement data is just added by a cornerstone tool and is still empty\r\n if (emptyItem) {\r\n // Set relevant initial data and measurement number to the measurement\r\n measurement.lesionNamingNumber = emptyItem.lesionNamingNumber;\r\n measurement.measurementNumber = emptyItem.measurementNumber;\r\n\r\n groupCollection\r\n .filter(\r\n (groupTool) => groupTool.timepointId === timepoint.timepointId &&\r\n groupTool.lesionNamingNumber === measurement.lesionNamingNumber\r\n )\r\n .forEach((groupTool) => {\r\n groupTool.toolId = measurement.toolType;\r\n groupTool.toolItemId = measurement._id;\r\n groupTool.createdAt = measurement.createdAt;\r\n groupTool.measurementNumber = measurement.measurementNumber;\r\n // TungLT synchronize id property, which is generated by MongoDB\r\n groupTool.id = measurement.id;\r\n });\r\n } else {\r\n // Handle measurements not added by cornerstone tools and update its number\r\n log.info('handle measurement not added by cornerstone tool', measurement);\r\n const measurementsInTimepoint = groupCollection.filter(\r\n (groupTool) => groupTool.timepointId === timepoint.timepointId\r\n );\r\n\r\n // TungLT: dont need to update lesionNamingNumber with stored\r\n measurement.lesionNamingNumber = measurement.lesionNamingNumber || this.calculateLesionNamingNumber(\r\n measurementsInTimepoint\r\n );\r\n measurement.measurementNumber =\r\n measurement.measurementNumber ||\r\n this.calculateMeasurementNumber(measurement) + 1;\r\n }\r\n\r\n // Define an update object to reflect the changes in the collection\r\n const updateObject = {\r\n timepointId: timepoint.timepointId,\r\n lesionNamingNumber: measurement.lesionNamingNumber,\r\n measurementNumber: measurement.measurementNumber,\r\n id: measurement.id // TungLT: synchronize id property\r\n };\r\n\r\n // Find the matched measurement from other timepoints\r\n const found = this.getPreviousMeasurement(measurement);\r\n\r\n // Check if a previous related meausurement was found on other timepoints\r\n if (found) {\r\n log.info('previous measurement', found);\r\n // Use the same number as the previous measurement\r\n measurement.lesionNamingNumber = found.lesionNamingNumber;\r\n measurement.measurementNumber = found.measurementNumber;\r\n\r\n // TODO: Remove TrialPatientLocationUID from here and override it somehow\r\n // by dependant applications\r\n\r\n // Change the update object to set the same number, additionalData,\r\n // location, label and description to the current measurement\r\n updateObject.lesionNamingNumber = found.lesionNamingNumber;\r\n updateObject.measurementNumber = found.measurementNumber;\r\n updateObject.additionalData = measurement.additionalData || {};\r\n updateObject.additionalData.TrialPatientLocationUID =\r\n found.additionalData && found.additionalData.TrialPatientLocationUID;\r\n updateObject.location = found.location;\r\n updateObject.label = found.label;\r\n updateObject.description = found.description;\r\n updateObject.isSplitLesion = found.isSplitLesion;\r\n updateObject.isNodal = found.isNodal;\r\n\r\n const description = getDescription(found, measurement);\r\n if (description) {\r\n updateObject.description = description;\r\n }\r\n } else if (this.hasDuplicateMeasurementNumber(measurement)) {\r\n // Update measurementNumber for the measurements with masurementNumber greater or equal than\r\n // measurementNumber of the added measurement (except the added one)\r\n // only if there is another measurement with the same measurementNumber\r\n\r\n // TungLT, dont need to update measurement number\r\n // this.updateMeasurementNumberForAllMeasurements(measurement, 1);\r\n }\r\n\r\n let addedMeasurement;\r\n\r\n // Upsert the measurement in collection\r\n const toolIndex = collection.findIndex(\r\n (tool) => tool._id === measurement._id\r\n );\r\n if (toolIndex > -1) {\r\n addedMeasurement = {...collection[toolIndex], ...updateObject};\r\n collection[toolIndex] = addedMeasurement;\r\n } else {\r\n addedMeasurement = {...measurement, ...updateObject};\r\n collection.push(addedMeasurement);\r\n }\r\n\r\n if (!emptyItem) {\r\n // Reflect the entry in the tool group collection\r\n groupCollection.push({\r\n toolId: toolType,\r\n toolItemId: addedMeasurement._id,\r\n timepointId: timepoint.timepointId,\r\n StudyInstanceUID: addedMeasurement.StudyInstanceUID,\r\n createdAt: addedMeasurement.createdAt,\r\n lesionNamingNumber: addedMeasurement.lesionNamingNumber,\r\n measurementNumber: addedMeasurement.measurementNumber,\r\n id: addedMeasurement.id // TungLT synchronize id generated by MongoDB\r\n });\r\n }\r\n\r\n // Let others know that the measurements are updated\r\n this.onMeasurementsUpdated();\r\n\r\n // TODO: Enable reactivity\r\n // this.timepointChanged.set(timepoint.timepointId);\r\n\r\n return addedMeasurement;\r\n }\r\n\r\n updateMeasurement(toolType, measurement) {\r\n const collection = this.tools[toolType];\r\n\r\n const toolIndex = collection.findIndex(\r\n (tool) => tool._id === measurement._id\r\n );\r\n if (toolIndex < 0) {\r\n return;\r\n }\r\n\r\n collection[toolIndex] = {...measurement, updated: true};\r\n\r\n // Let others know that the measurements are updated\r\n this.onMeasurementsUpdated();\r\n\r\n // TODO: Enable reactivity\r\n // this.timepointChanged.set(timepoint.timepointId);\r\n }\r\n\r\n onMeasurementRemoved(toolType, measurement, persist = true) {\r\n const {lesionNamingNumber, measurementNumber} = measurement;\r\n\r\n const toolGroupId = this.toolsGroupsMap[toolType];\r\n const groupCollection = this.toolGroups[toolGroupId];\r\n\r\n const groupIndex = groupCollection.findIndex(\r\n (group) => group.toolItemId === measurement._id\r\n );\r\n log.info('onMeasurementRemoved', measurement, groupCollection, groupIndex);\r\n if (groupIndex < 0) {\r\n return;\r\n }\r\n\r\n // Remove the deleted measurement only in its timepoint from the collection\r\n groupCollection.splice(groupIndex, 1);\r\n\r\n // Check which timepoints have the deleted measurement\r\n const timepointsWithDeletedMeasurement = groupCollection\r\n .filter((tool) => tool.measurementNumber === measurementNumber)\r\n .map((tool) => tool.timepointId);\r\n\r\n // Update lesionNamingNumber and measurementNumber only if there is no timepoint with that measurement\r\n if (timepointsWithDeletedMeasurement.length < 1) {\r\n // Decrease lesionNamingNumber of all measurements with lesionNamingNumber greater than lesionNamingNumber of the deleted measurement by 1\r\n const lesionNamingNumberFilter = (tool) => tool.lesionNamingNumber >= lesionNamingNumber;\r\n this.updateNumbering(\r\n groupCollection,\r\n lesionNamingNumberFilter,\r\n 'lesionNamingNumber',\r\n -1\r\n );\r\n\r\n const toolGroup = configuration.measurementTools.find(\r\n (tGroup) => tGroup.id === toolGroupId\r\n );\r\n if (toolGroup && toolGroup.childTools) {\r\n toolGroup.childTools.forEach((childTool) => {\r\n const collection = this.tools[childTool.id];\r\n this.updateNumbering(\r\n collection,\r\n lesionNamingNumberFilter,\r\n 'lesionNamingNumber',\r\n -1\r\n );\r\n });\r\n }\r\n\r\n // Decrease measurementNumber of all measurements with measurementNumber greater than measurementNumber of the deleted measurement by 1\r\n this.updateMeasurementNumberForAllMeasurements(measurement, -1);\r\n }\r\n\r\n // Synchronize the new tool data\r\n this.syncMeasurementsAndToolData();\r\n\r\n // Let others know that the measurements are updated\r\n this.onMeasurementsUpdated();\r\n\r\n // TODO: Enable reactivity\r\n // this.timepointChanged.set(timepoint.timepointId);\r\n\r\n // TungLT: for persist deleted measurement\r\n const {id} = measurement;\r\n // \"id\" is generated by backend service. it is different with \"_id\", which generated by MeasurementApi\r\n if (id && persist) {\r\n // if \"id\" is existed, its measurement need to be deleted from database\r\n this.addTemporaryDeletedMeasurements(measurement);\r\n }\r\n }\r\n\r\n syncMeasurementsAndToolData() {\r\n configuration.measurementTools.forEach((toolGroup) => {\r\n // Skip the tool groups excluded from case progress\r\n if (!MeasurementApi.isToolIncluded(toolGroup)) {\r\n return;\r\n }\r\n toolGroup.childTools.forEach((tool) => {\r\n // Skip the tools excluded from case progress\r\n if (!MeasurementApi.isToolIncluded(tool)) {\r\n return;\r\n }\r\n const measurements = this.tools[tool.id];\r\n measurements.forEach((measurement) => {\r\n MeasurementApi.syncMeasurementAndToolData(measurement);\r\n });\r\n });\r\n });\r\n }\r\n\r\n // Modified by TungLT\r\n deleteMeasurements(toolType, measurementTypeId, measurement, persist) {\r\n const filter = {lesionNamingNumber: measurement.lesionNamingNumber, timepointId: measurement.timepointId};\r\n const filterKeys = Object.keys(filter);\r\n const groupCollection = this.toolGroups[measurementTypeId];\r\n\r\n // Stop here if it is a temporary toolGroups\r\n if (!groupCollection) return;\r\n\r\n // Get the entries information before removing them\r\n const groupItems = groupCollection.filter((toolGroup) => filterKeys.every(\r\n (filterKey) => toolGroup[filterKey] === filter[filterKey]\r\n ));\r\n const entries = [];\r\n groupItems.forEach((groupItem) => {\r\n if (!groupItem.toolId) {\r\n return;\r\n }\r\n\r\n const collection = this.tools[groupItem.toolId];\r\n const toolIndex = collection.findIndex(\r\n (tool) => tool._id === groupItem.toolItemId\r\n );\r\n if (toolIndex > -1) {\r\n entries.push(collection[toolIndex]);\r\n collection.splice(toolIndex, 1);\r\n }\r\n });\r\n\r\n // Stop here if no entries were found\r\n if (!entries.length) {\r\n return;\r\n }\r\n\r\n // If the filter doesn't have the measurement number, get it from the first entry\r\n const lesionNamingNumber =\r\n filter.lesionNamingNumber || entries[0].lesionNamingNumber;\r\n\r\n // Synchronize the new data with cornerstone tools\r\n const toolState = cornerstoneTools.globalImageIdSpecificToolStateManager.saveToolState();\r\n\r\n entries.forEach((entry) => {\r\n const measurementsData = [];\r\n const {tool} = MeasurementApi.getToolConfiguration(entry.toolType);\r\n if (Array.isArray(tool.childTools)) {\r\n tool.childTools.forEach((key) => {\r\n const childMeasurement = entry[key];\r\n if (!childMeasurement) return;\r\n measurementsData.push(childMeasurement);\r\n });\r\n } else {\r\n measurementsData.push(entry);\r\n }\r\n\r\n measurementsData.forEach((measurementData) => {\r\n const {imagePath, toolType} = measurementData;\r\n const imageId = getImageIdForImagePath(imagePath);\r\n if (imageId && toolState[imageId]) {\r\n const toolData = toolState[imageId][toolType];\r\n const measurementEntries = toolData && toolData.data;\r\n const measurementEntry = measurementEntries.find(\r\n (mEntry) => mEntry._id === entry._id\r\n );\r\n if (measurementEntry) {\r\n const index = measurementEntries.indexOf(measurementEntry);\r\n measurementEntries.splice(index, 1);\r\n }\r\n }\r\n });\r\n\r\n this.onMeasurementRemoved(toolType, entry, persist);\r\n });\r\n\r\n cornerstoneTools.globalImageIdSpecificToolStateManager.restoreToolState(\r\n toolState\r\n );\r\n\r\n // Synchronize the updated measurements with Cornerstone Tools\r\n // toolData to make sure the displayed measurements show 'Target X' correctly\r\n const syncFilter = {...filter};\r\n delete syncFilter.timepointId;\r\n delete syncFilter.lesionNamingNumber;\r\n\r\n const syncFilterKeys = Object.keys(syncFilter);\r\n\r\n const toolTypes = [...new Set(entries.map((entry) => entry.toolType))];\r\n toolTypes.forEach((toolType) => {\r\n const collection = this.tools[toolType];\r\n collection\r\n .filter((tool) => (\r\n tool.lesionNamingNumber > lesionNamingNumber - 1 &&\r\n syncFilterKeys.every(\r\n (syncFilterKey) => tool[syncFilterKey] === filter[syncFilterKey]\r\n )\r\n ))\r\n .forEach((measurement) => {\r\n MeasurementApi.syncMeasurementAndToolData(measurement);\r\n });\r\n });\r\n }\r\n\r\n getTemporaryDeletedMeasurements = (StudyInstanceUID) => {\r\n return this.temporaryDeletedMeasurement[StudyInstanceUID] || [];\r\n };\r\n\r\n addTemporaryDeletedMeasurements = (measurementData) => {\r\n const {StudyInstanceUID} = measurementData;\r\n const temporaryDeleted = this.getTemporaryDeletedMeasurements(StudyInstanceUID);\r\n // prevent duplicated measurement\r\n if (temporaryDeleted.length === 0 || temporaryDeleted.findIndex((measurement) => measurement.id === measurementData.id) === -1) {\r\n log.info('add measurement to temporary deleted list', measurementData);\r\n temporaryDeleted.push(measurementData);\r\n this.temporaryDeletedMeasurement[StudyInstanceUID] = temporaryDeleted;\r\n }\r\n };\r\n\r\n // temporary deleted measurements of a study need to be clear when call delete request success or current viewport of this study is cleared\r\n clearTemporaryDeletedMeasurement = (StudyInstanceUID) => {\r\n delete this.temporaryDeletedMeasurement[StudyInstanceUID];\r\n };\r\n}\r\n","export class BaseCriterion {\n constructor(options, criterionName) {\n this.options = options;\n this.criterionName = criterionName;\n }\n\n generateResponse(message, measurements) {\n const passed = !message;\n const isGlobal = !measurements || !measurements.length;\n\n return {\n passed,\n isGlobal,\n message,\n measurements,\n criterionName: this.criterionName\n };\n }\n\n getNewTargetNumbers(data) {\n const {options} = this;\n const baselineMeasurementNumbers = [];\n const newTargetNumbers = new Set();\n\n if (options.newTarget) {\n data.targets.forEach((target) => {\n const {measurementNumber} = target.measurement;\n if (target.timepoint.timepointType === 'baseline') {\n baselineMeasurementNumbers.push(measurementNumber);\n }\n });\n data.targets.forEach((target) => {\n const {measurementNumber} = target.measurement;\n if (target.timepoint.timepointType === 'followup') {\n if (!baselineMeasurementNumbers.includes(measurementNumber)) {\n newTargetNumbers.add(measurementNumber);\n }\n }\n });\n }\n\n return newTargetNumbers;\n }\n}\n","import {BaseCriterion} from './BaseCriterion';\n\nexport const LocationSchema = {\n type: 'object'\n};\n\n/* LocationCriterion\n * Check if the there are non-target measurements with response different than \"present\" on baseline\n */\nexport class LocationCriterion extends BaseCriterion {\n constructor(...props) {\n super(...props);\n }\n\n evaluate(data) {\n const items = data.targets.concat(data.nonTargets);\n const measurements = [];\n let message;\n\n items.forEach((item) => {\n const measurement = item.measurement;\n\n if (!measurement.location) {\n measurements.push(measurement);\n }\n });\n\n if (measurements.length) {\n message = 'All measurements should have a location';\n }\n\n return this.generateResponse(message, measurements);\n }\n}\n","import {BaseCriterion} from './BaseCriterion';\n\nexport const MaxTargetsPerOrganSchema = {\n type: 'object',\n properties: {\n limit: {\n label: 'Max targets allowed per organ',\n type: 'integer',\n minimum: 1\n },\n newTarget: {\n label: 'Flag to evaluate only new targets',\n type: 'boolean'\n },\n isNodal: {\n label: 'Filter to evaluate only nodal or extranodal measurements',\n type: 'boolean'\n },\n message: {\n label: 'Message to be displayed in case of nonconformity',\n type: 'string'\n }\n },\n required: ['limit']\n};\n\n/*\n * MaxTargetsPerOrganCriterion\n * Check if the number of target measurements per organ exceeded the limit allowed\n * Options:\n * limit: Max targets allowed in study\n * newTarget: Flag to evaluate only new targets (must be evaluated on both)\n * isNodal: Filter to evaluate only nodal or extranodal measurements\n * message: Message to be displayed in case of nonconformity\n */\nexport class MaxTargetsPerOrganCriterion extends BaseCriterion {\n constructor(...props) {\n super(...props);\n }\n\n evaluate(data) {\n const {options} = this;\n const targetsPerOrgan = {};\n const measurements = [];\n\n const newTargetNumbers = this.getNewTargetNumbers(data);\n data.targets.forEach((target) => {\n const {measurement} = target;\n const {location, measurementNumber, isSplitLesion, isNodal} = measurement;\n\n if (isSplitLesion) { return; }\n\n if (typeof isNodal === 'boolean' && typeof options.isNodal === 'boolean' && options.isNodal !== isNodal) { return; }\n\n if (!targetsPerOrgan[location]) {\n targetsPerOrgan[location] = new Set();\n }\n\n if (!options.newTarget || newTargetNumbers.has(measurementNumber)) {\n targetsPerOrgan[location].add(measurementNumber);\n }\n\n if (targetsPerOrgan[location].size > options.limit) {\n measurements.push(measurement);\n }\n });\n\n let message;\n if (measurements.length) {\n const increment = options.newTarget ? 'new ' : '';\n message =\n options.message ||\n `Each organ should not have more than ${\n options.limit\n } ${increment}targets.`;\n }\n\n return this.generateResponse(message, measurements);\n }\n}\n","import {BaseCriterion} from './BaseCriterion';\n\nexport const MaxTargetsSchema = {\n type: 'object',\n properties: {\n limit: {\n label: 'Max targets allowed in study',\n type: 'integer',\n minimum: 0\n },\n newTarget: {\n label: 'Flag to evaluate only new targets',\n type: 'boolean'\n },\n locationIn: {\n label:\n 'Filter to evaluate only measurements with the specified locations',\n type: 'array',\n items: {\n type: 'string'\n },\n minItems: 1,\n uniqueItems: true\n },\n locationNotIn: {\n label:\n 'Filter to evaluate only measurements without the specified locations',\n type: 'array',\n items: {\n type: 'string'\n },\n minItems: 1,\n uniqueItems: true\n },\n isNodal: {\n label: 'Filter to evaluate only nodal or extranodal measurements',\n type: 'boolean'\n },\n message: {\n label: 'Message to be displayed in case of nonconformity',\n type: 'string'\n }\n },\n required: ['limit']\n};\n\n/* MaxTargetsCriterion\n * Check if the number of target measurements exceeded the limit allowed\n * Options:\n * limit: Max targets allowed in study\n * newTarget: Flag to evaluate only new targets (must be evaluated on both)\n * locationIn: Filter to evaluate only measurements with the specified locations\n * locationNotIn: Filter to evaluate only measurements without the specified locations\n * isNodal: Filter to evaluate only nodal or extranodal measurements\n * message: Message to be displayed in case of nonconformity\n */\nexport class MaxTargetsCriterion extends BaseCriterion {\n constructor(...props) {\n super(...props);\n }\n\n evaluate(data) {\n const {options} = this;\n\n const newTargetNumbers = this.getNewTargetNumbers(data);\n const measurementNumbers = [];\n data.targets.forEach((target) => {\n const {location, measurementNumber, isSplitLesion, isNodal} = target.measurement;\n\n if (isSplitLesion) { return; }\n\n if (typeof isNodal === 'boolean' && typeof options.isNodal === 'boolean' && options.isNodal !== isNodal) { return; }\n\n if (options.newTarget && !newTargetNumbers.has(measurementNumber)) { return; }\n\n if (options.locationIn && options.locationIn.indexOf(location) === -1) { return; }\n\n if (options.locationNotIn && options.locationNotIn.indexOf(location) > -1) { return; }\n\n measurementNumbers.push(measurementNumber);\n });\n\n let lesionType = '';\n if (typeof options.isNodal === 'boolean') {\n lesionType = options.isNodal ? 'nodal ' : 'extranodal ';\n }\n\n let message;\n if (measurementNumbers.length > options.limit) {\n const increment = options.newTarget ? 'new ' : '';\n const plural = options.limit === 1 ? '' : 's';\n const amount = options.limit === 0 ? '' : `more than ${options.limit}`;\n message =\n options.message ||\n `The study should not have ${amount} ${increment}${lesionType}target${plural}.`;\n }\n\n return this.generateResponse(message);\n }\n}\n","import {BaseCriterion} from './BaseCriterion';\n\nexport const MeasurementsLengthSchema = {\n type: 'object',\n properties: {\n longAxis: {\n label: 'Minimum length of long axis',\n type: 'number',\n minimum: 0\n },\n shortAxis: {\n label: 'Minimum length of short axis',\n type: 'number',\n minimum: 0\n },\n longAxisSliceThicknessMultiplier: {\n label: 'Length of long axis multiplier',\n type: 'number',\n minimum: 0\n },\n shortAxisSliceThicknessMultiplier: {\n label: 'Length of short axis multiplier',\n type: 'number',\n minimum: 0\n },\n modalityIn: {\n label:\n 'Filter to evaluate only measurements with the specified modalities',\n type: 'array',\n items: {\n type: 'string'\n },\n minItems: 1,\n uniqueItems: true\n },\n modalityNotIn: {\n label:\n 'Filter to evaluate only measurements without the specified modalities',\n type: 'array',\n items: {\n type: 'string'\n },\n minItems: 1,\n uniqueItems: true\n },\n locationIn: {\n label:\n 'Filter to evaluate only measurements with the specified locations',\n type: 'array',\n items: {\n type: 'string'\n },\n minItems: 1,\n uniqueItems: true\n },\n locationNotIn: {\n label:\n 'Filter to evaluate only measurements without the specified locations',\n type: 'array',\n items: {\n type: 'string'\n },\n minItems: 1,\n uniqueItems: true\n },\n isNodal: {\n label: 'Filter to evaluate only nodal or extranodal measurements',\n type: 'boolean'\n },\n message: {\n label: 'Message to be displayed in case of nonconformity',\n type: 'string'\n }\n },\n anyOf: [\n {required: ['message', 'longAxis']},\n {required: ['message', 'shortAxis']},\n {required: ['message', 'longAxisSliceThicknessMultiplier']},\n {required: ['message', 'shortAxisSliceThicknessMultiplier']}\n ]\n};\n\n/*\n * MeasurementsLengthCriterion\n * Check the measurements of all bidirectional tools based on\n * short axis, long axis, modalities, location and slice thickness\n * Options:\n * longAxis: Minimum length of long axis\n * shortAxis: Minimum length of short axis\n * longAxisSliceThicknessMultiplier: Length of long axis multiplier\n * shortAxisSliceThicknessMultiplier: Length of short axis multiplier\n * modalityIn: Filter to evaluate only measurements with the specified modalities\n * modalityNotIn: Filter to evaluate only measurements without the specified modalities\n * locationIn: Filter to evaluate only measurements with the specified locations\n * locationNotIn: Filter to evaluate only measurements without the specified locations\n * isNodal: Filter to evaluate only nodal or extranodal measurements\n * message: Message to be displayed in case of nonconformity\n */\nexport class MeasurementsLengthCriterion extends BaseCriterion {\n constructor(...props) {\n super(...props);\n }\n\n evaluate(data) {\n let message;\n const measurements = [];\n const {options} = this;\n const longMultiplier = options.longAxisSliceThicknessMultiplier;\n const shortMultiplier = options.shortAxisSliceThicknessMultiplier;\n\n data.targets.forEach((item) => {\n const {metadata, measurement} = item;\n const {location} = measurement;\n\n let {longestDiameter, shortestDiameter, isNodal} = measurement;\n if (measurement.childToolsCount) {\n const child = measurement.bidirectional;\n longestDiameter = (child && child.longestDiameter) || 0;\n shortestDiameter = (child && child.shortestDiameter) || 0;\n }\n\n const {SliceThickness} = metadata;\n\n const Modality = metadata.getTagValue('Modality') || '';\n\n // Stop here if the measurement does not match the Modality and location filters\n if (\n typeof isNodal === 'boolean' &&\n typeof options.isNodal === 'boolean' &&\n options.isNodal !== isNodal\n ) { return; }\n if (options.locationIn && options.locationIn.indexOf(location) === -1) { return; }\n if (options.modalityIn && options.modalityIn.indexOf(Modality) === -1) { return; }\n if (options.locationNotIn && options.locationNotIn.indexOf(location) > -1) { return; }\n if (options.modalityNotIn && options.modalityNotIn.indexOf(Modality) > -1) { return; }\n\n // Check the measurement length\n const failed =\n (options.longAxis && longestDiameter < options.longAxis) ||\n (options.shortAxis && shortestDiameter < options.shortAxis) ||\n (longMultiplier &&\n !isNaN(SliceThickness) &&\n longestDiameter < longMultiplier * SliceThickness) ||\n (shortMultiplier &&\n !isNaN(SliceThickness) &&\n shortestDiameter < shortMultiplier * SliceThickness);\n\n // Mark this measurement as invalid if some of the checks have failed\n if (failed) {\n measurements.push(measurement);\n }\n });\n\n // Use the options' message if some measurement is invalid\n if (measurements.length) {\n message = options.message;\n }\n\n return this.generateResponse(message, measurements);\n }\n}\n","import {BaseCriterion} from './BaseCriterion';\n\nexport const ModalitySchema = {\n type: 'object',\n properties: {\n method: {\n label: 'Specify if it\\'s goinig to \"allow\" or \"deny\" the modalities',\n type: 'string',\n enum: ['allow', 'deny']\n },\n measurementTypes: {\n label: 'List of measurement types that will be evaluated',\n type: 'array',\n items: {\n type: 'string'\n },\n minItems: 1,\n uniqueItems: true\n },\n modalities: {\n label: 'List of allowed/denied modalities',\n type: 'array',\n items: {\n type: 'string'\n },\n minItems: 1,\n uniqueItems: true\n }\n },\n required: ['method', 'modalities']\n};\n\n/*\n * ModalityCriteria\n * Check if a Modality is allowed or denied\n * Options:\n * method (string): Specify if it\\'s goinig to \"allow\" or \"deny\" the modalities\n * measurementTypes (string[]): List of measurement types that will be evaluated\n * modalities (string[]): List of allowed/denied modalities\n */\nexport class ModalityCriterion extends BaseCriterion {\n constructor(...props) {\n super(...props);\n }\n\n evaluate(data) {\n const measurementTypes = this.options.measurementTypes || ['targets'];\n const modalitiesSet = new Set(this.options.modalities);\n const validationMethod = this.options.method;\n const measurements = [];\n const invalidModalities = new Set();\n let message;\n\n measurementTypes.forEach((measurementType) => {\n const items = data[measurementType];\n\n items.forEach((item) => {\n const {measurement, metadata} = item;\n const Modality = metadata.getTagValue('Modality') || '';\n\n if (\n (validationMethod === 'allow' && !modalitiesSet.has(Modality)) ||\n (validationMethod === 'deny' && modalitiesSet.has(Modality))\n ) {\n measurements.push(measurement);\n invalidModalities.add(Modality);\n }\n });\n });\n\n if (measurements.length) {\n const uniqueModalities = Array.from(invalidModalities);\n const uniqueModalitiesText = uniqueModalities.join(', ');\n const modalityText =\n uniqueModalities.length > 1 ? 'modalities' : 'Modality';\n\n message = `The ${modalityText} ${uniqueModalitiesText} should not be used as a method of measurement`;\n }\n\n return this.generateResponse(message, measurements);\n }\n}\n","import {BaseCriterion} from './BaseCriterion';\n\nexport const NonTargetResponseSchema = {\n type: 'object'\n};\n\n/* NonTargetResponseCriterion\n * Check if the there are non-target measurements with response different than \"present\" on baseline\n */\nexport class NonTargetResponseCriterion extends BaseCriterion {\n constructor(...props) {\n super(...props);\n }\n\n evaluate(data) {\n const items = data.nonTargets;\n const measurements = [];\n let message;\n\n items.forEach((item) => {\n const measurement = item.measurement;\n const response = (measurement.response || '').toLowerCase();\n\n if (response !== 'present') {\n measurements.push(measurement);\n }\n });\n\n if (measurements.length) {\n message = 'Non-targets can only be assessed as \"present\"';\n }\n\n return this.generateResponse(message, measurements);\n }\n}\n","import {BaseCriterion} from './BaseCriterion';\n\nexport const TargetTypeSchema = {\n type: 'object'\n};\n\n/* TargetTypeCriterion\n * Check if the there are non-bidirectional target measurements on baseline\n */\nexport class TargetTypeCriterion extends BaseCriterion {\n constructor(...props) {\n super(...props);\n }\n\n evaluate(data) {\n const items = data.targets;\n const measurements = [];\n let message;\n\n items.forEach((item) => {\n const measurement = item.measurement;\n\n if (\n measurement.toolType !== 'Bidirectional' &&\n !measurement.bidirectional\n ) {\n measurements.push(measurement);\n }\n });\n\n if (measurements.length) {\n message =\n 'Target lesions must have measurements (cannot be assessed as CR, UN/NE, EX)';\n }\n\n return this.generateResponse(message, measurements);\n }\n}\n","import Ajv from 'ajv';\nimport {BaseCriterion} from './criteria/BaseCriterion';\nimport * as initialCriteria from './criteria';\n\nconst Criteria = {...initialCriteria};\n\nexport class CriteriaEvaluator {\n constructor(criteriaObject) {\n const criteriaValidator = this.getCriteriaValidator();\n this.criteria = [];\n\n if (!criteriaValidator(criteriaObject)) {\n let message = '';\n criteriaValidator.errors.forEach((error) => {\n message += `\\noptions${error.dataPath} ${error.message}`;\n });\n throw new Error(message);\n }\n\n Object.keys(criteriaObject).forEach((criterionkey) => {\n const optionsObject = criteriaObject[criterionkey];\n const Criterion = Criteria[`${criterionkey}Criterion`];\n const optionsArray =\n optionsObject instanceof Array ? optionsObject : [optionsObject];\n optionsArray.forEach((options) => this.criteria.push(new Criterion(options, criterionkey)));\n });\n }\n\n getMaxTargets(newTarget = false) {\n let result = 0;\n this.criteria.forEach((criterion) => {\n const newTargetMatch = newTarget === !!criterion.options.newTarget;\n if (criterion instanceof Criteria.MaxTargetsCriterion && newTargetMatch) {\n const {limit} = criterion.options;\n if (limit > result) {\n result = limit;\n }\n }\n });\n return result;\n }\n\n getCriteriaValidator() {\n if (CriteriaEvaluator.criteriaValidator) {\n return CriteriaEvaluator.criteriaValidator;\n }\n\n const schema = {\n properties: {},\n definitions: {}\n };\n\n Object.keys(Criteria).forEach((key) => {\n const Criterion = Criteria[key];\n if (Criterion.prototype instanceof BaseCriterion) {\n const criterionkey = key.replace(/Criterion$/, '');\n const criterionDefinition = `#/definitions/${criterionkey}`;\n\n schema.definitions[criterionkey] = Criteria[`${criterionkey}Schema`];\n schema.properties[criterionkey] = {\n oneOf: [\n {$ref: criterionDefinition},\n {\n type: 'array',\n items: {\n $ref: criterionDefinition\n }\n }\n ]\n };\n }\n });\n\n CriteriaEvaluator.criteriaValidator = new Ajv().compile(schema);\n return CriteriaEvaluator.criteriaValidator;\n }\n\n evaluate(data) {\n const nonconformities = [];\n this.criteria.forEach((criterion) => {\n const criterionResult = criterion.evaluate(data);\n if (!criterionResult.passed) {\n nonconformities.push(criterionResult);\n }\n });\n return nonconformities;\n }\n\n static setCriterion(criterionKey, criterionDefinitions) {\n Criteria[criterionKey] = criterionDefinitions;\n }\n}\n","import * as recistEvaluation from './recist.json';\n\nexport const recist11 = recistEvaluation;\n","import {CriteriaEvaluator} from './CriteriaEvaluator';\nimport * as initialEvaluations from './evaluations';\nimport log from '../../log';\n\nconst evaluations = {...initialEvaluations};\n\nconst BASELINE = 'baseline';\nconst FOLLOWUP = 'followup';\nconst BOTH = 'both';\nconst TARGETS = 'targets';\nconst NONTARGETS = 'nonTargets';\n\nclass ConformanceCriteria {\n constructor(measurementApi, timepointApi, options = {}) {\n this.measurementApi = measurementApi;\n this.timepointApi = timepointApi;\n this.nonconformities = [];\n this.groupedNonConformities = [];\n this.maxTargets = null;\n this.maxNewTargets = null;\n this.options = options;\n }\n\n loadStudy(StudyInstanceUID) {\n if (typeof this.options.loadStudy !== 'function') {\n throw new Error('loadStudy callback is not defined');\n }\n\n return this.options.loadStudy(null, StudyInstanceUID);\n }\n\n async validate(trialCriteriaType) {\n const baselinePromise = this.getData(BASELINE);\n const followupPromise = this.getData(FOLLOWUP);\n const [baselineData, followupData] = await Promise.all([\n baselinePromise,\n followupPromise\n ]);\n const mergedData = {\n targets: [],\n nonTargets: []\n };\n\n mergedData.targets = mergedData.targets.concat(baselineData.targets);\n mergedData.targets = mergedData.targets.concat(followupData.targets);\n mergedData.nonTargets = mergedData.nonTargets.concat(\n baselineData.nonTargets\n );\n mergedData.nonTargets = mergedData.nonTargets.concat(\n followupData.nonTargets\n );\n\n this.maxTargets = null;\n this.maxNewTargets = null;\n const resultBoth = this.validateTimepoint(\n BOTH,\n trialCriteriaType,\n mergedData\n );\n const resultBaseline = this.validateTimepoint(\n BASELINE,\n trialCriteriaType,\n baselineData\n );\n const resultFollowup = this.validateTimepoint(\n FOLLOWUP,\n trialCriteriaType,\n followupData\n );\n const nonconformities = resultBaseline\n .concat(resultFollowup)\n .concat(resultBoth);\n const groupedNonConformities = this.groupNonConformities(nonconformities);\n\n // Keep both? Group the data only on viewer/measurementTable views?\n // Work with not grouped data (worse lookup performance on measurementTableRow)?\n this.nonconformities = nonconformities;\n this.groupedNonConformities = groupedNonConformities;\n\n console.warn('nonconformities');\n console.warn(nonconformities);\n console.warn('groupedNonConformities');\n console.warn(groupedNonConformities);\n\n return nonconformities;\n }\n\n groupNonConformities(nonconformities) {\n const groups = {};\n const toolsGroupsMap = this.measurementApi.toolsGroupsMap;\n\n nonconformities.forEach((nonConformity) => {\n if (nonConformity.isGlobal) {\n groups.globals = groups.globals || {messages: []};\n groups.globals.messages.push(nonConformity.message);\n\n return;\n }\n\n nonConformity.measurements.forEach((measurement) => {\n const groupName = toolsGroupsMap[measurement.toolType];\n groups[groupName] = groups[groupName] || {measurementNumbers: {}};\n\n const group = groups[groupName];\n const measureNumber = measurement.measurementNumber;\n let measurementNumbers = group.measurementNumbers[measureNumber];\n\n if (!measurementNumbers) {\n measurementNumbers = group.measurementNumbers[measureNumber] = {\n messages: [],\n measurements: []\n };\n }\n\n measurementNumbers.messages.push(nonConformity.message);\n measurementNumbers.measurements.push(measurement);\n });\n });\n\n return groups;\n }\n\n validateTimepoint(timepointType, trialCriteriaType, data) {\n const evaluators = this.getEvaluators(timepointType, trialCriteriaType);\n let nonconformities = [];\n\n evaluators.forEach((evaluator) => {\n const maxTargets = evaluator.getMaxTargets(false);\n const maxNewTargets = evaluator.getMaxTargets(true);\n if (maxTargets) {\n this.maxTargets = maxTargets;\n }\n\n if (maxNewTargets) {\n this.maxNewTargets = maxNewTargets;\n }\n\n const result = evaluator.evaluate(data);\n\n if (result.length > 0) {\n result.forEach((resultItem) => {\n resultItem.timepointType = timepointType;\n });\n }\n\n nonconformities = nonconformities.concat(result);\n });\n\n return nonconformities;\n }\n\n getEvaluators(timepointType, trialCriteriaType) {\n const evaluators = [];\n console.warn(evaluations);\n const trialCriteriaTypeId = trialCriteriaType.id.toLowerCase();\n const evaluation = evaluations[trialCriteriaTypeId];\n\n if (evaluation) {\n const evaluationTimepoint = evaluation[timepointType];\n\n if (evaluationTimepoint) {\n evaluators.push(new CriteriaEvaluator(evaluationTimepoint));\n }\n }\n\n return evaluators;\n }\n\n /*\n * Build the data that will be used to do the conformance criteria checks\n */\n async getData(timepointType) {\n const data = {\n targets: [],\n nonTargets: []\n };\n\n const studyPromises = [];\n\n const fillData = (measurementType) => {\n const measurements = this.measurementApi.fetch(measurementType);\n\n measurements.forEach((measurement) => {\n const {StudyInstanceUID} = measurement;\n\n const timepointId = measurement.timepointId;\n const timepoint =\n timepointId &&\n this.timepointApi.timepoints.find((a) => a.timepointId === timepointId);\n\n if (\n !timepoint ||\n (timepointType !== BOTH && timepoint.timepointType !== timepointType)\n ) {\n return;\n }\n\n const promise = this.loadStudy(StudyInstanceUID);\n promise.then(\n (studyMetadata) => {\n data[measurementType].push({\n measurement,\n metadata: studyMetadata.getFirstInstance(),\n timepoint\n });\n },\n (error) => {\n throw new Error(error);\n }\n );\n studyPromises.push(promise);\n });\n };\n\n fillData(TARGETS);\n fillData(NONTARGETS);\n\n await Promise.all(studyPromises);\n\n return data;\n }\n\n static setEvaluationDefinitions(evaluationKey, evaluationDefinitions) {\n evaluations[evaluationKey] = evaluationDefinitions;\n }\n}\n\nexport default ConformanceCriteria;\n// OHIF.measurements.ConformanceCriteria = ConformanceCriteria;\n","import cornerstone from 'cornerstone-core';\n\nexport default function (element) {\n // Get the Cornerstone imageId\n const enabledElement = cornerstone.getEnabledElement(element);\n const imageId = enabledElement.image.imageId;\n\n // Get StudyInstanceUID & PatientID\n const {\n StudyInstanceUID,\n PatientID,\n SeriesInstanceUID,\n SOPInstanceUID\n } = cornerstone.metaData.get('instance', imageId);\n\n const splitImageId = imageId.split('&frame');\n const frameIndex =\n splitImageId[1] !== undefined ? Number(splitImageId[1]) : 0;\n\n const imagePath = [\n StudyInstanceUID,\n SeriesInstanceUID,\n SOPInstanceUID,\n frameIndex\n ].join('_');\n\n return {\n PatientID,\n StudyInstanceUID,\n SeriesInstanceUID,\n SOPInstanceUID,\n frameIndex,\n imagePath\n };\n}\n","import cornerstone from 'cornerstone-core';\nimport {MeasurementApi} from '../classes';\nimport log from '../../log';\nimport user from '../../user';\nimport getImageAttributes from '../lib/getImageAttributes';\nimport getLabel from '../lib/getLabel';\n\nexport default function handleSingleMeasurementAdded({eventData, tool}) {\n const measurementApi = MeasurementApi.Instance;\n if (!measurementApi) {\n log.warn('Measurement API is not initialized');\n }\n\n const {measurementData, toolType} = eventData;\n\n const collection = measurementApi.tools[toolType];\n\n // Stop here if the tool data shall not be persisted (e.g. temp tools)\n if (!collection) return;\n\n // Stop here if there's no measurement data or if it was cancelled\n if (!measurementData || measurementData.cancelled) return;\n\n log.info('CornerstoneToolsMeasurementAdded');\n\n const imageAttributes = getImageAttributes(eventData.element);\n const measurement = {\n ...measurementData,\n ...imageAttributes,\n lesionNamingNumber: measurementData.lesionNamingNumber,\n userId: user.getUserId(),\n toolType\n };\n\n const addedMeasurement = measurementApi.addMeasurement(toolType, measurement);\n Object.assign(measurementData, addedMeasurement);\n\n const measurementLabel = getLabel(measurementData);\n if (measurementLabel) {\n measurementData.labels = [measurementLabel];\n }\n\n // TODO: This is very hacky, but will work for now\n cornerstone.getEnabledElements().forEach((enabledElement) => {\n cornerstone.updateImage(enabledElement.element);\n });\n\n // TODO: Notify about the last activated measurement\n\n if (MeasurementApi.isToolIncluded(tool)) {\n // TODO: Notify that viewer suffered changes\n }\n}\n","import cornerstone from 'cornerstone-core';\nimport {MeasurementApi} from '../classes';\nimport log from '../../log';\nimport user from '../../user';\nimport getImageAttributes from '../lib/getImageAttributes';\nimport getLabel from '../lib/getLabel';\n\nexport default function ({eventData, tool, toolGroupId, toolGroup}) {\n const measurementApi = MeasurementApi.Instance;\n if (!measurementApi) {\n log.warn('Measurement API is not initialized');\n }\n\n const {measurementData} = eventData;\n\n const collection = measurementApi.tools[tool.parentTool];\n\n // Stop here if the tool data shall not be persisted (e.g. temp tools)\n if (!collection) return;\n\n // Stop here if there's no measurement data or if it was cancelled\n if (!measurementData || measurementData.cancelled) return;\n\n log.info('CornerstoneToolsMeasurementAdded');\n\n const imageAttributes = getImageAttributes(eventData.element);\n\n const additionalProperties = Object.assign(imageAttributes, {\n userId: user.getUserId()\n });\n\n const childMeasurement = {\n\n ...measurementData,\n ...additionalProperties\n };\n\n const parentMeasurement = collection.find(\n (t) => t.toolType === tool.parentTool &&\n t.PatientID === imageAttributes.PatientID &&\n t[tool.attribute] === null\n );\n\n // Check if a measurement to fit this child tool already exists\n if (parentMeasurement) {\n const key = tool.attribute;\n\n // Add the createdAt attribute\n childMeasurement.createdAt = new Date();\n\n // Update the parent measurement\n parentMeasurement[key] = childMeasurement;\n parentMeasurement.childToolsCount =\n (parentMeasurement.childToolsCount || 0) + 1;\n measurementApi.updateMeasurement(tool.parentTool, parentMeasurement);\n\n // Update the measurementData ID and lesionNamingNumber\n measurementData._id = parentMeasurement._id;\n measurementData.lesionNamingNumber = parentMeasurement.lesionNamingNumber;\n } else {\n const measurement = {\n toolType: tool.parentTool,\n lesionNamingNumber: measurementData.lesionNamingNumber,\n userId: user.getUserId(),\n PatientID: imageAttributes.PatientID,\n StudyInstanceUID: imageAttributes.StudyInstanceUID\n };\n\n measurement[tool.attribute] = {\n\n ...measurementData,\n ...additionalProperties\n };\n\n const addedMeasurement = measurementApi.addMeasurement(\n tool.parentTool,\n measurement\n );\n Object.assign(measurementData, addedMeasurement);\n }\n\n const measurementLabel = getLabel(measurementData);\n if (measurementLabel) {\n measurementData.labels = [measurementLabel];\n }\n\n // TODO: This is very hacky, but will work for now\n cornerstone.getEnabledElements().forEach((enabledElement) => {\n cornerstone.updateImage(enabledElement.element);\n });\n\n // TODO: Notify about the last activated measurement\n\n if (MeasurementApi.isToolIncluded(tool)) {\n // TODO: Notify that viewer suffered changes\n }\n}\n","import cornerstone from 'cornerstone-core';\nimport {MeasurementApi} from '../classes';\nimport log from '../../log';\n\nexport default function ({eventData, tool, toolGroupId, toolGroup}) {\n const measurementApi = MeasurementApi.Instance;\n if (!measurementApi) {\n log.warn('Measurement API is not initialized');\n }\n\n const {measurementData, toolType} = eventData;\n\n const collection = measurementApi.tools[toolType];\n\n // Stop here if the tool data shall not be persisted (e.g. temp tools)\n if (!collection) return;\n\n log.info('CornerstoneToolsMeasurementModified');\n let measurement = collection.find((t) => t._id === measurementData._id);\n\n // Stop here if the measurement is already deleted\n if (!measurement) return;\n\n measurement = Object.assign(measurement, measurementData);\n measurement.viewport = cornerstone.getViewport(eventData.element);\n\n measurementApi.updateMeasurement(toolType, measurement);\n\n // TODO: Notify about the last activated measurement\n\n if (MeasurementApi.isToolIncluded(tool)) {\n // TODO: Notify that viewer suffered changes\n }\n}\n","import cornerstone from 'cornerstone-core';\nimport {MeasurementApi} from '../classes';\nimport log from '../../log';\n\nexport default function ({eventData, tool, toolGroupId, toolGroup}) {\n const measurementApi = MeasurementApi.Instance;\n if (!measurementApi) {\n log.warn('Measurement API is not initialized');\n }\n\n const {measurementData} = eventData;\n\n const collection = measurementApi.tools[tool.parentTool];\n\n // Stop here if the tool data shall not be persisted (e.g. temp tools)\n if (!collection) return;\n\n log.info('CornerstoneToolsMeasurementModified');\n\n const measurement = collection.find((t) => t._id === measurementData._id);\n let childMeasurement = measurement && measurement[tool.attribute];\n\n // Stop here if the measurement is already deleted\n if (!childMeasurement) return;\n\n childMeasurement = Object.assign(childMeasurement, measurementData);\n childMeasurement.viewport = cornerstone.getViewport(eventData.element);\n\n // Update the parent measurement\n measurement[tool.attribute] = childMeasurement;\n measurementApi.updateMeasurement(tool.parentTool, measurement);\n\n // TODO: Notify about the last activated measurement\n\n if (MeasurementApi.isToolIncluded(tool)) {\n // TODO: Notify that viewer suffered changes\n }\n}\n","import cornerstone from 'cornerstone-core';\nimport {MeasurementApi} from '../classes';\nimport log from '../../log';\n\nexport default function handleSingleMeasurementRemoved({\n eventData,\n tool,\n toolGroupId,\n toolGroup\n}) {\n log.info('CornerstoneToolsMeasurementRemoved');\n // Mod by TungLT: add persist flag to add removed annotation to template deteled data, which needs to send request to server\n const {measurementData, toolType, persist} = eventData;\n\n const measurementApi = MeasurementApi.Instance;\n if (!measurementApi) {\n log.warn('Measurement API is not initialized');\n }\n\n const collection = measurementApi.tools[toolType];\n\n // Stop here if the tool data shall not be persisted (e.g. temp tools)\n if (!collection) return;\n\n const measurementTypeId = measurementApi.toolsGroupsMap[toolType];\n const measurement = collection.find((t) => t._id === measurementData._id);\n\n // Stop here if the measurement is already gone or never existed\n if (!measurement) return;\n\n // Remove all the measurements with the given type and number\n // Modified by TungLT\n // const { lesionNamingNumber, timepointId } = measurement;\n measurementApi.deleteMeasurements(toolType, measurementTypeId, measurement, persist);\n\n // TODO: This is very hacky, but will work for now\n cornerstone.getEnabledElements().forEach((enabledElement) => {\n cornerstone.updateImage(enabledElement.element);\n });\n\n if (MeasurementApi.isToolIncluded(tool)) {\n // TODO: Notify that viewer suffered changes\n }\n}\n","import cornerstone from 'cornerstone-core';\nimport {MeasurementApi} from '../classes';\nimport log from '../../log';\n\nexport default function ({eventData, tool, toolGroupId, toolGroup}) {\n log.info('CornerstoneToolsMeasurementRemoved');\n // Mod by TungLT: add persist flag to add removed annotation to template deteled data, which needs to send request to server\n const {measurementData, persist} = eventData;\n\n const measurementApi = MeasurementApi.Instance;\n if (!measurementApi) {\n log.warn('Measurement API is not initialized');\n }\n\n const collection = measurementApi.tools[tool.parentTool];\n\n // Stop here if the tool data shall not be persisted (e.g. temp tools)\n if (!collection) return;\n\n const measurementIndex = collection.findIndex(\n (t) => t._id === measurementData._id\n );\n const measurement =\n measurementIndex > -1 ? collection[measurementIndex] : null;\n\n // Stop here if the measurement is already gone or never existed\n if (!measurement) return;\n\n if (measurement.childToolsCount === 1) {\n // Remove the measurement\n collection.splice(measurementIndex, 1);\n measurementApi.onMeasurementRemoved(tool.parentTool, measurement, persist);\n } else {\n // Update the measurement\n measurement[tool.attribute] = null;\n measurement.childToolsCount = (measurement.childToolsCount || 0) - 1;\n measurementApi.updateMeasurement(tool.parentTool, measurement);\n }\n\n // TODO: This is very hacky, but will work for now\n cornerstone.getEnabledElements().forEach((enabledElement) => {\n cornerstone.updateImage(enabledElement.element);\n });\n\n if (MeasurementApi.isToolIncluded(tool)) {\n // TODO: Notify that viewer suffered changes\n }\n}\n","import {MeasurementApi, TimepointApi} from '../classes';\nimport handleSingleMeasurementAdded from './handleSingleMeasurementAdded';\nimport handleChildMeasurementAdded from './handleChildMeasurementAdded';\nimport handleSingleMeasurementModified from './handleSingleMeasurementModified';\nimport handleChildMeasurementModified from './handleChildMeasurementModified';\nimport handleSingleMeasurementRemoved from './handleSingleMeasurementRemoved';\nimport handleChildMeasurementRemoved from './handleChildMeasurementRemoved';\n\nconst getEventData = (event) => {\n const eventData = event.detail;\n if (eventData.toolName) {\n eventData.toolType = eventData.toolName;\n }\n\n return eventData;\n};\n\nconst MeasurementHandlers = {\n handleSingleMeasurementAdded,\n handleChildMeasurementAdded,\n handleSingleMeasurementModified,\n handleChildMeasurementModified,\n handleSingleMeasurementRemoved,\n handleChildMeasurementRemoved,\n\n onAdded(event) {\n const eventData = getEventData(event);\n const {toolType} = eventData;\n const {\n toolGroupId,\n toolGroup,\n tool\n } = MeasurementApi.getToolConfiguration(toolType);\n\n // TungLT add current selected timepoint id\n const currentTimepoint = TimepointApi.getInstance().current();\n if (currentTimepoint)\n eventData.measurementData.timepointId = currentTimepoint.timepointId;\n\n const params = {\n eventData,\n tool,\n toolGroupId,\n toolGroup\n };\n\n if (!tool) return;\n\n if (tool.parentTool) {\n handleChildMeasurementAdded(params);\n } else {\n handleSingleMeasurementAdded(params);\n }\n },\n\n onModified(event) {\n const eventData = getEventData(event);\n const {toolType} = eventData;\n const {\n toolGroupId,\n toolGroup,\n tool\n } = MeasurementApi.getToolConfiguration(toolType);\n const params = {\n eventData,\n tool,\n toolGroupId,\n toolGroup\n };\n\n if (!tool) return;\n\n if (tool.parentTool) {\n handleChildMeasurementModified(params);\n } else {\n handleSingleMeasurementModified(params);\n }\n },\n\n onRemoved(event) {\n const eventData = getEventData(event);\n const {toolType} = eventData;\n const {\n toolGroupId,\n toolGroup,\n tool\n } = MeasurementApi.getToolConfiguration(toolType);\n const params = {\n eventData,\n tool,\n toolGroupId,\n toolGroup\n };\n\n if (!tool) return;\n\n if (tool.parentTool) {\n handleChildMeasurementRemoved(params);\n } else {\n handleSingleMeasurementRemoved(params);\n }\n }\n};\n\nexport default MeasurementHandlers;\n","import {bidirectional, targetCR, targetUN, targetNE} from '../tools';\n\nexport const targets = {\n id: 'targets',\n name: 'Targets',\n childTools: [bidirectional, targetCR, targetUN, targetNE],\n options: {\n caseProgress: {\n include: true,\n evaluate: true\n }\n }\n};\n","import {nonTarget} from '../tools';\n\nexport const nonTargets = {\n id: 'nonTargets',\n name: 'Non-Targets',\n childTools: [nonTarget],\n options: {\n caseProgress: {\n include: true,\n evaluate: true\n }\n }\n};\n","import { cloneDeep } from 'lodash';\nimport {length, ellipticalRoi} from '../tools';\n\nconst childTools = cloneDeep([length, ellipticalRoi]);\n\n// Exclude temp tools from case progress\nchildTools.forEach((childTool) => {\n childTool.options = {...childTool.options,\n caseProgress: {\n include: false,\n evaluate: false\n }};\n});\n\nexport const temp = {\n id: 'temp',\n name: 'Temporary',\n childTools,\n options: {\n caseProgress: {\n include: false,\n evaluate: false\n }\n }\n};\n","import { cloneDeep } from 'lodash';\nimport {targets} from './toolGroups/targets';\nimport {nonTargets} from './toolGroups/nonTargets';\nimport {temp} from './toolGroups/temp';\n\nconst ltTools = cloneDeep([targets, nonTargets, temp]);\n\nltTools.forEach((toolGroup) => {\n toolGroup.childTools.forEach((tool) => {\n tool.toolGroup = toolGroup.id;\n });\n});\n\nexport default ltTools;\n","import * as tools from './tools';\n\nimport {MeasurementApi, TimepointApi} from './classes';\nimport {ConformanceCriteria} from './conformance';\nimport MeasurementHandlers from './measurementHandlers';\nimport getDescription from './lib/getDescription';\nimport getImageAttributes from './lib/getImageAttributes';\nimport getImageIdForImagePath from './lib/getImageIdForImagePath';\nimport getLabel from './lib/getLabel';\nimport ltTools from './ltTools';\n\nconst measurements = {\n TimepointApi,\n MeasurementApi,\n ConformanceCriteria,\n MeasurementHandlers,\n ltTools,\n tools,\n getLabel,\n getDescription,\n getImageAttributes,\n getImageIdForImagePath\n};\n\nexport default measurements;\n","import dcmjs from 'dcmjs';\n\n/**\n * Checks if dcmjs has support to determined tool\n *\n * @param {string} toolName\n * @returns {boolean}\n */\nconst isToolSupported = (toolName) => {\n const adapter = dcmjs.adapters.Cornerstone;\n return !!adapter[toolName];\n};\n\nexport default isToolSupported;\n","import * as dcmjs from 'dcmjs';\nimport cornerstone from 'cornerstone-core';\n\nimport log from '../log';\nimport measurements from '../measurements';\nimport isToolSupported from './utils/isToolSupported';\n\n/**\n * Function to parse OHIF viewer measurementData into a dcmjs MeasurementReport\n *\n * @param {Object} measurementsData - OHIF measurementData object\n * @returns {Object} Dataset: measurement report from dcmjs\n */\nconst parseMeasurementsData = (measurementsData) => {\n const {MeasurementReport} = dcmjs.adapters.Cornerstone;\n const {getImageIdForImagePath} = measurements;\n\n const toolState = {};\n const unsupportedTools = [];\n\n Object.keys(measurementsData).forEach((measurementType) => {\n const annotations = measurementsData[measurementType];\n\n annotations.forEach((annotation) => {\n const {toolType, imagePath} = annotation;\n\n if (isToolSupported(toolType)) {\n const imageId = getImageIdForImagePath(imagePath);\n toolState[imageId] = toolState[imageId] || {};\n toolState[imageId][toolType] = toolState[imageId][toolType] || {\n data: []\n };\n\n toolState[imageId][toolType].data.push(annotation);\n } else {\n unsupportedTools.push(toolType);\n }\n });\n });\n\n if (unsupportedTools.length > 0) {\n log.warn(\n `[DICOMSR] Tooltypes not supported: ${unsupportedTools.join(', ')}`\n );\n }\n\n const report = MeasurementReport.generateReport(\n toolState,\n cornerstone.metaData\n );\n\n return {\n dataset: report.dataset\n };\n};\n\nexport default parseMeasurementsData;\n","/**\n * Retrieve a list of all displaySets of all studies\n *\n * @param {Object} studies - List of studies loaded into the viewer\n * @returns {Object} List of DisplaySets\n */\nconst getAllDisplaySets = (studies) => {\n let allDisplaySets = [];\n\n studies.forEach((study) => {\n if (study.getDisplaySets) {\n allDisplaySets = allDisplaySets.concat(study.getDisplaySets());\n }\n });\n\n return allDisplaySets;\n};\n\nexport default getAllDisplaySets;\n","import * as dcmjs from 'dcmjs';\nimport {api} from 'dicomweb-client';\n\nimport DICOMWeb from '../DICOMWeb';\nimport parseDicomStructuredReport from './parseDicomStructuredReport';\nimport parseMeasurementsData from './parseMeasurementsData';\nimport getAllDisplaySets from './utils/getAllDisplaySets';\n\nconst VERSION_NAME = 'dcmjs-0.0';\nconst TRANSFER_SYNTAX_UID = '1.2.840.10008.1.2.1';\n\n/**\n * Function to retrieve measurements from DICOM Structured Reports coming from determined server\n *\n * @param {Array} series - List of all series metaData loaded\n * @param {Array} studies - List of all studies metaData loaded\n * @param {string} serverUrl - Server URL to be used on request\n * @returns {Object} MeasurementData\n */\nconst retrieveMeasurementFromSR = async (series, studies, serverUrl) => {\n const config = {\n url: serverUrl,\n headers: DICOMWeb.getAuthorizationHeader()\n };\n\n const dicomWeb = new api.DICOMwebClient(config);\n\n const instance = series.getFirstInstance();\n const options = {\n studyInstanceUID: instance.getStudyInstanceUID(),\n seriesInstanceUID: instance.getSeriesInstanceUID(),\n sopInstanceUID: instance.getSOPInstanceUID()\n };\n\n const part10SRArrayBuffer = await dicomWeb.retrieveInstance(options);\n const displaySets = getAllDisplaySets(studies);\n const measurementsData = parseDicomStructuredReport(\n part10SRArrayBuffer,\n displaySets\n );\n\n return measurementsData;\n};\n\n/**\n * Function to store measurements to DICOM Structured Reports in determined server\n *\n * @param {Object} measurements - OHIF measurementData object\n * @param {string} serverUrl - Server URL to be used on request\n * @returns {Promise}\n */\nconst stowSRFromMeasurements = async (measurements, serverUrl) => {\n const {dataset} = parseMeasurementsData(measurements);\n const {DicomMetaDictionary, DicomDict} = dcmjs.data;\n const meta = {\n FileMetaInformationVersion: dataset._meta.FileMetaInformationVersion.Value,\n MediaStorageSOPClassUID: dataset.SOPClassUID,\n MediaStorageSOPInstanceUID: dataset.SOPInstanceUID,\n TransferSyntaxUID: TRANSFER_SYNTAX_UID,\n ImplementationClassUID: DicomMetaDictionary.uid(),\n ImplementationVersionName: VERSION_NAME\n };\n\n const denaturalized = DicomMetaDictionary.denaturalizeDataset(meta);\n const dicomDict = new DicomDict(denaturalized);\n\n dicomDict.dict = DicomMetaDictionary.denaturalizeDataset(dataset);\n\n const part10Buffer = dicomDict.write();\n\n const config = {\n url: serverUrl,\n headers: DICOMWeb.getAuthorizationHeader()\n };\n\n const dicomWeb = new api.DICOMwebClient(config);\n const options = {\n datasets: [part10Buffer]\n };\n\n await dicomWeb.storeInstances(options);\n};\n\nexport {retrieveMeasurementFromSR, stowSRFromMeasurements};\n","/**\n * Should find the most recent Structured Report metadata\n *\n * @param {Array} studies\n * @returns {Object} Series\n */\nconst findMostRecentStructuredReport = (studies) => {\n let mostRecentStructuredReport;\n\n studies.forEach((study) => {\n const allSeries = study.getSeries ? study.getSeries() : [];\n allSeries.forEach((series) => {\n // Skip series that may not have instances yet\n // This can happen if we have retrieved just the initial\n // details about the series via QIDO-RS, but not the full metadata\n if (!series.instances || !series.instances.length) {\n return;\n }\n\n if (isStructuredReportSeries(series)) {\n if (!mostRecentStructuredReport || compareSeriesDate(series, mostRecentStructuredReport)) {\n mostRecentStructuredReport = series;\n }\n }\n });\n });\n\n return mostRecentStructuredReport;\n};\n\n/**\n * Checks if series sopClassUID matches with the supported Structured Reports sopClassUID\n *\n * @param {Object} series - Series metadata\n * @returns {boolean}\n */\nconst isStructuredReportSeries = (series) => {\n const supportedSopClassUIDs = ['1.2.840.10008.5.1.4.1.1.88.22', '1.2.840.10008.5.1.4.1.1.11.1'];\n\n const firstInstance = series.getFirstInstance();\n const SOPClassUID = firstInstance.getData().metadata.SOPClassUID;\n\n return supportedSopClassUIDs.includes(SOPClassUID);\n};\n\n/**\n * Checkes if series1 is newer than series2\n *\n * @param {Object} series1 - Series Metadata 1\n * @param {Object} series2 - Series Metadata 2\n * @returns {boolean} true/false if series1 is newer than series2\n */\nconst compareSeriesDate = (series1, series2) => {\n return (\n series1._data.SeriesDate > series2._data.SeriesDate ||\n (series1._data.SeriesDate === series2._data.SeriesDate && series1._data.SeriesTime > series2._data.SeriesTime)\n );\n};\n\nexport default findMostRecentStructuredReport;\n","import {retrieveMeasurements, storeMeasurements} from './dataExchange';\nimport isToolSupported from './utils/isToolSupported';\n\nconst DICOMSR = {\n retrieveMeasurements,\n storeMeasurements,\n isToolSupported\n};\n\nexport default DICOMSR;\n","import log from '../log';\nimport studies from '../studies';\nimport utils from '../utils';\nimport {\n retrieveMeasurementFromSR,\n stowSRFromMeasurements\n} from './handleStructuredReport';\nimport findMostRecentStructuredReport from './utils/findMostRecentStructuredReport';\n\n/**\n *\n * @typedef ServerType\n * @property {string} type - type of the server\n * @property {string} wadoRoot - server wado root url\n * @property {string} annotationEndpoint - endpoint url for annotation service\n *\n */\n\n/**\n * Function to be registered into MeasurementAPI to retrieve measurements from DICOM Structured Reports\n *\n * @param {ServerType} server\n * @returns {Promise} Should resolve with OHIF measurementData object\n */\nconst retrieveMeasurements = (server) => {\n log.info('[DICOMSR] retrieveMeasurements');\n\n if (!server || server.type !== 'dicomWeb') {\n log.error('[DICOMSR] DicomWeb server is required!');\n return Promise.reject({});\n }\n\n const serverUrl = server.wadoRoot;\n const studies = utils.studyMetadataManager.all();\n\n const latestSeries = findMostRecentStructuredReport(studies);\n\n if (!latestSeries) return Promise.resolve({});\n\n return retrieveMeasurementFromSR(latestSeries, studies, serverUrl);\n};\n\n/**\n * Function to be registered into MeasurementAPI to store measurements into DICOM Structured Reports\n *\n * @param {Object} measurementData - OHIF measurementData object\n * @param {Object} filter\n * @param {ServerType} server\n * @returns {Object} With message to be displayed on success\n */\nconst storeMeasurements = async (measurementData, filter, server) => {\n log.info('[DICOMSR] storeMeasurements');\n\n if (!server || server.type !== 'dicomWeb') {\n log.error('[DICOMSR] DicomWeb server is required!');\n return Promise.reject({});\n }\n\n const serverUrl = server.wadoRoot;\n const firstMeasurementKey = Object.keys(measurementData)[0];\n const firstMeasurement = measurementData[firstMeasurementKey][0];\n const StudyInstanceUID =\n firstMeasurement && firstMeasurement.StudyInstanceUID;\n\n try {\n await stowSRFromMeasurements(measurementData, serverUrl);\n if (StudyInstanceUID) {\n studies.deleteStudyMetadataPromise(StudyInstanceUID);\n }\n\n return {\n message: 'Measurements saved successfully'\n };\n } catch (error) {\n log.error(\n `[DICOMSR] Error while saving the measurements: ${error.message}`\n );\n throw new Error('Error while saving the measurements.');\n }\n};\n\nexport {retrieveMeasurements, storeMeasurements};\n","import metadataProvider from './classes/MetadataProvider';\n\nconst cornerstone = {\n metadataProvider\n};\n\nexport default cornerstone;\n","import { InstanceMetadata } from './InstanceMetadata';\r\nimport getImageId from '../../utils/getImageId';\r\n\r\nexport class OHIFInstanceMetadata extends InstanceMetadata {\r\n /**\r\n * @param {Object} Instance object.\r\n */\r\n constructor(data, series, study, uid) {\r\n super(data, uid);\r\n this.init(series, study);\r\n }\r\n\r\n init(series, study) {\r\n const instance = this.getData();\r\n\r\n // Initialize Private Properties\r\n Object.defineProperties(this, {\r\n _sopInstanceUID: {\r\n configurable: false,\r\n enumerable: false,\r\n writable: false,\r\n value: instance.SOPInstanceUID\r\n },\r\n _study: {\r\n configurable: false,\r\n enumerable: false,\r\n writable: false,\r\n value: study\r\n },\r\n _series: {\r\n configurable: false,\r\n enumerable: false,\r\n writable: false,\r\n value: series\r\n },\r\n _instance: {\r\n configurable: false,\r\n enumerable: false,\r\n writable: false,\r\n value: instance\r\n },\r\n _cache: {\r\n configurable: false,\r\n enumerable: false,\r\n writable: false,\r\n value: Object.create(null)\r\n }\r\n });\r\n }\r\n\r\n // Override\r\n getTagValue(tagOrProperty, defaultValue, bypassCache) {\r\n // check if this property has been cached...\r\n if (tagOrProperty in this._cache && bypassCache !== true) {\r\n return this._cache[tagOrProperty];\r\n }\r\n\r\n const instanceData = this._instance.metadata;\r\n\r\n // Search property value in the whole study metadata chain...\r\n let rawValue;\r\n if (tagOrProperty in instanceData) {\r\n rawValue = instanceData[tagOrProperty];\r\n } else if (tagOrProperty in this._series) {\r\n rawValue = this._series[tagOrProperty];\r\n } else if (tagOrProperty in this._study) {\r\n rawValue = this._study[tagOrProperty];\r\n }\r\n\r\n if (rawValue !== void 0) {\r\n // if rawValue value is not undefined, cache result...\r\n this._cache[tagOrProperty] = rawValue;\r\n return rawValue;\r\n }\r\n\r\n return defaultValue;\r\n }\r\n\r\n // Override\r\n tagExists(tagOrProperty) {\r\n return tagOrProperty in this._instance.metadata || tagOrProperty in this._series || tagOrProperty in this._study;\r\n }\r\n\r\n // Override\r\n getImageId(frame, thumbnail) {\r\n // If _imageID is not cached, create it\r\n if (this._imageId === null) {\r\n this._imageId = getImageId(this.getData(), frame, thumbnail);\r\n }\r\n\r\n return this._imageId;\r\n }\r\n}\r\n","import { SeriesMetadata } from './SeriesMetadata';\r\nimport { OHIFInstanceMetadata } from './OHIFInstanceMetadata';\r\n\r\nexport class OHIFSeriesMetadata extends SeriesMetadata {\r\n /**\r\n * @param {Object} Series object.\r\n */\r\n constructor(data, study, uid) {\r\n super(data, uid);\r\n this.init(study);\r\n }\r\n\r\n init(study) {\r\n const series = this.getData();\r\n // console.log('OHIFSeriesMetadata', series);\r\n // define \"_seriesInstanceUID\" protected property...\r\n Object.defineProperty(this, '_seriesInstanceUID', {\r\n configurable: false,\r\n enumerable: false,\r\n writable: false,\r\n value: series.SeriesInstanceUID\r\n });\r\n\r\n // populate internal list of instances...\r\n series.instances.forEach((instance) => {\r\n this.addInstance(new OHIFInstanceMetadata(instance, series, study));\r\n });\r\n // Mod by Triet\r\n this.combinedId = series.SeriesInstanceUID + (series.SubSeriesIndex || '');\r\n }\r\n\r\n // Mod by Triet\r\n isSubSeries() {\r\n return this._data.isSubSeries;\r\n }\r\n\r\n getSeriesDescription() {\r\n return this._data.SeriesDescription;\r\n }\r\n\r\n getSeriesNumber() {\r\n return this._data.SeriesNumber;\r\n }\r\n\r\n getCustomSeriesInstanceUID() {\r\n return this.combinedId;\r\n }\r\n}\r\n","import { StudyMetadata } from './StudyMetadata';\r\nimport { OHIFSeriesMetadata } from './OHIFSeriesMetadata';\r\nimport { splitSeries } from '../../utils';\r\n\r\nexport class OHIFStudyMetadata extends StudyMetadata {\r\n /**\r\n * @param {Object} Study object.\r\n */\r\n constructor(data, uid) {\r\n super(data, uid);\r\n this.init();\r\n }\r\n\r\n init() {\r\n const study = this.getData();\r\n\r\n // define \"_studyInstanceUID\" protected property\r\n Object.defineProperty(this, '_studyInstanceUID', {\r\n configurable: false,\r\n enumerable: false,\r\n writable: false,\r\n value: study.StudyInstanceUID\r\n });\r\n\r\n // populate internal list of series\r\n study.series.forEach((series) => {\r\n const split = splitSeries(series);\r\n // Mod by Triet\r\n split.forEach((series) => {\r\n this.addSeries(new OHIFSeriesMetadata(series, study));\r\n });\r\n });\r\n }\r\n}\r\n","import {InstanceMetadata} from './InstanceMetadata';\r\nimport {Metadata} from './Metadata';\r\nimport {OHIFInstanceMetadata} from './OHIFInstanceMetadata';\r\nimport {OHIFSeriesMetadata} from './OHIFSeriesMetadata';\r\nimport {OHIFStudyMetadata} from './OHIFStudyMetadata';\r\nimport {SeriesMetadata} from './SeriesMetadata';\r\nimport {StudyMetadata} from './StudyMetadata';\r\n\r\nconst metadata = {\r\n Metadata,\r\n StudyMetadata,\r\n SeriesMetadata,\r\n InstanceMetadata,\r\n OHIFStudyMetadata,\r\n OHIFSeriesMetadata,\r\n OHIFInstanceMetadata\r\n};\r\n\r\nexport {\r\n Metadata,\r\n StudyMetadata,\r\n SeriesMetadata,\r\n InstanceMetadata,\r\n OHIFStudyMetadata,\r\n OHIFSeriesMetadata,\r\n OHIFInstanceMetadata\r\n};\r\n\r\nexport default metadata;\r\n","import {sopClassDictionary} from './sopClassDictionary';\r\n\r\nconst imagesTypes = [\r\n sopClassDictionary.ComputedRadiographyImageStorage,\r\n sopClassDictionary.DigitalXRayImageStorageForPresentation,\r\n sopClassDictionary.DigitalXRayImageStorageForProcessing,\r\n sopClassDictionary.DigitalMammographyXRayImageStorageForPresentation,\r\n sopClassDictionary.DigitalMammographyXRayImageStorageForProcessing,\r\n sopClassDictionary.DigitalIntraOralXRayImageStorageForPresentation,\r\n sopClassDictionary.DigitalIntraOralXRayImageStorageForProcessing,\r\n sopClassDictionary.CTImageStorage,\r\n sopClassDictionary.EnhancedCTImageStorage,\r\n sopClassDictionary.LegacyConvertedEnhancedCTImageStorage,\r\n sopClassDictionary.UltrasoundMultiframeImageStorage,\r\n sopClassDictionary.MRImageStorage,\r\n sopClassDictionary.EnhancedMRImageStorage,\r\n sopClassDictionary.EnhancedMRColorImageStorage,\r\n sopClassDictionary.LegacyConvertedEnhancedMRImageStorage,\r\n sopClassDictionary.UltrasoundImageStorage,\r\n sopClassDictionary.SecondaryCaptureImageStorage,\r\n sopClassDictionary.MultiframeSingleBitSecondaryCaptureImageStorage,\r\n sopClassDictionary.MultiframeGrayscaleByteSecondaryCaptureImageStorage,\r\n sopClassDictionary.MultiframeGrayscaleWordSecondaryCaptureImageStorage,\r\n sopClassDictionary.MultiframeTrueColorSecondaryCaptureImageStorage,\r\n sopClassDictionary.XRayAngiographicImageStorage,\r\n sopClassDictionary.EnhancedXAImageStorage,\r\n sopClassDictionary.XRayRadiofluoroscopicImageStorage,\r\n sopClassDictionary.EnhancedXRFImageStorage,\r\n sopClassDictionary.XRay3DAngiographicImageStorage,\r\n sopClassDictionary.XRay3DCraniofacialImageStorage,\r\n sopClassDictionary.BreastTomosynthesisImageStorage,\r\n sopClassDictionary.BreastProjectionXRayImageStorageForPresentation,\r\n sopClassDictionary.BreastProjectionXRayImageStorageForProcessing,\r\n sopClassDictionary.IntravascularOpticalCoherenceTomographyImageStorageForPresentation,\r\n sopClassDictionary.IntravascularOpticalCoherenceTomographyImageStorageForProcessing,\r\n sopClassDictionary.NuclearMedicineImageStorage,\r\n sopClassDictionary.VLEndoscopicImageStorage,\r\n sopClassDictionary.VideoEndoscopicImageStorage,\r\n sopClassDictionary.VLMicroscopicImageStorage,\r\n sopClassDictionary.VideoMicroscopicImageStorage,\r\n sopClassDictionary.VLSlideCoordinatesMicroscopicImageStorage,\r\n sopClassDictionary.VLPhotographicImageStorage,\r\n sopClassDictionary.VideoPhotographicImageStorage,\r\n sopClassDictionary.OphthalmicPhotography8BitImageStorage,\r\n sopClassDictionary.OphthalmicPhotography16BitImageStorage,\r\n sopClassDictionary.OphthalmicTomographyImageStorage,\r\n sopClassDictionary.VLWholeSlideMicroscopyImageStorage,\r\n sopClassDictionary.PositronEmissionTomographyImageStorage,\r\n sopClassDictionary.EnhancedPETImageStorage,\r\n sopClassDictionary.LegacyConvertedEnhancedPETImageStorage,\r\n sopClassDictionary.RTImageStorage\r\n];\r\n\r\n/**\r\n * Checks whether dicom files with specified SOP Class UID have image data\r\n * @param {string} SOPClassUID - SOP Class UID to be checked\r\n * @returns {boolean} - true if it has image data\r\n */\r\nexport const isImage = (SOPClassUID) => {\r\n if (!SOPClassUID) return false;\r\n return imagesTypes.indexOf(SOPClassUID) !== -1;\r\n};\r\n","// TODO: Deprecate since we have the same thing in dcmjs?\r\nexport const sopClassDictionary = {\r\n ComputedRadiographyImageStorage: '1.2.840.10008.5.1.4.1.1.1',\r\n DigitalXRayImageStorageForPresentation: '1.2.840.10008.5.1.4.1.1.1.1',\r\n DigitalXRayImageStorageForProcessing: '1.2.840.10008.5.1.4.1.1.1.1.1',\r\n DigitalMammographyXRayImageStorageForPresentation:\r\n '1.2.840.10008.5.1.4.1.1.1.2',\r\n DigitalMammographyXRayImageStorageForProcessing:\r\n '1.2.840.10008.5.1.4.1.1.1.2.1',\r\n DigitalIntraOralXRayImageStorageForPresentation:\r\n '1.2.840.10008.5.1.4.1.1.1.3',\r\n DigitalIntraOralXRayImageStorageForProcessing:\r\n '1.2.840.10008.5.1.4.1.1.1.3.1',\r\n CTImageStorage: '1.2.840.10008.5.1.4.1.1.2',\r\n EnhancedCTImageStorage: '1.2.840.10008.5.1.4.1.1.2.1',\r\n LegacyConvertedEnhancedCTImageStorage: '1.2.840.10008.5.1.4.1.1.2.2',\r\n UltrasoundMultiframeImageStorage: '1.2.840.10008.5.1.4.1.1.3.1',\r\n MRImageStorage: '1.2.840.10008.5.1.4.1.1.4',\r\n EnhancedMRImageStorage: '1.2.840.10008.5.1.4.1.1.4.1',\r\n MRSpectroscopyStorage: '1.2.840.10008.5.1.4.1.1.4.2',\r\n EnhancedMRColorImageStorage: '1.2.840.10008.5.1.4.1.1.4.3',\r\n LegacyConvertedEnhancedMRImageStorage: '1.2.840.10008.5.1.4.1.1.4.4',\r\n UltrasoundImageStorage: '1.2.840.10008.5.1.4.1.1.6.1',\r\n EnhancedUSVolumeStorage: '1.2.840.10008.5.1.4.1.1.6.2',\r\n SecondaryCaptureImageStorage: '1.2.840.10008.5.1.4.1.1.7',\r\n MultiframeSingleBitSecondaryCaptureImageStorage:\r\n '1.2.840.10008.5.1.4.1.1.7.1',\r\n MultiframeGrayscaleByteSecondaryCaptureImageStorage:\r\n '1.2.840.10008.5.1.4.1.1.7.2',\r\n MultiframeGrayscaleWordSecondaryCaptureImageStorage:\r\n '1.2.840.10008.5.1.4.1.1.7.3',\r\n MultiframeTrueColorSecondaryCaptureImageStorage:\r\n '1.2.840.10008.5.1.4.1.1.7.4',\r\n Sop12LeadECGWaveformStorage: '1.2.840.10008.5.1.4.1.1.9.1.1',\r\n GeneralECGWaveformStorage: '1.2.840.10008.5.1.4.1.1.9.1.2',\r\n AmbulatoryECGWaveformStorage: '1.2.840.10008.5.1.4.1.1.9.1.3',\r\n HemodynamicWaveformStorage: '1.2.840.10008.5.1.4.1.1.9.2.1',\r\n CardiacElectrophysiologyWaveformStorage: '1.2.840.10008.5.1.4.1.1.9.3.1',\r\n BasicVoiceAudioWaveformStorage: '1.2.840.10008.5.1.4.1.1.9.4.1',\r\n GeneralAudioWaveformStorage: '1.2.840.10008.5.1.4.1.1.9.4.2',\r\n ArterialPulseWaveformStorage: '1.2.840.10008.5.1.4.1.1.9.5.1',\r\n RespiratoryWaveformStorage: '1.2.840.10008.5.1.4.1.1.9.6.1',\r\n GrayscaleSoftcopyPresentationStateStorage: '1.2.840.10008.5.1.4.1.1.11.1',\r\n ColorSoftcopyPresentationStateStorage: '1.2.840.10008.5.1.4.1.1.11.2',\r\n PseudoColorSoftcopyPresentationStateStorage: '1.2.840.10008.5.1.4.1.1.11.3',\r\n BlendingSoftcopyPresentationStateStorage: '1.2.840.10008.5.1.4.1.1.11.4',\r\n XAXRFGrayscaleSoftcopyPresentationStateStorage:\r\n '1.2.840.10008.5.1.4.1.1.11.5',\r\n XRayAngiographicImageStorage: '1.2.840.10008.5.1.4.1.1.12.1',\r\n EnhancedXAImageStorage: '1.2.840.10008.5.1.4.1.1.12.1.1',\r\n XRayRadiofluoroscopicImageStorage: '1.2.840.10008.5.1.4.1.1.12.2',\r\n EnhancedXRFImageStorage: '1.2.840.10008.5.1.4.1.1.12.2.1',\r\n XRay3DAngiographicImageStorage: '1.2.840.10008.5.1.4.1.1.13.1.1',\r\n XRay3DCraniofacialImageStorage: '1.2.840.10008.5.1.4.1.1.13.1.2',\r\n BreastTomosynthesisImageStorage: '1.2.840.10008.5.1.4.1.1.13.1.3',\r\n BreastProjectionXRayImageStorageForPresentation:\r\n '1.2.840.10008.5.1.4.1.1.13.1.4',\r\n BreastProjectionXRayImageStorageForProcessing:\r\n '1.2.840.10008.5.1.4.1.1.13.1.5',\r\n IntravascularOpticalCoherenceTomographyImageStorageForPresentation:\r\n '1.2.840.10008.5.1.4.1.1.14.1',\r\n IntravascularOpticalCoherenceTomographyImageStorageForProcessing:\r\n '1.2.840.10008.5.1.4.1.1.14.2',\r\n NuclearMedicineImageStorage: '1.2.840.10008.5.1.4.1.1.20',\r\n RawDataStorage: '1.2.840.10008.5.1.4.1.1.66',\r\n SpatialRegistrationStorage: '1.2.840.10008.5.1.4.1.1.66.1',\r\n SpatialFiducialsStorage: '1.2.840.10008.5.1.4.1.1.66.2',\r\n DeformableSpatialRegistrationStorage: '1.2.840.10008.5.1.4.1.1.66.3',\r\n SegmentationStorage: '1.2.840.10008.5.1.4.1.1.66.4',\r\n SurfaceSegmentationStorage: '1.2.840.10008.5.1.4.1.1.66.5',\r\n RealWorldValueMappingStorage: '1.2.840.10008.5.1.4.1.1.67',\r\n SurfaceScanMeshStorage: '1.2.840.10008.5.1.4.1.1.68.1',\r\n SurfaceScanPointCloudStorage: '1.2.840.10008.5.1.4.1.1.68.2',\r\n VLEndoscopicImageStorage: '1.2.840.10008.5.1.4.1.1.77.1.1',\r\n VideoEndoscopicImageStorage: '1.2.840.10008.5.1.4.1.1.77.1.1.1',\r\n VLMicroscopicImageStorage: '1.2.840.10008.5.1.4.1.1.77.1.2',\r\n VideoMicroscopicImageStorage: '1.2.840.10008.5.1.4.1.1.77.1.2.1',\r\n VLSlideCoordinatesMicroscopicImageStorage: '1.2.840.10008.5.1.4.1.1.77.1.3',\r\n VLPhotographicImageStorage: '1.2.840.10008.5.1.4.1.1.77.1.4',\r\n VideoPhotographicImageStorage: '1.2.840.10008.5.1.4.1.1.77.1.4.1',\r\n OphthalmicPhotography8BitImageStorage: '1.2.840.10008.5.1.4.1.1.77.1.5.1',\r\n OphthalmicPhotography16BitImageStorage: '1.2.840.10008.5.1.4.1.1.77.1.5.2',\r\n StereometricRelationshipStorage: '1.2.840.10008.5.1.4.1.1.77.1.5.3',\r\n OphthalmicTomographyImageStorage: '1.2.840.10008.5.1.4.1.1.77.1.5.4',\r\n VLWholeSlideMicroscopyImageStorage: '1.2.840.10008.5.1.4.1.1.77.1.6',\r\n LensometryMeasurementsStorage: '1.2.840.10008.5.1.4.1.1.78.1',\r\n AutorefractionMeasurementsStorage: '1.2.840.10008.5.1.4.1.1.78.2',\r\n KeratometryMeasurementsStorage: '1.2.840.10008.5.1.4.1.1.78.3',\r\n SubjectiveRefractionMeasurementsStorage: '1.2.840.10008.5.1.4.1.1.78.4',\r\n VisualAcuityMeasurementsStorage: '1.2.840.10008.5.1.4.1.1.78.5',\r\n SpectaclePrescriptionReportStorage: '1.2.840.10008.5.1.4.1.1.78.6',\r\n OphthalmicAxialMeasurementsStorage: '1.2.840.10008.5.1.4.1.1.78.7',\r\n IntraocularLensCalculationsStorage: '1.2.840.10008.5.1.4.1.1.78.8',\r\n MacularGridThicknessandVolumeReport: '1.2.840.10008.5.1.4.1.1.79.1',\r\n OphthalmicVisualFieldStaticPerimetryMeasurementsStorage:\r\n '1.2.840.10008.5.1.4.1.1.80.1',\r\n OphthalmicThicknessMapStorage: '1.2.840.10008.5.1.4.1.1.81.1',\r\n CornealTopographyMapStorage: '1.2.840.10008.5.1.4.1.1.82.1',\r\n BasicTextSR: '1.2.840.10008.5.1.4.1.1.88.11',\r\n EnhancedSR: '1.2.840.10008.5.1.4.1.1.88.22',\r\n ComprehensiveSR: '1.2.840.10008.5.1.4.1.1.88.33',\r\n Comprehensive3DSR: '1.2.840.10008.5.1.4.1.1.88.34',\r\n ProcedureLog: '1.2.840.10008.5.1.4.1.1.88.40',\r\n MammographyCADSR: '1.2.840.10008.5.1.4.1.1.88.50',\r\n KeyObjectSelection: '1.2.840.10008.5.1.4.1.1.88.59',\r\n ChestCADSR: '1.2.840.10008.5.1.4.1.1.88.65',\r\n XRayRadiationDoseSR: '1.2.840.10008.5.1.4.1.1.88.67',\r\n RadiopharmaceuticalRadiationDoseSR: '1.2.840.10008.5.1.4.1.1.88.68',\r\n ColonCADSR: '1.2.840.10008.5.1.4.1.1.88.69',\r\n ImplantationPlanSRDocumentStorage: '1.2.840.10008.5.1.4.1.1.88.70',\r\n EncapsulatedPDFStorage: '1.2.840.10008.5.1.4.1.1.104.1',\r\n EncapsulatedCDAStorage: '1.2.840.10008.5.1.4.1.1.104.2',\r\n PositronEmissionTomographyImageStorage: '1.2.840.10008.5.1.4.1.1.128',\r\n EnhancedPETImageStorage: '1.2.840.10008.5.1.4.1.1.130',\r\n LegacyConvertedEnhancedPETImageStorage: '1.2.840.10008.5.1.4.1.1.128.1',\r\n BasicStructuredDisplayStorage: '1.2.840.10008.5.1.4.1.1.131',\r\n RTImageStorage: '1.2.840.10008.5.1.4.1.1.481.1',\r\n RTDoseStorage: '1.2.840.10008.5.1.4.1.1.481.2',\r\n RTStructureSetStorage: '1.2.840.10008.5.1.4.1.1.481.3',\r\n RTBeamsTreatmentRecordStorage: '1.2.840.10008.5.1.4.1.1.481.4',\r\n RTPlanStorage: '1.2.840.10008.5.1.4.1.1.481.5',\r\n RTBrachyTreatmentRecordStorage: '1.2.840.10008.5.1.4.1.1.481.6',\r\n RTTreatmentSummaryRecordStorage: '1.2.840.10008.5.1.4.1.1.481.7',\r\n RTIonPlanStorage: '1.2.840.10008.5.1.4.1.1.481.8',\r\n RTIonBeamsTreatmentRecordStorage: '1.2.840.10008.5.1.4.1.1.481.9',\r\n RTBeamsDeliveryInstructionStorage: '1.2.840.10008.5.1.4.34.7',\r\n GenericImplantTemplateStorage: '1.2.840.10008.5.1.4.43.1',\r\n ImplantAssemblyTemplateStorage: '1.2.840.10008.5.1.4.44.1',\r\n ImplantTemplateGroupStorage: '1.2.840.10008.5.1.4.45.1'\r\n};\r\n","import validate from 'validate.js';\n\nvalidate.validators.equals = function (value, options, key, attributes) {\n if (options && value !== options.value) {\n return `${key}must equal ${options.value}`;\n }\n};\n\nvalidate.validators.doesNotEqual = function (value, options, key) {\n if (options && value === options.value) {\n return `${key}cannot equal ${options.value}`;\n }\n};\n\nvalidate.validators.contains = function (value, options, key) {\n if (options && value.indexOf && value.indexOf(options.value) === -1) {\n return `${key}must contain ${options.value}`;\n }\n};\n\nvalidate.validators.doesNotContain = function (value, options, key) {\n if (options && value.indexOf && value.indexOf(options.value) !== -1) {\n return `${key}cannot contain ${options.value}`;\n }\n};\n\nvalidate.validators.startsWith = function (value, options, key) {\n if (options && value.startsWith && !value.startsWith(options.value)) {\n return `${key}must start with ${options.value}`;\n }\n};\n\nvalidate.validators.endsWith = function (value, options, key) {\n if (options && value.endsWith && !value.endsWith(options.value)) {\n return `${key}must end with ${options.value}`;\n }\n};\n\nexport {validate};\n","// Define an empty object to store callbacks that are used to retrieve custom attributes\n// The simplest example for a custom attribute is the Timepoint type (i.e. baseline or follow-up)\n// used in the LesionTracker application.\n//\n// Timepoint type can be obtained given a studyId, and this is done through a custom callback.\n// Developers can define attributes (i.e. attributeId = timepointType) with a name ('Timepoint Type')\n// and a callback function that is used to calculate them.\n//\n// The input to the callback, which is called during viewport-image matching rule evaluation\n// is the set of attributes that contains the specified attribute. In our example, timepointType is\n// linked to the study attributes, and so the inputs to the callback is an object containing\n// the study attributes.\nconst CustomAttributeRetrievalCallbacks = {};\n\n/**\n * Adds a custom attribute to be used in the HangingProtocol UI and matching rules, including a\n * callback that will be used to calculate the attribute value.\n *\n * @param attributeId The ID used to refer to the attribute (e.g. 'timepointType')\n * @param attributeName The name of the attribute to be displayed (e.g. 'Timepoint Type')\n * @param callback The function used to calculate the attribute value from the other attributes at its level (e.g. study/series/image)\n */\nfunction addCustomAttribute(attributeId, attributeName, callback) {\n CustomAttributeRetrievalCallbacks[attributeId] = {\n name: attributeName,\n callback\n };\n}\n\nexport {CustomAttributeRetrievalCallbacks, addCustomAttribute};\n","import OHIFError from '../classes/OHIFError';\nimport metadata from '../classes/metadata';\nimport {validate} from './lib/validate';\nimport {CustomAttributeRetrievalCallbacks} from './customAttributes';\n\n/**\n * Import Constants\n */\nconst {InstanceMetadata} = metadata;\n\n/**\n * Match a Metadata instance against rules using Validate.js for validation.\n * @param {InstanceMetadata} metadataInstance Metadata instance object\n * @param {Array} rules Array of MatchingRules instances (StudyMatchingRule|SeriesMatchingRule|ImageMatchingRule) for the match\n * @return {Object} Matching Object with score and details (which rule passed or failed)\n */\nconst match = (metadataInstance, rules) => {\n // Make sure the supplied data is valid.\n if (!(metadataInstance instanceof InstanceMetadata)) {\n throw new OHIFError(\n 'HPMatcher::match metadataInstance must be an instance of InstanceMetadata'\n );\n }\n\n const options = {\n format: 'grouped'\n };\n\n const details = {\n passed: [],\n failed: []\n };\n\n let requiredFailed = false;\n let score = 0;\n\n rules.forEach((rule) => {\n const attribute = rule.attribute;\n\n // Do not use the custom attribute from the metadataInstance since it is subject to change\n if (Object.prototype.hasOwnProperty.call(CustomAttributeRetrievalCallbacks, attribute)) {\n const customAttribute = CustomAttributeRetrievalCallbacks[attribute];\n metadataInstance.setCustomAttribute(\n attribute,\n customAttribute.callback(metadataInstance)\n );\n }\n\n // Format the constraint as required by Validate.js\n const testConstraint = {\n [attribute]: rule.constraint\n };\n\n // Create a single attribute object to be validated, since metadataInstance is an\n // instance of Metadata (StudyMetadata, SeriesMetadata or InstanceMetadata)\n const attributeValue = metadataInstance.customAttributeExists(attribute)\n ? metadataInstance.getCustomAttribute(attribute)\n : metadataInstance.getTagValue(attribute);\n const attributeMap = {\n [attribute]: attributeValue\n };\n\n // Use Validate.js to evaluate the constraints on the specified metadataInstance\n let errorMessages;\n try {\n errorMessages = validate(attributeMap, testConstraint, [options]);\n } catch (e) {\n errorMessages = ['Something went wrong during validation.', e];\n }\n\n if (!errorMessages) {\n // If no errorMessages were returned, then validation passed.\n\n // Add the rule's weight to the total score\n score += parseInt(rule.weight, 10);\n\n // Log that this rule passed in the matching details object\n details.passed.push({\n rule\n });\n } else {\n // If errorMessages were present, then validation failed\n\n // If the rule that failed validation was Required, then\n // mark that a required Rule has failed\n if (rule.required) {\n requiredFailed = true;\n }\n\n // Log that this rule failed in the matching details object\n // and include any error messages\n details.failed.push({\n rule,\n errorMessages\n });\n }\n });\n\n // If a required Rule has failed Validation, set the matching score to zero\n if (requiredFailed) {\n score = 0;\n }\n\n return {\n score,\n details,\n requiredFailed\n };\n};\n\nconst HPMatcher = {\n match\n};\n\nexport {HPMatcher};\n","// Define an empty object to store callbacks that are used to apply custom viewport settings\n// after a viewport is rendered.\nconst CustomViewportSettings = {};\n\n/**\n * Adds a custom setting that can be chosen in the HangingProtocol UI and applied to a Viewport\n *\n * @param settingId The ID used to refer to the setting (e.g. 'displayCADMarkers')\n * @param settingName The name of the setting to be displayed (e.g. 'Display CAD Markers')\n * @param options\n * @param callback A function to be run after a viewport is rendered with a series\n */\nfunction addCustomViewportSetting(settingId, settingName, options, callback) {\n CustomViewportSettings[settingId] = {\n id: settingId,\n text: settingName,\n options,\n callback\n };\n}\n\nexport {CustomViewportSettings, addCustomViewportSetting};\n","const comparators = [\n {\n id: 'equals',\n name: '= (Equals)',\n validator: 'equals',\n validatorOption: 'value',\n description: 'The attribute must equal this value.'\n },\n {\n id: 'doesNotEqual',\n name: '!= (Does not equal)',\n validator: 'doesNotEqual',\n validatorOption: 'value',\n description: 'The attribute must not equal this value.'\n },\n {\n id: 'contains',\n name: 'Contains',\n validator: 'contains',\n validatorOption: 'value',\n description: 'The attribute must contain this value.'\n },\n {\n id: 'doesNotContain',\n name: 'Does not contain',\n validator: 'doesNotContain',\n validatorOption: 'value',\n description: 'The attribute must not contain this value.'\n },\n {\n id: 'startsWith',\n name: 'Starts with',\n validator: 'startsWith',\n validatorOption: 'value',\n description: 'The attribute must start with this value.'\n },\n {\n id: 'endsWith',\n name: 'Ends with',\n validator: 'endsWith',\n validatorOption: 'value',\n description: 'The attribute must end with this value.'\n },\n {\n id: 'onlyInteger',\n name: 'Only Integers',\n validator: 'numericality',\n validatorOption: 'onlyInteger',\n description: 'Real numbers won\\'t be allowed.'\n },\n {\n id: 'greaterThan',\n name: '> (Greater than)',\n validator: 'numericality',\n validatorOption: 'greaterThan',\n description: 'The attribute has to be greater than this value.'\n },\n {\n id: 'greaterThanOrEqualTo',\n name: '>= (Greater than or equal to)',\n validator: 'numericality',\n validatorOption: 'greaterThanOrEqualTo',\n description: 'The attribute has to be at least this value.'\n },\n {\n id: 'lessThanOrEqualTo',\n name: '<= (Less than or equal to)',\n validator: 'numericality',\n validatorOption: 'lessThanOrEqualTo',\n description: 'The attribute can be this value at the most.'\n },\n {\n id: 'lessThan',\n name: '< (Less than)',\n validator: 'numericality',\n validatorOption: 'lessThan',\n description: 'The attribute has to be less than this value.'\n },\n {\n id: 'odd',\n name: 'Odd',\n validator: 'numericality',\n validatorOption: 'odd',\n description: 'The attribute has to be odd.'\n },\n {\n id: 'even',\n name: 'Even',\n validator: 'numericality',\n validatorOption: 'even',\n description: 'The attribute has to be even.'\n }\n];\n\n// Immutable object\nObject.freeze(comparators);\n\nexport {comparators};\n","import {comparators} from '../lib/comparators';\nimport guid from '../../utils/guid';\n\nconst EQUALS_REGEXP = /^equals$/;\n\n/**\n * This Class represents a Rule to be evaluated given a set of attributes\n * Rules have:\n * - An attribute (e.g. 'SeriesDescription')\n * - A constraint Object, in the form required by Validate.js:\n *\n * rule.constraint = {\n * contains: {\n * value: 'T-1'\n * }\n * };\n *\n * Note: In this example we use the 'contains' Validator, which is a custom Validator defined in Viewerbase\n *\n * - A value for whether or not they are Required to be matched (default: False)\n * - A value for their relative weighting during Protocol or Image matching (default: 1)\n */\nexport default class Rule {\n /**\n * The Constructor for the Class to create a Rule with the bare\n * minimum information\n *\n * @param name The desired name for the Rule\n */\n constructor(attribute, constraint, required, weight) {\n // Create a new UUID for this Rule\n this.id = guid();\n\n // Set the Rule's weight (defaults to 1)\n this.weight = weight || 1;\n\n // If an attribute is specified, assign it\n if (attribute) {\n this.attribute = attribute;\n }\n\n // If a constraint is specified, assign it\n if (constraint) {\n this.constraint = constraint;\n }\n\n // If a value for 'required' is specified, assign it\n if (required === undefined) {\n // If no value was specified, default to False\n this.required = false;\n } else {\n this.required = required;\n }\n\n // Cache for constraint info object\n this._constraintInfo = void 0;\n\n // Cache for validator and value object\n this._validatorAndValue = void 0;\n }\n\n /**\n * Occasionally the Rule class needs to be instantiated from a JavaScript Object.\n * This function fills in a Protocol with the Object data.\n *\n * @param input A Rule as a JavaScript Object, e.g. retrieved from JSON\n */\n fromObject(input) {\n // Check if the input already has an ID\n // If so, keep it. It not, create a new UUID\n this.id = input.id || guid();\n\n // Assign the specified input data to the Rule\n this.required = input.required;\n this.weight = input.weight;\n this.attribute = input.attribute;\n this.constraint = input.constraint;\n }\n\n /**\n * Get the constraint info object for the current constraint\n * @return {Object\\undefined} Constraint object or undefined if current constraint\n * is not valid or not found in comparators list\n */\n getConstraintInfo() {\n let constraintInfo = this._constraintInfo;\n // Check if info is cached already\n if (constraintInfo !== void 0) {\n return constraintInfo;\n }\n\n const ruleConstraint = Object.keys(this.constraint)[0];\n\n if (ruleConstraint !== void 0) {\n constraintInfo = comparators.find(\n (comparator) => ruleConstraint === comparator.id\n );\n }\n\n // Cache this information for later use\n this._constraintInfo = constraintInfo;\n\n return constraintInfo;\n }\n\n /**\n * Check if current rule is related to priors\n * @return {Boolean} True if a rule is related to priors or false otherwise\n */\n isRuleForPrior() {\n // @TODO: Should we check this too? this.attribute === 'relativeTime'\n return this.attribute === 'abstractPriorValue';\n }\n\n /**\n * If the current rule is a rule for priors, returns the number of referenced priors. Otherwise, returns -1.\n * @return {Number} The number of referenced priors or -1 if not applicable. Returns zero if the actual value could not be determined.\n */\n getNumberOfPriorsReferenced() {\n if (!this.isRuleForPrior()) {\n return -1;\n }\n\n // Get rule's validator and value\n const ruleValidatorAndValue = this.getConstraintValidatorAndValue();\n const {value, validator} = ruleValidatorAndValue;\n const intValue = parseInt(value, 10) || 0; // avoid possible NaN\n\n // \"Equal to\" validators\n if (EQUALS_REGEXP.test(validator)) {\n // In this case, -1 (the oldest prior) indicates that at least one study is used\n return intValue < 0 ? 1 : intValue;\n }\n\n // Default cases return value\n return 0;\n }\n\n /**\n * Get the constraint validator and value\n * @return {Object|undefined} Returns an object containing the validator and it's value or undefined\n */\n getConstraintValidatorAndValue() {\n let validatorAndValue = this._validatorAndValue;\n\n // Check if validator and value are cached already\n if (validatorAndValue !== void 0) {\n return validatorAndValue;\n }\n\n // Get the constraint info object\n const constraintInfo = this.getConstraintInfo();\n\n // Constraint info object exists and is valid\n if (constraintInfo !== void 0) {\n const validator = constraintInfo.validator;\n const currentValidator = this.constraint[validator];\n\n if (currentValidator) {\n const constraintValidator = constraintInfo.validatorOption;\n const constraintValue = currentValidator[constraintValidator];\n\n validatorAndValue = {\n value: constraintValue,\n validator: constraintInfo.id\n };\n\n this._validatorAndValue = validatorAndValue;\n }\n }\n\n return validatorAndValue;\n }\n}\n","import Rule from './Rule';\n\n/**\n * The ProtocolMatchingRule Class extends the Rule Class.\n *\n * At present it does not add any new methods or attributes\n * @type {ProtocolMatchingRule}\n */\nclass ProtocolMatchingRule extends Rule {}\n\n/**\n * The StudyMatchingRule Class extends the Rule Class.\n *\n * At present it does not add any new methods or attributes\n * @type {StudyMatchingRule}\n */\nclass StudyMatchingRule extends Rule {}\n\n/**\n * The SeriesMatchingRule Class extends the Rule Class.\n *\n * At present it does not add any new methods or attributes\n * @type {SeriesMatchingRule}\n */\nclass SeriesMatchingRule extends Rule {}\n\n/**\n * The ImageMatchingRule class extends the Rule Class.\n *\n * At present it does not add any new methods or attributes\n * @type {ImageMatchingRule}\n */\nclass ImageMatchingRule extends Rule {}\n\nexport {\n ProtocolMatchingRule,\n StudyMatchingRule,\n SeriesMatchingRule,\n ImageMatchingRule\n};\n","/**\n * Removes the first instance of an element from an array, if an equal value exists\n *\n * @param array\n * @param input\n *\n * @returns {boolean} Whether or not the element was found and removed\n */\nconst removeFromArray = (array, input) => {\n // If the array is empty, stop here\n if (!array || !array.length) {\n return false;\n }\n\n let indexToRemove;\n array.forEach((value, index) => {\n // TODO: Double check whether or not this deep equality check is necessary\n // if (_.isEqual(value, input)) {\n if (value === input) {\n indexToRemove = index;\n return false;\n }\n });\n\n if (!indexToRemove) {\n return false;\n }\n\n array.splice(indexToRemove, 1);\n return true;\n};\n\nexport {removeFromArray};\n","/**\n * The ViewportStructure class represents the layout and layout properties that\n * Viewports are displayed in. ViewportStructure has a type, which corresponds to\n * a layout template, and a set of properties, which depend on the type.\n *\n * @type {ViewportStructure}\n */\nexport default class ViewportStructure {\n constructor(type, properties) {\n this.type = type;\n this.properties = properties;\n }\n\n /**\n * Occasionally the ViewportStructure class needs to be instantiated from a JavaScript Object.\n * This function fills in a ViewportStructure with the Object data.\n *\n * @param input The ViewportStructure as a JavaScript Object, e.g. retrieved from JSON\n */\n fromObject(input) {\n this.type = input.type;\n this.properties = input.properties;\n }\n\n /**\n * Retrieve the layout template name based on the layout type\n *\n * @returns {string}\n */\n getLayoutTemplateName() {\n // Viewport structure can be updated later when we build more complex display layouts\n switch (this.type) {\n case 'grid':\n return 'gridLayout';\n }\n }\n\n /**\n * Retrieve the number of Viewports required for this layout\n * given the layout type and properties\n *\n * @returns {string}\n */\n getNumViewports() {\n // Viewport structure can be updated later when we build more complex display layouts\n switch (this.type) {\n case 'grid':\n // For the typical grid layout, we only need to multiply Rows by Columns to\n // obtain the number of viewports\n return this.properties.Rows * this.properties.Columns;\n }\n }\n}\n","import {\n StudyMatchingRule,\n SeriesMatchingRule,\n ImageMatchingRule\n} from './rules';\nimport {removeFromArray} from '../lib/removeFromArray';\n\n/**\n * This Class defines a Viewport in the Hanging Protocol Stage. A Viewport contains\n * arrays of Rules that are matched in the ProtocolEngine in order to determine which\n * images should be hung.\n *\n * @type {Viewport}\n */\nexport default class Viewport {\n constructor() {\n this.viewportSettings = {};\n this.imageMatchingRules = [];\n this.seriesMatchingRules = [];\n this.studyMatchingRules = [];\n }\n\n /**\n * Occasionally the Viewport class needs to be instantiated from a JavaScript Object.\n * This function fills in a Viewport with the Object data.\n *\n * @param input The Viewport as a JavaScript Object, e.g. retrieved from JSON\n */\n fromObject(input) {\n // If ImageMatchingRules exist, create them from the Object data\n // and add them to the Viewport's imageMatchingRules array\n if (input.imageMatchingRules) {\n input.imageMatchingRules.forEach((ruleObject) => {\n const rule = new ImageMatchingRule();\n rule.fromObject(ruleObject);\n this.imageMatchingRules.push(rule);\n });\n }\n\n // If SeriesMatchingRules exist, create them from the Object data\n // and add them to the Viewport's seriesMatchingRules array\n if (input.seriesMatchingRules) {\n input.seriesMatchingRules.forEach((ruleObject) => {\n const rule = new SeriesMatchingRule();\n rule.fromObject(ruleObject);\n this.seriesMatchingRules.push(rule);\n });\n }\n\n // If StudyMatchingRules exist, create them from the Object data\n // and add them to the Viewport's studyMatchingRules array\n if (input.studyMatchingRules) {\n input.studyMatchingRules.forEach((ruleObject) => {\n const rule = new StudyMatchingRule();\n rule.fromObject(ruleObject);\n this.studyMatchingRules.push(rule);\n });\n }\n\n // If ViewportSettings exist, add them to the current protocol\n if (input.viewportSettings) {\n this.viewportSettings = input.viewportSettings;\n }\n }\n\n /**\n * Finds and removes a rule from whichever array it exists in.\n * It is not required to specify if it exists in studyMatchingRules,\n * seriesMatchingRules, or imageMatchingRules\n *\n * @param rule\n */\n removeRule(rule) {\n let array;\n if (rule instanceof StudyMatchingRule) {\n array = this.studyMatchingRules;\n } else if (rule instanceof SeriesMatchingRule) {\n array = this.seriesMatchingRules;\n } else if (rule instanceof ImageMatchingRule) {\n array = this.imageMatchingRules;\n }\n\n removeFromArray(array, rule);\n }\n}\n","import ViewportStructure from './ViewportStructure';\nimport Viewport from './Viewport';\nimport guid from '../../utils/guid';\n\n/**\n * A Stage is one step in the Display Set Sequence for a Hanging Protocol\n *\n * Stages are defined as a ViewportStructure and an array of Viewports\n *\n * @type {Stage}\n */\nexport default class Stage {\n constructor(ViewportStructure, name) {\n // Create a new UUID for this Stage\n this.id = guid();\n\n // Assign the name and ViewportStructure provided\n this.name = name;\n this.viewportStructure = ViewportStructure;\n\n // Create an empty array for the Viewports\n this.viewports = [];\n\n // Set the created date to Now\n this.createdDate = new Date();\n }\n\n /**\n * Creates a clone of the current Stage with a new name\n *\n * @param name\n * @returns {Stage|*}\n */\n createClone(name) {\n // Create a new JavaScript independent of the current Protocol\n const currentStage = {...this};\n\n // Create a new Stage to return\n const clonedStage = new Stage();\n\n // Assign the desired properties\n currentStage.id = clonedStage.id;\n clonedStage.fromObject(currentStage);\n\n // If we have specified a name, assign it\n if (name) {\n clonedStage.name = name;\n }\n\n // Return the cloned Stage\n return clonedStage;\n }\n\n /**\n * Occasionally the Stage class needs to be instantiated from a JavaScript Object.\n * This function fills in a Protocol with the Object data.\n *\n * @param input A Stage as a JavaScript Object, e.g. retrieved from JSON\n */\n fromObject(input) {\n // Check if the input already has an ID\n // If so, keep it. It not, create a new UUID\n this.id = input.id || guid();\n\n // Assign the input name to the Stage\n this.name = input.name;\n\n // If a ViewportStructure is present in the input, add it from the\n // input data\n this.viewportStructure = new ViewportStructure();\n this.viewportStructure.fromObject(input.viewportStructure);\n\n // If any viewports are present in the input object\n if (input.viewports) {\n input.viewports.forEach((viewportObject) => {\n // Create a new Viewport with their data\n const viewport = new Viewport();\n viewport.fromObject(viewportObject);\n\n // Add it to the viewports array\n this.viewports.push(viewport);\n });\n }\n }\n}\n","import {ProtocolMatchingRule} from './rules';\nimport {removeFromArray} from '../lib/removeFromArray';\nimport Stage from './Stage';\nimport guid from '../../utils/guid';\nimport user from '../../user';\n\n/**\n * This class represents a Hanging Protocol at the highest level\n *\n * @type {Protocol}\n */\nexport default class Protocol {\n /**\n * The Constructor for the Class to create a Protocol with the bare\n * minimum information\n *\n * @param name The desired name for the Protocol\n */\n constructor(name) {\n // Create a new UUID for this Protocol\n this.id = guid();\n\n // Store a value which determines whether or not a Protocol is locked\n // This is probably temporary, since we will eventually have role / user\n // checks for editing. For now we just need it to prevent changes to the\n // default protocols.\n this.locked = false;\n\n // Boolean value to indicate if the protocol has updated priors information\n // it's set in \"updateNumberOfPriorsReferenced\" function\n this.hasUpdatedPriorsInformation = false;\n\n // Apply the desired name\n this.name = name;\n\n // Set the created and modified dates to Now\n this.createdDate = new Date();\n this.modifiedDate = new Date();\n\n // If we are logged in while creating this Protocol,\n // store this information as well\n if (user.userLoggedIn && user.userLoggedIn()) {\n this.createdBy = user.getUserId();\n this.modifiedBy = user.getUserId();\n }\n\n // Create two empty Sets specifying which roles\n // have read and write access to this Protocol\n this.availableTo = new Set();\n this.editableBy = new Set();\n\n // Define empty arrays for the Protocol matching rules\n // and Stages\n this.protocolMatchingRules = [];\n this.stages = [];\n\n // Define auxiliary values for priors\n this.numberOfPriorsReferenced = -1;\n }\n\n getNumberOfPriorsReferenced(skipCache = false) {\n let numberOfPriorsReferenced =\n skipCache !== true ? this.numberOfPriorsReferenced : -1;\n\n // Check if information is cached already\n if (numberOfPriorsReferenced > -1) {\n return numberOfPriorsReferenced;\n }\n\n numberOfPriorsReferenced = 0;\n\n // Search each study matching rule for prior rules\n // Each stage can have many viewports that can have\n // multiple study matching rules.\n this.stages.forEach((stage) => {\n if (!stage.viewports) {\n return;\n }\n\n stage.viewports.forEach((viewport) => {\n if (!viewport.studyMatchingRules) {\n return;\n }\n\n viewport.studyMatchingRules.forEach((rule) => {\n // If the current rule is not a priors rule, it will return -1 then numberOfPriorsReferenced will continue to be 0\n const priorsReferenced = rule.getNumberOfPriorsReferenced();\n if (priorsReferenced > numberOfPriorsReferenced) {\n numberOfPriorsReferenced = priorsReferenced;\n }\n });\n });\n });\n\n this.numberOfPriorsReferenced = numberOfPriorsReferenced;\n\n return numberOfPriorsReferenced;\n }\n\n updateNumberOfPriorsReferenced() {\n this.getNumberOfPriorsReferenced(true);\n }\n\n /**\n * Method to update the modifiedDate when the Protocol\n * has been changed\n */\n protocolWasModified() {\n // If we are logged in while modifying this Protocol,\n // store this information as well\n if (user.userLoggedIn && user.userLoggedIn()) {\n this.modifiedBy = user.getUserId();\n }\n\n // Protocol has been modified, so mark priors information\n // as \"outdated\"\n this.hasUpdatedPriorsInformation = false;\n\n // Update number of priors referenced info\n this.updateNumberOfPriorsReferenced();\n\n // Update the modifiedDate with the current Date/Time\n this.modifiedDate = new Date();\n }\n\n /**\n * Occasionally the Protocol class needs to be instantiated from a JavaScript Object\n * containing the Protocol data. This function fills in a Protocol with the Object\n * data.\n *\n * @param input A Protocol as a JavaScript Object, e.g. retrieved from JSON\n */\n fromObject(input) {\n // Check if the input already has an ID\n // If so, keep it. It not, create a new UUID\n this.id = input.id || guid();\n\n // Assign the input name to the Protocol\n this.name = input.name;\n\n // Retrieve locked status, use !! to make it truthy\n // so that undefined values will be set to false\n this.locked = !!input.locked;\n\n // TODO: Check how to regenerate Set from Object\n // this.availableTo = new Set(input.availableTo);\n // this.editableBy = new Set(input.editableBy);\n\n // If the input contains Protocol matching rules\n if (input.protocolMatchingRules) {\n input.protocolMatchingRules.forEach((ruleObject) => {\n // Create new Rules from the stored data\n const rule = new ProtocolMatchingRule();\n rule.fromObject(ruleObject);\n\n // Add them to the Protocol\n this.protocolMatchingRules.push(rule);\n });\n }\n\n // If the input contains data for various Stages in the\n // display set sequence\n if (input.stages) {\n input.stages.forEach((stageObject) => {\n // Create Stages from the stored data\n const stage = new Stage();\n stage.fromObject(stageObject);\n\n // Add them to the Protocol\n this.stages.push(stage);\n });\n }\n }\n\n /**\n * Creates a clone of the current Protocol with a new name\n *\n * @param name\n * @returns {Protocol|*}\n */\n createClone(name) {\n // Create a new JavaScript independent of the current Protocol\n const currentProtocol = {...this};\n\n // Create a new Protocol to return\n const clonedProtocol = new Protocol();\n\n // Apply the desired properties\n currentProtocol.id = clonedProtocol.id;\n clonedProtocol.fromObject(currentProtocol);\n\n // If we have specified a name, assign it\n if (name) {\n clonedProtocol.name = name;\n }\n\n // Unlock the clone\n clonedProtocol.locked = false;\n\n // Return the cloned Protocol\n return clonedProtocol;\n }\n\n /**\n * Adds a Stage to this Protocol's display set sequence\n *\n * @param stage\n */\n addStage(stage) {\n this.stages.push(stage);\n\n // Update the modifiedDate and User that last\n // modified this Protocol\n this.protocolWasModified();\n }\n\n /**\n * Adds a Rule to this Protocol's array of matching rules\n *\n * @param rule\n */\n addProtocolMatchingRule(rule) {\n this.protocolMatchingRules.push(rule);\n\n // Update the modifiedDate and User that last\n // modified this Protocol\n this.protocolWasModified();\n }\n\n /**\n * Removes a Rule from this Protocol's array of matching rules\n *\n * @param rule\n */\n removeProtocolMatchingRule(rule) {\n const wasRemoved = removeFromArray(this.protocolMatchingRules, rule);\n\n // Update the modifiedDate and User that last\n // modified this Protocol\n if (wasRemoved) {\n this.protocolWasModified();\n }\n }\n}\n","import OHIFError from '../classes/OHIFError';\nimport metadata from '../classes/metadata';\nimport { StudyMetadataSource } from '../classes/StudyMetadataSource';\nimport { isImage } from '../utils/isImage';\nimport { HPMatcher } from './HPMatcher';\nimport { sortByScore } from './lib/sortByScore';\nimport log from '../log';\nimport sortBy from '../utils/sortBy';\nimport { CustomViewportSettings } from './customViewportSettings';\nimport Protocol from './classes/Protocol';\nimport { ProtocolStore } from './protocolStore/classes';\n\n/**\n * Import Constants\n */\nconst { StudyMetadata, InstanceMetadata } = metadata;\n\n// Useful constants\nconst ABSTRACT_PRIOR_VALUE = 'abstractPriorValue';\n\nexport default class ProtocolEngine {\n matchedProtocols = new Map();\n\n matchedProtocolScores = {};\n\n /**\n * Constructor\n * @param {ProtocolStore} protocolStore Protocol Store used to keep track of all hanging protocols\n * @param {Array} studies Array of study metadata\n * @param {Map} priorStudies Map of prior studies\n * @param {Object} studyMetadataSource Instance of StudyMetadataSource (ohif-viewerbase) Object to get study metadata\n * @param {Object} options\n */\n constructor(\n protocolStore,\n studies,\n priorStudies,\n studyMetadataSource,\n options = {}\n ) {\n // -----------\n // Type Validations\n if (!(studyMetadataSource instanceof StudyMetadataSource)) {\n throw new OHIFError(\n 'ProtocolEngine::constructor studyMetadataSource is not an instance of StudyMetadataSource'\n );\n }\n\n if (\n !(studies instanceof Array) &&\n !studies.every((study) => study instanceof StudyMetadata)\n ) {\n throw new OHIFError(\n 'ProtocolEngine::constructor studies is not an array or it\\'s items are not instances of StudyMetadata'\n );\n }\n\n // --------------\n // Initialization\n this.protocolStore = protocolStore;\n this.studies = studies;\n this.priorStudies = priorStudies instanceof Map ? priorStudies : new Map();\n this.studyMetadataSource = studyMetadataSource;\n this.options = options;\n\n // Put protocol engine in a known state\n this.reset();\n\n // Create an array for new stage ids to be stored\n // while editing a stage\n this.newStageIds = [];\n }\n\n /**\n * Resets the ProtocolEngine to the best match\n */\n reset() {\n const protocol = this.getBestProtocolMatch();\n\n this.setHangingProtocol(protocol);\n }\n\n /**\n * Retrieves the current Stage from the current Protocol and stage index\n *\n * @returns {*} The Stage model for the currently displayed Stage\n */\n getCurrentStageModel() {\n return this.protocol.stages[this.stage];\n }\n\n /**\n * Finds the best protocols from Protocol Store, matching each protocol matching rules\n * with the given study. The best protocol are orded by score and returned in an array\n * @param {Object} study StudyMetadata instance object\n * @return {Array} Array of match objects or an empty array if no match was found\n * Each match object has the score of the matching and the matched\n * protocol\n */\n findMatchByStudy(study) {\n log.trace('ProtocolEngine::findMatchByStudy');\n\n const matched = [];\n const studyInstance = study.getFirstInstance();\n\n // Set custom attribute for study metadata\n const numberOfAvailablePriors = this.getNumberOfAvailablePriors(\n study.getObjectID()\n );\n\n this.protocolStore.getProtocol().forEach((protocol) => {\n // Clone the protocol's protocolMatchingRules array\n // We clone it so that we don't accidentally add the\n // numberOfPriorsReferenced rule to the Protocol itself.\n const rules = protocol.protocolMatchingRules.slice();\n if (!rules) {\n return;\n }\n\n // Check if the study has the minimun number of priors used by the protocol.\n const numberOfPriorsReferenced = protocol.getNumberOfPriorsReferenced();\n if (numberOfPriorsReferenced > numberOfAvailablePriors) {\n return;\n }\n\n // Run the matcher and get matching details\n const matchedDetails = HPMatcher.match(studyInstance, rules);\n const score = matchedDetails.score;\n\n // The protocol matched some rule, add it to the matched list\n if (score > 0) {\n matched.push({\n score,\n protocol\n });\n }\n });\n\n // If no matches were found, select the default protocol\n if (!matched.length) {\n const defaultProtocol = this.protocolStore.getProtocol('defaultProtocol');\n\n return [\n {\n score: 1,\n protocol: defaultProtocol\n }\n ];\n }\n\n // Sort the matched list by score\n sortByScore(matched);\n\n log.trace('ProtocolEngine::findMatchByStudy matched', matched);\n\n return matched;\n }\n\n _clearMatchedProtocols() {\n this.matchedProtocols.clear();\n this.matchedProtocolScores = {};\n }\n\n /**\n * Populates the MatchedProtocols Collection by running the matching procedure\n */\n updateProtocolMatches() {\n log.trace('ProtocolEngine::updateProtocolMatches');\n\n // Clear all data currently in matchedProtocols\n this._clearMatchedProtocols();\n\n // For each study, find the matching protocols\n this.studies.forEach((study) => {\n const matched = this.findMatchByStudy(study);\n\n // For each matched protocol, check if it is already in MatchedProtocols\n matched.forEach((matchedDetail) => {\n const protocol = matchedDetail.protocol;\n if (!protocol) {\n return;\n }\n\n // If it is not already in the MatchedProtocols Collection, insert it with its score\n if (!this.matchedProtocols.has(protocol.id)) {\n log.trace(\n 'ProtocolEngine::updateProtocolMatches inserting protocol match',\n matchedDetail\n );\n this.matchedProtocols.set(protocol.id, protocol);\n this.matchedProtocolScores[protocol.id] = matchedDetail.score;\n }\n });\n });\n }\n\n _largestKeyByValue(obj) {\n return Object.keys(obj).reduce((a, b) => (obj[a] > obj[b] ? a : b));\n }\n\n _getHighestScoringProtocol() {\n if (!Object.keys(this.matchedProtocolScores).length) {\n return this.protocolStore.getProtocol('defaultProtocol');\n }\n const highestScoringProtocolId = this._largestKeyByValue(\n this.matchedProtocolScores\n );\n return this.matchedProtocols.get(highestScoringProtocolId);\n }\n\n /**\n * Return the best matched Protocol to the current study or set of studies\n * @returns {*}\n */\n getBestProtocolMatch() {\n // Run the matching to populate matchedProtocols Set and Map\n this.updateProtocolMatches();\n\n // Retrieve the highest scoring Protocol\n const bestMatch = this._getHighestScoringProtocol();\n\n log.trace('ProtocolEngine::getBestProtocolMatch bestMatch', bestMatch);\n\n return bestMatch;\n }\n\n /**\n * Get the number of prior studies supplied in the priorStudies map property.\n *\n * @param {String} studyObjectID The study object ID of the study whose priors are needed\n * @returns {number} The number of available prior studies with the same PatientID\n */\n getNumberOfAvailablePriors(studyObjectID) {\n return this.getAvailableStudyPriors(studyObjectID).length;\n }\n\n /**\n * Get the array of prior studies from a specific study.\n *\n * @param {String} studyObjectID The study object ID of the study whose priors are needed\n * @returns {Array} The array of available priors or an empty array\n */\n getAvailableStudyPriors(studyObjectID) {\n const priors = this.priorStudies.get(studyObjectID);\n\n return priors instanceof Array ? priors : [];\n }\n\n // Match images given a list of Studies and a Viewport's image matching reqs\n matchImages(viewport, viewportIndex) {\n log.trace('ProtocolEngine::matchImages');\n\n const {\n studyMatchingRules,\n seriesMatchingRules,\n imageMatchingRules: instanceMatchingRules\n } = viewport;\n\n const matchingScores = [];\n const currentStudy = this.studies[0]; // @TODO: Should this be: this.studies[this.currentStudy] ???\n const firstInstance = currentStudy.getFirstInstance();\n\n let highestStudyMatchingScore = 0;\n let highestSeriesMatchingScore = 0;\n\n // Set custom attribute for study metadata and it's first instance\n currentStudy.setCustomAttribute(ABSTRACT_PRIOR_VALUE, 0);\n if (firstInstance instanceof InstanceMetadata) {\n firstInstance.setCustomAttribute(ABSTRACT_PRIOR_VALUE, 0);\n }\n\n // Only used if study matching rules has abstract prior values defined...\n let priorStudies;\n\n studyMatchingRules.forEach((rule) => {\n if (rule.attribute === ABSTRACT_PRIOR_VALUE) {\n const validatorType = Object.keys(rule.constraint)[0];\n const validator = Object.keys(rule.constraint[validatorType])[0];\n\n let abstractPriorValue = rule.constraint[validatorType][validator];\n abstractPriorValue = parseInt(abstractPriorValue, 10);\n // TODO: Restrict or clarify validators for abstractPriorValue?\n\n // No need to call it more than once...\n if (!priorStudies) {\n priorStudies = this.getAvailableStudyPriors(\n currentStudy.getObjectID()\n );\n }\n\n // TODO: Revisit this later: What about two studies with the same\n // study date?\n\n let priorStudy;\n if (abstractPriorValue === -1) {\n priorStudy = priorStudies[priorStudies.length - 1];\n } else {\n const studyIndex = Math.max(abstractPriorValue - 1, 0);\n priorStudy = priorStudies[studyIndex];\n }\n\n // Invalid data\n if (!(priorStudy instanceof StudyMetadata)) {\n return;\n }\n\n const priorStudyObjectID = priorStudy.getObjectID();\n\n // Check if study metadata is already in studies list\n if (\n this.studies.find(\n (study) => study.getObjectID() === priorStudyObjectID\n )\n ) {\n return;\n }\n\n // Get study metadata if necessary and load study in the viewer (each viewer should provide it's own load study method)\n this.studyMetadataSource.loadStudy(priorStudy).then(\n (studyMetadata) => {\n // Set the custom attribute abstractPriorValue for the study metadata\n studyMetadata.setCustomAttribute(\n ABSTRACT_PRIOR_VALUE,\n abstractPriorValue\n );\n\n // Also add custom attribute\n const firstInstance = studyMetadata.getFirstInstance();\n if (firstInstance instanceof InstanceMetadata) {\n firstInstance.setCustomAttribute(\n ABSTRACT_PRIOR_VALUE,\n abstractPriorValue\n );\n }\n\n // Insert the new study metadata\n this.studies.push(studyMetadata);\n\n // Update the viewport to refresh layout manager with new study\n this.updateViewports(viewportIndex);\n },\n (error) => {\n log.warn(error);\n throw new OHIFError(\n `ProtocolEngine::matchImages could not get study metadata for the Study with the following ObjectID: ${priorStudyObjectID}`\n );\n }\n );\n }\n // TODO: Add relative Date / time\n });\n\n this.studies.forEach((study) => {\n const studyMatchDetails = HPMatcher.match(\n study.getFirstInstance(),\n studyMatchingRules\n );\n\n // Prevent bestMatch from being updated if the matchDetails' required attribute check has failed\n if (\n studyMatchDetails.requiredFailed === true ||\n studyMatchDetails.score < highestStudyMatchingScore\n ) {\n return;\n }\n\n highestStudyMatchingScore = studyMatchDetails.score;\n\n study.forEachSeries((series) => {\n const seriesMatchDetails = HPMatcher.match(\n series.getFirstInstance(),\n seriesMatchingRules\n );\n\n // Prevent bestMatch from being updated if the matchDetails' required attribute check has failed\n if (\n seriesMatchDetails.requiredFailed === true ||\n seriesMatchDetails.score < highestSeriesMatchingScore\n ) {\n return;\n }\n\n highestSeriesMatchingScore = seriesMatchDetails.score;\n\n series.forEachInstance((instance, index) => {\n // This tests to make sure there is actually image data in this instance\n // TODO: Change this when we add PDF and MPEG support\n // See https://ohiforg.atlassian.net/browse/LT-227\n if (\n !isImage(instance.getTagValue('SOPClassUID')) &&\n !instance.getTagValue('Rows')\n ) {\n return;\n }\n\n const instanceMatchDetails = HPMatcher.match(\n instance,\n instanceMatchingRules\n );\n\n // Prevent bestMatch from being updated if the matchDetails' required attribute check has failed\n if (instanceMatchDetails.requiredFailed === true) {\n return;\n }\n\n const matchDetails = {\n passed: [],\n failed: []\n };\n\n matchDetails.passed = matchDetails.passed.concat(\n instanceMatchDetails.details.passed\n );\n matchDetails.passed = matchDetails.passed.concat(\n seriesMatchDetails.details.passed\n );\n matchDetails.passed = matchDetails.passed.concat(\n studyMatchDetails.details.passed\n );\n\n matchDetails.failed = matchDetails.failed.concat(\n instanceMatchDetails.details.failed\n );\n matchDetails.failed = matchDetails.failed.concat(\n seriesMatchDetails.details.failed\n );\n matchDetails.failed = matchDetails.failed.concat(\n studyMatchDetails.details.failed\n );\n\n const totalMatchScore =\n instanceMatchDetails.score +\n seriesMatchDetails.score +\n studyMatchDetails.score;\n const currentSOPInstanceUID = instance.getSOPInstanceUID();\n\n const imageDetails = {\n StudyInstanceUID: study.getStudyInstanceUID(),\n SeriesInstanceUID: series.getSeriesInstanceUID(),\n SOPInstanceUID: currentSOPInstanceUID,\n currentImageIdIndex: index,\n matchingScore: totalMatchScore,\n matchDetails,\n sortingInfo: {\n score: totalMatchScore,\n study:\n instance.getTagValue('StudyDate') +\n instance.getTagValue('StudyTime'),\n series: parseInt(instance.getTagValue('SeriesNumber')), // TODO: change for seriesDateTime\n instance: parseInt(instance.getTagValue('InstanceNumber')) // TODO: change for acquisitionTime\n }\n };\n\n // Find the displaySet\n const displaySet = study.findDisplaySet((displaySet) =>\n displaySet.images.find(\n (image) => image.getSOPInstanceUID() === currentSOPInstanceUID\n )\n );\n\n // If the instance was found, set the displaySet ID\n if (displaySet) {\n imageDetails.displaySetInstanceUID = displaySet.getUID();\n imageDetails.imageId = instance.getImageId();\n }\n\n matchingScores.push(imageDetails);\n });\n });\n });\n\n // Sort the matchingScores\n const sortingFunction = sortBy(\n {\n name: 'score',\n reverse: true\n },\n {\n name: 'study',\n reverse: true\n },\n {\n name: 'instance'\n },\n {\n name: 'series'\n }\n );\n matchingScores.sort((a, b) =>\n sortingFunction(a.sortingInfo, b.sortingInfo)\n );\n\n const bestMatch = matchingScores[0];\n\n log.trace('ProtocolEngine::matchImages bestMatch', bestMatch);\n\n return {\n bestMatch,\n matchingScores\n };\n }\n\n /**\n * Sets the current layout\n *\n * @param {number} numRows\n * @param {number} numColumns\n */\n setLayout(numRows, numColumns) {\n if (numRows < 1 && numColumns < 1) {\n log.error(`Invalid layout ${numRows} x ${numColumns}`);\n return;\n }\n\n if (typeof this.options.setLayout !== 'function') {\n log.error('Hanging Protocol Engine setLayout callback is not defined');\n return;\n }\n\n const viewports = [];\n const numViewports = numRows * numColumns;\n\n for (let i = 0; i < numViewports; i++) {\n viewports.push({});\n }\n\n this.options.setLayout({ numRows, numColumns, viewports });\n }\n\n /**\n * Rerenders viewports that are part of the current layout manager\n * using the matching rules internal to each viewport.\n *\n * If this function is provided the index of a viewport, only the specified viewport\n * is rerendered.\n *\n * @param viewportIndex\n */\n updateViewports(viewportIndex) {\n log.trace(\n `ProtocolEngine::updateViewports viewportIndex: ${viewportIndex}`\n );\n\n // Make sure we have an active protocol with a non-empty array of display sets\n if (!this.getNumProtocolStages()) {\n return;\n }\n\n // Retrieve the current stage\n const stageModel = this.getCurrentStageModel();\n\n // If the current stage does not fulfill the requirements to be displayed,\n // stop here.\n if (\n !stageModel ||\n !stageModel.viewportStructure ||\n !stageModel.viewports ||\n !stageModel.viewports.length\n ) {\n return;\n }\n\n // Retrieve the layoutTemplate associated with the current display set's viewport structure\n // If no such template name exists, stop here.\n const layoutTemplateName = stageModel.viewportStructure.getLayoutTemplateName();\n if (!layoutTemplateName) {\n return;\n }\n\n // Retrieve the properties associated with the current display set's viewport structure template\n // If no such layout properties exist, stop here.\n const layoutProps = stageModel.viewportStructure.properties;\n if (!layoutProps) {\n return;\n }\n\n // Create an empty array to store the output viewportData\n const viewportData = [];\n\n // Empty the matchDetails associated with the ProtocolEngine.\n // This will be used to store the pass/fail details and score\n // for each of the viewport matching procedures\n this.matchDetails = [];\n\n // Loop through each viewport\n stageModel.viewports.forEach((viewport, viewportIndex) => {\n const details = this.matchImages(viewport, viewportIndex);\n\n this.matchDetails[viewportIndex] = details;\n\n // Convert any YES/NO values into true/false for Cornerstone\n const cornerstoneViewportParams = {};\n\n // Cache viewportSettings keys\n const viewportSettingsKeys = Object.keys(viewport.viewportSettings);\n\n viewportSettingsKeys.forEach((key) => {\n let value = viewport.viewportSettings[key];\n if (value === 'YES') {\n value = true;\n } else if (value === 'NO') {\n value = false;\n }\n\n cornerstoneViewportParams[key] = value;\n });\n\n // imageViewerViewports occasionally needs relevant layout data in order to set\n // the element style of the viewport in question\n const currentViewportData = {\n viewportIndex,\n viewport: cornerstoneViewportParams,\n ...layoutProps\n };\n\n const customSettings = [];\n viewportSettingsKeys.forEach((id) => {\n const setting = CustomViewportSettings[id];\n if (!setting) {\n return;\n }\n\n customSettings.push({\n id,\n value: viewport.viewportSettings[id]\n });\n });\n\n currentViewportData.renderedCallback = (element) => {\n // console.log('renderedCallback for ' + element.id);\n customSettings.forEach((customSetting) => {\n log.trace(\n `ProtocolEngine::currentViewportData.renderedCallback Applying custom setting: ${customSetting.id}`\n );\n log.trace(\n `ProtocolEngine::currentViewportData.renderedCallback with value: ${customSetting.value}`\n );\n\n const setting = CustomViewportSettings[customSetting.id];\n setting.callback(element, customSetting.value);\n });\n };\n\n let currentMatch = details.bestMatch;\n let currentPosition = 1;\n const scoresLength = details.matchingScores.length;\n while (\n currentPosition < scoresLength &&\n viewportData.find((a) => a.imageId === currentMatch.imageId)\n ) {\n currentMatch = details.matchingScores[currentPosition];\n currentPosition++;\n }\n\n if (currentMatch && currentMatch.imageId) {\n currentViewportData.StudyInstanceUID = currentMatch.StudyInstanceUID;\n currentViewportData.SeriesInstanceUID = currentMatch.SeriesInstanceUID;\n currentViewportData.SOPInstanceUID = currentMatch.SOPInstanceUID;\n currentViewportData.currentImageIdIndex =\n currentMatch.currentImageIdIndex;\n currentViewportData.displaySetInstanceUID =\n currentMatch.displaySetInstanceUID;\n currentViewportData.imageId = currentMatch.imageId;\n }\n\n // @TODO Why should we throw an exception when a best match is not found? This was aborting the whole process.\n // if (!currentViewportData.displaySetInstanceUID) {\n // throw new OHIFError('ProtocolEngine::updateViewports No matching display set found?');\n // }\n\n viewportData.push(currentViewportData);\n });\n\n this.setLayout(layoutProps.Rows, layoutProps.Columns);\n\n if (typeof this.options.setViewportSpecificData !== 'function') {\n log.error(\n 'Hanging Protocol Engine setViewportSpecificData callback is not defined'\n );\n return;\n }\n\n // If viewportIndex is defined, then update only that viewport\n if (viewportIndex !== undefined && viewportData[viewportIndex]) {\n this.options.setViewportSpecificData(\n viewportIndex,\n viewportData[viewportIndex]\n );\n return;\n }\n\n // Update all viewports\n viewportData.forEach((viewportSpecificData) => {\n this.options.setViewportSpecificData(\n viewportSpecificData.viewportIndex,\n viewportSpecificData\n );\n });\n }\n\n /**\n * Sets the current Hanging Protocol to the specified Protocol\n * An optional argument can also be used to prevent the updating of the Viewports\n *\n * @param newProtocol\n * @param updateViewports\n */\n setHangingProtocol(newProtocol, updateViewports = true) {\n log.trace('ProtocolEngine::setHangingProtocol newProtocol', newProtocol);\n log.trace(\n `ProtocolEngine::setHangingProtocol updateViewports = ${updateViewports}`\n );\n\n // Reset the array of newStageIds\n this.newStageIds = [];\n\n if (Object.prototype.isPrototypeOf.call(newProtocol, Protocol)) {\n this.protocol = newProtocol;\n } else {\n this.protocol = new Protocol();\n this.protocol.fromObject(newProtocol);\n }\n\n this.stage = 0;\n\n // Update viewports by default\n if (updateViewports) {\n this.updateViewports();\n }\n }\n\n /**\n * Check if the next stage is available\n * @return {Boolean} True if next stage is available or false otherwise\n */\n isNextStageAvailable() {\n const numberOfStages = this.getNumProtocolStages();\n\n return this.stage + 1 < numberOfStages;\n }\n\n /**\n * Check if the previous stage is available\n * @return {Boolean} True if previous stage is available or false otherwise\n */\n isPreviousStageAvailable() {\n return this.stage - 1 >= 0;\n }\n\n /**\n * Changes the current stage to a new stage index in the display set sequence.\n * It checks if the next stage exists.\n *\n * @param {Integer} stageAction An integer value specifying wheater next (1) or previous (-1) stage\n * @return {Boolean} True if new stage has set or false, otherwise\n */\n setCurrentProtocolStage(stageAction) {\n // Check if previous or next stage is available\n if (stageAction === -1 && !this.isPreviousStageAvailable()) {\n return false;\n }\n if (stageAction === 1 && !this.isNextStageAvailable()) {\n return false;\n }\n\n // Sets the new stage\n this.stage += stageAction;\n\n // Log the new stage\n log.trace(`ProtocolEngine::setCurrentProtocolStage stage = ${this.stage}`);\n\n // Since stage has changed, we need to update the viewports\n // and redo matchings\n this.updateViewports();\n\n // Everything went well\n return true;\n }\n\n /**\n * Retrieves the number of Stages in the current Protocol or\n * undefined if no protocol or stages are set\n */\n getNumProtocolStages() {\n if (\n !this.protocol ||\n !this.protocol.stages ||\n !this.protocol.stages.length\n ) {\n return;\n }\n\n return this.protocol.stages.length;\n }\n\n /**\n * Switches to the next protocol stage in the display set sequence\n */\n nextProtocolStage() {\n log.trace('ProtocolEngine::nextProtocolStage');\n\n if (!this.setCurrentProtocolStage(1)) {\n log.trace('ProtocolEngine::nextProtocolStage failed');\n }\n }\n\n /**\n * Switches to the previous protocol stage in the display set sequence\n */\n previousProtocolStage() {\n log.trace('ProtocolEngine::previousProtocolStage');\n\n if (!this.setCurrentProtocolStage(-1)) {\n log.trace('ProtocolEngine::previousProtocolStage failed');\n }\n }\n}\n","// Sorts an array by score\nconst sortByScore = (arr) => {\n arr.sort((a, b) => b.score - a.score);\n};\n\nexport {sortByScore};\n","import Protocol from '../../classes/Protocol';\n\n// The ProtocolStore class allows persisting hanging protocols using different strategies.\n// For example, one strategy stores hanging protocols in the application server while\n// another strategy stores them in a remote machine, but only one strategy can be used at a time.\n\nexport default class ProtocolStore {\n constructor(strategy) {\n this.strategy = strategy;\n }\n\n /**\n * Get a Protocol instance or array of Protocol instances for the given protocol object or array\n * @param {Object|array} protocolObject Protocol plain object or array of Protocol plain objects\n * @return {Protocol|array} Protocol instance or array of Protocol intances for the given protocol object or array\n */\n static getProtocolInstance(protocolObject) {\n let result = protocolObject;\n\n // If result is an array of protocols objects\n if (result instanceof Array) {\n result.forEach((protocol, index) => {\n // Check if protocol is an instance of Protocol\n if (!(protocol instanceof Protocol)) {\n const protocolInstance = new Protocol();\n protocolInstance.fromObject(protocol);\n result[index] = protocolInstance;\n }\n });\n } else if (result !== void 0 && !(result instanceof Protocol)) {\n // Check if result exists and is not an instance of Protocol\n const protocolInstance = new Protocol();\n protocolInstance.fromObject(result);\n result = protocolInstance;\n }\n\n return result;\n }\n\n /**\n * Registers a function to be called when the protocol store is ready to persist hanging protocols\n *\n * NOTE: Strategies should implement this function\n *\n * @param callback The function to be called as a callback\n */\n onReady(callback) {\n this.strategy.onReady(callback);\n }\n\n /**\n * Gets the hanging protocol by protocolId if defined, otherwise all stored hanging protocols\n *\n * NOTE: Strategies should implement this function\n *\n * @param protocolId The protocol ID used to find the hanging protocol\n * @returns {object|array} The hanging protocol by protocolId or array of the stored hanging protocols\n */\n getProtocol(protocolId) {\n const result = this.strategy.getProtocol(protocolId);\n return ProtocolStore.getProtocolInstance(result);\n }\n\n /**\n * Stores the hanging protocol\n *\n * NOTE: Strategies should implement this function\n *\n * @param protocol The hanging protocol to be stored\n */\n addProtocol(protocol) {\n this.strategy.addProtocol(protocol);\n }\n\n /**\n * Updates the hanging protocol by protocolId\n *\n * NOTE: Strategies should implement this function\n *\n * @param protocolId The protocol ID used to find the hanging protocol to update\n * @param protocol The updated hanging protocol\n */\n updateProtocol(protocolId, protocol) {\n this.strategy.updateProtocol(protocolId, protocol);\n }\n\n /**\n * Removes the hanging protocol\n *\n * NOTE: Strategies should implement this function\n *\n * @param protocolId The protocol ID used to remove the hanging protocol\n */\n removeProtocol(protocolId) {\n this.strategy.removeProtocol(protocolId);\n }\n}\n","import Protocol from '../classes/Protocol';\nimport ViewportStructure from '../classes/ViewportStructure';\nimport Viewport from '../classes/Viewport';\nimport Stage from '../classes/Stage';\n\nfunction getDefaultProtocol() {\n const protocol = new Protocol('Default');\n protocol.id = 'defaultProtocol';\n protocol.locked = true;\n\n const oneByOne = new ViewportStructure('grid', {\n Rows: 1,\n Columns: 1\n });\n\n const viewport = new Viewport();\n const first = new Stage(oneByOne, 'oneByOne');\n first.viewports.push(viewport);\n\n protocol.stages.push(first);\n\n return protocol;\n}\n\nconst defaultProtocol = getDefaultProtocol();\n\nexport default defaultProtocol;\n","import ProtocolEngine from './ProtocolEngine';\nimport {ProtocolStore, ProtocolStrategy} from './protocolStore';\nimport {addCustomAttribute} from './customAttributes';\nimport {addCustomViewportSetting} from './customViewportSettings';\n\nconst hangingProtocols = {\n ProtocolEngine,\n ProtocolStore,\n ProtocolStrategy,\n addCustomAttribute,\n addCustomViewportSetting\n};\n\nexport default hangingProtocols;\n","import log from '../../../log';\nimport defaultProtocol from '../defaultProtocol';\n\nexport default class ProtocolStrategy {\n constructor() {\n this.hangingProtocols = new Map();\n this.defaultsAdded = false;\n }\n\n /**\n * Registers a function to be called when the hangingProtocols collection is subscribed\n * The callback is called only one time when the subscription is ready\n *\n * @param callback The function to be called as a callback\n */\n onReady(callback) {\n if (!this.defaultsAdded) {\n log.info('Inserting the default hanging protocol...');\n this.addProtocol(defaultProtocol);\n this.defaultsAdded = true;\n }\n\n callback();\n }\n\n /**\n * Gets the hanging protocol by protocolId if defined, otherwise all stored hanging protocols\n *\n * @param protocolId The protocol ID used to find the hanging protocol\n * @returns {object|array} The hanging protocol by protocolId or array of the stored hanging protocols\n */\n getProtocol(protocolId) {\n // Return the hanging protocol by protocolId if defined\n if (protocolId) {\n return this.hangingProtocols.get(protocolId);\n }\n\n // Otherwise, return all protocols\n return Array.from(this.hangingProtocols.values());\n }\n\n /**\n * Stores the hanging protocol\n *\n * @param protocol The hanging protocol to be stored\n */\n addProtocol(protocol) {\n this.hangingProtocols.set(protocol.id, protocol);\n }\n\n /**\n * Updates the hanging protocol by protocolId\n *\n * @param protocolId The protocol ID used to find the hanging protocol to update\n * @param protocol The updated hanging protocol\n */\n updateProtocol(protocolId, protocol) {\n if (!this.hangingProtocols.has(protocolId)) {\n return;\n }\n\n this.hangingProtocols.set(protocolId, protocol);\n }\n\n /**\n * Removes the hanging protocol\n *\n * @param protocolId The protocol ID used to remove the hanging protocol\n */\n removeProtocol(protocolId) {\n if (!this.hangingProtocols.has(protocolId)) {\n return;\n }\n\n this.hangingProtocols.delete(protocolId);\n }\n}\n","// import Dropdown from './ui/dropdown/class';\n\n/*\n * Defines the base OHIF header object\n */\n// const dropdown = new OHIF.ui.Dropdown();\nconst header = {};\n\nexport default header;\n","// Transforms a shallow object with keys separated by \".\" into a nested object\nfunction getNestedObject(shallowObject) {\n const nestedObject = {};\n for (const key in shallowObject) {\n if (!Object.prototype.hasOwnProperty.call(shallowObject, key)) continue;\n const value = shallowObject[key];\n const propertyArray = key.split('.');\n let currentObject = nestedObject;\n while (propertyArray.length) {\n const currentProperty = propertyArray.shift();\n if (!propertyArray.length) {\n currentObject[currentProperty] = value;\n } else {\n if (!currentObject[currentProperty]) {\n currentObject[currentProperty] = {};\n }\n\n currentObject = currentObject[currentProperty];\n }\n }\n }\n\n return nestedObject;\n}\n\n// Transforms a nested object into a shallowObject merging its keys with \".\" character\nfunction getShallowObject(nestedObject) {\n const shallowObject = {};\n const putValues = (baseKey, nestedObject, resultObject) => {\n for (const key in nestedObject) {\n if (!Object.prototype.hasOwnProperty.call(nestedObject, key)) continue;\n let currentKey = baseKey ? `${baseKey}.${key}` : key;\n const currentValue = nestedObject[key];\n if (typeof currentValue === 'object') {\n if (currentValue instanceof Array) {\n currentKey += '[]';\n }\n\n putValues(currentKey, currentValue, resultObject);\n } else {\n resultObject[currentKey] = currentValue;\n }\n }\n };\n\n putValues('', nestedObject, shallowObject);\n return shallowObject;\n}\n\nconst object = {\n getNestedObject,\n getShallowObject\n};\n\nexport default object;\n","/** Action Creators:\n * https://redux.js.org/basics/actions#action-creators\n */\n\nimport {\n CLEAR_VIEWPORT,\n SET_ACTIVE_SPECIFIC_DATA,\n SET_SERVERS,\n SET_VIEWPORT,\n SET_VIEWPORT_ACTIVE,\n SET_VIEWPORT_LAYOUT,\n SET_VIEWPORT_LAYOUT_AND_DATA,\n SET_USER_PREFERENCES\n} from './constants/ActionTypes';\n\n/**\n * The definition of a viewport layout.\n *\n * @typedef {Object} ViewportLayout\n * @property {number} numRows -\n * @property {number} numColumns -\n * @property {array} viewports -\n */\n\n/**\n * VIEWPORT\n */\nexport const setViewportSpecificData = (\n viewportIndex,\n viewportSpecificData\n) => ({\n type: SET_VIEWPORT,\n viewportIndex,\n viewportSpecificData\n});\n\nexport const setViewportActive = (viewportIndex) => ({\n type: SET_VIEWPORT_ACTIVE,\n viewportIndex\n});\n\n/**\n * @param {ViewportLayout} layout\n */\nexport const setLayout = ({numRows, numColumns, viewports}) => ({\n type: SET_VIEWPORT_LAYOUT,\n numRows,\n numColumns,\n viewports\n});\n\n/**\n * @param {number} layout.numRows\n * @param {number} layout.numColumns\n * @param {array} viewports\n */\nexport const setViewportLayoutAndData = (\n {numRows, numColumns, viewports},\n viewportSpecificData\n) => ({\n type: SET_VIEWPORT_LAYOUT_AND_DATA,\n numRows,\n numColumns,\n viewports,\n viewportSpecificData\n});\n\nexport const clearViewportSpecificData = (viewportIndex) => ({\n type: CLEAR_VIEWPORT,\n viewportIndex\n});\n\nexport const setActiveViewportSpecificData = (viewportSpecificData) => ({\n type: SET_ACTIVE_SPECIFIC_DATA,\n viewportSpecificData\n});\n\n/**\n * NOT-VIEWPORT\n */\nexport const setStudyLoadingProgress = (progressId, progressData) => ({\n type: 'SET_STUDY_LOADING_PROGRESS',\n progressId,\n progressData\n});\n\nexport const clearStudyLoadingProgress = (progressId) => ({\n type: 'CLEAR_STUDY_LOADING_PROGRESS',\n progressId\n});\n\nexport const setUserPreferences = (state) => ({\n type: SET_USER_PREFERENCES,\n state\n});\n\nexport const setExtensionData = (extension, data) => ({\n type: 'SET_EXTENSION_DATA',\n extension,\n data\n});\n\nexport const setTimepoints = (state) => ({\n type: 'SET_TIMEPOINTS',\n state\n});\n\nexport const setMeasurements = (state) => ({\n type: 'SET_MEASUREMENTS',\n state\n});\n\nexport const setStudyData = (StudyInstanceUID, data) => ({\n type: 'SET_STUDY_DATA',\n StudyInstanceUID,\n data\n});\n\nexport const setServers = (servers) => ({\n type: SET_SERVERS,\n servers\n});\n\nconst actions = {\n /**\n * VIEWPORT\n */\n setViewportActive,\n setViewportSpecificData,\n setViewportLayoutAndData,\n setLayout,\n clearViewportSpecificData,\n setActiveViewportSpecificData,\n /**\n * NOT-VIEWPORT\n */\n setStudyLoadingProgress,\n clearStudyLoadingProgress,\n setUserPreferences,\n setExtensionData,\n setTimepoints,\n setMeasurements,\n setStudyData,\n setServers\n};\n\nexport default actions;\n","/**\n * VIEWPORT\n */\nexport const SET_VIEWPORT = 'VIEWPORT::SET';\nexport const SET_VIEWPORT_ACTIVE = 'VIEWPORT::SET_ACTIVE';\nexport const SET_VIEWPORT_LAYOUT = 'VIEWPORT::SET_LAYOUT';\nexport const SET_VIEWPORT_LAYOUT_AND_DATA =\n 'VIEWPORT::SET_VIEWPORT_LAYOUT_AND_DATA';\nexport const CLEAR_VIEWPORT = 'VIEWPORT::CLEAR';\nexport const SET_SPECIFIC_DATA = 'VIEWPORT::SET_SPECIFIC_DATA';\nexport const SET_ACTIVE_SPECIFIC_DATA = 'VIEWPORT::SET_ACTIVE_SPECIFIC_DATA';\n\n/**\n * SERVERS\n */\nexport const ADD_SERVER = 'ADD_SERVER';\nexport const SET_SERVERS = 'SET_SERVERS';\n\n/**\n * EXTENSIONS\n */\nexport const SET_EXTENSION_DATA = 'SET_EXTENSION_DATA';\n\n/**\n * PREFERENCES\n * */\nexport const SET_USER_PREFERENCES = 'SET_USER_PREFERENCES';\n","export const defaultState = {};\n\nconst extensions = (state = defaultState, action) => {\n switch (action.type) {\n case 'SET_EXTENSION_DATA':\n const extensionName = action.extension;\n const currentData = state[extensionName] || {};\n\n const incomingData = action.data;\n\n const extension = {\n [extensionName]: {\n ...currentData,\n ...incomingData\n }\n };\n\n return {...state, ...extension};\n\n default:\n return state;\n }\n};\n\nexport default extensions;\n","import { cloneDeep } from 'lodash';\n\nconst defaultState = {\n progress: {},\n lastUpdated: null\n};\n\nconst loading = (state = defaultState, action) => {\n let progress;\n let lastUpdated;\n switch (action.type) {\n case 'SET_STUDY_LOADING_PROGRESS':\n progress = cloneDeep(state).progress;\n progress[action.progressId] = action.progressData;\n\n // This is a workaround so we can easily identify changes\n // to the progress object without doing deep comparison.\n lastUpdated = new Date().getTime();\n\n return {...state, progress, lastUpdated};\n case 'CLEAR_STUDY_LOADING_PROGRESS':\n progress = cloneDeep(state).progress;\n delete progress[action.progressId];\n\n lastUpdated = new Date().getTime();\n\n return {...state, progress, lastUpdated};\n default:\n return state;\n }\n};\n\nexport default loading;\n","const defaultState = {\n windowLevelData: {\n 1: {description: 'Soft tissue', window: '550', level: '40'},\n 2: {description: 'Lung', window: '150', level: '-600'},\n 3: {description: 'Liver', window: '150', level: '90'},\n 4: {description: 'Bone', window: '2500', level: '480'},\n 5: {description: 'Brain', window: '80', level: '40'},\n 6: {description: 'Trest', window: '1', level: '1'},\n 7: {description: '', window: '', level: ''},\n 8: {description: '', window: '', level: ''},\n 9: {description: '', window: '', level: ''},\n 10: {description: '', window: '', level: ''}\n },\n generalPreferences: {\n // language: 'en-US'\n }\n};\n\nconst preferences = (state = defaultState, action) => {\n switch (action.type) {\n case 'SET_USER_PREFERENCES': {\n return {...state, ...action.state};\n }\n default:\n return state;\n }\n};\n\nexport {defaultState};\nexport default preferences;\n","import { uniqBy } from 'lodash';\n\nexport const defaultState = {\n servers: []\n};\n\nconst servers = (state = defaultState, action) => {\n switch (action.type) {\n case 'ADD_SERVER':\n const servers = uniqBy([...state.servers, action.server], 'id');\n servers.forEach((s) => (s.active = true));\n return {...state, servers};\n\n case 'ACTIVATE_SERVER': {\n const newServer = {...action.server, active: true};\n const newServers = state.servers;\n newServers.forEach((s) => (s.active = false));\n return {\n ...state,\n servers: uniqBy([...newServers, newServer], 'wadoRoot')\n };\n }\n\n case 'SET_SERVERS':\n return {...state, servers: action.servers};\n\n default:\n return state;\n }\n};\n\nexport default servers;\n","import { cloneDeep } from 'lodash';\n\nconst defaultState = {\n studyData: {}\n};\n\nconst servers = (state = defaultState, action) => {\n switch (action.type) {\n case 'SET_STUDY_DATA':\n const updatedStudyData = cloneDeep(state).studyData;\n updatedStudyData[action.StudyInstanceUID] = action.data;\n\n return {...state, studyData: updatedStudyData};\n default:\n return state;\n }\n};\n\nexport default servers;\n","const defaultState = {\n timepoints: [],\n measurements: []\n};\n\nconst timepointManager = (state = defaultState, action) => {\n switch (action.type) {\n case 'SET_TIMEPOINTS':\n return {...state, timepoints: action.state};\n case 'SET_MEASUREMENTS':\n return {...state, measurements: action.state};\n default:\n return state;\n }\n};\n\nexport default timepointManager;\n","import { cloneDeep } from 'lodash';\nimport { merge } from 'lodash';\n\nimport {\n CLEAR_VIEWPORT,\n SET_ACTIVE_SPECIFIC_DATA,\n SET_SPECIFIC_DATA,\n SET_VIEWPORT,\n SET_VIEWPORT_ACTIVE,\n SET_VIEWPORT_LAYOUT,\n SET_VIEWPORT_LAYOUT_AND_DATA\n} from '../constants/ActionTypes';\n\nexport const DEFAULT_STATE = {\n numRows: 1,\n numColumns: 1,\n activeViewportIndex: 0,\n layout: {\n viewports: [{}]\n },\n viewportSpecificData: {}\n};\n\n/**\n * Take the new number of Rows and Columns, delete all not used viewport data and also set\n * active viewport as default in case current one is not available anymore.\n *\n * @param {Number} numRows\n * @param {Number} numColumns\n * @param {Object} currentViewportSpecificData\n * @returns\n */\nconst findActiveViewportSpecificData = (\n numRows,\n numColumns,\n currentViewportSpecificData = {}\n) => {\n const numberOfViewports = numRows * numColumns;\n const viewportSpecificData = cloneDeep(currentViewportSpecificData);\n\n if (numberOfViewports < Object.keys(viewportSpecificData).length) {\n Object.keys(viewportSpecificData).forEach((key) => {\n if (key > numberOfViewports - 1) {\n delete viewportSpecificData[key];\n }\n });\n }\n\n return viewportSpecificData;\n};\n/**\n * Take new number of Rows and Columns and make sure the current active viewport index is still available, if not, return the default\n *\n * @param {Number} numRows\n * @param {Number} numColumns\n * @param {Number} currentActiveViewportIndex\n * @returns\n */\nconst getActiveViewportIndex = (\n numRows,\n numColumns,\n currentActiveViewportIndex\n) => {\n const numberOfViewports = numRows * numColumns;\n\n return currentActiveViewportIndex > numberOfViewports - 1\n ? DEFAULT_STATE.activeViewportIndex\n : currentActiveViewportIndex;\n};\n\n/**\n * The definition of a viewport action.\n *\n * @typedef {Object} ViewportAction\n * @property {string} type -\n * @property {Object} data -\n * @property {Object} layout -\n * @property {number} viewportIndex -\n * @property {Object} viewportSpecificData -\n */\n\n/**\n * @param {Object} [state=DEFAULT_STATE] The current viewport state.\n * @param {ViewportAction} action A viewport action.\n */\nconst viewports = (state = DEFAULT_STATE, action) => {\n let useActiveViewport = false;\n\n switch (action.type) {\n /**\n * Sets the active viewport index.\n *\n * @return {Object} New state.\n */\n case SET_VIEWPORT_ACTIVE: {\n const activeViewportIndex = getActiveViewportIndex(\n state.numRows,\n state.numColumns,\n action.viewportIndex\n );\n return {...state, activeViewportIndex};\n }\n\n /**\n * Sets viewport layout.\n *\n * @return {Object} New state.\n */\n case SET_VIEWPORT_LAYOUT: {\n const {numRows, numColumns} = action;\n const viewportSpecificData = findActiveViewportSpecificData(\n numRows,\n numColumns,\n state.viewportSpecificData\n );\n const activeViewportIndex = getActiveViewportIndex(\n numRows,\n numColumns,\n state.activeViewportIndex\n );\n\n return {\n ...state,\n numRows: action.numRows,\n numColumns: action.numColumns,\n layout: {viewports: [...action.viewports]},\n viewportSpecificData,\n activeViewportIndex\n };\n }\n\n /**\n * Sets viewport layout and data.\n *\n * @return {Object} New state.\n */\n case SET_VIEWPORT_LAYOUT_AND_DATA: {\n const {numRows, numColumns} = action;\n const viewportSpecificData = findActiveViewportSpecificData(\n numRows,\n numColumns,\n action.viewportSpecificData\n );\n const activeViewportIndex = getActiveViewportIndex(\n numRows,\n numColumns,\n state.activeViewportIndex\n );\n\n return {\n ...state,\n numRows: action.numRows,\n numColumns: action.numColumns,\n layout: {viewports: [...action.viewports]},\n viewportSpecificData,\n activeViewportIndex\n };\n }\n\n /**\n * Sets viewport specific data of active viewport.\n *\n * @return {Object} New state.\n */\n case SET_VIEWPORT: {\n const layout = cloneDeep(state.layout);\n\n const viewportSpecificData = cloneDeep(state.viewportSpecificData);\n viewportSpecificData[action.viewportIndex] = merge(\n {},\n viewportSpecificData[action.viewportIndex],\n action.viewportSpecificData\n );\n\n if (action.viewportSpecificData && action.viewportSpecificData.plugin && !layout.viewports[action.viewportIndex].plugin) {\n layout.viewports[action.viewportIndex].plugin =\n action.viewportSpecificData.plugin;\n }\n\n return {...state, layout, viewportSpecificData};\n }\n\n /**\n * Sets viewport specific data of active/any viewport.\n *\n * @return {Object} New state.\n */\n case SET_ACTIVE_SPECIFIC_DATA:\n useActiveViewport = true;\n // Allow fall-through\n // eslint-disable-next-line\n case SET_SPECIFIC_DATA: {\n const layout = cloneDeep(state.layout);\n const viewportIndex = useActiveViewport\n ? state.activeViewportIndex\n : action.viewportIndex;\n\n const viewportSpecificData = cloneDeep(state.viewportSpecificData);\n viewportSpecificData[viewportIndex] = {\n ...action.viewportSpecificData\n };\n\n if (action.viewportSpecificData && action.viewportSpecificData.plugin) {\n layout.viewports[viewportIndex].plugin =\n action.viewportSpecificData.plugin;\n }\n\n return {...state, layout, viewportSpecificData};\n }\n\n /**\n * Clears viewport specific data of any viewport.\n *\n * @return {Object} New state.\n */\n case CLEAR_VIEWPORT: {\n const viewportSpecificData = cloneDeep(state.viewportSpecificData);\n\n if (action.viewportIndex) {\n viewportSpecificData[action.viewportIndex] = {};\n return {...state, viewportSpecificData};\n }\n return DEFAULT_STATE;\n }\n\n /**\n * Returns the current application state.\n *\n * @return {Object} The current state.\n */\n default: {\n return state;\n }\n }\n};\n\nexport default viewports;\n","import actions from './actions';\nimport reducers from './reducers';\n\nconst redux = {\n reducers,\n actions\n};\n\nexport default redux;\n","import extensions from './extensions';\nimport loading from './loading';\nimport preferences from './preferences';\nimport servers from './servers';\nimport studies from './studies';\nimport timepointManager from './timepointManager';\nimport viewports from './viewports';\n\nconst reducers = {\n extensions,\n loading,\n preferences,\n servers,\n studies,\n timepointManager,\n viewports\n};\n\nexport default reducers;\n","// TODO: This is duplicated in TypeSafeCollection\nfunction isObject(subject) {\n return (\n subject instanceof Object ||\n (typeof subject === 'object' && subject !== null)\n );\n}\n\n// TODO: This is duplicated in TypeSafeCollection\nfunction isString(subject) {\n return typeof subject === 'string';\n}\n\n// Search for some string inside any object or array\nfunction search(object, query, property = null, result = []) {\n // Create the search pattern\n const pattern = new RegExp(query.trim(), 'i');\n\n Object.keys(object).forEach((key) => {\n const item = object[key];\n\n // Stop here if item is empty\n if (!item) {\n return;\n }\n\n // Get the value to be compared\n const value = isString(property) ? item[property] : item;\n\n // Check if the value match the pattern\n if (isString(value) && pattern.test(value)) {\n // Add the current item to the result\n result.push(item);\n }\n\n if (isObject(item)) {\n // Search recursively the item if the current item is an object\n search(item, query, property, result);\n }\n });\n\n // Return the found items\n return result;\n}\n\n// Encode any string into a safe format for HTML id attribute\nfunction encodeId(input) {\n const string = input && input.toString ? input.toString() : input;\n\n // Return an underscore if the given string is empty or if it's not a string\n if (string === '' || typeof string !== 'string') {\n return '_';\n }\n\n // Create a converter to replace non accepted chars\n const converter = (match) => `_${match[0].charCodeAt(0).toString(16)}_`;\n\n // Encode the given string and return it\n return string.replace(/[^a-zA-Z0-9-]/g, converter);\n}\n\nconst string = {\n search,\n encodeId\n};\n\nexport default string;\n","import handleError from './handleError';\nimport isCharacterKeyPress from './isCharacterKeyPress';\nimport getOffset from './getOffset';\nimport getScrollbarSize from './getScrollbarSize';\n\nconst ui = {\n getScrollbarSize,\n getOffset,\n isCharacterKeyPress,\n handleError\n};\n\nexport default ui;\n","/**\n * Get the vertical and horizontal scrollbar sizes\n * Got from https://stackoverflow.com/questions/986937/how-can-i-get-the-browsers-scrollbar-sizes\n *\n * @returns {Array} Array containing the scrollbar horizontal and vertical sizes\n */\nexport default function getScrollbarSize() {\n const inner = document.createElement('p');\n inner.style.width = '100%';\n inner.style.height = '100%';\n\n const outer = document.createElement('div');\n outer.style.position = 'absolute';\n outer.style.top = '0px';\n outer.style.left = '0px';\n outer.style.visibility = 'hidden';\n outer.style.width = '100px';\n outer.style.height = '100px';\n outer.style.overflow = 'hidden';\n outer.appendChild(inner);\n\n document.body.appendChild(outer);\n\n const w1 = inner.offsetWidth;\n const h1 = inner.offsetHeight;\n outer.style.overflow = 'scroll';\n let w2 = inner.offsetWidth;\n let h2 = inner.offsetHeight;\n\n if (w1 === w2) {\n w2 = outer.clientWidth;\n }\n\n if (h1 === h2) {\n h2 = outer.clientHeight;\n }\n\n document.body.removeChild(outer);\n\n return [w1 - w2, h1 - h2];\n}\n","/**\n * Get the offset for the given element\n *\n * @param {Object} element DOM element which will have the offser calculated\n * @returns {Object} Object containing the top and left offset\n */\nexport default function getOffset(element) {\n let top = 0;\n let left = 0;\n if (element.offsetParent) {\n do {\n left += element.offsetLeft;\n top += element.offsetTop;\n } while ((element = element.offsetParent));\n }\n\n return {\n left,\n top\n };\n}\n","/**\n * Check if the pressed key combination will result in a character input\n * Got from https://stackoverflow.com/questions/4179708/how-to-detect-if-the-pressed-key-will-produce-a-character-inside-an-input-text\n *\n * @returns {Boolean} Whether the pressed key combination will input a character or not\n */\nexport default function isCharacterKeyPress(event) {\n if (typeof event.which === 'undefined') {\n // This is IE, which only fires keypress events for printable keys\n return true;\n } if (typeof event.which === 'number' && event.which > 0) {\n // In other browsers except old versions of WebKit, event.which is\n // only greater than zero if the keypress is a printable key.\n // We need to filter out backspace and ctrl/alt/meta key combinations\n return (\n !event.ctrlKey && !event.metaKey && !event.altKey && event.which !== 8\n );\n }\n\n return false;\n}\n","import log from '../log';\n\nexport default function handleError(error) {\n let {title, message} = error;\n\n if (!title) {\n if (error instanceof Error) {\n title = error.name;\n }\n }\n\n if (!message) {\n if (error instanceof Error) {\n message = error.message;\n }\n }\n\n const data = {\n title,\n message,\n class: 'themed',\n hideConfirm: true,\n cancelLabel: 'Dismiss',\n cancelClass: 'btn-secondary',\n ...error || {}\n };\n\n log.error(error);\n // TODO: Find a better way to handle errors instead of displaying a dialog for all of them.\n // OHIF.ui.showDialog('dialogForm', data);\n}\n","import './lib';\n\nimport {ExtensionManager, MODULE_TYPES} from './extensions';\nimport {ServicesManager,\n UINotificationService,\n UIModalService,\n UIDialogService,\n MeasurementService\n} from './services';\nimport classes, {CommandsManager, HotkeysManager} from './classes';\n\nimport DICOMWeb from './DICOMWeb';\nimport DICOMSR from './DICOMSR';\nimport cornerstone from './cornerstone';\nimport hangingProtocols from './hanging-protocols';\nimport header from './header';\nimport log from './log';\nimport measurements from './measurements';\nimport metadata from './classes/metadata';\nimport object from './object';\nimport redux from './redux';\nimport string from './string';\nimport studies from './studies';\nimport ui from './ui';\nimport user from './user';\nimport utils, {hotkeys} from './utils';\n\nconst ViewerCore = {\n MODULE_TYPES,\n //\n CommandsManager,\n ExtensionManager,\n HotkeysManager,\n ServicesManager,\n //\n utils,\n hotkeys,\n studies,\n redux,\n classes,\n metadata,\n header,\n cornerstone,\n string,\n ui,\n user,\n object,\n log,\n DICOMWeb,\n DICOMSR,\n viewer: {},\n measurements,\n hangingProtocols,\n //\n UINotificationService,\n UIModalService,\n UIDialogService,\n MeasurementService\n};\n\nexport {\n MODULE_TYPES,\n //\n CommandsManager,\n ExtensionManager,\n HotkeysManager,\n ServicesManager,\n //\n utils,\n hotkeys,\n studies,\n redux,\n classes,\n metadata,\n header,\n cornerstone,\n string,\n ui,\n user,\n object,\n log,\n DICOMWeb,\n DICOMSR,\n measurements,\n hangingProtocols,\n //\n UINotificationService,\n UIModalService,\n UIDialogService,\n MeasurementService\n};\n\nexport {ViewerCore};\n\nexport default ViewerCore;\n","module.exports = __WEBPACK_EXTERNAL_MODULE__275__;"],"sourceRoot":""} \ No newline at end of file diff --git a/package.json b/package.json index 59d0ecb..4b290e8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "viewer-core", - "version": "1.1.4", + "version": "1.1.5", "description": "Generic business logic for web-based medical imaging applications - edited by Tung LT", "author": "OHIF Core Team", "editor": "Tung LT", diff --git a/src/classes/MetadataProvider.js b/src/classes/MetadataProvider.js index 9fdb937..12bab99 100644 --- a/src/classes/MetadataProvider.js +++ b/src/classes/MetadataProvider.js @@ -62,9 +62,11 @@ class MetadataProvider { Object.assign(instance, naturalizedDataset); // TODO: comment by TungLT - // if (options.server) { - // await this._checkBulkDataAndInlineBinaries(instance, options.server); - // } + // Mod by Triet + // uncomment to enable image overlay + if (options.server) { + await this._checkBulkDataAndInlineBinaries(instance, options.server); + } return instance; } @@ -336,8 +338,7 @@ class MetadataProvider { break; case WADO_IMAGE_LOADER_TAGS.OVERLAY_PLANE_MODULE: - metadata = {}; - + const overlays = []; for ( let overlayGroup = 0x00; overlayGroup <= 0x1e; @@ -367,7 +368,7 @@ class MetadataProvider { const ROIStandardDeviationTag = `${groupStr}1303`; const OverlayOrigin = instance[OverlayOriginTag]; - metadata.overlay = { + const overlay = { rows: instance[OverlayRowsTag], columns: instance[OverlayColumnsTag], type: instance[OverlayType], @@ -378,10 +379,16 @@ class MetadataProvider { label: instance[OverlayLabelTag], roiArea: instance[ROIAreaTag], roiMean: instance[ROIMeanTag], - roiStandardDeviation: instance[ROIStandardDeviationTag] + roiStandardDeviation: instance[ROIStandardDeviationTag], }; + + overlays.push(overlay); } + metadata = { + overlays + }; + break; case WADO_IMAGE_LOADER_TAGS.PATIENT_MODULE: diff --git a/src/classes/metadata/StudyMetadata.js b/src/classes/metadata/StudyMetadata.js index d4497e1..29c906c 100644 --- a/src/classes/metadata/StudyMetadata.js +++ b/src/classes/metadata/StudyMetadata.js @@ -151,10 +151,12 @@ export class StudyMetadata extends Metadata { const stackableInstances = []; series.forEachInstance((instance) => { // All imaging modalities must have a valid value for SOPClassUID (x00080016) or Rows (x00280010) - if (!isImage(instance.getTagValue('SOPClassUID')) && !instance.getTagValue('Rows')) { - return; - } - + // Mod by Triet + // Disable isImage checking to support showing HTML series + // if (!isImage(instance.getTagValue('SOPClassUID')) && !instance.getTagValue('Rows')) { + // return; + // } + let displaySet; if (isMultiFrame(instance)) { @@ -283,7 +285,6 @@ export class StudyMetadata extends Metadata { displaySets.push(...displaySetsForSeries); }); - return sortDisplaySetList(displaySets); } diff --git a/src/utils/metadataProvider/fetchOverlayData.js b/src/utils/metadataProvider/fetchOverlayData.js index e97b0f8..e5ad533 100644 --- a/src/utils/metadataProvider/fetchOverlayData.js +++ b/src/utils/metadataProvider/fetchOverlayData.js @@ -49,8 +49,9 @@ export default async function fetchOverlayData(instance, server) { async function _getOverlayData(tag, server) { const {BulkDataURI} = tag; - let uri = BulkDataURI; - + let uri = BulkDataURI.slice(BulkDataURI.indexOf('/studies'), BulkDataURI.length); + // replace BulkDataURI with correct host + // TODO: Workaround for dcm4chee behind SSL-terminating proxy returning // incorrect bulk data URIs if (server.wadoRoot.indexOf('https') === 0 && !uri.includes('https')) { @@ -63,7 +64,7 @@ async function _getOverlayData(tag, server) { }; const dicomWeb = new api.DICOMwebClient(config); const options = { - BulkDataURI: uri + BulkDataURI: `${server.wadoRoot}${uri}` }; return dicomWeb