
/* /web/static/lib/Chart/Chart.js */
(function(global,factory){typeof exports==='object'&&typeof module!=='undefined'?module.exports=factory():typeof define==='function'&&define.amd?define(factory):(global=typeof globalThis!=='undefined'?globalThis:global||self,global.Chart=factory());})(this,(function(){'use strict';var plugins=Object.freeze({__proto__:null,get Colors(){return plugin_colors;},get Decimation(){return plugin_decimation;},get Filler(){return index;},get Legend(){return plugin_legend;},get SubTitle(){return plugin_subtitle;},get Title(){return plugin_title;},get Tooltip(){return plugin_tooltip;}});function noop(){}
const uid=(()=>{let id=0;return()=>id++;})();function isNullOrUndef(value){return value===null||typeof value==='undefined';}
function isArray(value){if(Array.isArray&&Array.isArray(value)){return true;}
const type=Object.prototype.toString.call(value);if(type.slice(0,7)==='[object'&&type.slice(-6)==='Array]'){return true;}
return false;}
function isObject(value){return value!==null&&Object.prototype.toString.call(value)==='[object Object]';}
function isNumberFinite(value){return(typeof value==='number'||value instanceof Number)&&isFinite(+value);}
function finiteOrDefault(value,defaultValue){return isNumberFinite(value)?value:defaultValue;}
function valueOrDefault(value,defaultValue){return typeof value==='undefined'?defaultValue:value;}
const toPercentage=(value,dimension)=>typeof value==='string'&&value.endsWith('%')?parseFloat(value)/100:+value/dimension;const toDimension=(value,dimension)=>typeof value==='string'&&value.endsWith('%')?parseFloat(value)/100*dimension:+value;function callback(fn,args,thisArg){if(fn&&typeof fn.call==='function'){return fn.apply(thisArg,args);}}
function each(loopable,fn,thisArg,reverse){let i,len,keys;if(isArray(loopable)){len=loopable.length;if(reverse){for(i=len-1;i>=0;i--){fn.call(thisArg,loopable[i],i);}}else{for(i=0;i<len;i++){fn.call(thisArg,loopable[i],i);}}}else if(isObject(loopable)){keys=Object.keys(loopable);len=keys.length;for(i=0;i<len;i++){fn.call(thisArg,loopable[keys[i]],keys[i]);}}}
function _elementsEqual(a0,a1){let i,ilen,v0,v1;if(!a0||!a1||a0.length!==a1.length){return false;}
for(i=0,ilen=a0.length;i<ilen;++i){v0=a0[i];v1=a1[i];if(v0.datasetIndex!==v1.datasetIndex||v0.index!==v1.index){return false;}}
return true;}
function clone$1(source){if(isArray(source)){return source.map(clone$1);}
if(isObject(source)){const target=Object.create(null);const keys=Object.keys(source);const klen=keys.length;let k=0;for(;k<klen;++k){target[keys[k]]=clone$1(source[keys[k]]);}
return target;}
return source;}
function isValidKey(key){return['__proto__','prototype','constructor'].indexOf(key)===-1;}
function _merger(key,target,source,options){if(!isValidKey(key)){return;}
const tval=target[key];const sval=source[key];if(isObject(tval)&&isObject(sval)){merge(tval,sval,options);}else{target[key]=clone$1(sval);}}
function merge(target,source,options){const sources=isArray(source)?source:[source];const ilen=sources.length;if(!isObject(target)){return target;}
options=options||{};const merger=options.merger||_merger;let current;for(let i=0;i<ilen;++i){current=sources[i];if(!isObject(current)){continue;}
const keys=Object.keys(current);for(let k=0,klen=keys.length;k<klen;++k){merger(keys[k],target,current,options);}}
return target;}
function mergeIf(target,source){return merge(target,source,{merger:_mergerIf});}
function _mergerIf(key,target,source){if(!isValidKey(key)){return;}
const tval=target[key];const sval=source[key];if(isObject(tval)&&isObject(sval)){mergeIf(tval,sval);}else if(!Object.prototype.hasOwnProperty.call(target,key)){target[key]=clone$1(sval);}}
function _deprecated(scope,value,previous,current){if(value!==undefined){console.warn(scope+': "'+previous+'" is deprecated. Please use "'+current+'" instead');}}
const keyResolvers={'':(v)=>v,x:(o)=>o.x,y:(o)=>o.y};function _splitKey(key){const parts=key.split('.');const keys=[];let tmp='';for(const part of parts){tmp+=part;if(tmp.endsWith('\\')){tmp=tmp.slice(0,-1)+'.';}else{keys.push(tmp);tmp='';}}
return keys;}
function _getKeyResolver(key){const keys=_splitKey(key);return(obj)=>{for(const k of keys){if(k===''){break;}
obj=obj&&obj[k];}
return obj;};}
function resolveObjectKey(obj,key){const resolver=keyResolvers[key]||(keyResolvers[key]=_getKeyResolver(key));return resolver(obj);}
function _capitalize(str){return str.charAt(0).toUpperCase()+str.slice(1);}
const defined=(value)=>typeof value!=='undefined';const isFunction=(value)=>typeof value==='function';const setsEqual=(a,b)=>{if(a.size!==b.size){return false;}
for(const item of a){if(!b.has(item)){return false;}}
return true;};function _isClickEvent(e){return e.type==='mouseup'||e.type==='click'||e.type==='contextmenu';}
const PI=Math.PI;const TAU=2*PI;const PITAU=TAU+PI;const INFINITY=Number.POSITIVE_INFINITY;const RAD_PER_DEG=PI/180;const HALF_PI=PI/2;const QUARTER_PI=PI/4;const TWO_THIRDS_PI=PI*2/3;const log10=Math.log10;const sign=Math.sign;function almostEquals(x,y,epsilon){return Math.abs(x-y)<epsilon;}
function niceNum(range){const roundedRange=Math.round(range);range=almostEquals(range,roundedRange,range/1000)?roundedRange:range;const niceRange=Math.pow(10,Math.floor(log10(range)));const fraction=range/niceRange;const niceFraction=fraction<=1?1:fraction<=2?2:fraction<=5?5:10;return niceFraction*niceRange;}
function _factorize(value){const result=[];const sqrt=Math.sqrt(value);let i;for(i=1;i<sqrt;i++){if(value%i===0){result.push(i);result.push(value/i);}}
if(sqrt===(sqrt|0)){result.push(sqrt);}
result.sort((a,b)=>a-b).pop();return result;}
function isNumber(n){return!isNaN(parseFloat(n))&&isFinite(n);}
function almostWhole(x,epsilon){const rounded=Math.round(x);return rounded-epsilon<=x&&rounded+epsilon>=x;}
function _setMinAndMaxByKey(array,target,property){let i,ilen,value;for(i=0,ilen=array.length;i<ilen;i++){value=array[i][property];if(!isNaN(value)){target.min=Math.min(target.min,value);target.max=Math.max(target.max,value);}}}
function toRadians(degrees){return degrees*(PI/180);}
function toDegrees(radians){return radians*(180/PI);}
function _decimalPlaces(x){if(!isNumberFinite(x)){return;}
let e=1;let p=0;while(Math.round(x*e)/e!==x){e*=10;p++;}
return p;}
function getAngleFromPoint(centrePoint,anglePoint){const distanceFromXCenter=anglePoint.x-centrePoint.x;const distanceFromYCenter=anglePoint.y-centrePoint.y;const radialDistanceFromCenter=Math.sqrt(distanceFromXCenter*distanceFromXCenter+distanceFromYCenter*distanceFromYCenter);let angle=Math.atan2(distanceFromYCenter,distanceFromXCenter);if(angle<-0.5*PI){angle+=TAU;}
return{angle,distance:radialDistanceFromCenter};}
function distanceBetweenPoints(pt1,pt2){return Math.sqrt(Math.pow(pt2.x-pt1.x,2)+Math.pow(pt2.y-pt1.y,2));}
function _angleDiff(a,b){return(a-b+PITAU)%TAU-PI;}
function _normalizeAngle(a){return(a%TAU+TAU)%TAU;}
function _angleBetween(angle,start,end,sameAngleIsFullCircle){const a=_normalizeAngle(angle);const s=_normalizeAngle(start);const e=_normalizeAngle(end);const angleToStart=_normalizeAngle(s-a);const angleToEnd=_normalizeAngle(e-a);const startToAngle=_normalizeAngle(a-s);const endToAngle=_normalizeAngle(a-e);return a===s||a===e||sameAngleIsFullCircle&&s===e||angleToStart>angleToEnd&&startToAngle<endToAngle;}
function _limitValue(value,min,max){return Math.max(min,Math.min(max,value));}
function _int16Range(value){return _limitValue(value,-32768,32767);}
function _isBetween(value,start,end,epsilon=1e-6){return value>=Math.min(start,end)-epsilon&&value<=Math.max(start,end)+epsilon;}
function _lookup(table,value,cmp){cmp=cmp||((index)=>table[index]<value);let hi=table.length-1;let lo=0;let mid;while(hi-lo>1){mid=lo+hi>>1;if(cmp(mid)){lo=mid;}else{hi=mid;}}
return{lo,hi};}
const _lookupByKey=(table,key,value,last)=>_lookup(table,value,last?(index)=>{const ti=table[index][key];return ti<value||ti===value&&table[index+1][key]===value;}:(index)=>table[index][key]<value);const _rlookupByKey=(table,key,value)=>_lookup(table,value,(index)=>table[index][key]>=value);function _filterBetween(values,min,max){let start=0;let end=values.length;while(start<end&&values[start]<min){start++;}
while(end>start&&values[end-1]>max){end--;}
return start>0||end<values.length?values.slice(start,end):values;}
const arrayEvents=['push','pop','shift','splice','unshift'];function listenArrayEvents(array,listener){if(array._chartjs){array._chartjs.listeners.push(listener);return;}
Object.defineProperty(array,'_chartjs',{configurable:true,enumerable:false,value:{listeners:[listener]}});arrayEvents.forEach((key)=>{const method='_onData'+_capitalize(key);const base=array[key];Object.defineProperty(array,key,{configurable:true,enumerable:false,value(...args){const res=base.apply(this,args);array._chartjs.listeners.forEach((object)=>{if(typeof object[method]==='function'){object[method](...args);}});return res;}});});}
function unlistenArrayEvents(array,listener){const stub=array._chartjs;if(!stub){return;}
const listeners=stub.listeners;const index=listeners.indexOf(listener);if(index!==-1){listeners.splice(index,1);}
if(listeners.length>0){return;}
arrayEvents.forEach((key)=>{delete array[key];});delete array._chartjs;}
function _arrayUnique(items){const set=new Set(items);if(set.size===items.length){return items;}
return Array.from(set);}
function fontString(pixelSize,fontStyle,fontFamily){return fontStyle+' '+pixelSize+'px '+fontFamily;}
const requestAnimFrame=function(){if(typeof window==='undefined'){return function(callback){return callback();};}
return window.requestAnimationFrame;}();function throttled(fn,thisArg){let argsToUse=[];let ticking=false;return function(...args){argsToUse=args;if(!ticking){ticking=true;requestAnimFrame.call(window,()=>{ticking=false;fn.apply(thisArg,argsToUse);});}};}
function debounce(fn,delay){let timeout;return function(...args){if(delay){clearTimeout(timeout);timeout=setTimeout(fn,delay,args);}else{fn.apply(this,args);}
return delay;};}
const _toLeftRightCenter=(align)=>align==='start'?'left':align==='end'?'right':'center';const _alignStartEnd=(align,start,end)=>align==='start'?start:align==='end'?end:(start+end)/2;const _textX=(align,left,right,rtl)=>{const check=rtl?'left':'right';return align===check?right:align==='center'?(left+right)/2:left;};function _getStartAndCountOfVisiblePoints(meta,points,animationsDisabled){const pointCount=points.length;let start=0;let count=pointCount;if(meta._sorted){const{iScale,_parsed}=meta;const axis=iScale.axis;const{min,max,minDefined,maxDefined}=iScale.getUserBounds();if(minDefined){start=_limitValue(Math.min(_lookupByKey(_parsed,axis,min).lo,animationsDisabled?pointCount:_lookupByKey(points,axis,iScale.getPixelForValue(min)).lo),0,pointCount-1);}
if(maxDefined){count=_limitValue(Math.max(_lookupByKey(_parsed,iScale.axis,max,true).hi+1,animationsDisabled?0:_lookupByKey(points,axis,iScale.getPixelForValue(max),true).hi+1),start,pointCount)-start;}else{count=pointCount-start;}}
return{start,count};}
function _scaleRangesChanged(meta){const{xScale,yScale,_scaleRanges}=meta;const newRanges={xmin:xScale.min,xmax:xScale.max,ymin:yScale.min,ymax:yScale.max};if(!_scaleRanges){meta._scaleRanges=newRanges;return true;}
const changed=_scaleRanges.xmin!==xScale.min||_scaleRanges.xmax!==xScale.max||_scaleRanges.ymin!==yScale.min||_scaleRanges.ymax!==yScale.max;Object.assign(_scaleRanges,newRanges);return changed;}
class Animator{constructor(){this._request=null;this._charts=new Map();this._running=false;this._lastDate=undefined;}
_notify(chart,anims,date,type){const callbacks=anims.listeners[type];const numSteps=anims.duration;callbacks.forEach((fn)=>fn({chart,initial:anims.initial,numSteps,currentStep:Math.min(date-anims.start,numSteps)}));}
_refresh(){if(this._request){return;}
this._running=true;this._request=requestAnimFrame.call(window,()=>{this._update();this._request=null;if(this._running){this._refresh();}});}
_update(date=Date.now()){let remaining=0;this._charts.forEach((anims,chart)=>{if(!anims.running||!anims.items.length){return;}
const items=anims.items;let i=items.length-1;let draw=false;let item;for(;i>=0;--i){item=items[i];if(item._active){if(item._total>anims.duration){anims.duration=item._total;}
item.tick(date);draw=true;}else{items[i]=items[items.length-1];items.pop();}}
if(draw){chart.draw();this._notify(chart,anims,date,'progress');}
if(!items.length){anims.running=false;this._notify(chart,anims,date,'complete');anims.initial=false;}
remaining+=items.length;});this._lastDate=date;if(remaining===0){this._running=false;}}
_getAnims(chart){const charts=this._charts;let anims=charts.get(chart);if(!anims){anims={running:false,initial:true,items:[],listeners:{complete:[],progress:[]}};charts.set(chart,anims);}
return anims;}
listen(chart,event,cb){this._getAnims(chart).listeners[event].push(cb);}
add(chart,items){if(!items||!items.length){return;}
this._getAnims(chart).items.push(...items);}
has(chart){return this._getAnims(chart).items.length>0;}
start(chart){const anims=this._charts.get(chart);if(!anims){return;}
anims.running=true;anims.start=Date.now();anims.duration=anims.items.reduce((acc,cur)=>Math.max(acc,cur._duration),0);this._refresh();}
running(chart){if(!this._running){return false;}
const anims=this._charts.get(chart);if(!anims||!anims.running||!anims.items.length){return false;}
return true;}
stop(chart){const anims=this._charts.get(chart);if(!anims||!anims.items.length){return;}
const items=anims.items;let i=items.length-1;for(;i>=0;--i){items[i].cancel();}
anims.items=[];this._notify(chart,anims,Date.now(),'complete');}
remove(chart){return this._charts.delete(chart);}}
var animator=new Animator();function round(v){return v+0.5|0;}
const lim=(v,l,h)=>Math.max(Math.min(v,h),l);function p2b(v){return lim(round(v*2.55),0,255);}
function n2b(v){return lim(round(v*255),0,255);}
function b2n(v){return lim(round(v/2.55)/100,0,1);}
function n2p(v){return lim(round(v*100),0,100);}
const map$1={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,a:10,b:11,c:12,d:13,e:14,f:15};const hex=[...'0123456789ABCDEF'];const h1=b=>hex[b&0xF];const h2=b=>hex[(b&0xF0)>>4]+hex[b&0xF];const eq=b=>((b&0xF0)>>4)===(b&0xF);const isShort=v=>eq(v.r)&&eq(v.g)&&eq(v.b)&&eq(v.a);function hexParse(str){var len=str.length;var ret;if(str[0]==='#'){if(len===4||len===5){ret={r:255&map$1[str[1]]*17,g:255&map$1[str[2]]*17,b:255&map$1[str[3]]*17,a:len===5?map$1[str[4]]*17:255};}else if(len===7||len===9){ret={r:map$1[str[1]]<<4|map$1[str[2]],g:map$1[str[3]]<<4|map$1[str[4]],b:map$1[str[5]]<<4|map$1[str[6]],a:len===9?(map$1[str[7]]<<4|map$1[str[8]]):255};}}
return ret;}
const alpha=(a,f)=>a<255?f(a):'';function hexString(v){var f=isShort(v)?h1:h2;return v?'#'+f(v.r)+f(v.g)+f(v.b)+alpha(v.a,f):undefined;}
const HUE_RE=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function hsl2rgbn(h,s,l){const a=s*Math.min(l,1-l);const f=(n,k=(n+h/30)%12)=>l-a*Math.max(Math.min(k-3,9-k,1),-1);return[f(0),f(8),f(4)];}
function hsv2rgbn(h,s,v){const f=(n,k=(n+h/60)%6)=>v-v*s*Math.max(Math.min(k,4-k,1),0);return[f(5),f(3),f(1)];}
function hwb2rgbn(h,w,b){const rgb=hsl2rgbn(h,1,0.5);let i;if(w+b>1){i=1/(w+b);w*=i;b*=i;}
for(i=0;i<3;i++){rgb[i]*=1-w-b;rgb[i]+=w;}
return rgb;}
function hueValue(r,g,b,d,max){if(r===max){return((g-b)/d)+(g<b?6:0);}
if(g===max){return(b-r)/d+2;}
return(r-g)/d+4;}
function rgb2hsl(v){const range=255;const r=v.r/range;const g=v.g/range;const b=v.b/range;const max=Math.max(r,g,b);const min=Math.min(r,g,b);const l=(max+min)/2;let h,s,d;if(max!==min){d=max-min;s=l>0.5?d/(2-max-min):d/(max+min);h=hueValue(r,g,b,d,max);h=h*60+0.5;}
return[h|0,s||0,l];}
function calln(f,a,b,c){return(Array.isArray(a)?f(a[0],a[1],a[2]):f(a,b,c)).map(n2b);}
function hsl2rgb(h,s,l){return calln(hsl2rgbn,h,s,l);}
function hwb2rgb(h,w,b){return calln(hwb2rgbn,h,w,b);}
function hsv2rgb(h,s,v){return calln(hsv2rgbn,h,s,v);}
function hue(h){return(h%360+360)%360;}
function hueParse(str){const m=HUE_RE.exec(str);let a=255;let v;if(!m){return;}
if(m[5]!==v){a=m[6]?p2b(+m[5]):n2b(+m[5]);}
const h=hue(+m[2]);const p1=+m[3]/100;const p2=+m[4]/100;if(m[1]==='hwb'){v=hwb2rgb(h,p1,p2);}else if(m[1]==='hsv'){v=hsv2rgb(h,p1,p2);}else{v=hsl2rgb(h,p1,p2);}
return{r:v[0],g:v[1],b:v[2],a:a};}
function rotate(v,deg){var h=rgb2hsl(v);h[0]=hue(h[0]+deg);h=hsl2rgb(h);v.r=h[0];v.g=h[1];v.b=h[2];}
function hslString(v){if(!v){return;}
const a=rgb2hsl(v);const h=a[0];const s=n2p(a[1]);const l=n2p(a[2]);return v.a<255?`hsla(${h}, ${s}%, ${l}%, ${b2n(v.a)})`:`hsl(${h}, ${s}%, ${l}%)`;}
const map$2={x:'dark',Z:'light',Y:'re',X:'blu',W:'gr',V:'medium',U:'slate',A:'ee',T:'ol',S:'or',B:'ra',C:'lateg',D:'ights',R:'in',Q:'turquois',E:'hi',P:'ro',O:'al',N:'le',M:'de',L:'yello',F:'en',K:'ch',G:'arks',H:'ea',I:'ightg',J:'wh'};const names$1={OiceXe:'f0f8ff',antiquewEte:'faebd7',aqua:'ffff',aquamarRe:'7fffd4',azuY:'f0ffff',beige:'f5f5dc',bisque:'ffe4c4',black:'0',blanKedOmond:'ffebcd',Xe:'ff',XeviTet:'8a2be2',bPwn:'a52a2a',burlywood:'deb887',caMtXe:'5f9ea0',KartYuse:'7fff00',KocTate:'d2691e',cSO:'ff7f50',cSnflowerXe:'6495ed',cSnsilk:'fff8dc',crimson:'dc143c',cyan:'ffff',xXe:'8b',xcyan:'8b8b',xgTMnPd:'b8860b',xWay:'a9a9a9',xgYF:'6400',xgYy:'a9a9a9',xkhaki:'bdb76b',xmagFta:'8b008b',xTivegYF:'556b2f',xSange:'ff8c00',xScEd:'9932cc',xYd:'8b0000',xsOmon:'e9967a',xsHgYF:'8fbc8f',xUXe:'483d8b',xUWay:'2f4f4f',xUgYy:'2f4f4f',xQe:'ced1',xviTet:'9400d3',dAppRk:'ff1493',dApskyXe:'bfff',dimWay:'696969',dimgYy:'696969',dodgerXe:'1e90ff',fiYbrick:'b22222',flSOwEte:'fffaf0',foYstWAn:'228b22',fuKsia:'ff00ff',gaRsbSo:'dcdcdc',ghostwEte:'f8f8ff',gTd:'ffd700',gTMnPd:'daa520',Way:'808080',gYF:'8000',gYFLw:'adff2f',gYy:'808080',honeyMw:'f0fff0',hotpRk:'ff69b4',RdianYd:'cd5c5c',Rdigo:'4b0082',ivSy:'fffff0',khaki:'f0e68c',lavFMr:'e6e6fa',lavFMrXsh:'fff0f5',lawngYF:'7cfc00',NmoncEffon:'fffacd',ZXe:'add8e6',ZcSO:'f08080',Zcyan:'e0ffff',ZgTMnPdLw:'fafad2',ZWay:'d3d3d3',ZgYF:'90ee90',ZgYy:'d3d3d3',ZpRk:'ffb6c1',ZsOmon:'ffa07a',ZsHgYF:'20b2aa',ZskyXe:'87cefa',ZUWay:'778899',ZUgYy:'778899',ZstAlXe:'b0c4de',ZLw:'ffffe0',lime:'ff00',limegYF:'32cd32',lRF:'faf0e6',magFta:'ff00ff',maPon:'800000',VaquamarRe:'66cdaa',VXe:'cd',VScEd:'ba55d3',VpurpN:'9370db',VsHgYF:'3cb371',VUXe:'7b68ee',VsprRggYF:'fa9a',VQe:'48d1cc',VviTetYd:'c71585',midnightXe:'191970',mRtcYam:'f5fffa',mistyPse:'ffe4e1',moccasR:'ffe4b5',navajowEte:'ffdead',navy:'80',Tdlace:'fdf5e6',Tive:'808000',TivedBb:'6b8e23',Sange:'ffa500',SangeYd:'ff4500',ScEd:'da70d6',pOegTMnPd:'eee8aa',pOegYF:'98fb98',pOeQe:'afeeee',pOeviTetYd:'db7093',papayawEp:'ffefd5',pHKpuff:'ffdab9',peru:'cd853f',pRk:'ffc0cb',plum:'dda0dd',powMrXe:'b0e0e6',purpN:'800080',YbeccapurpN:'663399',Yd:'ff0000',Psybrown:'bc8f8f',PyOXe:'4169e1',saddNbPwn:'8b4513',sOmon:'fa8072',sandybPwn:'f4a460',sHgYF:'2e8b57',sHshell:'fff5ee',siFna:'a0522d',silver:'c0c0c0',skyXe:'87ceeb',UXe:'6a5acd',UWay:'708090',UgYy:'708090',snow:'fffafa',sprRggYF:'ff7f',stAlXe:'4682b4',tan:'d2b48c',teO:'8080',tEstN:'d8bfd8',tomato:'ff6347',Qe:'40e0d0',viTet:'ee82ee',JHt:'f5deb3',wEte:'ffffff',wEtesmoke:'f5f5f5',Lw:'ffff00',LwgYF:'9acd32'};function unpack(){const unpacked={};const keys=Object.keys(names$1);const tkeys=Object.keys(map$2);let i,j,k,ok,nk;for(i=0;i<keys.length;i++){ok=nk=keys[i];for(j=0;j<tkeys.length;j++){k=tkeys[j];nk=nk.replace(k,map$2[k]);}
k=parseInt(names$1[ok],16);unpacked[nk]=[k>>16&0xFF,k>>8&0xFF,k&0xFF];}
return unpacked;}
let names;function nameParse(str){if(!names){names=unpack();names.transparent=[0,0,0,0];}
const a=names[str.toLowerCase()];return a&&{r:a[0],g:a[1],b:a[2],a:a.length===4?a[3]:255};}
const RGB_RE=/^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/;function rgbParse(str){const m=RGB_RE.exec(str);let a=255;let r,g,b;if(!m){return;}
if(m[7]!==r){const v=+m[7];a=m[8]?p2b(v):lim(v*255,0,255);}
r=+m[1];g=+m[3];b=+m[5];r=255&(m[2]?p2b(r):lim(r,0,255));g=255&(m[4]?p2b(g):lim(g,0,255));b=255&(m[6]?p2b(b):lim(b,0,255));return{r:r,g:g,b:b,a:a};}
function rgbString(v){return v&&(v.a<255?`rgba(${v.r}, ${v.g}, ${v.b}, ${b2n(v.a)})`:`rgb(${v.r}, ${v.g}, ${v.b})`);}
const to=v=>v<=0.0031308?v*12.92:Math.pow(v,1.0/2.4)*1.055-0.055;const from=v=>v<=0.04045?v/12.92:Math.pow((v+0.055)/1.055,2.4);function interpolate$1(rgb1,rgb2,t){const r=from(b2n(rgb1.r));const g=from(b2n(rgb1.g));const b=from(b2n(rgb1.b));return{r:n2b(to(r+t*(from(b2n(rgb2.r))-r))),g:n2b(to(g+t*(from(b2n(rgb2.g))-g))),b:n2b(to(b+t*(from(b2n(rgb2.b))-b))),a:rgb1.a+t*(rgb2.a-rgb1.a)};}
function modHSL(v,i,ratio){if(v){let tmp=rgb2hsl(v);tmp[i]=Math.max(0,Math.min(tmp[i]+tmp[i]*ratio,i===0?360:1));tmp=hsl2rgb(tmp);v.r=tmp[0];v.g=tmp[1];v.b=tmp[2];}}
function clone(v,proto){return v?Object.assign(proto||{},v):v;}
function fromObject(input){var v={r:0,g:0,b:0,a:255};if(Array.isArray(input)){if(input.length>=3){v={r:input[0],g:input[1],b:input[2],a:255};if(input.length>3){v.a=n2b(input[3]);}}}else{v=clone(input,{r:0,g:0,b:0,a:1});v.a=n2b(v.a);}
return v;}
function functionParse(str){if(str.charAt(0)==='r'){return rgbParse(str);}
return hueParse(str);}
class Color{constructor(input){if(input instanceof Color){return input;}
const type=typeof input;let v;if(type==='object'){v=fromObject(input);}else if(type==='string'){v=hexParse(input)||nameParse(input)||functionParse(input);}
this._rgb=v;this._valid=!!v;}
get valid(){return this._valid;}
get rgb(){var v=clone(this._rgb);if(v){v.a=b2n(v.a);}
return v;}
set rgb(obj){this._rgb=fromObject(obj);}
rgbString(){return this._valid?rgbString(this._rgb):undefined;}
hexString(){return this._valid?hexString(this._rgb):undefined;}
hslString(){return this._valid?hslString(this._rgb):undefined;}
mix(color,weight){if(color){const c1=this.rgb;const c2=color.rgb;let w2;const p=weight===w2?0.5:weight;const w=2*p-1;const a=c1.a-c2.a;const w1=((w*a===-1?w:(w+a)/(1+w*a))+1)/2.0;w2=1-w1;c1.r=0xFF&w1*c1.r+w2*c2.r+0.5;c1.g=0xFF&w1*c1.g+w2*c2.g+0.5;c1.b=0xFF&w1*c1.b+w2*c2.b+0.5;c1.a=p*c1.a+(1-p)*c2.a;this.rgb=c1;}
return this;}
interpolate(color,t){if(color){this._rgb=interpolate$1(this._rgb,color._rgb,t);}
return this;}
clone(){return new Color(this.rgb);}
alpha(a){this._rgb.a=n2b(a);return this;}
clearer(ratio){const rgb=this._rgb;rgb.a*=1-ratio;return this;}
greyscale(){const rgb=this._rgb;const val=round(rgb.r*0.3+rgb.g*0.59+rgb.b*0.11);rgb.r=rgb.g=rgb.b=val;return this;}
opaquer(ratio){const rgb=this._rgb;rgb.a*=1+ratio;return this;}
negate(){const v=this._rgb;v.r=255-v.r;v.g=255-v.g;v.b=255-v.b;return this;}
lighten(ratio){modHSL(this._rgb,2,ratio);return this;}
darken(ratio){modHSL(this._rgb,2,-ratio);return this;}
saturate(ratio){modHSL(this._rgb,1,ratio);return this;}
desaturate(ratio){modHSL(this._rgb,1,-ratio);return this;}
rotate(deg){rotate(this._rgb,deg);return this;}}
function isPatternOrGradient(value){if(value&&typeof value==='object'){const type=value.toString();return type==='[object CanvasPattern]'||type==='[object CanvasGradient]';}
return false;}
function color(value){return isPatternOrGradient(value)?value:new Color(value);}
function getHoverColor(value){return isPatternOrGradient(value)?value:new Color(value).saturate(0.5).darken(0.1).hexString();}
const numbers=['x','y','borderWidth','radius','tension'];const colors=['color','borderColor','backgroundColor'];function applyAnimationsDefaults(defaults){defaults.set('animation',{delay:undefined,duration:1000,easing:'easeOutQuart',fn:undefined,from:undefined,loop:undefined,to:undefined,type:undefined});defaults.describe('animation',{_fallback:false,_indexable:false,_scriptable:(name)=>name!=='onProgress'&&name!=='onComplete'&&name!=='fn'});defaults.set('animations',{colors:{type:'color',properties:colors},numbers:{type:'number',properties:numbers}});defaults.describe('animations',{_fallback:'animation'});defaults.set('transitions',{active:{animation:{duration:400}},resize:{animation:{duration:0}},show:{animations:{colors:{from:'transparent'},visible:{type:'boolean',duration:0}}},hide:{animations:{colors:{to:'transparent'},visible:{type:'boolean',easing:'linear',fn:(v)=>v|0}}}});}
function applyLayoutsDefaults(defaults){defaults.set('layout',{autoPadding:true,padding:{top:0,right:0,bottom:0,left:0}});}
const intlCache=new Map();function getNumberFormat(locale,options){options=options||{};const cacheKey=locale+JSON.stringify(options);let formatter=intlCache.get(cacheKey);if(!formatter){formatter=new Intl.NumberFormat(locale,options);intlCache.set(cacheKey,formatter);}
return formatter;}
function formatNumber(num,locale,options){return getNumberFormat(locale,options).format(num);}
const formatters={values(value){return isArray(value)?value:''+value;},numeric(tickValue,index,ticks){if(tickValue===0){return'0';}
const locale=this.chart.options.locale;let notation;let delta=tickValue;if(ticks.length>1){const maxTick=Math.max(Math.abs(ticks[0].value),Math.abs(ticks[ticks.length-1].value));if(maxTick<1e-4||maxTick>1e+15){notation='scientific';}
delta=calculateDelta(tickValue,ticks);}
const logDelta=log10(Math.abs(delta));const numDecimal=isNaN(logDelta)?1:Math.max(Math.min(-1*Math.floor(logDelta),20),0);const options={notation,minimumFractionDigits:numDecimal,maximumFractionDigits:numDecimal};Object.assign(options,this.options.ticks.format);return formatNumber(tickValue,locale,options);},logarithmic(tickValue,index,ticks){if(tickValue===0){return'0';}
const remain=ticks[index].significand||tickValue/Math.pow(10,Math.floor(log10(tickValue)));if([1,2,3,5,10,15].includes(remain)||index>0.8*ticks.length){return formatters.numeric.call(this,tickValue,index,ticks);}
return'';}};function calculateDelta(tickValue,ticks){let delta=ticks.length>3?ticks[2].value-ticks[1].value:ticks[1].value-ticks[0].value;if(Math.abs(delta)>=1&&tickValue!==Math.floor(tickValue)){delta=tickValue-Math.floor(tickValue);}
return delta;}
var Ticks={formatters};function applyScaleDefaults(defaults){defaults.set('scale',{display:true,offset:false,reverse:false,beginAtZero:false,bounds:'ticks',clip:true,grace:0,grid:{display:true,lineWidth:1,drawOnChartArea:true,drawTicks:true,tickLength:8,tickWidth:(_ctx,options)=>options.lineWidth,tickColor:(_ctx,options)=>options.color,offset:false},border:{display:true,dash:[],dashOffset:0.0,width:1},title:{display:false,text:'',padding:{top:4,bottom:4}},ticks:{minRotation:0,maxRotation:50,mirror:false,textStrokeWidth:0,textStrokeColor:'',padding:3,display:true,autoSkip:true,autoSkipPadding:3,labelOffset:0,callback:Ticks.formatters.values,minor:{},major:{},align:'center',crossAlign:'near',showLabelBackdrop:false,backdropColor:'rgba(255, 255, 255, 0.75)',backdropPadding:2}});defaults.route('scale.ticks','color','','color');defaults.route('scale.grid','color','','borderColor');defaults.route('scale.border','color','','borderColor');defaults.route('scale.title','color','','color');defaults.describe('scale',{_fallback:false,_scriptable:(name)=>!name.startsWith('before')&&!name.startsWith('after')&&name!=='callback'&&name!=='parser',_indexable:(name)=>name!=='borderDash'&&name!=='tickBorderDash'&&name!=='dash'});defaults.describe('scales',{_fallback:'scale'});defaults.describe('scale.ticks',{_scriptable:(name)=>name!=='backdropPadding'&&name!=='callback',_indexable:(name)=>name!=='backdropPadding'});}
const overrides=Object.create(null);const descriptors=Object.create(null);function getScope$1(node,key){if(!key){return node;}
const keys=key.split('.');for(let i=0,n=keys.length;i<n;++i){const k=keys[i];node=node[k]||(node[k]=Object.create(null));}
return node;}
function set(root,scope,values){if(typeof scope==='string'){return merge(getScope$1(root,scope),values);}
return merge(getScope$1(root,''),scope);}
class Defaults{constructor(_descriptors,_appliers){this.animation=undefined;this.backgroundColor='rgba(0,0,0,0.1)';this.borderColor='rgba(0,0,0,0.1)';this.color='#666';this.datasets={};this.devicePixelRatio=(context)=>context.chart.platform.getDevicePixelRatio();this.elements={};this.events=['mousemove','mouseout','click','touchstart','touchmove'];this.font={family:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",size:12,style:'normal',lineHeight:1.2,weight:null};this.hover={};this.hoverBackgroundColor=(ctx,options)=>getHoverColor(options.backgroundColor);this.hoverBorderColor=(ctx,options)=>getHoverColor(options.borderColor);this.hoverColor=(ctx,options)=>getHoverColor(options.color);this.indexAxis='x';this.interaction={mode:'nearest',intersect:true,includeInvisible:false};this.maintainAspectRatio=true;this.onHover=null;this.onClick=null;this.parsing=true;this.plugins={};this.responsive=true;this.scale=undefined;this.scales={};this.showLine=true;this.drawActiveElementsOnTop=true;this.describe(_descriptors);this.apply(_appliers);}
set(scope,values){return set(this,scope,values);}
get(scope){return getScope$1(this,scope);}
describe(scope,values){return set(descriptors,scope,values);}
override(scope,values){return set(overrides,scope,values);}
route(scope,name,targetScope,targetName){const scopeObject=getScope$1(this,scope);const targetScopeObject=getScope$1(this,targetScope);const privateName='_'+name;Object.defineProperties(scopeObject,{[privateName]:{value:scopeObject[name],writable:true},[name]:{enumerable:true,get(){const local=this[privateName];const target=targetScopeObject[targetName];if(isObject(local)){return Object.assign({},target,local);}
return valueOrDefault(local,target);},set(value){this[privateName]=value;}}});}
apply(appliers){appliers.forEach((apply)=>apply(this));}}
var defaults=new Defaults({_scriptable:(name)=>!name.startsWith('on'),_indexable:(name)=>name!=='events',hover:{_fallback:'interaction'},interaction:{_scriptable:false,_indexable:false}},[applyAnimationsDefaults,applyLayoutsDefaults,applyScaleDefaults]);function _isDomSupported(){return typeof window!=='undefined'&&typeof document!=='undefined';}
function _getParentNode(domNode){let parent=domNode.parentNode;if(parent&&parent.toString()==='[object ShadowRoot]'){parent=parent.host;}
return parent;}
function parseMaxStyle(styleValue,node,parentProperty){let valueInPixels;if(typeof styleValue==='string'){valueInPixels=parseInt(styleValue,10);if(styleValue.indexOf('%')!==-1){valueInPixels=valueInPixels/100*node.parentNode[parentProperty];}}else{valueInPixels=styleValue;}
return valueInPixels;}
const getComputedStyle=(element)=>element.ownerDocument.defaultView.getComputedStyle(element,null);function getStyle(el,property){return getComputedStyle(el).getPropertyValue(property);}
const positions=['top','right','bottom','left'];function getPositionedStyle(styles,style,suffix){const result={};suffix=suffix?'-'+suffix:'';for(let i=0;i<4;i++){const pos=positions[i];result[pos]=parseFloat(styles[style+'-'+pos+suffix])||0;}
result.width=result.left+result.right;result.height=result.top+result.bottom;return result;}
const useOffsetPos=(x,y,target)=>(x>0||y>0)&&(!target||!target.shadowRoot);function getCanvasPosition(e,canvas){const touches=e.touches;const source=touches&&touches.length?touches[0]:e;const{offsetX,offsetY}=source;let box=false;let x,y;if(useOffsetPos(offsetX,offsetY,e.target)){x=offsetX;y=offsetY;}else{const rect=canvas.getBoundingClientRect();x=source.clientX-rect.left;y=source.clientY-rect.top;box=true;}
return{x,y,box};}
function getRelativePosition(event,chart){if('native'in event){return event;}
const{canvas,currentDevicePixelRatio}=chart;const style=getComputedStyle(canvas);const borderBox=style.boxSizing==='border-box';const paddings=getPositionedStyle(style,'padding');const borders=getPositionedStyle(style,'border','width');const{x,y,box}=getCanvasPosition(event,canvas);const xOffset=paddings.left+(box&&borders.left);const yOffset=paddings.top+(box&&borders.top);let{width,height}=chart;if(borderBox){width-=paddings.width+borders.width;height-=paddings.height+borders.height;}
return{x:Math.round((x-xOffset)/width*canvas.width/currentDevicePixelRatio),y:Math.round((y-yOffset)/height*canvas.height/currentDevicePixelRatio)};}
function getContainerSize(canvas,width,height){let maxWidth,maxHeight;if(width===undefined||height===undefined){const container=canvas&&_getParentNode(canvas);if(!container){width=canvas.clientWidth;height=canvas.clientHeight;}else{const rect=container.getBoundingClientRect();const containerStyle=getComputedStyle(container);const containerBorder=getPositionedStyle(containerStyle,'border','width');const containerPadding=getPositionedStyle(containerStyle,'padding');width=rect.width-containerPadding.width-containerBorder.width;height=rect.height-containerPadding.height-containerBorder.height;maxWidth=parseMaxStyle(containerStyle.maxWidth,container,'clientWidth');maxHeight=parseMaxStyle(containerStyle.maxHeight,container,'clientHeight');}}
return{width,height,maxWidth:maxWidth||INFINITY,maxHeight:maxHeight||INFINITY};}
const round1=(v)=>Math.round(v*10)/10;function getMaximumSize(canvas,bbWidth,bbHeight,aspectRatio){const style=getComputedStyle(canvas);const margins=getPositionedStyle(style,'margin');const maxWidth=parseMaxStyle(style.maxWidth,canvas,'clientWidth')||INFINITY;const maxHeight=parseMaxStyle(style.maxHeight,canvas,'clientHeight')||INFINITY;const containerSize=getContainerSize(canvas,bbWidth,bbHeight);let{width,height}=containerSize;if(style.boxSizing==='content-box'){const borders=getPositionedStyle(style,'border','width');const paddings=getPositionedStyle(style,'padding');width-=paddings.width+borders.width;height-=paddings.height+borders.height;}
width=Math.max(0,width-margins.width);height=Math.max(0,aspectRatio?width/aspectRatio:height-margins.height);width=round1(Math.min(width,maxWidth,containerSize.maxWidth));height=round1(Math.min(height,maxHeight,containerSize.maxHeight));if(width&&!height){height=round1(width/2);}
const maintainHeight=bbWidth!==undefined||bbHeight!==undefined;if(maintainHeight&&aspectRatio&&containerSize.height&&height>containerSize.height){height=containerSize.height;width=round1(Math.floor(height*aspectRatio));}
return{width,height};}
function retinaScale(chart,forceRatio,forceStyle){const pixelRatio=forceRatio||1;const deviceHeight=Math.floor(chart.height*pixelRatio);const deviceWidth=Math.floor(chart.width*pixelRatio);chart.height=Math.floor(chart.height);chart.width=Math.floor(chart.width);const canvas=chart.canvas;if(canvas.style&&(forceStyle||!canvas.style.height&&!canvas.style.width)){canvas.style.height=`${chart.height}px`;canvas.style.width=`${chart.width}px`;}
if(chart.currentDevicePixelRatio!==pixelRatio||canvas.height!==deviceHeight||canvas.width!==deviceWidth){chart.currentDevicePixelRatio=pixelRatio;canvas.height=deviceHeight;canvas.width=deviceWidth;chart.ctx.setTransform(pixelRatio,0,0,pixelRatio,0,0);return true;}
return false;}
const supportsEventListenerOptions=function(){let passiveSupported=false;try{const options={get passive(){passiveSupported=true;return false;}};if(_isDomSupported()){window.addEventListener('test',null,options);window.removeEventListener('test',null,options);}}catch(e){}
return passiveSupported;}();function readUsedSize(element,property){const value=getStyle(element,property);const matches=value&&value.match(/^(\d+)(\.\d+)?px$/);return matches?+matches[1]:undefined;}
function toFontString(font){if(!font||isNullOrUndef(font.size)||isNullOrUndef(font.family)){return null;}
return(font.style?font.style+' ':'')+(font.weight?font.weight+' ':'')+font.size+'px '+font.family;}
function _measureText(ctx,data,gc,longest,string){let textWidth=data[string];if(!textWidth){textWidth=data[string]=ctx.measureText(string).width;gc.push(string);}
if(textWidth>longest){longest=textWidth;}
return longest;}
function _longestText(ctx,font,arrayOfThings,cache){cache=cache||{};let data=cache.data=cache.data||{};let gc=cache.garbageCollect=cache.garbageCollect||[];if(cache.font!==font){data=cache.data={};gc=cache.garbageCollect=[];cache.font=font;}
ctx.save();ctx.font=font;let longest=0;const ilen=arrayOfThings.length;let i,j,jlen,thing,nestedThing;for(i=0;i<ilen;i++){thing=arrayOfThings[i];if(thing!==undefined&&thing!==null&&!isArray(thing)){longest=_measureText(ctx,data,gc,longest,thing);}else if(isArray(thing)){for(j=0,jlen=thing.length;j<jlen;j++){nestedThing=thing[j];if(nestedThing!==undefined&&nestedThing!==null&&!isArray(nestedThing)){longest=_measureText(ctx,data,gc,longest,nestedThing);}}}}
ctx.restore();const gcLen=gc.length/2;if(gcLen>arrayOfThings.length){for(i=0;i<gcLen;i++){delete data[gc[i]];}
gc.splice(0,gcLen);}
return longest;}
function _alignPixel(chart,pixel,width){const devicePixelRatio=chart.currentDevicePixelRatio;const halfWidth=width!==0?Math.max(width/2,0.5):0;return Math.round((pixel-halfWidth)*devicePixelRatio)/devicePixelRatio+halfWidth;}
function clearCanvas(canvas,ctx){if(!ctx&&!canvas){return;}
ctx=ctx||canvas.getContext('2d');ctx.save();ctx.resetTransform();ctx.clearRect(0,0,canvas.width,canvas.height);ctx.restore();}
function drawPoint(ctx,options,x,y){drawPointLegend(ctx,options,x,y,null);}
function drawPointLegend(ctx,options,x,y,w){let type,xOffset,yOffset,size,cornerRadius,width,xOffsetW,yOffsetW;const style=options.pointStyle;const rotation=options.rotation;const radius=options.radius;let rad=(rotation||0)*RAD_PER_DEG;if(style&&typeof style==='object'){type=style.toString();if(type==='[object HTMLImageElement]'||type==='[object HTMLCanvasElement]'){ctx.save();ctx.translate(x,y);ctx.rotate(rad);ctx.drawImage(style,-style.width/2,-style.height/2,style.width,style.height);ctx.restore();return;}}
if(isNaN(radius)||radius<=0){return;}
ctx.beginPath();switch(style){default:if(w){ctx.ellipse(x,y,w/2,radius,0,0,TAU);}else{ctx.arc(x,y,radius,0,TAU);}
ctx.closePath();break;case'triangle':width=w?w/2:radius;ctx.moveTo(x+Math.sin(rad)*width,y-Math.cos(rad)*radius);rad+=TWO_THIRDS_PI;ctx.lineTo(x+Math.sin(rad)*width,y-Math.cos(rad)*radius);rad+=TWO_THIRDS_PI;ctx.lineTo(x+Math.sin(rad)*width,y-Math.cos(rad)*radius);ctx.closePath();break;case'rectRounded':cornerRadius=radius*0.516;size=radius-cornerRadius;xOffset=Math.cos(rad+QUARTER_PI)*size;xOffsetW=Math.cos(rad+QUARTER_PI)*(w?w/2-cornerRadius:size);yOffset=Math.sin(rad+QUARTER_PI)*size;yOffsetW=Math.sin(rad+QUARTER_PI)*(w?w/2-cornerRadius:size);ctx.arc(x-xOffsetW,y-yOffset,cornerRadius,rad-PI,rad-HALF_PI);ctx.arc(x+yOffsetW,y-xOffset,cornerRadius,rad-HALF_PI,rad);ctx.arc(x+xOffsetW,y+yOffset,cornerRadius,rad,rad+HALF_PI);ctx.arc(x-yOffsetW,y+xOffset,cornerRadius,rad+HALF_PI,rad+PI);ctx.closePath();break;case'rect':if(!rotation){size=Math.SQRT1_2*radius;width=w?w/2:size;ctx.rect(x-width,y-size,2*width,2*size);break;}
rad+=QUARTER_PI;case'rectRot':xOffsetW=Math.cos(rad)*(w?w/2:radius);xOffset=Math.cos(rad)*radius;yOffset=Math.sin(rad)*radius;yOffsetW=Math.sin(rad)*(w?w/2:radius);ctx.moveTo(x-xOffsetW,y-yOffset);ctx.lineTo(x+yOffsetW,y-xOffset);ctx.lineTo(x+xOffsetW,y+yOffset);ctx.lineTo(x-yOffsetW,y+xOffset);ctx.closePath();break;case'crossRot':rad+=QUARTER_PI;case'cross':xOffsetW=Math.cos(rad)*(w?w/2:radius);xOffset=Math.cos(rad)*radius;yOffset=Math.sin(rad)*radius;yOffsetW=Math.sin(rad)*(w?w/2:radius);ctx.moveTo(x-xOffsetW,y-yOffset);ctx.lineTo(x+xOffsetW,y+yOffset);ctx.moveTo(x+yOffsetW,y-xOffset);ctx.lineTo(x-yOffsetW,y+xOffset);break;case'star':xOffsetW=Math.cos(rad)*(w?w/2:radius);xOffset=Math.cos(rad)*radius;yOffset=Math.sin(rad)*radius;yOffsetW=Math.sin(rad)*(w?w/2:radius);ctx.moveTo(x-xOffsetW,y-yOffset);ctx.lineTo(x+xOffsetW,y+yOffset);ctx.moveTo(x+yOffsetW,y-xOffset);ctx.lineTo(x-yOffsetW,y+xOffset);rad+=QUARTER_PI;xOffsetW=Math.cos(rad)*(w?w/2:radius);xOffset=Math.cos(rad)*radius;yOffset=Math.sin(rad)*radius;yOffsetW=Math.sin(rad)*(w?w/2:radius);ctx.moveTo(x-xOffsetW,y-yOffset);ctx.lineTo(x+xOffsetW,y+yOffset);ctx.moveTo(x+yOffsetW,y-xOffset);ctx.lineTo(x-yOffsetW,y+xOffset);break;case'line':xOffset=w?w/2:Math.cos(rad)*radius;yOffset=Math.sin(rad)*radius;ctx.moveTo(x-xOffset,y-yOffset);ctx.lineTo(x+xOffset,y+yOffset);break;case'dash':ctx.moveTo(x,y);ctx.lineTo(x+Math.cos(rad)*(w?w/2:radius),y+Math.sin(rad)*radius);break;case false:ctx.closePath();break;}
ctx.fill();if(options.borderWidth>0){ctx.stroke();}}
function _isPointInArea(point,area,margin){margin=margin||0.5;return!area||point&&point.x>area.left-margin&&point.x<area.right+margin&&point.y>area.top-margin&&point.y<area.bottom+margin;}
function clipArea(ctx,area){ctx.save();ctx.beginPath();ctx.rect(area.left,area.top,area.right-area.left,area.bottom-area.top);ctx.clip();}
function unclipArea(ctx){ctx.restore();}
function _steppedLineTo(ctx,previous,target,flip,mode){if(!previous){return ctx.lineTo(target.x,target.y);}
if(mode==='middle'){const midpoint=(previous.x+target.x)/2.0;ctx.lineTo(midpoint,previous.y);ctx.lineTo(midpoint,target.y);}else if(mode==='after'!==!!flip){ctx.lineTo(previous.x,target.y);}else{ctx.lineTo(target.x,previous.y);}
ctx.lineTo(target.x,target.y);}
function _bezierCurveTo(ctx,previous,target,flip){if(!previous){return ctx.lineTo(target.x,target.y);}
ctx.bezierCurveTo(flip?previous.cp1x:previous.cp2x,flip?previous.cp1y:previous.cp2y,flip?target.cp2x:target.cp1x,flip?target.cp2y:target.cp1y,target.x,target.y);}
function setRenderOpts(ctx,opts){if(opts.translation){ctx.translate(opts.translation[0],opts.translation[1]);}
if(!isNullOrUndef(opts.rotation)){ctx.rotate(opts.rotation);}
if(opts.color){ctx.fillStyle=opts.color;}
if(opts.textAlign){ctx.textAlign=opts.textAlign;}
if(opts.textBaseline){ctx.textBaseline=opts.textBaseline;}}
function decorateText(ctx,x,y,line,opts){if(opts.strikethrough||opts.underline){const metrics=ctx.measureText(line);const left=x-metrics.actualBoundingBoxLeft;const right=x+metrics.actualBoundingBoxRight;const top=y-metrics.actualBoundingBoxAscent;const bottom=y+metrics.actualBoundingBoxDescent;const yDecoration=opts.strikethrough?(top+bottom)/2:bottom;ctx.strokeStyle=ctx.fillStyle;ctx.beginPath();ctx.lineWidth=opts.decorationWidth||2;ctx.moveTo(left,yDecoration);ctx.lineTo(right,yDecoration);ctx.stroke();}}
function drawBackdrop(ctx,opts){const oldColor=ctx.fillStyle;ctx.fillStyle=opts.color;ctx.fillRect(opts.left,opts.top,opts.width,opts.height);ctx.fillStyle=oldColor;}
function renderText(ctx,text,x,y,font,opts={}){const lines=isArray(text)?text:[text];const stroke=opts.strokeWidth>0&&opts.strokeColor!=='';let i,line;ctx.save();ctx.font=font.string;setRenderOpts(ctx,opts);for(i=0;i<lines.length;++i){line=lines[i];if(opts.backdrop){drawBackdrop(ctx,opts.backdrop);}
if(stroke){if(opts.strokeColor){ctx.strokeStyle=opts.strokeColor;}
if(!isNullOrUndef(opts.strokeWidth)){ctx.lineWidth=opts.strokeWidth;}
ctx.strokeText(line,x,y,opts.maxWidth);}
ctx.fillText(line,x,y,opts.maxWidth);decorateText(ctx,x,y,line,opts);y+=Number(font.lineHeight);}
ctx.restore();}
function addRoundedRectPath(ctx,rect){const{x,y,w,h,radius}=rect;ctx.arc(x+radius.topLeft,y+radius.topLeft,radius.topLeft,1.5*PI,PI,true);ctx.lineTo(x,y+h-radius.bottomLeft);ctx.arc(x+radius.bottomLeft,y+h-radius.bottomLeft,radius.bottomLeft,PI,HALF_PI,true);ctx.lineTo(x+w-radius.bottomRight,y+h);ctx.arc(x+w-radius.bottomRight,y+h-radius.bottomRight,radius.bottomRight,HALF_PI,0,true);ctx.lineTo(x+w,y+radius.topRight);ctx.arc(x+w-radius.topRight,y+radius.topRight,radius.topRight,0,-HALF_PI,true);ctx.lineTo(x+radius.topLeft,y);}
function _createResolver(scopes,prefixes=[''],rootScopes,fallback,getTarget=()=>scopes[0]){const finalRootScopes=rootScopes||scopes;if(typeof fallback==='undefined'){fallback=_resolve('_fallback',scopes);}
const cache={[Symbol.toStringTag]:'Object',_cacheable:true,_scopes:scopes,_rootScopes:finalRootScopes,_fallback:fallback,_getTarget:getTarget,override:(scope)=>_createResolver([scope,...scopes],prefixes,finalRootScopes,fallback)};return new Proxy(cache,{deleteProperty(target,prop){delete target[prop];delete target._keys;delete scopes[0][prop];return true;},get(target,prop){return _cached(target,prop,()=>_resolveWithPrefixes(prop,prefixes,scopes,target));},getOwnPropertyDescriptor(target,prop){return Reflect.getOwnPropertyDescriptor(target._scopes[0],prop);},getPrototypeOf(){return Reflect.getPrototypeOf(scopes[0]);},has(target,prop){return getKeysFromAllScopes(target).includes(prop);},ownKeys(target){return getKeysFromAllScopes(target);},set(target,prop,value){const storage=target._storage||(target._storage=getTarget());target[prop]=storage[prop]=value;delete target._keys;return true;}});}
function _attachContext(proxy,context,subProxy,descriptorDefaults){const cache={_cacheable:false,_proxy:proxy,_context:context,_subProxy:subProxy,_stack:new Set(),_descriptors:_descriptors(proxy,descriptorDefaults),setContext:(ctx)=>_attachContext(proxy,ctx,subProxy,descriptorDefaults),override:(scope)=>_attachContext(proxy.override(scope),context,subProxy,descriptorDefaults)};return new Proxy(cache,{deleteProperty(target,prop){delete target[prop];delete proxy[prop];return true;},get(target,prop,receiver){return _cached(target,prop,()=>_resolveWithContext(target,prop,receiver));},getOwnPropertyDescriptor(target,prop){return target._descriptors.allKeys?Reflect.has(proxy,prop)?{enumerable:true,configurable:true}:undefined:Reflect.getOwnPropertyDescriptor(proxy,prop);},getPrototypeOf(){return Reflect.getPrototypeOf(proxy);},has(target,prop){return Reflect.has(proxy,prop);},ownKeys(){return Reflect.ownKeys(proxy);},set(target,prop,value){proxy[prop]=value;delete target[prop];return true;}});}
function _descriptors(proxy,defaults={scriptable:true,indexable:true}){const{_scriptable=defaults.scriptable,_indexable=defaults.indexable,_allKeys=defaults.allKeys}=proxy;return{allKeys:_allKeys,scriptable:_scriptable,indexable:_indexable,isScriptable:isFunction(_scriptable)?_scriptable:()=>_scriptable,isIndexable:isFunction(_indexable)?_indexable:()=>_indexable};}
const readKey=(prefix,name)=>prefix?prefix+_capitalize(name):name;const needsSubResolver=(prop,value)=>isObject(value)&&prop!=='adapters'&&(Object.getPrototypeOf(value)===null||value.constructor===Object);function _cached(target,prop,resolve){if(Object.prototype.hasOwnProperty.call(target,prop)||prop==='constructor'){return target[prop];}
const value=resolve();target[prop]=value;return value;}
function _resolveWithContext(target,prop,receiver){const{_proxy,_context,_subProxy,_descriptors:descriptors}=target;let value=_proxy[prop];if(isFunction(value)&&descriptors.isScriptable(prop)){value=_resolveScriptable(prop,value,target,receiver);}
if(isArray(value)&&value.length){value=_resolveArray(prop,value,target,descriptors.isIndexable);}
if(needsSubResolver(prop,value)){value=_attachContext(value,_context,_subProxy&&_subProxy[prop],descriptors);}
return value;}
function _resolveScriptable(prop,getValue,target,receiver){const{_proxy,_context,_subProxy,_stack}=target;if(_stack.has(prop)){throw new Error('Recursion detected: '+Array.from(_stack).join('->')+'->'+prop);}
_stack.add(prop);let value=getValue(_context,_subProxy||receiver);_stack.delete(prop);if(needsSubResolver(prop,value)){value=createSubResolver(_proxy._scopes,_proxy,prop,value);}
return value;}
function _resolveArray(prop,value,target,isIndexable){const{_proxy,_context,_subProxy,_descriptors:descriptors}=target;if(typeof _context.index!=='undefined'&&isIndexable(prop)){return value[_context.index%value.length];}else if(isObject(value[0])){const arr=value;const scopes=_proxy._scopes.filter((s)=>s!==arr);value=[];for(const item of arr){const resolver=createSubResolver(scopes,_proxy,prop,item);value.push(_attachContext(resolver,_context,_subProxy&&_subProxy[prop],descriptors));}}
return value;}
function resolveFallback(fallback,prop,value){return isFunction(fallback)?fallback(prop,value):fallback;}
const getScope=(key,parent)=>key===true?parent:typeof key==='string'?resolveObjectKey(parent,key):undefined;function addScopes(set,parentScopes,key,parentFallback,value){for(const parent of parentScopes){const scope=getScope(key,parent);if(scope){set.add(scope);const fallback=resolveFallback(scope._fallback,key,value);if(typeof fallback!=='undefined'&&fallback!==key&&fallback!==parentFallback){return fallback;}}else if(scope===false&&typeof parentFallback!=='undefined'&&key!==parentFallback){return null;}}
return false;}
function createSubResolver(parentScopes,resolver,prop,value){const rootScopes=resolver._rootScopes;const fallback=resolveFallback(resolver._fallback,prop,value);const allScopes=[...parentScopes,...rootScopes];const set=new Set();set.add(value);let key=addScopesFromKey(set,allScopes,prop,fallback||prop,value);if(key===null){return false;}
if(typeof fallback!=='undefined'&&fallback!==prop){key=addScopesFromKey(set,allScopes,fallback,key,value);if(key===null){return false;}}
return _createResolver(Array.from(set),[''],rootScopes,fallback,()=>subGetTarget(resolver,prop,value));}
function addScopesFromKey(set,allScopes,key,fallback,item){while(key){key=addScopes(set,allScopes,key,fallback,item);}
return key;}
function subGetTarget(resolver,prop,value){const parent=resolver._getTarget();if(!(prop in parent)){parent[prop]={};}
const target=parent[prop];if(isArray(target)&&isObject(value)){return value;}
return target||{};}
function _resolveWithPrefixes(prop,prefixes,scopes,proxy){let value;for(const prefix of prefixes){value=_resolve(readKey(prefix,prop),scopes);if(typeof value!=='undefined'){return needsSubResolver(prop,value)?createSubResolver(scopes,proxy,prop,value):value;}}}
function _resolve(key,scopes){for(const scope of scopes){if(!scope){continue;}
const value=scope[key];if(typeof value!=='undefined'){return value;}}}
function getKeysFromAllScopes(target){let keys=target._keys;if(!keys){keys=target._keys=resolveKeysFromAllScopes(target._scopes);}
return keys;}
function resolveKeysFromAllScopes(scopes){const set=new Set();for(const scope of scopes){for(const key of Object.keys(scope).filter((k)=>!k.startsWith('_'))){set.add(key);}}
return Array.from(set);}
function _parseObjectDataRadialScale(meta,data,start,count){const{iScale}=meta;const{key='r'}=this._parsing;const parsed=new Array(count);let i,ilen,index,item;for(i=0,ilen=count;i<ilen;++i){index=i+start;item=data[index];parsed[i]={r:iScale.parse(resolveObjectKey(item,key),index)};}
return parsed;}
const EPSILON=Number.EPSILON||1e-14;const getPoint=(points,i)=>i<points.length&&!points[i].skip&&points[i];const getValueAxis=(indexAxis)=>indexAxis==='x'?'y':'x';function splineCurve(firstPoint,middlePoint,afterPoint,t){const previous=firstPoint.skip?middlePoint:firstPoint;const current=middlePoint;const next=afterPoint.skip?middlePoint:afterPoint;const d01=distanceBetweenPoints(current,previous);const d12=distanceBetweenPoints(next,current);let s01=d01/(d01+d12);let s12=d12/(d01+d12);s01=isNaN(s01)?0:s01;s12=isNaN(s12)?0:s12;const fa=t*s01;const fb=t*s12;return{previous:{x:current.x-fa*(next.x-previous.x),y:current.y-fa*(next.y-previous.y)},next:{x:current.x+fb*(next.x-previous.x),y:current.y+fb*(next.y-previous.y)}};}
function monotoneAdjust(points,deltaK,mK){const pointsLen=points.length;let alphaK,betaK,tauK,squaredMagnitude,pointCurrent;let pointAfter=getPoint(points,0);for(let i=0;i<pointsLen-1;++i){pointCurrent=pointAfter;pointAfter=getPoint(points,i+1);if(!pointCurrent||!pointAfter){continue;}
if(almostEquals(deltaK[i],0,EPSILON)){mK[i]=mK[i+1]=0;continue;}
alphaK=mK[i]/deltaK[i];betaK=mK[i+1]/deltaK[i];squaredMagnitude=Math.pow(alphaK,2)+Math.pow(betaK,2);if(squaredMagnitude<=9){continue;}
tauK=3/Math.sqrt(squaredMagnitude);mK[i]=alphaK*tauK*deltaK[i];mK[i+1]=betaK*tauK*deltaK[i];}}
function monotoneCompute(points,mK,indexAxis='x'){const valueAxis=getValueAxis(indexAxis);const pointsLen=points.length;let delta,pointBefore,pointCurrent;let pointAfter=getPoint(points,0);for(let i=0;i<pointsLen;++i){pointBefore=pointCurrent;pointCurrent=pointAfter;pointAfter=getPoint(points,i+1);if(!pointCurrent){continue;}
const iPixel=pointCurrent[indexAxis];const vPixel=pointCurrent[valueAxis];if(pointBefore){delta=(iPixel-pointBefore[indexAxis])/3;pointCurrent[`cp1${indexAxis}`]=iPixel-delta;pointCurrent[`cp1${valueAxis}`]=vPixel-delta*mK[i];}
if(pointAfter){delta=(pointAfter[indexAxis]-iPixel)/3;pointCurrent[`cp2${indexAxis}`]=iPixel+delta;pointCurrent[`cp2${valueAxis}`]=vPixel+delta*mK[i];}}}
function splineCurveMonotone(points,indexAxis='x'){const valueAxis=getValueAxis(indexAxis);const pointsLen=points.length;const deltaK=Array(pointsLen).fill(0);const mK=Array(pointsLen);let i,pointBefore,pointCurrent;let pointAfter=getPoint(points,0);for(i=0;i<pointsLen;++i){pointBefore=pointCurrent;pointCurrent=pointAfter;pointAfter=getPoint(points,i+1);if(!pointCurrent){continue;}
if(pointAfter){const slopeDelta=pointAfter[indexAxis]-pointCurrent[indexAxis];deltaK[i]=slopeDelta!==0?(pointAfter[valueAxis]-pointCurrent[valueAxis])/slopeDelta:0;}
mK[i]=!pointBefore?deltaK[i]:!pointAfter?deltaK[i-1]:sign(deltaK[i-1])!==sign(deltaK[i])?0:(deltaK[i-1]+deltaK[i])/2;}
monotoneAdjust(points,deltaK,mK);monotoneCompute(points,mK,indexAxis);}
function capControlPoint(pt,min,max){return Math.max(Math.min(pt,max),min);}
function capBezierPoints(points,area){let i,ilen,point,inArea,inAreaPrev;let inAreaNext=_isPointInArea(points[0],area);for(i=0,ilen=points.length;i<ilen;++i){inAreaPrev=inArea;inArea=inAreaNext;inAreaNext=i<ilen-1&&_isPointInArea(points[i+1],area);if(!inArea){continue;}
point=points[i];if(inAreaPrev){point.cp1x=capControlPoint(point.cp1x,area.left,area.right);point.cp1y=capControlPoint(point.cp1y,area.top,area.bottom);}
if(inAreaNext){point.cp2x=capControlPoint(point.cp2x,area.left,area.right);point.cp2y=capControlPoint(point.cp2y,area.top,area.bottom);}}}
function _updateBezierControlPoints(points,options,area,loop,indexAxis){let i,ilen,point,controlPoints;if(options.spanGaps){points=points.filter((pt)=>!pt.skip);}
if(options.cubicInterpolationMode==='monotone'){splineCurveMonotone(points,indexAxis);}else{let prev=loop?points[points.length-1]:points[0];for(i=0,ilen=points.length;i<ilen;++i){point=points[i];controlPoints=splineCurve(prev,point,points[Math.min(i+1,ilen-(loop?0:1))%ilen],options.tension);point.cp1x=controlPoints.previous.x;point.cp1y=controlPoints.previous.y;point.cp2x=controlPoints.next.x;point.cp2y=controlPoints.next.y;prev=point;}}
if(options.capBezierPoints){capBezierPoints(points,area);}}
const atEdge=(t)=>t===0||t===1;const elasticIn=(t,s,p)=>-(Math.pow(2,10*(t-=1))*Math.sin((t-s)*TAU/p));const elasticOut=(t,s,p)=>Math.pow(2,-10*t)*Math.sin((t-s)*TAU/p)+1;const effects={linear:(t)=>t,easeInQuad:(t)=>t*t,easeOutQuad:(t)=>-t*(t-2),easeInOutQuad:(t)=>(t/=0.5)<1?0.5*t*t:-0.5*(--t*(t-2)-1),easeInCubic:(t)=>t*t*t,easeOutCubic:(t)=>(t-=1)*t*t+1,easeInOutCubic:(t)=>(t/=0.5)<1?0.5*t*t*t:0.5*((t-=2)*t*t+2),easeInQuart:(t)=>t*t*t*t,easeOutQuart:(t)=>-((t-=1)*t*t*t-1),easeInOutQuart:(t)=>(t/=0.5)<1?0.5*t*t*t*t:-0.5*((t-=2)*t*t*t-2),easeInQuint:(t)=>t*t*t*t*t,easeOutQuint:(t)=>(t-=1)*t*t*t*t+1,easeInOutQuint:(t)=>(t/=0.5)<1?0.5*t*t*t*t*t:0.5*((t-=2)*t*t*t*t+2),easeInSine:(t)=>-Math.cos(t*HALF_PI)+1,easeOutSine:(t)=>Math.sin(t*HALF_PI),easeInOutSine:(t)=>-0.5*(Math.cos(PI*t)-1),easeInExpo:(t)=>t===0?0:Math.pow(2,10*(t-1)),easeOutExpo:(t)=>t===1?1:-Math.pow(2,-10*t)+1,easeInOutExpo:(t)=>atEdge(t)?t:t<0.5?0.5*Math.pow(2,10*(t*2-1)):0.5*(-Math.pow(2,-10*(t*2-1))+2),easeInCirc:(t)=>t>=1?t:-(Math.sqrt(1-t*t)-1),easeOutCirc:(t)=>Math.sqrt(1-(t-=1)*t),easeInOutCirc:(t)=>(t/=0.5)<1?-0.5*(Math.sqrt(1-t*t)-1):0.5*(Math.sqrt(1-(t-=2)*t)+1),easeInElastic:(t)=>atEdge(t)?t:elasticIn(t,0.075,0.3),easeOutElastic:(t)=>atEdge(t)?t:elasticOut(t,0.075,0.3),easeInOutElastic(t){const s=0.1125;const p=0.45;return atEdge(t)?t:t<0.5?0.5*elasticIn(t*2,s,p):0.5+0.5*elasticOut(t*2-1,s,p);},easeInBack(t){const s=1.70158;return t*t*((s+1)*t-s);},easeOutBack(t){const s=1.70158;return(t-=1)*t*((s+1)*t+s)+1;},easeInOutBack(t){let s=1.70158;if((t/=0.5)<1){return 0.5*(t*t*(((s*=1.525)+1)*t-s));}
return 0.5*((t-=2)*t*(((s*=1.525)+1)*t+s)+2);},easeInBounce:(t)=>1-effects.easeOutBounce(1-t),easeOutBounce(t){const m=7.5625;const d=2.75;if(t<1/d){return m*t*t;}
if(t<2/d){return m*(t-=1.5/d)*t+0.75;}
if(t<2.5/d){return m*(t-=2.25/d)*t+0.9375;}
return m*(t-=2.625/d)*t+0.984375;},easeInOutBounce:(t)=>t<0.5?effects.easeInBounce(t*2)*0.5:effects.easeOutBounce(t*2-1)*0.5+0.5};function _pointInLine(p1,p2,t,mode){return{x:p1.x+t*(p2.x-p1.x),y:p1.y+t*(p2.y-p1.y)};}
function _steppedInterpolation(p1,p2,t,mode){return{x:p1.x+t*(p2.x-p1.x),y:mode==='middle'?t<0.5?p1.y:p2.y:mode==='after'?t<1?p1.y:p2.y:t>0?p2.y:p1.y};}
function _bezierInterpolation(p1,p2,t,mode){const cp1={x:p1.cp2x,y:p1.cp2y};const cp2={x:p2.cp1x,y:p2.cp1y};const a=_pointInLine(p1,cp1,t);const b=_pointInLine(cp1,cp2,t);const c=_pointInLine(cp2,p2,t);const d=_pointInLine(a,b,t);const e=_pointInLine(b,c,t);return _pointInLine(d,e,t);}
const LINE_HEIGHT=/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/;const FONT_STYLE=/^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/;function toLineHeight(value,size){const matches=(''+value).match(LINE_HEIGHT);if(!matches||matches[1]==='normal'){return size*1.2;}
value=+matches[2];switch(matches[3]){case'px':return value;case'%':value/=100;break;}
return size*value;}
const numberOrZero=(v)=>+v||0;function _readValueToProps(value,props){const ret={};const objProps=isObject(props);const keys=objProps?Object.keys(props):props;const read=isObject(value)?objProps?(prop)=>valueOrDefault(value[prop],value[props[prop]]):(prop)=>value[prop]:()=>value;for(const prop of keys){ret[prop]=numberOrZero(read(prop));}
return ret;}
function toTRBL(value){return _readValueToProps(value,{top:'y',right:'x',bottom:'y',left:'x'});}
function toTRBLCorners(value){return _readValueToProps(value,['topLeft','topRight','bottomLeft','bottomRight']);}
function toPadding(value){const obj=toTRBL(value);obj.width=obj.left+obj.right;obj.height=obj.top+obj.bottom;return obj;}
function toFont(options,fallback){options=options||{};fallback=fallback||defaults.font;let size=valueOrDefault(options.size,fallback.size);if(typeof size==='string'){size=parseInt(size,10);}
let style=valueOrDefault(options.style,fallback.style);if(style&&!(''+style).match(FONT_STYLE)){console.warn('Invalid font style specified: "'+style+'"');style=undefined;}
const font={family:valueOrDefault(options.family,fallback.family),lineHeight:toLineHeight(valueOrDefault(options.lineHeight,fallback.lineHeight),size),size,style,weight:valueOrDefault(options.weight,fallback.weight),string:''};font.string=toFontString(font);return font;}
function resolve(inputs,context,index,info){let cacheable=true;let i,ilen,value;for(i=0,ilen=inputs.length;i<ilen;++i){value=inputs[i];if(value===undefined){continue;}
if(context!==undefined&&typeof value==='function'){value=value(context);cacheable=false;}
if(index!==undefined&&isArray(value)){value=value[index%value.length];cacheable=false;}
if(value!==undefined){if(info&&!cacheable){info.cacheable=false;}
return value;}}}
function _addGrace(minmax,grace,beginAtZero){const{min,max}=minmax;const change=toDimension(grace,(max-min)/2);const keepZero=(value,add)=>beginAtZero&&value===0?0:value+add;return{min:keepZero(min,-Math.abs(change)),max:keepZero(max,change)};}
function createContext(parentContext,context){return Object.assign(Object.create(parentContext),context);}
const getRightToLeftAdapter=function(rectX,width){return{x(x){return rectX+rectX+width-x;},setWidth(w){width=w;},textAlign(align){if(align==='center'){return align;}
return align==='right'?'left':'right';},xPlus(x,value){return x-value;},leftForLtr(x,itemWidth){return x-itemWidth;}};};const getLeftToRightAdapter=function(){return{x(x){return x;},setWidth(w){},textAlign(align){return align;},xPlus(x,value){return x+value;},leftForLtr(x,_itemWidth){return x;}};};function getRtlAdapter(rtl,rectX,width){return rtl?getRightToLeftAdapter(rectX,width):getLeftToRightAdapter();}
function overrideTextDirection(ctx,direction){let style,original;if(direction==='ltr'||direction==='rtl'){style=ctx.canvas.style;original=[style.getPropertyValue('direction'),style.getPropertyPriority('direction')];style.setProperty('direction',direction,'important');ctx.prevTextDirection=original;}}
function restoreTextDirection(ctx,original){if(original!==undefined){delete ctx.prevTextDirection;ctx.canvas.style.setProperty('direction',original[0],original[1]);}}
function propertyFn(property){if(property==='angle'){return{between:_angleBetween,compare:_angleDiff,normalize:_normalizeAngle};}
return{between:_isBetween,compare:(a,b)=>a-b,normalize:(x)=>x};}
function normalizeSegment({start,end,count,loop,style}){return{start:start%count,end:end%count,loop:loop&&(end-start+1)%count===0,style};}
function getSegment(segment,points,bounds){const{property,start:startBound,end:endBound}=bounds;const{between,normalize}=propertyFn(property);const count=points.length;let{start,end,loop}=segment;let i,ilen;if(loop){start+=count;end+=count;for(i=0,ilen=count;i<ilen;++i){if(!between(normalize(points[start%count][property]),startBound,endBound)){break;}
start--;end--;}
start%=count;end%=count;}
if(end<start){end+=count;}
return{start,end,loop,style:segment.style};}
function _boundSegment(segment,points,bounds){if(!bounds){return[segment];}
const{property,start:startBound,end:endBound}=bounds;const count=points.length;const{compare,between,normalize}=propertyFn(property);const{start,end,loop,style}=getSegment(segment,points,bounds);const result=[];let inside=false;let subStart=null;let value,point,prevValue;const startIsBefore=()=>between(startBound,prevValue,value)&&compare(startBound,prevValue)!==0;const endIsBefore=()=>compare(endBound,value)===0||between(endBound,prevValue,value);const shouldStart=()=>inside||startIsBefore();const shouldStop=()=>!inside||endIsBefore();for(let i=start,prev=start;i<=end;++i){point=points[i%count];if(point.skip){continue;}
value=normalize(point[property]);if(value===prevValue){continue;}
inside=between(value,startBound,endBound);if(subStart===null&&shouldStart()){subStart=compare(value,startBound)===0?i:prev;}
if(subStart!==null&&shouldStop()){result.push(normalizeSegment({start:subStart,end:i,loop,count,style}));subStart=null;}
prev=i;prevValue=value;}
if(subStart!==null){result.push(normalizeSegment({start:subStart,end,loop,count,style}));}
return result;}
function _boundSegments(line,bounds){const result=[];const segments=line.segments;for(let i=0;i<segments.length;i++){const sub=_boundSegment(segments[i],line.points,bounds);if(sub.length){result.push(...sub);}}
return result;}
function findStartAndEnd(points,count,loop,spanGaps){let start=0;let end=count-1;if(loop&&!spanGaps){while(start<count&&!points[start].skip){start++;}}
while(start<count&&points[start].skip){start++;}
start%=count;if(loop){end+=start;}
while(end>start&&points[end%count].skip){end--;}
end%=count;return{start,end};}
function solidSegments(points,start,max,loop){const count=points.length;const result=[];let last=start;let prev=points[start];let end;for(end=start+1;end<=max;++end){const cur=points[end%count];if(cur.skip||cur.stop){if(!prev.skip){loop=false;result.push({start:start%count,end:(end-1)%count,loop});start=last=cur.stop?end:null;}}else{last=end;if(prev.skip){start=end;}}
prev=cur;}
if(last!==null){result.push({start:start%count,end:last%count,loop});}
return result;}
function _computeSegments(line,segmentOptions){const points=line.points;const spanGaps=line.options.spanGaps;const count=points.length;if(!count){return[];}
const loop=!!line._loop;const{start,end}=findStartAndEnd(points,count,loop,spanGaps);if(spanGaps===true){return splitByStyles(line,[{start,end,loop}],points,segmentOptions);}
const max=end<start?end+count:end;const completeLoop=!!line._fullLoop&&start===0&&end===count-1;return splitByStyles(line,solidSegments(points,start,max,completeLoop),points,segmentOptions);}
function splitByStyles(line,segments,points,segmentOptions){if(!segmentOptions||!segmentOptions.setContext||!points){return segments;}
return doSplitByStyles(line,segments,points,segmentOptions);}
function doSplitByStyles(line,segments,points,segmentOptions){const chartContext=line._chart.getContext();const baseStyle=readStyle(line.options);const{_datasetIndex:datasetIndex,options:{spanGaps}}=line;const count=points.length;const result=[];let prevStyle=baseStyle;let start=segments[0].start;let i=start;function addStyle(s,e,l,st){const dir=spanGaps?-1:1;if(s===e){return;}
s+=count;while(points[s%count].skip){s-=dir;}
while(points[e%count].skip){e+=dir;}
if(s%count!==e%count){result.push({start:s%count,end:e%count,loop:l,style:st});prevStyle=st;start=e%count;}}
for(const segment of segments){start=spanGaps?start:segment.start;let prev=points[start%count];let style;for(i=start+1;i<=segment.end;i++){const pt=points[i%count];style=readStyle(segmentOptions.setContext(createContext(chartContext,{type:'segment',p0:prev,p1:pt,p0DataIndex:(i-1)%count,p1DataIndex:i%count,datasetIndex})));if(styleChanged(style,prevStyle)){addStyle(start,i-1,segment.loop,prevStyle);}
prev=pt;prevStyle=style;}
if(start<i-1){addStyle(start,i-1,segment.loop,prevStyle);}}
return result;}
function readStyle(options){return{backgroundColor:options.backgroundColor,borderCapStyle:options.borderCapStyle,borderDash:options.borderDash,borderDashOffset:options.borderDashOffset,borderJoinStyle:options.borderJoinStyle,borderWidth:options.borderWidth,borderColor:options.borderColor};}
function styleChanged(style,prevStyle){if(!prevStyle){return false;}
const cache=[];const replacer=function(key,value){if(!isPatternOrGradient(value)){return value;}
if(!cache.includes(value)){cache.push(value);}
return cache.indexOf(value);};return JSON.stringify(style,replacer)!==JSON.stringify(prevStyle,replacer);}
var helpers=Object.freeze({__proto__:null,HALF_PI:HALF_PI,INFINITY:INFINITY,PI:PI,PITAU:PITAU,QUARTER_PI:QUARTER_PI,RAD_PER_DEG:RAD_PER_DEG,TAU:TAU,TWO_THIRDS_PI:TWO_THIRDS_PI,_addGrace:_addGrace,_alignPixel:_alignPixel,_alignStartEnd:_alignStartEnd,_angleBetween:_angleBetween,_angleDiff:_angleDiff,_arrayUnique:_arrayUnique,_attachContext:_attachContext,_bezierCurveTo:_bezierCurveTo,_bezierInterpolation:_bezierInterpolation,_boundSegment:_boundSegment,_boundSegments:_boundSegments,_capitalize:_capitalize,_computeSegments:_computeSegments,_createResolver:_createResolver,_decimalPlaces:_decimalPlaces,_deprecated:_deprecated,_descriptors:_descriptors,_elementsEqual:_elementsEqual,_factorize:_factorize,_filterBetween:_filterBetween,_getParentNode:_getParentNode,_getStartAndCountOfVisiblePoints:_getStartAndCountOfVisiblePoints,_int16Range:_int16Range,_isBetween:_isBetween,_isClickEvent:_isClickEvent,_isDomSupported:_isDomSupported,_isPointInArea:_isPointInArea,_limitValue:_limitValue,_longestText:_longestText,_lookup:_lookup,_lookupByKey:_lookupByKey,_measureText:_measureText,_merger:_merger,_mergerIf:_mergerIf,_normalizeAngle:_normalizeAngle,_parseObjectDataRadialScale:_parseObjectDataRadialScale,_pointInLine:_pointInLine,_readValueToProps:_readValueToProps,_rlookupByKey:_rlookupByKey,_scaleRangesChanged:_scaleRangesChanged,_setMinAndMaxByKey:_setMinAndMaxByKey,_splitKey:_splitKey,_steppedInterpolation:_steppedInterpolation,_steppedLineTo:_steppedLineTo,_textX:_textX,_toLeftRightCenter:_toLeftRightCenter,_updateBezierControlPoints:_updateBezierControlPoints,addRoundedRectPath:addRoundedRectPath,almostEquals:almostEquals,almostWhole:almostWhole,callback:callback,clearCanvas:clearCanvas,clipArea:clipArea,clone:clone$1,color:color,createContext:createContext,debounce:debounce,defined:defined,distanceBetweenPoints:distanceBetweenPoints,drawPoint:drawPoint,drawPointLegend:drawPointLegend,each:each,easingEffects:effects,finiteOrDefault:finiteOrDefault,fontString:fontString,formatNumber:formatNumber,getAngleFromPoint:getAngleFromPoint,getHoverColor:getHoverColor,getMaximumSize:getMaximumSize,getRelativePosition:getRelativePosition,getRtlAdapter:getRtlAdapter,getStyle:getStyle,isArray:isArray,isFinite:isNumberFinite,isFunction:isFunction,isNullOrUndef:isNullOrUndef,isNumber:isNumber,isObject:isObject,isPatternOrGradient:isPatternOrGradient,listenArrayEvents:listenArrayEvents,log10:log10,merge:merge,mergeIf:mergeIf,niceNum:niceNum,noop:noop,overrideTextDirection:overrideTextDirection,readUsedSize:readUsedSize,renderText:renderText,requestAnimFrame:requestAnimFrame,resolve:resolve,resolveObjectKey:resolveObjectKey,restoreTextDirection:restoreTextDirection,retinaScale:retinaScale,setsEqual:setsEqual,sign:sign,splineCurve:splineCurve,splineCurveMonotone:splineCurveMonotone,supportsEventListenerOptions:supportsEventListenerOptions,throttled:throttled,toDegrees:toDegrees,toDimension:toDimension,toFont:toFont,toFontString:toFontString,toLineHeight:toLineHeight,toPadding:toPadding,toPercentage:toPercentage,toRadians:toRadians,toTRBL:toTRBL,toTRBLCorners:toTRBLCorners,uid:uid,unclipArea:unclipArea,unlistenArrayEvents:unlistenArrayEvents,valueOrDefault:valueOrDefault});function binarySearch(metaset,axis,value,intersect){const{controller,data,_sorted}=metaset;const iScale=controller._cachedMeta.iScale;if(iScale&&axis===iScale.axis&&axis!=='r'&&_sorted&&data.length){const lookupMethod=iScale._reversePixels?_rlookupByKey:_lookupByKey;if(!intersect){return lookupMethod(data,axis,value);}else if(controller._sharedOptions){const el=data[0];const range=typeof el.getRange==='function'&&el.getRange(axis);if(range){const start=lookupMethod(data,axis,value-range);const end=lookupMethod(data,axis,value+range);return{lo:start.lo,hi:end.hi};}}}
return{lo:0,hi:data.length-1};}
function evaluateInteractionItems(chart,axis,position,handler,intersect){const metasets=chart.getSortedVisibleDatasetMetas();const value=position[axis];for(let i=0,ilen=metasets.length;i<ilen;++i){const{index,data}=metasets[i];const{lo,hi}=binarySearch(metasets[i],axis,value,intersect);for(let j=lo;j<=hi;++j){const element=data[j];if(!element.skip){handler(element,index,j);}}}}
function getDistanceMetricForAxis(axis){const useX=axis.indexOf('x')!==-1;const useY=axis.indexOf('y')!==-1;return function(pt1,pt2){const deltaX=useX?Math.abs(pt1.x-pt2.x):0;const deltaY=useY?Math.abs(pt1.y-pt2.y):0;return Math.sqrt(Math.pow(deltaX,2)+Math.pow(deltaY,2));};}
function getIntersectItems(chart,position,axis,useFinalPosition,includeInvisible){const items=[];if(!includeInvisible&&!chart.isPointInArea(position)){return items;}
const evaluationFunc=function(element,datasetIndex,index){if(!includeInvisible&&!_isPointInArea(element,chart.chartArea,0)){return;}
if(element.inRange(position.x,position.y,useFinalPosition)){items.push({element,datasetIndex,index});}};evaluateInteractionItems(chart,axis,position,evaluationFunc,true);return items;}
function getNearestRadialItems(chart,position,axis,useFinalPosition){let items=[];function evaluationFunc(element,datasetIndex,index){const{startAngle,endAngle}=element.getProps(['startAngle','endAngle'],useFinalPosition);const{angle}=getAngleFromPoint(element,{x:position.x,y:position.y});if(_angleBetween(angle,startAngle,endAngle)){items.push({element,datasetIndex,index});}}
evaluateInteractionItems(chart,axis,position,evaluationFunc);return items;}
function getNearestCartesianItems(chart,position,axis,intersect,useFinalPosition,includeInvisible){let items=[];const distanceMetric=getDistanceMetricForAxis(axis);let minDistance=Number.POSITIVE_INFINITY;function evaluationFunc(element,datasetIndex,index){const inRange=element.inRange(position.x,position.y,useFinalPosition);if(intersect&&!inRange){return;}
const center=element.getCenterPoint(useFinalPosition);const pointInArea=!!includeInvisible||chart.isPointInArea(center);if(!pointInArea&&!inRange){return;}
const distance=distanceMetric(position,center);if(distance<minDistance){items=[{element,datasetIndex,index}];minDistance=distance;}else if(distance===minDistance){items.push({element,datasetIndex,index});}}
evaluateInteractionItems(chart,axis,position,evaluationFunc);return items;}
function getNearestItems(chart,position,axis,intersect,useFinalPosition,includeInvisible){if(!includeInvisible&&!chart.isPointInArea(position)){return[];}
return axis==='r'&&!intersect?getNearestRadialItems(chart,position,axis,useFinalPosition):getNearestCartesianItems(chart,position,axis,intersect,useFinalPosition,includeInvisible);}
function getAxisItems(chart,position,axis,intersect,useFinalPosition){const items=[];const rangeMethod=axis==='x'?'inXRange':'inYRange';let intersectsItem=false;evaluateInteractionItems(chart,axis,position,(element,datasetIndex,index)=>{if(element[rangeMethod]&&element[rangeMethod](position[axis],useFinalPosition)){items.push({element,datasetIndex,index});intersectsItem=intersectsItem||element.inRange(position.x,position.y,useFinalPosition);}});if(intersect&&!intersectsItem){return[];}
return items;}
var Interaction={evaluateInteractionItems,modes:{index(chart,e,options,useFinalPosition){const position=getRelativePosition(e,chart);const axis=options.axis||'x';const includeInvisible=options.includeInvisible||false;const items=options.intersect?getIntersectItems(chart,position,axis,useFinalPosition,includeInvisible):getNearestItems(chart,position,axis,false,useFinalPosition,includeInvisible);const elements=[];if(!items.length){return[];}
chart.getSortedVisibleDatasetMetas().forEach((meta)=>{const index=items[0].index;const element=meta.data[index];if(element&&!element.skip){elements.push({element,datasetIndex:meta.index,index});}});return elements;},dataset(chart,e,options,useFinalPosition){const position=getRelativePosition(e,chart);const axis=options.axis||'xy';const includeInvisible=options.includeInvisible||false;let items=options.intersect?getIntersectItems(chart,position,axis,useFinalPosition,includeInvisible):getNearestItems(chart,position,axis,false,useFinalPosition,includeInvisible);if(items.length>0){const datasetIndex=items[0].datasetIndex;const data=chart.getDatasetMeta(datasetIndex).data;items=[];for(let i=0;i<data.length;++i){items.push({element:data[i],datasetIndex,index:i});}}
return items;},point(chart,e,options,useFinalPosition){const position=getRelativePosition(e,chart);const axis=options.axis||'xy';const includeInvisible=options.includeInvisible||false;return getIntersectItems(chart,position,axis,useFinalPosition,includeInvisible);},nearest(chart,e,options,useFinalPosition){const position=getRelativePosition(e,chart);const axis=options.axis||'xy';const includeInvisible=options.includeInvisible||false;return getNearestItems(chart,position,axis,options.intersect,useFinalPosition,includeInvisible);},x(chart,e,options,useFinalPosition){const position=getRelativePosition(e,chart);return getAxisItems(chart,position,'x',options.intersect,useFinalPosition);},y(chart,e,options,useFinalPosition){const position=getRelativePosition(e,chart);return getAxisItems(chart,position,'y',options.intersect,useFinalPosition);}}};const STATIC_POSITIONS=['left','top','right','bottom'];function filterByPosition(array,position){return array.filter((v)=>v.pos===position);}
function filterDynamicPositionByAxis(array,axis){return array.filter((v)=>STATIC_POSITIONS.indexOf(v.pos)===-1&&v.box.axis===axis);}
function sortByWeight(array,reverse){return array.sort((a,b)=>{const v0=reverse?b:a;const v1=reverse?a:b;return v0.weight===v1.weight?v0.index-v1.index:v0.weight-v1.weight;});}
function wrapBoxes(boxes){const layoutBoxes=[];let i,ilen,box,pos,stack,stackWeight;for(i=0,ilen=(boxes||[]).length;i<ilen;++i){box=boxes[i];({position:pos,options:{stack,stackWeight=1}}=box);layoutBoxes.push({index:i,box,pos,horizontal:box.isHorizontal(),weight:box.weight,stack:stack&&pos+stack,stackWeight});}
return layoutBoxes;}
function buildStacks(layouts){const stacks={};for(const wrap of layouts){const{stack,pos,stackWeight}=wrap;if(!stack||!STATIC_POSITIONS.includes(pos)){continue;}
const _stack=stacks[stack]||(stacks[stack]={count:0,placed:0,weight:0,size:0});_stack.count++;_stack.weight+=stackWeight;}
return stacks;}
function setLayoutDims(layouts,params){const stacks=buildStacks(layouts);const{vBoxMaxWidth,hBoxMaxHeight}=params;let i,ilen,layout;for(i=0,ilen=layouts.length;i<ilen;++i){layout=layouts[i];const{fullSize}=layout.box;const stack=stacks[layout.stack];const factor=stack&&layout.stackWeight/stack.weight;if(layout.horizontal){layout.width=factor?factor*vBoxMaxWidth:fullSize&&params.availableWidth;layout.height=hBoxMaxHeight;}else{layout.width=vBoxMaxWidth;layout.height=factor?factor*hBoxMaxHeight:fullSize&&params.availableHeight;}}
return stacks;}
function buildLayoutBoxes(boxes){const layoutBoxes=wrapBoxes(boxes);const fullSize=sortByWeight(layoutBoxes.filter((wrap)=>wrap.box.fullSize),true);const left=sortByWeight(filterByPosition(layoutBoxes,'left'),true);const right=sortByWeight(filterByPosition(layoutBoxes,'right'));const top=sortByWeight(filterByPosition(layoutBoxes,'top'),true);const bottom=sortByWeight(filterByPosition(layoutBoxes,'bottom'));const centerHorizontal=filterDynamicPositionByAxis(layoutBoxes,'x');const centerVertical=filterDynamicPositionByAxis(layoutBoxes,'y');return{fullSize,leftAndTop:left.concat(top),rightAndBottom:right.concat(centerVertical).concat(bottom).concat(centerHorizontal),chartArea:filterByPosition(layoutBoxes,'chartArea'),vertical:left.concat(right).concat(centerVertical),horizontal:top.concat(bottom).concat(centerHorizontal)};}
function getCombinedMax(maxPadding,chartArea,a,b){return Math.max(maxPadding[a],chartArea[a])+Math.max(maxPadding[b],chartArea[b]);}
function updateMaxPadding(maxPadding,boxPadding){maxPadding.top=Math.max(maxPadding.top,boxPadding.top);maxPadding.left=Math.max(maxPadding.left,boxPadding.left);maxPadding.bottom=Math.max(maxPadding.bottom,boxPadding.bottom);maxPadding.right=Math.max(maxPadding.right,boxPadding.right);}
function updateDims(chartArea,params,layout,stacks){const{pos,box}=layout;const maxPadding=chartArea.maxPadding;if(!isObject(pos)){if(layout.size){chartArea[pos]-=layout.size;}
const stack=stacks[layout.stack]||{size:0,count:1};stack.size=Math.max(stack.size,layout.horizontal?box.height:box.width);layout.size=stack.size/stack.count;chartArea[pos]+=layout.size;}
if(box.getPadding){updateMaxPadding(maxPadding,box.getPadding());}
const newWidth=Math.max(0,params.outerWidth-getCombinedMax(maxPadding,chartArea,'left','right'));const newHeight=Math.max(0,params.outerHeight-getCombinedMax(maxPadding,chartArea,'top','bottom'));const widthChanged=newWidth!==chartArea.w;const heightChanged=newHeight!==chartArea.h;chartArea.w=newWidth;chartArea.h=newHeight;return layout.horizontal?{same:widthChanged,other:heightChanged}:{same:heightChanged,other:widthChanged};}
function handleMaxPadding(chartArea){const maxPadding=chartArea.maxPadding;function updatePos(pos){const change=Math.max(maxPadding[pos]-chartArea[pos],0);chartArea[pos]+=change;return change;}
chartArea.y+=updatePos('top');chartArea.x+=updatePos('left');updatePos('right');updatePos('bottom');}
function getMargins(horizontal,chartArea){const maxPadding=chartArea.maxPadding;function marginForPositions(positions){const margin={left:0,top:0,right:0,bottom:0};positions.forEach((pos)=>{margin[pos]=Math.max(chartArea[pos],maxPadding[pos]);});return margin;}
return horizontal?marginForPositions(['left','right']):marginForPositions(['top','bottom']);}
function fitBoxes(boxes,chartArea,params,stacks){const refitBoxes=[];let i,ilen,layout,box,refit,changed;for(i=0,ilen=boxes.length,refit=0;i<ilen;++i){layout=boxes[i];box=layout.box;box.update(layout.width||chartArea.w,layout.height||chartArea.h,getMargins(layout.horizontal,chartArea));const{same,other}=updateDims(chartArea,params,layout,stacks);refit|=same&&refitBoxes.length;changed=changed||other;if(!box.fullSize){refitBoxes.push(layout);}}
return refit&&fitBoxes(refitBoxes,chartArea,params,stacks)||changed;}
function setBoxDims(box,left,top,width,height){box.top=top;box.left=left;box.right=left+width;box.bottom=top+height;box.width=width;box.height=height;}
function placeBoxes(boxes,chartArea,params,stacks){const userPadding=params.padding;let{x,y}=chartArea;for(const layout of boxes){const box=layout.box;const stack=stacks[layout.stack]||{count:1,placed:0,weight:1};const weight=layout.stackWeight/stack.weight||1;if(layout.horizontal){const width=chartArea.w*weight;const height=stack.size||box.height;if(defined(stack.start)){y=stack.start;}
if(box.fullSize){setBoxDims(box,userPadding.left,y,params.outerWidth-userPadding.right-userPadding.left,height);}else{setBoxDims(box,chartArea.left+stack.placed,y,width,height);}
stack.start=y;stack.placed+=width;y=box.bottom;}else{const height=chartArea.h*weight;const width=stack.size||box.width;if(defined(stack.start)){x=stack.start;}
if(box.fullSize){setBoxDims(box,x,userPadding.top,width,params.outerHeight-userPadding.bottom-userPadding.top);}else{setBoxDims(box,x,chartArea.top+stack.placed,width,height);}
stack.start=x;stack.placed+=height;x=box.right;}}
chartArea.x=x;chartArea.y=y;}
var layouts={addBox(chart,item){if(!chart.boxes){chart.boxes=[];}
item.fullSize=item.fullSize||false;item.position=item.position||'top';item.weight=item.weight||0;item._layers=item._layers||function(){return[{z:0,draw(chartArea){item.draw(chartArea);}}];};chart.boxes.push(item);},removeBox(chart,layoutItem){const index=chart.boxes?chart.boxes.indexOf(layoutItem):-1;if(index!==-1){chart.boxes.splice(index,1);}},configure(chart,item,options){item.fullSize=options.fullSize;item.position=options.position;item.weight=options.weight;},update(chart,width,height,minPadding){if(!chart){return;}
const padding=toPadding(chart.options.layout.padding);const availableWidth=Math.max(width-padding.width,0);const availableHeight=Math.max(height-padding.height,0);const boxes=buildLayoutBoxes(chart.boxes);const verticalBoxes=boxes.vertical;const horizontalBoxes=boxes.horizontal;each(chart.boxes,(box)=>{if(typeof box.beforeLayout==='function'){box.beforeLayout();}});const visibleVerticalBoxCount=verticalBoxes.reduce((total,wrap)=>wrap.box.options&&wrap.box.options.display===false?total:total+1,0)||1;const params=Object.freeze({outerWidth:width,outerHeight:height,padding,availableWidth,availableHeight,vBoxMaxWidth:availableWidth/2/visibleVerticalBoxCount,hBoxMaxHeight:availableHeight/2});const maxPadding=Object.assign({},padding);updateMaxPadding(maxPadding,toPadding(minPadding));const chartArea=Object.assign({maxPadding,w:availableWidth,h:availableHeight,x:padding.left,y:padding.top},padding);const stacks=setLayoutDims(verticalBoxes.concat(horizontalBoxes),params);fitBoxes(boxes.fullSize,chartArea,params,stacks);fitBoxes(verticalBoxes,chartArea,params,stacks);if(fitBoxes(horizontalBoxes,chartArea,params,stacks)){fitBoxes(verticalBoxes,chartArea,params,stacks);}
handleMaxPadding(chartArea);placeBoxes(boxes.leftAndTop,chartArea,params,stacks);chartArea.x+=chartArea.w;chartArea.y+=chartArea.h;placeBoxes(boxes.rightAndBottom,chartArea,params,stacks);chart.chartArea={left:chartArea.left,top:chartArea.top,right:chartArea.left+chartArea.w,bottom:chartArea.top+chartArea.h,height:chartArea.h,width:chartArea.w};each(boxes.chartArea,(layout)=>{const box=layout.box;Object.assign(box,chart.chartArea);box.update(chartArea.w,chartArea.h,{left:0,top:0,right:0,bottom:0});});}};class BasePlatform{acquireContext(canvas,aspectRatio){}
releaseContext(context){return false;}
addEventListener(chart,type,listener){}
removeEventListener(chart,type,listener){}
getDevicePixelRatio(){return 1;}
getMaximumSize(element,width,height,aspectRatio){width=Math.max(0,width||element.width);height=height||element.height;return{width,height:Math.max(0,aspectRatio?Math.floor(width/aspectRatio):height)};}
isAttached(canvas){return true;}
updateConfig(config){}}
class BasicPlatform extends BasePlatform{acquireContext(item){return item&&item.getContext&&item.getContext('2d')||null;}
updateConfig(config){config.options.animation=false;}}
const EXPANDO_KEY='$chartjs';const EVENT_TYPES={touchstart:'mousedown',touchmove:'mousemove',touchend:'mouseup',pointerenter:'mouseenter',pointerdown:'mousedown',pointermove:'mousemove',pointerup:'mouseup',pointerleave:'mouseout',pointerout:'mouseout'};const isNullOrEmpty=(value)=>value===null||value==='';function initCanvas(canvas,aspectRatio){const style=canvas.style;const renderHeight=canvas.getAttribute('height');const renderWidth=canvas.getAttribute('width');canvas[EXPANDO_KEY]={initial:{height:renderHeight,width:renderWidth,style:{display:style.display,height:style.height,width:style.width}}};style.display=style.display||'block';style.boxSizing=style.boxSizing||'border-box';if(isNullOrEmpty(renderWidth)){const displayWidth=readUsedSize(canvas,'width');if(displayWidth!==undefined){canvas.width=displayWidth;}}
if(isNullOrEmpty(renderHeight)){if(canvas.style.height===''){canvas.height=canvas.width/(aspectRatio||2);}else{const displayHeight=readUsedSize(canvas,'height');if(displayHeight!==undefined){canvas.height=displayHeight;}}}
return canvas;}
const eventListenerOptions=supportsEventListenerOptions?{passive:true}:false;function addListener(node,type,listener){if(node){node.addEventListener(type,listener,eventListenerOptions);}}
function removeListener(chart,type,listener){if(chart&&chart.canvas){chart.canvas.removeEventListener(type,listener,eventListenerOptions);}}
function fromNativeEvent(event,chart){const type=EVENT_TYPES[event.type]||event.type;const{x,y}=getRelativePosition(event,chart);return{type,chart,native:event,x:x!==undefined?x:null,y:y!==undefined?y:null};}
function nodeListContains(nodeList,canvas){for(const node of nodeList){if(node===canvas||node.contains(canvas)){return true;}}}
function createAttachObserver(chart,type,listener){const canvas=chart.canvas;const observer=new MutationObserver((entries)=>{let trigger=false;for(const entry of entries){trigger=trigger||nodeListContains(entry.addedNodes,canvas);trigger=trigger&&!nodeListContains(entry.removedNodes,canvas);}
if(trigger){listener();}});observer.observe(document,{childList:true,subtree:true});return observer;}
function createDetachObserver(chart,type,listener){const canvas=chart.canvas;const observer=new MutationObserver((entries)=>{let trigger=false;for(const entry of entries){trigger=trigger||nodeListContains(entry.removedNodes,canvas);trigger=trigger&&!nodeListContains(entry.addedNodes,canvas);}
if(trigger){listener();}});observer.observe(document,{childList:true,subtree:true});return observer;}
const drpListeningCharts=new Map();let oldDevicePixelRatio=0;function onWindowResize(){const dpr=window.devicePixelRatio;if(dpr===oldDevicePixelRatio){return;}
oldDevicePixelRatio=dpr;drpListeningCharts.forEach((resize,chart)=>{if(chart.currentDevicePixelRatio!==dpr){resize();}});}
function listenDevicePixelRatioChanges(chart,resize){if(!drpListeningCharts.size){window.addEventListener('resize',onWindowResize);}
drpListeningCharts.set(chart,resize);}
function unlistenDevicePixelRatioChanges(chart){drpListeningCharts.delete(chart);if(!drpListeningCharts.size){window.removeEventListener('resize',onWindowResize);}}
function createResizeObserver(chart,type,listener){const canvas=chart.canvas;const container=canvas&&_getParentNode(canvas);if(!container){return;}
const resize=throttled((width,height)=>{const w=container.clientWidth;listener(width,height);if(w<container.clientWidth){listener();}},window);const observer=new ResizeObserver((entries)=>{const entry=entries[0];const width=entry.contentRect.width;const height=entry.contentRect.height;if(width===0&&height===0){return;}
resize(width,height);});observer.observe(container);listenDevicePixelRatioChanges(chart,resize);return observer;}
function releaseObserver(chart,type,observer){if(observer){observer.disconnect();}
if(type==='resize'){unlistenDevicePixelRatioChanges(chart);}}
function createProxyAndListen(chart,type,listener){const canvas=chart.canvas;const proxy=throttled((event)=>{if(chart.ctx!==null){listener(fromNativeEvent(event,chart));}},chart);addListener(canvas,type,proxy);return proxy;}
class DomPlatform extends BasePlatform{acquireContext(canvas,aspectRatio){const context=canvas&&canvas.getContext&&canvas.getContext('2d');if(context&&context.canvas===canvas){initCanvas(canvas,aspectRatio);return context;}
return null;}
releaseContext(context){const canvas=context.canvas;if(!canvas[EXPANDO_KEY]){return false;}
const initial=canvas[EXPANDO_KEY].initial;['height','width'].forEach((prop)=>{const value=initial[prop];if(isNullOrUndef(value)){canvas.removeAttribute(prop);}else{canvas.setAttribute(prop,value);}});const style=initial.style||{};Object.keys(style).forEach((key)=>{canvas.style[key]=style[key];});canvas.width=canvas.width;delete canvas[EXPANDO_KEY];return true;}
addEventListener(chart,type,listener){this.removeEventListener(chart,type);const proxies=chart.$proxies||(chart.$proxies={});const handlers={attach:createAttachObserver,detach:createDetachObserver,resize:createResizeObserver};const handler=handlers[type]||createProxyAndListen;proxies[type]=handler(chart,type,listener);}
removeEventListener(chart,type){const proxies=chart.$proxies||(chart.$proxies={});const proxy=proxies[type];if(!proxy){return;}
const handlers={attach:releaseObserver,detach:releaseObserver,resize:releaseObserver};const handler=handlers[type]||removeListener;handler(chart,type,proxy);proxies[type]=undefined;}
getDevicePixelRatio(){return window.devicePixelRatio;}
getMaximumSize(canvas,width,height,aspectRatio){return getMaximumSize(canvas,width,height,aspectRatio);}
isAttached(canvas){const container=canvas&&_getParentNode(canvas);return!!(container&&container.isConnected);}}
function _detectPlatform(canvas){if(!_isDomSupported()||typeof OffscreenCanvas!=='undefined'&&canvas instanceof OffscreenCanvas){return BasicPlatform;}
return DomPlatform;}
var platforms=Object.freeze({__proto__:null,BasePlatform:BasePlatform,BasicPlatform:BasicPlatform,DomPlatform:DomPlatform,_detectPlatform:_detectPlatform});const transparent='transparent';const interpolators={boolean(from,to,factor){return factor>0.5?to:from;},color(from,to,factor){const c0=color(from||transparent);const c1=c0.valid&&color(to||transparent);return c1&&c1.valid?c1.mix(c0,factor).hexString():to;},number(from,to,factor){return from+(to-from)*factor;}};class Animation{constructor(cfg,target,prop,to){const currentValue=target[prop];to=resolve([cfg.to,to,currentValue,cfg.from]);const from=resolve([cfg.from,currentValue,to]);this._active=true;this._fn=cfg.fn||interpolators[cfg.type||typeof from];this._easing=effects[cfg.easing]||effects.linear;this._start=Math.floor(Date.now()+(cfg.delay||0));this._duration=this._total=Math.floor(cfg.duration);this._loop=!!cfg.loop;this._target=target;this._prop=prop;this._from=from;this._to=to;this._promises=undefined;}
active(){return this._active;}
update(cfg,to,date){if(this._active){this._notify(false);const currentValue=this._target[this._prop];const elapsed=date-this._start;const remain=this._duration-elapsed;this._start=date;this._duration=Math.floor(Math.max(remain,cfg.duration));this._total+=elapsed;this._loop=!!cfg.loop;this._to=resolve([cfg.to,to,currentValue,cfg.from]);this._from=resolve([cfg.from,currentValue,to]);}}
cancel(){if(this._active){this.tick(Date.now());this._active=false;this._notify(false);}}
tick(date){const elapsed=date-this._start;const duration=this._duration;const prop=this._prop;const from=this._from;const loop=this._loop;const to=this._to;let factor;this._active=from!==to&&(loop||elapsed<duration);if(!this._active){this._target[prop]=to;this._notify(true);return;}
if(elapsed<0){this._target[prop]=from;return;}
factor=elapsed/duration%2;factor=loop&&factor>1?2-factor:factor;factor=this._easing(Math.min(1,Math.max(0,factor)));this._target[prop]=this._fn(from,to,factor);}
wait(){const promises=this._promises||(this._promises=[]);return new Promise((res,rej)=>{promises.push({res,rej});});}
_notify(resolved){const method=resolved?'res':'rej';const promises=this._promises||[];for(let i=0;i<promises.length;i++){promises[i][method]();}}}
class Animations{constructor(chart,config){this._chart=chart;this._properties=new Map();this.configure(config);}
configure(config){if(!isObject(config)){return;}
const animationOptions=Object.keys(defaults.animation);const animatedProps=this._properties;Object.getOwnPropertyNames(config).forEach((key)=>{const cfg=config[key];if(!isObject(cfg)){return;}
const resolved={};for(const option of animationOptions){resolved[option]=cfg[option];}
(isArray(cfg.properties)&&cfg.properties||[key]).forEach((prop)=>{if(prop===key||!animatedProps.has(prop)){animatedProps.set(prop,resolved);}});});}
_animateOptions(target,values){const newOptions=values.options;const options=resolveTargetOptions(target,newOptions);if(!options){return[];}
const animations=this._createAnimations(options,newOptions);if(newOptions.$shared){awaitAll(target.options.$animations,newOptions).then(()=>{target.options=newOptions;},()=>{});}
return animations;}
_createAnimations(target,values){const animatedProps=this._properties;const animations=[];const running=target.$animations||(target.$animations={});const props=Object.keys(values);const date=Date.now();let i;for(i=props.length-1;i>=0;--i){const prop=props[i];if(prop.charAt(0)==='$'){continue;}
if(prop==='options'){animations.push(...this._animateOptions(target,values));continue;}
const value=values[prop];let animation=running[prop];const cfg=animatedProps.get(prop);if(animation){if(cfg&&animation.active()){animation.update(cfg,value,date);continue;}else{animation.cancel();}}
if(!cfg||!cfg.duration){target[prop]=value;continue;}
running[prop]=animation=new Animation(cfg,target,prop,value);animations.push(animation);}
return animations;}
update(target,values){if(this._properties.size===0){Object.assign(target,values);return;}
const animations=this._createAnimations(target,values);if(animations.length){animator.add(this._chart,animations);return true;}}}
function awaitAll(animations,properties){const running=[];const keys=Object.keys(properties);for(let i=0;i<keys.length;i++){const anim=animations[keys[i]];if(anim&&anim.active()){running.push(anim.wait());}}
return Promise.all(running);}
function resolveTargetOptions(target,newOptions){if(!newOptions){return;}
let options=target.options;if(!options){target.options=newOptions;return;}
if(options.$shared){target.options=options=Object.assign({},options,{$shared:false,$animations:{}});}
return options;}
function scaleClip(scale,allowedOverflow){const opts=scale&&scale.options||{};const reverse=opts.reverse;const min=opts.min===undefined?allowedOverflow:0;const max=opts.max===undefined?allowedOverflow:0;return{start:reverse?max:min,end:reverse?min:max};}
function defaultClip(xScale,yScale,allowedOverflow){if(allowedOverflow===false){return false;}
const x=scaleClip(xScale,allowedOverflow);const y=scaleClip(yScale,allowedOverflow);return{top:y.end,right:x.end,bottom:y.start,left:x.start};}
function toClip(value){let t,r,b,l;if(isObject(value)){t=value.top;r=value.right;b=value.bottom;l=value.left;}else{t=r=b=l=value;}
return{top:t,right:r,bottom:b,left:l,disabled:value===false};}
function getSortedDatasetIndices(chart,filterVisible){const keys=[];const metasets=chart._getSortedDatasetMetas(filterVisible);let i,ilen;for(i=0,ilen=metasets.length;i<ilen;++i){keys.push(metasets[i].index);}
return keys;}
function applyStack(stack,value,dsIndex,options={}){const keys=stack.keys;const singleMode=options.mode==='single';let i,ilen,datasetIndex,otherValue;if(value===null){return;}
for(i=0,ilen=keys.length;i<ilen;++i){datasetIndex=+keys[i];if(datasetIndex===dsIndex){if(options.all){continue;}
break;}
otherValue=stack.values[datasetIndex];if(isNumberFinite(otherValue)&&(singleMode||value===0||sign(value)===sign(otherValue))){value+=otherValue;}}
return value;}
function convertObjectDataToArray(data,meta){const{iScale,vScale}=meta;const iAxisKey=iScale.axis==='x'?'x':'y';const vAxisKey=vScale.axis==='x'?'x':'y';const keys=Object.keys(data);const adata=new Array(keys.length);let i,ilen,key;for(i=0,ilen=keys.length;i<ilen;++i){key=keys[i];adata[i]={[iAxisKey]:key,[vAxisKey]:data[key]};}
return adata;}
function isStacked(scale,meta){const stacked=scale&&scale.options.stacked;return stacked||stacked===undefined&&meta.stack!==undefined;}
function getStackKey(indexScale,valueScale,meta){return`${indexScale.id}.${valueScale.id}.${meta.stack || meta.type}`;}
function getUserBounds(scale){const{min,max,minDefined,maxDefined}=scale.getUserBounds();return{min:minDefined?min:Number.NEGATIVE_INFINITY,max:maxDefined?max:Number.POSITIVE_INFINITY};}
function getOrCreateStack(stacks,stackKey,indexValue){const subStack=stacks[stackKey]||(stacks[stackKey]={});return subStack[indexValue]||(subStack[indexValue]={});}
function getLastIndexInStack(stack,vScale,positive,type){for(const meta of vScale.getMatchingVisibleMetas(type).reverse()){const value=stack[meta.index];if(positive&&value>0||!positive&&value<0){return meta.index;}}
return null;}
function updateStacks(controller,parsed){const{chart,_cachedMeta:meta}=controller;const stacks=chart._stacks||(chart._stacks={});const{iScale,vScale,index:datasetIndex}=meta;const iAxis=iScale.axis;const vAxis=vScale.axis;const key=getStackKey(iScale,vScale,meta);const ilen=parsed.length;let stack;for(let i=0;i<ilen;++i){const item=parsed[i];const{[iAxis]:index,[vAxis]:value}=item;const itemStacks=item._stacks||(item._stacks={});stack=itemStacks[vAxis]=getOrCreateStack(stacks,key,index);stack[datasetIndex]=value;stack._top=getLastIndexInStack(stack,vScale,true,meta.type);stack._bottom=getLastIndexInStack(stack,vScale,false,meta.type);const visualValues=stack._visualValues||(stack._visualValues={});visualValues[datasetIndex]=value;}}
function getFirstScaleId(chart,axis){const scales=chart.scales;return Object.keys(scales).filter((key)=>scales[key].axis===axis).shift();}
function createDatasetContext(parent,index){return createContext(parent,{active:false,dataset:undefined,datasetIndex:index,index,mode:'default',type:'dataset'});}
function createDataContext(parent,index,element){return createContext(parent,{active:false,dataIndex:index,parsed:undefined,raw:undefined,element,index,mode:'default',type:'data'});}
function clearStacks(meta,items){const datasetIndex=meta.controller.index;const axis=meta.vScale&&meta.vScale.axis;if(!axis){return;}
items=items||meta._parsed;for(const parsed of items){const stacks=parsed._stacks;if(!stacks||stacks[axis]===undefined||stacks[axis][datasetIndex]===undefined){return;}
delete stacks[axis][datasetIndex];if(stacks[axis]._visualValues!==undefined&&stacks[axis]._visualValues[datasetIndex]!==undefined){delete stacks[axis]._visualValues[datasetIndex];}}}
const isDirectUpdateMode=(mode)=>mode==='reset'||mode==='none';const cloneIfNotShared=(cached,shared)=>shared?cached:Object.assign({},cached);const createStack=(canStack,meta,chart)=>canStack&&!meta.hidden&&meta._stacked&&{keys:getSortedDatasetIndices(chart,true),values:null};class DatasetController{static defaults={};static datasetElementType=null;static dataElementType=null;constructor(chart,datasetIndex){this.chart=chart;this._ctx=chart.ctx;this.index=datasetIndex;this._cachedDataOpts={};this._cachedMeta=this.getMeta();this._type=this._cachedMeta.type;this.options=undefined;this._parsing=false;this._data=undefined;this._objectData=undefined;this._sharedOptions=undefined;this._drawStart=undefined;this._drawCount=undefined;this.enableOptionSharing=false;this.supportsDecimation=false;this.$context=undefined;this._syncList=[];this.datasetElementType=new.target.datasetElementType;this.dataElementType=new.target.dataElementType;this.initialize();}
initialize(){const meta=this._cachedMeta;this.configure();this.linkScales();meta._stacked=isStacked(meta.vScale,meta);this.addElements();if(this.options.fill&&!this.chart.isPluginEnabled('filler')){console.warn("Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options");}}
updateIndex(datasetIndex){if(this.index!==datasetIndex){clearStacks(this._cachedMeta);}
this.index=datasetIndex;}
linkScales(){const chart=this.chart;const meta=this._cachedMeta;const dataset=this.getDataset();const chooseId=(axis,x,y,r)=>axis==='x'?x:axis==='r'?r:y;const xid=meta.xAxisID=valueOrDefault(dataset.xAxisID,getFirstScaleId(chart,'x'));const yid=meta.yAxisID=valueOrDefault(dataset.yAxisID,getFirstScaleId(chart,'y'));const rid=meta.rAxisID=valueOrDefault(dataset.rAxisID,getFirstScaleId(chart,'r'));const indexAxis=meta.indexAxis;const iid=meta.iAxisID=chooseId(indexAxis,xid,yid,rid);const vid=meta.vAxisID=chooseId(indexAxis,yid,xid,rid);meta.xScale=this.getScaleForId(xid);meta.yScale=this.getScaleForId(yid);meta.rScale=this.getScaleForId(rid);meta.iScale=this.getScaleForId(iid);meta.vScale=this.getScaleForId(vid);}
getDataset(){return this.chart.data.datasets[this.index];}
getMeta(){return this.chart.getDatasetMeta(this.index);}
getScaleForId(scaleID){return this.chart.scales[scaleID];}
_getOtherScale(scale){const meta=this._cachedMeta;return scale===meta.iScale?meta.vScale:meta.iScale;}
reset(){this._update('reset');}
_destroy(){const meta=this._cachedMeta;if(this._data){unlistenArrayEvents(this._data,this);}
if(meta._stacked){clearStacks(meta);}}
_dataCheck(){const dataset=this.getDataset();const data=dataset.data||(dataset.data=[]);const _data=this._data;if(isObject(data)){const meta=this._cachedMeta;this._data=convertObjectDataToArray(data,meta);}else if(_data!==data){if(_data){unlistenArrayEvents(_data,this);const meta=this._cachedMeta;clearStacks(meta);meta._parsed=[];}
if(data&&Object.isExtensible(data)){listenArrayEvents(data,this);}
this._syncList=[];this._data=data;}}
addElements(){const meta=this._cachedMeta;this._dataCheck();if(this.datasetElementType){meta.dataset=new this.datasetElementType();}}
buildOrUpdateElements(resetNewElements){const meta=this._cachedMeta;const dataset=this.getDataset();let stackChanged=false;this._dataCheck();const oldStacked=meta._stacked;meta._stacked=isStacked(meta.vScale,meta);if(meta.stack!==dataset.stack){stackChanged=true;clearStacks(meta);meta.stack=dataset.stack;}
this._resyncElements(resetNewElements);if(stackChanged||oldStacked!==meta._stacked){updateStacks(this,meta._parsed);meta._stacked=isStacked(meta.vScale,meta);}}
configure(){const config=this.chart.config;const scopeKeys=config.datasetScopeKeys(this._type);const scopes=config.getOptionScopes(this.getDataset(),scopeKeys,true);this.options=config.createResolver(scopes,this.getContext());this._parsing=this.options.parsing;this._cachedDataOpts={};}
parse(start,count){const{_cachedMeta:meta,_data:data}=this;const{iScale,_stacked}=meta;const iAxis=iScale.axis;let sorted=start===0&&count===data.length?true:meta._sorted;let prev=start>0&&meta._parsed[start-1];let i,cur,parsed;if(this._parsing===false){meta._parsed=data;meta._sorted=true;parsed=data;}else{if(isArray(data[start])){parsed=this.parseArrayData(meta,data,start,count);}else if(isObject(data[start])){parsed=this.parseObjectData(meta,data,start,count);}else{parsed=this.parsePrimitiveData(meta,data,start,count);}
const isNotInOrderComparedToPrev=()=>cur[iAxis]===null||prev&&cur[iAxis]<prev[iAxis];for(i=0;i<count;++i){meta._parsed[i+start]=cur=parsed[i];if(sorted){if(isNotInOrderComparedToPrev()){sorted=false;}
prev=cur;}}
meta._sorted=sorted;}
if(_stacked){updateStacks(this,parsed);}}
parsePrimitiveData(meta,data,start,count){const{iScale,vScale}=meta;const iAxis=iScale.axis;const vAxis=vScale.axis;const labels=iScale.getLabels();const singleScale=iScale===vScale;const parsed=new Array(count);let i,ilen,index;for(i=0,ilen=count;i<ilen;++i){index=i+start;parsed[i]={[iAxis]:singleScale||iScale.parse(labels[index],index),[vAxis]:vScale.parse(data[index],index)};}
return parsed;}
parseArrayData(meta,data,start,count){const{xScale,yScale}=meta;const parsed=new Array(count);let i,ilen,index,item;for(i=0,ilen=count;i<ilen;++i){index=i+start;item=data[index];parsed[i]={x:xScale.parse(item[0],index),y:yScale.parse(item[1],index)};}
return parsed;}
parseObjectData(meta,data,start,count){const{xScale,yScale}=meta;const{xAxisKey='x',yAxisKey='y'}=this._parsing;const parsed=new Array(count);let i,ilen,index,item;for(i=0,ilen=count;i<ilen;++i){index=i+start;item=data[index];parsed[i]={x:xScale.parse(resolveObjectKey(item,xAxisKey),index),y:yScale.parse(resolveObjectKey(item,yAxisKey),index)};}
return parsed;}
getParsed(index){return this._cachedMeta._parsed[index];}
getDataElement(index){return this._cachedMeta.data[index];}
applyStack(scale,parsed,mode){const chart=this.chart;const meta=this._cachedMeta;const value=parsed[scale.axis];const stack={keys:getSortedDatasetIndices(chart,true),values:parsed._stacks[scale.axis]._visualValues};return applyStack(stack,value,meta.index,{mode});}
updateRangeFromParsed(range,scale,parsed,stack){const parsedValue=parsed[scale.axis];let value=parsedValue===null?NaN:parsedValue;const values=stack&&parsed._stacks[scale.axis];if(stack&&values){stack.values=values;value=applyStack(stack,parsedValue,this._cachedMeta.index);}
range.min=Math.min(range.min,value);range.max=Math.max(range.max,value);}
getMinMax(scale,canStack){const meta=this._cachedMeta;const _parsed=meta._parsed;const sorted=meta._sorted&&scale===meta.iScale;const ilen=_parsed.length;const otherScale=this._getOtherScale(scale);const stack=createStack(canStack,meta,this.chart);const range={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY};const{min:otherMin,max:otherMax}=getUserBounds(otherScale);let i,parsed;function _skip(){parsed=_parsed[i];const otherValue=parsed[otherScale.axis];return!isNumberFinite(parsed[scale.axis])||otherMin>otherValue||otherMax<otherValue;}
for(i=0;i<ilen;++i){if(_skip()){continue;}
this.updateRangeFromParsed(range,scale,parsed,stack);if(sorted){break;}}
if(sorted){for(i=ilen-1;i>=0;--i){if(_skip()){continue;}
this.updateRangeFromParsed(range,scale,parsed,stack);break;}}
return range;}
getAllParsedValues(scale){const parsed=this._cachedMeta._parsed;const values=[];let i,ilen,value;for(i=0,ilen=parsed.length;i<ilen;++i){value=parsed[i][scale.axis];if(isNumberFinite(value)){values.push(value);}}
return values;}
getMaxOverflow(){return false;}
getLabelAndValue(index){const meta=this._cachedMeta;const iScale=meta.iScale;const vScale=meta.vScale;const parsed=this.getParsed(index);return{label:iScale?''+iScale.getLabelForValue(parsed[iScale.axis]):'',value:vScale?''+vScale.getLabelForValue(parsed[vScale.axis]):''};}
_update(mode){const meta=this._cachedMeta;this.update(mode||'default');meta._clip=toClip(valueOrDefault(this.options.clip,defaultClip(meta.xScale,meta.yScale,this.getMaxOverflow())));}
update(mode){}
draw(){const ctx=this._ctx;const chart=this.chart;const meta=this._cachedMeta;const elements=meta.data||[];const area=chart.chartArea;const active=[];const start=this._drawStart||0;const count=this._drawCount||elements.length-start;const drawActiveElementsOnTop=this.options.drawActiveElementsOnTop;let i;if(meta.dataset){meta.dataset.draw(ctx,area,start,count);}
for(i=start;i<start+count;++i){const element=elements[i];if(element.hidden){continue;}
if(element.active&&drawActiveElementsOnTop){active.push(element);}else{element.draw(ctx,area);}}
for(i=0;i<active.length;++i){active[i].draw(ctx,area);}}
getStyle(index,active){const mode=active?'active':'default';return index===undefined&&this._cachedMeta.dataset?this.resolveDatasetElementOptions(mode):this.resolveDataElementOptions(index||0,mode);}
getContext(index,active,mode){const dataset=this.getDataset();let context;if(index>=0&&index<this._cachedMeta.data.length){const element=this._cachedMeta.data[index];context=element.$context||(element.$context=createDataContext(this.getContext(),index,element));context.parsed=this.getParsed(index);context.raw=dataset.data[index];context.index=context.dataIndex=index;}else{context=this.$context||(this.$context=createDatasetContext(this.chart.getContext(),this.index));context.dataset=dataset;context.index=context.datasetIndex=this.index;}
context.active=!!active;context.mode=mode;return context;}
resolveDatasetElementOptions(mode){return this._resolveElementOptions(this.datasetElementType.id,mode);}
resolveDataElementOptions(index,mode){return this._resolveElementOptions(this.dataElementType.id,mode,index);}
_resolveElementOptions(elementType,mode='default',index){const active=mode==='active';const cache=this._cachedDataOpts;const cacheKey=elementType+'-'+mode;const cached=cache[cacheKey];const sharing=this.enableOptionSharing&&defined(index);if(cached){return cloneIfNotShared(cached,sharing);}
const config=this.chart.config;const scopeKeys=config.datasetElementScopeKeys(this._type,elementType);const prefixes=active?[`${elementType}Hover`,'hover',elementType,'']:[elementType,''];const scopes=config.getOptionScopes(this.getDataset(),scopeKeys);const names=Object.keys(defaults.elements[elementType]);const context=()=>this.getContext(index,active,mode);const values=config.resolveNamedOptions(scopes,names,context,prefixes);if(values.$shared){values.$shared=sharing;cache[cacheKey]=Object.freeze(cloneIfNotShared(values,sharing));}
return values;}
_resolveAnimations(index,transition,active){const chart=this.chart;const cache=this._cachedDataOpts;const cacheKey=`animation-${transition}`;const cached=cache[cacheKey];if(cached){return cached;}
let options;if(chart.options.animation!==false){const config=this.chart.config;const scopeKeys=config.datasetAnimationScopeKeys(this._type,transition);const scopes=config.getOptionScopes(this.getDataset(),scopeKeys);options=config.createResolver(scopes,this.getContext(index,active,transition));}
const animations=new Animations(chart,options&&options.animations);if(options&&options._cacheable){cache[cacheKey]=Object.freeze(animations);}
return animations;}
getSharedOptions(options){if(!options.$shared){return;}
return this._sharedOptions||(this._sharedOptions=Object.assign({},options));}
includeOptions(mode,sharedOptions){return!sharedOptions||isDirectUpdateMode(mode)||this.chart._animationsDisabled;}
_getSharedOptions(start,mode){const firstOpts=this.resolveDataElementOptions(start,mode);const previouslySharedOptions=this._sharedOptions;const sharedOptions=this.getSharedOptions(firstOpts);const includeOptions=this.includeOptions(mode,sharedOptions)||sharedOptions!==previouslySharedOptions;this.updateSharedOptions(sharedOptions,mode,firstOpts);return{sharedOptions,includeOptions};}
updateElement(element,index,properties,mode){if(isDirectUpdateMode(mode)){Object.assign(element,properties);}else{this._resolveAnimations(index,mode).update(element,properties);}}
updateSharedOptions(sharedOptions,mode,newOptions){if(sharedOptions&&!isDirectUpdateMode(mode)){this._resolveAnimations(undefined,mode).update(sharedOptions,newOptions);}}
_setStyle(element,index,mode,active){element.active=active;const options=this.getStyle(index,active);this._resolveAnimations(index,mode,active).update(element,{options:!active&&this.getSharedOptions(options)||options});}
removeHoverStyle(element,datasetIndex,index){this._setStyle(element,index,'active',false);}
setHoverStyle(element,datasetIndex,index){this._setStyle(element,index,'active',true);}
_removeDatasetHoverStyle(){const element=this._cachedMeta.dataset;if(element){this._setStyle(element,undefined,'active',false);}}
_setDatasetHoverStyle(){const element=this._cachedMeta.dataset;if(element){this._setStyle(element,undefined,'active',true);}}
_resyncElements(resetNewElements){const data=this._data;const elements=this._cachedMeta.data;for(const[method,arg1,arg2]of this._syncList){this[method](arg1,arg2);}
this._syncList=[];const numMeta=elements.length;const numData=data.length;const count=Math.min(numData,numMeta);if(count){this.parse(0,count);}
if(numData>numMeta){this._insertElements(numMeta,numData-numMeta,resetNewElements);}else if(numData<numMeta){this._removeElements(numData,numMeta-numData);}}
_insertElements(start,count,resetNewElements=true){const meta=this._cachedMeta;const data=meta.data;const end=start+count;let i;const move=(arr)=>{arr.length+=count;for(i=arr.length-1;i>=end;i--){arr[i]=arr[i-count];}};move(data);for(i=start;i<end;++i){data[i]=new this.dataElementType();}
if(this._parsing){move(meta._parsed);}
this.parse(start,count);if(resetNewElements){this.updateElements(data,start,count,'reset');}}
updateElements(element,start,count,mode){}
_removeElements(start,count){const meta=this._cachedMeta;if(this._parsing){const removed=meta._parsed.splice(start,count);if(meta._stacked){clearStacks(meta,removed);}}
meta.data.splice(start,count);}
_sync(args){if(this._parsing){this._syncList.push(args);}else{const[method,arg1,arg2]=args;this[method](arg1,arg2);}
this.chart._dataChanges.push([this.index,...args]);}
_onDataPush(){const count=arguments.length;this._sync(['_insertElements',this.getDataset().data.length-count,count]);}
_onDataPop(){this._sync(['_removeElements',this._cachedMeta.data.length-1,1]);}
_onDataShift(){this._sync(['_removeElements',0,1]);}
_onDataSplice(start,count){if(count){this._sync(['_removeElements',start,count]);}
const newCount=arguments.length-2;if(newCount){this._sync(['_insertElements',start,newCount]);}}
_onDataUnshift(){this._sync(['_insertElements',0,arguments.length]);}}
class Element{static defaults={};static defaultRoutes=undefined;x;y;active=false;options;$animations;tooltipPosition(useFinalPosition){const{x,y}=this.getProps(['x','y'],useFinalPosition);return{x,y};}
hasValue(){return isNumber(this.x)&&isNumber(this.y);}
getProps(props,final){const anims=this.$animations;if(!final||!anims){return this;}
const ret={};props.forEach((prop)=>{ret[prop]=anims[prop]&&anims[prop].active()?anims[prop]._to:this[prop];});return ret;}}
function autoSkip(scale,ticks){const tickOpts=scale.options.ticks;const determinedMaxTicks=determineMaxTicks(scale);const ticksLimit=Math.min(tickOpts.maxTicksLimit||determinedMaxTicks,determinedMaxTicks);const majorIndices=tickOpts.major.enabled?getMajorIndices(ticks):[];const numMajorIndices=majorIndices.length;const first=majorIndices[0];const last=majorIndices[numMajorIndices-1];const newTicks=[];if(numMajorIndices>ticksLimit){skipMajors(ticks,newTicks,majorIndices,numMajorIndices/ticksLimit);return newTicks;}
const spacing=calculateSpacing(majorIndices,ticks,ticksLimit);if(numMajorIndices>0){let i,ilen;const avgMajorSpacing=numMajorIndices>1?Math.round((last-first)/(numMajorIndices-1)):null;skip(ticks,newTicks,spacing,isNullOrUndef(avgMajorSpacing)?0:first-avgMajorSpacing,first);for(i=0,ilen=numMajorIndices-1;i<ilen;i++){skip(ticks,newTicks,spacing,majorIndices[i],majorIndices[i+1]);}
skip(ticks,newTicks,spacing,last,isNullOrUndef(avgMajorSpacing)?ticks.length:last+avgMajorSpacing);return newTicks;}
skip(ticks,newTicks,spacing);return newTicks;}
function determineMaxTicks(scale){const offset=scale.options.offset;const tickLength=scale._tickSize();const maxScale=scale._length/tickLength+(offset?0:1);const maxChart=scale._maxLength/tickLength;return Math.floor(Math.min(maxScale,maxChart));}
function calculateSpacing(majorIndices,ticks,ticksLimit){const evenMajorSpacing=getEvenSpacing(majorIndices);const spacing=ticks.length/ticksLimit;if(!evenMajorSpacing){return Math.max(spacing,1);}
const factors=_factorize(evenMajorSpacing);for(let i=0,ilen=factors.length-1;i<ilen;i++){const factor=factors[i];if(factor>spacing){return factor;}}
return Math.max(spacing,1);}
function getMajorIndices(ticks){const result=[];let i,ilen;for(i=0,ilen=ticks.length;i<ilen;i++){if(ticks[i].major){result.push(i);}}
return result;}
function skipMajors(ticks,newTicks,majorIndices,spacing){let count=0;let next=majorIndices[0];let i;spacing=Math.ceil(spacing);for(i=0;i<ticks.length;i++){if(i===next){newTicks.push(ticks[i]);count++;next=majorIndices[count*spacing];}}}
function skip(ticks,newTicks,spacing,majorStart,majorEnd){const start=valueOrDefault(majorStart,0);const end=Math.min(valueOrDefault(majorEnd,ticks.length),ticks.length);let count=0;let length,i,next;spacing=Math.ceil(spacing);if(majorEnd){length=majorEnd-majorStart;spacing=length/Math.floor(length/spacing);}
next=start;while(next<0){count++;next=Math.round(start+count*spacing);}
for(i=Math.max(start,0);i<end;i++){if(i===next){newTicks.push(ticks[i]);count++;next=Math.round(start+count*spacing);}}}
function getEvenSpacing(arr){const len=arr.length;let i,diff;if(len<2){return false;}
for(diff=arr[0],i=1;i<len;++i){if(arr[i]-arr[i-1]!==diff){return false;}}
return diff;}
const reverseAlign=(align)=>align==='left'?'right':align==='right'?'left':align;const offsetFromEdge=(scale,edge,offset)=>edge==='top'||edge==='left'?scale[edge]+offset:scale[edge]-offset;const getTicksLimit=(ticksLength,maxTicksLimit)=>Math.min(maxTicksLimit||ticksLength,ticksLength);function sample(arr,numItems){const result=[];const increment=arr.length/numItems;const len=arr.length;let i=0;for(;i<len;i+=increment){result.push(arr[Math.floor(i)]);}
return result;}
function getPixelForGridLine(scale,index,offsetGridLines){const length=scale.ticks.length;const validIndex=Math.min(index,length-1);const start=scale._startPixel;const end=scale._endPixel;const epsilon=1e-6;let lineValue=scale.getPixelForTick(validIndex);let offset;if(offsetGridLines){if(length===1){offset=Math.max(lineValue-start,end-lineValue);}else if(index===0){offset=(scale.getPixelForTick(1)-lineValue)/2;}else{offset=(lineValue-scale.getPixelForTick(validIndex-1))/2;}
lineValue+=validIndex<index?offset:-offset;if(lineValue<start-epsilon||lineValue>end+epsilon){return;}}
return lineValue;}
function garbageCollect(caches,length){each(caches,(cache)=>{const gc=cache.gc;const gcLen=gc.length/2;let i;if(gcLen>length){for(i=0;i<gcLen;++i){delete cache.data[gc[i]];}
gc.splice(0,gcLen);}});}
function getTickMarkLength(options){return options.drawTicks?options.tickLength:0;}
function getTitleHeight(options,fallback){if(!options.display){return 0;}
const font=toFont(options.font,fallback);const padding=toPadding(options.padding);const lines=isArray(options.text)?options.text.length:1;return lines*font.lineHeight+padding.height;}
function createScaleContext(parent,scale){return createContext(parent,{scale,type:'scale'});}
function createTickContext(parent,index,tick){return createContext(parent,{tick,index,type:'tick'});}
function titleAlign(align,position,reverse){let ret=_toLeftRightCenter(align);if(reverse&&position!=='right'||!reverse&&position==='right'){ret=reverseAlign(ret);}
return ret;}
function titleArgs(scale,offset,position,align){const{top,left,bottom,right,chart}=scale;const{chartArea,scales}=chart;let rotation=0;let maxWidth,titleX,titleY;const height=bottom-top;const width=right-left;if(scale.isHorizontal()){titleX=_alignStartEnd(align,left,right);if(isObject(position)){const positionAxisID=Object.keys(position)[0];const value=position[positionAxisID];titleY=scales[positionAxisID].getPixelForValue(value)+height-offset;}else if(position==='center'){titleY=(chartArea.bottom+chartArea.top)/2+height-offset;}else{titleY=offsetFromEdge(scale,position,offset);}
maxWidth=right-left;}else{if(isObject(position)){const positionAxisID=Object.keys(position)[0];const value=position[positionAxisID];titleX=scales[positionAxisID].getPixelForValue(value)-width+offset;}else if(position==='center'){titleX=(chartArea.left+chartArea.right)/2-width+offset;}else{titleX=offsetFromEdge(scale,position,offset);}
titleY=_alignStartEnd(align,bottom,top);rotation=position==='left'?-HALF_PI:HALF_PI;}
return{titleX,titleY,maxWidth,rotation};}
class Scale extends Element{constructor(cfg){super();this.id=cfg.id;this.type=cfg.type;this.options=undefined;this.ctx=cfg.ctx;this.chart=cfg.chart;this.top=undefined;this.bottom=undefined;this.left=undefined;this.right=undefined;this.width=undefined;this.height=undefined;this._margins={left:0,right:0,top:0,bottom:0};this.maxWidth=undefined;this.maxHeight=undefined;this.paddingTop=undefined;this.paddingBottom=undefined;this.paddingLeft=undefined;this.paddingRight=undefined;this.axis=undefined;this.labelRotation=undefined;this.min=undefined;this.max=undefined;this._range=undefined;this.ticks=[];this._gridLineItems=null;this._labelItems=null;this._labelSizes=null;this._length=0;this._maxLength=0;this._longestTextCache={};this._startPixel=undefined;this._endPixel=undefined;this._reversePixels=false;this._userMax=undefined;this._userMin=undefined;this._suggestedMax=undefined;this._suggestedMin=undefined;this._ticksLength=0;this._borderValue=0;this._cache={};this._dataLimitsCached=false;this.$context=undefined;}
init(options){this.options=options.setContext(this.getContext());this.axis=options.axis;this._userMin=this.parse(options.min);this._userMax=this.parse(options.max);this._suggestedMin=this.parse(options.suggestedMin);this._suggestedMax=this.parse(options.suggestedMax);}
parse(raw,index){return raw;}
getUserBounds(){let{_userMin,_userMax,_suggestedMin,_suggestedMax}=this;_userMin=finiteOrDefault(_userMin,Number.POSITIVE_INFINITY);_userMax=finiteOrDefault(_userMax,Number.NEGATIVE_INFINITY);_suggestedMin=finiteOrDefault(_suggestedMin,Number.POSITIVE_INFINITY);_suggestedMax=finiteOrDefault(_suggestedMax,Number.NEGATIVE_INFINITY);return{min:finiteOrDefault(_userMin,_suggestedMin),max:finiteOrDefault(_userMax,_suggestedMax),minDefined:isNumberFinite(_userMin),maxDefined:isNumberFinite(_userMax)};}
getMinMax(canStack){let{min,max,minDefined,maxDefined}=this.getUserBounds();let range;if(minDefined&&maxDefined){return{min,max};}
const metas=this.getMatchingVisibleMetas();for(let i=0,ilen=metas.length;i<ilen;++i){range=metas[i].controller.getMinMax(this,canStack);if(!minDefined){min=Math.min(min,range.min);}
if(!maxDefined){max=Math.max(max,range.max);}}
min=maxDefined&&min>max?max:min;max=minDefined&&min>max?min:max;return{min:finiteOrDefault(min,finiteOrDefault(max,min)),max:finiteOrDefault(max,finiteOrDefault(min,max))};}
getPadding(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0};}
getTicks(){return this.ticks;}
getLabels(){const data=this.chart.data;return this.options.labels||(this.isHorizontal()?data.xLabels:data.yLabels)||data.labels||[];}
getLabelItems(chartArea=this.chart.chartArea){const items=this._labelItems||(this._labelItems=this._computeLabelItems(chartArea));return items;}
beforeLayout(){this._cache={};this._dataLimitsCached=false;}
beforeUpdate(){callback(this.options.beforeUpdate,[this]);}
update(maxWidth,maxHeight,margins){const{beginAtZero,grace,ticks:tickOpts}=this.options;const sampleSize=tickOpts.sampleSize;this.beforeUpdate();this.maxWidth=maxWidth;this.maxHeight=maxHeight;this._margins=margins=Object.assign({left:0,right:0,top:0,bottom:0},margins);this.ticks=null;this._labelSizes=null;this._gridLineItems=null;this._labelItems=null;this.beforeSetDimensions();this.setDimensions();this.afterSetDimensions();this._maxLength=this.isHorizontal()?this.width+margins.left+margins.right:this.height+margins.top+margins.bottom;if(!this._dataLimitsCached){this.beforeDataLimits();this.determineDataLimits();this.afterDataLimits();this._range=_addGrace(this,grace,beginAtZero);this._dataLimitsCached=true;}
this.beforeBuildTicks();this.ticks=this.buildTicks()||[];this.afterBuildTicks();const samplingEnabled=sampleSize<this.ticks.length;this._convertTicksToLabels(samplingEnabled?sample(this.ticks,sampleSize):this.ticks);this.configure();this.beforeCalculateLabelRotation();this.calculateLabelRotation();this.afterCalculateLabelRotation();if(tickOpts.display&&(tickOpts.autoSkip||tickOpts.source==='auto')){this.ticks=autoSkip(this,this.ticks);this._labelSizes=null;this.afterAutoSkip();}
if(samplingEnabled){this._convertTicksToLabels(this.ticks);}
this.beforeFit();this.fit();this.afterFit();this.afterUpdate();}
configure(){let reversePixels=this.options.reverse;let startPixel,endPixel;if(this.isHorizontal()){startPixel=this.left;endPixel=this.right;}else{startPixel=this.top;endPixel=this.bottom;reversePixels=!reversePixels;}
this._startPixel=startPixel;this._endPixel=endPixel;this._reversePixels=reversePixels;this._length=endPixel-startPixel;this._alignToPixels=this.options.alignToPixels;}
afterUpdate(){callback(this.options.afterUpdate,[this]);}
beforeSetDimensions(){callback(this.options.beforeSetDimensions,[this]);}
setDimensions(){if(this.isHorizontal()){this.width=this.maxWidth;this.left=0;this.right=this.width;}else{this.height=this.maxHeight;this.top=0;this.bottom=this.height;}
this.paddingLeft=0;this.paddingTop=0;this.paddingRight=0;this.paddingBottom=0;}
afterSetDimensions(){callback(this.options.afterSetDimensions,[this]);}
_callHooks(name){this.chart.notifyPlugins(name,this.getContext());callback(this.options[name],[this]);}
beforeDataLimits(){this._callHooks('beforeDataLimits');}
determineDataLimits(){}
afterDataLimits(){this._callHooks('afterDataLimits');}
beforeBuildTicks(){this._callHooks('beforeBuildTicks');}
buildTicks(){return[];}
afterBuildTicks(){this._callHooks('afterBuildTicks');}
beforeTickToLabelConversion(){callback(this.options.beforeTickToLabelConversion,[this]);}
generateTickLabels(ticks){const tickOpts=this.options.ticks;let i,ilen,tick;for(i=0,ilen=ticks.length;i<ilen;i++){tick=ticks[i];tick.label=callback(tickOpts.callback,[tick.value,i,ticks],this);}}
afterTickToLabelConversion(){callback(this.options.afterTickToLabelConversion,[this]);}
beforeCalculateLabelRotation(){callback(this.options.beforeCalculateLabelRotation,[this]);}
calculateLabelRotation(){const options=this.options;const tickOpts=options.ticks;const numTicks=getTicksLimit(this.ticks.length,options.ticks.maxTicksLimit);const minRotation=tickOpts.minRotation||0;const maxRotation=tickOpts.maxRotation;let labelRotation=minRotation;let tickWidth,maxHeight,maxLabelDiagonal;if(!this._isVisible()||!tickOpts.display||minRotation>=maxRotation||numTicks<=1||!this.isHorizontal()){this.labelRotation=minRotation;return;}
const labelSizes=this._getLabelSizes();const maxLabelWidth=labelSizes.widest.width;const maxLabelHeight=labelSizes.highest.height;const maxWidth=_limitValue(this.chart.width-maxLabelWidth,0,this.maxWidth);tickWidth=options.offset?this.maxWidth/numTicks:maxWidth/(numTicks-1);if(maxLabelWidth+6>tickWidth){tickWidth=maxWidth/(numTicks-(options.offset?0.5:1));maxHeight=this.maxHeight-getTickMarkLength(options.grid)-tickOpts.padding-getTitleHeight(options.title,this.chart.options.font);maxLabelDiagonal=Math.sqrt(maxLabelWidth*maxLabelWidth+maxLabelHeight*maxLabelHeight);labelRotation=toDegrees(Math.min(Math.asin(_limitValue((labelSizes.highest.height+6)/tickWidth,-1,1)),Math.asin(_limitValue(maxHeight/maxLabelDiagonal,-1,1))-Math.asin(_limitValue(maxLabelHeight/maxLabelDiagonal,-1,1))));labelRotation=Math.max(minRotation,Math.min(maxRotation,labelRotation));}
this.labelRotation=labelRotation;}
afterCalculateLabelRotation(){callback(this.options.afterCalculateLabelRotation,[this]);}
afterAutoSkip(){}
beforeFit(){callback(this.options.beforeFit,[this]);}
fit(){const minSize={width:0,height:0};const{chart,options:{ticks:tickOpts,title:titleOpts,grid:gridOpts}}=this;const display=this._isVisible();const isHorizontal=this.isHorizontal();if(display){const titleHeight=getTitleHeight(titleOpts,chart.options.font);if(isHorizontal){minSize.width=this.maxWidth;minSize.height=getTickMarkLength(gridOpts)+titleHeight;}else{minSize.height=this.maxHeight;minSize.width=getTickMarkLength(gridOpts)+titleHeight;}
if(tickOpts.display&&this.ticks.length){const{first,last,widest,highest}=this._getLabelSizes();const tickPadding=tickOpts.padding*2;const angleRadians=toRadians(this.labelRotation);const cos=Math.cos(angleRadians);const sin=Math.sin(angleRadians);if(isHorizontal){const labelHeight=tickOpts.mirror?0:sin*widest.width+cos*highest.height;minSize.height=Math.min(this.maxHeight,minSize.height+labelHeight+tickPadding);}else{const labelWidth=tickOpts.mirror?0:cos*widest.width+sin*highest.height;minSize.width=Math.min(this.maxWidth,minSize.width+labelWidth+tickPadding);}
this._calculatePadding(first,last,sin,cos);}}
this._handleMargins();if(isHorizontal){this.width=this._length=chart.width-this._margins.left-this._margins.right;this.height=minSize.height;}else{this.width=minSize.width;this.height=this._length=chart.height-this._margins.top-this._margins.bottom;}}
_calculatePadding(first,last,sin,cos){const{ticks:{align,padding},position}=this.options;const isRotated=this.labelRotation!==0;const labelsBelowTicks=position!=='top'&&this.axis==='x';if(this.isHorizontal()){const offsetLeft=this.getPixelForTick(0)-this.left;const offsetRight=this.right-this.getPixelForTick(this.ticks.length-1);let paddingLeft=0;let paddingRight=0;if(isRotated){if(labelsBelowTicks){paddingLeft=cos*first.width;paddingRight=sin*last.height;}else{paddingLeft=sin*first.height;paddingRight=cos*last.width;}}else if(align==='start'){paddingRight=last.width;}else if(align==='end'){paddingLeft=first.width;}else if(align!=='inner'){paddingLeft=first.width/2;paddingRight=last.width/2;}
this.paddingLeft=Math.max((paddingLeft-offsetLeft+padding)*this.width/(this.width-offsetLeft),0);this.paddingRight=Math.max((paddingRight-offsetRight+padding)*this.width/(this.width-offsetRight),0);}else{let paddingTop=last.height/2;let paddingBottom=first.height/2;if(align==='start'){paddingTop=0;paddingBottom=first.height;}else if(align==='end'){paddingTop=last.height;paddingBottom=0;}
this.paddingTop=paddingTop+padding;this.paddingBottom=paddingBottom+padding;}}
_handleMargins(){if(this._margins){this._margins.left=Math.max(this.paddingLeft,this._margins.left);this._margins.top=Math.max(this.paddingTop,this._margins.top);this._margins.right=Math.max(this.paddingRight,this._margins.right);this._margins.bottom=Math.max(this.paddingBottom,this._margins.bottom);}}
afterFit(){callback(this.options.afterFit,[this]);}
isHorizontal(){const{axis,position}=this.options;return position==='top'||position==='bottom'||axis==='x';}
isFullSize(){return this.options.fullSize;}
_convertTicksToLabels(ticks){this.beforeTickToLabelConversion();this.generateTickLabels(ticks);let i,ilen;for(i=0,ilen=ticks.length;i<ilen;i++){if(isNullOrUndef(ticks[i].label)){ticks.splice(i,1);ilen--;i--;}}
this.afterTickToLabelConversion();}
_getLabelSizes(){let labelSizes=this._labelSizes;if(!labelSizes){const sampleSize=this.options.ticks.sampleSize;let ticks=this.ticks;if(sampleSize<ticks.length){ticks=sample(ticks,sampleSize);}
this._labelSizes=labelSizes=this._computeLabelSizes(ticks,ticks.length,this.options.ticks.maxTicksLimit);}
return labelSizes;}
_computeLabelSizes(ticks,length,maxTicksLimit){const{ctx,_longestTextCache:caches}=this;const widths=[];const heights=[];const increment=Math.floor(length/getTicksLimit(length,maxTicksLimit));let widestLabelSize=0;let highestLabelSize=0;let i,j,jlen,label,tickFont,fontString,cache,lineHeight,width,height,nestedLabel;for(i=0;i<length;i+=increment){label=ticks[i].label;tickFont=this._resolveTickFontOptions(i);ctx.font=fontString=tickFont.string;cache=caches[fontString]=caches[fontString]||{data:{},gc:[]};lineHeight=tickFont.lineHeight;width=height=0;if(!isNullOrUndef(label)&&!isArray(label)){width=_measureText(ctx,cache.data,cache.gc,width,label);height=lineHeight;}else if(isArray(label)){for(j=0,jlen=label.length;j<jlen;++j){nestedLabel=label[j];if(!isNullOrUndef(nestedLabel)&&!isArray(nestedLabel)){width=_measureText(ctx,cache.data,cache.gc,width,nestedLabel);height+=lineHeight;}}}
widths.push(width);heights.push(height);widestLabelSize=Math.max(width,widestLabelSize);highestLabelSize=Math.max(height,highestLabelSize);}
garbageCollect(caches,length);const widest=widths.indexOf(widestLabelSize);const highest=heights.indexOf(highestLabelSize);const valueAt=(idx)=>({width:widths[idx]||0,height:heights[idx]||0});return{first:valueAt(0),last:valueAt(length-1),widest:valueAt(widest),highest:valueAt(highest),widths,heights};}
getLabelForValue(value){return value;}
getPixelForValue(value,index){return NaN;}
getValueForPixel(pixel){}
getPixelForTick(index){const ticks=this.ticks;if(index<0||index>ticks.length-1){return null;}
return this.getPixelForValue(ticks[index].value);}
getPixelForDecimal(decimal){if(this._reversePixels){decimal=1-decimal;}
const pixel=this._startPixel+decimal*this._length;return _int16Range(this._alignToPixels?_alignPixel(this.chart,pixel,0):pixel);}
getDecimalForPixel(pixel){const decimal=(pixel-this._startPixel)/this._length;return this._reversePixels?1-decimal:decimal;}
getBasePixel(){return this.getPixelForValue(this.getBaseValue());}
getBaseValue(){const{min,max}=this;return min<0&&max<0?max:min>0&&max>0?min:0;}
getContext(index){const ticks=this.ticks||[];if(index>=0&&index<ticks.length){const tick=ticks[index];return tick.$context||(tick.$context=createTickContext(this.getContext(),index,tick));}
return this.$context||(this.$context=createScaleContext(this.chart.getContext(),this));}
_tickSize(){const optionTicks=this.options.ticks;const rot=toRadians(this.labelRotation);const cos=Math.abs(Math.cos(rot));const sin=Math.abs(Math.sin(rot));const labelSizes=this._getLabelSizes();const padding=optionTicks.autoSkipPadding||0;const w=labelSizes?labelSizes.widest.width+padding:0;const h=labelSizes?labelSizes.highest.height+padding:0;return this.isHorizontal()?h*cos>w*sin?w/cos:h/sin:h*sin<w*cos?h/cos:w/sin;}
_isVisible(){const display=this.options.display;if(display!=='auto'){return!!display;}
return this.getMatchingVisibleMetas().length>0;}
_computeGridLineItems(chartArea){const axis=this.axis;const chart=this.chart;const options=this.options;const{grid,position,border}=options;const offset=grid.offset;const isHorizontal=this.isHorizontal();const ticks=this.ticks;const ticksLength=ticks.length+(offset?1:0);const tl=getTickMarkLength(grid);const items=[];const borderOpts=border.setContext(this.getContext());const axisWidth=borderOpts.display?borderOpts.width:0;const axisHalfWidth=axisWidth/2;const alignBorderValue=function(pixel){return _alignPixel(chart,pixel,axisWidth);};let borderValue,i,lineValue,alignedLineValue;let tx1,ty1,tx2,ty2,x1,y1,x2,y2;if(position==='top'){borderValue=alignBorderValue(this.bottom);ty1=this.bottom-tl;ty2=borderValue-axisHalfWidth;y1=alignBorderValue(chartArea.top)+axisHalfWidth;y2=chartArea.bottom;}else if(position==='bottom'){borderValue=alignBorderValue(this.top);y1=chartArea.top;y2=alignBorderValue(chartArea.bottom)-axisHalfWidth;ty1=borderValue+axisHalfWidth;ty2=this.top+tl;}else if(position==='left'){borderValue=alignBorderValue(this.right);tx1=this.right-tl;tx2=borderValue-axisHalfWidth;x1=alignBorderValue(chartArea.left)+axisHalfWidth;x2=chartArea.right;}else if(position==='right'){borderValue=alignBorderValue(this.left);x1=chartArea.left;x2=alignBorderValue(chartArea.right)-axisHalfWidth;tx1=borderValue+axisHalfWidth;tx2=this.left+tl;}else if(axis==='x'){if(position==='center'){borderValue=alignBorderValue((chartArea.top+chartArea.bottom)/2+0.5);}else if(isObject(position)){const positionAxisID=Object.keys(position)[0];const value=position[positionAxisID];borderValue=alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));}
y1=chartArea.top;y2=chartArea.bottom;ty1=borderValue+axisHalfWidth;ty2=ty1+tl;}else if(axis==='y'){if(position==='center'){borderValue=alignBorderValue((chartArea.left+chartArea.right)/2);}else if(isObject(position)){const positionAxisID=Object.keys(position)[0];const value=position[positionAxisID];borderValue=alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));}
tx1=borderValue-axisHalfWidth;tx2=tx1-tl;x1=chartArea.left;x2=chartArea.right;}
const limit=valueOrDefault(options.ticks.maxTicksLimit,ticksLength);const step=Math.max(1,Math.ceil(ticksLength/limit));for(i=0;i<ticksLength;i+=step){const context=this.getContext(i);const optsAtIndex=grid.setContext(context);const optsAtIndexBorder=border.setContext(context);const lineWidth=optsAtIndex.lineWidth;const lineColor=optsAtIndex.color;const borderDash=optsAtIndexBorder.dash||[];const borderDashOffset=optsAtIndexBorder.dashOffset;const tickWidth=optsAtIndex.tickWidth;const tickColor=optsAtIndex.tickColor;const tickBorderDash=optsAtIndex.tickBorderDash||[];const tickBorderDashOffset=optsAtIndex.tickBorderDashOffset;lineValue=getPixelForGridLine(this,i,offset);if(lineValue===undefined){continue;}
alignedLineValue=_alignPixel(chart,lineValue,lineWidth);if(isHorizontal){tx1=tx2=x1=x2=alignedLineValue;}else{ty1=ty2=y1=y2=alignedLineValue;}
items.push({tx1,ty1,tx2,ty2,x1,y1,x2,y2,width:lineWidth,color:lineColor,borderDash,borderDashOffset,tickWidth,tickColor,tickBorderDash,tickBorderDashOffset});}
this._ticksLength=ticksLength;this._borderValue=borderValue;return items;}
_computeLabelItems(chartArea){const axis=this.axis;const options=this.options;const{position,ticks:optionTicks}=options;const isHorizontal=this.isHorizontal();const ticks=this.ticks;const{align,crossAlign,padding,mirror}=optionTicks;const tl=getTickMarkLength(options.grid);const tickAndPadding=tl+padding;const hTickAndPadding=mirror?-padding:tickAndPadding;const rotation=-toRadians(this.labelRotation);const items=[];let i,ilen,tick,label,x,y,textAlign,pixel,font,lineHeight,lineCount,textOffset;let textBaseline='middle';if(position==='top'){y=this.bottom-hTickAndPadding;textAlign=this._getXAxisLabelAlignment();}else if(position==='bottom'){y=this.top+hTickAndPadding;textAlign=this._getXAxisLabelAlignment();}else if(position==='left'){const ret=this._getYAxisLabelAlignment(tl);textAlign=ret.textAlign;x=ret.x;}else if(position==='right'){const ret=this._getYAxisLabelAlignment(tl);textAlign=ret.textAlign;x=ret.x;}else if(axis==='x'){if(position==='center'){y=(chartArea.top+chartArea.bottom)/2+tickAndPadding;}else if(isObject(position)){const positionAxisID=Object.keys(position)[0];const value=position[positionAxisID];y=this.chart.scales[positionAxisID].getPixelForValue(value)+tickAndPadding;}
textAlign=this._getXAxisLabelAlignment();}else if(axis==='y'){if(position==='center'){x=(chartArea.left+chartArea.right)/2-tickAndPadding;}else if(isObject(position)){const positionAxisID=Object.keys(position)[0];const value=position[positionAxisID];x=this.chart.scales[positionAxisID].getPixelForValue(value);}
textAlign=this._getYAxisLabelAlignment(tl).textAlign;}
if(axis==='y'){if(align==='start'){textBaseline='top';}else if(align==='end'){textBaseline='bottom';}}
const labelSizes=this._getLabelSizes();for(i=0,ilen=ticks.length;i<ilen;++i){tick=ticks[i];label=tick.label;const optsAtIndex=optionTicks.setContext(this.getContext(i));pixel=this.getPixelForTick(i)+optionTicks.labelOffset;font=this._resolveTickFontOptions(i);lineHeight=font.lineHeight;lineCount=isArray(label)?label.length:1;const halfCount=lineCount/2;const color=optsAtIndex.color;const strokeColor=optsAtIndex.textStrokeColor;const strokeWidth=optsAtIndex.textStrokeWidth;let tickTextAlign=textAlign;if(isHorizontal){x=pixel;if(textAlign==='inner'){if(i===ilen-1){tickTextAlign=!this.options.reverse?'right':'left';}else if(i===0){tickTextAlign=!this.options.reverse?'left':'right';}else{tickTextAlign='center';}}
if(position==='top'){if(crossAlign==='near'||rotation!==0){textOffset=-lineCount*lineHeight+lineHeight/2;}else if(crossAlign==='center'){textOffset=-labelSizes.highest.height/2-halfCount*lineHeight+lineHeight;}else{textOffset=-labelSizes.highest.height+lineHeight/2;}}else{if(crossAlign==='near'||rotation!==0){textOffset=lineHeight/2;}else if(crossAlign==='center'){textOffset=labelSizes.highest.height/2-halfCount*lineHeight;}else{textOffset=labelSizes.highest.height-lineCount*lineHeight;}}
if(mirror){textOffset*=-1;}
if(rotation!==0&&!optsAtIndex.showLabelBackdrop){x+=lineHeight/2*Math.sin(rotation);}}else{y=pixel;textOffset=(1-lineCount)*lineHeight/2;}
let backdrop;if(optsAtIndex.showLabelBackdrop){const labelPadding=toPadding(optsAtIndex.backdropPadding);const height=labelSizes.heights[i];const width=labelSizes.widths[i];let top=textOffset-labelPadding.top;let left=0-labelPadding.left;switch(textBaseline){case'middle':top-=height/2;break;case'bottom':top-=height;break;}
switch(textAlign){case'center':left-=width/2;break;case'right':left-=width;break;case'inner':if(i===ilen-1){left-=width;}else if(i>0){left-=width/2;}
break;}
backdrop={left,top,width:width+labelPadding.width,height:height+labelPadding.height,color:optsAtIndex.backdropColor};}
items.push({label,font,textOffset,options:{rotation,color,strokeColor,strokeWidth,textAlign:tickTextAlign,textBaseline,translation:[x,y],backdrop}});}
return items;}
_getXAxisLabelAlignment(){const{position,ticks}=this.options;const rotation=-toRadians(this.labelRotation);if(rotation){return position==='top'?'left':'right';}
let align='center';if(ticks.align==='start'){align='left';}else if(ticks.align==='end'){align='right';}else if(ticks.align==='inner'){align='inner';}
return align;}
_getYAxisLabelAlignment(tl){const{position,ticks:{crossAlign,mirror,padding}}=this.options;const labelSizes=this._getLabelSizes();const tickAndPadding=tl+padding;const widest=labelSizes.widest.width;let textAlign;let x;if(position==='left'){if(mirror){x=this.right+padding;if(crossAlign==='near'){textAlign='left';}else if(crossAlign==='center'){textAlign='center';x+=widest/2;}else{textAlign='right';x+=widest;}}else{x=this.right-tickAndPadding;if(crossAlign==='near'){textAlign='right';}else if(crossAlign==='center'){textAlign='center';x-=widest/2;}else{textAlign='left';x=this.left;}}}else if(position==='right'){if(mirror){x=this.left+padding;if(crossAlign==='near'){textAlign='right';}else if(crossAlign==='center'){textAlign='center';x-=widest/2;}else{textAlign='left';x-=widest;}}else{x=this.left+tickAndPadding;if(crossAlign==='near'){textAlign='left';}else if(crossAlign==='center'){textAlign='center';x+=widest/2;}else{textAlign='right';x=this.right;}}}else{textAlign='right';}
return{textAlign,x};}
_computeLabelArea(){if(this.options.ticks.mirror){return;}
const chart=this.chart;const position=this.options.position;if(position==='left'||position==='right'){return{top:0,left:this.left,bottom:chart.height,right:this.right};}
if(position==='top'||position==='bottom'){return{top:this.top,left:0,bottom:this.bottom,right:chart.width};}}
drawBackground(){const{ctx,options:{backgroundColor},left,top,width,height}=this;if(backgroundColor){ctx.save();ctx.fillStyle=backgroundColor;ctx.fillRect(left,top,width,height);ctx.restore();}}
getLineWidthForValue(value){const grid=this.options.grid;if(!this._isVisible()||!grid.display){return 0;}
const ticks=this.ticks;const index=ticks.findIndex((t)=>t.value===value);if(index>=0){const opts=grid.setContext(this.getContext(index));return opts.lineWidth;}
return 0;}
drawGrid(chartArea){const grid=this.options.grid;const ctx=this.ctx;const items=this._gridLineItems||(this._gridLineItems=this._computeGridLineItems(chartArea));let i,ilen;const drawLine=(p1,p2,style)=>{if(!style.width||!style.color){return;}
ctx.save();ctx.lineWidth=style.width;ctx.strokeStyle=style.color;ctx.setLineDash(style.borderDash||[]);ctx.lineDashOffset=style.borderDashOffset;ctx.beginPath();ctx.moveTo(p1.x,p1.y);ctx.lineTo(p2.x,p2.y);ctx.stroke();ctx.restore();};if(grid.display){for(i=0,ilen=items.length;i<ilen;++i){const item=items[i];if(grid.drawOnChartArea){drawLine({x:item.x1,y:item.y1},{x:item.x2,y:item.y2},item);}
if(grid.drawTicks){drawLine({x:item.tx1,y:item.ty1},{x:item.tx2,y:item.ty2},{color:item.tickColor,width:item.tickWidth,borderDash:item.tickBorderDash,borderDashOffset:item.tickBorderDashOffset});}}}}
drawBorder(){const{chart,ctx,options:{border,grid}}=this;const borderOpts=border.setContext(this.getContext());const axisWidth=border.display?borderOpts.width:0;if(!axisWidth){return;}
const lastLineWidth=grid.setContext(this.getContext(0)).lineWidth;const borderValue=this._borderValue;let x1,x2,y1,y2;if(this.isHorizontal()){x1=_alignPixel(chart,this.left,axisWidth)-axisWidth/2;x2=_alignPixel(chart,this.right,lastLineWidth)+lastLineWidth/2;y1=y2=borderValue;}else{y1=_alignPixel(chart,this.top,axisWidth)-axisWidth/2;y2=_alignPixel(chart,this.bottom,lastLineWidth)+lastLineWidth/2;x1=x2=borderValue;}
ctx.save();ctx.lineWidth=borderOpts.width;ctx.strokeStyle=borderOpts.color;ctx.beginPath();ctx.moveTo(x1,y1);ctx.lineTo(x2,y2);ctx.stroke();ctx.restore();}
drawLabels(chartArea){const optionTicks=this.options.ticks;if(!optionTicks.display){return;}
const ctx=this.ctx;const area=this._computeLabelArea();if(area){clipArea(ctx,area);}
const items=this.getLabelItems(chartArea);for(const item of items){const renderTextOptions=item.options;const tickFont=item.font;const label=item.label;const y=item.textOffset;renderText(ctx,label,0,y,tickFont,renderTextOptions);}
if(area){unclipArea(ctx);}}
drawTitle(){const{ctx,options:{position,title,reverse}}=this;if(!title.display){return;}
const font=toFont(title.font);const padding=toPadding(title.padding);const align=title.align;let offset=font.lineHeight/2;if(position==='bottom'||position==='center'||isObject(position)){offset+=padding.bottom;if(isArray(title.text)){offset+=font.lineHeight*(title.text.length-1);}}else{offset+=padding.top;}
const{titleX,titleY,maxWidth,rotation}=titleArgs(this,offset,position,align);renderText(ctx,title.text,0,0,font,{color:title.color,maxWidth,rotation,textAlign:titleAlign(align,position,reverse),textBaseline:'middle',translation:[titleX,titleY]});}
draw(chartArea){if(!this._isVisible()){return;}
this.drawBackground();this.drawGrid(chartArea);this.drawBorder();this.drawTitle();this.drawLabels(chartArea);}
_layers(){const opts=this.options;const tz=opts.ticks&&opts.ticks.z||0;const gz=valueOrDefault(opts.grid&&opts.grid.z,-1);const bz=valueOrDefault(opts.border&&opts.border.z,0);if(!this._isVisible()||this.draw!==Scale.prototype.draw){return[{z:tz,draw:(chartArea)=>{this.draw(chartArea);}}];}
return[{z:gz,draw:(chartArea)=>{this.drawBackground();this.drawGrid(chartArea);this.drawTitle();}},{z:bz,draw:()=>{this.drawBorder();}},{z:tz,draw:(chartArea)=>{this.drawLabels(chartArea);}}];}
getMatchingVisibleMetas(type){const metas=this.chart.getSortedVisibleDatasetMetas();const axisID=this.axis+'AxisID';const result=[];let i,ilen;for(i=0,ilen=metas.length;i<ilen;++i){const meta=metas[i];if(meta[axisID]===this.id&&(!type||meta.type===type)){result.push(meta);}}
return result;}
_resolveTickFontOptions(index){const opts=this.options.ticks.setContext(this.getContext(index));return toFont(opts.font);}
_maxDigits(){const fontSize=this._resolveTickFontOptions(0).lineHeight;return(this.isHorizontal()?this.width:this.height)/fontSize;}}
class TypedRegistry{constructor(type,scope,override){this.type=type;this.scope=scope;this.override=override;this.items=Object.create(null);}
isForType(type){return Object.prototype.isPrototypeOf.call(this.type.prototype,type.prototype);}
register(item){const proto=Object.getPrototypeOf(item);let parentScope;if(isIChartComponent(proto)){parentScope=this.register(proto);}
const items=this.items;const id=item.id;const scope=this.scope+'.'+id;if(!id){throw new Error('class does not have id: '+item);}
if(id in items){return scope;}
items[id]=item;registerDefaults(item,scope,parentScope);if(this.override){defaults.override(item.id,item.overrides);}
return scope;}
get(id){return this.items[id];}
unregister(item){const items=this.items;const id=item.id;const scope=this.scope;if(id in items){delete items[id];}
if(scope&&id in defaults[scope]){delete defaults[scope][id];if(this.override){delete overrides[id];}}}}
function registerDefaults(item,scope,parentScope){const itemDefaults=merge(Object.create(null),[parentScope?defaults.get(parentScope):{},defaults.get(scope),item.defaults]);defaults.set(scope,itemDefaults);if(item.defaultRoutes){routeDefaults(scope,item.defaultRoutes);}
if(item.descriptors){defaults.describe(scope,item.descriptors);}}
function routeDefaults(scope,routes){Object.keys(routes).forEach((property)=>{const propertyParts=property.split('.');const sourceName=propertyParts.pop();const sourceScope=[scope].concat(propertyParts).join('.');const parts=routes[property].split('.');const targetName=parts.pop();const targetScope=parts.join('.');defaults.route(sourceScope,sourceName,targetScope,targetName);});}
function isIChartComponent(proto){return'id'in proto&&'defaults'in proto;}
class Registry{constructor(){this.controllers=new TypedRegistry(DatasetController,'datasets',true);this.elements=new TypedRegistry(Element,'elements');this.plugins=new TypedRegistry(Object,'plugins');this.scales=new TypedRegistry(Scale,'scales');this._typedRegistries=[this.controllers,this.scales,this.elements];}
add(...args){this._each('register',args);}
remove(...args){this._each('unregister',args);}
addControllers(...args){this._each('register',args,this.controllers);}
addElements(...args){this._each('register',args,this.elements);}
addPlugins(...args){this._each('register',args,this.plugins);}
addScales(...args){this._each('register',args,this.scales);}
getController(id){return this._get(id,this.controllers,'controller');}
getElement(id){return this._get(id,this.elements,'element');}
getPlugin(id){return this._get(id,this.plugins,'plugin');}
getScale(id){return this._get(id,this.scales,'scale');}
removeControllers(...args){this._each('unregister',args,this.controllers);}
removeElements(...args){this._each('unregister',args,this.elements);}
removePlugins(...args){this._each('unregister',args,this.plugins);}
removeScales(...args){this._each('unregister',args,this.scales);}
_each(method,args,typedRegistry){[...args].forEach((arg)=>{const reg=typedRegistry||this._getRegistryForType(arg);if(typedRegistry||reg.isForType(arg)||reg===this.plugins&&arg.id){this._exec(method,reg,arg);}else{each(arg,(item)=>{const itemReg=typedRegistry||this._getRegistryForType(item);this._exec(method,itemReg,item);});}});}
_exec(method,registry,component){const camelMethod=_capitalize(method);callback(component['before'+camelMethod],[],component);registry[method](component);callback(component['after'+camelMethod],[],component);}
_getRegistryForType(type){for(let i=0;i<this._typedRegistries.length;i++){const reg=this._typedRegistries[i];if(reg.isForType(type)){return reg;}}
return this.plugins;}
_get(id,typedRegistry,type){const item=typedRegistry.get(id);if(item===undefined){throw new Error('"'+id+'" is not a registered '+type+'.');}
return item;}}
var registry=new Registry();class PluginService{constructor(){this._init=[];}
notify(chart,hook,args,filter){if(hook==='beforeInit'){this._init=this._createDescriptors(chart,true);this._notify(this._init,chart,'install');}
const descriptors=filter?this._descriptors(chart).filter(filter):this._descriptors(chart);const result=this._notify(descriptors,chart,hook,args);if(hook==='afterDestroy'){this._notify(descriptors,chart,'stop');this._notify(this._init,chart,'uninstall');}
return result;}
_notify(descriptors,chart,hook,args){args=args||{};for(const descriptor of descriptors){const plugin=descriptor.plugin;const method=plugin[hook];const params=[chart,args,descriptor.options];if(callback(method,params,plugin)===false&&args.cancelable){return false;}}
return true;}
invalidate(){if(!isNullOrUndef(this._cache)){this._oldCache=this._cache;this._cache=undefined;}}
_descriptors(chart){if(this._cache){return this._cache;}
const descriptors=this._cache=this._createDescriptors(chart);this._notifyStateChanges(chart);return descriptors;}
_createDescriptors(chart,all){const config=chart&&chart.config;const options=valueOrDefault(config.options&&config.options.plugins,{});const plugins=allPlugins(config);return options===false&&!all?[]:createDescriptors(chart,plugins,options,all);}
_notifyStateChanges(chart){const previousDescriptors=this._oldCache||[];const descriptors=this._cache;const diff=(a,b)=>a.filter((x)=>!b.some((y)=>x.plugin.id===y.plugin.id));this._notify(diff(previousDescriptors,descriptors),chart,'stop');this._notify(diff(descriptors,previousDescriptors),chart,'start');}}
function allPlugins(config){const localIds={};const plugins=[];const keys=Object.keys(registry.plugins.items);for(let i=0;i<keys.length;i++){plugins.push(registry.getPlugin(keys[i]));}
const local=config.plugins||[];for(let i=0;i<local.length;i++){const plugin=local[i];if(plugins.indexOf(plugin)===-1){plugins.push(plugin);localIds[plugin.id]=true;}}
return{plugins,localIds};}
function getOpts(options,all){if(!all&&options===false){return null;}
if(options===true){return{};}
return options;}
function createDescriptors(chart,{plugins,localIds},options,all){const result=[];const context=chart.getContext();for(const plugin of plugins){const id=plugin.id;const opts=getOpts(options[id],all);if(opts===null){continue;}
result.push({plugin,options:pluginOpts(chart.config,{plugin,local:localIds[id]},opts,context)});}
return result;}
function pluginOpts(config,{plugin,local},opts,context){const keys=config.pluginScopeKeys(plugin);const scopes=config.getOptionScopes(opts,keys);if(local&&plugin.defaults){scopes.push(plugin.defaults);}
return config.createResolver(scopes,context,[''],{scriptable:false,indexable:false,allKeys:true});}
function getIndexAxis(type,options){const datasetDefaults=defaults.datasets[type]||{};const datasetOptions=(options.datasets||{})[type]||{};return datasetOptions.indexAxis||options.indexAxis||datasetDefaults.indexAxis||'x';}
function getAxisFromDefaultScaleID(id,indexAxis){let axis=id;if(id==='_index_'){axis=indexAxis;}else if(id==='_value_'){axis=indexAxis==='x'?'y':'x';}
return axis;}
function getDefaultScaleIDFromAxis(axis,indexAxis){return axis===indexAxis?'_index_':'_value_';}
function idMatchesAxis(id){if(id==='x'||id==='y'||id==='r'){return id;}}
function axisFromPosition(position){if(position==='top'||position==='bottom'){return'x';}
if(position==='left'||position==='right'){return'y';}}
function determineAxis(id,...scaleOptions){if(idMatchesAxis(id)){return id;}
for(const opts of scaleOptions){const axis=opts.axis||axisFromPosition(opts.position)||id.length>1&&idMatchesAxis(id[0].toLowerCase());if(axis){return axis;}}
throw new Error(`Cannot determine type of '${id}' axis. Please provide 'axis' or 'position' option.`);}
function getAxisFromDataset(id,axis,dataset){if(dataset[axis+'AxisID']===id){return{axis};}}
function retrieveAxisFromDatasets(id,config){if(config.data&&config.data.datasets){const boundDs=config.data.datasets.filter((d)=>d.xAxisID===id||d.yAxisID===id);if(boundDs.length){return getAxisFromDataset(id,'x',boundDs[0])||getAxisFromDataset(id,'y',boundDs[0]);}}
return{};}
function mergeScaleConfig(config,options){const chartDefaults=overrides[config.type]||{scales:{}};const configScales=options.scales||{};const chartIndexAxis=getIndexAxis(config.type,options);const scales=Object.create(null);Object.keys(configScales).forEach((id)=>{const scaleConf=configScales[id];if(!isObject(scaleConf)){return console.error(`Invalid scale configuration for scale: ${id}`);}
if(scaleConf._proxy){return console.warn(`Ignoring resolver passed as options for scale: ${id}`);}
const axis=determineAxis(id,scaleConf,retrieveAxisFromDatasets(id,config),defaults.scales[scaleConf.type]);const defaultId=getDefaultScaleIDFromAxis(axis,chartIndexAxis);const defaultScaleOptions=chartDefaults.scales||{};scales[id]=mergeIf(Object.create(null),[{axis},scaleConf,defaultScaleOptions[axis],defaultScaleOptions[defaultId]]);});config.data.datasets.forEach((dataset)=>{const type=dataset.type||config.type;const indexAxis=dataset.indexAxis||getIndexAxis(type,options);const datasetDefaults=overrides[type]||{};const defaultScaleOptions=datasetDefaults.scales||{};Object.keys(defaultScaleOptions).forEach((defaultID)=>{const axis=getAxisFromDefaultScaleID(defaultID,indexAxis);const id=dataset[axis+'AxisID']||axis;scales[id]=scales[id]||Object.create(null);mergeIf(scales[id],[{axis},configScales[id],defaultScaleOptions[defaultID]]);});});Object.keys(scales).forEach((key)=>{const scale=scales[key];mergeIf(scale,[defaults.scales[scale.type],defaults.scale]);});return scales;}
function initOptions(config){const options=config.options||(config.options={});options.plugins=valueOrDefault(options.plugins,{});options.scales=mergeScaleConfig(config,options);}
function initData(data){data=data||{};data.datasets=data.datasets||[];data.labels=data.labels||[];return data;}
function initConfig(config){config=config||{};config.data=initData(config.data);initOptions(config);return config;}
const keyCache=new Map();const keysCached=new Set();function cachedKeys(cacheKey,generate){let keys=keyCache.get(cacheKey);if(!keys){keys=generate();keyCache.set(cacheKey,keys);keysCached.add(keys);}
return keys;}
const addIfFound=(set,obj,key)=>{const opts=resolveObjectKey(obj,key);if(opts!==undefined){set.add(opts);}};class Config{constructor(config){this._config=initConfig(config);this._scopeCache=new Map();this._resolverCache=new Map();}
get platform(){return this._config.platform;}
get type(){return this._config.type;}
set type(type){this._config.type=type;}
get data(){return this._config.data;}
set data(data){this._config.data=initData(data);}
get options(){return this._config.options;}
set options(options){this._config.options=options;}
get plugins(){return this._config.plugins;}
update(){const config=this._config;this.clearCache();initOptions(config);}
clearCache(){this._scopeCache.clear();this._resolverCache.clear();}
datasetScopeKeys(datasetType){return cachedKeys(datasetType,()=>[[`datasets.${datasetType}`,'']]);}
datasetAnimationScopeKeys(datasetType,transition){return cachedKeys(`${datasetType}.transition.${transition}`,()=>[[`datasets.${datasetType}.transitions.${transition}`,`transitions.${transition}`],[`datasets.${datasetType}`,'']]);}
datasetElementScopeKeys(datasetType,elementType){return cachedKeys(`${datasetType}-${elementType}`,()=>[[`datasets.${datasetType}.elements.${elementType}`,`datasets.${datasetType}`,`elements.${elementType}`,'']]);}
pluginScopeKeys(plugin){const id=plugin.id;const type=this.type;return cachedKeys(`${type}-plugin-${id}`,()=>[[`plugins.${id}`,...plugin.additionalOptionScopes||[]]]);}
_cachedScopes(mainScope,resetCache){const _scopeCache=this._scopeCache;let cache=_scopeCache.get(mainScope);if(!cache||resetCache){cache=new Map();_scopeCache.set(mainScope,cache);}
return cache;}
getOptionScopes(mainScope,keyLists,resetCache){const{options,type}=this;const cache=this._cachedScopes(mainScope,resetCache);const cached=cache.get(keyLists);if(cached){return cached;}
const scopes=new Set();keyLists.forEach((keys)=>{if(mainScope){scopes.add(mainScope);keys.forEach((key)=>addIfFound(scopes,mainScope,key));}
keys.forEach((key)=>addIfFound(scopes,options,key));keys.forEach((key)=>addIfFound(scopes,overrides[type]||{},key));keys.forEach((key)=>addIfFound(scopes,defaults,key));keys.forEach((key)=>addIfFound(scopes,descriptors,key));});const array=Array.from(scopes);if(array.length===0){array.push(Object.create(null));}
if(keysCached.has(keyLists)){cache.set(keyLists,array);}
return array;}
chartOptionScopes(){const{options,type}=this;return[options,overrides[type]||{},defaults.datasets[type]||{},{type},defaults,descriptors];}
resolveNamedOptions(scopes,names,context,prefixes=['']){const result={$shared:true};const{resolver,subPrefixes}=getResolver(this._resolverCache,scopes,prefixes);let options=resolver;if(needContext(resolver,names)){result.$shared=false;context=isFunction(context)?context():context;const subResolver=this.createResolver(scopes,context,subPrefixes);options=_attachContext(resolver,context,subResolver);}
for(const prop of names){result[prop]=options[prop];}
return result;}
createResolver(scopes,context,prefixes=[''],descriptorDefaults){const{resolver}=getResolver(this._resolverCache,scopes,prefixes);return isObject(context)?_attachContext(resolver,context,undefined,descriptorDefaults):resolver;}}
function getResolver(resolverCache,scopes,prefixes){let cache=resolverCache.get(scopes);if(!cache){cache=new Map();resolverCache.set(scopes,cache);}
const cacheKey=prefixes.join();let cached=cache.get(cacheKey);if(!cached){const resolver=_createResolver(scopes,prefixes);cached={resolver,subPrefixes:prefixes.filter((p)=>!p.toLowerCase().includes('hover'))};cache.set(cacheKey,cached);}
return cached;}
const hasFunction=(value)=>isObject(value)&&Object.getOwnPropertyNames(value).some((key)=>isFunction(value[key]));function needContext(proxy,names){const{isScriptable,isIndexable}=_descriptors(proxy);for(const prop of names){const scriptable=isScriptable(prop);const indexable=isIndexable(prop);const value=(indexable||scriptable)&&proxy[prop];if(scriptable&&(isFunction(value)||hasFunction(value))||indexable&&isArray(value)){return true;}}
return false;}
var version="4.4.5";const KNOWN_POSITIONS=['top','bottom','left','right','chartArea'];function positionIsHorizontal(position,axis){return position==='top'||position==='bottom'||KNOWN_POSITIONS.indexOf(position)===-1&&axis==='x';}
function compare2Level(l1,l2){return function(a,b){return a[l1]===b[l1]?a[l2]-b[l2]:a[l1]-b[l1];};}
function onAnimationsComplete(context){const chart=context.chart;const animationOptions=chart.options.animation;chart.notifyPlugins('afterRender');callback(animationOptions&&animationOptions.onComplete,[context],chart);}
function onAnimationProgress(context){const chart=context.chart;const animationOptions=chart.options.animation;callback(animationOptions&&animationOptions.onProgress,[context],chart);}
function getCanvas(item){if(_isDomSupported()&&typeof item==='string'){item=document.getElementById(item);}else if(item&&item.length){item=item[0];}
if(item&&item.canvas){item=item.canvas;}
return item;}
const instances={};const getChart=(key)=>{const canvas=getCanvas(key);return Object.values(instances).filter((c)=>c.canvas===canvas).pop();};function moveNumericKeys(obj,start,move){const keys=Object.keys(obj);for(const key of keys){const intKey=+key;if(intKey>=start){const value=obj[key];delete obj[key];if(move>0||intKey>start){obj[intKey+move]=value;}}}}
function determineLastEvent(e,lastEvent,inChartArea,isClick){if(!inChartArea||e.type==='mouseout'){return null;}
if(isClick){return lastEvent;}
return e;}
function getSizeForArea(scale,chartArea,field){return scale.options.clip?scale[field]:chartArea[field];}
function getDatasetArea(meta,chartArea){const{xScale,yScale}=meta;if(xScale&&yScale){return{left:getSizeForArea(xScale,chartArea,'left'),right:getSizeForArea(xScale,chartArea,'right'),top:getSizeForArea(yScale,chartArea,'top'),bottom:getSizeForArea(yScale,chartArea,'bottom')};}
return chartArea;}
class Chart{static defaults=defaults;static instances=instances;static overrides=overrides;static registry=registry;static version=version;static getChart=getChart;static register(...items){registry.add(...items);invalidatePlugins();}
static unregister(...items){registry.remove(...items);invalidatePlugins();}
constructor(item,userConfig){const config=this.config=new Config(userConfig);const initialCanvas=getCanvas(item);const existingChart=getChart(initialCanvas);if(existingChart){throw new Error('Canvas is already in use. Chart with ID \''+existingChart.id+'\''+' must be destroyed before the canvas with ID \''+existingChart.canvas.id+'\' can be reused.');}
const options=config.createResolver(config.chartOptionScopes(),this.getContext());this.platform=new(config.platform||_detectPlatform(initialCanvas))();this.platform.updateConfig(config);const context=this.platform.acquireContext(initialCanvas,options.aspectRatio);const canvas=context&&context.canvas;const height=canvas&&canvas.height;const width=canvas&&canvas.width;this.id=uid();this.ctx=context;this.canvas=canvas;this.width=width;this.height=height;this._options=options;this._aspectRatio=this.aspectRatio;this._layers=[];this._metasets=[];this._stacks=undefined;this.boxes=[];this.currentDevicePixelRatio=undefined;this.chartArea=undefined;this._active=[];this._lastEvent=undefined;this._listeners={};this._responsiveListeners=undefined;this._sortedMetasets=[];this.scales={};this._plugins=new PluginService();this.$proxies={};this._hiddenIndices={};this.attached=false;this._animationsDisabled=undefined;this.$context=undefined;this._doResize=debounce((mode)=>this.update(mode),options.resizeDelay||0);this._dataChanges=[];instances[this.id]=this;if(!context||!canvas){console.error("Failed to create chart: can't acquire context from the given item");return;}
animator.listen(this,'complete',onAnimationsComplete);animator.listen(this,'progress',onAnimationProgress);this._initialize();if(this.attached){this.update();}}
get aspectRatio(){const{options:{aspectRatio,maintainAspectRatio},width,height,_aspectRatio}=this;if(!isNullOrUndef(aspectRatio)){return aspectRatio;}
if(maintainAspectRatio&&_aspectRatio){return _aspectRatio;}
return height?width/height:null;}
get data(){return this.config.data;}
set data(data){this.config.data=data;}
get options(){return this._options;}
set options(options){this.config.options=options;}
get registry(){return registry;}
_initialize(){this.notifyPlugins('beforeInit');if(this.options.responsive){this.resize();}else{retinaScale(this,this.options.devicePixelRatio);}
this.bindEvents();this.notifyPlugins('afterInit');return this;}
clear(){clearCanvas(this.canvas,this.ctx);return this;}
stop(){animator.stop(this);return this;}
resize(width,height){if(!animator.running(this)){this._resize(width,height);}else{this._resizeBeforeDraw={width,height};}}
_resize(width,height){const options=this.options;const canvas=this.canvas;const aspectRatio=options.maintainAspectRatio&&this.aspectRatio;const newSize=this.platform.getMaximumSize(canvas,width,height,aspectRatio);const newRatio=options.devicePixelRatio||this.platform.getDevicePixelRatio();const mode=this.width?'resize':'attach';this.width=newSize.width;this.height=newSize.height;this._aspectRatio=this.aspectRatio;if(!retinaScale(this,newRatio,true)){return;}
this.notifyPlugins('resize',{size:newSize});callback(options.onResize,[this,newSize],this);if(this.attached){if(this._doResize(mode)){this.render();}}}
ensureScalesHaveIDs(){const options=this.options;const scalesOptions=options.scales||{};each(scalesOptions,(axisOptions,axisID)=>{axisOptions.id=axisID;});}
buildOrUpdateScales(){const options=this.options;const scaleOpts=options.scales;const scales=this.scales;const updated=Object.keys(scales).reduce((obj,id)=>{obj[id]=false;return obj;},{});let items=[];if(scaleOpts){items=items.concat(Object.keys(scaleOpts).map((id)=>{const scaleOptions=scaleOpts[id];const axis=determineAxis(id,scaleOptions);const isRadial=axis==='r';const isHorizontal=axis==='x';return{options:scaleOptions,dposition:isRadial?'chartArea':isHorizontal?'bottom':'left',dtype:isRadial?'radialLinear':isHorizontal?'category':'linear'};}));}
each(items,(item)=>{const scaleOptions=item.options;const id=scaleOptions.id;const axis=determineAxis(id,scaleOptions);const scaleType=valueOrDefault(scaleOptions.type,item.dtype);if(scaleOptions.position===undefined||positionIsHorizontal(scaleOptions.position,axis)!==positionIsHorizontal(item.dposition)){scaleOptions.position=item.dposition;}
updated[id]=true;let scale=null;if(id in scales&&scales[id].type===scaleType){scale=scales[id];}else{const scaleClass=registry.getScale(scaleType);scale=new scaleClass({id,type:scaleType,ctx:this.ctx,chart:this});scales[scale.id]=scale;}
scale.init(scaleOptions,options);});each(updated,(hasUpdated,id)=>{if(!hasUpdated){delete scales[id];}});each(scales,(scale)=>{layouts.configure(this,scale,scale.options);layouts.addBox(this,scale);});}
_updateMetasets(){const metasets=this._metasets;const numData=this.data.datasets.length;const numMeta=metasets.length;metasets.sort((a,b)=>a.index-b.index);if(numMeta>numData){for(let i=numData;i<numMeta;++i){this._destroyDatasetMeta(i);}
metasets.splice(numData,numMeta-numData);}
this._sortedMetasets=metasets.slice(0).sort(compare2Level('order','index'));}
_removeUnreferencedMetasets(){const{_metasets:metasets,data:{datasets}}=this;if(metasets.length>datasets.length){delete this._stacks;}
metasets.forEach((meta,index)=>{if(datasets.filter((x)=>x===meta._dataset).length===0){this._destroyDatasetMeta(index);}});}
buildOrUpdateControllers(){const newControllers=[];const datasets=this.data.datasets;let i,ilen;this._removeUnreferencedMetasets();for(i=0,ilen=datasets.length;i<ilen;i++){const dataset=datasets[i];let meta=this.getDatasetMeta(i);const type=dataset.type||this.config.type;if(meta.type&&meta.type!==type){this._destroyDatasetMeta(i);meta=this.getDatasetMeta(i);}
meta.type=type;meta.indexAxis=dataset.indexAxis||getIndexAxis(type,this.options);meta.order=dataset.order||0;meta.index=i;meta.label=''+dataset.label;meta.visible=this.isDatasetVisible(i);if(meta.controller){meta.controller.updateIndex(i);meta.controller.linkScales();}else{const ControllerClass=registry.getController(type);const{datasetElementType,dataElementType}=defaults.datasets[type];Object.assign(ControllerClass,{dataElementType:registry.getElement(dataElementType),datasetElementType:datasetElementType&&registry.getElement(datasetElementType)});meta.controller=new ControllerClass(this,i);newControllers.push(meta.controller);}}
this._updateMetasets();return newControllers;}
_resetElements(){each(this.data.datasets,(dataset,datasetIndex)=>{this.getDatasetMeta(datasetIndex).controller.reset();},this);}
reset(){this._resetElements();this.notifyPlugins('reset');}
update(mode){const config=this.config;config.update();const options=this._options=config.createResolver(config.chartOptionScopes(),this.getContext());const animsDisabled=this._animationsDisabled=!options.animation;this._updateScales();this._checkEventBindings();this._updateHiddenIndices();this._plugins.invalidate();if(this.notifyPlugins('beforeUpdate',{mode,cancelable:true})===false){return;}
const newControllers=this.buildOrUpdateControllers();this.notifyPlugins('beforeElementsUpdate');let minPadding=0;for(let i=0,ilen=this.data.datasets.length;i<ilen;i++){const{controller}=this.getDatasetMeta(i);const reset=!animsDisabled&&newControllers.indexOf(controller)===-1;controller.buildOrUpdateElements(reset);minPadding=Math.max(+controller.getMaxOverflow(),minPadding);}
minPadding=this._minPadding=options.layout.autoPadding?minPadding:0;this._updateLayout(minPadding);if(!animsDisabled){each(newControllers,(controller)=>{controller.reset();});}
this._updateDatasets(mode);this.notifyPlugins('afterUpdate',{mode});this._layers.sort(compare2Level('z','_idx'));const{_active,_lastEvent}=this;if(_lastEvent){this._eventHandler(_lastEvent,true);}else if(_active.length){this._updateHoverStyles(_active,_active,true);}
this.render();}
_updateScales(){each(this.scales,(scale)=>{layouts.removeBox(this,scale);});this.ensureScalesHaveIDs();this.buildOrUpdateScales();}
_checkEventBindings(){const options=this.options;const existingEvents=new Set(Object.keys(this._listeners));const newEvents=new Set(options.events);if(!setsEqual(existingEvents,newEvents)||!!this._responsiveListeners!==options.responsive){this.unbindEvents();this.bindEvents();}}
_updateHiddenIndices(){const{_hiddenIndices}=this;const changes=this._getUniformDataChanges()||[];for(const{method,start,count}of changes){const move=method==='_removeElements'?-count:count;moveNumericKeys(_hiddenIndices,start,move);}}
_getUniformDataChanges(){const _dataChanges=this._dataChanges;if(!_dataChanges||!_dataChanges.length){return;}
this._dataChanges=[];const datasetCount=this.data.datasets.length;const makeSet=(idx)=>new Set(_dataChanges.filter((c)=>c[0]===idx).map((c,i)=>i+','+c.splice(1).join(',')));const changeSet=makeSet(0);for(let i=1;i<datasetCount;i++){if(!setsEqual(changeSet,makeSet(i))){return;}}
return Array.from(changeSet).map((c)=>c.split(',')).map((a)=>({method:a[1],start:+a[2],count:+a[3]}));}
_updateLayout(minPadding){if(this.notifyPlugins('beforeLayout',{cancelable:true})===false){return;}
layouts.update(this,this.width,this.height,minPadding);const area=this.chartArea;const noArea=area.width<=0||area.height<=0;this._layers=[];each(this.boxes,(box)=>{if(noArea&&box.position==='chartArea'){return;}
if(box.configure){box.configure();}
this._layers.push(...box._layers());},this);this._layers.forEach((item,index)=>{item._idx=index;});this.notifyPlugins('afterLayout');}
_updateDatasets(mode){if(this.notifyPlugins('beforeDatasetsUpdate',{mode,cancelable:true})===false){return;}
for(let i=0,ilen=this.data.datasets.length;i<ilen;++i){this.getDatasetMeta(i).controller.configure();}
for(let i=0,ilen=this.data.datasets.length;i<ilen;++i){this._updateDataset(i,isFunction(mode)?mode({datasetIndex:i}):mode);}
this.notifyPlugins('afterDatasetsUpdate',{mode});}
_updateDataset(index,mode){const meta=this.getDatasetMeta(index);const args={meta,index,mode,cancelable:true};if(this.notifyPlugins('beforeDatasetUpdate',args)===false){return;}
meta.controller._update(mode);args.cancelable=false;this.notifyPlugins('afterDatasetUpdate',args);}
render(){if(this.notifyPlugins('beforeRender',{cancelable:true})===false){return;}
if(animator.has(this)){if(this.attached&&!animator.running(this)){animator.start(this);}}else{this.draw();onAnimationsComplete({chart:this});}}
draw(){let i;if(this._resizeBeforeDraw){const{width,height}=this._resizeBeforeDraw;this._resizeBeforeDraw=null;this._resize(width,height);}
this.clear();if(this.width<=0||this.height<=0){return;}
if(this.notifyPlugins('beforeDraw',{cancelable:true})===false){return;}
const layers=this._layers;for(i=0;i<layers.length&&layers[i].z<=0;++i){layers[i].draw(this.chartArea);}
this._drawDatasets();for(;i<layers.length;++i){layers[i].draw(this.chartArea);}
this.notifyPlugins('afterDraw');}
_getSortedDatasetMetas(filterVisible){const metasets=this._sortedMetasets;const result=[];let i,ilen;for(i=0,ilen=metasets.length;i<ilen;++i){const meta=metasets[i];if(!filterVisible||meta.visible){result.push(meta);}}
return result;}
getSortedVisibleDatasetMetas(){return this._getSortedDatasetMetas(true);}
_drawDatasets(){if(this.notifyPlugins('beforeDatasetsDraw',{cancelable:true})===false){return;}
const metasets=this.getSortedVisibleDatasetMetas();for(let i=metasets.length-1;i>=0;--i){this._drawDataset(metasets[i]);}
this.notifyPlugins('afterDatasetsDraw');}
_drawDataset(meta){const ctx=this.ctx;const clip=meta._clip;const useClip=!clip.disabled;const area=getDatasetArea(meta,this.chartArea);const args={meta,index:meta.index,cancelable:true};if(this.notifyPlugins('beforeDatasetDraw',args)===false){return;}
if(useClip){clipArea(ctx,{left:clip.left===false?0:area.left-clip.left,right:clip.right===false?this.width:area.right+clip.right,top:clip.top===false?0:area.top-clip.top,bottom:clip.bottom===false?this.height:area.bottom+clip.bottom});}
meta.controller.draw();if(useClip){unclipArea(ctx);}
args.cancelable=false;this.notifyPlugins('afterDatasetDraw',args);}
isPointInArea(point){return _isPointInArea(point,this.chartArea,this._minPadding);}
getElementsAtEventForMode(e,mode,options,useFinalPosition){const method=Interaction.modes[mode];if(typeof method==='function'){return method(this,e,options,useFinalPosition);}
return[];}
getDatasetMeta(datasetIndex){const dataset=this.data.datasets[datasetIndex];const metasets=this._metasets;let meta=metasets.filter((x)=>x&&x._dataset===dataset).pop();if(!meta){meta={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:dataset&&dataset.order||0,index:datasetIndex,_dataset:dataset,_parsed:[],_sorted:false};metasets.push(meta);}
return meta;}
getContext(){return this.$context||(this.$context=createContext(null,{chart:this,type:'chart'}));}
getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length;}
isDatasetVisible(datasetIndex){const dataset=this.data.datasets[datasetIndex];if(!dataset){return false;}
const meta=this.getDatasetMeta(datasetIndex);return typeof meta.hidden==='boolean'?!meta.hidden:!dataset.hidden;}
setDatasetVisibility(datasetIndex,visible){const meta=this.getDatasetMeta(datasetIndex);meta.hidden=!visible;}
toggleDataVisibility(index){this._hiddenIndices[index]=!this._hiddenIndices[index];}
getDataVisibility(index){return!this._hiddenIndices[index];}
_updateVisibility(datasetIndex,dataIndex,visible){const mode=visible?'show':'hide';const meta=this.getDatasetMeta(datasetIndex);const anims=meta.controller._resolveAnimations(undefined,mode);if(defined(dataIndex)){meta.data[dataIndex].hidden=!visible;this.update();}else{this.setDatasetVisibility(datasetIndex,visible);anims.update(meta,{visible});this.update((ctx)=>ctx.datasetIndex===datasetIndex?mode:undefined);}}
hide(datasetIndex,dataIndex){this._updateVisibility(datasetIndex,dataIndex,false);}
show(datasetIndex,dataIndex){this._updateVisibility(datasetIndex,dataIndex,true);}
_destroyDatasetMeta(datasetIndex){const meta=this._metasets[datasetIndex];if(meta&&meta.controller){meta.controller._destroy();}
delete this._metasets[datasetIndex];}
_stop(){let i,ilen;this.stop();animator.remove(this);for(i=0,ilen=this.data.datasets.length;i<ilen;++i){this._destroyDatasetMeta(i);}}
destroy(){this.notifyPlugins('beforeDestroy');const{canvas,ctx}=this;this._stop();this.config.clearCache();if(canvas){this.unbindEvents();clearCanvas(canvas,ctx);this.platform.releaseContext(ctx);this.canvas=null;this.ctx=null;}
delete instances[this.id];this.notifyPlugins('afterDestroy');}
toBase64Image(...args){return this.canvas.toDataURL(...args);}
bindEvents(){this.bindUserEvents();if(this.options.responsive){this.bindResponsiveEvents();}else{this.attached=true;}}
bindUserEvents(){const listeners=this._listeners;const platform=this.platform;const _add=(type,listener)=>{platform.addEventListener(this,type,listener);listeners[type]=listener;};const listener=(e,x,y)=>{e.offsetX=x;e.offsetY=y;this._eventHandler(e);};each(this.options.events,(type)=>_add(type,listener));}
bindResponsiveEvents(){if(!this._responsiveListeners){this._responsiveListeners={};}
const listeners=this._responsiveListeners;const platform=this.platform;const _add=(type,listener)=>{platform.addEventListener(this,type,listener);listeners[type]=listener;};const _remove=(type,listener)=>{if(listeners[type]){platform.removeEventListener(this,type,listener);delete listeners[type];}};const listener=(width,height)=>{if(this.canvas){this.resize(width,height);}};let detached;const attached=()=>{_remove('attach',attached);this.attached=true;this.resize();_add('resize',listener);_add('detach',detached);};detached=()=>{this.attached=false;_remove('resize',listener);this._stop();this._resize(0,0);_add('attach',attached);};if(platform.isAttached(this.canvas)){attached();}else{detached();}}
unbindEvents(){each(this._listeners,(listener,type)=>{this.platform.removeEventListener(this,type,listener);});this._listeners={};each(this._responsiveListeners,(listener,type)=>{this.platform.removeEventListener(this,type,listener);});this._responsiveListeners=undefined;}
updateHoverStyle(items,mode,enabled){const prefix=enabled?'set':'remove';let meta,item,i,ilen;if(mode==='dataset'){meta=this.getDatasetMeta(items[0].datasetIndex);meta.controller['_'+prefix+'DatasetHoverStyle']();}
for(i=0,ilen=items.length;i<ilen;++i){item=items[i];const controller=item&&this.getDatasetMeta(item.datasetIndex).controller;if(controller){controller[prefix+'HoverStyle'](item.element,item.datasetIndex,item.index);}}}
getActiveElements(){return this._active||[];}
setActiveElements(activeElements){const lastActive=this._active||[];const active=activeElements.map(({datasetIndex,index})=>{const meta=this.getDatasetMeta(datasetIndex);if(!meta){throw new Error('No dataset found at index '+datasetIndex);}
return{datasetIndex,element:meta.data[index],index};});const changed=!_elementsEqual(active,lastActive);if(changed){this._active=active;this._lastEvent=null;this._updateHoverStyles(active,lastActive);}}
notifyPlugins(hook,args,filter){return this._plugins.notify(this,hook,args,filter);}
isPluginEnabled(pluginId){return this._plugins._cache.filter((p)=>p.plugin.id===pluginId).length===1;}
_updateHoverStyles(active,lastActive,replay){const hoverOptions=this.options.hover;const diff=(a,b)=>a.filter((x)=>!b.some((y)=>x.datasetIndex===y.datasetIndex&&x.index===y.index));const deactivated=diff(lastActive,active);const activated=replay?active:diff(active,lastActive);if(deactivated.length){this.updateHoverStyle(deactivated,hoverOptions.mode,false);}
if(activated.length&&hoverOptions.mode){this.updateHoverStyle(activated,hoverOptions.mode,true);}}
_eventHandler(e,replay){const args={event:e,replay,cancelable:true,inChartArea:this.isPointInArea(e)};const eventFilter=(plugin)=>(plugin.options.events||this.options.events).includes(e.native.type);if(this.notifyPlugins('beforeEvent',args,eventFilter)===false){return;}
const changed=this._handleEvent(e,replay,args.inChartArea);args.cancelable=false;this.notifyPlugins('afterEvent',args,eventFilter);if(changed||args.changed){this.render();}
return this;}
_handleEvent(e,replay,inChartArea){const{_active:lastActive=[],options}=this;const useFinalPosition=replay;const active=this._getActiveElements(e,lastActive,inChartArea,useFinalPosition);const isClick=_isClickEvent(e);const lastEvent=determineLastEvent(e,this._lastEvent,inChartArea,isClick);if(inChartArea){this._lastEvent=null;callback(options.onHover,[e,active,this],this);if(isClick){callback(options.onClick,[e,active,this],this);}}
const changed=!_elementsEqual(active,lastActive);if(changed||replay){this._active=active;this._updateHoverStyles(active,lastActive,replay);}
this._lastEvent=lastEvent;return changed;}
_getActiveElements(e,lastActive,inChartArea,useFinalPosition){if(e.type==='mouseout'){return[];}
if(!inChartArea){return lastActive;}
const hoverOptions=this.options.hover;return this.getElementsAtEventForMode(e,hoverOptions.mode,hoverOptions,useFinalPosition);}}
function invalidatePlugins(){return each(Chart.instances,(chart)=>chart._plugins.invalidate());}
function abstract(){throw new Error('This method is not implemented: Check that a complete date adapter is provided.');}
class DateAdapterBase{static override(members){Object.assign(DateAdapterBase.prototype,members);}
options;constructor(options){this.options=options||{};}
init(){}
formats(){return abstract();}
parse(){return abstract();}
format(){return abstract();}
add(){return abstract();}
diff(){return abstract();}
startOf(){return abstract();}
endOf(){return abstract();}}
var _adapters={_date:DateAdapterBase};function getAllScaleValues(scale,type){if(!scale._cache.$bar){const visibleMetas=scale.getMatchingVisibleMetas(type);let values=[];for(let i=0,ilen=visibleMetas.length;i<ilen;i++){values=values.concat(visibleMetas[i].controller.getAllParsedValues(scale));}
scale._cache.$bar=_arrayUnique(values.sort((a,b)=>a-b));}
return scale._cache.$bar;}
function computeMinSampleSize(meta){const scale=meta.iScale;const values=getAllScaleValues(scale,meta.type);let min=scale._length;let i,ilen,curr,prev;const updateMinAndPrev=()=>{if(curr===32767||curr===-32768){return;}
if(defined(prev)){min=Math.min(min,Math.abs(curr-prev)||min);}
prev=curr;};for(i=0,ilen=values.length;i<ilen;++i){curr=scale.getPixelForValue(values[i]);updateMinAndPrev();}
prev=undefined;for(i=0,ilen=scale.ticks.length;i<ilen;++i){curr=scale.getPixelForTick(i);updateMinAndPrev();}
return min;}
function computeFitCategoryTraits(index,ruler,options,stackCount){const thickness=options.barThickness;let size,ratio;if(isNullOrUndef(thickness)){size=ruler.min*options.categoryPercentage;ratio=options.barPercentage;}else{size=thickness*stackCount;ratio=1;}
return{chunk:size/stackCount,ratio,start:ruler.pixels[index]-size/2};}
function computeFlexCategoryTraits(index,ruler,options,stackCount){const pixels=ruler.pixels;const curr=pixels[index];let prev=index>0?pixels[index-1]:null;let next=index<pixels.length-1?pixels[index+1]:null;const percent=options.categoryPercentage;if(prev===null){prev=curr-(next===null?ruler.end-ruler.start:next-curr);}
if(next===null){next=curr+curr-prev;}
const start=curr-(curr-Math.min(prev,next))/2*percent;const size=Math.abs(next-prev)/2*percent;return{chunk:size/stackCount,ratio:options.barPercentage,start};}
function parseFloatBar(entry,item,vScale,i){const startValue=vScale.parse(entry[0],i);const endValue=vScale.parse(entry[1],i);const min=Math.min(startValue,endValue);const max=Math.max(startValue,endValue);let barStart=min;let barEnd=max;if(Math.abs(min)>Math.abs(max)){barStart=max;barEnd=min;}
item[vScale.axis]=barEnd;item._custom={barStart,barEnd,start:startValue,end:endValue,min,max};}
function parseValue(entry,item,vScale,i){if(isArray(entry)){parseFloatBar(entry,item,vScale,i);}else{item[vScale.axis]=vScale.parse(entry,i);}
return item;}
function parseArrayOrPrimitive(meta,data,start,count){const iScale=meta.iScale;const vScale=meta.vScale;const labels=iScale.getLabels();const singleScale=iScale===vScale;const parsed=[];let i,ilen,item,entry;for(i=start,ilen=start+count;i<ilen;++i){entry=data[i];item={};item[iScale.axis]=singleScale||iScale.parse(labels[i],i);parsed.push(parseValue(entry,item,vScale,i));}
return parsed;}
function isFloatBar(custom){return custom&&custom.barStart!==undefined&&custom.barEnd!==undefined;}
function barSign(size,vScale,actualBase){if(size!==0){return sign(size);}
return(vScale.isHorizontal()?1:-1)*(vScale.min>=actualBase?1:-1);}
function borderProps(properties){let reverse,start,end,top,bottom;if(properties.horizontal){reverse=properties.base>properties.x;start='left';end='right';}else{reverse=properties.base<properties.y;start='bottom';end='top';}
if(reverse){top='end';bottom='start';}else{top='start';bottom='end';}
return{start,end,reverse,top,bottom};}
function setBorderSkipped(properties,options,stack,index){let edge=options.borderSkipped;const res={};if(!edge){properties.borderSkipped=res;return;}
if(edge===true){properties.borderSkipped={top:true,right:true,bottom:true,left:true};return;}
const{start,end,reverse,top,bottom}=borderProps(properties);if(edge==='middle'&&stack){properties.enableBorderRadius=true;if((stack._top||0)===index){edge=top;}else if((stack._bottom||0)===index){edge=bottom;}else{res[parseEdge(bottom,start,end,reverse)]=true;edge=top;}}
res[parseEdge(edge,start,end,reverse)]=true;properties.borderSkipped=res;}
function parseEdge(edge,a,b,reverse){if(reverse){edge=swap(edge,a,b);edge=startEnd(edge,b,a);}else{edge=startEnd(edge,a,b);}
return edge;}
function swap(orig,v1,v2){return orig===v1?v2:orig===v2?v1:orig;}
function startEnd(v,start,end){return v==='start'?start:v==='end'?end:v;}
function setInflateAmount(properties,{inflateAmount},ratio){properties.inflateAmount=inflateAmount==='auto'?ratio===1?0.33:0:inflateAmount;}
class BarController extends DatasetController{static id='bar';static defaults={datasetElementType:false,dataElementType:'bar',categoryPercentage:0.8,barPercentage:0.9,grouped:true,animations:{numbers:{type:'number',properties:['x','y','base','width','height']}}};static overrides={scales:{_index_:{type:'category',offset:true,grid:{offset:true}},_value_:{type:'linear',beginAtZero:true}}};parsePrimitiveData(meta,data,start,count){return parseArrayOrPrimitive(meta,data,start,count);}
parseArrayData(meta,data,start,count){return parseArrayOrPrimitive(meta,data,start,count);}
parseObjectData(meta,data,start,count){const{iScale,vScale}=meta;const{xAxisKey='x',yAxisKey='y'}=this._parsing;const iAxisKey=iScale.axis==='x'?xAxisKey:yAxisKey;const vAxisKey=vScale.axis==='x'?xAxisKey:yAxisKey;const parsed=[];let i,ilen,item,obj;for(i=start,ilen=start+count;i<ilen;++i){obj=data[i];item={};item[iScale.axis]=iScale.parse(resolveObjectKey(obj,iAxisKey),i);parsed.push(parseValue(resolveObjectKey(obj,vAxisKey),item,vScale,i));}
return parsed;}
updateRangeFromParsed(range,scale,parsed,stack){super.updateRangeFromParsed(range,scale,parsed,stack);const custom=parsed._custom;if(custom&&scale===this._cachedMeta.vScale){range.min=Math.min(range.min,custom.min);range.max=Math.max(range.max,custom.max);}}
getMaxOverflow(){return 0;}
getLabelAndValue(index){const meta=this._cachedMeta;const{iScale,vScale}=meta;const parsed=this.getParsed(index);const custom=parsed._custom;const value=isFloatBar(custom)?'['+custom.start+', '+custom.end+']':''+vScale.getLabelForValue(parsed[vScale.axis]);return{label:''+iScale.getLabelForValue(parsed[iScale.axis]),value};}
initialize(){this.enableOptionSharing=true;super.initialize();const meta=this._cachedMeta;meta.stack=this.getDataset().stack;}
update(mode){const meta=this._cachedMeta;this.updateElements(meta.data,0,meta.data.length,mode);}
updateElements(bars,start,count,mode){const reset=mode==='reset';const{index,_cachedMeta:{vScale}}=this;const base=vScale.getBasePixel();const horizontal=vScale.isHorizontal();const ruler=this._getRuler();const{sharedOptions,includeOptions}=this._getSharedOptions(start,mode);for(let i=start;i<start+count;i++){const parsed=this.getParsed(i);const vpixels=reset||isNullOrUndef(parsed[vScale.axis])?{base,head:base}:this._calculateBarValuePixels(i);const ipixels=this._calculateBarIndexPixels(i,ruler);const stack=(parsed._stacks||{})[vScale.axis];const properties={horizontal,base:vpixels.base,enableBorderRadius:!stack||isFloatBar(parsed._custom)||index===stack._top||index===stack._bottom,x:horizontal?vpixels.head:ipixels.center,y:horizontal?ipixels.center:vpixels.head,height:horizontal?ipixels.size:Math.abs(vpixels.size),width:horizontal?Math.abs(vpixels.size):ipixels.size};if(includeOptions){properties.options=sharedOptions||this.resolveDataElementOptions(i,bars[i].active?'active':mode);}
const options=properties.options||bars[i].options;setBorderSkipped(properties,options,stack,index);setInflateAmount(properties,options,ruler.ratio);this.updateElement(bars[i],i,properties,mode);}}
_getStacks(last,dataIndex){const{iScale}=this._cachedMeta;const metasets=iScale.getMatchingVisibleMetas(this._type).filter((meta)=>meta.controller.options.grouped);const stacked=iScale.options.stacked;const stacks=[];const currentParsed=this._cachedMeta.controller.getParsed(dataIndex);const iScaleValue=currentParsed&&currentParsed[iScale.axis];const skipNull=(meta)=>{const parsed=meta._parsed.find((item)=>item[iScale.axis]===iScaleValue);const val=parsed&&parsed[meta.vScale.axis];if(isNullOrUndef(val)||isNaN(val)){return true;}};for(const meta of metasets){if(dataIndex!==undefined&&skipNull(meta)){continue;}
if(stacked===false||stacks.indexOf(meta.stack)===-1||stacked===undefined&&meta.stack===undefined){stacks.push(meta.stack);}
if(meta.index===last){break;}}
if(!stacks.length){stacks.push(undefined);}
return stacks;}
_getStackCount(index){return this._getStacks(undefined,index).length;}
_getStackIndex(datasetIndex,name,dataIndex){const stacks=this._getStacks(datasetIndex,dataIndex);const index=name!==undefined?stacks.indexOf(name):-1;return index===-1?stacks.length-1:index;}
_getRuler(){const opts=this.options;const meta=this._cachedMeta;const iScale=meta.iScale;const pixels=[];let i,ilen;for(i=0,ilen=meta.data.length;i<ilen;++i){pixels.push(iScale.getPixelForValue(this.getParsed(i)[iScale.axis],i));}
const barThickness=opts.barThickness;const min=barThickness||computeMinSampleSize(meta);return{min,pixels,start:iScale._startPixel,end:iScale._endPixel,stackCount:this._getStackCount(),scale:iScale,grouped:opts.grouped,ratio:barThickness?1:opts.categoryPercentage*opts.barPercentage};}
_calculateBarValuePixels(index){const{_cachedMeta:{vScale,_stacked,index:datasetIndex},options:{base:baseValue,minBarLength}}=this;const actualBase=baseValue||0;const parsed=this.getParsed(index);const custom=parsed._custom;const floating=isFloatBar(custom);let value=parsed[vScale.axis];let start=0;let length=_stacked?this.applyStack(vScale,parsed,_stacked):value;let head,size;if(length!==value){start=length-value;length=value;}
if(floating){value=custom.barStart;length=custom.barEnd-custom.barStart;if(value!==0&&sign(value)!==sign(custom.barEnd)){start=0;}
start+=value;}
const startValue=!isNullOrUndef(baseValue)&&!floating?baseValue:start;let base=vScale.getPixelForValue(startValue);if(this.chart.getDataVisibility(index)){head=vScale.getPixelForValue(start+length);}else{head=base;}
size=head-base;if(Math.abs(size)<minBarLength){size=barSign(size,vScale,actualBase)*minBarLength;if(value===actualBase){base-=size/2;}
const startPixel=vScale.getPixelForDecimal(0);const endPixel=vScale.getPixelForDecimal(1);const min=Math.min(startPixel,endPixel);const max=Math.max(startPixel,endPixel);base=Math.max(Math.min(base,max),min);head=base+size;if(_stacked&&!floating){parsed._stacks[vScale.axis]._visualValues[datasetIndex]=vScale.getValueForPixel(head)-vScale.getValueForPixel(base);}}
if(base===vScale.getPixelForValue(actualBase)){const halfGrid=sign(size)*vScale.getLineWidthForValue(actualBase)/2;base+=halfGrid;size-=halfGrid;}
return{size,base,head,center:head+size/2};}
_calculateBarIndexPixels(index,ruler){const scale=ruler.scale;const options=this.options;const skipNull=options.skipNull;const maxBarThickness=valueOrDefault(options.maxBarThickness,Infinity);let center,size;if(ruler.grouped){const stackCount=skipNull?this._getStackCount(index):ruler.stackCount;const range=options.barThickness==='flex'?computeFlexCategoryTraits(index,ruler,options,stackCount):computeFitCategoryTraits(index,ruler,options,stackCount);const stackIndex=this._getStackIndex(this.index,this._cachedMeta.stack,skipNull?index:undefined);center=range.start+range.chunk*stackIndex+range.chunk/2;size=Math.min(maxBarThickness,range.chunk*range.ratio);}else{center=scale.getPixelForValue(this.getParsed(index)[scale.axis],index);size=Math.min(maxBarThickness,ruler.min*ruler.ratio);}
return{base:center-size/2,head:center+size/2,center,size};}
draw(){const meta=this._cachedMeta;const vScale=meta.vScale;const rects=meta.data;const ilen=rects.length;let i=0;for(;i<ilen;++i){if(this.getParsed(i)[vScale.axis]!==null&&!rects[i].hidden){rects[i].draw(this._ctx);}}}}
class BubbleController extends DatasetController{static id='bubble';static defaults={datasetElementType:false,dataElementType:'point',animations:{numbers:{type:'number',properties:['x','y','borderWidth','radius']}}};static overrides={scales:{x:{type:'linear'},y:{type:'linear'}}};initialize(){this.enableOptionSharing=true;super.initialize();}
parsePrimitiveData(meta,data,start,count){const parsed=super.parsePrimitiveData(meta,data,start,count);for(let i=0;i<parsed.length;i++){parsed[i]._custom=this.resolveDataElementOptions(i+start).radius;}
return parsed;}
parseArrayData(meta,data,start,count){const parsed=super.parseArrayData(meta,data,start,count);for(let i=0;i<parsed.length;i++){const item=data[start+i];parsed[i]._custom=valueOrDefault(item[2],this.resolveDataElementOptions(i+start).radius);}
return parsed;}
parseObjectData(meta,data,start,count){const parsed=super.parseObjectData(meta,data,start,count);for(let i=0;i<parsed.length;i++){const item=data[start+i];parsed[i]._custom=valueOrDefault(item&&item.r&&+item.r,this.resolveDataElementOptions(i+start).radius);}
return parsed;}
getMaxOverflow(){const data=this._cachedMeta.data;let max=0;for(let i=data.length-1;i>=0;--i){max=Math.max(max,data[i].size(this.resolveDataElementOptions(i))/2);}
return max>0&&max;}
getLabelAndValue(index){const meta=this._cachedMeta;const labels=this.chart.data.labels||[];const{xScale,yScale}=meta;const parsed=this.getParsed(index);const x=xScale.getLabelForValue(parsed.x);const y=yScale.getLabelForValue(parsed.y);const r=parsed._custom;return{label:labels[index]||'',value:'('+x+', '+y+(r?', '+r:'')+')'};}
update(mode){const points=this._cachedMeta.data;this.updateElements(points,0,points.length,mode);}
updateElements(points,start,count,mode){const reset=mode==='reset';const{iScale,vScale}=this._cachedMeta;const{sharedOptions,includeOptions}=this._getSharedOptions(start,mode);const iAxis=iScale.axis;const vAxis=vScale.axis;for(let i=start;i<start+count;i++){const point=points[i];const parsed=!reset&&this.getParsed(i);const properties={};const iPixel=properties[iAxis]=reset?iScale.getPixelForDecimal(0.5):iScale.getPixelForValue(parsed[iAxis]);const vPixel=properties[vAxis]=reset?vScale.getBasePixel():vScale.getPixelForValue(parsed[vAxis]);properties.skip=isNaN(iPixel)||isNaN(vPixel);if(includeOptions){properties.options=sharedOptions||this.resolveDataElementOptions(i,point.active?'active':mode);if(reset){properties.options.radius=0;}}
this.updateElement(point,i,properties,mode);}}
resolveDataElementOptions(index,mode){const parsed=this.getParsed(index);let values=super.resolveDataElementOptions(index,mode);if(values.$shared){values=Object.assign({},values,{$shared:false});}
const radius=values.radius;if(mode!=='active'){values.radius=0;}
values.radius+=valueOrDefault(parsed&&parsed._custom,radius);return values;}}
function getRatioAndOffset(rotation,circumference,cutout){let ratioX=1;let ratioY=1;let offsetX=0;let offsetY=0;if(circumference<TAU){const startAngle=rotation;const endAngle=startAngle+circumference;const startX=Math.cos(startAngle);const startY=Math.sin(startAngle);const endX=Math.cos(endAngle);const endY=Math.sin(endAngle);const calcMax=(angle,a,b)=>_angleBetween(angle,startAngle,endAngle,true)?1:Math.max(a,a*cutout,b,b*cutout);const calcMin=(angle,a,b)=>_angleBetween(angle,startAngle,endAngle,true)?-1:Math.min(a,a*cutout,b,b*cutout);const maxX=calcMax(0,startX,endX);const maxY=calcMax(HALF_PI,startY,endY);const minX=calcMin(PI,startX,endX);const minY=calcMin(PI+HALF_PI,startY,endY);ratioX=(maxX-minX)/2;ratioY=(maxY-minY)/2;offsetX=-(maxX+minX)/2;offsetY=-(maxY+minY)/2;}
return{ratioX,ratioY,offsetX,offsetY};}
class DoughnutController extends DatasetController{static id='doughnut';static defaults={datasetElementType:false,dataElementType:'arc',animation:{animateRotate:true,animateScale:false},animations:{numbers:{type:'number',properties:['circumference','endAngle','innerRadius','outerRadius','startAngle','x','y','offset','borderWidth','spacing']}},cutout:'50%',rotation:0,circumference:360,radius:'100%',spacing:0,indexAxis:'r'};static descriptors={_scriptable:(name)=>name!=='spacing',_indexable:(name)=>name!=='spacing'&&!name.startsWith('borderDash')&&!name.startsWith('hoverBorderDash')};static overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(chart){const data=chart.data;if(data.labels.length&&data.datasets.length){const{labels:{pointStyle,color}}=chart.legend.options;return data.labels.map((label,i)=>{const meta=chart.getDatasetMeta(0);const style=meta.controller.getStyle(i);return{text:label,fillStyle:style.backgroundColor,strokeStyle:style.borderColor,fontColor:color,lineWidth:style.borderWidth,pointStyle:pointStyle,hidden:!chart.getDataVisibility(i),index:i};});}
return[];}},onClick(e,legendItem,legend){legend.chart.toggleDataVisibility(legendItem.index);legend.chart.update();}}}};constructor(chart,datasetIndex){super(chart,datasetIndex);this.enableOptionSharing=true;this.innerRadius=undefined;this.outerRadius=undefined;this.offsetX=undefined;this.offsetY=undefined;}
linkScales(){}
parse(start,count){const data=this.getDataset().data;const meta=this._cachedMeta;if(this._parsing===false){meta._parsed=data;}else{let getter=(i)=>+data[i];if(isObject(data[start])){const{key='value'}=this._parsing;getter=(i)=>+resolveObjectKey(data[i],key);}
let i,ilen;for(i=start,ilen=start+count;i<ilen;++i){meta._parsed[i]=getter(i);}}}
_getRotation(){return toRadians(this.options.rotation-90);}
_getCircumference(){return toRadians(this.options.circumference);}
_getRotationExtents(){let min=TAU;let max=-TAU;for(let i=0;i<this.chart.data.datasets.length;++i){if(this.chart.isDatasetVisible(i)&&this.chart.getDatasetMeta(i).type===this._type){const controller=this.chart.getDatasetMeta(i).controller;const rotation=controller._getRotation();const circumference=controller._getCircumference();min=Math.min(min,rotation);max=Math.max(max,rotation+circumference);}}
return{rotation:min,circumference:max-min};}
update(mode){const chart=this.chart;const{chartArea}=chart;const meta=this._cachedMeta;const arcs=meta.data;const spacing=this.getMaxBorderWidth()+this.getMaxOffset(arcs)+this.options.spacing;const maxSize=Math.max((Math.min(chartArea.width,chartArea.height)-spacing)/2,0);const cutout=Math.min(toPercentage(this.options.cutout,maxSize),1);const chartWeight=this._getRingWeight(this.index);const{circumference,rotation}=this._getRotationExtents();const{ratioX,ratioY,offsetX,offsetY}=getRatioAndOffset(rotation,circumference,cutout);const maxWidth=(chartArea.width-spacing)/ratioX;const maxHeight=(chartArea.height-spacing)/ratioY;const maxRadius=Math.max(Math.min(maxWidth,maxHeight)/2,0);const outerRadius=toDimension(this.options.radius,maxRadius);const innerRadius=Math.max(outerRadius*cutout,0);const radiusLength=(outerRadius-innerRadius)/this._getVisibleDatasetWeightTotal();this.offsetX=offsetX*outerRadius;this.offsetY=offsetY*outerRadius;meta.total=this.calculateTotal();this.outerRadius=outerRadius-radiusLength*this._getRingWeightOffset(this.index);this.innerRadius=Math.max(this.outerRadius-radiusLength*chartWeight,0);this.updateElements(arcs,0,arcs.length,mode);}
_circumference(i,reset){const opts=this.options;const meta=this._cachedMeta;const circumference=this._getCircumference();if(reset&&opts.animation.animateRotate||!this.chart.getDataVisibility(i)||meta._parsed[i]===null||meta.data[i].hidden){return 0;}
return this.calculateCircumference(meta._parsed[i]*circumference/TAU);}
updateElements(arcs,start,count,mode){const reset=mode==='reset';const chart=this.chart;const chartArea=chart.chartArea;const opts=chart.options;const animationOpts=opts.animation;const centerX=(chartArea.left+chartArea.right)/2;const centerY=(chartArea.top+chartArea.bottom)/2;const animateScale=reset&&animationOpts.animateScale;const innerRadius=animateScale?0:this.innerRadius;const outerRadius=animateScale?0:this.outerRadius;const{sharedOptions,includeOptions}=this._getSharedOptions(start,mode);let startAngle=this._getRotation();let i;for(i=0;i<start;++i){startAngle+=this._circumference(i,reset);}
for(i=start;i<start+count;++i){const circumference=this._circumference(i,reset);const arc=arcs[i];const properties={x:centerX+this.offsetX,y:centerY+this.offsetY,startAngle,endAngle:startAngle+circumference,circumference,outerRadius,innerRadius};if(includeOptions){properties.options=sharedOptions||this.resolveDataElementOptions(i,arc.active?'active':mode);}
startAngle+=circumference;this.updateElement(arc,i,properties,mode);}}
calculateTotal(){const meta=this._cachedMeta;const metaData=meta.data;let total=0;let i;for(i=0;i<metaData.length;i++){const value=meta._parsed[i];if(value!==null&&!isNaN(value)&&this.chart.getDataVisibility(i)&&!metaData[i].hidden){total+=Math.abs(value);}}
return total;}
calculateCircumference(value){const total=this._cachedMeta.total;if(total>0&&!isNaN(value)){return TAU*(Math.abs(value)/total);}
return 0;}
getLabelAndValue(index){const meta=this._cachedMeta;const chart=this.chart;const labels=chart.data.labels||[];const value=formatNumber(meta._parsed[index],chart.options.locale);return{label:labels[index]||'',value};}
getMaxBorderWidth(arcs){let max=0;const chart=this.chart;let i,ilen,meta,controller,options;if(!arcs){for(i=0,ilen=chart.data.datasets.length;i<ilen;++i){if(chart.isDatasetVisible(i)){meta=chart.getDatasetMeta(i);arcs=meta.data;controller=meta.controller;break;}}}
if(!arcs){return 0;}
for(i=0,ilen=arcs.length;i<ilen;++i){options=controller.resolveDataElementOptions(i);if(options.borderAlign!=='inner'){max=Math.max(max,options.borderWidth||0,options.hoverBorderWidth||0);}}
return max;}
getMaxOffset(arcs){let max=0;for(let i=0,ilen=arcs.length;i<ilen;++i){const options=this.resolveDataElementOptions(i);max=Math.max(max,options.offset||0,options.hoverOffset||0);}
return max;}
_getRingWeightOffset(datasetIndex){let ringWeightOffset=0;for(let i=0;i<datasetIndex;++i){if(this.chart.isDatasetVisible(i)){ringWeightOffset+=this._getRingWeight(i);}}
return ringWeightOffset;}
_getRingWeight(datasetIndex){return Math.max(valueOrDefault(this.chart.data.datasets[datasetIndex].weight,1),0);}
_getVisibleDatasetWeightTotal(){return this._getRingWeightOffset(this.chart.data.datasets.length)||1;}}
class LineController extends DatasetController{static id='line';static defaults={datasetElementType:'line',dataElementType:'point',showLine:true,spanGaps:false};static overrides={scales:{_index_:{type:'category'},_value_:{type:'linear'}}};initialize(){this.enableOptionSharing=true;this.supportsDecimation=true;super.initialize();}
update(mode){const meta=this._cachedMeta;const{dataset:line,data:points=[],_dataset}=meta;const animationsDisabled=this.chart._animationsDisabled;let{start,count}=_getStartAndCountOfVisiblePoints(meta,points,animationsDisabled);this._drawStart=start;this._drawCount=count;if(_scaleRangesChanged(meta)){start=0;count=points.length;}
line._chart=this.chart;line._datasetIndex=this.index;line._decimated=!!_dataset._decimated;line.points=points;const options=this.resolveDatasetElementOptions(mode);if(!this.options.showLine){options.borderWidth=0;}
options.segment=this.options.segment;this.updateElement(line,undefined,{animated:!animationsDisabled,options},mode);this.updateElements(points,start,count,mode);}
updateElements(points,start,count,mode){const reset=mode==='reset';const{iScale,vScale,_stacked,_dataset}=this._cachedMeta;const{sharedOptions,includeOptions}=this._getSharedOptions(start,mode);const iAxis=iScale.axis;const vAxis=vScale.axis;const{spanGaps,segment}=this.options;const maxGapLength=isNumber(spanGaps)?spanGaps:Number.POSITIVE_INFINITY;const directUpdate=this.chart._animationsDisabled||reset||mode==='none';const end=start+count;const pointsCount=points.length;let prevParsed=start>0&&this.getParsed(start-1);for(let i=0;i<pointsCount;++i){const point=points[i];const properties=directUpdate?point:{};if(i<start||i>=end){properties.skip=true;continue;}
const parsed=this.getParsed(i);const nullData=isNullOrUndef(parsed[vAxis]);const iPixel=properties[iAxis]=iScale.getPixelForValue(parsed[iAxis],i);const vPixel=properties[vAxis]=reset||nullData?vScale.getBasePixel():vScale.getPixelForValue(_stacked?this.applyStack(vScale,parsed,_stacked):parsed[vAxis],i);properties.skip=isNaN(iPixel)||isNaN(vPixel)||nullData;properties.stop=i>0&&Math.abs(parsed[iAxis]-prevParsed[iAxis])>maxGapLength;if(segment){properties.parsed=parsed;properties.raw=_dataset.data[i];}
if(includeOptions){properties.options=sharedOptions||this.resolveDataElementOptions(i,point.active?'active':mode);}
if(!directUpdate){this.updateElement(point,i,properties,mode);}
prevParsed=parsed;}}
getMaxOverflow(){const meta=this._cachedMeta;const dataset=meta.dataset;const border=dataset.options&&dataset.options.borderWidth||0;const data=meta.data||[];if(!data.length){return border;}
const firstPoint=data[0].size(this.resolveDataElementOptions(0));const lastPoint=data[data.length-1].size(this.resolveDataElementOptions(data.length-1));return Math.max(border,firstPoint,lastPoint)/2;}
draw(){const meta=this._cachedMeta;meta.dataset.updateControlPoints(this.chart.chartArea,meta.iScale.axis);super.draw();}}
class PolarAreaController extends DatasetController{static id='polarArea';static defaults={dataElementType:'arc',animation:{animateRotate:true,animateScale:true},animations:{numbers:{type:'number',properties:['x','y','startAngle','endAngle','innerRadius','outerRadius']}},indexAxis:'r',startAngle:0};static overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(chart){const data=chart.data;if(data.labels.length&&data.datasets.length){const{labels:{pointStyle,color}}=chart.legend.options;return data.labels.map((label,i)=>{const meta=chart.getDatasetMeta(0);const style=meta.controller.getStyle(i);return{text:label,fillStyle:style.backgroundColor,strokeStyle:style.borderColor,fontColor:color,lineWidth:style.borderWidth,pointStyle:pointStyle,hidden:!chart.getDataVisibility(i),index:i};});}
return[];}},onClick(e,legendItem,legend){legend.chart.toggleDataVisibility(legendItem.index);legend.chart.update();}}},scales:{r:{type:'radialLinear',angleLines:{display:false},beginAtZero:true,grid:{circular:true},pointLabels:{display:false},startAngle:0}}};constructor(chart,datasetIndex){super(chart,datasetIndex);this.innerRadius=undefined;this.outerRadius=undefined;}
getLabelAndValue(index){const meta=this._cachedMeta;const chart=this.chart;const labels=chart.data.labels||[];const value=formatNumber(meta._parsed[index].r,chart.options.locale);return{label:labels[index]||'',value};}
parseObjectData(meta,data,start,count){return _parseObjectDataRadialScale.bind(this)(meta,data,start,count);}
update(mode){const arcs=this._cachedMeta.data;this._updateRadius();this.updateElements(arcs,0,arcs.length,mode);}
getMinMax(){const meta=this._cachedMeta;const range={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY};meta.data.forEach((element,index)=>{const parsed=this.getParsed(index).r;if(!isNaN(parsed)&&this.chart.getDataVisibility(index)){if(parsed<range.min){range.min=parsed;}
if(parsed>range.max){range.max=parsed;}}});return range;}
_updateRadius(){const chart=this.chart;const chartArea=chart.chartArea;const opts=chart.options;const minSize=Math.min(chartArea.right-chartArea.left,chartArea.bottom-chartArea.top);const outerRadius=Math.max(minSize/2,0);const innerRadius=Math.max(opts.cutoutPercentage?outerRadius/100*opts.cutoutPercentage:1,0);const radiusLength=(outerRadius-innerRadius)/chart.getVisibleDatasetCount();this.outerRadius=outerRadius-radiusLength*this.index;this.innerRadius=this.outerRadius-radiusLength;}
updateElements(arcs,start,count,mode){const reset=mode==='reset';const chart=this.chart;const opts=chart.options;const animationOpts=opts.animation;const scale=this._cachedMeta.rScale;const centerX=scale.xCenter;const centerY=scale.yCenter;const datasetStartAngle=scale.getIndexAngle(0)-0.5*PI;let angle=datasetStartAngle;let i;const defaultAngle=360/this.countVisibleElements();for(i=0;i<start;++i){angle+=this._computeAngle(i,mode,defaultAngle);}
for(i=start;i<start+count;i++){const arc=arcs[i];let startAngle=angle;let endAngle=angle+this._computeAngle(i,mode,defaultAngle);let outerRadius=chart.getDataVisibility(i)?scale.getDistanceFromCenterForValue(this.getParsed(i).r):0;angle=endAngle;if(reset){if(animationOpts.animateScale){outerRadius=0;}
if(animationOpts.animateRotate){startAngle=endAngle=datasetStartAngle;}}
const properties={x:centerX,y:centerY,innerRadius:0,outerRadius,startAngle,endAngle,options:this.resolveDataElementOptions(i,arc.active?'active':mode)};this.updateElement(arc,i,properties,mode);}}
countVisibleElements(){const meta=this._cachedMeta;let count=0;meta.data.forEach((element,index)=>{if(!isNaN(this.getParsed(index).r)&&this.chart.getDataVisibility(index)){count++;}});return count;}
_computeAngle(index,mode,defaultAngle){return this.chart.getDataVisibility(index)?toRadians(this.resolveDataElementOptions(index,mode).angle||defaultAngle):0;}}
class PieController extends DoughnutController{static id='pie';static defaults={cutout:0,rotation:0,circumference:360,radius:'100%'};}
class RadarController extends DatasetController{static id='radar';static defaults={datasetElementType:'line',dataElementType:'point',indexAxis:'r',showLine:true,elements:{line:{fill:'start'}}};static overrides={aspectRatio:1,scales:{r:{type:'radialLinear'}}};getLabelAndValue(index){const vScale=this._cachedMeta.vScale;const parsed=this.getParsed(index);return{label:vScale.getLabels()[index],value:''+vScale.getLabelForValue(parsed[vScale.axis])};}
parseObjectData(meta,data,start,count){return _parseObjectDataRadialScale.bind(this)(meta,data,start,count);}
update(mode){const meta=this._cachedMeta;const line=meta.dataset;const points=meta.data||[];const labels=meta.iScale.getLabels();line.points=points;if(mode!=='resize'){const options=this.resolveDatasetElementOptions(mode);if(!this.options.showLine){options.borderWidth=0;}
const properties={_loop:true,_fullLoop:labels.length===points.length,options};this.updateElement(line,undefined,properties,mode);}
this.updateElements(points,0,points.length,mode);}
updateElements(points,start,count,mode){const scale=this._cachedMeta.rScale;const reset=mode==='reset';for(let i=start;i<start+count;i++){const point=points[i];const options=this.resolveDataElementOptions(i,point.active?'active':mode);const pointPosition=scale.getPointPositionForValue(i,this.getParsed(i).r);const x=reset?scale.xCenter:pointPosition.x;const y=reset?scale.yCenter:pointPosition.y;const properties={x,y,angle:pointPosition.angle,skip:isNaN(x)||isNaN(y),options};this.updateElement(point,i,properties,mode);}}}
class ScatterController extends DatasetController{static id='scatter';static defaults={datasetElementType:false,dataElementType:'point',showLine:false,fill:false};static overrides={interaction:{mode:'point'},scales:{x:{type:'linear'},y:{type:'linear'}}};getLabelAndValue(index){const meta=this._cachedMeta;const labels=this.chart.data.labels||[];const{xScale,yScale}=meta;const parsed=this.getParsed(index);const x=xScale.getLabelForValue(parsed.x);const y=yScale.getLabelForValue(parsed.y);return{label:labels[index]||'',value:'('+x+', '+y+')'};}
update(mode){const meta=this._cachedMeta;const{data:points=[]}=meta;const animationsDisabled=this.chart._animationsDisabled;let{start,count}=_getStartAndCountOfVisiblePoints(meta,points,animationsDisabled);this._drawStart=start;this._drawCount=count;if(_scaleRangesChanged(meta)){start=0;count=points.length;}
if(this.options.showLine){if(!this.datasetElementType){this.addElements();}
const{dataset:line,_dataset}=meta;line._chart=this.chart;line._datasetIndex=this.index;line._decimated=!!_dataset._decimated;line.points=points;const options=this.resolveDatasetElementOptions(mode);options.segment=this.options.segment;this.updateElement(line,undefined,{animated:!animationsDisabled,options},mode);}else if(this.datasetElementType){delete meta.dataset;this.datasetElementType=false;}
this.updateElements(points,start,count,mode);}
addElements(){const{showLine}=this.options;if(!this.datasetElementType&&showLine){this.datasetElementType=this.chart.registry.getElement('line');}
super.addElements();}
updateElements(points,start,count,mode){const reset=mode==='reset';const{iScale,vScale,_stacked,_dataset}=this._cachedMeta;const firstOpts=this.resolveDataElementOptions(start,mode);const sharedOptions=this.getSharedOptions(firstOpts);const includeOptions=this.includeOptions(mode,sharedOptions);const iAxis=iScale.axis;const vAxis=vScale.axis;const{spanGaps,segment}=this.options;const maxGapLength=isNumber(spanGaps)?spanGaps:Number.POSITIVE_INFINITY;const directUpdate=this.chart._animationsDisabled||reset||mode==='none';let prevParsed=start>0&&this.getParsed(start-1);for(let i=start;i<start+count;++i){const point=points[i];const parsed=this.getParsed(i);const properties=directUpdate?point:{};const nullData=isNullOrUndef(parsed[vAxis]);const iPixel=properties[iAxis]=iScale.getPixelForValue(parsed[iAxis],i);const vPixel=properties[vAxis]=reset||nullData?vScale.getBasePixel():vScale.getPixelForValue(_stacked?this.applyStack(vScale,parsed,_stacked):parsed[vAxis],i);properties.skip=isNaN(iPixel)||isNaN(vPixel)||nullData;properties.stop=i>0&&Math.abs(parsed[iAxis]-prevParsed[iAxis])>maxGapLength;if(segment){properties.parsed=parsed;properties.raw=_dataset.data[i];}
if(includeOptions){properties.options=sharedOptions||this.resolveDataElementOptions(i,point.active?'active':mode);}
if(!directUpdate){this.updateElement(point,i,properties,mode);}
prevParsed=parsed;}
this.updateSharedOptions(sharedOptions,mode,firstOpts);}
getMaxOverflow(){const meta=this._cachedMeta;const data=meta.data||[];if(!this.options.showLine){let max=0;for(let i=data.length-1;i>=0;--i){max=Math.max(max,data[i].size(this.resolveDataElementOptions(i))/2);}
return max>0&&max;}
const dataset=meta.dataset;const border=dataset.options&&dataset.options.borderWidth||0;if(!data.length){return border;}
const firstPoint=data[0].size(this.resolveDataElementOptions(0));const lastPoint=data[data.length-1].size(this.resolveDataElementOptions(data.length-1));return Math.max(border,firstPoint,lastPoint)/2;}}
var controllers=Object.freeze({__proto__:null,BarController:BarController,BubbleController:BubbleController,DoughnutController:DoughnutController,LineController:LineController,PieController:PieController,PolarAreaController:PolarAreaController,RadarController:RadarController,ScatterController:ScatterController});function clipArc(ctx,element,endAngle){const{startAngle,pixelMargin,x,y,outerRadius,innerRadius}=element;let angleMargin=pixelMargin/outerRadius;ctx.beginPath();ctx.arc(x,y,outerRadius,startAngle-angleMargin,endAngle+angleMargin);if(innerRadius>pixelMargin){angleMargin=pixelMargin/innerRadius;ctx.arc(x,y,innerRadius,endAngle+angleMargin,startAngle-angleMargin,true);}else{ctx.arc(x,y,pixelMargin,endAngle+HALF_PI,startAngle-HALF_PI);}
ctx.closePath();ctx.clip();}
function toRadiusCorners(value){return _readValueToProps(value,['outerStart','outerEnd','innerStart','innerEnd']);}
function parseBorderRadius$1(arc,innerRadius,outerRadius,angleDelta){const o=toRadiusCorners(arc.options.borderRadius);const halfThickness=(outerRadius-innerRadius)/2;const innerLimit=Math.min(halfThickness,angleDelta*innerRadius/2);const computeOuterLimit=(val)=>{const outerArcLimit=(outerRadius-Math.min(halfThickness,val))*angleDelta/2;return _limitValue(val,0,Math.min(halfThickness,outerArcLimit));};return{outerStart:computeOuterLimit(o.outerStart),outerEnd:computeOuterLimit(o.outerEnd),innerStart:_limitValue(o.innerStart,0,innerLimit),innerEnd:_limitValue(o.innerEnd,0,innerLimit)};}
function rThetaToXY(r,theta,x,y){return{x:x+r*Math.cos(theta),y:y+r*Math.sin(theta)};}
function pathArc(ctx,element,offset,spacing,end,circular){const{x,y,startAngle:start,pixelMargin,innerRadius:innerR}=element;const outerRadius=Math.max(element.outerRadius+spacing+offset-pixelMargin,0);const innerRadius=innerR>0?innerR+spacing+offset+pixelMargin:0;let spacingOffset=0;const alpha=end-start;if(spacing){const noSpacingInnerRadius=innerR>0?innerR-spacing:0;const noSpacingOuterRadius=outerRadius>0?outerRadius-spacing:0;const avNogSpacingRadius=(noSpacingInnerRadius+noSpacingOuterRadius)/2;const adjustedAngle=avNogSpacingRadius!==0?alpha*avNogSpacingRadius/(avNogSpacingRadius+spacing):alpha;spacingOffset=(alpha-adjustedAngle)/2;}
const beta=Math.max(0.001,alpha*outerRadius-offset/PI)/outerRadius;const angleOffset=(alpha-beta)/2;const startAngle=start+angleOffset+spacingOffset;const endAngle=end-angleOffset-spacingOffset;const{outerStart,outerEnd,innerStart,innerEnd}=parseBorderRadius$1(element,innerRadius,outerRadius,endAngle-startAngle);const outerStartAdjustedRadius=outerRadius-outerStart;const outerEndAdjustedRadius=outerRadius-outerEnd;const outerStartAdjustedAngle=startAngle+outerStart/outerStartAdjustedRadius;const outerEndAdjustedAngle=endAngle-outerEnd/outerEndAdjustedRadius;const innerStartAdjustedRadius=innerRadius+innerStart;const innerEndAdjustedRadius=innerRadius+innerEnd;const innerStartAdjustedAngle=startAngle+innerStart/innerStartAdjustedRadius;const innerEndAdjustedAngle=endAngle-innerEnd/innerEndAdjustedRadius;ctx.beginPath();if(circular){const outerMidAdjustedAngle=(outerStartAdjustedAngle+outerEndAdjustedAngle)/2;ctx.arc(x,y,outerRadius,outerStartAdjustedAngle,outerMidAdjustedAngle);ctx.arc(x,y,outerRadius,outerMidAdjustedAngle,outerEndAdjustedAngle);if(outerEnd>0){const pCenter=rThetaToXY(outerEndAdjustedRadius,outerEndAdjustedAngle,x,y);ctx.arc(pCenter.x,pCenter.y,outerEnd,outerEndAdjustedAngle,endAngle+HALF_PI);}
const p4=rThetaToXY(innerEndAdjustedRadius,endAngle,x,y);ctx.lineTo(p4.x,p4.y);if(innerEnd>0){const pCenter=rThetaToXY(innerEndAdjustedRadius,innerEndAdjustedAngle,x,y);ctx.arc(pCenter.x,pCenter.y,innerEnd,endAngle+HALF_PI,innerEndAdjustedAngle+Math.PI);}
const innerMidAdjustedAngle=(endAngle-innerEnd/innerRadius+(startAngle+innerStart/innerRadius))/2;ctx.arc(x,y,innerRadius,endAngle-innerEnd/innerRadius,innerMidAdjustedAngle,true);ctx.arc(x,y,innerRadius,innerMidAdjustedAngle,startAngle+innerStart/innerRadius,true);if(innerStart>0){const pCenter=rThetaToXY(innerStartAdjustedRadius,innerStartAdjustedAngle,x,y);ctx.arc(pCenter.x,pCenter.y,innerStart,innerStartAdjustedAngle+Math.PI,startAngle-HALF_PI);}
const p8=rThetaToXY(outerStartAdjustedRadius,startAngle,x,y);ctx.lineTo(p8.x,p8.y);if(outerStart>0){const pCenter=rThetaToXY(outerStartAdjustedRadius,outerStartAdjustedAngle,x,y);ctx.arc(pCenter.x,pCenter.y,outerStart,startAngle-HALF_PI,outerStartAdjustedAngle);}}else{ctx.moveTo(x,y);const outerStartX=Math.cos(outerStartAdjustedAngle)*outerRadius+x;const outerStartY=Math.sin(outerStartAdjustedAngle)*outerRadius+y;ctx.lineTo(outerStartX,outerStartY);const outerEndX=Math.cos(outerEndAdjustedAngle)*outerRadius+x;const outerEndY=Math.sin(outerEndAdjustedAngle)*outerRadius+y;ctx.lineTo(outerEndX,outerEndY);}
ctx.closePath();}
function drawArc(ctx,element,offset,spacing,circular){const{fullCircles,startAngle,circumference}=element;let endAngle=element.endAngle;if(fullCircles){pathArc(ctx,element,offset,spacing,endAngle,circular);for(let i=0;i<fullCircles;++i){ctx.fill();}
if(!isNaN(circumference)){endAngle=startAngle+(circumference%TAU||TAU);}}
pathArc(ctx,element,offset,spacing,endAngle,circular);ctx.fill();return endAngle;}
function drawBorder(ctx,element,offset,spacing,circular){const{fullCircles,startAngle,circumference,options}=element;const{borderWidth,borderJoinStyle,borderDash,borderDashOffset}=options;const inner=options.borderAlign==='inner';if(!borderWidth){return;}
ctx.setLineDash(borderDash||[]);ctx.lineDashOffset=borderDashOffset;if(inner){ctx.lineWidth=borderWidth*2;ctx.lineJoin=borderJoinStyle||'round';}else{ctx.lineWidth=borderWidth;ctx.lineJoin=borderJoinStyle||'bevel';}
let endAngle=element.endAngle;if(fullCircles){pathArc(ctx,element,offset,spacing,endAngle,circular);for(let i=0;i<fullCircles;++i){ctx.stroke();}
if(!isNaN(circumference)){endAngle=startAngle+(circumference%TAU||TAU);}}
if(inner){clipArc(ctx,element,endAngle);}
if(!fullCircles){pathArc(ctx,element,offset,spacing,endAngle,circular);ctx.stroke();}}
class ArcElement extends Element{static id='arc';static defaults={borderAlign:'center',borderColor:'#fff',borderDash:[],borderDashOffset:0,borderJoinStyle:undefined,borderRadius:0,borderWidth:2,offset:0,spacing:0,angle:undefined,circular:true};static defaultRoutes={backgroundColor:'backgroundColor'};static descriptors={_scriptable:true,_indexable:(name)=>name!=='borderDash'};circumference;endAngle;fullCircles;innerRadius;outerRadius;pixelMargin;startAngle;constructor(cfg){super();this.options=undefined;this.circumference=undefined;this.startAngle=undefined;this.endAngle=undefined;this.innerRadius=undefined;this.outerRadius=undefined;this.pixelMargin=0;this.fullCircles=0;if(cfg){Object.assign(this,cfg);}}
inRange(chartX,chartY,useFinalPosition){const point=this.getProps(['x','y'],useFinalPosition);const{angle,distance}=getAngleFromPoint(point,{x:chartX,y:chartY});const{startAngle,endAngle,innerRadius,outerRadius,circumference}=this.getProps(['startAngle','endAngle','innerRadius','outerRadius','circumference'],useFinalPosition);const rAdjust=(this.options.spacing+this.options.borderWidth)/2;const _circumference=valueOrDefault(circumference,endAngle-startAngle);const nonZeroBetween=_angleBetween(angle,startAngle,endAngle)&&startAngle!==endAngle;const betweenAngles=_circumference>=TAU||nonZeroBetween;const withinRadius=_isBetween(distance,innerRadius+rAdjust,outerRadius+rAdjust);return betweenAngles&&withinRadius;}
getCenterPoint(useFinalPosition){const{x,y,startAngle,endAngle,innerRadius,outerRadius}=this.getProps(['x','y','startAngle','endAngle','innerRadius','outerRadius'],useFinalPosition);const{offset,spacing}=this.options;const halfAngle=(startAngle+endAngle)/2;const halfRadius=(innerRadius+outerRadius+spacing+offset)/2;return{x:x+Math.cos(halfAngle)*halfRadius,y:y+Math.sin(halfAngle)*halfRadius};}
tooltipPosition(useFinalPosition){return this.getCenterPoint(useFinalPosition);}
draw(ctx){const{options,circumference}=this;const offset=(options.offset||0)/4;const spacing=(options.spacing||0)/2;const circular=options.circular;this.pixelMargin=options.borderAlign==='inner'?0.33:0;this.fullCircles=circumference>TAU?Math.floor(circumference/TAU):0;if(circumference===0||this.innerRadius<0||this.outerRadius<0){return;}
ctx.save();const halfAngle=(this.startAngle+this.endAngle)/2;ctx.translate(Math.cos(halfAngle)*offset,Math.sin(halfAngle)*offset);const fix=1-Math.sin(Math.min(PI,circumference||0));const radiusOffset=offset*fix;ctx.fillStyle=options.backgroundColor;ctx.strokeStyle=options.borderColor;drawArc(ctx,this,radiusOffset,spacing,circular);drawBorder(ctx,this,radiusOffset,spacing,circular);ctx.restore();}}
function setStyle(ctx,options,style=options){ctx.lineCap=valueOrDefault(style.borderCapStyle,options.borderCapStyle);ctx.setLineDash(valueOrDefault(style.borderDash,options.borderDash));ctx.lineDashOffset=valueOrDefault(style.borderDashOffset,options.borderDashOffset);ctx.lineJoin=valueOrDefault(style.borderJoinStyle,options.borderJoinStyle);ctx.lineWidth=valueOrDefault(style.borderWidth,options.borderWidth);ctx.strokeStyle=valueOrDefault(style.borderColor,options.borderColor);}
function lineTo(ctx,previous,target){ctx.lineTo(target.x,target.y);}
function getLineMethod(options){if(options.stepped){return _steppedLineTo;}
if(options.tension||options.cubicInterpolationMode==='monotone'){return _bezierCurveTo;}
return lineTo;}
function pathVars(points,segment,params={}){const count=points.length;const{start:paramsStart=0,end:paramsEnd=count-1}=params;const{start:segmentStart,end:segmentEnd}=segment;const start=Math.max(paramsStart,segmentStart);const end=Math.min(paramsEnd,segmentEnd);const outside=paramsStart<segmentStart&&paramsEnd<segmentStart||paramsStart>segmentEnd&&paramsEnd>segmentEnd;return{count,start,loop:segment.loop,ilen:end<start&&!outside?count+end-start:end-start};}
function pathSegment(ctx,line,segment,params){const{points,options}=line;const{count,start,loop,ilen}=pathVars(points,segment,params);const lineMethod=getLineMethod(options);let{move=true,reverse}=params||{};let i,point,prev;for(i=0;i<=ilen;++i){point=points[(start+(reverse?ilen-i:i))%count];if(point.skip){continue;}else if(move){ctx.moveTo(point.x,point.y);move=false;}else{lineMethod(ctx,prev,point,reverse,options.stepped);}
prev=point;}
if(loop){point=points[(start+(reverse?ilen:0))%count];lineMethod(ctx,prev,point,reverse,options.stepped);}
return!!loop;}
function fastPathSegment(ctx,line,segment,params){const points=line.points;const{count,start,ilen}=pathVars(points,segment,params);const{move=true,reverse}=params||{};let avgX=0;let countX=0;let i,point,prevX,minY,maxY,lastY;const pointIndex=(index)=>(start+(reverse?ilen-index:index))%count;const drawX=()=>{if(minY!==maxY){ctx.lineTo(avgX,maxY);ctx.lineTo(avgX,minY);ctx.lineTo(avgX,lastY);}};if(move){point=points[pointIndex(0)];ctx.moveTo(point.x,point.y);}
for(i=0;i<=ilen;++i){point=points[pointIndex(i)];if(point.skip){continue;}
const x=point.x;const y=point.y;const truncX=x|0;if(truncX===prevX){if(y<minY){minY=y;}else if(y>maxY){maxY=y;}
avgX=(countX*avgX+x)/++countX;}else{drawX();ctx.lineTo(x,y);prevX=truncX;countX=0;minY=maxY=y;}
lastY=y;}
drawX();}
function _getSegmentMethod(line){const opts=line.options;const borderDash=opts.borderDash&&opts.borderDash.length;const useFastPath=!line._decimated&&!line._loop&&!opts.tension&&opts.cubicInterpolationMode!=='monotone'&&!opts.stepped&&!borderDash;return useFastPath?fastPathSegment:pathSegment;}
function _getInterpolationMethod(options){if(options.stepped){return _steppedInterpolation;}
if(options.tension||options.cubicInterpolationMode==='monotone'){return _bezierInterpolation;}
return _pointInLine;}
function strokePathWithCache(ctx,line,start,count){let path=line._path;if(!path){path=line._path=new Path2D();if(line.path(path,start,count)){path.closePath();}}
setStyle(ctx,line.options);ctx.stroke(path);}
function strokePathDirect(ctx,line,start,count){const{segments,options}=line;const segmentMethod=_getSegmentMethod(line);for(const segment of segments){setStyle(ctx,options,segment.style);ctx.beginPath();if(segmentMethod(ctx,line,segment,{start,end:start+count-1})){ctx.closePath();}
ctx.stroke();}}
const usePath2D=typeof Path2D==='function';function draw(ctx,line,start,count){if(usePath2D&&!line.options.segment){strokePathWithCache(ctx,line,start,count);}else{strokePathDirect(ctx,line,start,count);}}
class LineElement extends Element{static id='line';static defaults={borderCapStyle:'butt',borderDash:[],borderDashOffset:0,borderJoinStyle:'miter',borderWidth:3,capBezierPoints:true,cubicInterpolationMode:'default',fill:false,spanGaps:false,stepped:false,tension:0};static defaultRoutes={backgroundColor:'backgroundColor',borderColor:'borderColor'};static descriptors={_scriptable:true,_indexable:(name)=>name!=='borderDash'&&name!=='fill'};constructor(cfg){super();this.animated=true;this.options=undefined;this._chart=undefined;this._loop=undefined;this._fullLoop=undefined;this._path=undefined;this._points=undefined;this._segments=undefined;this._decimated=false;this._pointsUpdated=false;this._datasetIndex=undefined;if(cfg){Object.assign(this,cfg);}}
updateControlPoints(chartArea,indexAxis){const options=this.options;if((options.tension||options.cubicInterpolationMode==='monotone')&&!options.stepped&&!this._pointsUpdated){const loop=options.spanGaps?this._loop:this._fullLoop;_updateBezierControlPoints(this._points,options,chartArea,loop,indexAxis);this._pointsUpdated=true;}}
set points(points){this._points=points;delete this._segments;delete this._path;this._pointsUpdated=false;}
get points(){return this._points;}
get segments(){return this._segments||(this._segments=_computeSegments(this,this.options.segment));}
first(){const segments=this.segments;const points=this.points;return segments.length&&points[segments[0].start];}
last(){const segments=this.segments;const points=this.points;const count=segments.length;return count&&points[segments[count-1].end];}
interpolate(point,property){const options=this.options;const value=point[property];const points=this.points;const segments=_boundSegments(this,{property,start:value,end:value});if(!segments.length){return;}
const result=[];const _interpolate=_getInterpolationMethod(options);let i,ilen;for(i=0,ilen=segments.length;i<ilen;++i){const{start,end}=segments[i];const p1=points[start];const p2=points[end];if(p1===p2){result.push(p1);continue;}
const t=Math.abs((value-p1[property])/(p2[property]-p1[property]));const interpolated=_interpolate(p1,p2,t,options.stepped);interpolated[property]=point[property];result.push(interpolated);}
return result.length===1?result[0]:result;}
pathSegment(ctx,segment,params){const segmentMethod=_getSegmentMethod(this);return segmentMethod(ctx,this,segment,params);}
path(ctx,start,count){const segments=this.segments;const segmentMethod=_getSegmentMethod(this);let loop=this._loop;start=start||0;count=count||this.points.length-start;for(const segment of segments){loop&=segmentMethod(ctx,this,segment,{start,end:start+count-1});}
return!!loop;}
draw(ctx,chartArea,start,count){const options=this.options||{};const points=this.points||[];if(points.length&&options.borderWidth){ctx.save();draw(ctx,this,start,count);ctx.restore();}
if(this.animated){this._pointsUpdated=false;this._path=undefined;}}}
function inRange$1(el,pos,axis,useFinalPosition){const options=el.options;const{[axis]:value}=el.getProps([axis],useFinalPosition);return Math.abs(pos-value)<options.radius+options.hitRadius;}
class PointElement extends Element{static id='point';parsed;skip;stop;static defaults={borderWidth:1,hitRadius:1,hoverBorderWidth:1,hoverRadius:4,pointStyle:'circle',radius:3,rotation:0};static defaultRoutes={backgroundColor:'backgroundColor',borderColor:'borderColor'};constructor(cfg){super();this.options=undefined;this.parsed=undefined;this.skip=undefined;this.stop=undefined;if(cfg){Object.assign(this,cfg);}}
inRange(mouseX,mouseY,useFinalPosition){const options=this.options;const{x,y}=this.getProps(['x','y'],useFinalPosition);return Math.pow(mouseX-x,2)+Math.pow(mouseY-y,2)<Math.pow(options.hitRadius+options.radius,2);}
inXRange(mouseX,useFinalPosition){return inRange$1(this,mouseX,'x',useFinalPosition);}
inYRange(mouseY,useFinalPosition){return inRange$1(this,mouseY,'y',useFinalPosition);}
getCenterPoint(useFinalPosition){const{x,y}=this.getProps(['x','y'],useFinalPosition);return{x,y};}
size(options){options=options||this.options||{};let radius=options.radius||0;radius=Math.max(radius,radius&&options.hoverRadius||0);const borderWidth=radius&&options.borderWidth||0;return(radius+borderWidth)*2;}
draw(ctx,area){const options=this.options;if(this.skip||options.radius<0.1||!_isPointInArea(this,area,this.size(options)/2)){return;}
ctx.strokeStyle=options.borderColor;ctx.lineWidth=options.borderWidth;ctx.fillStyle=options.backgroundColor;drawPoint(ctx,options,this.x,this.y);}
getRange(){const options=this.options||{};return options.radius+options.hitRadius;}}
function getBarBounds(bar,useFinalPosition){const{x,y,base,width,height}=bar.getProps(['x','y','base','width','height'],useFinalPosition);let left,right,top,bottom,half;if(bar.horizontal){half=height/2;left=Math.min(x,base);right=Math.max(x,base);top=y-half;bottom=y+half;}else{half=width/2;left=x-half;right=x+half;top=Math.min(y,base);bottom=Math.max(y,base);}
return{left,top,right,bottom};}
function skipOrLimit(skip,value,min,max){return skip?0:_limitValue(value,min,max);}
function parseBorderWidth(bar,maxW,maxH){const value=bar.options.borderWidth;const skip=bar.borderSkipped;const o=toTRBL(value);return{t:skipOrLimit(skip.top,o.top,0,maxH),r:skipOrLimit(skip.right,o.right,0,maxW),b:skipOrLimit(skip.bottom,o.bottom,0,maxH),l:skipOrLimit(skip.left,o.left,0,maxW)};}
function parseBorderRadius(bar,maxW,maxH){const{enableBorderRadius}=bar.getProps(['enableBorderRadius']);const value=bar.options.borderRadius;const o=toTRBLCorners(value);const maxR=Math.min(maxW,maxH);const skip=bar.borderSkipped;const enableBorder=enableBorderRadius||isObject(value);return{topLeft:skipOrLimit(!enableBorder||skip.top||skip.left,o.topLeft,0,maxR),topRight:skipOrLimit(!enableBorder||skip.top||skip.right,o.topRight,0,maxR),bottomLeft:skipOrLimit(!enableBorder||skip.bottom||skip.left,o.bottomLeft,0,maxR),bottomRight:skipOrLimit(!enableBorder||skip.bottom||skip.right,o.bottomRight,0,maxR)};}
function boundingRects(bar){const bounds=getBarBounds(bar);const width=bounds.right-bounds.left;const height=bounds.bottom-bounds.top;const border=parseBorderWidth(bar,width/2,height/2);const radius=parseBorderRadius(bar,width/2,height/2);return{outer:{x:bounds.left,y:bounds.top,w:width,h:height,radius},inner:{x:bounds.left+border.l,y:bounds.top+border.t,w:width-border.l-border.r,h:height-border.t-border.b,radius:{topLeft:Math.max(0,radius.topLeft-Math.max(border.t,border.l)),topRight:Math.max(0,radius.topRight-Math.max(border.t,border.r)),bottomLeft:Math.max(0,radius.bottomLeft-Math.max(border.b,border.l)),bottomRight:Math.max(0,radius.bottomRight-Math.max(border.b,border.r))}}};}
function inRange(bar,x,y,useFinalPosition){const skipX=x===null;const skipY=y===null;const skipBoth=skipX&&skipY;const bounds=bar&&!skipBoth&&getBarBounds(bar,useFinalPosition);return bounds&&(skipX||_isBetween(x,bounds.left,bounds.right))&&(skipY||_isBetween(y,bounds.top,bounds.bottom));}
function hasRadius(radius){return radius.topLeft||radius.topRight||radius.bottomLeft||radius.bottomRight;}
function addNormalRectPath(ctx,rect){ctx.rect(rect.x,rect.y,rect.w,rect.h);}
function inflateRect(rect,amount,refRect={}){const x=rect.x!==refRect.x?-amount:0;const y=rect.y!==refRect.y?-amount:0;const w=(rect.x+rect.w!==refRect.x+refRect.w?amount:0)-x;const h=(rect.y+rect.h!==refRect.y+refRect.h?amount:0)-y;return{x:rect.x+x,y:rect.y+y,w:rect.w+w,h:rect.h+h,radius:rect.radius};}
class BarElement extends Element{static id='bar';static defaults={borderSkipped:'start',borderWidth:0,borderRadius:0,inflateAmount:'auto',pointStyle:undefined};static defaultRoutes={backgroundColor:'backgroundColor',borderColor:'borderColor'};constructor(cfg){super();this.options=undefined;this.horizontal=undefined;this.base=undefined;this.width=undefined;this.height=undefined;this.inflateAmount=undefined;if(cfg){Object.assign(this,cfg);}}
draw(ctx){const{inflateAmount,options:{borderColor,backgroundColor}}=this;const{inner,outer}=boundingRects(this);const addRectPath=hasRadius(outer.radius)?addRoundedRectPath:addNormalRectPath;ctx.save();if(outer.w!==inner.w||outer.h!==inner.h){ctx.beginPath();addRectPath(ctx,inflateRect(outer,inflateAmount,inner));ctx.clip();addRectPath(ctx,inflateRect(inner,-inflateAmount,outer));ctx.fillStyle=borderColor;ctx.fill('evenodd');}
ctx.beginPath();addRectPath(ctx,inflateRect(inner,inflateAmount));ctx.fillStyle=backgroundColor;ctx.fill();ctx.restore();}
inRange(mouseX,mouseY,useFinalPosition){return inRange(this,mouseX,mouseY,useFinalPosition);}
inXRange(mouseX,useFinalPosition){return inRange(this,mouseX,null,useFinalPosition);}
inYRange(mouseY,useFinalPosition){return inRange(this,null,mouseY,useFinalPosition);}
getCenterPoint(useFinalPosition){const{x,y,base,horizontal}=this.getProps(['x','y','base','horizontal'],useFinalPosition);return{x:horizontal?(x+base)/2:x,y:horizontal?y:(y+base)/2};}
getRange(axis){return axis==='x'?this.width/2:this.height/2;}}
var elements=Object.freeze({__proto__:null,ArcElement:ArcElement,BarElement:BarElement,LineElement:LineElement,PointElement:PointElement});const addIfString=(labels,raw,index,addedLabels)=>{if(typeof raw==='string'){index=labels.push(raw)-1;addedLabels.unshift({index,label:raw});}else if(isNaN(raw)){index=null;}
return index;};function findOrAddLabel(labels,raw,index,addedLabels){const first=labels.indexOf(raw);if(first===-1){return addIfString(labels,raw,index,addedLabels);}
const last=labels.lastIndexOf(raw);return first!==last?index:first;}
const validIndex=(index,max)=>index===null?null:_limitValue(Math.round(index),0,max);function _getLabelForValue(value){const labels=this.getLabels();if(value>=0&&value<labels.length){return labels[value];}
return value;}
class CategoryScale extends Scale{static id='category';static defaults={ticks:{callback:_getLabelForValue}};constructor(cfg){super(cfg);this._startValue=undefined;this._valueRange=0;this._addedLabels=[];}
init(scaleOptions){const added=this._addedLabels;if(added.length){const labels=this.getLabels();for(const{index,label}of added){if(labels[index]===label){labels.splice(index,1);}}
this._addedLabels=[];}
super.init(scaleOptions);}
parse(raw,index){if(isNullOrUndef(raw)){return null;}
const labels=this.getLabels();index=isFinite(index)&&labels[index]===raw?index:findOrAddLabel(labels,raw,valueOrDefault(index,raw),this._addedLabels);return validIndex(index,labels.length-1);}
determineDataLimits(){const{minDefined,maxDefined}=this.getUserBounds();let{min,max}=this.getMinMax(true);if(this.options.bounds==='ticks'){if(!minDefined){min=0;}
if(!maxDefined){max=this.getLabels().length-1;}}
this.min=min;this.max=max;}
buildTicks(){const min=this.min;const max=this.max;const offset=this.options.offset;const ticks=[];let labels=this.getLabels();labels=min===0&&max===labels.length-1?labels:labels.slice(min,max+1);this._valueRange=Math.max(labels.length-(offset?0:1),1);this._startValue=this.min-(offset?0.5:0);for(let value=min;value<=max;value++){ticks.push({value});}
return ticks;}
getLabelForValue(value){return _getLabelForValue.call(this,value);}
configure(){super.configure();if(!this.isHorizontal()){this._reversePixels=!this._reversePixels;}}
getPixelForValue(value){if(typeof value!=='number'){value=this.parse(value);}
return value===null?NaN:this.getPixelForDecimal((value-this._startValue)/this._valueRange);}
getPixelForTick(index){const ticks=this.ticks;if(index<0||index>ticks.length-1){return null;}
return this.getPixelForValue(ticks[index].value);}
getValueForPixel(pixel){return Math.round(this._startValue+this.getDecimalForPixel(pixel)*this._valueRange);}
getBasePixel(){return this.bottom;}}
function generateTicks$1(generationOptions,dataRange){const ticks=[];const MIN_SPACING=1e-14;const{bounds,step,min,max,precision,count,maxTicks,maxDigits,includeBounds}=generationOptions;const unit=step||1;const maxSpaces=maxTicks-1;const{min:rmin,max:rmax}=dataRange;const minDefined=!isNullOrUndef(min);const maxDefined=!isNullOrUndef(max);const countDefined=!isNullOrUndef(count);const minSpacing=(rmax-rmin)/(maxDigits+1);let spacing=niceNum((rmax-rmin)/maxSpaces/unit)*unit;let factor,niceMin,niceMax,numSpaces;if(spacing<MIN_SPACING&&!minDefined&&!maxDefined){return[{value:rmin},{value:rmax}];}
numSpaces=Math.ceil(rmax/spacing)-Math.floor(rmin/spacing);if(numSpaces>maxSpaces){spacing=niceNum(numSpaces*spacing/maxSpaces/unit)*unit;}
if(!isNullOrUndef(precision)){factor=Math.pow(10,precision);spacing=Math.ceil(spacing*factor)/factor;}
if(bounds==='ticks'){niceMin=Math.floor(rmin/spacing)*spacing;niceMax=Math.ceil(rmax/spacing)*spacing;}else{niceMin=rmin;niceMax=rmax;}
if(minDefined&&maxDefined&&step&&almostWhole((max-min)/step,spacing/1000)){numSpaces=Math.round(Math.min((max-min)/spacing,maxTicks));spacing=(max-min)/numSpaces;niceMin=min;niceMax=max;}else if(countDefined){niceMin=minDefined?min:niceMin;niceMax=maxDefined?max:niceMax;numSpaces=count-1;spacing=(niceMax-niceMin)/numSpaces;}else{numSpaces=(niceMax-niceMin)/spacing;if(almostEquals(numSpaces,Math.round(numSpaces),spacing/1000)){numSpaces=Math.round(numSpaces);}else{numSpaces=Math.ceil(numSpaces);}}
const decimalPlaces=Math.max(_decimalPlaces(spacing),_decimalPlaces(niceMin));factor=Math.pow(10,isNullOrUndef(precision)?decimalPlaces:precision);niceMin=Math.round(niceMin*factor)/factor;niceMax=Math.round(niceMax*factor)/factor;let j=0;if(minDefined){if(includeBounds&&niceMin!==min){ticks.push({value:min});if(niceMin<min){j++;}
if(almostEquals(Math.round((niceMin+j*spacing)*factor)/factor,min,relativeLabelSize(min,minSpacing,generationOptions))){j++;}}else if(niceMin<min){j++;}}
for(;j<numSpaces;++j){const tickValue=Math.round((niceMin+j*spacing)*factor)/factor;if(maxDefined&&tickValue>max){break;}
ticks.push({value:tickValue});}
if(maxDefined&&includeBounds&&niceMax!==max){if(ticks.length&&almostEquals(ticks[ticks.length-1].value,max,relativeLabelSize(max,minSpacing,generationOptions))){ticks[ticks.length-1].value=max;}else{ticks.push({value:max});}}else if(!maxDefined||niceMax===max){ticks.push({value:niceMax});}
return ticks;}
function relativeLabelSize(value,minSpacing,{horizontal,minRotation}){const rad=toRadians(minRotation);const ratio=(horizontal?Math.sin(rad):Math.cos(rad))||0.001;const length=0.75*minSpacing*(''+value).length;return Math.min(minSpacing/ratio,length);}
class LinearScaleBase extends Scale{constructor(cfg){super(cfg);this.start=undefined;this.end=undefined;this._startValue=undefined;this._endValue=undefined;this._valueRange=0;}
parse(raw,index){if(isNullOrUndef(raw)){return null;}
if((typeof raw==='number'||raw instanceof Number)&&!isFinite(+raw)){return null;}
return+raw;}
handleTickRangeOptions(){const{beginAtZero}=this.options;const{minDefined,maxDefined}=this.getUserBounds();let{min,max}=this;const setMin=(v)=>min=minDefined?min:v;const setMax=(v)=>max=maxDefined?max:v;if(beginAtZero){const minSign=sign(min);const maxSign=sign(max);if(minSign<0&&maxSign<0){setMax(0);}else if(minSign>0&&maxSign>0){setMin(0);}}
if(min===max){let offset=max===0?1:Math.abs(max*0.05);setMax(max+offset);if(!beginAtZero){setMin(min-offset);}}
this.min=min;this.max=max;}
getTickLimit(){const tickOpts=this.options.ticks;let{maxTicksLimit,stepSize}=tickOpts;let maxTicks;if(stepSize){maxTicks=Math.ceil(this.max/stepSize)-Math.floor(this.min/stepSize)+1;if(maxTicks>1000){console.warn(`scales.${this.id}.ticks.stepSize: ${stepSize} would result generating up to ${maxTicks} ticks. Limiting to 1000.`);maxTicks=1000;}}else{maxTicks=this.computeTickLimit();maxTicksLimit=maxTicksLimit||11;}
if(maxTicksLimit){maxTicks=Math.min(maxTicksLimit,maxTicks);}
return maxTicks;}
computeTickLimit(){return Number.POSITIVE_INFINITY;}
buildTicks(){const opts=this.options;const tickOpts=opts.ticks;let maxTicks=this.getTickLimit();maxTicks=Math.max(2,maxTicks);const numericGeneratorOptions={maxTicks,bounds:opts.bounds,min:opts.min,max:opts.max,precision:tickOpts.precision,step:tickOpts.stepSize,count:tickOpts.count,maxDigits:this._maxDigits(),horizontal:this.isHorizontal(),minRotation:tickOpts.minRotation||0,includeBounds:tickOpts.includeBounds!==false};const dataRange=this._range||this;const ticks=generateTicks$1(numericGeneratorOptions,dataRange);if(opts.bounds==='ticks'){_setMinAndMaxByKey(ticks,this,'value');}
if(opts.reverse){ticks.reverse();this.start=this.max;this.end=this.min;}else{this.start=this.min;this.end=this.max;}
return ticks;}
configure(){const ticks=this.ticks;let start=this.min;let end=this.max;super.configure();if(this.options.offset&&ticks.length){const offset=(end-start)/Math.max(ticks.length-1,1)/2;start-=offset;end+=offset;}
this._startValue=start;this._endValue=end;this._valueRange=end-start;}
getLabelForValue(value){return formatNumber(value,this.chart.options.locale,this.options.ticks.format);}}
class LinearScale extends LinearScaleBase{static id='linear';static defaults={ticks:{callback:Ticks.formatters.numeric}};determineDataLimits(){const{min,max}=this.getMinMax(true);this.min=isNumberFinite(min)?min:0;this.max=isNumberFinite(max)?max:1;this.handleTickRangeOptions();}
computeTickLimit(){const horizontal=this.isHorizontal();const length=horizontal?this.width:this.height;const minRotation=toRadians(this.options.ticks.minRotation);const ratio=(horizontal?Math.sin(minRotation):Math.cos(minRotation))||0.001;const tickFont=this._resolveTickFontOptions(0);return Math.ceil(length/Math.min(40,tickFont.lineHeight/ratio));}
getPixelForValue(value){return value===null?NaN:this.getPixelForDecimal((value-this._startValue)/this._valueRange);}
getValueForPixel(pixel){return this._startValue+this.getDecimalForPixel(pixel)*this._valueRange;}}
const log10Floor=(v)=>Math.floor(log10(v));const changeExponent=(v,m)=>Math.pow(10,log10Floor(v)+m);function isMajor(tickVal){const remain=tickVal/Math.pow(10,log10Floor(tickVal));return remain===1;}
function steps(min,max,rangeExp){const rangeStep=Math.pow(10,rangeExp);const start=Math.floor(min/rangeStep);const end=Math.ceil(max/rangeStep);return end-start;}
function startExp(min,max){const range=max-min;let rangeExp=log10Floor(range);while(steps(min,max,rangeExp)>10){rangeExp++;}
while(steps(min,max,rangeExp)<10){rangeExp--;}
return Math.min(rangeExp,log10Floor(min));}
function generateTicks(generationOptions,{min,max}){min=finiteOrDefault(generationOptions.min,min);const ticks=[];const minExp=log10Floor(min);let exp=startExp(min,max);let precision=exp<0?Math.pow(10,Math.abs(exp)):1;const stepSize=Math.pow(10,exp);const base=minExp>exp?Math.pow(10,minExp):0;const start=Math.round((min-base)*precision)/precision;const offset=Math.floor((min-base)/stepSize/10)*stepSize*10;let significand=Math.floor((start-offset)/Math.pow(10,exp));let value=finiteOrDefault(generationOptions.min,Math.round((base+offset+significand*Math.pow(10,exp))*precision)/precision);while(value<max){ticks.push({value,major:isMajor(value),significand});if(significand>=10){significand=significand<15?15:20;}else{significand++;}
if(significand>=20){exp++;significand=2;precision=exp>=0?1:precision;}
value=Math.round((base+offset+significand*Math.pow(10,exp))*precision)/precision;}
const lastTick=finiteOrDefault(generationOptions.max,value);ticks.push({value:lastTick,major:isMajor(lastTick),significand});return ticks;}
class LogarithmicScale extends Scale{static id='logarithmic';static defaults={ticks:{callback:Ticks.formatters.logarithmic,major:{enabled:true}}};constructor(cfg){super(cfg);this.start=undefined;this.end=undefined;this._startValue=undefined;this._valueRange=0;}
parse(raw,index){const value=LinearScaleBase.prototype.parse.apply(this,[raw,index]);if(value===0){this._zero=true;return undefined;}
return isNumberFinite(value)&&value>0?value:null;}
determineDataLimits(){const{min,max}=this.getMinMax(true);this.min=isNumberFinite(min)?Math.max(0,min):null;this.max=isNumberFinite(max)?Math.max(0,max):null;if(this.options.beginAtZero){this._zero=true;}
if(this._zero&&this.min!==this._suggestedMin&&!isNumberFinite(this._userMin)){this.min=min===changeExponent(this.min,0)?changeExponent(this.min,-1):changeExponent(this.min,0);}
this.handleTickRangeOptions();}
handleTickRangeOptions(){const{minDefined,maxDefined}=this.getUserBounds();let min=this.min;let max=this.max;const setMin=(v)=>min=minDefined?min:v;const setMax=(v)=>max=maxDefined?max:v;if(min===max){if(min<=0){setMin(1);setMax(10);}else{setMin(changeExponent(min,-1));setMax(changeExponent(max,+1));}}
if(min<=0){setMin(changeExponent(max,-1));}
if(max<=0){setMax(changeExponent(min,+1));}
this.min=min;this.max=max;}
buildTicks(){const opts=this.options;const generationOptions={min:this._userMin,max:this._userMax};const ticks=generateTicks(generationOptions,this);if(opts.bounds==='ticks'){_setMinAndMaxByKey(ticks,this,'value');}
if(opts.reverse){ticks.reverse();this.start=this.max;this.end=this.min;}else{this.start=this.min;this.end=this.max;}
return ticks;}
getLabelForValue(value){return value===undefined?'0':formatNumber(value,this.chart.options.locale,this.options.ticks.format);}
configure(){const start=this.min;super.configure();this._startValue=log10(start);this._valueRange=log10(this.max)-log10(start);}
getPixelForValue(value){if(value===undefined||value===0){value=this.min;}
if(value===null||isNaN(value)){return NaN;}
return this.getPixelForDecimal(value===this.min?0:(log10(value)-this._startValue)/this._valueRange);}
getValueForPixel(pixel){const decimal=this.getDecimalForPixel(pixel);return Math.pow(10,this._startValue+decimal*this._valueRange);}}
function getTickBackdropHeight(opts){const tickOpts=opts.ticks;if(tickOpts.display&&opts.display){const padding=toPadding(tickOpts.backdropPadding);return valueOrDefault(tickOpts.font&&tickOpts.font.size,defaults.font.size)+padding.height;}
return 0;}
function measureLabelSize(ctx,font,label){label=isArray(label)?label:[label];return{w:_longestText(ctx,font.string,label),h:label.length*font.lineHeight};}
function determineLimits(angle,pos,size,min,max){if(angle===min||angle===max){return{start:pos-size/2,end:pos+size/2};}else if(angle<min||angle>max){return{start:pos-size,end:pos};}
return{start:pos,end:pos+size};}
function fitWithPointLabels(scale){const orig={l:scale.left+scale._padding.left,r:scale.right-scale._padding.right,t:scale.top+scale._padding.top,b:scale.bottom-scale._padding.bottom};const limits=Object.assign({},orig);const labelSizes=[];const padding=[];const valueCount=scale._pointLabels.length;const pointLabelOpts=scale.options.pointLabels;const additionalAngle=pointLabelOpts.centerPointLabels?PI/valueCount:0;for(let i=0;i<valueCount;i++){const opts=pointLabelOpts.setContext(scale.getPointLabelContext(i));padding[i]=opts.padding;const pointPosition=scale.getPointPosition(i,scale.drawingArea+padding[i],additionalAngle);const plFont=toFont(opts.font);const textSize=measureLabelSize(scale.ctx,plFont,scale._pointLabels[i]);labelSizes[i]=textSize;const angleRadians=_normalizeAngle(scale.getIndexAngle(i)+additionalAngle);const angle=Math.round(toDegrees(angleRadians));const hLimits=determineLimits(angle,pointPosition.x,textSize.w,0,180);const vLimits=determineLimits(angle,pointPosition.y,textSize.h,90,270);updateLimits(limits,orig,angleRadians,hLimits,vLimits);}
scale.setCenterPoint(orig.l-limits.l,limits.r-orig.r,orig.t-limits.t,limits.b-orig.b);scale._pointLabelItems=buildPointLabelItems(scale,labelSizes,padding);}
function updateLimits(limits,orig,angle,hLimits,vLimits){const sin=Math.abs(Math.sin(angle));const cos=Math.abs(Math.cos(angle));let x=0;let y=0;if(hLimits.start<orig.l){x=(orig.l-hLimits.start)/sin;limits.l=Math.min(limits.l,orig.l-x);}else if(hLimits.end>orig.r){x=(hLimits.end-orig.r)/sin;limits.r=Math.max(limits.r,orig.r+x);}
if(vLimits.start<orig.t){y=(orig.t-vLimits.start)/cos;limits.t=Math.min(limits.t,orig.t-y);}else if(vLimits.end>orig.b){y=(vLimits.end-orig.b)/cos;limits.b=Math.max(limits.b,orig.b+y);}}
function createPointLabelItem(scale,index,itemOpts){const outerDistance=scale.drawingArea;const{extra,additionalAngle,padding,size}=itemOpts;const pointLabelPosition=scale.getPointPosition(index,outerDistance+extra+padding,additionalAngle);const angle=Math.round(toDegrees(_normalizeAngle(pointLabelPosition.angle+HALF_PI)));const y=yForAngle(pointLabelPosition.y,size.h,angle);const textAlign=getTextAlignForAngle(angle);const left=leftForTextAlign(pointLabelPosition.x,size.w,textAlign);return{visible:true,x:pointLabelPosition.x,y,textAlign,left,top:y,right:left+size.w,bottom:y+size.h};}
function isNotOverlapped(item,area){if(!area){return true;}
const{left,top,right,bottom}=item;const apexesInArea=_isPointInArea({x:left,y:top},area)||_isPointInArea({x:left,y:bottom},area)||_isPointInArea({x:right,y:top},area)||_isPointInArea({x:right,y:bottom},area);return!apexesInArea;}
function buildPointLabelItems(scale,labelSizes,padding){const items=[];const valueCount=scale._pointLabels.length;const opts=scale.options;const{centerPointLabels,display}=opts.pointLabels;const itemOpts={extra:getTickBackdropHeight(opts)/2,additionalAngle:centerPointLabels?PI/valueCount:0};let area;for(let i=0;i<valueCount;i++){itemOpts.padding=padding[i];itemOpts.size=labelSizes[i];const item=createPointLabelItem(scale,i,itemOpts);items.push(item);if(display==='auto'){item.visible=isNotOverlapped(item,area);if(item.visible){area=item;}}}
return items;}
function getTextAlignForAngle(angle){if(angle===0||angle===180){return'center';}else if(angle<180){return'left';}
return'right';}
function leftForTextAlign(x,w,align){if(align==='right'){x-=w;}else if(align==='center'){x-=w/2;}
return x;}
function yForAngle(y,h,angle){if(angle===90||angle===270){y-=h/2;}else if(angle>270||angle<90){y-=h;}
return y;}
function drawPointLabelBox(ctx,opts,item){const{left,top,right,bottom}=item;const{backdropColor}=opts;if(!isNullOrUndef(backdropColor)){const borderRadius=toTRBLCorners(opts.borderRadius);const padding=toPadding(opts.backdropPadding);ctx.fillStyle=backdropColor;const backdropLeft=left-padding.left;const backdropTop=top-padding.top;const backdropWidth=right-left+padding.width;const backdropHeight=bottom-top+padding.height;if(Object.values(borderRadius).some((v)=>v!==0)){ctx.beginPath();addRoundedRectPath(ctx,{x:backdropLeft,y:backdropTop,w:backdropWidth,h:backdropHeight,radius:borderRadius});ctx.fill();}else{ctx.fillRect(backdropLeft,backdropTop,backdropWidth,backdropHeight);}}}
function drawPointLabels(scale,labelCount){const{ctx,options:{pointLabels}}=scale;for(let i=labelCount-1;i>=0;i--){const item=scale._pointLabelItems[i];if(!item.visible){continue;}
const optsAtIndex=pointLabels.setContext(scale.getPointLabelContext(i));drawPointLabelBox(ctx,optsAtIndex,item);const plFont=toFont(optsAtIndex.font);const{x,y,textAlign}=item;renderText(ctx,scale._pointLabels[i],x,y+plFont.lineHeight/2,plFont,{color:optsAtIndex.color,textAlign:textAlign,textBaseline:'middle'});}}
function pathRadiusLine(scale,radius,circular,labelCount){const{ctx}=scale;if(circular){ctx.arc(scale.xCenter,scale.yCenter,radius,0,TAU);}else{let pointPosition=scale.getPointPosition(0,radius);ctx.moveTo(pointPosition.x,pointPosition.y);for(let i=1;i<labelCount;i++){pointPosition=scale.getPointPosition(i,radius);ctx.lineTo(pointPosition.x,pointPosition.y);}}}
function drawRadiusLine(scale,gridLineOpts,radius,labelCount,borderOpts){const ctx=scale.ctx;const circular=gridLineOpts.circular;const{color,lineWidth}=gridLineOpts;if(!circular&&!labelCount||!color||!lineWidth||radius<0){return;}
ctx.save();ctx.strokeStyle=color;ctx.lineWidth=lineWidth;ctx.setLineDash(borderOpts.dash||[]);ctx.lineDashOffset=borderOpts.dashOffset;ctx.beginPath();pathRadiusLine(scale,radius,circular,labelCount);ctx.closePath();ctx.stroke();ctx.restore();}
function createPointLabelContext(parent,index,label){return createContext(parent,{label,index,type:'pointLabel'});}
class RadialLinearScale extends LinearScaleBase{static id='radialLinear';static defaults={display:true,animate:true,position:'chartArea',angleLines:{display:true,lineWidth:1,borderDash:[],borderDashOffset:0.0},grid:{circular:false},startAngle:0,ticks:{showLabelBackdrop:true,callback:Ticks.formatters.numeric},pointLabels:{backdropColor:undefined,backdropPadding:2,display:true,font:{size:10},callback(label){return label;},padding:5,centerPointLabels:false}};static defaultRoutes={'angleLines.color':'borderColor','pointLabels.color':'color','ticks.color':'color'};static descriptors={angleLines:{_fallback:'grid'}};constructor(cfg){super(cfg);this.xCenter=undefined;this.yCenter=undefined;this.drawingArea=undefined;this._pointLabels=[];this._pointLabelItems=[];}
setDimensions(){const padding=this._padding=toPadding(getTickBackdropHeight(this.options)/2);const w=this.width=this.maxWidth-padding.width;const h=this.height=this.maxHeight-padding.height;this.xCenter=Math.floor(this.left+w/2+padding.left);this.yCenter=Math.floor(this.top+h/2+padding.top);this.drawingArea=Math.floor(Math.min(w,h)/2);}
determineDataLimits(){const{min,max}=this.getMinMax(false);this.min=isNumberFinite(min)&&!isNaN(min)?min:0;this.max=isNumberFinite(max)&&!isNaN(max)?max:0;this.handleTickRangeOptions();}
computeTickLimit(){return Math.ceil(this.drawingArea/getTickBackdropHeight(this.options));}
generateTickLabels(ticks){LinearScaleBase.prototype.generateTickLabels.call(this,ticks);this._pointLabels=this.getLabels().map((value,index)=>{const label=callback(this.options.pointLabels.callback,[value,index],this);return label||label===0?label:'';}).filter((v,i)=>this.chart.getDataVisibility(i));}
fit(){const opts=this.options;if(opts.display&&opts.pointLabels.display){fitWithPointLabels(this);}else{this.setCenterPoint(0,0,0,0);}}
setCenterPoint(leftMovement,rightMovement,topMovement,bottomMovement){this.xCenter+=Math.floor((leftMovement-rightMovement)/2);this.yCenter+=Math.floor((topMovement-bottomMovement)/2);this.drawingArea-=Math.min(this.drawingArea/2,Math.max(leftMovement,rightMovement,topMovement,bottomMovement));}
getIndexAngle(index){const angleMultiplier=TAU/(this._pointLabels.length||1);const startAngle=this.options.startAngle||0;return _normalizeAngle(index*angleMultiplier+toRadians(startAngle));}
getDistanceFromCenterForValue(value){if(isNullOrUndef(value)){return NaN;}
const scalingFactor=this.drawingArea/(this.max-this.min);if(this.options.reverse){return(this.max-value)*scalingFactor;}
return(value-this.min)*scalingFactor;}
getValueForDistanceFromCenter(distance){if(isNullOrUndef(distance)){return NaN;}
const scaledDistance=distance/(this.drawingArea/(this.max-this.min));return this.options.reverse?this.max-scaledDistance:this.min+scaledDistance;}
getPointLabelContext(index){const pointLabels=this._pointLabels||[];if(index>=0&&index<pointLabels.length){const pointLabel=pointLabels[index];return createPointLabelContext(this.getContext(),index,pointLabel);}}
getPointPosition(index,distanceFromCenter,additionalAngle=0){const angle=this.getIndexAngle(index)-HALF_PI+additionalAngle;return{x:Math.cos(angle)*distanceFromCenter+this.xCenter,y:Math.sin(angle)*distanceFromCenter+this.yCenter,angle};}
getPointPositionForValue(index,value){return this.getPointPosition(index,this.getDistanceFromCenterForValue(value));}
getBasePosition(index){return this.getPointPositionForValue(index||0,this.getBaseValue());}
getPointLabelPosition(index){const{left,top,right,bottom}=this._pointLabelItems[index];return{left,top,right,bottom};}
drawBackground(){const{backgroundColor,grid:{circular}}=this.options;if(backgroundColor){const ctx=this.ctx;ctx.save();ctx.beginPath();pathRadiusLine(this,this.getDistanceFromCenterForValue(this._endValue),circular,this._pointLabels.length);ctx.closePath();ctx.fillStyle=backgroundColor;ctx.fill();ctx.restore();}}
drawGrid(){const ctx=this.ctx;const opts=this.options;const{angleLines,grid,border}=opts;const labelCount=this._pointLabels.length;let i,offset,position;if(opts.pointLabels.display){drawPointLabels(this,labelCount);}
if(grid.display){this.ticks.forEach((tick,index)=>{if(index!==0||index===0&&this.min<0){offset=this.getDistanceFromCenterForValue(tick.value);const context=this.getContext(index);const optsAtIndex=grid.setContext(context);const optsAtIndexBorder=border.setContext(context);drawRadiusLine(this,optsAtIndex,offset,labelCount,optsAtIndexBorder);}});}
if(angleLines.display){ctx.save();for(i=labelCount-1;i>=0;i--){const optsAtIndex=angleLines.setContext(this.getPointLabelContext(i));const{color,lineWidth}=optsAtIndex;if(!lineWidth||!color){continue;}
ctx.lineWidth=lineWidth;ctx.strokeStyle=color;ctx.setLineDash(optsAtIndex.borderDash);ctx.lineDashOffset=optsAtIndex.borderDashOffset;offset=this.getDistanceFromCenterForValue(opts.reverse?this.min:this.max);position=this.getPointPosition(i,offset);ctx.beginPath();ctx.moveTo(this.xCenter,this.yCenter);ctx.lineTo(position.x,position.y);ctx.stroke();}
ctx.restore();}}
drawBorder(){}
drawLabels(){const ctx=this.ctx;const opts=this.options;const tickOpts=opts.ticks;if(!tickOpts.display){return;}
const startAngle=this.getIndexAngle(0);let offset,width;ctx.save();ctx.translate(this.xCenter,this.yCenter);ctx.rotate(startAngle);ctx.textAlign='center';ctx.textBaseline='middle';this.ticks.forEach((tick,index)=>{if(index===0&&this.min>=0&&!opts.reverse){return;}
const optsAtIndex=tickOpts.setContext(this.getContext(index));const tickFont=toFont(optsAtIndex.font);offset=this.getDistanceFromCenterForValue(this.ticks[index].value);if(optsAtIndex.showLabelBackdrop){ctx.font=tickFont.string;width=ctx.measureText(tick.label).width;ctx.fillStyle=optsAtIndex.backdropColor;const padding=toPadding(optsAtIndex.backdropPadding);ctx.fillRect(-width/2-padding.left,-offset-tickFont.size/2-padding.top,width+padding.width,tickFont.size+padding.height);}
renderText(ctx,tick.label,0,-offset,tickFont,{color:optsAtIndex.color,strokeColor:optsAtIndex.textStrokeColor,strokeWidth:optsAtIndex.textStrokeWidth});});ctx.restore();}
drawTitle(){}}
const INTERVALS={millisecond:{common:true,size:1,steps:1000},second:{common:true,size:1000,steps:60},minute:{common:true,size:60000,steps:60},hour:{common:true,size:3600000,steps:24},day:{common:true,size:86400000,steps:30},week:{common:false,size:604800000,steps:4},month:{common:true,size:2.628e9,steps:12},quarter:{common:false,size:7.884e9,steps:4},year:{common:true,size:3.154e10}};const UNITS=Object.keys(INTERVALS);function sorter(a,b){return a-b;}
function parse(scale,input){if(isNullOrUndef(input)){return null;}
const adapter=scale._adapter;const{parser,round,isoWeekday}=scale._parseOpts;let value=input;if(typeof parser==='function'){value=parser(value);}
if(!isNumberFinite(value)){value=typeof parser==='string'?adapter.parse(value,parser):adapter.parse(value);}
if(value===null){return null;}
if(round){value=round==='week'&&(isNumber(isoWeekday)||isoWeekday===true)?adapter.startOf(value,'isoWeek',isoWeekday):adapter.startOf(value,round);}
return+value;}
function determineUnitForAutoTicks(minUnit,min,max,capacity){const ilen=UNITS.length;for(let i=UNITS.indexOf(minUnit);i<ilen-1;++i){const interval=INTERVALS[UNITS[i]];const factor=interval.steps?interval.steps:Number.MAX_SAFE_INTEGER;if(interval.common&&Math.ceil((max-min)/(factor*interval.size))<=capacity){return UNITS[i];}}
return UNITS[ilen-1];}
function determineUnitForFormatting(scale,numTicks,minUnit,min,max){for(let i=UNITS.length-1;i>=UNITS.indexOf(minUnit);i--){const unit=UNITS[i];if(INTERVALS[unit].common&&scale._adapter.diff(max,min,unit)>=numTicks-1){return unit;}}
return UNITS[minUnit?UNITS.indexOf(minUnit):0];}
function determineMajorUnit(unit){for(let i=UNITS.indexOf(unit)+1,ilen=UNITS.length;i<ilen;++i){if(INTERVALS[UNITS[i]].common){return UNITS[i];}}}
function addTick(ticks,time,timestamps){if(!timestamps){ticks[time]=true;}else if(timestamps.length){const{lo,hi}=_lookup(timestamps,time);const timestamp=timestamps[lo]>=time?timestamps[lo]:timestamps[hi];ticks[timestamp]=true;}}
function setMajorTicks(scale,ticks,map,majorUnit){const adapter=scale._adapter;const first=+adapter.startOf(ticks[0].value,majorUnit);const last=ticks[ticks.length-1].value;let major,index;for(major=first;major<=last;major=+adapter.add(major,1,majorUnit)){index=map[major];if(index>=0){ticks[index].major=true;}}
return ticks;}
function ticksFromTimestamps(scale,values,majorUnit){const ticks=[];const map={};const ilen=values.length;let i,value;for(i=0;i<ilen;++i){value=values[i];map[value]=i;ticks.push({value,major:false});}
return ilen===0||!majorUnit?ticks:setMajorTicks(scale,ticks,map,majorUnit);}
class TimeScale extends Scale{static id='time';static defaults={bounds:'data',adapters:{},time:{parser:false,unit:false,round:false,isoWeekday:false,minUnit:'millisecond',displayFormats:{}},ticks:{source:'auto',callback:false,major:{enabled:false}}};constructor(props){super(props);this._cache={data:[],labels:[],all:[]};this._unit='day';this._majorUnit=undefined;this._offsets={};this._normalized=false;this._parseOpts=undefined;}
init(scaleOpts,opts={}){const time=scaleOpts.time||(scaleOpts.time={});const adapter=this._adapter=new _adapters._date(scaleOpts.adapters.date);adapter.init(opts);mergeIf(time.displayFormats,adapter.formats());this._parseOpts={parser:time.parser,round:time.round,isoWeekday:time.isoWeekday};super.init(scaleOpts);this._normalized=opts.normalized;}
parse(raw,index){if(raw===undefined){return null;}
return parse(this,raw);}
beforeLayout(){super.beforeLayout();this._cache={data:[],labels:[],all:[]};}
determineDataLimits(){const options=this.options;const adapter=this._adapter;const unit=options.time.unit||'day';let{min,max,minDefined,maxDefined}=this.getUserBounds();function _applyBounds(bounds){if(!minDefined&&!isNaN(bounds.min)){min=Math.min(min,bounds.min);}
if(!maxDefined&&!isNaN(bounds.max)){max=Math.max(max,bounds.max);}}
if(!minDefined||!maxDefined){_applyBounds(this._getLabelBounds());if(options.bounds!=='ticks'||options.ticks.source!=='labels'){_applyBounds(this.getMinMax(false));}}
min=isNumberFinite(min)&&!isNaN(min)?min:+adapter.startOf(Date.now(),unit);max=isNumberFinite(max)&&!isNaN(max)?max:+adapter.endOf(Date.now(),unit)+1;this.min=Math.min(min,max-1);this.max=Math.max(min+1,max);}
_getLabelBounds(){const arr=this.getLabelTimestamps();let min=Number.POSITIVE_INFINITY;let max=Number.NEGATIVE_INFINITY;if(arr.length){min=arr[0];max=arr[arr.length-1];}
return{min,max};}
buildTicks(){const options=this.options;const timeOpts=options.time;const tickOpts=options.ticks;const timestamps=tickOpts.source==='labels'?this.getLabelTimestamps():this._generate();if(options.bounds==='ticks'&&timestamps.length){this.min=this._userMin||timestamps[0];this.max=this._userMax||timestamps[timestamps.length-1];}
const min=this.min;const max=this.max;const ticks=_filterBetween(timestamps,min,max);this._unit=timeOpts.unit||(tickOpts.autoSkip?determineUnitForAutoTicks(timeOpts.minUnit,this.min,this.max,this._getLabelCapacity(min)):determineUnitForFormatting(this,ticks.length,timeOpts.minUnit,this.min,this.max));this._majorUnit=!tickOpts.major.enabled||this._unit==='year'?undefined:determineMajorUnit(this._unit);this.initOffsets(timestamps);if(options.reverse){ticks.reverse();}
return ticksFromTimestamps(this,ticks,this._majorUnit);}
afterAutoSkip(){if(this.options.offsetAfterAutoskip){this.initOffsets(this.ticks.map((tick)=>+tick.value));}}
initOffsets(timestamps=[]){let start=0;let end=0;let first,last;if(this.options.offset&&timestamps.length){first=this.getDecimalForValue(timestamps[0]);if(timestamps.length===1){start=1-first;}else{start=(this.getDecimalForValue(timestamps[1])-first)/2;}
last=this.getDecimalForValue(timestamps[timestamps.length-1]);if(timestamps.length===1){end=last;}else{end=(last-this.getDecimalForValue(timestamps[timestamps.length-2]))/2;}}
const limit=timestamps.length<3?0.5:0.25;start=_limitValue(start,0,limit);end=_limitValue(end,0,limit);this._offsets={start,end,factor:1/(start+1+end)};}
_generate(){const adapter=this._adapter;const min=this.min;const max=this.max;const options=this.options;const timeOpts=options.time;const minor=timeOpts.unit||determineUnitForAutoTicks(timeOpts.minUnit,min,max,this._getLabelCapacity(min));const stepSize=valueOrDefault(options.ticks.stepSize,1);const weekday=minor==='week'?timeOpts.isoWeekday:false;const hasWeekday=isNumber(weekday)||weekday===true;const ticks={};let first=min;let time,count;if(hasWeekday){first=+adapter.startOf(first,'isoWeek',weekday);}
first=+adapter.startOf(first,hasWeekday?'day':minor);if(adapter.diff(max,min,minor)>100000*stepSize){throw new Error(min+' and '+max+' are too far apart with stepSize of '+stepSize+' '+minor);}
const timestamps=options.ticks.source==='data'&&this.getDataTimestamps();for(time=first,count=0;time<max;time=+adapter.add(time,stepSize,minor),count++){addTick(ticks,time,timestamps);}
if(time===max||options.bounds==='ticks'||count===1){addTick(ticks,time,timestamps);}
return Object.keys(ticks).sort(sorter).map((x)=>+x);}
getLabelForValue(value){const adapter=this._adapter;const timeOpts=this.options.time;if(timeOpts.tooltipFormat){return adapter.format(value,timeOpts.tooltipFormat);}
return adapter.format(value,timeOpts.displayFormats.datetime);}
format(value,format){const options=this.options;const formats=options.time.displayFormats;const unit=this._unit;const fmt=format||formats[unit];return this._adapter.format(value,fmt);}
_tickFormatFunction(time,index,ticks,format){const options=this.options;const formatter=options.ticks.callback;if(formatter){return callback(formatter,[time,index,ticks],this);}
const formats=options.time.displayFormats;const unit=this._unit;const majorUnit=this._majorUnit;const minorFormat=unit&&formats[unit];const majorFormat=majorUnit&&formats[majorUnit];const tick=ticks[index];const major=majorUnit&&majorFormat&&tick&&tick.major;return this._adapter.format(time,format||(major?majorFormat:minorFormat));}
generateTickLabels(ticks){let i,ilen,tick;for(i=0,ilen=ticks.length;i<ilen;++i){tick=ticks[i];tick.label=this._tickFormatFunction(tick.value,i,ticks);}}
getDecimalForValue(value){return value===null?NaN:(value-this.min)/(this.max-this.min);}
getPixelForValue(value){const offsets=this._offsets;const pos=this.getDecimalForValue(value);return this.getPixelForDecimal((offsets.start+pos)*offsets.factor);}
getValueForPixel(pixel){const offsets=this._offsets;const pos=this.getDecimalForPixel(pixel)/offsets.factor-offsets.end;return this.min+pos*(this.max-this.min);}
_getLabelSize(label){const ticksOpts=this.options.ticks;const tickLabelWidth=this.ctx.measureText(label).width;const angle=toRadians(this.isHorizontal()?ticksOpts.maxRotation:ticksOpts.minRotation);const cosRotation=Math.cos(angle);const sinRotation=Math.sin(angle);const tickFontSize=this._resolveTickFontOptions(0).size;return{w:tickLabelWidth*cosRotation+tickFontSize*sinRotation,h:tickLabelWidth*sinRotation+tickFontSize*cosRotation};}
_getLabelCapacity(exampleTime){const timeOpts=this.options.time;const displayFormats=timeOpts.displayFormats;const format=displayFormats[timeOpts.unit]||displayFormats.millisecond;const exampleLabel=this._tickFormatFunction(exampleTime,0,ticksFromTimestamps(this,[exampleTime],this._majorUnit),format);const size=this._getLabelSize(exampleLabel);const capacity=Math.floor(this.isHorizontal()?this.width/size.w:this.height/size.h)-1;return capacity>0?capacity:1;}
getDataTimestamps(){let timestamps=this._cache.data||[];let i,ilen;if(timestamps.length){return timestamps;}
const metas=this.getMatchingVisibleMetas();if(this._normalized&&metas.length){return this._cache.data=metas[0].controller.getAllParsedValues(this);}
for(i=0,ilen=metas.length;i<ilen;++i){timestamps=timestamps.concat(metas[i].controller.getAllParsedValues(this));}
return this._cache.data=this.normalize(timestamps);}
getLabelTimestamps(){const timestamps=this._cache.labels||[];let i,ilen;if(timestamps.length){return timestamps;}
const labels=this.getLabels();for(i=0,ilen=labels.length;i<ilen;++i){timestamps.push(parse(this,labels[i]));}
return this._cache.labels=this._normalized?timestamps:this.normalize(timestamps);}
normalize(values){return _arrayUnique(values.sort(sorter));}}
function interpolate(table,val,reverse){let lo=0;let hi=table.length-1;let prevSource,nextSource,prevTarget,nextTarget;if(reverse){if(val>=table[lo].pos&&val<=table[hi].pos){({lo,hi}=_lookupByKey(table,'pos',val));}
({pos:prevSource,time:prevTarget}=table[lo]);({pos:nextSource,time:nextTarget}=table[hi]);}else{if(val>=table[lo].time&&val<=table[hi].time){({lo,hi}=_lookupByKey(table,'time',val));}
({time:prevSource,pos:prevTarget}=table[lo]);({time:nextSource,pos:nextTarget}=table[hi]);}
const span=nextSource-prevSource;return span?prevTarget+(nextTarget-prevTarget)*(val-prevSource)/span:prevTarget;}
class TimeSeriesScale extends TimeScale{static id='timeseries';static defaults=TimeScale.defaults;constructor(props){super(props);this._table=[];this._minPos=undefined;this._tableRange=undefined;}
initOffsets(){const timestamps=this._getTimestampsForTable();const table=this._table=this.buildLookupTable(timestamps);this._minPos=interpolate(table,this.min);this._tableRange=interpolate(table,this.max)-this._minPos;super.initOffsets(timestamps);}
buildLookupTable(timestamps){const{min,max}=this;const items=[];const table=[];let i,ilen,prev,curr,next;for(i=0,ilen=timestamps.length;i<ilen;++i){curr=timestamps[i];if(curr>=min&&curr<=max){items.push(curr);}}
if(items.length<2){return[{time:min,pos:0},{time:max,pos:1}];}
for(i=0,ilen=items.length;i<ilen;++i){next=items[i+1];prev=items[i-1];curr=items[i];if(Math.round((next+prev)/2)!==curr){table.push({time:curr,pos:i/(ilen-1)});}}
return table;}
_generate(){const min=this.min;const max=this.max;let timestamps=super.getDataTimestamps();if(!timestamps.includes(min)||!timestamps.length){timestamps.splice(0,0,min);}
if(!timestamps.includes(max)||timestamps.length===1){timestamps.push(max);}
return timestamps.sort((a,b)=>a-b);}
_getTimestampsForTable(){let timestamps=this._cache.all||[];if(timestamps.length){return timestamps;}
const data=this.getDataTimestamps();const label=this.getLabelTimestamps();if(data.length&&label.length){timestamps=this.normalize(data.concat(label));}else{timestamps=data.length?data:label;}
timestamps=this._cache.all=timestamps;return timestamps;}
getDecimalForValue(value){return(interpolate(this._table,value)-this._minPos)/this._tableRange;}
getValueForPixel(pixel){const offsets=this._offsets;const decimal=this.getDecimalForPixel(pixel)/offsets.factor-offsets.end;return interpolate(this._table,decimal*this._tableRange+this._minPos,true);}}
var scales=Object.freeze({__proto__:null,CategoryScale:CategoryScale,LinearScale:LinearScale,LogarithmicScale:LogarithmicScale,RadialLinearScale:RadialLinearScale,TimeScale:TimeScale,TimeSeriesScale:TimeSeriesScale});const BORDER_COLORS=['rgb(54, 162, 235)','rgb(255, 99, 132)','rgb(255, 159, 64)','rgb(255, 205, 86)','rgb(75, 192, 192)','rgb(153, 102, 255)','rgb(201, 203, 207)'];const BACKGROUND_COLORS=BORDER_COLORS.map((color)=>color.replace('rgb(','rgba(').replace(')',', 0.5)'));function getBorderColor(i){return BORDER_COLORS[i%BORDER_COLORS.length];}
function getBackgroundColor(i){return BACKGROUND_COLORS[i%BACKGROUND_COLORS.length];}
function colorizeDefaultDataset(dataset,i){dataset.borderColor=getBorderColor(i);dataset.backgroundColor=getBackgroundColor(i);return++i;}
function colorizeDoughnutDataset(dataset,i){dataset.backgroundColor=dataset.data.map(()=>getBorderColor(i++));return i;}
function colorizePolarAreaDataset(dataset,i){dataset.backgroundColor=dataset.data.map(()=>getBackgroundColor(i++));return i;}
function getColorizer(chart){let i=0;return(dataset,datasetIndex)=>{const controller=chart.getDatasetMeta(datasetIndex).controller;if(controller instanceof DoughnutController){i=colorizeDoughnutDataset(dataset,i);}else if(controller instanceof PolarAreaController){i=colorizePolarAreaDataset(dataset,i);}else if(controller){i=colorizeDefaultDataset(dataset,i);}};}
function containsColorsDefinitions(descriptors){let k;for(k in descriptors){if(descriptors[k].borderColor||descriptors[k].backgroundColor){return true;}}
return false;}
function containsColorsDefinition(descriptor){return descriptor&&(descriptor.borderColor||descriptor.backgroundColor);}
function containsDefaultColorsDefenitions(){return defaults.borderColor!=='rgba(0,0,0,0.1)'||defaults.backgroundColor!=='rgba(0,0,0,0.1)';}
var plugin_colors={id:'colors',defaults:{enabled:true,forceOverride:false},beforeLayout(chart,_args,options){if(!options.enabled){return;}
const{data:{datasets},options:chartOptions}=chart.config;const{elements}=chartOptions;const containsColorDefenition=containsColorsDefinitions(datasets)||containsColorsDefinition(chartOptions)||elements&&containsColorsDefinitions(elements)||containsDefaultColorsDefenitions();if(!options.forceOverride&&containsColorDefenition){return;}
const colorizer=getColorizer(chart);datasets.forEach(colorizer);}};function lttbDecimation(data,start,count,availableWidth,options){const samples=options.samples||availableWidth;if(samples>=count){return data.slice(start,start+count);}
const decimated=[];const bucketWidth=(count-2)/(samples-2);let sampledIndex=0;const endIndex=start+count-1;let a=start;let i,maxAreaPoint,maxArea,area,nextA;decimated[sampledIndex++]=data[a];for(i=0;i<samples-2;i++){let avgX=0;let avgY=0;let j;const avgRangeStart=Math.floor((i+1)*bucketWidth)+1+start;const avgRangeEnd=Math.min(Math.floor((i+2)*bucketWidth)+1,count)+start;const avgRangeLength=avgRangeEnd-avgRangeStart;for(j=avgRangeStart;j<avgRangeEnd;j++){avgX+=data[j].x;avgY+=data[j].y;}
avgX/=avgRangeLength;avgY/=avgRangeLength;const rangeOffs=Math.floor(i*bucketWidth)+1+start;const rangeTo=Math.min(Math.floor((i+1)*bucketWidth)+1,count)+start;const{x:pointAx,y:pointAy}=data[a];maxArea=area=-1;for(j=rangeOffs;j<rangeTo;j++){area=0.5*Math.abs((pointAx-avgX)*(data[j].y-pointAy)-(pointAx-data[j].x)*(avgY-pointAy));if(area>maxArea){maxArea=area;maxAreaPoint=data[j];nextA=j;}}
decimated[sampledIndex++]=maxAreaPoint;a=nextA;}
decimated[sampledIndex++]=data[endIndex];return decimated;}
function minMaxDecimation(data,start,count,availableWidth){let avgX=0;let countX=0;let i,point,x,y,prevX,minIndex,maxIndex,startIndex,minY,maxY;const decimated=[];const endIndex=start+count-1;const xMin=data[start].x;const xMax=data[endIndex].x;const dx=xMax-xMin;for(i=start;i<start+count;++i){point=data[i];x=(point.x-xMin)/dx*availableWidth;y=point.y;const truncX=x|0;if(truncX===prevX){if(y<minY){minY=y;minIndex=i;}else if(y>maxY){maxY=y;maxIndex=i;}
avgX=(countX*avgX+point.x)/++countX;}else{const lastIndex=i-1;if(!isNullOrUndef(minIndex)&&!isNullOrUndef(maxIndex)){const intermediateIndex1=Math.min(minIndex,maxIndex);const intermediateIndex2=Math.max(minIndex,maxIndex);if(intermediateIndex1!==startIndex&&intermediateIndex1!==lastIndex){decimated.push({...data[intermediateIndex1],x:avgX});}
if(intermediateIndex2!==startIndex&&intermediateIndex2!==lastIndex){decimated.push({...data[intermediateIndex2],x:avgX});}}
if(i>0&&lastIndex!==startIndex){decimated.push(data[lastIndex]);}
decimated.push(point);prevX=truncX;countX=0;minY=maxY=y;minIndex=maxIndex=startIndex=i;}}
return decimated;}
function cleanDecimatedDataset(dataset){if(dataset._decimated){const data=dataset._data;delete dataset._decimated;delete dataset._data;Object.defineProperty(dataset,'data',{configurable:true,enumerable:true,writable:true,value:data});}}
function cleanDecimatedData(chart){chart.data.datasets.forEach((dataset)=>{cleanDecimatedDataset(dataset);});}
function getStartAndCountOfVisiblePointsSimplified(meta,points){const pointCount=points.length;let start=0;let count;const{iScale}=meta;const{min,max,minDefined,maxDefined}=iScale.getUserBounds();if(minDefined){start=_limitValue(_lookupByKey(points,iScale.axis,min).lo,0,pointCount-1);}
if(maxDefined){count=_limitValue(_lookupByKey(points,iScale.axis,max).hi+1,start,pointCount)-start;}else{count=pointCount-start;}
return{start,count};}
var plugin_decimation={id:'decimation',defaults:{algorithm:'min-max',enabled:false},beforeElementsUpdate:(chart,args,options)=>{if(!options.enabled){cleanDecimatedData(chart);return;}
const availableWidth=chart.width;chart.data.datasets.forEach((dataset,datasetIndex)=>{const{_data,indexAxis}=dataset;const meta=chart.getDatasetMeta(datasetIndex);const data=_data||dataset.data;if(resolve([indexAxis,chart.options.indexAxis])==='y'){return;}
if(!meta.controller.supportsDecimation){return;}
const xAxis=chart.scales[meta.xAxisID];if(xAxis.type!=='linear'&&xAxis.type!=='time'){return;}
if(chart.options.parsing){return;}
let{start,count}=getStartAndCountOfVisiblePointsSimplified(meta,data);const threshold=options.threshold||4*availableWidth;if(count<=threshold){cleanDecimatedDataset(dataset);return;}
if(isNullOrUndef(_data)){dataset._data=data;delete dataset.data;Object.defineProperty(dataset,'data',{configurable:true,enumerable:true,get:function(){return this._decimated;},set:function(d){this._data=d;}});}
let decimated;switch(options.algorithm){case'lttb':decimated=lttbDecimation(data,start,count,availableWidth,options);break;case'min-max':decimated=minMaxDecimation(data,start,count,availableWidth);break;default:throw new Error(`Unsupported decimation algorithm '${options.algorithm}'`);}
dataset._decimated=decimated;});},destroy(chart){cleanDecimatedData(chart);}};function _segments(line,target,property){const segments=line.segments;const points=line.points;const tpoints=target.points;const parts=[];for(const segment of segments){let{start,end}=segment;end=_findSegmentEnd(start,end,points);const bounds=_getBounds(property,points[start],points[end],segment.loop);if(!target.segments){parts.push({source:segment,target:bounds,start:points[start],end:points[end]});continue;}
const targetSegments=_boundSegments(target,bounds);for(const tgt of targetSegments){const subBounds=_getBounds(property,tpoints[tgt.start],tpoints[tgt.end],tgt.loop);const fillSources=_boundSegment(segment,points,subBounds);for(const fillSource of fillSources){parts.push({source:fillSource,target:tgt,start:{[property]:_getEdge(bounds,subBounds,'start',Math.max)},end:{[property]:_getEdge(bounds,subBounds,'end',Math.min)}});}}}
return parts;}
function _getBounds(property,first,last,loop){if(loop){return;}
let start=first[property];let end=last[property];if(property==='angle'){start=_normalizeAngle(start);end=_normalizeAngle(end);}
return{property,start,end};}
function _pointsFromSegments(boundary,line){const{x=null,y=null}=boundary||{};const linePoints=line.points;const points=[];line.segments.forEach(({start,end})=>{end=_findSegmentEnd(start,end,linePoints);const first=linePoints[start];const last=linePoints[end];if(y!==null){points.push({x:first.x,y});points.push({x:last.x,y});}else if(x!==null){points.push({x,y:first.y});points.push({x,y:last.y});}});return points;}
function _findSegmentEnd(start,end,points){for(;end>start;end--){const point=points[end];if(!isNaN(point.x)&&!isNaN(point.y)){break;}}
return end;}
function _getEdge(a,b,prop,fn){if(a&&b){return fn(a[prop],b[prop]);}
return a?a[prop]:b?b[prop]:0;}
function _createBoundaryLine(boundary,line){let points=[];let _loop=false;if(isArray(boundary)){_loop=true;points=boundary;}else{points=_pointsFromSegments(boundary,line);}
return points.length?new LineElement({points,options:{tension:0},_loop,_fullLoop:_loop}):null;}
function _shouldApplyFill(source){return source&&source.fill!==false;}
function _resolveTarget(sources,index,propagate){const source=sources[index];let fill=source.fill;const visited=[index];let target;if(!propagate){return fill;}
while(fill!==false&&visited.indexOf(fill)===-1){if(!isNumberFinite(fill)){return fill;}
target=sources[fill];if(!target){return false;}
if(target.visible){return fill;}
visited.push(fill);fill=target.fill;}
return false;}
function _decodeFill(line,index,count){const fill=parseFillOption(line);if(isObject(fill)){return isNaN(fill.value)?false:fill;}
let target=parseFloat(fill);if(isNumberFinite(target)&&Math.floor(target)===target){return decodeTargetIndex(fill[0],index,target,count);}
return['origin','start','end','stack','shape'].indexOf(fill)>=0&&fill;}
function decodeTargetIndex(firstCh,index,target,count){if(firstCh==='-'||firstCh==='+'){target=index+target;}
if(target===index||target<0||target>=count){return false;}
return target;}
function _getTargetPixel(fill,scale){let pixel=null;if(fill==='start'){pixel=scale.bottom;}else if(fill==='end'){pixel=scale.top;}else if(isObject(fill)){pixel=scale.getPixelForValue(fill.value);}else if(scale.getBasePixel){pixel=scale.getBasePixel();}
return pixel;}
function _getTargetValue(fill,scale,startValue){let value;if(fill==='start'){value=startValue;}else if(fill==='end'){value=scale.options.reverse?scale.min:scale.max;}else if(isObject(fill)){value=fill.value;}else{value=scale.getBaseValue();}
return value;}
function parseFillOption(line){const options=line.options;const fillOption=options.fill;let fill=valueOrDefault(fillOption&&fillOption.target,fillOption);if(fill===undefined){fill=!!options.backgroundColor;}
if(fill===false||fill===null){return false;}
if(fill===true){return'origin';}
return fill;}
function _buildStackLine(source){const{scale,index,line}=source;const points=[];const segments=line.segments;const sourcePoints=line.points;const linesBelow=getLinesBelow(scale,index);linesBelow.push(_createBoundaryLine({x:null,y:scale.bottom},line));for(let i=0;i<segments.length;i++){const segment=segments[i];for(let j=segment.start;j<=segment.end;j++){addPointsBelow(points,sourcePoints[j],linesBelow);}}
return new LineElement({points,options:{}});}
function getLinesBelow(scale,index){const below=[];const metas=scale.getMatchingVisibleMetas('line');for(let i=0;i<metas.length;i++){const meta=metas[i];if(meta.index===index){break;}
if(!meta.hidden){below.unshift(meta.dataset);}}
return below;}
function addPointsBelow(points,sourcePoint,linesBelow){const postponed=[];for(let j=0;j<linesBelow.length;j++){const line=linesBelow[j];const{first,last,point}=findPoint(line,sourcePoint,'x');if(!point||first&&last){continue;}
if(first){postponed.unshift(point);}else{points.push(point);if(!last){break;}}}
points.push(...postponed);}
function findPoint(line,sourcePoint,property){const point=line.interpolate(sourcePoint,property);if(!point){return{};}
const pointValue=point[property];const segments=line.segments;const linePoints=line.points;let first=false;let last=false;for(let i=0;i<segments.length;i++){const segment=segments[i];const firstValue=linePoints[segment.start][property];const lastValue=linePoints[segment.end][property];if(_isBetween(pointValue,firstValue,lastValue)){first=pointValue===firstValue;last=pointValue===lastValue;break;}}
return{first,last,point};}
class simpleArc{constructor(opts){this.x=opts.x;this.y=opts.y;this.radius=opts.radius;}
pathSegment(ctx,bounds,opts){const{x,y,radius}=this;bounds=bounds||{start:0,end:TAU};ctx.arc(x,y,radius,bounds.end,bounds.start,true);return!opts.bounds;}
interpolate(point){const{x,y,radius}=this;const angle=point.angle;return{x:x+Math.cos(angle)*radius,y:y+Math.sin(angle)*radius,angle};}}
function _getTarget(source){const{chart,fill,line}=source;if(isNumberFinite(fill)){return getLineByIndex(chart,fill);}
if(fill==='stack'){return _buildStackLine(source);}
if(fill==='shape'){return true;}
const boundary=computeBoundary(source);if(boundary instanceof simpleArc){return boundary;}
return _createBoundaryLine(boundary,line);}
function getLineByIndex(chart,index){const meta=chart.getDatasetMeta(index);const visible=meta&&chart.isDatasetVisible(index);return visible?meta.dataset:null;}
function computeBoundary(source){const scale=source.scale||{};if(scale.getPointPositionForValue){return computeCircularBoundary(source);}
return computeLinearBoundary(source);}
function computeLinearBoundary(source){const{scale={},fill}=source;const pixel=_getTargetPixel(fill,scale);if(isNumberFinite(pixel)){const horizontal=scale.isHorizontal();return{x:horizontal?pixel:null,y:horizontal?null:pixel};}
return null;}
function computeCircularBoundary(source){const{scale,fill}=source;const options=scale.options;const length=scale.getLabels().length;const start=options.reverse?scale.max:scale.min;const value=_getTargetValue(fill,scale,start);const target=[];if(options.grid.circular){const center=scale.getPointPositionForValue(0,start);return new simpleArc({x:center.x,y:center.y,radius:scale.getDistanceFromCenterForValue(value)});}
for(let i=0;i<length;++i){target.push(scale.getPointPositionForValue(i,value));}
return target;}
function _drawfill(ctx,source,area){const target=_getTarget(source);const{line,scale,axis}=source;const lineOpts=line.options;const fillOption=lineOpts.fill;const color=lineOpts.backgroundColor;const{above=color,below=color}=fillOption||{};if(target&&line.points.length){clipArea(ctx,area);doFill(ctx,{line,target,above,below,area,scale,axis});unclipArea(ctx);}}
function doFill(ctx,cfg){const{line,target,above,below,area,scale}=cfg;const property=line._loop?'angle':cfg.axis;ctx.save();if(property==='x'&&below!==above){clipVertical(ctx,target,area.top);fill(ctx,{line,target,color:above,scale,property});ctx.restore();ctx.save();clipVertical(ctx,target,area.bottom);}
fill(ctx,{line,target,color:below,scale,property});ctx.restore();}
function clipVertical(ctx,target,clipY){const{segments,points}=target;let first=true;let lineLoop=false;ctx.beginPath();for(const segment of segments){const{start,end}=segment;const firstPoint=points[start];const lastPoint=points[_findSegmentEnd(start,end,points)];if(first){ctx.moveTo(firstPoint.x,firstPoint.y);first=false;}else{ctx.lineTo(firstPoint.x,clipY);ctx.lineTo(firstPoint.x,firstPoint.y);}
lineLoop=!!target.pathSegment(ctx,segment,{move:lineLoop});if(lineLoop){ctx.closePath();}else{ctx.lineTo(lastPoint.x,clipY);}}
ctx.lineTo(target.first().x,clipY);ctx.closePath();ctx.clip();}
function fill(ctx,cfg){const{line,target,property,color,scale}=cfg;const segments=_segments(line,target,property);for(const{source:src,target:tgt,start,end}of segments){const{style:{backgroundColor=color}={}}=src;const notShape=target!==true;ctx.save();ctx.fillStyle=backgroundColor;clipBounds(ctx,scale,notShape&&_getBounds(property,start,end));ctx.beginPath();const lineLoop=!!line.pathSegment(ctx,src);let loop;if(notShape){if(lineLoop){ctx.closePath();}else{interpolatedLineTo(ctx,target,end,property);}
const targetLoop=!!target.pathSegment(ctx,tgt,{move:lineLoop,reverse:true});loop=lineLoop&&targetLoop;if(!loop){interpolatedLineTo(ctx,target,start,property);}}
ctx.closePath();ctx.fill(loop?'evenodd':'nonzero');ctx.restore();}}
function clipBounds(ctx,scale,bounds){const{top,bottom}=scale.chart.chartArea;const{property,start,end}=bounds||{};if(property==='x'){ctx.beginPath();ctx.rect(start,top,end-start,bottom-top);ctx.clip();}}
function interpolatedLineTo(ctx,target,point,property){const interpolatedPoint=target.interpolate(point,property);if(interpolatedPoint){ctx.lineTo(interpolatedPoint.x,interpolatedPoint.y);}}
var index={id:'filler',afterDatasetsUpdate(chart,_args,options){const count=(chart.data.datasets||[]).length;const sources=[];let meta,i,line,source;for(i=0;i<count;++i){meta=chart.getDatasetMeta(i);line=meta.dataset;source=null;if(line&&line.options&&line instanceof LineElement){source={visible:chart.isDatasetVisible(i),index:i,fill:_decodeFill(line,i,count),chart,axis:meta.controller.options.indexAxis,scale:meta.vScale,line};}
meta.$filler=source;sources.push(source);}
for(i=0;i<count;++i){source=sources[i];if(!source||source.fill===false){continue;}
source.fill=_resolveTarget(sources,i,options.propagate);}},beforeDraw(chart,_args,options){const draw=options.drawTime==='beforeDraw';const metasets=chart.getSortedVisibleDatasetMetas();const area=chart.chartArea;for(let i=metasets.length-1;i>=0;--i){const source=metasets[i].$filler;if(!source){continue;}
source.line.updateControlPoints(area,source.axis);if(draw&&source.fill){_drawfill(chart.ctx,source,area);}}},beforeDatasetsDraw(chart,_args,options){if(options.drawTime!=='beforeDatasetsDraw'){return;}
const metasets=chart.getSortedVisibleDatasetMetas();for(let i=metasets.length-1;i>=0;--i){const source=metasets[i].$filler;if(_shouldApplyFill(source)){_drawfill(chart.ctx,source,chart.chartArea);}}},beforeDatasetDraw(chart,args,options){const source=args.meta.$filler;if(!_shouldApplyFill(source)||options.drawTime!=='beforeDatasetDraw'){return;}
_drawfill(chart.ctx,source,chart.chartArea);},defaults:{propagate:true,drawTime:'beforeDatasetDraw'}};const getBoxSize=(labelOpts,fontSize)=>{let{boxHeight=fontSize,boxWidth=fontSize}=labelOpts;if(labelOpts.usePointStyle){boxHeight=Math.min(boxHeight,fontSize);boxWidth=labelOpts.pointStyleWidth||Math.min(boxWidth,fontSize);}
return{boxWidth,boxHeight,itemHeight:Math.max(fontSize,boxHeight)};};const itemsEqual=(a,b)=>a!==null&&b!==null&&a.datasetIndex===b.datasetIndex&&a.index===b.index;class Legend extends Element{constructor(config){super();this._added=false;this.legendHitBoxes=[];this._hoveredItem=null;this.doughnutMode=false;this.chart=config.chart;this.options=config.options;this.ctx=config.ctx;this.legendItems=undefined;this.columnSizes=undefined;this.lineWidths=undefined;this.maxHeight=undefined;this.maxWidth=undefined;this.top=undefined;this.bottom=undefined;this.left=undefined;this.right=undefined;this.height=undefined;this.width=undefined;this._margins=undefined;this.position=undefined;this.weight=undefined;this.fullSize=undefined;}
update(maxWidth,maxHeight,margins){this.maxWidth=maxWidth;this.maxHeight=maxHeight;this._margins=margins;this.setDimensions();this.buildLabels();this.fit();}
setDimensions(){if(this.isHorizontal()){this.width=this.maxWidth;this.left=this._margins.left;this.right=this.width;}else{this.height=this.maxHeight;this.top=this._margins.top;this.bottom=this.height;}}
buildLabels(){const labelOpts=this.options.labels||{};let legendItems=callback(labelOpts.generateLabels,[this.chart],this)||[];if(labelOpts.filter){legendItems=legendItems.filter((item)=>labelOpts.filter(item,this.chart.data));}
if(labelOpts.sort){legendItems=legendItems.sort((a,b)=>labelOpts.sort(a,b,this.chart.data));}
if(this.options.reverse){legendItems.reverse();}
this.legendItems=legendItems;}
fit(){const{options,ctx}=this;if(!options.display){this.width=this.height=0;return;}
const labelOpts=options.labels;const labelFont=toFont(labelOpts.font);const fontSize=labelFont.size;const titleHeight=this._computeTitleHeight();const{boxWidth,itemHeight}=getBoxSize(labelOpts,fontSize);let width,height;ctx.font=labelFont.string;if(this.isHorizontal()){width=this.maxWidth;height=this._fitRows(titleHeight,fontSize,boxWidth,itemHeight)+10;}else{height=this.maxHeight;width=this._fitCols(titleHeight,labelFont,boxWidth,itemHeight)+10;}
this.width=Math.min(width,options.maxWidth||this.maxWidth);this.height=Math.min(height,options.maxHeight||this.maxHeight);}
_fitRows(titleHeight,fontSize,boxWidth,itemHeight){const{ctx,maxWidth,options:{labels:{padding}}}=this;const hitboxes=this.legendHitBoxes=[];const lineWidths=this.lineWidths=[0];const lineHeight=itemHeight+padding;let totalHeight=titleHeight;ctx.textAlign='left';ctx.textBaseline='middle';let row=-1;let top=-lineHeight;this.legendItems.forEach((legendItem,i)=>{const itemWidth=boxWidth+fontSize/2+ctx.measureText(legendItem.text).width;if(i===0||lineWidths[lineWidths.length-1]+itemWidth+2*padding>maxWidth){totalHeight+=lineHeight;lineWidths[lineWidths.length-(i>0?0:1)]=0;top+=lineHeight;row++;}
hitboxes[i]={left:0,top,row,width:itemWidth,height:itemHeight};lineWidths[lineWidths.length-1]+=itemWidth+padding;});return totalHeight;}
_fitCols(titleHeight,labelFont,boxWidth,_itemHeight){const{ctx,maxHeight,options:{labels:{padding}}}=this;const hitboxes=this.legendHitBoxes=[];const columnSizes=this.columnSizes=[];const heightLimit=maxHeight-titleHeight;let totalWidth=padding;let currentColWidth=0;let currentColHeight=0;let left=0;let col=0;this.legendItems.forEach((legendItem,i)=>{const{itemWidth,itemHeight}=calculateItemSize(boxWidth,labelFont,ctx,legendItem,_itemHeight);if(i>0&&currentColHeight+itemHeight+2*padding>heightLimit){totalWidth+=currentColWidth+padding;columnSizes.push({width:currentColWidth,height:currentColHeight});left+=currentColWidth+padding;col++;currentColWidth=currentColHeight=0;}
hitboxes[i]={left,top:currentColHeight,col,width:itemWidth,height:itemHeight};currentColWidth=Math.max(currentColWidth,itemWidth);currentColHeight+=itemHeight+padding;});totalWidth+=currentColWidth;columnSizes.push({width:currentColWidth,height:currentColHeight});return totalWidth;}
adjustHitBoxes(){if(!this.options.display){return;}
const titleHeight=this._computeTitleHeight();const{legendHitBoxes:hitboxes,options:{align,labels:{padding},rtl}}=this;const rtlHelper=getRtlAdapter(rtl,this.left,this.width);if(this.isHorizontal()){let row=0;let left=_alignStartEnd(align,this.left+padding,this.right-this.lineWidths[row]);for(const hitbox of hitboxes){if(row!==hitbox.row){row=hitbox.row;left=_alignStartEnd(align,this.left+padding,this.right-this.lineWidths[row]);}
hitbox.top+=this.top+titleHeight+padding;hitbox.left=rtlHelper.leftForLtr(rtlHelper.x(left),hitbox.width);left+=hitbox.width+padding;}}else{let col=0;let top=_alignStartEnd(align,this.top+titleHeight+padding,this.bottom-this.columnSizes[col].height);for(const hitbox of hitboxes){if(hitbox.col!==col){col=hitbox.col;top=_alignStartEnd(align,this.top+titleHeight+padding,this.bottom-this.columnSizes[col].height);}
hitbox.top=top;hitbox.left+=this.left+padding;hitbox.left=rtlHelper.leftForLtr(rtlHelper.x(hitbox.left),hitbox.width);top+=hitbox.height+padding;}}}
isHorizontal(){return this.options.position==='top'||this.options.position==='bottom';}
draw(){if(this.options.display){const ctx=this.ctx;clipArea(ctx,this);this._draw();unclipArea(ctx);}}
_draw(){const{options:opts,columnSizes,lineWidths,ctx}=this;const{align,labels:labelOpts}=opts;const defaultColor=defaults.color;const rtlHelper=getRtlAdapter(opts.rtl,this.left,this.width);const labelFont=toFont(labelOpts.font);const{padding}=labelOpts;const fontSize=labelFont.size;const halfFontSize=fontSize/2;let cursor;this.drawTitle();ctx.textAlign=rtlHelper.textAlign('left');ctx.textBaseline='middle';ctx.lineWidth=0.5;ctx.font=labelFont.string;const{boxWidth,boxHeight,itemHeight}=getBoxSize(labelOpts,fontSize);const drawLegendBox=function(x,y,legendItem){if(isNaN(boxWidth)||boxWidth<=0||isNaN(boxHeight)||boxHeight<0){return;}
ctx.save();const lineWidth=valueOrDefault(legendItem.lineWidth,1);ctx.fillStyle=valueOrDefault(legendItem.fillStyle,defaultColor);ctx.lineCap=valueOrDefault(legendItem.lineCap,'butt');ctx.lineDashOffset=valueOrDefault(legendItem.lineDashOffset,0);ctx.lineJoin=valueOrDefault(legendItem.lineJoin,'miter');ctx.lineWidth=lineWidth;ctx.strokeStyle=valueOrDefault(legendItem.strokeStyle,defaultColor);ctx.setLineDash(valueOrDefault(legendItem.lineDash,[]));if(labelOpts.usePointStyle){const drawOptions={radius:boxHeight*Math.SQRT2/2,pointStyle:legendItem.pointStyle,rotation:legendItem.rotation,borderWidth:lineWidth};const centerX=rtlHelper.xPlus(x,boxWidth/2);const centerY=y+halfFontSize;drawPointLegend(ctx,drawOptions,centerX,centerY,labelOpts.pointStyleWidth&&boxWidth);}else{const yBoxTop=y+Math.max((fontSize-boxHeight)/2,0);const xBoxLeft=rtlHelper.leftForLtr(x,boxWidth);const borderRadius=toTRBLCorners(legendItem.borderRadius);ctx.beginPath();if(Object.values(borderRadius).some((v)=>v!==0)){addRoundedRectPath(ctx,{x:xBoxLeft,y:yBoxTop,w:boxWidth,h:boxHeight,radius:borderRadius});}else{ctx.rect(xBoxLeft,yBoxTop,boxWidth,boxHeight);}
ctx.fill();if(lineWidth!==0){ctx.stroke();}}
ctx.restore();};const fillText=function(x,y,legendItem){renderText(ctx,legendItem.text,x,y+itemHeight/2,labelFont,{strikethrough:legendItem.hidden,textAlign:rtlHelper.textAlign(legendItem.textAlign)});};const isHorizontal=this.isHorizontal();const titleHeight=this._computeTitleHeight();if(isHorizontal){cursor={x:_alignStartEnd(align,this.left+padding,this.right-lineWidths[0]),y:this.top+padding+titleHeight,line:0};}else{cursor={x:this.left+padding,y:_alignStartEnd(align,this.top+titleHeight+padding,this.bottom-columnSizes[0].height),line:0};}
overrideTextDirection(this.ctx,opts.textDirection);const lineHeight=itemHeight+padding;this.legendItems.forEach((legendItem,i)=>{ctx.strokeStyle=legendItem.fontColor;ctx.fillStyle=legendItem.fontColor;const textWidth=ctx.measureText(legendItem.text).width;const textAlign=rtlHelper.textAlign(legendItem.textAlign||(legendItem.textAlign=labelOpts.textAlign));const width=boxWidth+halfFontSize+textWidth;let x=cursor.x;let y=cursor.y;rtlHelper.setWidth(this.width);if(isHorizontal){if(i>0&&x+width+padding>this.right){y=cursor.y+=lineHeight;cursor.line++;x=cursor.x=_alignStartEnd(align,this.left+padding,this.right-lineWidths[cursor.line]);}}else if(i>0&&y+lineHeight>this.bottom){x=cursor.x=x+columnSizes[cursor.line].width+padding;cursor.line++;y=cursor.y=_alignStartEnd(align,this.top+titleHeight+padding,this.bottom-columnSizes[cursor.line].height);}
const realX=rtlHelper.x(x);drawLegendBox(realX,y,legendItem);x=_textX(textAlign,x+boxWidth+halfFontSize,isHorizontal?x+width:this.right,opts.rtl);fillText(rtlHelper.x(x),y,legendItem);if(isHorizontal){cursor.x+=width+padding;}else if(typeof legendItem.text!=='string'){const fontLineHeight=labelFont.lineHeight;cursor.y+=calculateLegendItemHeight(legendItem,fontLineHeight)+padding;}else{cursor.y+=lineHeight;}});restoreTextDirection(this.ctx,opts.textDirection);}
drawTitle(){const opts=this.options;const titleOpts=opts.title;const titleFont=toFont(titleOpts.font);const titlePadding=toPadding(titleOpts.padding);if(!titleOpts.display){return;}
const rtlHelper=getRtlAdapter(opts.rtl,this.left,this.width);const ctx=this.ctx;const position=titleOpts.position;const halfFontSize=titleFont.size/2;const topPaddingPlusHalfFontSize=titlePadding.top+halfFontSize;let y;let left=this.left;let maxWidth=this.width;if(this.isHorizontal()){maxWidth=Math.max(...this.lineWidths);y=this.top+topPaddingPlusHalfFontSize;left=_alignStartEnd(opts.align,left,this.right-maxWidth);}else{const maxHeight=this.columnSizes.reduce((acc,size)=>Math.max(acc,size.height),0);y=topPaddingPlusHalfFontSize+_alignStartEnd(opts.align,this.top,this.bottom-maxHeight-opts.labels.padding-this._computeTitleHeight());}
const x=_alignStartEnd(position,left,left+maxWidth);ctx.textAlign=rtlHelper.textAlign(_toLeftRightCenter(position));ctx.textBaseline='middle';ctx.strokeStyle=titleOpts.color;ctx.fillStyle=titleOpts.color;ctx.font=titleFont.string;renderText(ctx,titleOpts.text,x,y,titleFont);}
_computeTitleHeight(){const titleOpts=this.options.title;const titleFont=toFont(titleOpts.font);const titlePadding=toPadding(titleOpts.padding);return titleOpts.display?titleFont.lineHeight+titlePadding.height:0;}
_getLegendItemAt(x,y){let i,hitBox,lh;if(_isBetween(x,this.left,this.right)&&_isBetween(y,this.top,this.bottom)){lh=this.legendHitBoxes;for(i=0;i<lh.length;++i){hitBox=lh[i];if(_isBetween(x,hitBox.left,hitBox.left+hitBox.width)&&_isBetween(y,hitBox.top,hitBox.top+hitBox.height)){return this.legendItems[i];}}}
return null;}
handleEvent(e){const opts=this.options;if(!isListened(e.type,opts)){return;}
const hoveredItem=this._getLegendItemAt(e.x,e.y);if(e.type==='mousemove'||e.type==='mouseout'){const previous=this._hoveredItem;const sameItem=itemsEqual(previous,hoveredItem);if(previous&&!sameItem){callback(opts.onLeave,[e,previous,this],this);}
this._hoveredItem=hoveredItem;if(hoveredItem&&!sameItem){callback(opts.onHover,[e,hoveredItem,this],this);}}else if(hoveredItem){callback(opts.onClick,[e,hoveredItem,this],this);}}}
function calculateItemSize(boxWidth,labelFont,ctx,legendItem,_itemHeight){const itemWidth=calculateItemWidth(legendItem,boxWidth,labelFont,ctx);const itemHeight=calculateItemHeight(_itemHeight,legendItem,labelFont.lineHeight);return{itemWidth,itemHeight};}
function calculateItemWidth(legendItem,boxWidth,labelFont,ctx){let legendItemText=legendItem.text;if(legendItemText&&typeof legendItemText!=='string'){legendItemText=legendItemText.reduce((a,b)=>a.length>b.length?a:b);}
return boxWidth+labelFont.size/2+ctx.measureText(legendItemText).width;}
function calculateItemHeight(_itemHeight,legendItem,fontLineHeight){let itemHeight=_itemHeight;if(typeof legendItem.text!=='string'){itemHeight=calculateLegendItemHeight(legendItem,fontLineHeight);}
return itemHeight;}
function calculateLegendItemHeight(legendItem,fontLineHeight){const labelHeight=legendItem.text?legendItem.text.length:0;return fontLineHeight*labelHeight;}
function isListened(type,opts){if((type==='mousemove'||type==='mouseout')&&(opts.onHover||opts.onLeave)){return true;}
if(opts.onClick&&(type==='click'||type==='mouseup')){return true;}
return false;}
var plugin_legend={id:'legend',_element:Legend,start(chart,_args,options){const legend=chart.legend=new Legend({ctx:chart.ctx,options,chart});layouts.configure(chart,legend,options);layouts.addBox(chart,legend);},stop(chart){layouts.removeBox(chart,chart.legend);delete chart.legend;},beforeUpdate(chart,_args,options){const legend=chart.legend;layouts.configure(chart,legend,options);legend.options=options;},afterUpdate(chart){const legend=chart.legend;legend.buildLabels();legend.adjustHitBoxes();},afterEvent(chart,args){if(!args.replay){chart.legend.handleEvent(args.event);}},defaults:{display:true,position:'top',align:'center',fullSize:true,reverse:false,weight:1000,onClick(e,legendItem,legend){const index=legendItem.datasetIndex;const ci=legend.chart;if(ci.isDatasetVisible(index)){ci.hide(index);legendItem.hidden=true;}else{ci.show(index);legendItem.hidden=false;}},onHover:null,onLeave:null,labels:{color:(ctx)=>ctx.chart.options.color,boxWidth:40,padding:10,generateLabels(chart){const datasets=chart.data.datasets;const{labels:{usePointStyle,pointStyle,textAlign,color,useBorderRadius,borderRadius}}=chart.legend.options;return chart._getSortedDatasetMetas().map((meta)=>{const style=meta.controller.getStyle(usePointStyle?0:undefined);const borderWidth=toPadding(style.borderWidth);return{text:datasets[meta.index].label,fillStyle:style.backgroundColor,fontColor:color,hidden:!meta.visible,lineCap:style.borderCapStyle,lineDash:style.borderDash,lineDashOffset:style.borderDashOffset,lineJoin:style.borderJoinStyle,lineWidth:(borderWidth.width+borderWidth.height)/4,strokeStyle:style.borderColor,pointStyle:pointStyle||style.pointStyle,rotation:style.rotation,textAlign:textAlign||style.textAlign,borderRadius:useBorderRadius&&(borderRadius||style.borderRadius),datasetIndex:meta.index};},this);}},title:{color:(ctx)=>ctx.chart.options.color,display:false,position:'center',text:''}},descriptors:{_scriptable:(name)=>!name.startsWith('on'),labels:{_scriptable:(name)=>!['generateLabels','filter','sort'].includes(name)}}};class Title extends Element{constructor(config){super();this.chart=config.chart;this.options=config.options;this.ctx=config.ctx;this._padding=undefined;this.top=undefined;this.bottom=undefined;this.left=undefined;this.right=undefined;this.width=undefined;this.height=undefined;this.position=undefined;this.weight=undefined;this.fullSize=undefined;}
update(maxWidth,maxHeight){const opts=this.options;this.left=0;this.top=0;if(!opts.display){this.width=this.height=this.right=this.bottom=0;return;}
this.width=this.right=maxWidth;this.height=this.bottom=maxHeight;const lineCount=isArray(opts.text)?opts.text.length:1;this._padding=toPadding(opts.padding);const textSize=lineCount*toFont(opts.font).lineHeight+this._padding.height;if(this.isHorizontal()){this.height=textSize;}else{this.width=textSize;}}
isHorizontal(){const pos=this.options.position;return pos==='top'||pos==='bottom';}
_drawArgs(offset){const{top,left,bottom,right,options}=this;const align=options.align;let rotation=0;let maxWidth,titleX,titleY;if(this.isHorizontal()){titleX=_alignStartEnd(align,left,right);titleY=top+offset;maxWidth=right-left;}else{if(options.position==='left'){titleX=left+offset;titleY=_alignStartEnd(align,bottom,top);rotation=PI*-0.5;}else{titleX=right-offset;titleY=_alignStartEnd(align,top,bottom);rotation=PI*0.5;}
maxWidth=bottom-top;}
return{titleX,titleY,maxWidth,rotation};}
draw(){const ctx=this.ctx;const opts=this.options;if(!opts.display){return;}
const fontOpts=toFont(opts.font);const lineHeight=fontOpts.lineHeight;const offset=lineHeight/2+this._padding.top;const{titleX,titleY,maxWidth,rotation}=this._drawArgs(offset);renderText(ctx,opts.text,0,0,fontOpts,{color:opts.color,maxWidth,rotation,textAlign:_toLeftRightCenter(opts.align),textBaseline:'middle',translation:[titleX,titleY]});}}
function createTitle(chart,titleOpts){const title=new Title({ctx:chart.ctx,options:titleOpts,chart});layouts.configure(chart,title,titleOpts);layouts.addBox(chart,title);chart.titleBlock=title;}
var plugin_title={id:'title',_element:Title,start(chart,_args,options){createTitle(chart,options);},stop(chart){const titleBlock=chart.titleBlock;layouts.removeBox(chart,titleBlock);delete chart.titleBlock;},beforeUpdate(chart,_args,options){const title=chart.titleBlock;layouts.configure(chart,title,options);title.options=options;},defaults:{align:'center',display:false,font:{weight:'bold'},fullSize:true,padding:10,position:'top',text:'',weight:2000},defaultRoutes:{color:'color'},descriptors:{_scriptable:true,_indexable:false}};const map=new WeakMap();var plugin_subtitle={id:'subtitle',start(chart,_args,options){const title=new Title({ctx:chart.ctx,options,chart});layouts.configure(chart,title,options);layouts.addBox(chart,title);map.set(chart,title);},stop(chart){layouts.removeBox(chart,map.get(chart));map.delete(chart);},beforeUpdate(chart,_args,options){const title=map.get(chart);layouts.configure(chart,title,options);title.options=options;},defaults:{align:'center',display:false,font:{weight:'normal'},fullSize:true,padding:0,position:'top',text:'',weight:1500},defaultRoutes:{color:'color'},descriptors:{_scriptable:true,_indexable:false}};const positioners={average(items){if(!items.length){return false;}
let i,len;let xSet=new Set();let y=0;let count=0;for(i=0,len=items.length;i<len;++i){const el=items[i].element;if(el&&el.hasValue()){const pos=el.tooltipPosition();xSet.add(pos.x);y+=pos.y;++count;}}
if(count===0||xSet.size===0){return false;}
const xAverage=[...xSet].reduce((a,b)=>a+b)/xSet.size;return{x:xAverage,y:y/count};},nearest(items,eventPosition){if(!items.length){return false;}
let x=eventPosition.x;let y=eventPosition.y;let minDistance=Number.POSITIVE_INFINITY;let i,len,nearestElement;for(i=0,len=items.length;i<len;++i){const el=items[i].element;if(el&&el.hasValue()){const center=el.getCenterPoint();const d=distanceBetweenPoints(eventPosition,center);if(d<minDistance){minDistance=d;nearestElement=el;}}}
if(nearestElement){const tp=nearestElement.tooltipPosition();x=tp.x;y=tp.y;}
return{x,y};}};function pushOrConcat(base,toPush){if(toPush){if(isArray(toPush)){Array.prototype.push.apply(base,toPush);}else{base.push(toPush);}}
return base;}
function splitNewlines(str){if((typeof str==='string'||str instanceof String)&&str.indexOf('\n')>-1){return str.split('\n');}
return str;}
function createTooltipItem(chart,item){const{element,datasetIndex,index}=item;const controller=chart.getDatasetMeta(datasetIndex).controller;const{label,value}=controller.getLabelAndValue(index);return{chart,label,parsed:controller.getParsed(index),raw:chart.data.datasets[datasetIndex].data[index],formattedValue:value,dataset:controller.getDataset(),dataIndex:index,datasetIndex,element};}
function getTooltipSize(tooltip,options){const ctx=tooltip.chart.ctx;const{body,footer,title}=tooltip;const{boxWidth,boxHeight}=options;const bodyFont=toFont(options.bodyFont);const titleFont=toFont(options.titleFont);const footerFont=toFont(options.footerFont);const titleLineCount=title.length;const footerLineCount=footer.length;const bodyLineItemCount=body.length;const padding=toPadding(options.padding);let height=padding.height;let width=0;let combinedBodyLength=body.reduce((count,bodyItem)=>count+bodyItem.before.length+bodyItem.lines.length+bodyItem.after.length,0);combinedBodyLength+=tooltip.beforeBody.length+tooltip.afterBody.length;if(titleLineCount){height+=titleLineCount*titleFont.lineHeight+(titleLineCount-1)*options.titleSpacing+options.titleMarginBottom;}
if(combinedBodyLength){const bodyLineHeight=options.displayColors?Math.max(boxHeight,bodyFont.lineHeight):bodyFont.lineHeight;height+=bodyLineItemCount*bodyLineHeight+(combinedBodyLength-bodyLineItemCount)*bodyFont.lineHeight+(combinedBodyLength-1)*options.bodySpacing;}
if(footerLineCount){height+=options.footerMarginTop+footerLineCount*footerFont.lineHeight+(footerLineCount-1)*options.footerSpacing;}
let widthPadding=0;const maxLineWidth=function(line){width=Math.max(width,ctx.measureText(line).width+widthPadding);};ctx.save();ctx.font=titleFont.string;each(tooltip.title,maxLineWidth);ctx.font=bodyFont.string;each(tooltip.beforeBody.concat(tooltip.afterBody),maxLineWidth);widthPadding=options.displayColors?boxWidth+2+options.boxPadding:0;each(body,(bodyItem)=>{each(bodyItem.before,maxLineWidth);each(bodyItem.lines,maxLineWidth);each(bodyItem.after,maxLineWidth);});widthPadding=0;ctx.font=footerFont.string;each(tooltip.footer,maxLineWidth);ctx.restore();width+=padding.width;return{width,height};}
function determineYAlign(chart,size){const{y,height}=size;if(y<height/2){return'top';}else if(y>chart.height-height/2){return'bottom';}
return'center';}
function doesNotFitWithAlign(xAlign,chart,options,size){const{x,width}=size;const caret=options.caretSize+options.caretPadding;if(xAlign==='left'&&x+width+caret>chart.width){return true;}
if(xAlign==='right'&&x-width-caret<0){return true;}}
function determineXAlign(chart,options,size,yAlign){const{x,width}=size;const{width:chartWidth,chartArea:{left,right}}=chart;let xAlign='center';if(yAlign==='center'){xAlign=x<=(left+right)/2?'left':'right';}else if(x<=width/2){xAlign='left';}else if(x>=chartWidth-width/2){xAlign='right';}
if(doesNotFitWithAlign(xAlign,chart,options,size)){xAlign='center';}
return xAlign;}
function determineAlignment(chart,options,size){const yAlign=size.yAlign||options.yAlign||determineYAlign(chart,size);return{xAlign:size.xAlign||options.xAlign||determineXAlign(chart,options,size,yAlign),yAlign};}
function alignX(size,xAlign){let{x,width}=size;if(xAlign==='right'){x-=width;}else if(xAlign==='center'){x-=width/2;}
return x;}
function alignY(size,yAlign,paddingAndSize){let{y,height}=size;if(yAlign==='top'){y+=paddingAndSize;}else if(yAlign==='bottom'){y-=height+paddingAndSize;}else{y-=height/2;}
return y;}
function getBackgroundPoint(options,size,alignment,chart){const{caretSize,caretPadding,cornerRadius}=options;const{xAlign,yAlign}=alignment;const paddingAndSize=caretSize+caretPadding;const{topLeft,topRight,bottomLeft,bottomRight}=toTRBLCorners(cornerRadius);let x=alignX(size,xAlign);const y=alignY(size,yAlign,paddingAndSize);if(yAlign==='center'){if(xAlign==='left'){x+=paddingAndSize;}else if(xAlign==='right'){x-=paddingAndSize;}}else if(xAlign==='left'){x-=Math.max(topLeft,bottomLeft)+caretSize;}else if(xAlign==='right'){x+=Math.max(topRight,bottomRight)+caretSize;}
return{x:_limitValue(x,0,chart.width-size.width),y:_limitValue(y,0,chart.height-size.height)};}
function getAlignedX(tooltip,align,options){const padding=toPadding(options.padding);return align==='center'?tooltip.x+tooltip.width/2:align==='right'?tooltip.x+tooltip.width-padding.right:tooltip.x+padding.left;}
function getBeforeAfterBodyLines(callback){return pushOrConcat([],splitNewlines(callback));}
function createTooltipContext(parent,tooltip,tooltipItems){return createContext(parent,{tooltip,tooltipItems,type:'tooltip'});}
function overrideCallbacks(callbacks,context){const override=context&&context.dataset&&context.dataset.tooltip&&context.dataset.tooltip.callbacks;return override?callbacks.override(override):callbacks;}
const defaultCallbacks={beforeTitle:noop,title(tooltipItems){if(tooltipItems.length>0){const item=tooltipItems[0];const labels=item.chart.data.labels;const labelCount=labels?labels.length:0;if(this&&this.options&&this.options.mode==='dataset'){return item.dataset.label||'';}else if(item.label){return item.label;}else if(labelCount>0&&item.dataIndex<labelCount){return labels[item.dataIndex];}}
return'';},afterTitle:noop,beforeBody:noop,beforeLabel:noop,label(tooltipItem){if(this&&this.options&&this.options.mode==='dataset'){return tooltipItem.label+': '+tooltipItem.formattedValue||tooltipItem.formattedValue;}
let label=tooltipItem.dataset.label||'';if(label){label+=': ';}
const value=tooltipItem.formattedValue;if(!isNullOrUndef(value)){label+=value;}
return label;},labelColor(tooltipItem){const meta=tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);const options=meta.controller.getStyle(tooltipItem.dataIndex);return{borderColor:options.borderColor,backgroundColor:options.backgroundColor,borderWidth:options.borderWidth,borderDash:options.borderDash,borderDashOffset:options.borderDashOffset,borderRadius:0};},labelTextColor(){return this.options.bodyColor;},labelPointStyle(tooltipItem){const meta=tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);const options=meta.controller.getStyle(tooltipItem.dataIndex);return{pointStyle:options.pointStyle,rotation:options.rotation};},afterLabel:noop,afterBody:noop,beforeFooter:noop,footer:noop,afterFooter:noop};function invokeCallbackWithFallback(callbacks,name,ctx,arg){const result=callbacks[name].call(ctx,arg);if(typeof result==='undefined'){return defaultCallbacks[name].call(ctx,arg);}
return result;}
class Tooltip extends Element{static positioners=positioners;constructor(config){super();this.opacity=0;this._active=[];this._eventPosition=undefined;this._size=undefined;this._cachedAnimations=undefined;this._tooltipItems=[];this.$animations=undefined;this.$context=undefined;this.chart=config.chart;this.options=config.options;this.dataPoints=undefined;this.title=undefined;this.beforeBody=undefined;this.body=undefined;this.afterBody=undefined;this.footer=undefined;this.xAlign=undefined;this.yAlign=undefined;this.x=undefined;this.y=undefined;this.height=undefined;this.width=undefined;this.caretX=undefined;this.caretY=undefined;this.labelColors=undefined;this.labelPointStyles=undefined;this.labelTextColors=undefined;}
initialize(options){this.options=options;this._cachedAnimations=undefined;this.$context=undefined;}
_resolveAnimations(){const cached=this._cachedAnimations;if(cached){return cached;}
const chart=this.chart;const options=this.options.setContext(this.getContext());const opts=options.enabled&&chart.options.animation&&options.animations;const animations=new Animations(this.chart,opts);if(opts._cacheable){this._cachedAnimations=Object.freeze(animations);}
return animations;}
getContext(){return this.$context||(this.$context=createTooltipContext(this.chart.getContext(),this,this._tooltipItems));}
getTitle(context,options){const{callbacks}=options;const beforeTitle=invokeCallbackWithFallback(callbacks,'beforeTitle',this,context);const title=invokeCallbackWithFallback(callbacks,'title',this,context);const afterTitle=invokeCallbackWithFallback(callbacks,'afterTitle',this,context);let lines=[];lines=pushOrConcat(lines,splitNewlines(beforeTitle));lines=pushOrConcat(lines,splitNewlines(title));lines=pushOrConcat(lines,splitNewlines(afterTitle));return lines;}
getBeforeBody(tooltipItems,options){return getBeforeAfterBodyLines(invokeCallbackWithFallback(options.callbacks,'beforeBody',this,tooltipItems));}
getBody(tooltipItems,options){const{callbacks}=options;const bodyItems=[];each(tooltipItems,(context)=>{const bodyItem={before:[],lines:[],after:[]};const scoped=overrideCallbacks(callbacks,context);pushOrConcat(bodyItem.before,splitNewlines(invokeCallbackWithFallback(scoped,'beforeLabel',this,context)));pushOrConcat(bodyItem.lines,invokeCallbackWithFallback(scoped,'label',this,context));pushOrConcat(bodyItem.after,splitNewlines(invokeCallbackWithFallback(scoped,'afterLabel',this,context)));bodyItems.push(bodyItem);});return bodyItems;}
getAfterBody(tooltipItems,options){return getBeforeAfterBodyLines(invokeCallbackWithFallback(options.callbacks,'afterBody',this,tooltipItems));}
getFooter(tooltipItems,options){const{callbacks}=options;const beforeFooter=invokeCallbackWithFallback(callbacks,'beforeFooter',this,tooltipItems);const footer=invokeCallbackWithFallback(callbacks,'footer',this,tooltipItems);const afterFooter=invokeCallbackWithFallback(callbacks,'afterFooter',this,tooltipItems);let lines=[];lines=pushOrConcat(lines,splitNewlines(beforeFooter));lines=pushOrConcat(lines,splitNewlines(footer));lines=pushOrConcat(lines,splitNewlines(afterFooter));return lines;}
_createItems(options){const active=this._active;const data=this.chart.data;const labelColors=[];const labelPointStyles=[];const labelTextColors=[];let tooltipItems=[];let i,len;for(i=0,len=active.length;i<len;++i){tooltipItems.push(createTooltipItem(this.chart,active[i]));}
if(options.filter){tooltipItems=tooltipItems.filter((element,index,array)=>options.filter(element,index,array,data));}
if(options.itemSort){tooltipItems=tooltipItems.sort((a,b)=>options.itemSort(a,b,data));}
each(tooltipItems,(context)=>{const scoped=overrideCallbacks(options.callbacks,context);labelColors.push(invokeCallbackWithFallback(scoped,'labelColor',this,context));labelPointStyles.push(invokeCallbackWithFallback(scoped,'labelPointStyle',this,context));labelTextColors.push(invokeCallbackWithFallback(scoped,'labelTextColor',this,context));});this.labelColors=labelColors;this.labelPointStyles=labelPointStyles;this.labelTextColors=labelTextColors;this.dataPoints=tooltipItems;return tooltipItems;}
update(changed,replay){const options=this.options.setContext(this.getContext());const active=this._active;let properties;let tooltipItems=[];if(!active.length){if(this.opacity!==0){properties={opacity:0};}}else{const position=positioners[options.position].call(this,active,this._eventPosition);tooltipItems=this._createItems(options);this.title=this.getTitle(tooltipItems,options);this.beforeBody=this.getBeforeBody(tooltipItems,options);this.body=this.getBody(tooltipItems,options);this.afterBody=this.getAfterBody(tooltipItems,options);this.footer=this.getFooter(tooltipItems,options);const size=this._size=getTooltipSize(this,options);const positionAndSize=Object.assign({},position,size);const alignment=determineAlignment(this.chart,options,positionAndSize);const backgroundPoint=getBackgroundPoint(options,positionAndSize,alignment,this.chart);this.xAlign=alignment.xAlign;this.yAlign=alignment.yAlign;properties={opacity:1,x:backgroundPoint.x,y:backgroundPoint.y,width:size.width,height:size.height,caretX:position.x,caretY:position.y};}
this._tooltipItems=tooltipItems;this.$context=undefined;if(properties){this._resolveAnimations().update(this,properties);}
if(changed&&options.external){options.external.call(this,{chart:this.chart,tooltip:this,replay});}}
drawCaret(tooltipPoint,ctx,size,options){const caretPosition=this.getCaretPosition(tooltipPoint,size,options);ctx.lineTo(caretPosition.x1,caretPosition.y1);ctx.lineTo(caretPosition.x2,caretPosition.y2);ctx.lineTo(caretPosition.x3,caretPosition.y3);}
getCaretPosition(tooltipPoint,size,options){const{xAlign,yAlign}=this;const{caretSize,cornerRadius}=options;const{topLeft,topRight,bottomLeft,bottomRight}=toTRBLCorners(cornerRadius);const{x:ptX,y:ptY}=tooltipPoint;const{width,height}=size;let x1,x2,x3,y1,y2,y3;if(yAlign==='center'){y2=ptY+height/2;if(xAlign==='left'){x1=ptX;x2=x1-caretSize;y1=y2+caretSize;y3=y2-caretSize;}else{x1=ptX+width;x2=x1+caretSize;y1=y2-caretSize;y3=y2+caretSize;}
x3=x1;}else{if(xAlign==='left'){x2=ptX+Math.max(topLeft,bottomLeft)+caretSize;}else if(xAlign==='right'){x2=ptX+width-Math.max(topRight,bottomRight)-caretSize;}else{x2=this.caretX;}
if(yAlign==='top'){y1=ptY;y2=y1-caretSize;x1=x2-caretSize;x3=x2+caretSize;}else{y1=ptY+height;y2=y1+caretSize;x1=x2+caretSize;x3=x2-caretSize;}
y3=y1;}
return{x1,x2,x3,y1,y2,y3};}
drawTitle(pt,ctx,options){const title=this.title;const length=title.length;let titleFont,titleSpacing,i;if(length){const rtlHelper=getRtlAdapter(options.rtl,this.x,this.width);pt.x=getAlignedX(this,options.titleAlign,options);ctx.textAlign=rtlHelper.textAlign(options.titleAlign);ctx.textBaseline='middle';titleFont=toFont(options.titleFont);titleSpacing=options.titleSpacing;ctx.fillStyle=options.titleColor;ctx.font=titleFont.string;for(i=0;i<length;++i){ctx.fillText(title[i],rtlHelper.x(pt.x),pt.y+titleFont.lineHeight/2);pt.y+=titleFont.lineHeight+titleSpacing;if(i+1===length){pt.y+=options.titleMarginBottom-titleSpacing;}}}}
_drawColorBox(ctx,pt,i,rtlHelper,options){const labelColor=this.labelColors[i];const labelPointStyle=this.labelPointStyles[i];const{boxHeight,boxWidth}=options;const bodyFont=toFont(options.bodyFont);const colorX=getAlignedX(this,'left',options);const rtlColorX=rtlHelper.x(colorX);const yOffSet=boxHeight<bodyFont.lineHeight?(bodyFont.lineHeight-boxHeight)/2:0;const colorY=pt.y+yOffSet;if(options.usePointStyle){const drawOptions={radius:Math.min(boxWidth,boxHeight)/2,pointStyle:labelPointStyle.pointStyle,rotation:labelPointStyle.rotation,borderWidth:1};const centerX=rtlHelper.leftForLtr(rtlColorX,boxWidth)+boxWidth/2;const centerY=colorY+boxHeight/2;ctx.strokeStyle=options.multiKeyBackground;ctx.fillStyle=options.multiKeyBackground;drawPoint(ctx,drawOptions,centerX,centerY);ctx.strokeStyle=labelColor.borderColor;ctx.fillStyle=labelColor.backgroundColor;drawPoint(ctx,drawOptions,centerX,centerY);}else{ctx.lineWidth=isObject(labelColor.borderWidth)?Math.max(...Object.values(labelColor.borderWidth)):labelColor.borderWidth||1;ctx.strokeStyle=labelColor.borderColor;ctx.setLineDash(labelColor.borderDash||[]);ctx.lineDashOffset=labelColor.borderDashOffset||0;const outerX=rtlHelper.leftForLtr(rtlColorX,boxWidth);const innerX=rtlHelper.leftForLtr(rtlHelper.xPlus(rtlColorX,1),boxWidth-2);const borderRadius=toTRBLCorners(labelColor.borderRadius);if(Object.values(borderRadius).some((v)=>v!==0)){ctx.beginPath();ctx.fillStyle=options.multiKeyBackground;addRoundedRectPath(ctx,{x:outerX,y:colorY,w:boxWidth,h:boxHeight,radius:borderRadius});ctx.fill();ctx.stroke();ctx.fillStyle=labelColor.backgroundColor;ctx.beginPath();addRoundedRectPath(ctx,{x:innerX,y:colorY+1,w:boxWidth-2,h:boxHeight-2,radius:borderRadius});ctx.fill();}else{ctx.fillStyle=options.multiKeyBackground;ctx.fillRect(outerX,colorY,boxWidth,boxHeight);ctx.strokeRect(outerX,colorY,boxWidth,boxHeight);ctx.fillStyle=labelColor.backgroundColor;ctx.fillRect(innerX,colorY+1,boxWidth-2,boxHeight-2);}}
ctx.fillStyle=this.labelTextColors[i];}
drawBody(pt,ctx,options){const{body}=this;const{bodySpacing,bodyAlign,displayColors,boxHeight,boxWidth,boxPadding}=options;const bodyFont=toFont(options.bodyFont);let bodyLineHeight=bodyFont.lineHeight;let xLinePadding=0;const rtlHelper=getRtlAdapter(options.rtl,this.x,this.width);const fillLineOfText=function(line){ctx.fillText(line,rtlHelper.x(pt.x+xLinePadding),pt.y+bodyLineHeight/2);pt.y+=bodyLineHeight+bodySpacing;};const bodyAlignForCalculation=rtlHelper.textAlign(bodyAlign);let bodyItem,textColor,lines,i,j,ilen,jlen;ctx.textAlign=bodyAlign;ctx.textBaseline='middle';ctx.font=bodyFont.string;pt.x=getAlignedX(this,bodyAlignForCalculation,options);ctx.fillStyle=options.bodyColor;each(this.beforeBody,fillLineOfText);xLinePadding=displayColors&&bodyAlignForCalculation!=='right'?bodyAlign==='center'?boxWidth/2+boxPadding:boxWidth+2+boxPadding:0;for(i=0,ilen=body.length;i<ilen;++i){bodyItem=body[i];textColor=this.labelTextColors[i];ctx.fillStyle=textColor;each(bodyItem.before,fillLineOfText);lines=bodyItem.lines;if(displayColors&&lines.length){this._drawColorBox(ctx,pt,i,rtlHelper,options);bodyLineHeight=Math.max(bodyFont.lineHeight,boxHeight);}
for(j=0,jlen=lines.length;j<jlen;++j){fillLineOfText(lines[j]);bodyLineHeight=bodyFont.lineHeight;}
each(bodyItem.after,fillLineOfText);}
xLinePadding=0;bodyLineHeight=bodyFont.lineHeight;each(this.afterBody,fillLineOfText);pt.y-=bodySpacing;}
drawFooter(pt,ctx,options){const footer=this.footer;const length=footer.length;let footerFont,i;if(length){const rtlHelper=getRtlAdapter(options.rtl,this.x,this.width);pt.x=getAlignedX(this,options.footerAlign,options);pt.y+=options.footerMarginTop;ctx.textAlign=rtlHelper.textAlign(options.footerAlign);ctx.textBaseline='middle';footerFont=toFont(options.footerFont);ctx.fillStyle=options.footerColor;ctx.font=footerFont.string;for(i=0;i<length;++i){ctx.fillText(footer[i],rtlHelper.x(pt.x),pt.y+footerFont.lineHeight/2);pt.y+=footerFont.lineHeight+options.footerSpacing;}}}
drawBackground(pt,ctx,tooltipSize,options){const{xAlign,yAlign}=this;const{x,y}=pt;const{width,height}=tooltipSize;const{topLeft,topRight,bottomLeft,bottomRight}=toTRBLCorners(options.cornerRadius);ctx.fillStyle=options.backgroundColor;ctx.strokeStyle=options.borderColor;ctx.lineWidth=options.borderWidth;ctx.beginPath();ctx.moveTo(x+topLeft,y);if(yAlign==='top'){this.drawCaret(pt,ctx,tooltipSize,options);}
ctx.lineTo(x+width-topRight,y);ctx.quadraticCurveTo(x+width,y,x+width,y+topRight);if(yAlign==='center'&&xAlign==='right'){this.drawCaret(pt,ctx,tooltipSize,options);}
ctx.lineTo(x+width,y+height-bottomRight);ctx.quadraticCurveTo(x+width,y+height,x+width-bottomRight,y+height);if(yAlign==='bottom'){this.drawCaret(pt,ctx,tooltipSize,options);}
ctx.lineTo(x+bottomLeft,y+height);ctx.quadraticCurveTo(x,y+height,x,y+height-bottomLeft);if(yAlign==='center'&&xAlign==='left'){this.drawCaret(pt,ctx,tooltipSize,options);}
ctx.lineTo(x,y+topLeft);ctx.quadraticCurveTo(x,y,x+topLeft,y);ctx.closePath();ctx.fill();if(options.borderWidth>0){ctx.stroke();}}
_updateAnimationTarget(options){const chart=this.chart;const anims=this.$animations;const animX=anims&&anims.x;const animY=anims&&anims.y;if(animX||animY){const position=positioners[options.position].call(this,this._active,this._eventPosition);if(!position){return;}
const size=this._size=getTooltipSize(this,options);const positionAndSize=Object.assign({},position,this._size);const alignment=determineAlignment(chart,options,positionAndSize);const point=getBackgroundPoint(options,positionAndSize,alignment,chart);if(animX._to!==point.x||animY._to!==point.y){this.xAlign=alignment.xAlign;this.yAlign=alignment.yAlign;this.width=size.width;this.height=size.height;this.caretX=position.x;this.caretY=position.y;this._resolveAnimations().update(this,point);}}}
_willRender(){return!!this.opacity;}
draw(ctx){const options=this.options.setContext(this.getContext());let opacity=this.opacity;if(!opacity){return;}
this._updateAnimationTarget(options);const tooltipSize={width:this.width,height:this.height};const pt={x:this.x,y:this.y};opacity=Math.abs(opacity)<1e-3?0:opacity;const padding=toPadding(options.padding);const hasTooltipContent=this.title.length||this.beforeBody.length||this.body.length||this.afterBody.length||this.footer.length;if(options.enabled&&hasTooltipContent){ctx.save();ctx.globalAlpha=opacity;this.drawBackground(pt,ctx,tooltipSize,options);overrideTextDirection(ctx,options.textDirection);pt.y+=padding.top;this.drawTitle(pt,ctx,options);this.drawBody(pt,ctx,options);this.drawFooter(pt,ctx,options);restoreTextDirection(ctx,options.textDirection);ctx.restore();}}
getActiveElements(){return this._active||[];}
setActiveElements(activeElements,eventPosition){const lastActive=this._active;const active=activeElements.map(({datasetIndex,index})=>{const meta=this.chart.getDatasetMeta(datasetIndex);if(!meta){throw new Error('Cannot find a dataset at index '+datasetIndex);}
return{datasetIndex,element:meta.data[index],index};});const changed=!_elementsEqual(lastActive,active);const positionChanged=this._positionChanged(active,eventPosition);if(changed||positionChanged){this._active=active;this._eventPosition=eventPosition;this._ignoreReplayEvents=true;this.update(true);}}
handleEvent(e,replay,inChartArea=true){if(replay&&this._ignoreReplayEvents){return false;}
this._ignoreReplayEvents=false;const options=this.options;const lastActive=this._active||[];const active=this._getActiveElements(e,lastActive,replay,inChartArea);const positionChanged=this._positionChanged(active,e);const changed=replay||!_elementsEqual(active,lastActive)||positionChanged;if(changed){this._active=active;if(options.enabled||options.external){this._eventPosition={x:e.x,y:e.y};this.update(true,replay);}}
return changed;}
_getActiveElements(e,lastActive,replay,inChartArea){const options=this.options;if(e.type==='mouseout'){return[];}
if(!inChartArea){return lastActive.filter((i)=>this.chart.data.datasets[i.datasetIndex]&&this.chart.getDatasetMeta(i.datasetIndex).controller.getParsed(i.index)!==undefined);}
const active=this.chart.getElementsAtEventForMode(e,options.mode,options,replay);if(options.reverse){active.reverse();}
return active;}
_positionChanged(active,e){const{caretX,caretY,options}=this;const position=positioners[options.position].call(this,active,e);return position!==false&&(caretX!==position.x||caretY!==position.y);}}
var plugin_tooltip={id:'tooltip',_element:Tooltip,positioners,afterInit(chart,_args,options){if(options){chart.tooltip=new Tooltip({chart,options});}},beforeUpdate(chart,_args,options){if(chart.tooltip){chart.tooltip.initialize(options);}},reset(chart,_args,options){if(chart.tooltip){chart.tooltip.initialize(options);}},afterDraw(chart){const tooltip=chart.tooltip;if(tooltip&&tooltip._willRender()){const args={tooltip};if(chart.notifyPlugins('beforeTooltipDraw',{...args,cancelable:true})===false){return;}
tooltip.draw(chart.ctx);chart.notifyPlugins('afterTooltipDraw',args);}},afterEvent(chart,args){if(chart.tooltip){const useFinalPosition=args.replay;if(chart.tooltip.handleEvent(args.event,useFinalPosition,args.inChartArea)){args.changed=true;}}},defaults:{enabled:true,external:null,position:'average',backgroundColor:'rgba(0,0,0,0.8)',titleColor:'#fff',titleFont:{weight:'bold'},titleSpacing:2,titleMarginBottom:6,titleAlign:'left',bodyColor:'#fff',bodySpacing:2,bodyFont:{},bodyAlign:'left',footerColor:'#fff',footerSpacing:2,footerMarginTop:6,footerFont:{weight:'bold'},footerAlign:'left',padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:(ctx,opts)=>opts.bodyFont.size,boxWidth:(ctx,opts)=>opts.bodyFont.size,multiKeyBackground:'#fff',displayColors:true,boxPadding:0,borderColor:'rgba(0,0,0,0)',borderWidth:0,animation:{duration:400,easing:'easeOutQuart'},animations:{numbers:{type:'number',properties:['x','y','width','height','caretX','caretY']},opacity:{easing:'linear',duration:200}},callbacks:defaultCallbacks},defaultRoutes:{bodyFont:'font',footerFont:'font',titleFont:'font'},descriptors:{_scriptable:(name)=>name!=='filter'&&name!=='itemSort'&&name!=='external',_indexable:false,callbacks:{_scriptable:false,_indexable:false},animation:{_fallback:false},animations:{_fallback:'animation'}},additionalOptionScopes:['interaction']};Chart.register(controllers,scales,elements,plugins);Chart.helpers={...helpers};Chart._adapters=_adapters;Chart.Animation=Animation;Chart.Animations=Animations;Chart.animator=animator;Chart.controllers=registry.controllers.items;Chart.DatasetController=DatasetController;Chart.Element=Element;Chart.elements=elements;Chart.Interaction=Interaction;Chart.layouts=layouts;Chart.platforms=platforms;Chart.Scale=Scale;Chart.Ticks=Ticks;Object.assign(Chart,controllers,scales,elements,plugins,platforms);Chart.Chart=Chart;if(typeof window!=='undefined'){window.Chart=Chart;}
return Chart;}));;

/* /web/static/lib/chartjs-adapter-luxon/chartjs-adapter-luxon.js */
(function(global,factory){typeof exports==="object"&&typeof module!=="undefined"?factory(require("chart.js"),require("luxon")):typeof define==="function"&&define.amd?define(["chart.js","luxon"],factory):((global=typeof globalThis!=="undefined"?globalThis:global||self),factory(global.Chart,global.luxon));})(this,function(chart_js,luxon){"use strict";const FORMATS={datetime:luxon.DateTime.DATETIME_MED_WITH_SECONDS,millisecond:"h:mm:ss.SSS a",second:luxon.DateTime.TIME_WITH_SECONDS,minute:luxon.DateTime.TIME_SIMPLE,hour:{hour:"numeric"},day:{day:"numeric",month:"short"},week:"DD",month:{month:"short",year:"numeric"},quarter:"'Q'q - yyyy",year:{year:"numeric"},};chart_js._adapters._date.override({_id:"luxon",_create:function(time){return luxon.DateTime.fromMillis(time,this.options);},init(chartOptions){if(!this.options.locale){this.options.locale=chartOptions.locale;}},formats:function(){return FORMATS;},parse:function(value,format){const options=this.options;const type=typeof value;if(value===null||type==="undefined"){return null;}
if(type==="number"){value=this._create(value);}else if(type==="string"){if(typeof format==="string"){value=luxon.DateTime.fromFormat(value,format,options);}else{value=luxon.DateTime.fromISO(value,options);}}else if(value instanceof Date){value=luxon.DateTime.fromJSDate(value,options);}else if(type==="object"&&!(value instanceof luxon.DateTime)){value=luxon.DateTime.fromObject(value,options);}
return value.isValid?value.valueOf():null;},format:function(time,format){const datetime=this._create(time);return typeof format==="string"?datetime.toFormat(format):datetime.toLocaleString(format);},add:function(time,amount,unit){const args={};args[unit]=amount;return this._create(time).plus(args).valueOf();},diff:function(max,min,unit){return this._create(max).diff(this._create(min)).as(unit).valueOf();},startOf:function(time,unit,weekday){if(unit==="isoWeek"){weekday=Math.trunc(Math.min(Math.max(0,weekday),6));const dateTime=this._create(time);return dateTime.minus({days:(dateTime.weekday-weekday+7)%7}).startOf("day").valueOf();}
return unit?this._create(time).startOf(unit).valueOf():time;},endOf:function(time,unit){return this._create(time).endOf(unit).valueOf();},});});;

/* /spreadsheet/static/lib/chartjs-chart-geo/chartjs-chart-geo.js */
(function(global,factory){typeof exports==='object'&&typeof module!=='undefined'?factory(exports,require('chart.js'),require('chart.js/helpers')):typeof define==='function'&&define.amd?define(['exports','chart.js','chart.js/helpers'],factory):(global=typeof globalThis!=='undefined'?globalThis:global||self,factory(global.ChartGeo={},global.Chart,global.Chart.helpers));})(this,(function(exports,chart_js,helpers){'use strict';class Adder{constructor(){this._partials=new Float64Array(32);this._n=0;}
add(x){const p=this._partials;let i=0;for(let j=0;j<this._n&&j<32;j++){const y=p[j],hi=x+y,lo=Math.abs(x)<Math.abs(y)?x-(hi-y):y-(hi-x);if(lo)p[i++]=lo;x=hi;}
p[i]=x;this._n=i+1;return this;}
valueOf(){const p=this._partials;let n=this._n,x,y,lo,hi=0;if(n>0){hi=p[--n];while(n>0){x=hi;y=p[--n];hi=x+y;lo=y-(hi-x);if(lo)break;}
if(n>0&&((lo<0&&p[n-1]<0)||(lo>0&&p[n-1]>0))){y=lo*2;x=hi+y;if(y==x-hi)hi=x;}}
return hi;}}
function*flatten(arrays){for(const array of arrays){yield*array;}}
function merge$1(arrays){return Array.from(flatten(arrays));}
function range(start,stop,step){start=+start,stop=+stop,step=(n=arguments.length)<2?(stop=start,start=0,1):n<3?1:+step;var i=-1,n=Math.max(0,Math.ceil((stop-start)/step))|0,range=new Array(n);while(++i<n){range[i]=start+i*step;}
return range;}
var epsilon=1e-6;var epsilon2=1e-12;var pi=Math.PI;var halfPi=pi/2;var quarterPi=pi/4;var tau=pi*2;var degrees$1=180/pi;var radians$1=pi/180;var abs=Math.abs;var atan=Math.atan;var atan2=Math.atan2;var cos=Math.cos;var ceil=Math.ceil;var exp=Math.exp;var log=Math.log;var pow=Math.pow;var sin=Math.sin;var sign=Math.sign||function(x){return x>0?1:x<0?-1:0;};var sqrt=Math.sqrt;var tan=Math.tan;function acos(x){return x>1?0:x<-1?pi:Math.acos(x);}
function asin(x){return x>1?halfPi:x<-1?-halfPi:Math.asin(x);}
function noop(){}
function streamGeometry(geometry,stream){if(geometry&&streamGeometryType.hasOwnProperty(geometry.type)){streamGeometryType[geometry.type](geometry,stream);}}
var streamObjectType={Feature:function(object,stream){streamGeometry(object.geometry,stream);},FeatureCollection:function(object,stream){var features=object.features,i=-1,n=features.length;while(++i<n)streamGeometry(features[i].geometry,stream);}};var streamGeometryType={Sphere:function(object,stream){stream.sphere();},Point:function(object,stream){object=object.coordinates;stream.point(object[0],object[1],object[2]);},MultiPoint:function(object,stream){var coordinates=object.coordinates,i=-1,n=coordinates.length;while(++i<n)object=coordinates[i],stream.point(object[0],object[1],object[2]);},LineString:function(object,stream){streamLine(object.coordinates,stream,0);},MultiLineString:function(object,stream){var coordinates=object.coordinates,i=-1,n=coordinates.length;while(++i<n)streamLine(coordinates[i],stream,0);},Polygon:function(object,stream){streamPolygon(object.coordinates,stream);},MultiPolygon:function(object,stream){var coordinates=object.coordinates,i=-1,n=coordinates.length;while(++i<n)streamPolygon(coordinates[i],stream);},GeometryCollection:function(object,stream){var geometries=object.geometries,i=-1,n=geometries.length;while(++i<n)streamGeometry(geometries[i],stream);}};function streamLine(coordinates,stream,closed){var i=-1,n=coordinates.length-closed,coordinate;stream.lineStart();while(++i<n)coordinate=coordinates[i],stream.point(coordinate[0],coordinate[1],coordinate[2]);stream.lineEnd();}
function streamPolygon(coordinates,stream){var i=-1,n=coordinates.length;stream.polygonStart();while(++i<n)streamLine(coordinates[i],stream,1);stream.polygonEnd();}
function geoStream(object,stream){if(object&&streamObjectType.hasOwnProperty(object.type)){streamObjectType[object.type](object,stream);}else{streamGeometry(object,stream);}}
function spherical(cartesian){return[atan2(cartesian[1],cartesian[0]),asin(cartesian[2])];}
function cartesian(spherical){var lambda=spherical[0],phi=spherical[1],cosPhi=cos(phi);return[cosPhi*cos(lambda),cosPhi*sin(lambda),sin(phi)];}
function cartesianDot(a,b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2];}
function cartesianCross(a,b){return[a[1]*b[2]-a[2]*b[1],a[2]*b[0]-a[0]*b[2],a[0]*b[1]-a[1]*b[0]];}
function cartesianAddInPlace(a,b){a[0]+=b[0],a[1]+=b[1],a[2]+=b[2];}
function cartesianScale(vector,k){return[vector[0]*k,vector[1]*k,vector[2]*k];}
function cartesianNormalizeInPlace(d){var l=sqrt(d[0]*d[0]+d[1]*d[1]+d[2]*d[2]);d[0]/=l,d[1]/=l,d[2]/=l;}
function compose(a,b){function compose(x,y){return x=a(x,y),b(x[0],x[1]);}
if(a.invert&&b.invert)compose.invert=function(x,y){return x=b.invert(x,y),x&&a.invert(x[0],x[1]);};return compose;}
function rotationIdentity(lambda,phi){if(abs(lambda)>pi)lambda-=Math.round(lambda/tau)*tau;return[lambda,phi];}
rotationIdentity.invert=rotationIdentity;function rotateRadians(deltaLambda,deltaPhi,deltaGamma){return(deltaLambda%=tau)?(deltaPhi||deltaGamma?compose(rotationLambda(deltaLambda),rotationPhiGamma(deltaPhi,deltaGamma)):rotationLambda(deltaLambda)):(deltaPhi||deltaGamma?rotationPhiGamma(deltaPhi,deltaGamma):rotationIdentity);}
function forwardRotationLambda(deltaLambda){return function(lambda,phi){lambda+=deltaLambda;if(abs(lambda)>pi)lambda-=Math.round(lambda/tau)*tau;return[lambda,phi];};}
function rotationLambda(deltaLambda){var rotation=forwardRotationLambda(deltaLambda);rotation.invert=forwardRotationLambda(-deltaLambda);return rotation;}
function rotationPhiGamma(deltaPhi,deltaGamma){var cosDeltaPhi=cos(deltaPhi),sinDeltaPhi=sin(deltaPhi),cosDeltaGamma=cos(deltaGamma),sinDeltaGamma=sin(deltaGamma);function rotation(lambda,phi){var cosPhi=cos(phi),x=cos(lambda)*cosPhi,y=sin(lambda)*cosPhi,z=sin(phi),k=z*cosDeltaPhi+x*sinDeltaPhi;return[atan2(y*cosDeltaGamma-k*sinDeltaGamma,x*cosDeltaPhi-z*sinDeltaPhi),asin(k*cosDeltaGamma+y*sinDeltaGamma)];}
rotation.invert=function(lambda,phi){var cosPhi=cos(phi),x=cos(lambda)*cosPhi,y=sin(lambda)*cosPhi,z=sin(phi),k=z*cosDeltaGamma-y*sinDeltaGamma;return[atan2(y*cosDeltaGamma+z*sinDeltaGamma,x*cosDeltaPhi+k*sinDeltaPhi),asin(k*cosDeltaPhi-x*sinDeltaPhi)];};return rotation;}
function rotation(rotate){rotate=rotateRadians(rotate[0]*radians$1,rotate[1]*radians$1,rotate.length>2?rotate[2]*radians$1:0);function forward(coordinates){coordinates=rotate(coordinates[0]*radians$1,coordinates[1]*radians$1);return coordinates[0]*=degrees$1,coordinates[1]*=degrees$1,coordinates;}
forward.invert=function(coordinates){coordinates=rotate.invert(coordinates[0]*radians$1,coordinates[1]*radians$1);return coordinates[0]*=degrees$1,coordinates[1]*=degrees$1,coordinates;};return forward;}
function circleStream(stream,radius,delta,direction,t0,t1){if(!delta)return;var cosRadius=cos(radius),sinRadius=sin(radius),step=direction*delta;if(t0==null){t0=radius+direction*tau;t1=radius-step/2;}else{t0=circleRadius(cosRadius,t0);t1=circleRadius(cosRadius,t1);if(direction>0?t0<t1:t0>t1)t0+=direction*tau;}
for(var point,t=t0;direction>0?t>t1:t<t1;t-=step){point=spherical([cosRadius,-sinRadius*cos(t),-sinRadius*sin(t)]);stream.point(point[0],point[1]);}}
function circleRadius(cosRadius,point){point=cartesian(point),point[0]-=cosRadius;cartesianNormalizeInPlace(point);var radius=acos(-point[1]);return((-point[2]<0?-radius:radius)+tau-epsilon)%tau;}
function clipBuffer(){var lines=[],line;return{point:function(x,y,m){line.push([x,y,m]);},lineStart:function(){lines.push(line=[]);},lineEnd:noop,rejoin:function(){if(lines.length>1)lines.push(lines.pop().concat(lines.shift()));},result:function(){var result=lines;lines=[];line=null;return result;}};}
function pointEqual(a,b){return abs(a[0]-b[0])<epsilon&&abs(a[1]-b[1])<epsilon;}
function Intersection(point,points,other,entry){this.x=point;this.z=points;this.o=other;this.e=entry;this.v=false;this.n=this.p=null;}
function clipRejoin(segments,compareIntersection,startInside,interpolate,stream){var subject=[],clip=[],i,n;segments.forEach(function(segment){if((n=segment.length-1)<=0)return;var n,p0=segment[0],p1=segment[n],x;if(pointEqual(p0,p1)){if(!p0[2]&&!p1[2]){stream.lineStart();for(i=0;i<n;++i)stream.point((p0=segment[i])[0],p0[1]);stream.lineEnd();return;}
p1[0]+=2*epsilon;}
subject.push(x=new Intersection(p0,segment,null,true));clip.push(x.o=new Intersection(p0,null,x,false));subject.push(x=new Intersection(p1,segment,null,false));clip.push(x.o=new Intersection(p1,null,x,true));});if(!subject.length)return;clip.sort(compareIntersection);link(subject);link(clip);for(i=0,n=clip.length;i<n;++i){clip[i].e=startInside=!startInside;}
var start=subject[0],points,point;while(1){var current=start,isSubject=true;while(current.v)if((current=current.n)===start)return;points=current.z;stream.lineStart();do{current.v=current.o.v=true;if(current.e){if(isSubject){for(i=0,n=points.length;i<n;++i)stream.point((point=points[i])[0],point[1]);}else{interpolate(current.x,current.n.x,1,stream);}
current=current.n;}else{if(isSubject){points=current.p.z;for(i=points.length-1;i>=0;--i)stream.point((point=points[i])[0],point[1]);}else{interpolate(current.x,current.p.x,-1,stream);}
current=current.p;}
current=current.o;points=current.z;isSubject=!isSubject;}while(!current.v);stream.lineEnd();}}
function link(array){if(!(n=array.length))return;var n,i=0,a=array[0],b;while(++i<n){a.n=b=array[i];b.p=a;a=b;}
a.n=b=array[0];b.p=a;}
function longitude(point){return abs(point[0])<=pi?point[0]:sign(point[0])*((abs(point[0])+pi)%tau-pi);}
function polygonContains(polygon,point){var lambda=longitude(point),phi=point[1],sinPhi=sin(phi),normal=[sin(lambda),-cos(lambda),0],angle=0,winding=0;var sum=new Adder();if(sinPhi===1)phi=halfPi+epsilon;else if(sinPhi===-1)phi=-halfPi-epsilon;for(var i=0,n=polygon.length;i<n;++i){if(!(m=(ring=polygon[i]).length))continue;var ring,m,point0=ring[m-1],lambda0=longitude(point0),phi0=point0[1]/2+quarterPi,sinPhi0=sin(phi0),cosPhi0=cos(phi0);for(var j=0;j<m;++j,lambda0=lambda1,sinPhi0=sinPhi1,cosPhi0=cosPhi1,point0=point1){var point1=ring[j],lambda1=longitude(point1),phi1=point1[1]/2+quarterPi,sinPhi1=sin(phi1),cosPhi1=cos(phi1),delta=lambda1-lambda0,sign=delta>=0?1:-1,absDelta=sign*delta,antimeridian=absDelta>pi,k=sinPhi0*sinPhi1;sum.add(atan2(k*sign*sin(absDelta),cosPhi0*cosPhi1+k*cos(absDelta)));angle+=antimeridian?delta+sign*tau:delta;if(antimeridian^lambda0>=lambda^lambda1>=lambda){var arc=cartesianCross(cartesian(point0),cartesian(point1));cartesianNormalizeInPlace(arc);var intersection=cartesianCross(normal,arc);cartesianNormalizeInPlace(intersection);var phiArc=(antimeridian^delta>=0?-1:1)*asin(intersection[2]);if(phi>phiArc||phi===phiArc&&(arc[0]||arc[1])){winding+=antimeridian^delta>=0?1:-1;}}}}
return(angle<-epsilon||angle<epsilon&&sum<-epsilon2)^(winding&1);}
function clip(pointVisible,clipLine,interpolate,start){return function(sink){var line=clipLine(sink),ringBuffer=clipBuffer(),ringSink=clipLine(ringBuffer),polygonStarted=false,polygon,segments,ring;var clip={point:point,lineStart:lineStart,lineEnd:lineEnd,polygonStart:function(){clip.point=pointRing;clip.lineStart=ringStart;clip.lineEnd=ringEnd;segments=[];polygon=[];},polygonEnd:function(){clip.point=point;clip.lineStart=lineStart;clip.lineEnd=lineEnd;segments=merge$1(segments);var startInside=polygonContains(polygon,start);if(segments.length){if(!polygonStarted)sink.polygonStart(),polygonStarted=true;clipRejoin(segments,compareIntersection,startInside,interpolate,sink);}else if(startInside){if(!polygonStarted)sink.polygonStart(),polygonStarted=true;sink.lineStart();interpolate(null,null,1,sink);sink.lineEnd();}
if(polygonStarted)sink.polygonEnd(),polygonStarted=false;segments=polygon=null;},sphere:function(){sink.polygonStart();sink.lineStart();interpolate(null,null,1,sink);sink.lineEnd();sink.polygonEnd();}};function point(lambda,phi){if(pointVisible(lambda,phi))sink.point(lambda,phi);}
function pointLine(lambda,phi){line.point(lambda,phi);}
function lineStart(){clip.point=pointLine;line.lineStart();}
function lineEnd(){clip.point=point;line.lineEnd();}
function pointRing(lambda,phi){ring.push([lambda,phi]);ringSink.point(lambda,phi);}
function ringStart(){ringSink.lineStart();ring=[];}
function ringEnd(){pointRing(ring[0][0],ring[0][1]);ringSink.lineEnd();var clean=ringSink.clean(),ringSegments=ringBuffer.result(),i,n=ringSegments.length,m,segment,point;ring.pop();polygon.push(ring);ring=null;if(!n)return;if(clean&1){segment=ringSegments[0];if((m=segment.length-1)>0){if(!polygonStarted)sink.polygonStart(),polygonStarted=true;sink.lineStart();for(i=0;i<m;++i)sink.point((point=segment[i])[0],point[1]);sink.lineEnd();}
return;}
if(n>1&&clean&2)ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));segments.push(ringSegments.filter(validSegment));}
return clip;};}
function validSegment(segment){return segment.length>1;}
function compareIntersection(a,b){return((a=a.x)[0]<0?a[1]-halfPi-epsilon:halfPi-a[1])
-((b=b.x)[0]<0?b[1]-halfPi-epsilon:halfPi-b[1]);}
var clipAntimeridian=clip(function(){return true;},clipAntimeridianLine,clipAntimeridianInterpolate,[-pi,-halfPi]);function clipAntimeridianLine(stream){var lambda0=NaN,phi0=NaN,sign0=NaN,clean;return{lineStart:function(){stream.lineStart();clean=1;},point:function(lambda1,phi1){var sign1=lambda1>0?pi:-pi,delta=abs(lambda1-lambda0);if(abs(delta-pi)<epsilon){stream.point(lambda0,phi0=(phi0+phi1)/2>0?halfPi:-halfPi);stream.point(sign0,phi0);stream.lineEnd();stream.lineStart();stream.point(sign1,phi0);stream.point(lambda1,phi0);clean=0;}else if(sign0!==sign1&&delta>=pi){if(abs(lambda0-sign0)<epsilon)lambda0-=sign0*epsilon;if(abs(lambda1-sign1)<epsilon)lambda1-=sign1*epsilon;phi0=clipAntimeridianIntersect(lambda0,phi0,lambda1,phi1);stream.point(sign0,phi0);stream.lineEnd();stream.lineStart();stream.point(sign1,phi0);clean=0;}
stream.point(lambda0=lambda1,phi0=phi1);sign0=sign1;},lineEnd:function(){stream.lineEnd();lambda0=phi0=NaN;},clean:function(){return 2-clean;}};}
function clipAntimeridianIntersect(lambda0,phi0,lambda1,phi1){var cosPhi0,cosPhi1,sinLambda0Lambda1=sin(lambda0-lambda1);return abs(sinLambda0Lambda1)>epsilon?atan((sin(phi0)*(cosPhi1=cos(phi1))*sin(lambda1)
-sin(phi1)*(cosPhi0=cos(phi0))*sin(lambda0))/(cosPhi0*cosPhi1*sinLambda0Lambda1)):(phi0+phi1)/2;}
function clipAntimeridianInterpolate(from,to,direction,stream){var phi;if(from==null){phi=direction*halfPi;stream.point(-pi,phi);stream.point(0,phi);stream.point(pi,phi);stream.point(pi,0);stream.point(pi,-phi);stream.point(0,-phi);stream.point(-pi,-phi);stream.point(-pi,0);stream.point(-pi,phi);}else if(abs(from[0]-to[0])>epsilon){var lambda=from[0]<to[0]?pi:-pi;phi=direction*lambda/2;stream.point(-lambda,phi);stream.point(0,phi);stream.point(lambda,phi);}else{stream.point(to[0],to[1]);}}
function clipCircle(radius){var cr=cos(radius),delta=2*radians$1,smallRadius=cr>0,notHemisphere=abs(cr)>epsilon;function interpolate(from,to,direction,stream){circleStream(stream,radius,delta,direction,from,to);}
function visible(lambda,phi){return cos(lambda)*cos(phi)>cr;}
function clipLine(stream){var point0,c0,v0,v00,clean;return{lineStart:function(){v00=v0=false;clean=1;},point:function(lambda,phi){var point1=[lambda,phi],point2,v=visible(lambda,phi),c=smallRadius?v?0:code(lambda,phi):v?code(lambda+(lambda<0?pi:-pi),phi):0;if(!point0&&(v00=v0=v))stream.lineStart();if(v!==v0){point2=intersect(point0,point1);if(!point2||pointEqual(point0,point2)||pointEqual(point1,point2))
point1[2]=1;}
if(v!==v0){clean=0;if(v){stream.lineStart();point2=intersect(point1,point0);stream.point(point2[0],point2[1]);}else{point2=intersect(point0,point1);stream.point(point2[0],point2[1],2);stream.lineEnd();}
point0=point2;}else if(notHemisphere&&point0&&smallRadius^v){var t;if(!(c&c0)&&(t=intersect(point1,point0,true))){clean=0;if(smallRadius){stream.lineStart();stream.point(t[0][0],t[0][1]);stream.point(t[1][0],t[1][1]);stream.lineEnd();}else{stream.point(t[1][0],t[1][1]);stream.lineEnd();stream.lineStart();stream.point(t[0][0],t[0][1],3);}}}
if(v&&(!point0||!pointEqual(point0,point1))){stream.point(point1[0],point1[1]);}
point0=point1,v0=v,c0=c;},lineEnd:function(){if(v0)stream.lineEnd();point0=null;},clean:function(){return clean|((v00&&v0)<<1);}};}
function intersect(a,b,two){var pa=cartesian(a),pb=cartesian(b);var n1=[1,0,0],n2=cartesianCross(pa,pb),n2n2=cartesianDot(n2,n2),n1n2=n2[0],determinant=n2n2-n1n2*n1n2;if(!determinant)return!two&&a;var c1=cr*n2n2/determinant,c2=-cr*n1n2/determinant,n1xn2=cartesianCross(n1,n2),A=cartesianScale(n1,c1),B=cartesianScale(n2,c2);cartesianAddInPlace(A,B);var u=n1xn2,w=cartesianDot(A,u),uu=cartesianDot(u,u),t2=w*w-uu*(cartesianDot(A,A)-1);if(t2<0)return;var t=sqrt(t2),q=cartesianScale(u,(-w-t)/uu);cartesianAddInPlace(q,A);q=spherical(q);if(!two)return q;var lambda0=a[0],lambda1=b[0],phi0=a[1],phi1=b[1],z;if(lambda1<lambda0)z=lambda0,lambda0=lambda1,lambda1=z;var delta=lambda1-lambda0,polar=abs(delta-pi)<epsilon,meridian=polar||delta<epsilon;if(!polar&&phi1<phi0)z=phi0,phi0=phi1,phi1=z;if(meridian?polar?phi0+phi1>0^q[1]<(abs(q[0]-lambda0)<epsilon?phi0:phi1):phi0<=q[1]&&q[1]<=phi1:delta>pi^(lambda0<=q[0]&&q[0]<=lambda1)){var q1=cartesianScale(u,(-w+t)/uu);cartesianAddInPlace(q1,A);return[q,spherical(q1)];}}
function code(lambda,phi){var r=smallRadius?radius:pi-radius,code=0;if(lambda<-r)code|=1;else if(lambda>r)code|=2;if(phi<-r)code|=4;else if(phi>r)code|=8;return code;}
return clip(visible,clipLine,interpolate,smallRadius?[0,-radius]:[-pi,radius-pi]);}
function clipLine(a,b,x0,y0,x1,y1){var ax=a[0],ay=a[1],bx=b[0],by=b[1],t0=0,t1=1,dx=bx-ax,dy=by-ay,r;r=x0-ax;if(!dx&&r>0)return;r/=dx;if(dx<0){if(r<t0)return;if(r<t1)t1=r;}else if(dx>0){if(r>t1)return;if(r>t0)t0=r;}
r=x1-ax;if(!dx&&r<0)return;r/=dx;if(dx<0){if(r>t1)return;if(r>t0)t0=r;}else if(dx>0){if(r<t0)return;if(r<t1)t1=r;}
r=y0-ay;if(!dy&&r>0)return;r/=dy;if(dy<0){if(r<t0)return;if(r<t1)t1=r;}else if(dy>0){if(r>t1)return;if(r>t0)t0=r;}
r=y1-ay;if(!dy&&r<0)return;r/=dy;if(dy<0){if(r>t1)return;if(r>t0)t0=r;}else if(dy>0){if(r<t0)return;if(r<t1)t1=r;}
if(t0>0)a[0]=ax+t0*dx,a[1]=ay+t0*dy;if(t1<1)b[0]=ax+t1*dx,b[1]=ay+t1*dy;return true;}
var clipMax=1e9,clipMin=-clipMax;function clipRectangle(x0,y0,x1,y1){function visible(x,y){return x0<=x&&x<=x1&&y0<=y&&y<=y1;}
function interpolate(from,to,direction,stream){var a=0,a1=0;if(from==null||(a=corner(from,direction))!==(a1=corner(to,direction))||comparePoint(from,to)<0^direction>0){do stream.point(a===0||a===3?x0:x1,a>1?y1:y0);while((a=(a+direction+4)%4)!==a1);}else{stream.point(to[0],to[1]);}}
function corner(p,direction){return abs(p[0]-x0)<epsilon?direction>0?0:3:abs(p[0]-x1)<epsilon?direction>0?2:1:abs(p[1]-y0)<epsilon?direction>0?1:0:direction>0?3:2;}
function compareIntersection(a,b){return comparePoint(a.x,b.x);}
function comparePoint(a,b){var ca=corner(a,1),cb=corner(b,1);return ca!==cb?ca-cb:ca===0?b[1]-a[1]:ca===1?a[0]-b[0]:ca===2?a[1]-b[1]:b[0]-a[0];}
return function(stream){var activeStream=stream,bufferStream=clipBuffer(),segments,polygon,ring,x__,y__,v__,x_,y_,v_,first,clean;var clipStream={point:point,lineStart:lineStart,lineEnd:lineEnd,polygonStart:polygonStart,polygonEnd:polygonEnd};function point(x,y){if(visible(x,y))activeStream.point(x,y);}
function polygonInside(){var winding=0;for(var i=0,n=polygon.length;i<n;++i){for(var ring=polygon[i],j=1,m=ring.length,point=ring[0],a0,a1,b0=point[0],b1=point[1];j<m;++j){a0=b0,a1=b1,point=ring[j],b0=point[0],b1=point[1];if(a1<=y1){if(b1>y1&&(b0-a0)*(y1-a1)>(b1-a1)*(x0-a0))++winding;}
else{if(b1<=y1&&(b0-a0)*(y1-a1)<(b1-a1)*(x0-a0))--winding;}}}
return winding;}
function polygonStart(){activeStream=bufferStream,segments=[],polygon=[],clean=true;}
function polygonEnd(){var startInside=polygonInside(),cleanInside=clean&&startInside,visible=(segments=merge$1(segments)).length;if(cleanInside||visible){stream.polygonStart();if(cleanInside){stream.lineStart();interpolate(null,null,1,stream);stream.lineEnd();}
if(visible){clipRejoin(segments,compareIntersection,startInside,interpolate,stream);}
stream.polygonEnd();}
activeStream=stream,segments=polygon=ring=null;}
function lineStart(){clipStream.point=linePoint;if(polygon)polygon.push(ring=[]);first=true;v_=false;x_=y_=NaN;}
function lineEnd(){if(segments){linePoint(x__,y__);if(v__&&v_)bufferStream.rejoin();segments.push(bufferStream.result());}
clipStream.point=point;if(v_)activeStream.lineEnd();}
function linePoint(x,y){var v=visible(x,y);if(polygon)ring.push([x,y]);if(first){x__=x,y__=y,v__=v;first=false;if(v){activeStream.lineStart();activeStream.point(x,y);}}else{if(v&&v_)activeStream.point(x,y);else{var a=[x_=Math.max(clipMin,Math.min(clipMax,x_)),y_=Math.max(clipMin,Math.min(clipMax,y_))],b=[x=Math.max(clipMin,Math.min(clipMax,x)),y=Math.max(clipMin,Math.min(clipMax,y))];if(clipLine(a,b,x0,y0,x1,y1)){if(!v_){activeStream.lineStart();activeStream.point(a[0],a[1]);}
activeStream.point(b[0],b[1]);if(!v)activeStream.lineEnd();clean=false;}else if(v){activeStream.lineStart();activeStream.point(x,y);clean=false;}}}
x_=x,y_=y,v_=v;}
return clipStream;};}
var lengthSum$1,lambda0,sinPhi0,cosPhi0;var lengthStream$1={sphere:noop,point:noop,lineStart:lengthLineStart,lineEnd:noop,polygonStart:noop,polygonEnd:noop};function lengthLineStart(){lengthStream$1.point=lengthPointFirst$1;lengthStream$1.lineEnd=lengthLineEnd;}
function lengthLineEnd(){lengthStream$1.point=lengthStream$1.lineEnd=noop;}
function lengthPointFirst$1(lambda,phi){lambda*=radians$1,phi*=radians$1;lambda0=lambda,sinPhi0=sin(phi),cosPhi0=cos(phi);lengthStream$1.point=lengthPoint$1;}
function lengthPoint$1(lambda,phi){lambda*=radians$1,phi*=radians$1;var sinPhi=sin(phi),cosPhi=cos(phi),delta=abs(lambda-lambda0),cosDelta=cos(delta),sinDelta=sin(delta),x=cosPhi*sinDelta,y=cosPhi0*sinPhi-sinPhi0*cosPhi*cosDelta,z=sinPhi0*sinPhi+cosPhi0*cosPhi*cosDelta;lengthSum$1.add(atan2(sqrt(x*x+y*y),z));lambda0=lambda,sinPhi0=sinPhi,cosPhi0=cosPhi;}
function length(object){lengthSum$1=new Adder();geoStream(object,lengthStream$1);return+lengthSum$1;}
var coordinates=[null,null],object$1={type:"LineString",coordinates:coordinates};function distance(a,b){coordinates[0]=a;coordinates[1]=b;return length(object$1);}
var containsObjectType={Feature:function(object,point){return containsGeometry(object.geometry,point);},FeatureCollection:function(object,point){var features=object.features,i=-1,n=features.length;while(++i<n)if(containsGeometry(features[i].geometry,point))return true;return false;}};var containsGeometryType={Sphere:function(){return true;},Point:function(object,point){return containsPoint(object.coordinates,point);},MultiPoint:function(object,point){var coordinates=object.coordinates,i=-1,n=coordinates.length;while(++i<n)if(containsPoint(coordinates[i],point))return true;return false;},LineString:function(object,point){return containsLine(object.coordinates,point);},MultiLineString:function(object,point){var coordinates=object.coordinates,i=-1,n=coordinates.length;while(++i<n)if(containsLine(coordinates[i],point))return true;return false;},Polygon:function(object,point){return containsPolygon(object.coordinates,point);},MultiPolygon:function(object,point){var coordinates=object.coordinates,i=-1,n=coordinates.length;while(++i<n)if(containsPolygon(coordinates[i],point))return true;return false;},GeometryCollection:function(object,point){var geometries=object.geometries,i=-1,n=geometries.length;while(++i<n)if(containsGeometry(geometries[i],point))return true;return false;}};function containsGeometry(geometry,point){return geometry&&containsGeometryType.hasOwnProperty(geometry.type)?containsGeometryType[geometry.type](geometry,point):false;}
function containsPoint(coordinates,point){return distance(coordinates,point)===0;}
function containsLine(coordinates,point){var ao,bo,ab;for(var i=0,n=coordinates.length;i<n;i++){bo=distance(coordinates[i],point);if(bo===0)return true;if(i>0){ab=distance(coordinates[i],coordinates[i-1]);if(ab>0&&ao<=ab&&bo<=ab&&(ao+bo-ab)*(1-Math.pow((ao-bo)/ab,2))<epsilon2*ab)
return true;}
ao=bo;}
return false;}
function containsPolygon(coordinates,point){return!!polygonContains(coordinates.map(ringRadians),pointRadians(point));}
function ringRadians(ring){return ring=ring.map(pointRadians),ring.pop(),ring;}
function pointRadians(point){return[point[0]*radians$1,point[1]*radians$1];}
function geoContains(object,point){return(object&&containsObjectType.hasOwnProperty(object.type)?containsObjectType[object.type]:containsGeometry)(object,point);}
function graticuleX(y0,y1,dy){var y=range(y0,y1-epsilon,dy).concat(y1);return function(x){return y.map(function(y){return[x,y];});};}
function graticuleY(x0,x1,dx){var x=range(x0,x1-epsilon,dx).concat(x1);return function(y){return x.map(function(x){return[x,y];});};}
function graticule(){var x1,x0,X1,X0,y1,y0,Y1,Y0,dx=10,dy=dx,DX=90,DY=360,x,y,X,Y,precision=2.5;function graticule(){return{type:"MultiLineString",coordinates:lines()};}
function lines(){return range(ceil(X0/DX)*DX,X1,DX).map(X).concat(range(ceil(Y0/DY)*DY,Y1,DY).map(Y)).concat(range(ceil(x0/dx)*dx,x1,dx).filter(function(x){return abs(x%DX)>epsilon;}).map(x)).concat(range(ceil(y0/dy)*dy,y1,dy).filter(function(y){return abs(y%DY)>epsilon;}).map(y));}
graticule.lines=function(){return lines().map(function(coordinates){return{type:"LineString",coordinates:coordinates};});};graticule.outline=function(){return{type:"Polygon",coordinates:[X(X0).concat(Y(Y1).slice(1),X(X1).reverse().slice(1),Y(Y0).reverse().slice(1))]};};graticule.extent=function(_){if(!arguments.length)return graticule.extentMinor();return graticule.extentMajor(_).extentMinor(_);};graticule.extentMajor=function(_){if(!arguments.length)return[[X0,Y0],[X1,Y1]];X0=+_[0][0],X1=+_[1][0];Y0=+_[0][1],Y1=+_[1][1];if(X0>X1)_=X0,X0=X1,X1=_;if(Y0>Y1)_=Y0,Y0=Y1,Y1=_;return graticule.precision(precision);};graticule.extentMinor=function(_){if(!arguments.length)return[[x0,y0],[x1,y1]];x0=+_[0][0],x1=+_[1][0];y0=+_[0][1],y1=+_[1][1];if(x0>x1)_=x0,x0=x1,x1=_;if(y0>y1)_=y0,y0=y1,y1=_;return graticule.precision(precision);};graticule.step=function(_){if(!arguments.length)return graticule.stepMinor();return graticule.stepMajor(_).stepMinor(_);};graticule.stepMajor=function(_){if(!arguments.length)return[DX,DY];DX=+_[0],DY=+_[1];return graticule;};graticule.stepMinor=function(_){if(!arguments.length)return[dx,dy];dx=+_[0],dy=+_[1];return graticule;};graticule.precision=function(_){if(!arguments.length)return precision;precision=+_;x=graticuleX(y0,y1,90);y=graticuleY(x0,x1,precision);X=graticuleX(Y0,Y1,90);Y=graticuleY(X0,X1,precision);return graticule;};return graticule.extentMajor([[-180,-90+epsilon],[180,90-epsilon]]).extentMinor([[-180,-80-epsilon],[180,80+epsilon]]);}
function graticule10(){return graticule()();}
var identity$1=x=>x;var areaSum=new Adder(),areaRingSum=new Adder(),x00$2,y00$2,x0$3,y0$3;var areaStream={point:noop,lineStart:noop,lineEnd:noop,polygonStart:function(){areaStream.lineStart=areaRingStart;areaStream.lineEnd=areaRingEnd;},polygonEnd:function(){areaStream.lineStart=areaStream.lineEnd=areaStream.point=noop;areaSum.add(abs(areaRingSum));areaRingSum=new Adder();},result:function(){var area=areaSum/2;areaSum=new Adder();return area;}};function areaRingStart(){areaStream.point=areaPointFirst;}
function areaPointFirst(x,y){areaStream.point=areaPoint;x00$2=x0$3=x,y00$2=y0$3=y;}
function areaPoint(x,y){areaRingSum.add(y0$3*x-x0$3*y);x0$3=x,y0$3=y;}
function areaRingEnd(){areaPoint(x00$2,y00$2);}
var x0$2=Infinity,y0$2=x0$2,x1=-x0$2,y1=x1;var boundsStream={point:boundsPoint,lineStart:noop,lineEnd:noop,polygonStart:noop,polygonEnd:noop,result:function(){var bounds=[[x0$2,y0$2],[x1,y1]];x1=y1=-(y0$2=x0$2=Infinity);return bounds;}};function boundsPoint(x,y){if(x<x0$2)x0$2=x;if(x>x1)x1=x;if(y<y0$2)y0$2=y;if(y>y1)y1=y;}
var X0=0,Y0=0,Z0=0,X1=0,Y1=0,Z1=0,X2=0,Y2=0,Z2=0,x00$1,y00$1,x0$1,y0$1;var centroidStream={point:centroidPoint,lineStart:centroidLineStart,lineEnd:centroidLineEnd,polygonStart:function(){centroidStream.lineStart=centroidRingStart;centroidStream.lineEnd=centroidRingEnd;},polygonEnd:function(){centroidStream.point=centroidPoint;centroidStream.lineStart=centroidLineStart;centroidStream.lineEnd=centroidLineEnd;},result:function(){var centroid=Z2?[X2/Z2,Y2/Z2]:Z1?[X1/Z1,Y1/Z1]:Z0?[X0/Z0,Y0/Z0]:[NaN,NaN];X0=Y0=Z0=X1=Y1=Z1=X2=Y2=Z2=0;return centroid;}};function centroidPoint(x,y){X0+=x;Y0+=y;++Z0;}
function centroidLineStart(){centroidStream.point=centroidPointFirstLine;}
function centroidPointFirstLine(x,y){centroidStream.point=centroidPointLine;centroidPoint(x0$1=x,y0$1=y);}
function centroidPointLine(x,y){var dx=x-x0$1,dy=y-y0$1,z=sqrt(dx*dx+dy*dy);X1+=z*(x0$1+x)/2;Y1+=z*(y0$1+y)/2;Z1+=z;centroidPoint(x0$1=x,y0$1=y);}
function centroidLineEnd(){centroidStream.point=centroidPoint;}
function centroidRingStart(){centroidStream.point=centroidPointFirstRing;}
function centroidRingEnd(){centroidPointRing(x00$1,y00$1);}
function centroidPointFirstRing(x,y){centroidStream.point=centroidPointRing;centroidPoint(x00$1=x0$1=x,y00$1=y0$1=y);}
function centroidPointRing(x,y){var dx=x-x0$1,dy=y-y0$1,z=sqrt(dx*dx+dy*dy);X1+=z*(x0$1+x)/2;Y1+=z*(y0$1+y)/2;Z1+=z;z=y0$1*x-x0$1*y;X2+=z*(x0$1+x);Y2+=z*(y0$1+y);Z2+=z*3;centroidPoint(x0$1=x,y0$1=y);}
function PathContext(context){this._context=context;}
PathContext.prototype={_radius:4.5,pointRadius:function(_){return this._radius=_,this;},polygonStart:function(){this._line=0;},polygonEnd:function(){this._line=NaN;},lineStart:function(){this._point=0;},lineEnd:function(){if(this._line===0)this._context.closePath();this._point=NaN;},point:function(x,y){switch(this._point){case 0:{this._context.moveTo(x,y);this._point=1;break;}
case 1:{this._context.lineTo(x,y);break;}
default:{this._context.moveTo(x+this._radius,y);this._context.arc(x,y,this._radius,0,tau);break;}}},result:noop};var lengthSum=new Adder(),lengthRing,x00,y00,x0,y0;var lengthStream={point:noop,lineStart:function(){lengthStream.point=lengthPointFirst;},lineEnd:function(){if(lengthRing)lengthPoint(x00,y00);lengthStream.point=noop;},polygonStart:function(){lengthRing=true;},polygonEnd:function(){lengthRing=null;},result:function(){var length=+lengthSum;lengthSum=new Adder();return length;}};function lengthPointFirst(x,y){lengthStream.point=lengthPoint;x00=x0=x,y00=y0=y;}
function lengthPoint(x,y){x0-=x,y0-=y;lengthSum.add(sqrt(x0*x0+y0*y0));x0=x,y0=y;}
let cacheDigits,cacheAppend,cacheRadius,cacheCircle;class PathString{constructor(digits){this._append=digits==null?append:appendRound(digits);this._radius=4.5;this._="";}
pointRadius(_){this._radius=+_;return this;}
polygonStart(){this._line=0;}
polygonEnd(){this._line=NaN;}
lineStart(){this._point=0;}
lineEnd(){if(this._line===0)this._+="Z";this._point=NaN;}
point(x,y){switch(this._point){case 0:{this._append`M${x},${y}`;this._point=1;break;}
case 1:{this._append`L${x},${y}`;break;}
default:{this._append`M${x},${y}`;if(this._radius!==cacheRadius||this._append!==cacheAppend){const r=this._radius;const s=this._;this._="";this._append`m0,${r}a${r},${r} 0 1,1 0,${-2 * r}a${r},${r} 0 1,1 0,${2 * r}z`;cacheRadius=r;cacheAppend=this._append;cacheCircle=this._;this._=s;}
this._+=cacheCircle;break;}}}
result(){const result=this._;this._="";return result.length?result:null;}}
function append(strings){let i=1;this._+=strings[0];for(const j=strings.length;i<j;++i){this._+=arguments[i]+strings[i];}}
function appendRound(digits){const d=Math.floor(digits);if(!(d>=0))throw new RangeError(`invalid digits: ${digits}`);if(d>15)return append;if(d!==cacheDigits){const k=10**d;cacheDigits=d;cacheAppend=function append(strings){let i=1;this._+=strings[0];for(const j=strings.length;i<j;++i){this._+=Math.round(arguments[i]*k)/k+strings[i];}};}
return cacheAppend;}
function geoPath(projection,context){let digits=3,pointRadius=4.5,projectionStream,contextStream;function path(object){if(object){if(typeof pointRadius==="function")contextStream.pointRadius(+pointRadius.apply(this,arguments));geoStream(object,projectionStream(contextStream));}
return contextStream.result();}
path.area=function(object){geoStream(object,projectionStream(areaStream));return areaStream.result();};path.measure=function(object){geoStream(object,projectionStream(lengthStream));return lengthStream.result();};path.bounds=function(object){geoStream(object,projectionStream(boundsStream));return boundsStream.result();};path.centroid=function(object){geoStream(object,projectionStream(centroidStream));return centroidStream.result();};path.projection=function(_){if(!arguments.length)return projection;projectionStream=_==null?(projection=null,identity$1):(projection=_).stream;return path;};path.context=function(_){if(!arguments.length)return context;contextStream=_==null?(context=null,new PathString(digits)):new PathContext(context=_);if(typeof pointRadius!=="function")contextStream.pointRadius(pointRadius);return path;};path.pointRadius=function(_){if(!arguments.length)return pointRadius;pointRadius=typeof _==="function"?_:(contextStream.pointRadius(+_),+_);return path;};path.digits=function(_){if(!arguments.length)return digits;if(_==null)digits=null;else{const d=Math.floor(_);if(!(d>=0))throw new RangeError(`invalid digits: ${_}`);digits=d;}
if(context===null)contextStream=new PathString(digits);return path;};return path.projection(projection).digits(digits).context(context);}
function transformer(methods){return function(stream){var s=new TransformStream;for(var key in methods)s[key]=methods[key];s.stream=stream;return s;};}
function TransformStream(){}
TransformStream.prototype={constructor:TransformStream,point:function(x,y){this.stream.point(x,y);},sphere:function(){this.stream.sphere();},lineStart:function(){this.stream.lineStart();},lineEnd:function(){this.stream.lineEnd();},polygonStart:function(){this.stream.polygonStart();},polygonEnd:function(){this.stream.polygonEnd();}};function fit(projection,fitBounds,object){var clip=projection.clipExtent&&projection.clipExtent();projection.scale(150).translate([0,0]);if(clip!=null)projection.clipExtent(null);geoStream(object,projection.stream(boundsStream));fitBounds(boundsStream.result());if(clip!=null)projection.clipExtent(clip);return projection;}
function fitExtent(projection,extent,object){return fit(projection,function(b){var w=extent[1][0]-extent[0][0],h=extent[1][1]-extent[0][1],k=Math.min(w/(b[1][0]-b[0][0]),h/(b[1][1]-b[0][1])),x=+extent[0][0]+(w-k*(b[1][0]+b[0][0]))/2,y=+extent[0][1]+(h-k*(b[1][1]+b[0][1]))/2;projection.scale(150*k).translate([x,y]);},object);}
function fitSize(projection,size,object){return fitExtent(projection,[[0,0],size],object);}
function fitWidth(projection,width,object){return fit(projection,function(b){var w=+width,k=w/(b[1][0]-b[0][0]),x=(w-k*(b[1][0]+b[0][0]))/2,y=-k*b[0][1];projection.scale(150*k).translate([x,y]);},object);}
function fitHeight(projection,height,object){return fit(projection,function(b){var h=+height,k=h/(b[1][1]-b[0][1]),x=-k*b[0][0],y=(h-k*(b[1][1]+b[0][1]))/2;projection.scale(150*k).translate([x,y]);},object);}
var maxDepth=16,cosMinDistance=cos(30*radians$1);function resample(project,delta2){return+delta2?resample$1(project,delta2):resampleNone(project);}
function resampleNone(project){return transformer({point:function(x,y){x=project(x,y);this.stream.point(x[0],x[1]);}});}
function resample$1(project,delta2){function resampleLineTo(x0,y0,lambda0,a0,b0,c0,x1,y1,lambda1,a1,b1,c1,depth,stream){var dx=x1-x0,dy=y1-y0,d2=dx*dx+dy*dy;if(d2>4*delta2&&depth--){var a=a0+a1,b=b0+b1,c=c0+c1,m=sqrt(a*a+b*b+c*c),phi2=asin(c/=m),lambda2=abs(abs(c)-1)<epsilon||abs(lambda0-lambda1)<epsilon?(lambda0+lambda1)/2:atan2(b,a),p=project(lambda2,phi2),x2=p[0],y2=p[1],dx2=x2-x0,dy2=y2-y0,dz=dy*dx2-dx*dy2;if(dz*dz/d2>delta2||abs((dx*dx2+dy*dy2)/d2-0.5)>0.3||a0*a1+b0*b1+c0*c1<cosMinDistance){resampleLineTo(x0,y0,lambda0,a0,b0,c0,x2,y2,lambda2,a/=m,b/=m,c,depth,stream);stream.point(x2,y2);resampleLineTo(x2,y2,lambda2,a,b,c,x1,y1,lambda1,a1,b1,c1,depth,stream);}}}
return function(stream){var lambda00,x00,y00,a00,b00,c00,lambda0,x0,y0,a0,b0,c0;var resampleStream={point:point,lineStart:lineStart,lineEnd:lineEnd,polygonStart:function(){stream.polygonStart();resampleStream.lineStart=ringStart;},polygonEnd:function(){stream.polygonEnd();resampleStream.lineStart=lineStart;}};function point(x,y){x=project(x,y);stream.point(x[0],x[1]);}
function lineStart(){x0=NaN;resampleStream.point=linePoint;stream.lineStart();}
function linePoint(lambda,phi){var c=cartesian([lambda,phi]),p=project(lambda,phi);resampleLineTo(x0,y0,lambda0,a0,b0,c0,x0=p[0],y0=p[1],lambda0=lambda,a0=c[0],b0=c[1],c0=c[2],maxDepth,stream);stream.point(x0,y0);}
function lineEnd(){resampleStream.point=point;stream.lineEnd();}
function ringStart(){lineStart();resampleStream.point=ringPoint;resampleStream.lineEnd=ringEnd;}
function ringPoint(lambda,phi){linePoint(lambda00=lambda,phi),x00=x0,y00=y0,a00=a0,b00=b0,c00=c0;resampleStream.point=linePoint;}
function ringEnd(){resampleLineTo(x0,y0,lambda0,a0,b0,c0,x00,y00,lambda00,a00,b00,c00,maxDepth,stream);resampleStream.lineEnd=lineEnd;lineEnd();}
return resampleStream;};}
var transformRadians=transformer({point:function(x,y){this.stream.point(x*radians$1,y*radians$1);}});function transformRotate(rotate){return transformer({point:function(x,y){var r=rotate(x,y);return this.stream.point(r[0],r[1]);}});}
function scaleTranslate(k,dx,dy,sx,sy){function transform(x,y){x*=sx;y*=sy;return[dx+k*x,dy-k*y];}
transform.invert=function(x,y){return[(x-dx)/k*sx,(dy-y)/k*sy];};return transform;}
function scaleTranslateRotate(k,dx,dy,sx,sy,alpha){if(!alpha)return scaleTranslate(k,dx,dy,sx,sy);var cosAlpha=cos(alpha),sinAlpha=sin(alpha),a=cosAlpha*k,b=sinAlpha*k,ai=cosAlpha/k,bi=sinAlpha/k,ci=(sinAlpha*dy-cosAlpha*dx)/k,fi=(sinAlpha*dx+cosAlpha*dy)/k;function transform(x,y){x*=sx;y*=sy;return[a*x-b*y+dx,dy-b*x-a*y];}
transform.invert=function(x,y){return[sx*(ai*x-bi*y+ci),sy*(fi-bi*x-ai*y)];};return transform;}
function projection(project){return projectionMutator(function(){return project;})();}
function projectionMutator(projectAt){var project,k=150,x=480,y=250,lambda=0,phi=0,deltaLambda=0,deltaPhi=0,deltaGamma=0,rotate,alpha=0,sx=1,sy=1,theta=null,preclip=clipAntimeridian,x0=null,y0,x1,y1,postclip=identity$1,delta2=0.5,projectResample,projectTransform,projectRotateTransform,cache,cacheStream;function projection(point){return projectRotateTransform(point[0]*radians$1,point[1]*radians$1);}
function invert(point){point=projectRotateTransform.invert(point[0],point[1]);return point&&[point[0]*degrees$1,point[1]*degrees$1];}
projection.stream=function(stream){return cache&&cacheStream===stream?cache:cache=transformRadians(transformRotate(rotate)(preclip(projectResample(postclip(cacheStream=stream)))));};projection.preclip=function(_){return arguments.length?(preclip=_,theta=undefined,reset()):preclip;};projection.postclip=function(_){return arguments.length?(postclip=_,x0=y0=x1=y1=null,reset()):postclip;};projection.clipAngle=function(_){return arguments.length?(preclip=+_?clipCircle(theta=_*radians$1):(theta=null,clipAntimeridian),reset()):theta*degrees$1;};projection.clipExtent=function(_){return arguments.length?(postclip=_==null?(x0=y0=x1=y1=null,identity$1):clipRectangle(x0=+_[0][0],y0=+_[0][1],x1=+_[1][0],y1=+_[1][1]),reset()):x0==null?null:[[x0,y0],[x1,y1]];};projection.scale=function(_){return arguments.length?(k=+_,recenter()):k;};projection.translate=function(_){return arguments.length?(x=+_[0],y=+_[1],recenter()):[x,y];};projection.center=function(_){return arguments.length?(lambda=_[0]%360*radians$1,phi=_[1]%360*radians$1,recenter()):[lambda*degrees$1,phi*degrees$1];};projection.rotate=function(_){return arguments.length?(deltaLambda=_[0]%360*radians$1,deltaPhi=_[1]%360*radians$1,deltaGamma=_.length>2?_[2]%360*radians$1:0,recenter()):[deltaLambda*degrees$1,deltaPhi*degrees$1,deltaGamma*degrees$1];};projection.angle=function(_){return arguments.length?(alpha=_%360*radians$1,recenter()):alpha*degrees$1;};projection.reflectX=function(_){return arguments.length?(sx=_?-1:1,recenter()):sx<0;};projection.reflectY=function(_){return arguments.length?(sy=_?-1:1,recenter()):sy<0;};projection.precision=function(_){return arguments.length?(projectResample=resample(projectTransform,delta2=_*_),reset()):sqrt(delta2);};projection.fitExtent=function(extent,object){return fitExtent(projection,extent,object);};projection.fitSize=function(size,object){return fitSize(projection,size,object);};projection.fitWidth=function(width,object){return fitWidth(projection,width,object);};projection.fitHeight=function(height,object){return fitHeight(projection,height,object);};function recenter(){var center=scaleTranslateRotate(k,0,0,sx,sy,alpha).apply(null,project(lambda,phi)),transform=scaleTranslateRotate(k,x-center[0],y-center[1],sx,sy,alpha);rotate=rotateRadians(deltaLambda,deltaPhi,deltaGamma);projectTransform=compose(project,transform);projectRotateTransform=compose(rotate,projectTransform);projectResample=resample(projectTransform,delta2);return reset();}
function reset(){cache=cacheStream=null;return projection;}
return function(){project=projectAt.apply(this,arguments);projection.invert=project.invert&&invert;return recenter();};}
function conicProjection(projectAt){var phi0=0,phi1=pi/3,m=projectionMutator(projectAt),p=m(phi0,phi1);p.parallels=function(_){return arguments.length?m(phi0=_[0]*radians$1,phi1=_[1]*radians$1):[phi0*degrees$1,phi1*degrees$1];};return p;}
function cylindricalEqualAreaRaw(phi0){var cosPhi0=cos(phi0);function forward(lambda,phi){return[lambda*cosPhi0,sin(phi)/cosPhi0];}
forward.invert=function(x,y){return[x/cosPhi0,asin(y*cosPhi0)];};return forward;}
function conicEqualAreaRaw(y0,y1){var sy0=sin(y0),n=(sy0+sin(y1))/2;if(abs(n)<epsilon)return cylindricalEqualAreaRaw(y0);var c=1+sy0*(2*n-sy0),r0=sqrt(c)/n;function project(x,y){var r=sqrt(c-2*n*sin(y))/n;return[r*sin(x*=n),r0-r*cos(x)];}
project.invert=function(x,y){var r0y=r0-y,l=atan2(x,abs(r0y))*sign(r0y);if(r0y*n<0)
l-=pi*sign(x)*sign(r0y);return[l/n,asin((c-(x*x+r0y*r0y)*n*n)/(2*n))];};return project;}
function geoConicEqualArea(){return conicProjection(conicEqualAreaRaw).scale(155.424).center([0,33.6442]);}
function geoAlbers(){return geoConicEqualArea().parallels([29.5,45.5]).scale(1070).translate([480,250]).rotate([96,0]).center([-0.6,38.7]);}
function multiplex(streams){var n=streams.length;return{point:function(x,y){var i=-1;while(++i<n)streams[i].point(x,y);},sphere:function(){var i=-1;while(++i<n)streams[i].sphere();},lineStart:function(){var i=-1;while(++i<n)streams[i].lineStart();},lineEnd:function(){var i=-1;while(++i<n)streams[i].lineEnd();},polygonStart:function(){var i=-1;while(++i<n)streams[i].polygonStart();},polygonEnd:function(){var i=-1;while(++i<n)streams[i].polygonEnd();}};}
function geoAlbersUsa(){var cache,cacheStream,lower48=geoAlbers(),lower48Point,alaska=geoConicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),alaskaPoint,hawaii=geoConicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),hawaiiPoint,point,pointStream={point:function(x,y){point=[x,y];}};function albersUsa(coordinates){var x=coordinates[0],y=coordinates[1];return point=null,(lower48Point.point(x,y),point)||(alaskaPoint.point(x,y),point)||(hawaiiPoint.point(x,y),point);}
albersUsa.invert=function(coordinates){var k=lower48.scale(),t=lower48.translate(),x=(coordinates[0]-t[0])/k,y=(coordinates[1]-t[1])/k;return(y>=0.120&&y<0.234&&x>=-0.425&&x<-0.214?alaska:y>=0.166&&y<0.234&&x>=-0.214&&x<-0.115?hawaii:lower48).invert(coordinates);};albersUsa.stream=function(stream){return cache&&cacheStream===stream?cache:cache=multiplex([lower48.stream(cacheStream=stream),alaska.stream(stream),hawaii.stream(stream)]);};albersUsa.precision=function(_){if(!arguments.length)return lower48.precision();lower48.precision(_),alaska.precision(_),hawaii.precision(_);return reset();};albersUsa.scale=function(_){if(!arguments.length)return lower48.scale();lower48.scale(_),alaska.scale(_*0.35),hawaii.scale(_);return albersUsa.translate(lower48.translate());};albersUsa.translate=function(_){if(!arguments.length)return lower48.translate();var k=lower48.scale(),x=+_[0],y=+_[1];lower48Point=lower48.translate(_).clipExtent([[x-0.455*k,y-0.238*k],[x+0.455*k,y+0.238*k]]).stream(pointStream);alaskaPoint=alaska.translate([x-0.307*k,y+0.201*k]).clipExtent([[x-0.425*k+epsilon,y+0.120*k+epsilon],[x-0.214*k-epsilon,y+0.234*k-epsilon]]).stream(pointStream);hawaiiPoint=hawaii.translate([x-0.205*k,y+0.212*k]).clipExtent([[x-0.214*k+epsilon,y+0.166*k+epsilon],[x-0.115*k-epsilon,y+0.234*k-epsilon]]).stream(pointStream);return reset();};albersUsa.fitExtent=function(extent,object){return fitExtent(albersUsa,extent,object);};albersUsa.fitSize=function(size,object){return fitSize(albersUsa,size,object);};albersUsa.fitWidth=function(width,object){return fitWidth(albersUsa,width,object);};albersUsa.fitHeight=function(height,object){return fitHeight(albersUsa,height,object);};function reset(){cache=cacheStream=null;return albersUsa;}
return albersUsa.scale(1070);}
function azimuthalRaw(scale){return function(x,y){var cx=cos(x),cy=cos(y),k=scale(cx*cy);if(k===Infinity)return[2,0];return[k*cy*sin(x),k*sin(y)];}}
function azimuthalInvert(angle){return function(x,y){var z=sqrt(x*x+y*y),c=angle(z),sc=sin(c),cc=cos(c);return[atan2(x*sc,z*cc),asin(z&&y*sc/z)];}}
var azimuthalEqualAreaRaw=azimuthalRaw(function(cxcy){return sqrt(2/(1+cxcy));});azimuthalEqualAreaRaw.invert=azimuthalInvert(function(z){return 2*asin(z/2);});function geoAzimuthalEqualArea(){return projection(azimuthalEqualAreaRaw).scale(124.75).clipAngle(180-1e-3);}
var azimuthalEquidistantRaw=azimuthalRaw(function(c){return(c=acos(c))&&c/sin(c);});azimuthalEquidistantRaw.invert=azimuthalInvert(function(z){return z;});function geoAzimuthalEquidistant(){return projection(azimuthalEquidistantRaw).scale(79.4188).clipAngle(180-1e-3);}
function mercatorRaw(lambda,phi){return[lambda,log(tan((halfPi+phi)/2))];}
mercatorRaw.invert=function(x,y){return[x,2*atan(exp(y))-halfPi];};function geoMercator(){return mercatorProjection(mercatorRaw).scale(961/tau);}
function mercatorProjection(project){var m=projection(project),center=m.center,scale=m.scale,translate=m.translate,clipExtent=m.clipExtent,x0=null,y0,x1,y1;m.scale=function(_){return arguments.length?(scale(_),reclip()):scale();};m.translate=function(_){return arguments.length?(translate(_),reclip()):translate();};m.center=function(_){return arguments.length?(center(_),reclip()):center();};m.clipExtent=function(_){return arguments.length?((_==null?x0=y0=x1=y1=null:(x0=+_[0][0],y0=+_[0][1],x1=+_[1][0],y1=+_[1][1])),reclip()):x0==null?null:[[x0,y0],[x1,y1]];};function reclip(){var k=pi*scale(),t=m(rotation(m.rotate()).invert([0,0]));return clipExtent(x0==null?[[t[0]-k,t[1]-k],[t[0]+k,t[1]+k]]:project===mercatorRaw?[[Math.max(t[0]-k,x0),y0],[Math.min(t[0]+k,x1),y1]]:[[x0,Math.max(t[1]-k,y0)],[x1,Math.min(t[1]+k,y1)]]);}
return reclip();}
function tany(y){return tan((halfPi+y)/2);}
function conicConformalRaw(y0,y1){var cy0=cos(y0),n=y0===y1?sin(y0):log(cy0/cos(y1))/log(tany(y1)/tany(y0)),f=cy0*pow(tany(y0),n)/n;if(!n)return mercatorRaw;function project(x,y){if(f>0){if(y<-halfPi+epsilon)y=-halfPi+epsilon;}
else{if(y>halfPi-epsilon)y=halfPi-epsilon;}
var r=f/pow(tany(y),n);return[r*sin(n*x),f-r*cos(n*x)];}
project.invert=function(x,y){var fy=f-y,r=sign(n)*sqrt(x*x+fy*fy),l=atan2(x,abs(fy))*sign(fy);if(fy*n<0)
l-=pi*sign(x)*sign(fy);return[l/n,2*atan(pow(f/r,1/n))-halfPi];};return project;}
function geoConicConformal(){return conicProjection(conicConformalRaw).scale(109.5).parallels([30,30]);}
function equirectangularRaw(lambda,phi){return[lambda,phi];}
equirectangularRaw.invert=equirectangularRaw;function geoEquirectangular(){return projection(equirectangularRaw).scale(152.63);}
function conicEquidistantRaw(y0,y1){var cy0=cos(y0),n=y0===y1?sin(y0):(cy0-cos(y1))/(y1-y0),g=cy0/n+y0;if(abs(n)<epsilon)return equirectangularRaw;function project(x,y){var gy=g-y,nx=n*x;return[gy*sin(nx),g-gy*cos(nx)];}
project.invert=function(x,y){var gy=g-y,l=atan2(x,abs(gy))*sign(gy);if(gy*n<0)
l-=pi*sign(x)*sign(gy);return[l/n,g-sign(n)*sqrt(x*x+gy*gy)];};return project;}
function geoConicEquidistant(){return conicProjection(conicEquidistantRaw).scale(131.154).center([0,13.9389]);}
var A1=1.340264,A2=-0.081106,A3=0.000893,A4=0.003796,M=sqrt(3)/2,iterations=12;function equalEarthRaw(lambda,phi){var l=asin(M*sin(phi)),l2=l*l,l6=l2*l2*l2;return[lambda*cos(l)/(M*(A1+3*A2*l2+l6*(7*A3+9*A4*l2))),l*(A1+A2*l2+l6*(A3+A4*l2))];}
equalEarthRaw.invert=function(x,y){var l=y,l2=l*l,l6=l2*l2*l2;for(var i=0,delta,fy,fpy;i<iterations;++i){fy=l*(A1+A2*l2+l6*(A3+A4*l2))-y;fpy=A1+3*A2*l2+l6*(7*A3+9*A4*l2);l-=delta=fy/fpy,l2=l*l,l6=l2*l2*l2;if(abs(delta)<epsilon2)break;}
return[M*x*(A1+3*A2*l2+l6*(7*A3+9*A4*l2))/cos(l),asin(sin(l)/M)];};function geoEqualEarth(){return projection(equalEarthRaw).scale(177.158);}
function gnomonicRaw(x,y){var cy=cos(y),k=cos(x)*cy;return[cy*sin(x)/k,sin(y)/k];}
gnomonicRaw.invert=azimuthalInvert(atan);function geoGnomonic(){return projection(gnomonicRaw).scale(144.049).clipAngle(60);}
function naturalEarth1Raw(lambda,phi){var phi2=phi*phi,phi4=phi2*phi2;return[lambda*(0.8707-0.131979*phi2+phi4*(-0.013791+phi4*(0.003971*phi2-0.001529*phi4))),phi*(1.007226+phi2*(0.015085+phi4*(-0.044475+0.028874*phi2-0.005916*phi4)))];}
naturalEarth1Raw.invert=function(x,y){var phi=y,i=25,delta;do{var phi2=phi*phi,phi4=phi2*phi2;phi-=delta=(phi*(1.007226+phi2*(0.015085+phi4*(-0.044475+0.028874*phi2-0.005916*phi4)))-y)/(1.007226+phi2*(0.015085*3+phi4*(-0.044475*7+0.028874*9*phi2-0.005916*11*phi4)));}while(abs(delta)>epsilon&&--i>0);return[x/(0.8707+(phi2=phi*phi)*(-0.131979+phi2*(-0.013791+phi2*phi2*phi2*(0.003971-0.001529*phi2)))),phi];};function geoNaturalEarth1(){return projection(naturalEarth1Raw).scale(175.295);}
function orthographicRaw(x,y){return[cos(y)*sin(x),sin(y)];}
orthographicRaw.invert=azimuthalInvert(asin);function geoOrthographic(){return projection(orthographicRaw).scale(249.5).clipAngle(90+epsilon);}
function stereographicRaw(x,y){var cy=cos(y),k=1+cos(x)*cy;return[cy*sin(x)/k,sin(y)/k];}
stereographicRaw.invert=azimuthalInvert(function(z){return 2*atan(z);});function geoStereographic(){return projection(stereographicRaw).scale(250).clipAngle(142);}
function transverseMercatorRaw(lambda,phi){return[log(tan((halfPi+phi)/2)),-lambda];}
transverseMercatorRaw.invert=function(x,y){return[-y,2*atan(exp(x))-halfPi];};function geoTransverseMercator(){var m=mercatorProjection(transverseMercatorRaw),center=m.center,rotate=m.rotate;m.center=function(_){return arguments.length?center([-_[1],_[0]]):(_=center(),[_[1],-_[0]]);};m.rotate=function(_){return arguments.length?rotate([_[0],_[1],_.length>2?_[2]+90:90]):(_=rotate(),[_[0],_[1],_[2]-90]);};return rotate([0,0,90]).scale(159.155);}
const lookup$1={geoAzimuthalEqualArea,geoAzimuthalEquidistant,geoGnomonic,geoOrthographic,geoStereographic,geoEqualEarth,geoAlbers,geoAlbersUsa,geoConicConformal,geoConicEqualArea,geoConicEquidistant,geoEquirectangular,geoMercator,geoTransverseMercator,geoNaturalEarth1,};Object.keys(lookup$1).forEach((key)=>{lookup$1[`${key.charAt(3).toLowerCase()}${key.slice(4)}`]=lookup$1[key];});class ProjectionScale extends chart_js.Scale{constructor(cfg){super(cfg);this.outlineBounds=null;this.oldChartBounds=null;this.geoPath=geoPath();}
init(options){options.position='chartArea';super.init(options);if(typeof options.projection==='function'){this.projection=options.projection;}
else{this.projection=(lookup$1[options.projection]||lookup$1.albersUsa)();}
this.geoPath.projection(this.projection);this.outlineBounds=null;this.oldChartBounds=null;}
computeBounds(outline){const bb=geoPath(this.projection.fitWidth(1000,outline)).bounds(outline);const bHeight=Math.ceil(bb[1][1]-bb[0][1]);const bWidth=Math.ceil(bb[1][0]-bb[0][0]);const t=this.projection.translate();this.outlineBounds={width:bWidth,height:bHeight,aspectRatio:bWidth/bHeight,refScale:this.projection.scale(),refX:t[0],refY:t[1],};}
updateBounds(){const area=this.chart.chartArea;const bb=this.outlineBounds;if(!bb){return false;}
const padding=this.options.padding;const paddingTop=typeof padding==='number'?padding:padding.top;const paddingLeft=typeof padding==='number'?padding:padding.left;const paddingBottom=typeof padding==='number'?padding:padding.bottom;const paddingRight=typeof padding==='number'?padding:padding.right;const chartWidth=area.right-area.left-paddingLeft-paddingRight;const chartHeight=area.bottom-area.top-paddingTop-paddingBottom;const bak=this.oldChartBounds;this.oldChartBounds={chartWidth,chartHeight,};const scale=Math.min(chartWidth/bb.width,chartHeight/bb.height);const viewWidth=bb.width*scale;const viewHeight=bb.height*scale;const x=(chartWidth-viewWidth)*0.5+area.left+paddingLeft;const y=(chartHeight-viewHeight)*0.5+area.top+paddingTop;const o=this.options;this.projection.scale(bb.refScale*scale*o.projectionScale).translate([scale*bb.refX+x+o.projectionOffset[0],scale*bb.refY+y+o.projectionOffset[1]]);return(!bak||bak.chartWidth!==this.oldChartBounds.chartWidth||bak.chartHeight!==this.oldChartBounds.chartHeight);}}
ProjectionScale.id='projection';ProjectionScale.defaults={projection:'albersUsa',projectionScale:1,projectionOffset:[0,0],padding:0,};ProjectionScale.descriptors={_scriptable:(name)=>name!=='projection',_indexable:(name)=>name!=='projectionOffset',};function colors(specifier){var n=specifier.length/6|0,colors=new Array(n),i=0;while(i<n)colors[i]="#"+specifier.slice(i*6,++i*6);return colors;}
function define(constructor,factory,prototype){constructor.prototype=factory.prototype=prototype;prototype.constructor=constructor;}
function extend(parent,definition){var prototype=Object.create(parent.prototype);for(var key in definition)prototype[key]=definition[key];return prototype;}
function Color(){}
var darker=0.7;var brighter=1/darker;var reI="\\s*([+-]?\\d+)\\s*",reN="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)\\s*",reP="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)%\\s*",reHex=/^#([0-9a-f]{3,8})$/,reRgbInteger=new RegExp(`^rgb\\(${reI},${reI},${reI}\\)$`),reRgbPercent=new RegExp(`^rgb\\(${reP},${reP},${reP}\\)$`),reRgbaInteger=new RegExp(`^rgba\\(${reI},${reI},${reI},${reN}\\)$`),reRgbaPercent=new RegExp(`^rgba\\(${reP},${reP},${reP},${reN}\\)$`),reHslPercent=new RegExp(`^hsl\\(${reN},${reP},${reP}\\)$`),reHslaPercent=new RegExp(`^hsla\\(${reN},${reP},${reP},${reN}\\)$`);var named={aliceblue:0xf0f8ff,antiquewhite:0xfaebd7,aqua:0x00ffff,aquamarine:0x7fffd4,azure:0xf0ffff,beige:0xf5f5dc,bisque:0xffe4c4,black:0x000000,blanchedalmond:0xffebcd,blue:0x0000ff,blueviolet:0x8a2be2,brown:0xa52a2a,burlywood:0xdeb887,cadetblue:0x5f9ea0,chartreuse:0x7fff00,chocolate:0xd2691e,coral:0xff7f50,cornflowerblue:0x6495ed,cornsilk:0xfff8dc,crimson:0xdc143c,cyan:0x00ffff,darkblue:0x00008b,darkcyan:0x008b8b,darkgoldenrod:0xb8860b,darkgray:0xa9a9a9,darkgreen:0x006400,darkgrey:0xa9a9a9,darkkhaki:0xbdb76b,darkmagenta:0x8b008b,darkolivegreen:0x556b2f,darkorange:0xff8c00,darkorchid:0x9932cc,darkred:0x8b0000,darksalmon:0xe9967a,darkseagreen:0x8fbc8f,darkslateblue:0x483d8b,darkslategray:0x2f4f4f,darkslategrey:0x2f4f4f,darkturquoise:0x00ced1,darkviolet:0x9400d3,deeppink:0xff1493,deepskyblue:0x00bfff,dimgray:0x696969,dimgrey:0x696969,dodgerblue:0x1e90ff,firebrick:0xb22222,floralwhite:0xfffaf0,forestgreen:0x228b22,fuchsia:0xff00ff,gainsboro:0xdcdcdc,ghostwhite:0xf8f8ff,gold:0xffd700,goldenrod:0xdaa520,gray:0x808080,green:0x008000,greenyellow:0xadff2f,grey:0x808080,honeydew:0xf0fff0,hotpink:0xff69b4,indianred:0xcd5c5c,indigo:0x4b0082,ivory:0xfffff0,khaki:0xf0e68c,lavender:0xe6e6fa,lavenderblush:0xfff0f5,lawngreen:0x7cfc00,lemonchiffon:0xfffacd,lightblue:0xadd8e6,lightcoral:0xf08080,lightcyan:0xe0ffff,lightgoldenrodyellow:0xfafad2,lightgray:0xd3d3d3,lightgreen:0x90ee90,lightgrey:0xd3d3d3,lightpink:0xffb6c1,lightsalmon:0xffa07a,lightseagreen:0x20b2aa,lightskyblue:0x87cefa,lightslategray:0x778899,lightslategrey:0x778899,lightsteelblue:0xb0c4de,lightyellow:0xffffe0,lime:0x00ff00,limegreen:0x32cd32,linen:0xfaf0e6,magenta:0xff00ff,maroon:0x800000,mediumaquamarine:0x66cdaa,mediumblue:0x0000cd,mediumorchid:0xba55d3,mediumpurple:0x9370db,mediumseagreen:0x3cb371,mediumslateblue:0x7b68ee,mediumspringgreen:0x00fa9a,mediumturquoise:0x48d1cc,mediumvioletred:0xc71585,midnightblue:0x191970,mintcream:0xf5fffa,mistyrose:0xffe4e1,moccasin:0xffe4b5,navajowhite:0xffdead,navy:0x000080,oldlace:0xfdf5e6,olive:0x808000,olivedrab:0x6b8e23,orange:0xffa500,orangered:0xff4500,orchid:0xda70d6,palegoldenrod:0xeee8aa,palegreen:0x98fb98,paleturquoise:0xafeeee,palevioletred:0xdb7093,papayawhip:0xffefd5,peachpuff:0xffdab9,peru:0xcd853f,pink:0xffc0cb,plum:0xdda0dd,powderblue:0xb0e0e6,purple:0x800080,rebeccapurple:0x663399,red:0xff0000,rosybrown:0xbc8f8f,royalblue:0x4169e1,saddlebrown:0x8b4513,salmon:0xfa8072,sandybrown:0xf4a460,seagreen:0x2e8b57,seashell:0xfff5ee,sienna:0xa0522d,silver:0xc0c0c0,skyblue:0x87ceeb,slateblue:0x6a5acd,slategray:0x708090,slategrey:0x708090,snow:0xfffafa,springgreen:0x00ff7f,steelblue:0x4682b4,tan:0xd2b48c,teal:0x008080,thistle:0xd8bfd8,tomato:0xff6347,turquoise:0x40e0d0,violet:0xee82ee,wheat:0xf5deb3,white:0xffffff,whitesmoke:0xf5f5f5,yellow:0xffff00,yellowgreen:0x9acd32};define(Color,color,{copy(channels){return Object.assign(new this.constructor,this,channels);},displayable(){return this.rgb().displayable();},hex:color_formatHex,formatHex:color_formatHex,formatHex8:color_formatHex8,formatHsl:color_formatHsl,formatRgb:color_formatRgb,toString:color_formatRgb});function color_formatHex(){return this.rgb().formatHex();}
function color_formatHex8(){return this.rgb().formatHex8();}
function color_formatHsl(){return hslConvert(this).formatHsl();}
function color_formatRgb(){return this.rgb().formatRgb();}
function color(format){var m,l;format=(format+"").trim().toLowerCase();return(m=reHex.exec(format))?(l=m[1].length,m=parseInt(m[1],16),l===6?rgbn(m):l===3?new Rgb((m>>8&0xf)|(m>>4&0xf0),(m>>4&0xf)|(m&0xf0),((m&0xf)<<4)|(m&0xf),1):l===8?rgba(m>>24&0xff,m>>16&0xff,m>>8&0xff,(m&0xff)/0xff):l===4?rgba((m>>12&0xf)|(m>>8&0xf0),(m>>8&0xf)|(m>>4&0xf0),(m>>4&0xf)|(m&0xf0),(((m&0xf)<<4)|(m&0xf))/0xff):null):(m=reRgbInteger.exec(format))?new Rgb(m[1],m[2],m[3],1):(m=reRgbPercent.exec(format))?new Rgb(m[1]*255/100,m[2]*255/100,m[3]*255/100,1):(m=reRgbaInteger.exec(format))?rgba(m[1],m[2],m[3],m[4]):(m=reRgbaPercent.exec(format))?rgba(m[1]*255/100,m[2]*255/100,m[3]*255/100,m[4]):(m=reHslPercent.exec(format))?hsla(m[1],m[2]/100,m[3]/100,1):(m=reHslaPercent.exec(format))?hsla(m[1],m[2]/100,m[3]/100,m[4]):named.hasOwnProperty(format)?rgbn(named[format]):format==="transparent"?new Rgb(NaN,NaN,NaN,0):null;}
function rgbn(n){return new Rgb(n>>16&0xff,n>>8&0xff,n&0xff,1);}
function rgba(r,g,b,a){if(a<=0)r=g=b=NaN;return new Rgb(r,g,b,a);}
function rgbConvert(o){if(!(o instanceof Color))o=color(o);if(!o)return new Rgb;o=o.rgb();return new Rgb(o.r,o.g,o.b,o.opacity);}
function rgb(r,g,b,opacity){return arguments.length===1?rgbConvert(r):new Rgb(r,g,b,opacity==null?1:opacity);}
function Rgb(r,g,b,opacity){this.r=+r;this.g=+g;this.b=+b;this.opacity=+opacity;}
define(Rgb,rgb,extend(Color,{brighter(k){k=k==null?brighter:Math.pow(brighter,k);return new Rgb(this.r*k,this.g*k,this.b*k,this.opacity);},darker(k){k=k==null?darker:Math.pow(darker,k);return new Rgb(this.r*k,this.g*k,this.b*k,this.opacity);},rgb(){return this;},clamp(){return new Rgb(clampi(this.r),clampi(this.g),clampi(this.b),clampa(this.opacity));},displayable(){return(-0.5<=this.r&&this.r<255.5)&&(-0.5<=this.g&&this.g<255.5)&&(-0.5<=this.b&&this.b<255.5)&&(0<=this.opacity&&this.opacity<=1);},hex:rgb_formatHex,formatHex:rgb_formatHex,formatHex8:rgb_formatHex8,formatRgb:rgb_formatRgb,toString:rgb_formatRgb}));function rgb_formatHex(){return`#${hex(this.r)}${hex(this.g)}${hex(this.b)}`;}
function rgb_formatHex8(){return`#${hex(this.r)}${hex(this.g)}${hex(this.b)}${hex((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`;}
function rgb_formatRgb(){const a=clampa(this.opacity);return`${a === 1 ? "rgb(" : "rgba("}${clampi(this.r)}, ${clampi(this.g)}, ${clampi(this.b)}${a === 1 ? ")" : `,${a})`}`;}
function clampa(opacity){return isNaN(opacity)?1:Math.max(0,Math.min(1,opacity));}
function clampi(value){return Math.max(0,Math.min(255,Math.round(value)||0));}
function hex(value){value=clampi(value);return(value<16?"0":"")+value.toString(16);}
function hsla(h,s,l,a){if(a<=0)h=s=l=NaN;else if(l<=0||l>=1)h=s=NaN;else if(s<=0)h=NaN;return new Hsl(h,s,l,a);}
function hslConvert(o){if(o instanceof Hsl)return new Hsl(o.h,o.s,o.l,o.opacity);if(!(o instanceof Color))o=color(o);if(!o)return new Hsl;if(o instanceof Hsl)return o;o=o.rgb();var r=o.r/255,g=o.g/255,b=o.b/255,min=Math.min(r,g,b),max=Math.max(r,g,b),h=NaN,s=max-min,l=(max+min)/2;if(s){if(r===max)h=(g-b)/s+(g<b)*6;else if(g===max)h=(b-r)/s+2;else h=(r-g)/s+4;s/=l<0.5?max+min:2-max-min;h*=60;}else{s=l>0&&l<1?0:h;}
return new Hsl(h,s,l,o.opacity);}
function hsl(h,s,l,opacity){return arguments.length===1?hslConvert(h):new Hsl(h,s,l,opacity==null?1:opacity);}
function Hsl(h,s,l,opacity){this.h=+h;this.s=+s;this.l=+l;this.opacity=+opacity;}
define(Hsl,hsl,extend(Color,{brighter(k){k=k==null?brighter:Math.pow(brighter,k);return new Hsl(this.h,this.s,this.l*k,this.opacity);},darker(k){k=k==null?darker:Math.pow(darker,k);return new Hsl(this.h,this.s,this.l*k,this.opacity);},rgb(){var h=this.h%360+(this.h<0)*360,s=isNaN(h)||isNaN(this.s)?0:this.s,l=this.l,m2=l+(l<0.5?l:1-l)*s,m1=2*l-m2;return new Rgb(hsl2rgb(h>=240?h-240:h+120,m1,m2),hsl2rgb(h,m1,m2),hsl2rgb(h<120?h+240:h-120,m1,m2),this.opacity);},clamp(){return new Hsl(clamph(this.h),clampt(this.s),clampt(this.l),clampa(this.opacity));},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&(0<=this.l&&this.l<=1)&&(0<=this.opacity&&this.opacity<=1);},formatHsl(){const a=clampa(this.opacity);return`${a === 1 ? "hsl(" : "hsla("}${clamph(this.h)}, ${clampt(this.s) * 100}%, ${clampt(this.l) * 100}%${a === 1 ? ")" : `,${a})`}`;}}));function clamph(value){value=(value||0)%360;return value<0?value+360:value;}
function clampt(value){return Math.max(0,Math.min(1,value||0));}
function hsl2rgb(h,m1,m2){return(h<60?m1+(m2-m1)*h/60:h<180?m2:h<240?m1+(m2-m1)*(240-h)/60:m1)*255;}
const radians=Math.PI/180;const degrees=180/Math.PI;var A=-0.14861,B=+1.78277,C=-0.29227,D=-0.90649,E=+1.97294,ED=E*D,EB=E*B,BC_DA=B*C-D*A;function cubehelixConvert(o){if(o instanceof Cubehelix)return new Cubehelix(o.h,o.s,o.l,o.opacity);if(!(o instanceof Rgb))o=rgbConvert(o);var r=o.r/255,g=o.g/255,b=o.b/255,l=(BC_DA*b+ED*r-EB*g)/(BC_DA+ED-EB),bl=b-l,k=(E*(g-l)-C*bl)/D,s=Math.sqrt(k*k+bl*bl)/(E*l*(1-l)),h=s?Math.atan2(k,bl)*degrees-120:NaN;return new Cubehelix(h<0?h+360:h,s,l,o.opacity);}
function cubehelix$1(h,s,l,opacity){return arguments.length===1?cubehelixConvert(h):new Cubehelix(h,s,l,opacity==null?1:opacity);}
function Cubehelix(h,s,l,opacity){this.h=+h;this.s=+s;this.l=+l;this.opacity=+opacity;}
define(Cubehelix,cubehelix$1,extend(Color,{brighter(k){k=k==null?brighter:Math.pow(brighter,k);return new Cubehelix(this.h,this.s,this.l*k,this.opacity);},darker(k){k=k==null?darker:Math.pow(darker,k);return new Cubehelix(this.h,this.s,this.l*k,this.opacity);},rgb(){var h=isNaN(this.h)?0:(this.h+120)*radians,l=+this.l,a=isNaN(this.s)?0:this.s*l*(1-l),cosh=Math.cos(h),sinh=Math.sin(h);return new Rgb(255*(l+a*(A*cosh+B*sinh)),255*(l+a*(C*cosh+D*sinh)),255*(l+a*(E*cosh)),this.opacity);}}));function basis(t1,v0,v1,v2,v3){var t2=t1*t1,t3=t2*t1;return((1-3*t1+3*t2-t3)*v0
+(4-6*t2+3*t3)*v1
+(1+3*t1+3*t2-3*t3)*v2
+t3*v3)/6;}
function basis$1(values){var n=values.length-1;return function(t){var i=t<=0?(t=0):t>=1?(t=1,n-1):Math.floor(t*n),v1=values[i],v2=values[i+1],v0=i>0?values[i-1]:2*v1-v2,v3=i<n-1?values[i+2]:2*v2-v1;return basis((t-i/n)*n,v0,v1,v2,v3);};}
var constant=x=>()=>x;function linear(a,d){return function(t){return a+t*d;};}
function exponential(a,b,y){return a=Math.pow(a,y),b=Math.pow(b,y)-a,y=1/y,function(t){return Math.pow(a+t*b,y);};}
function hue(a,b){var d=b-a;return d?linear(a,d>180||d<-180?d-360*Math.round(d/360):d):constant(isNaN(a)?b:a);}
function gamma(y){return(y=+y)===1?nogamma:function(a,b){return b-a?exponential(a,b,y):constant(isNaN(a)?b:a);};}
function nogamma(a,b){var d=b-a;return d?linear(a,d):constant(isNaN(a)?b:a);}
((function rgbGamma(y){var color=gamma(y);function rgb$1(start,end){var r=color((start=rgb(start)).r,(end=rgb(end)).r),g=color(start.g,end.g),b=color(start.b,end.b),opacity=nogamma(start.opacity,end.opacity);return function(t){start.r=r(t);start.g=g(t);start.b=b(t);start.opacity=opacity(t);return start+"";};}
rgb$1.gamma=rgbGamma;return rgb$1;}))(1);function rgbSpline(spline){return function(colors){var n=colors.length,r=new Array(n),g=new Array(n),b=new Array(n),i,color;for(i=0;i<n;++i){color=rgb(colors[i]);r[i]=color.r||0;g[i]=color.g||0;b[i]=color.b||0;}
r=spline(r);g=spline(g);b=spline(b);color.opacity=1;return function(t){color.r=r(t);color.g=g(t);color.b=b(t);return color+"";};};}
var rgbBasis=rgbSpline(basis$1);function cubehelix(hue){return(function cubehelixGamma(y){y=+y;function cubehelix(start,end){var h=hue((start=cubehelix$1(start)).h,(end=cubehelix$1(end)).h),s=nogamma(start.s,end.s),l=nogamma(start.l,end.l),opacity=nogamma(start.opacity,end.opacity);return function(t){start.h=h(t);start.s=s(t);start.l=l(Math.pow(t,y));start.opacity=opacity(t);return start+"";};}
cubehelix.gamma=cubehelixGamma;return cubehelix;})(1);}
cubehelix(hue);var cubehelixLong=cubehelix(nogamma);var ramp$1=scheme=>rgbBasis(scheme[scheme.length-1]);var scheme$q=new Array(3).concat("d8b365f5f5f55ab4ac","a6611adfc27d80cdc1018571","a6611adfc27df5f5f580cdc1018571","8c510ad8b365f6e8c3c7eae55ab4ac01665e","8c510ad8b365f6e8c3f5f5f5c7eae55ab4ac01665e","8c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e","8c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e","5430058c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e003c30","5430058c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e003c30").map(colors);var interpolateBrBG=ramp$1(scheme$q);var scheme$p=new Array(3).concat("af8dc3f7f7f77fbf7b","7b3294c2a5cfa6dba0008837","7b3294c2a5cff7f7f7a6dba0008837","762a83af8dc3e7d4e8d9f0d37fbf7b1b7837","762a83af8dc3e7d4e8f7f7f7d9f0d37fbf7b1b7837","762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b7837","762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b7837","40004b762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b783700441b","40004b762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b783700441b").map(colors);var interpolatePRGn=ramp$1(scheme$p);var scheme$o=new Array(3).concat("e9a3c9f7f7f7a1d76a","d01c8bf1b6dab8e1864dac26","d01c8bf1b6daf7f7f7b8e1864dac26","c51b7de9a3c9fde0efe6f5d0a1d76a4d9221","c51b7de9a3c9fde0eff7f7f7e6f5d0a1d76a4d9221","c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221","c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221","8e0152c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221276419","8e0152c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221276419").map(colors);var interpolatePiYG=ramp$1(scheme$o);var scheme$n=new Array(3).concat("998ec3f7f7f7f1a340","5e3c99b2abd2fdb863e66101","5e3c99b2abd2f7f7f7fdb863e66101","542788998ec3d8daebfee0b6f1a340b35806","542788998ec3d8daebf7f7f7fee0b6f1a340b35806","5427888073acb2abd2d8daebfee0b6fdb863e08214b35806","5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b35806","2d004b5427888073acb2abd2d8daebfee0b6fdb863e08214b358067f3b08","2d004b5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b358067f3b08").map(colors);var interpolatePuOr=ramp$1(scheme$n);var scheme$m=new Array(3).concat("ef8a62f7f7f767a9cf","ca0020f4a58292c5de0571b0","ca0020f4a582f7f7f792c5de0571b0","b2182bef8a62fddbc7d1e5f067a9cf2166ac","b2182bef8a62fddbc7f7f7f7d1e5f067a9cf2166ac","b2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac","b2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac","67001fb2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac053061","67001fb2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac053061").map(colors);var interpolateRdBu=ramp$1(scheme$m);var scheme$l=new Array(3).concat("ef8a62ffffff999999","ca0020f4a582bababa404040","ca0020f4a582ffffffbababa404040","b2182bef8a62fddbc7e0e0e09999994d4d4d","b2182bef8a62fddbc7ffffffe0e0e09999994d4d4d","b2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d","b2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d","67001fb2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d1a1a1a","67001fb2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d1a1a1a").map(colors);var interpolateRdGy=ramp$1(scheme$l);var scheme$k=new Array(3).concat("fc8d59ffffbf91bfdb","d7191cfdae61abd9e92c7bb6","d7191cfdae61ffffbfabd9e92c7bb6","d73027fc8d59fee090e0f3f891bfdb4575b4","d73027fc8d59fee090ffffbfe0f3f891bfdb4575b4","d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4","d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4","a50026d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4313695","a50026d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4313695").map(colors);var interpolateRdYlBu=ramp$1(scheme$k);var scheme$j=new Array(3).concat("fc8d59ffffbf91cf60","d7191cfdae61a6d96a1a9641","d7191cfdae61ffffbfa6d96a1a9641","d73027fc8d59fee08bd9ef8b91cf601a9850","d73027fc8d59fee08bffffbfd9ef8b91cf601a9850","d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850","d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850","a50026d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850006837","a50026d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850006837").map(colors);var interpolateRdYlGn=ramp$1(scheme$j);var scheme$i=new Array(3).concat("fc8d59ffffbf99d594","d7191cfdae61abdda42b83ba","d7191cfdae61ffffbfabdda42b83ba","d53e4ffc8d59fee08be6f59899d5943288bd","d53e4ffc8d59fee08bffffbfe6f59899d5943288bd","d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd","d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd","9e0142d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd5e4fa2","9e0142d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd5e4fa2").map(colors);var interpolateSpectral=ramp$1(scheme$i);var scheme$h=new Array(3).concat("e5f5f999d8c92ca25f","edf8fbb2e2e266c2a4238b45","edf8fbb2e2e266c2a42ca25f006d2c","edf8fbccece699d8c966c2a42ca25f006d2c","edf8fbccece699d8c966c2a441ae76238b45005824","f7fcfde5f5f9ccece699d8c966c2a441ae76238b45005824","f7fcfde5f5f9ccece699d8c966c2a441ae76238b45006d2c00441b").map(colors);var interpolateBuGn=ramp$1(scheme$h);var scheme$g=new Array(3).concat("e0ecf49ebcda8856a7","edf8fbb3cde38c96c688419d","edf8fbb3cde38c96c68856a7810f7c","edf8fbbfd3e69ebcda8c96c68856a7810f7c","edf8fbbfd3e69ebcda8c96c68c6bb188419d6e016b","f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d6e016b","f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d810f7c4d004b").map(colors);var interpolateBuPu=ramp$1(scheme$g);var scheme$f=new Array(3).concat("e0f3dba8ddb543a2ca","f0f9e8bae4bc7bccc42b8cbe","f0f9e8bae4bc7bccc443a2ca0868ac","f0f9e8ccebc5a8ddb57bccc443a2ca0868ac","f0f9e8ccebc5a8ddb57bccc44eb3d32b8cbe08589e","f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe08589e","f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe0868ac084081").map(colors);var interpolateGnBu=ramp$1(scheme$f);var scheme$e=new Array(3).concat("fee8c8fdbb84e34a33","fef0d9fdcc8afc8d59d7301f","fef0d9fdcc8afc8d59e34a33b30000","fef0d9fdd49efdbb84fc8d59e34a33b30000","fef0d9fdd49efdbb84fc8d59ef6548d7301f990000","fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301f990000","fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301fb300007f0000").map(colors);var interpolateOrRd=ramp$1(scheme$e);var scheme$d=new Array(3).concat("ece2f0a6bddb1c9099","f6eff7bdc9e167a9cf02818a","f6eff7bdc9e167a9cf1c9099016c59","f6eff7d0d1e6a6bddb67a9cf1c9099016c59","f6eff7d0d1e6a6bddb67a9cf3690c002818a016450","fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016450","fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016c59014636").map(colors);var interpolatePuBuGn=ramp$1(scheme$d);var scheme$c=new Array(3).concat("ece7f2a6bddb2b8cbe","f1eef6bdc9e174a9cf0570b0","f1eef6bdc9e174a9cf2b8cbe045a8d","f1eef6d0d1e6a6bddb74a9cf2b8cbe045a8d","f1eef6d0d1e6a6bddb74a9cf3690c00570b0034e7b","fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0034e7b","fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0045a8d023858").map(colors);var interpolatePuBu=ramp$1(scheme$c);var scheme$b=new Array(3).concat("e7e1efc994c7dd1c77","f1eef6d7b5d8df65b0ce1256","f1eef6d7b5d8df65b0dd1c77980043","f1eef6d4b9dac994c7df65b0dd1c77980043","f1eef6d4b9dac994c7df65b0e7298ace125691003f","f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125691003f","f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125698004367001f").map(colors);var interpolatePuRd=ramp$1(scheme$b);var scheme$a=new Array(3).concat("fde0ddfa9fb5c51b8a","feebe2fbb4b9f768a1ae017e","feebe2fbb4b9f768a1c51b8a7a0177","feebe2fcc5c0fa9fb5f768a1c51b8a7a0177","feebe2fcc5c0fa9fb5f768a1dd3497ae017e7a0177","fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a0177","fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a017749006a").map(colors);var interpolateRdPu=ramp$1(scheme$a);var scheme$9=new Array(3).concat("edf8b17fcdbb2c7fb8","ffffcca1dab441b6c4225ea8","ffffcca1dab441b6c42c7fb8253494","ffffccc7e9b47fcdbb41b6c42c7fb8253494","ffffccc7e9b47fcdbb41b6c41d91c0225ea80c2c84","ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea80c2c84","ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea8253494081d58").map(colors);var interpolateYlGnBu=ramp$1(scheme$9);var scheme$8=new Array(3).concat("f7fcb9addd8e31a354","ffffccc2e69978c679238443","ffffccc2e69978c67931a354006837","ffffccd9f0a3addd8e78c67931a354006837","ffffccd9f0a3addd8e78c67941ab5d238443005a32","ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443005a32","ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443006837004529").map(colors);var interpolateYlGn=ramp$1(scheme$8);var scheme$7=new Array(3).concat("fff7bcfec44fd95f0e","ffffd4fed98efe9929cc4c02","ffffd4fed98efe9929d95f0e993404","ffffd4fee391fec44ffe9929d95f0e993404","ffffd4fee391fec44ffe9929ec7014cc4c028c2d04","ffffe5fff7bcfee391fec44ffe9929ec7014cc4c028c2d04","ffffe5fff7bcfee391fec44ffe9929ec7014cc4c02993404662506").map(colors);var interpolateYlOrBr=ramp$1(scheme$7);var scheme$6=new Array(3).concat("ffeda0feb24cf03b20","ffffb2fecc5cfd8d3ce31a1c","ffffb2fecc5cfd8d3cf03b20bd0026","ffffb2fed976feb24cfd8d3cf03b20bd0026","ffffb2fed976feb24cfd8d3cfc4e2ae31a1cb10026","ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cb10026","ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cbd0026800026").map(colors);var interpolateYlOrRd=ramp$1(scheme$6);var scheme$5=new Array(3).concat("deebf79ecae13182bd","eff3ffbdd7e76baed62171b5","eff3ffbdd7e76baed63182bd08519c","eff3ffc6dbef9ecae16baed63182bd08519c","eff3ffc6dbef9ecae16baed64292c62171b5084594","f7fbffdeebf7c6dbef9ecae16baed64292c62171b5084594","f7fbffdeebf7c6dbef9ecae16baed64292c62171b508519c08306b").map(colors);var interpolateBlues=ramp$1(scheme$5);var scheme$4=new Array(3).concat("e5f5e0a1d99b31a354","edf8e9bae4b374c476238b45","edf8e9bae4b374c47631a354006d2c","edf8e9c7e9c0a1d99b74c47631a354006d2c","edf8e9c7e9c0a1d99b74c47641ab5d238b45005a32","f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45005a32","f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45006d2c00441b").map(colors);var interpolateGreens=ramp$1(scheme$4);var scheme$3=new Array(3).concat("f0f0f0bdbdbd636363","f7f7f7cccccc969696525252","f7f7f7cccccc969696636363252525","f7f7f7d9d9d9bdbdbd969696636363252525","f7f7f7d9d9d9bdbdbd969696737373525252252525","fffffff0f0f0d9d9d9bdbdbd969696737373525252252525","fffffff0f0f0d9d9d9bdbdbd969696737373525252252525000000").map(colors);var interpolateGreys=ramp$1(scheme$3);var scheme$2=new Array(3).concat("efedf5bcbddc756bb1","f2f0f7cbc9e29e9ac86a51a3","f2f0f7cbc9e29e9ac8756bb154278f","f2f0f7dadaebbcbddc9e9ac8756bb154278f","f2f0f7dadaebbcbddc9e9ac8807dba6a51a34a1486","fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a34a1486","fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a354278f3f007d").map(colors);var interpolatePurples=ramp$1(scheme$2);var scheme$1=new Array(3).concat("fee0d2fc9272de2d26","fee5d9fcae91fb6a4acb181d","fee5d9fcae91fb6a4ade2d26a50f15","fee5d9fcbba1fc9272fb6a4ade2d26a50f15","fee5d9fcbba1fc9272fb6a4aef3b2ccb181d99000d","fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181d99000d","fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181da50f1567000d").map(colors);var interpolateReds=ramp$1(scheme$1);var scheme=new Array(3).concat("fee6cefdae6be6550d","feeddefdbe85fd8d3cd94701","feeddefdbe85fd8d3ce6550da63603","feeddefdd0a2fdae6bfd8d3ce6550da63603","feeddefdd0a2fdae6bfd8d3cf16913d948018c2d04","fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d948018c2d04","fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d94801a636037f2704").map(colors);var interpolateOranges=ramp$1(scheme);function interpolateCividis(t){t=Math.max(0,Math.min(1,t));return"rgb("
+Math.max(0,Math.min(255,Math.round(-4.54-t*(35.34-t*(2381.73-t*(6402.7-t*(7024.72-t*2710.57)))))))+", "
+Math.max(0,Math.min(255,Math.round(32.49+t*(170.73+t*(52.82-t*(131.46-t*(176.58-t*67.37)))))))+", "
+Math.max(0,Math.min(255,Math.round(81.24+t*(442.36-t*(2482.43-t*(6167.24-t*(6614.94-t*2475.67)))))))
+")";}
var interpolateCubehelixDefault=cubehelixLong(cubehelix$1(300,0.5,0.0),cubehelix$1(-240,0.5,1.0));var warm=cubehelixLong(cubehelix$1(-100,0.75,0.35),cubehelix$1(80,1.50,0.8));var cool=cubehelixLong(cubehelix$1(260,0.75,0.35),cubehelix$1(80,1.50,0.8));var c$1=cubehelix$1();function interpolateRainbow(t){if(t<0||t>1)t-=Math.floor(t);var ts=Math.abs(t-0.5);c$1.h=360*t-100;c$1.s=1.5-1.5*ts;c$1.l=0.8-0.9*ts;return c$1+"";}
var c=rgb(),pi_1_3=Math.PI/3,pi_2_3=Math.PI*2/3;function interpolateSinebow(t){var x;t=(0.5-t)*Math.PI;c.r=255*(x=Math.sin(t))*x;c.g=255*(x=Math.sin(t+pi_1_3))*x;c.b=255*(x=Math.sin(t+pi_2_3))*x;return c+"";}
function interpolateTurbo(t){t=Math.max(0,Math.min(1,t));return"rgb("
+Math.max(0,Math.min(255,Math.round(34.61+t*(1172.33-t*(10793.56-t*(33300.12-t*(38394.49-t*14825.05)))))))+", "
+Math.max(0,Math.min(255,Math.round(23.31+t*(557.33+t*(1225.33-t*(3574.96-t*(1073.77+t*707.56)))))))+", "
+Math.max(0,Math.min(255,Math.round(27.2+t*(3211.1-t*(15327.97-t*(27814-t*(22569.18-t*6838.66)))))))
+")";}
function ramp(range){var n=range.length;return function(t){return range[Math.max(0,Math.min(n-1,Math.floor(t*n)))];};}
var interpolateViridis=ramp(colors("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725"));var magma=ramp(colors("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf"));var inferno=ramp(colors("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4"));var plasma=ramp(colors("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921"));const baseDefaults={position:'chartArea',property:'value',grid:{z:1,drawOnChartArea:false,},ticks:{z:1,},legend:{align:'right',position:'bottom-right',length:100,width:50,margin:8,indicatorWidth:10,},};function computeLegendMargin(legend){const{indicatorWidth,align:pos,margin}=legend;const left=(typeof margin==='number'?margin:margin.left)+(pos==='right'?indicatorWidth:0);const top=(typeof margin==='number'?margin:margin.top)+(pos==='bottom'?indicatorWidth:0);const right=(typeof margin==='number'?margin:margin.right)+(pos==='left'?indicatorWidth:0);const bottom=(typeof margin==='number'?margin:margin.bottom)+(pos==='top'?indicatorWidth:0);return{left,top,right,bottom};}
function computeLegendPosition(chartArea,legend,width,height,legendSize){const{indicatorWidth,align:axisPos,position:pos}=legend;const isHor=axisPos==='top'||axisPos==='bottom';const w=(axisPos==='left'?legendSize.w:width)+(isHor?indicatorWidth:0);const h=(axisPos==='top'?legendSize.h:height)+(!isHor?indicatorWidth:0);const margin=computeLegendMargin(legend);if(typeof pos==='string'){switch(pos){case'top-left':return[margin.left,margin.top];case'top':return[(chartArea.right-w)/2,margin.top];case'left':return[margin.left,(chartArea.bottom-h)/2];case'top-right':return[chartArea.right-w-margin.right,margin.top];case'bottom-right':return[chartArea.right-w-margin.right,chartArea.bottom-h-margin.bottom];case'bottom':return[(chartArea.right-w)/2,chartArea.bottom-h-margin.bottom];case'bottom-left':return[margin.left,chartArea.bottom-h-margin.bottom];default:return[chartArea.right-w-margin.right,(chartArea.bottom-h)/2];}}
return[pos.x,pos.y];}
class LegendScale extends chart_js.LinearScale{constructor(){super(...arguments);this.legendSize={w:0,h:0};}
init(options){options.position='chartArea';super.init(options);this.axis='r';}
parse(raw,index){if(raw&&typeof raw[this.options.property]==='number'){return raw[this.options.property];}
return super.parse(raw,index);}
isHorizontal(){return this.options.legend.align==='top'||this.options.legend.align==='bottom';}
_getNormalizedValue(v){if(v==null||Number.isNaN(v)){return null;}
return(v-this._startValue)/this._valueRange;}
update(maxWidth,maxHeight,margins){const ch=Math.min(maxHeight,this.bottom==null?Number.POSITIVE_INFINITY:this.bottom);const cw=Math.min(maxWidth,this.right==null?Number.POSITIVE_INFINITY:this.right);const l=this.options.legend;const isHor=this.isHorizontal();const factor=(v,full)=>(v<1?full*v:v);const w=Math.min(cw,factor(isHor?l.length:l.width,cw))-(!isHor?l.indicatorWidth:0);const h=Math.min(ch,factor(!isHor?l.length:l.width,ch))-(isHor?l.indicatorWidth:0);this.legendSize={w,h};this.bottom=h;this.height=h;this.right=w;this.width=w;const bak=this.options.position;this.options.position=this.options.legend.align;const r=super.update(w,h,margins);this.options.position=bak;this.height=Math.min(h,this.height);this.width=Math.min(w,this.width);return r;}
_computeLabelArea(){return undefined;}
draw(chartArea){if(!this._isVisible()){return;}
const pos=computeLegendPosition(chartArea,this.options.legend,this.width,this.height,this.legendSize);const{ctx}=this;ctx.save();ctx.translate(pos[0],pos[1]);const bak=this.options.position;this.options.position=this.options.legend.align;super.draw({...chartArea,bottom:this.height+10,right:this.width});this.options.position=bak;const{indicatorWidth}=this.options.legend;switch(this.options.legend.align){case'left':ctx.translate(this.legendSize.w,0);break;case'top':ctx.translate(0,this.legendSize.h);break;case'bottom':ctx.translate(0,-indicatorWidth);break;default:ctx.translate(-indicatorWidth,0);break;}
this._drawIndicator();ctx.restore();}
_drawIndicator(){}}
class LogarithmicLegendScale extends chart_js.LogarithmicScale{constructor(){super(...arguments);this.legendSize={w:0,h:0};}
init(options){LegendScale.prototype.init.call(this,options);}
parse(raw,index){return LegendScale.prototype.parse.call(this,raw,index);}
isHorizontal(){return this.options.legend.align==='top'||this.options.legend.align==='bottom';}
_getNormalizedValue(v){if(v==null||Number.isNaN(v)){return null;}
return(Math.log10(v)-this._startValue)/this._valueRange;}
update(maxWidth,maxHeight,margins){return LegendScale.prototype.update.call(this,maxWidth,maxHeight,margins);}
_computeLabelArea(){return undefined;}
draw(chartArea){return LegendScale.prototype.draw.call(this,chartArea);}
_drawIndicator(){}}
const lookup={interpolateBlues,interpolateBrBG,interpolateBuGn,interpolateBuPu,interpolateCividis,interpolateCool:cool,interpolateCubehelixDefault,interpolateGnBu,interpolateGreens,interpolateGreys,interpolateInferno:inferno,interpolateMagma:magma,interpolateOrRd,interpolateOranges,interpolatePRGn,interpolatePiYG,interpolatePlasma:plasma,interpolatePuBu,interpolatePuBuGn,interpolatePuOr,interpolatePuRd,interpolatePurples,interpolateRainbow,interpolateRdBu,interpolateRdGy,interpolateRdPu,interpolateRdYlBu,interpolateRdYlGn,interpolateReds,interpolateSinebow,interpolateSpectral,interpolateTurbo,interpolateViridis,interpolateWarm:warm,interpolateYlGn,interpolateYlGnBu,interpolateYlOrBr,interpolateYlOrRd,};Object.keys(lookup).forEach((key)=>{lookup[`${key.charAt(11).toLowerCase()}${key.slice(12)}`]=lookup[key];lookup[key.slice(11)]=lookup[key];});function quantize$1(v,steps){const perStep=1/steps;if(v<=perStep){return 0;}
if(v>=1-perStep){return 1;}
for(let acc=0;acc<1;acc+=perStep){if(v<acc){return acc-perStep/2;}}
return v;}
const colorScaleDefaults={interpolate:'blues',missing:'transparent',quantize:0,};class ColorScale extends LegendScale{get interpolate(){const o=this.options;if(!o){return(v)=>`rgb(${v},${v},${v})`;}
if(typeof o.interpolate==='function'){return o.interpolate;}
return lookup[o.interpolate]||lookup.blues;}
getColorForValue(value){const v=this._getNormalizedValue(value);if(v==null||Number.isNaN(v)){return this.options.missing;}
return this.getColor(v);}
getColor(normalized){let v=normalized;if(this.options.quantize>0){v=quantize$1(v,this.options.quantize);}
return this.interpolate(v);}
_drawIndicator(){const{indicatorWidth:indicatorSize}=this.options.legend;const reverse=this._reversePixels;if(this.isHorizontal()){const w=this.width;if(this.options.quantize>0){const stepWidth=w/this.options.quantize;const offset=!reverse?(i)=>i:(i)=>w-stepWidth-i;for(let i=0;i<w;i+=stepWidth){const v=(i+stepWidth/2)/w;this.ctx.fillStyle=this.getColor(v);this.ctx.fillRect(offset(i),0,stepWidth,indicatorSize);}}
else{const offset=!reverse?(i)=>i:(i)=>w-1-i;for(let i=0;i<w;i+=1){this.ctx.fillStyle=this.getColor((i+0.5)/w);this.ctx.fillRect(offset(i),0,1,indicatorSize);}}}
else{const h=this.height;if(this.options.quantize>0){const stepWidth=h/this.options.quantize;const offset=!reverse?(i)=>i:(i)=>h-stepWidth-i;for(let i=0;i<h;i+=stepWidth){const v=(i+stepWidth/2)/h;this.ctx.fillStyle=this.getColor(v);this.ctx.fillRect(0,offset(i),indicatorSize,stepWidth);}}
else{const offset=!reverse?(i)=>i:(i)=>h-1-i;for(let i=0;i<h;i+=1){this.ctx.fillStyle=this.getColor((i+0.5)/h);this.ctx.fillRect(0,offset(i),indicatorSize,1);}}}}}
ColorScale.id='color';ColorScale.defaults=helpers.merge({},[chart_js.LinearScale.defaults,baseDefaults,colorScaleDefaults]);ColorScale.descriptors={_scriptable:(name)=>name!=='interpolate',_indexable:false,};class ColorLogarithmicScale extends LogarithmicLegendScale{constructor(){super(...arguments);this.interpolate=(v)=>`rgb(${v},${v},${v})`;}
init(options){super.init(options);if(typeof options.interpolate==='function'){this.interpolate=options.interpolate;}
else{this.interpolate=lookup[options.interpolate]||lookup.blues;}}
getColorForValue(value){return ColorScale.prototype.getColorForValue.call(this,value);}
getColor(normalized){let v=normalized;if(this.options.quantize>0){v=quantize$1(v,this.options.quantize);}
return this.interpolate(v);}
_drawIndicator(){return ColorScale.prototype._drawIndicator.call(this);}}
ColorLogarithmicScale.id='colorLogarithmic';ColorLogarithmicScale.defaults=helpers.merge({},[chart_js.LogarithmicScale.defaults,baseDefaults,colorScaleDefaults,]);ColorLogarithmicScale.descriptors={_scriptable:(name)=>name!=='interpolate',_indexable:false,};const scaleDefaults={missing:1,mode:'area',range:[2,20],legend:{align:'bottom',length:90,width:70,indicatorWidth:42,},};class SizeScale extends LegendScale{constructor(){super(...arguments);this._model=null;}
getSizeForValue(value){const v=this._getNormalizedValue(value);if(v==null||Number.isNaN(v)){return this.options.missing;}
return this.getSizeImpl(v);}
getSizeImpl(normalized){const[r0,r1]=this.options.range;if(this.options.mode==='area'){const a1=r1*r1*Math.PI;const a0=r0*r0*Math.PI;const range=a1-a0;const a=normalized*range+a0;return Math.sqrt(a/Math.PI);}
const range=r1-r0;return normalized*range+r0;}
_drawIndicator(){const{ctx}=this;const shift=this.options.legend.indicatorWidth/2;const isHor=this.isHorizontal();const values=this.ticks;const labelItems=this.getLabelItems();const positions=labelItems?labelItems.map((el)=>({[isHor?'x':'y']:el.options.translation[isHor?0:1]})):values.map((_,i)=>({[isHor?'x':'y']:this.getPixelForTick(i)}));(this._gridLineItems||[]).forEach((item)=>{ctx.save();ctx.strokeStyle=item.color;ctx.lineWidth=item.width;if(ctx.setLineDash){ctx.setLineDash(item.borderDash);ctx.lineDashOffset=item.borderDashOffset;}
ctx.beginPath();if(this.options.grid.drawTicks){switch(this.options.legend.align){case'left':ctx.moveTo(0,item.ty1);ctx.lineTo(shift,item.ty2);break;case'top':ctx.moveTo(item.tx1,0);ctx.lineTo(item.tx2,shift);break;case'bottom':ctx.moveTo(item.tx1,shift);ctx.lineTo(item.tx2,shift*2);break;default:ctx.moveTo(shift,item.ty1);ctx.lineTo(shift*2,item.ty2);break;}}
ctx.stroke();ctx.restore();});if(this._model){const props=this._model;ctx.strokeStyle=props.borderColor;ctx.lineWidth=props.borderWidth||0;ctx.fillStyle=props.backgroundColor;}
else{ctx.fillStyle='blue';}
values.forEach((v,i)=>{const pos=positions[i];const radius=this.getSizeForValue(v.value);const x=isHor?pos.x:shift;const y=isHor?shift:pos.y;const renderOptions={pointStyle:'circle',borderWidth:0,...(this._model||{}),radius,};helpers.drawPoint(ctx,renderOptions,x,y);});}}
SizeScale.id='size';SizeScale.defaults=helpers.merge({},[chart_js.LinearScale.defaults,baseDefaults,scaleDefaults]);SizeScale.descriptors={_scriptable:true,_indexable:(name)=>name!=='range',};class SizeLogarithmicScale extends LogarithmicLegendScale{constructor(){super(...arguments);this._model=null;}
getSizeForValue(value){const v=this._getNormalizedValue(value);if(v==null||Number.isNaN(v)){return this.options.missing;}
return this.getSizeImpl(v);}
getSizeImpl(normalized){return SizeScale.prototype.getSizeImpl.call(this,normalized);}
_drawIndicator(){SizeScale.prototype._drawIndicator.call(this);}}
SizeLogarithmicScale.id='sizeLogarithmic';SizeLogarithmicScale.defaults=helpers.merge({},[chart_js.LogarithmicScale.defaults,baseDefaults,scaleDefaults]);function growGeoBounds(bounds,amount){return[[bounds[0][0]-amount,bounds[0][1]-amount],[bounds[1][0]+amount,bounds[1][1]+amount],];}
class GeoFeature extends chart_js.Element{constructor(){super(...arguments);this.cache=undefined;}
inRange(mouseX,mouseY){const bb=this.getBounds();const r=(Number.isNaN(mouseX)||(mouseX>=bb.x&&mouseX<=bb.x2))&&(Number.isNaN(mouseY)||(mouseY>=bb.y&&mouseY<=bb.y2));const projection=this.projectionScale.geoPath.projection();if(r&&!Number.isNaN(mouseX)&&!Number.isNaN(mouseY)&&typeof projection.invert==='function'){const longLat=projection.invert([mouseX,mouseY]);return longLat!=null&&geoContains(this.feature,longLat);}
return r;}
inXRange(mouseX){return this.inRange(mouseX,Number.NaN);}
inYRange(mouseY){return this.inRange(Number.NaN,mouseY);}
getCenterPoint(){if(this.cache&&this.cache.center){return this.cache.center;}
let center;if(this.center){const p=this.projectionScale.projection([this.center.longitude,this.center.latitude]);center={x:p[0],y:p[1],};}
else{const centroid=this.projectionScale.geoPath.centroid(this.feature);center={x:centroid[0],y:centroid[1],};}
this.cache={...(this.cache||{}),center};return center;}
getBounds(){if(this.cache&&this.cache.bounds){return this.cache.bounds;}
const bb=growGeoBounds(this.projectionScale.geoPath.bounds(this.feature),this.options.borderWidth/2);const bounds={x:bb[0][0],x2:bb[1][0],y:bb[0][1],y2:bb[1][1],width:bb[1][0]-bb[0][0],height:bb[1][1]-bb[0][1],};this.cache={...(this.cache||{}),bounds};return bounds;}
_drawInCache(doc){const bounds=this.getBounds();if(!Number.isFinite(bounds.x)){return;}
const canvas=this.cache&&this.cache.canvas?this.cache.canvas:doc.createElement('canvas');const x1=Math.floor(bounds.x);const y1=Math.floor(bounds.y);const x2=Math.ceil(bounds.x+bounds.width);const y2=Math.ceil(bounds.y+bounds.height);const pixelRatio=this.pixelRatio||1;const width=Math.ceil(Math.max(x2-x1,1)*pixelRatio);const height=Math.ceil(Math.max(y2-y1,1)*pixelRatio);if(width<=0||height<=0){return;}
canvas.width=width;canvas.height=height;const ctx=canvas.getContext('2d');if(ctx){ctx.clearRect(0,0,canvas.width,canvas.height);ctx.save();ctx.scale(pixelRatio,pixelRatio);ctx.translate(-x1,-y1);this._drawImpl(ctx);ctx.restore();this.cache={...(this.cache||{}),canvas,canvasKey:this._optionsToKey()};}}
_optionsToKey(){const{options}=this;return`${options.backgroundColor};${options.borderColor};${options.borderWidth};${this.pixelRatio}`;}
_drawImpl(ctx){const{feature}=this;const{options}=this;ctx.beginPath();this.projectionScale.geoPath.context(ctx)(feature);if(options.backgroundColor){ctx.fillStyle=options.backgroundColor;ctx.fill();}
if(options.borderColor){ctx.strokeStyle=options.borderColor;ctx.lineWidth=options.borderWidth;ctx.stroke();}}
draw(ctx){const{feature}=this;if(!feature){return;}
if((!this.cache||this.cache.canvasKey!==this._optionsToKey())&&ctx.canvas.ownerDocument!=null){this._drawInCache(ctx.canvas.ownerDocument);}
const bounds=this.getBounds();if(this.cache&&this.cache.canvas&&this.cache.canvas.width>0&&this.cache.canvas.height>0){const x1=Math.floor(bounds.x);const y1=Math.floor(bounds.y);const x2=Math.ceil(bounds.x+bounds.width);const y2=Math.ceil(bounds.y+bounds.height);const width=x2-x1;const height=y2-y1;if(width>0&&height>0){ctx.drawImage(this.cache.canvas,x1,y1,x2-x1,y2-y1);}}
else if(Number.isFinite(bounds.x)){ctx.save();this._drawImpl(ctx);ctx.restore();}}}
GeoFeature.id='geoFeature';GeoFeature.defaults={...chart_js.BarElement.defaults,outlineBackgroundColor:null,outlineBorderWidth:0,graticuleBorderColor:'#CCCCCC',graticuleBorderWidth:0,};GeoFeature.defaultRoutes={outlineBorderColor:'borderColor',...(chart_js.BarElement.defaultRoutes||{}),};const geoDefaults={showOutline:false,showGraticule:false,clipMap:true,};const geoOverrides={scales:{projection:{axis:'x',type:ProjectionScale.id,position:'chartArea',display:false,},},};function patchDatasetElementOptions(options){const r={...options};Object.keys(options).forEach((key)=>{let targetKey=key;if(key.startsWith('outline')){const sub=key.slice('outline'.length);targetKey=sub[0].toLowerCase()+sub.slice(1);}
else if(key.startsWith('hoverOutline')){targetKey=`hover${key.slice('hoverOutline'.length)}`;}
else{return;}
delete r[key];r[targetKey]=options[key];});return r;}
class GeoController extends chart_js.DatasetController{getGeoDataset(){return super.getDataset();}
getGeoOptions(){return this.chart.options;}
getProjectionScale(){return this.getScaleForId('projection');}
linkScales(){const dataset=this.getGeoDataset();const meta=this.getMeta();meta.xAxisID='projection';dataset.xAxisID='projection';meta.yAxisID='projection';dataset.yAxisID='projection';meta.xScale=this.getScaleForId('projection');meta.yScale=this.getScaleForId('projection');this.getProjectionScale().computeBounds(this.resolveOutline());}
showOutline(){return helpers.valueOrDefault(this.getGeoDataset().showOutline,this.getGeoOptions().showOutline);}
clipMap(){return helpers.valueOrDefault(this.getGeoDataset().clipMap,this.getGeoOptions().clipMap);}
getGraticule(){return helpers.valueOrDefault(this.getGeoDataset().showGraticule,this.getGeoOptions().showGraticule);}
update(mode){super.update(mode);const meta=this.getMeta();const scale=this.getProjectionScale();const dirtyCache=scale.updateBounds();if(this.showOutline()){const elem=meta.dataset;if(dirtyCache){delete elem.cache;}
elem.projectionScale=scale;elem.pixelRatio=this.chart.currentDevicePixelRatio;if(mode!=='resize'){const options=patchDatasetElementOptions(this.resolveDatasetElementOptions(mode));const properties={feature:this.resolveOutline(),options,};this.updateElement(elem,undefined,properties,mode);if(this.getGraticule()){meta.graticule=options;}}}
else if(this.getGraticule()&&mode!=='resize'){meta.graticule=patchDatasetElementOptions(this.resolveDatasetElementOptions(mode));}
this.updateElements(meta.data,0,meta.data.length,mode);if(dirtyCache){meta.data.forEach((elem)=>delete elem.cache);}}
resolveOutline(){const ds=this.getGeoDataset();const outline=ds.outline||{type:'Sphere'};if(Array.isArray(outline)){return{type:'FeatureCollection',features:outline,};}
return outline;}
showGraticule(){const g=this.getGraticule();const options=this.getMeta().graticule;if(!g||!options){return;}
const{ctx}=this.chart;const scale=this.getProjectionScale();const path=scale.geoPath.context(ctx);ctx.save();ctx.beginPath();if(typeof g==='boolean'){if(g){path(graticule10());}}
else{const geo=graticule();if(g.stepMajor){geo.stepMajor(g.stepMajor);}
if(g.stepMinor){geo.stepMinor(g.stepMinor);}
path(geo());}
ctx.strokeStyle=options.graticuleBorderColor;ctx.lineWidth=options.graticuleBorderWidth;ctx.stroke();ctx.restore();}
draw(){const{chart}=this;const clipMap=this.clipMap();let enabled=false;if(clipMap===true||clipMap==='outline'||clipMap==='outline+graticule'){enabled=true;helpers.clipArea(chart.ctx,chart.chartArea);}
if(this.showOutline()&&this.getMeta().dataset){this.getMeta().dataset.draw.call(this.getMeta().dataset,chart.ctx,chart.chartArea);}
if(clipMap===true||clipMap==='graticule'||clipMap==='outline+graticule'){if(!enabled){helpers.clipArea(chart.ctx,chart.chartArea);}}
else if(enabled){enabled=false;helpers.unclipArea(chart.ctx);}
this.showGraticule();if(clipMap===true||clipMap==='items'){if(!enabled){helpers.clipArea(chart.ctx,chart.chartArea);}}
else if(enabled){enabled=false;helpers.unclipArea(chart.ctx);}
this.getMeta().data.forEach((elem)=>elem.draw.call(elem,chart.ctx,chart.chartArea));if(enabled){enabled=false;helpers.unclipArea(chart.ctx);}}}
function patchController(type,config,controller,elements=[],scales=[]){chart_js.registry.addControllers(controller);if(Array.isArray(elements)){chart_js.registry.addElements(...elements);}
else{chart_js.registry.addElements(elements);}
if(Array.isArray(scales)){chart_js.registry.addScales(...scales);}
else{chart_js.registry.addScales(scales);}
const c=config;c.type=type;return c;}
class ChoroplethController extends GeoController{initialize(){super.initialize();this.enableOptionSharing=true;}
linkScales(){super.linkScales();const dataset=this.getGeoDataset();const meta=this.getMeta();meta.vAxisID='color';meta.rAxisID='color';dataset.vAxisID='color';dataset.rAxisID='color';meta.rScale=this.getScaleForId('color');meta.vScale=meta.rScale;meta.iScale=meta.xScale;meta.iAxisID=meta.xAxisID;dataset.iAxisID=meta.xAxisID;}
_getOtherScale(scale){return scale;}
parse(start,count){const rScale=this.getMeta().rScale;const{data}=this.getDataset();const meta=this._cachedMeta;for(let i=start;i<start+count;i+=1){meta._parsed[i]={[rScale.axis]:rScale.parse(data[i],i),};}}
updateElements(elems,start,count,mode){const firstOpts=this.resolveDataElementOptions(start,mode);const sharedOptions=this.getSharedOptions(firstOpts);const includeOptions=this.includeOptions(mode,sharedOptions);const scale=this.getProjectionScale();this.updateSharedOptions(sharedOptions,mode,firstOpts);for(let i=start;i<start+count;i+=1){const elem=elems[i];elem.projectionScale=scale;elem.feature=this._data[i].feature;elem.center=this._data[i].center;elem.pixelRatio=this.chart.currentDevicePixelRatio;const center=elem.getCenterPoint();const properties={x:center.x,y:center.y,};if(includeOptions){properties.options=(sharedOptions||this.resolveDataElementOptions(i,mode));}
this.updateElement(elem,i,properties,mode);}}
indexToColor(index){const rScale=this.getMeta().rScale;return rScale.getColorForValue(this.getParsed(index)[rScale.axis]);}}
ChoroplethController.id='choropleth';ChoroplethController.defaults=helpers.merge({},[geoDefaults,{datasetElementType:GeoFeature.id,dataElementType:GeoFeature.id,},]);ChoroplethController.overrides=helpers.merge({},[geoOverrides,{plugins:{tooltip:{callbacks:{title(){return'';},label(item){var _a,_b,_c,_d;if(item.formattedValue==null){return(_b=(_a=item.chart.data)===null||_a===void 0?void 0:_a.labels)===null||_b===void 0?void 0:_b[item.dataIndex];}
return`${(_d = (_c = item.chart.data) === null || _c === void 0 ? void 0 : _c.labels) === null || _d === void 0 ? void 0 : _d[item.dataIndex]}: ${item.formattedValue}`;},},},colors:{enabled:false,},},scales:{color:{type:ColorScale.id,axis:'x',},},elements:{geoFeature:{backgroundColor(context){if(context.dataIndex==null){return null;}
const controller=context.chart.getDatasetMeta(context.datasetIndex).controller;return controller.indexToColor(context.dataIndex);},},},},]);class ChoroplethChart extends chart_js.Chart{constructor(item,config){super(item,patchController('choropleth',config,ChoroplethController,GeoFeature,[ColorScale,ProjectionScale]));}}
ChoroplethChart.id=ChoroplethController.id;class BubbleMapController extends GeoController{initialize(){super.initialize();this.enableOptionSharing=true;}
linkScales(){super.linkScales();const dataset=this.getGeoDataset();const meta=this.getMeta();meta.vAxisID='size';meta.rAxisID='size';dataset.vAxisID='size';dataset.rAxisID='size';meta.rScale=this.getScaleForId('size');meta.vScale=meta.rScale;meta.iScale=meta.xScale;meta.iAxisID=meta.xAxisID;dataset.iAxisID=meta.xAxisID;}
_getOtherScale(scale){return scale;}
parse(start,count){const rScale=this.getMeta().rScale;const data=this.getDataset().data;const meta=this._cachedMeta;for(let i=start;i<start+count;i+=1){const d=data[i];meta._parsed[i]={x:d.longitude==null?d.x:d.longitude,y:d.latitude==null?d.y:d.latitude,[rScale.axis]:rScale.parse(d,i),};}}
updateElements(elems,start,count,mode){const reset=mode==='reset';const firstOpts=this.resolveDataElementOptions(start,mode);const sharedOptions=this.getSharedOptions(firstOpts);const includeOptions=this.includeOptions(mode,sharedOptions);const scale=this.getProjectionScale();this.getMeta().rScale._model=firstOpts;this.updateSharedOptions(sharedOptions,mode,firstOpts);for(let i=start;i<start+count;i+=1){const elem=elems[i];const parsed=this.getParsed(i);const projection=scale.projection([parsed.x,parsed.y]);const properties={x:projection?projection[0]:0,y:projection?projection[1]:0,skip:Number.isNaN(parsed.x)||Number.isNaN(parsed.y),};if(includeOptions){properties.options=(sharedOptions||this.resolveDataElementOptions(i,mode));if(reset){properties.options.radius=0;}}
this.updateElement(elem,i,properties,mode);}}
indexToRadius(index){const rScale=this.getMeta().rScale;return rScale.getSizeForValue(this.getParsed(index)[rScale.axis]);}}
BubbleMapController.id='bubbleMap';BubbleMapController.defaults=helpers.merge({},[geoDefaults,{dataElementType:chart_js.PointElement.id,datasetElementType:GeoFeature.id,showOutline:true,clipMap:'outline+graticule',},]);BubbleMapController.overrides=helpers.merge({},[geoOverrides,{plugins:{tooltip:{callbacks:{title(){return'';},label(item){var _a,_b,_c,_d;if(item.formattedValue==null){return(_b=(_a=item.chart.data)===null||_a===void 0?void 0:_a.labels)===null||_b===void 0?void 0:_b[item.dataIndex];}
return`${(_d = (_c = item.chart.data) === null || _c === void 0 ? void 0 : _c.labels) === null || _d === void 0 ? void 0 : _d[item.dataIndex]}: ${item.formattedValue}`;},},},},scales:{size:{axis:'x',type:SizeScale.id,},},elements:{point:{radius(context){if(context.dataIndex==null){return null;}
const controller=context.chart.getDatasetMeta(context.datasetIndex).controller;return controller.indexToRadius(context.dataIndex);},hoverRadius(context){if(context.dataIndex==null){return null;}
const controller=context.chart.getDatasetMeta(context.datasetIndex).controller;return controller.indexToRadius(context.dataIndex)+1;},},},},]);class BubbleMapChart extends chart_js.Chart{constructor(item,config){super(item,patchController('bubbleMap',config,BubbleMapController,GeoFeature,[SizeScale,ProjectionScale]));}}
BubbleMapChart.id=BubbleMapController.id;function identity(x){return x;}
function transform(transform){if(transform==null)return identity;var x0,y0,kx=transform.scale[0],ky=transform.scale[1],dx=transform.translate[0],dy=transform.translate[1];return function(input,i){if(!i)x0=y0=0;var j=2,n=input.length,output=new Array(n);output[0]=(x0+=input[0])*kx+dx;output[1]=(y0+=input[1])*ky+dy;while(j<n)output[j]=input[j],++j;return output;};}
function bbox(topology){var t=transform(topology.transform),key,x0=Infinity,y0=x0,x1=-x0,y1=-x0;function bboxPoint(p){p=t(p);if(p[0]<x0)x0=p[0];if(p[0]>x1)x1=p[0];if(p[1]<y0)y0=p[1];if(p[1]>y1)y1=p[1];}
function bboxGeometry(o){switch(o.type){case"GeometryCollection":o.geometries.forEach(bboxGeometry);break;case"Point":bboxPoint(o.coordinates);break;case"MultiPoint":o.coordinates.forEach(bboxPoint);break;}}
topology.arcs.forEach(function(arc){var i=-1,n=arc.length,p;while(++i<n){p=t(arc[i],i);if(p[0]<x0)x0=p[0];if(p[0]>x1)x1=p[0];if(p[1]<y0)y0=p[1];if(p[1]>y1)y1=p[1];}});for(key in topology.objects){bboxGeometry(topology.objects[key]);}
return[x0,y0,x1,y1];}
function reverse(array,n){var t,j=array.length,i=j-n;while(i<--j)t=array[i],array[i++]=array[j],array[j]=t;}
function feature(topology,o){if(typeof o==="string")o=topology.objects[o];return o.type==="GeometryCollection"?{type:"FeatureCollection",features:o.geometries.map(function(o){return feature$1(topology,o);})}:feature$1(topology,o);}
function feature$1(topology,o){var id=o.id,bbox=o.bbox,properties=o.properties==null?{}:o.properties,geometry=object(topology,o);return id==null&&bbox==null?{type:"Feature",properties:properties,geometry:geometry}:bbox==null?{type:"Feature",id:id,properties:properties,geometry:geometry}:{type:"Feature",id:id,bbox:bbox,properties:properties,geometry:geometry};}
function object(topology,o){var transformPoint=transform(topology.transform),arcs=topology.arcs;function arc(i,points){if(points.length)points.pop();for(var a=arcs[i<0?~i:i],k=0,n=a.length;k<n;++k){points.push(transformPoint(a[k],k));}
if(i<0)reverse(points,n);}
function point(p){return transformPoint(p);}
function line(arcs){var points=[];for(var i=0,n=arcs.length;i<n;++i)arc(arcs[i],points);if(points.length<2)points.push(points[0]);return points;}
function ring(arcs){var points=line(arcs);while(points.length<4)points.push(points[0]);return points;}
function polygon(arcs){return arcs.map(ring);}
function geometry(o){var type=o.type,coordinates;switch(type){case"GeometryCollection":return{type:type,geometries:o.geometries.map(geometry)};case"Point":coordinates=point(o.coordinates);break;case"MultiPoint":coordinates=o.coordinates.map(point);break;case"LineString":coordinates=line(o.arcs);break;case"MultiLineString":coordinates=o.arcs.map(line);break;case"Polygon":coordinates=polygon(o.arcs);break;case"MultiPolygon":coordinates=o.arcs.map(polygon);break;default:return null;}
return{type:type,coordinates:coordinates};}
return geometry(o);}
function stitch(topology,arcs){var stitchedArcs={},fragmentByStart={},fragmentByEnd={},fragments=[],emptyIndex=-1;arcs.forEach(function(i,j){var arc=topology.arcs[i<0?~i:i],t;if(arc.length<3&&!arc[1][0]&&!arc[1][1]){t=arcs[++emptyIndex],arcs[emptyIndex]=i,arcs[j]=t;}});arcs.forEach(function(i){var e=ends(i),start=e[0],end=e[1],f,g;if(f=fragmentByEnd[start]){delete fragmentByEnd[f.end];f.push(i);f.end=end;if(g=fragmentByStart[end]){delete fragmentByStart[g.start];var fg=g===f?f:f.concat(g);fragmentByStart[fg.start=f.start]=fragmentByEnd[fg.end=g.end]=fg;}else{fragmentByStart[f.start]=fragmentByEnd[f.end]=f;}}else if(f=fragmentByStart[end]){delete fragmentByStart[f.start];f.unshift(i);f.start=start;if(g=fragmentByEnd[start]){delete fragmentByEnd[g.end];var gf=g===f?f:g.concat(f);fragmentByStart[gf.start=g.start]=fragmentByEnd[gf.end=f.end]=gf;}else{fragmentByStart[f.start]=fragmentByEnd[f.end]=f;}}else{f=[i];fragmentByStart[f.start=start]=fragmentByEnd[f.end=end]=f;}});function ends(i){var arc=topology.arcs[i<0?~i:i],p0=arc[0],p1;if(topology.transform)p1=[0,0],arc.forEach(function(dp){p1[0]+=dp[0],p1[1]+=dp[1];});else p1=arc[arc.length-1];return i<0?[p1,p0]:[p0,p1];}
function flush(fragmentByEnd,fragmentByStart){for(var k in fragmentByEnd){var f=fragmentByEnd[k];delete fragmentByStart[f.start];delete f.start;delete f.end;f.forEach(function(i){stitchedArcs[i<0?~i:i]=1;});fragments.push(f);}}
flush(fragmentByEnd,fragmentByStart);flush(fragmentByStart,fragmentByEnd);arcs.forEach(function(i){if(!stitchedArcs[i<0?~i:i])fragments.push([i]);});return fragments;}
function mesh(topology){return object(topology,meshArcs.apply(this,arguments));}
function meshArcs(topology,object,filter){var arcs,i,n;if(arguments.length>1)arcs=extractArcs(topology,object,filter);else for(i=0,arcs=new Array(n=topology.arcs.length);i<n;++i)arcs[i]=i;return{type:"MultiLineString",arcs:stitch(topology,arcs)};}
function extractArcs(topology,object,filter){var arcs=[],geomsByArc=[],geom;function extract0(i){var j=i<0?~i:i;(geomsByArc[j]||(geomsByArc[j]=[])).push({i:i,g:geom});}
function extract1(arcs){arcs.forEach(extract0);}
function extract2(arcs){arcs.forEach(extract1);}
function extract3(arcs){arcs.forEach(extract2);}
function geometry(o){switch(geom=o,o.type){case"GeometryCollection":o.geometries.forEach(geometry);break;case"LineString":extract1(o.arcs);break;case"MultiLineString":case"Polygon":extract2(o.arcs);break;case"MultiPolygon":extract3(o.arcs);break;}}
geometry(object);geomsByArc.forEach(filter==null?function(geoms){arcs.push(geoms[0].i);}:function(geoms){if(filter(geoms[0].g,geoms[geoms.length-1].g))arcs.push(geoms[0].i);});return arcs;}
function planarRingArea(ring){var i=-1,n=ring.length,a,b=ring[n-1],area=0;while(++i<n)a=b,b=ring[i],area+=a[0]*b[1]-a[1]*b[0];return Math.abs(area);}
function merge(topology){return object(topology,mergeArcs.apply(this,arguments));}
function mergeArcs(topology,objects){var polygonsByArc={},polygons=[],groups=[];objects.forEach(geometry);function geometry(o){switch(o.type){case"GeometryCollection":o.geometries.forEach(geometry);break;case"Polygon":extract(o.arcs);break;case"MultiPolygon":o.arcs.forEach(extract);break;}}
function extract(polygon){polygon.forEach(function(ring){ring.forEach(function(arc){(polygonsByArc[arc=arc<0?~arc:arc]||(polygonsByArc[arc]=[])).push(polygon);});});polygons.push(polygon);}
function area(ring){return planarRingArea(object(topology,{type:"Polygon",arcs:[ring]}).coordinates[0]);}
polygons.forEach(function(polygon){if(!polygon._){var group=[],neighbors=[polygon];polygon._=1;groups.push(group);while(polygon=neighbors.pop()){group.push(polygon);polygon.forEach(function(ring){ring.forEach(function(arc){polygonsByArc[arc<0?~arc:arc].forEach(function(polygon){if(!polygon._){polygon._=1;neighbors.push(polygon);}});});});}}});polygons.forEach(function(polygon){delete polygon._;});return{type:"MultiPolygon",arcs:groups.map(function(polygons){var arcs=[],n;polygons.forEach(function(polygon){polygon.forEach(function(ring){ring.forEach(function(arc){if(polygonsByArc[arc<0?~arc:arc].length<2){arcs.push(arc);}});});});arcs=stitch(topology,arcs);if((n=arcs.length)>1){for(var i=1,k=area(arcs[0]),ki,t;i<n;++i){if((ki=area(arcs[i]))>k){t=arcs[0],arcs[0]=arcs[i],arcs[i]=t,k=ki;}}}
return arcs;}).filter(function(arcs){return arcs.length>0;})};}
function bisect(a,x){var lo=0,hi=a.length;while(lo<hi){var mid=lo+hi>>>1;if(a[mid]<x)lo=mid+1;else hi=mid;}
return lo;}
function neighbors(objects){var indexesByArc={},neighbors=objects.map(function(){return[];});function line(arcs,i){arcs.forEach(function(a){if(a<0)a=~a;var o=indexesByArc[a];if(o)o.push(i);else indexesByArc[a]=[i];});}
function polygon(arcs,i){arcs.forEach(function(arc){line(arc,i);});}
function geometry(o,i){if(o.type==="GeometryCollection")o.geometries.forEach(function(o){geometry(o,i);});else if(o.type in geometryType)geometryType[o.type](o.arcs,i);}
var geometryType={LineString:line,MultiLineString:polygon,Polygon:polygon,MultiPolygon:function(arcs,i){arcs.forEach(function(arc){polygon(arc,i);});}};objects.forEach(geometry);for(var i in indexesByArc){for(var indexes=indexesByArc[i],m=indexes.length,j=0;j<m;++j){for(var k=j+1;k<m;++k){var ij=indexes[j],ik=indexes[k],n;if((n=neighbors[ij])[i=bisect(n,ik)]!==ik)n.splice(i,0,ik);if((n=neighbors[ik])[i=bisect(n,ij)]!==ij)n.splice(i,0,ij);}}}
return neighbors;}
function untransform(transform){if(transform==null)return identity;var x0,y0,kx=transform.scale[0],ky=transform.scale[1],dx=transform.translate[0],dy=transform.translate[1];return function(input,i){if(!i)x0=y0=0;var j=2,n=input.length,output=new Array(n),x1=Math.round((input[0]-dx)/kx),y1=Math.round((input[1]-dy)/ky);output[0]=x1-x0,x0=x1;output[1]=y1-y0,y0=y1;while(j<n)output[j]=input[j],++j;return output;};}
function quantize(topology,transform){if(topology.transform)throw new Error("already quantized");if(!transform||!transform.scale){if(!((n=Math.floor(transform))>=2))throw new Error("n must be ≥2");box=topology.bbox||bbox(topology);var x0=box[0],y0=box[1],x1=box[2],y1=box[3],n;transform={scale:[x1-x0?(x1-x0)/(n-1):1,y1-y0?(y1-y0)/(n-1):1],translate:[x0,y0]};}else{box=topology.bbox;}
var t=untransform(transform),box,key,inputs=topology.objects,outputs={};function quantizePoint(point){return t(point);}
function quantizeGeometry(input){var output;switch(input.type){case"GeometryCollection":output={type:"GeometryCollection",geometries:input.geometries.map(quantizeGeometry)};break;case"Point":output={type:"Point",coordinates:quantizePoint(input.coordinates)};break;case"MultiPoint":output={type:"MultiPoint",coordinates:input.coordinates.map(quantizePoint)};break;default:return input;}
if(input.id!=null)output.id=input.id;if(input.bbox!=null)output.bbox=input.bbox;if(input.properties!=null)output.properties=input.properties;return output;}
function quantizeArc(input){var i=0,j=1,n=input.length,p,output=new Array(n);output[0]=t(input[0],0);while(++i<n)if((p=t(input[i],i))[0]||p[1])output[j++]=p;if(j===1)output[j++]=[0,0];output.length=j;return output;}
for(key in inputs)outputs[key]=quantizeGeometry(inputs[key]);return{type:"Topology",bbox:box,transform:transform,objects:outputs,arcs:topology.arcs.map(quantizeArc)};}
var index=Object.freeze({__proto__:null,bbox:bbox,feature:feature,merge:merge,mergeArcs:mergeArcs,mesh:mesh,meshArcs:meshArcs,neighbors:neighbors,quantize:quantize,transform:transform,untransform:untransform});chart_js.registry.addScales(ColorLogarithmicScale,SizeLogarithmicScale,ProjectionScale,ColorScale,SizeScale);chart_js.registry.addElements(GeoFeature);chart_js.registry.addControllers(ChoroplethController,BubbleMapController);exports.BubbleMapChart=BubbleMapChart;exports.BubbleMapController=BubbleMapController;exports.ChoroplethChart=ChoroplethChart;exports.ChoroplethController=ChoroplethController;exports.ColorLogarithmicScale=ColorLogarithmicScale;exports.ColorScale=ColorScale;exports.GeoController=GeoController;exports.GeoFeature=GeoFeature;exports.ProjectionScale=ProjectionScale;exports.SizeLogarithmicScale=SizeLogarithmicScale;exports.SizeScale=SizeScale;exports.geoAlbers=geoAlbers;exports.geoAlbersUsa=geoAlbersUsa;exports.geoAzimuthalEqualArea=geoAzimuthalEqualArea;exports.geoAzimuthalEquidistant=geoAzimuthalEquidistant;exports.geoConicConformal=geoConicConformal;exports.geoConicEqualArea=geoConicEqualArea;exports.geoConicEquidistant=geoConicEquidistant;exports.geoEqualEarth=geoEqualEarth;exports.geoEquirectangular=geoEquirectangular;exports.geoGnomonic=geoGnomonic;exports.geoMercator=geoMercator;exports.geoNaturalEarth1=geoNaturalEarth1;exports.geoOrthographic=geoOrthographic;exports.geoStereographic=geoStereographic;exports.geoTransverseMercator=geoTransverseMercator;exports.topojson=index;}));;

/* /spreadsheet/static/lib/chart_js_treemap.js */
(function(global,factory){typeof exports==="object"&&typeof module!=="undefined"?factory(exports,require("chart.js"),require("chart.js/helpers")):typeof define==="function"&&define.amd?define(["exports","chart.js","chart.js/helpers"],factory):((global=typeof globalThis!=="undefined"?globalThis:global||self),factory((global["chartjs-chart-treemap"]={}),global.Chart,global.Chart.helpers));})(this,function(exports,chart_js,helpers){"use strict";const isOlderPart=(act,req)=>req>act||(act.length>req.length&&act.slice(0,req.length)===req);const getGroupKey=(lvl)=>""+lvl;function scanTreeObject(keys,treeLeafKey,obj,tree=[],lvl=0,result=[]){const objIndex=lvl-1;if(keys[0]in obj&&lvl>0){const record=tree.reduce(function(reduced,item,i){if(i!==objIndex){reduced[getGroupKey(i)]=item;}
return reduced;},{});record[treeLeafKey]=tree[objIndex];keys.forEach(function(k){record[k]=obj[k];});result.push(record);}else{for(const childKey of Object.keys(obj)){const child=obj[childKey];if(helpers.isObject(child)){tree.push(childKey);scanTreeObject(keys,treeLeafKey,child,tree,lvl+1,result);}}}
tree.splice(objIndex,1);return result;}
function normalizeTreeToArray(keys,treeLeafKey,obj){const data=scanTreeObject(keys,treeLeafKey,obj);if(!data.length){return data;}
const max=data.reduce(function(maxVal,element){const ikeys=Object.keys(element).length-2;return maxVal>ikeys?maxVal:ikeys;});data.forEach(function(element){for(let i=0;i<max;i++){const groupKey=getGroupKey(i);if(!element[groupKey]){element[groupKey]="";}}});return data;}
function flatten(input){const stack=[...input];const res=[];while(stack.length){const next=stack.pop();if(Array.isArray(next)){stack.push(...next);}else{res.push(next);}}
return res.reverse();}
function getPath(groups,value,defaultValue){if(!groups.length){return;}
const path=[];for(const grp of groups){const item=value[grp];if(item===""){path.push(defaultValue);break;}
path.push(item);}
return path.length?path.join("."):defaultValue;}
function group(values,grp,keys,treeLeafKey,mainGrp,mainValue,groups=[]){const key=keys[0];const addKeys=keys.slice(1);const tmp=Object.create(null);const data=Object.create(null);const ret=[];let g,i,n;for(i=0,n=values.length;i<n;++i){const v=values[i];if(mainGrp&&v[mainGrp]!==mainValue){continue;}
g=v[grp]||v[treeLeafKey]||"";if(!g){return[];}
if(!(g in tmp)){const tmpRef=(tmp[g]={value:0});addKeys.forEach(function(k){tmpRef[k]=0;});data[g]=[];}
tmp[g].value+=+v[key];tmp[g].label=v[grp]||"";const tmpRef=tmp[g];addKeys.forEach(function(k){tmpRef[k]+=v[k];});tmp[g].path=getPath(groups,v,g);data[g].push(v);}
Object.keys(tmp).forEach((k)=>{const v={children:data[k]};v[key]=+tmp[k].value;addKeys.forEach(function(ak){v[ak]=+tmp[k][ak];});v[grp]=tmp[k].label;v.label=k;v.path=tmp[k].path;if(mainGrp){v[mainGrp]=mainValue;}
ret.push(v);});return ret;}
function index(values,key){let n=values.length;let i;if(!n){return key;}
const obj=helpers.isObject(values[0]);key=obj?key:"v";for(i=0,n=values.length;i<n;++i){if(obj){values[i]._idx=i;}else{values[i]={v:values[i],_idx:i};}}
return key;}
function sort(values,key){if(key){values.sort((a,b)=>+b[key]-+a[key]);}else{values.sort((a,b)=>+b-+a);}}
function sum(values,key){let s,i,n;for(s=0,i=0,n=values.length;i<n;++i){s+=key?+values[i][key]:+values[i];}
return s;}
function requireVersion(pkg,min,ver,strict=true){const parts=ver.split(".");let i=0;for(const req of min.split(".")){const act=parts[i++];if(parseInt(req,10)<parseInt(act,10)){break;}
if(isOlderPart(act,req)){if(strict){throw new Error(`${pkg} v${ver} is not supported. v${min} or newer is required.`);}else{return false;}}}
return true;}
const widthCache=new Map();function getBounds(rect,useFinalPosition){const{x,y,width,height}=rect.getProps(["x","y","width","height"],useFinalPosition);return{left:x,top:y,right:x+width,bottom:y+height};}
function limit(value,min,max){return Math.max(Math.min(value,max),min);}
function parseBorderWidth(value,maxW,maxH){const o=helpers.toTRBL(value);return{t:limit(o.top,0,maxH),r:limit(o.right,0,maxW),b:limit(o.bottom,0,maxH),l:limit(o.left,0,maxW),};}
function parseBorderRadius(value,maxW,maxH){const o=helpers.toTRBLCorners(value);const maxR=Math.min(maxW,maxH);return{topLeft:limit(o.topLeft,0,maxR),topRight:limit(o.topRight,0,maxR),bottomLeft:limit(o.bottomLeft,0,maxR),bottomRight:limit(o.bottomRight,0,maxR),};}
function boundingRects(rect){const bounds=getBounds(rect);const width=bounds.right-bounds.left;const height=bounds.bottom-bounds.top;const border=parseBorderWidth(rect.options.borderWidth,width/2,height/2);const radius=parseBorderRadius(rect.options.borderRadius,width/2,height/2);const outer={x:bounds.left,y:bounds.top,w:width,h:height,active:rect.active,radius,};return{outer,inner:{x:outer.x+border.l,y:outer.y+border.t,w:outer.w-border.l-border.r,h:outer.h-border.t-border.b,active:rect.active,radius:{topLeft:Math.max(0,radius.topLeft-Math.max(border.t,border.l)),topRight:Math.max(0,radius.topRight-Math.max(border.t,border.r)),bottomLeft:Math.max(0,radius.bottomLeft-Math.max(border.b,border.l)),bottomRight:Math.max(0,radius.bottomRight-Math.max(border.b,border.r)),},},};}
function inRange(rect,x,y,useFinalPosition){const skipX=x===null;const skipY=y===null;const bounds=!rect||(skipX&&skipY)?false:getBounds(rect,useFinalPosition);return(bounds&&(skipX||(x>=bounds.left&&x<=bounds.right))&&(skipY||(y>=bounds.top&&y<=bounds.bottom)));}
function hasRadius(radius){return radius.topLeft||radius.topRight||radius.bottomLeft||radius.bottomRight;}
function addNormalRectPath(ctx,rect){ctx.rect(rect.x,rect.y,rect.w,rect.h);}
function shouldDrawCaption(displayMode,rect,options){if(!options||options.display===false){return false;}
if(displayMode==="headerBoxes"){return true;}
const{w,h}=rect;const font=helpers.toFont(options.font);const min=font.lineHeight;const padding=limit(helpers.valueOrDefault(options.padding,3)*2,0,Math.min(w,h));return w-padding>min&&h-padding>min;}
function getCaptionHeight(displayMode,rect,font,padding){if(displayMode!=="headerBoxes"){return font.lineHeight+padding*2;}
const captionHeight=font.lineHeight+padding*2;return rect.h<2*captionHeight?rect.h/3:captionHeight;}
function drawText(ctx,rect,options,item){const{captions,labels,displayMode}=options;ctx.save();ctx.beginPath();ctx.rect(rect.x,rect.y,rect.w,rect.h);ctx.clip();const isLeaf=item&&(!helpers.defined(item.l)||item.isLeaf);if(isLeaf&&labels.display){drawLabel(ctx,rect,options);}else if(!isLeaf&&shouldDrawCaption(displayMode,rect,captions)){drawCaption(ctx,rect,options,item);}
ctx.restore();}
function drawCaption(ctx,rect,options,item){const{captions,spacing,rtl,displayMode}=options;const{color,hoverColor,font,hoverFont,padding,align,formatter}=captions;const oColor=(rect.active?hoverColor:color)||color;const oAlign=align||(rtl?"right":"left");const optFont=(rect.active?hoverFont:font)||font;const oFont=helpers.toFont(optFont);const fonts=[oFont];if(oFont.lineHeight>rect.h){return;}
let text=formatter||item.g;const captionSize=measureLabelSize(ctx,[formatter],fonts);if(captionSize.width+2*padding>rect.w){text=sliceTextToFitWidth(ctx,text,rect.w-2*padding,fonts);}
const lh=oFont.lineHeight/2;const x=calculateX(rect,oAlign,padding);ctx.fillStyle=oColor;ctx.font=oFont.string;ctx.textAlign=oAlign;ctx.textBaseline="middle";const y=displayMode==="headerBoxes"?rect.y+rect.h/2:rect.y+padding+spacing+lh;ctx.fillText(text,x,y);}
function sliceTextToFitWidth(ctx,text,width,fonts){const ellipsis="...";const ellipsisWidth=measureLabelSize(ctx,[ellipsis],fonts).width;if(ellipsisWidth>=width){return"";}
let lowerBoundLen=1;let upperBoundLen=text.length;let currentWidth;while(lowerBoundLen<=upperBoundLen){const currentLen=Math.floor((lowerBoundLen+upperBoundLen)/2);const currentText=text.slice(0,currentLen);currentWidth=measureLabelSize(ctx,[currentText],fonts).width;if(currentWidth+ellipsisWidth>width){upperBoundLen=currentLen-1;}else{lowerBoundLen=currentLen+1;}}
const slicedText=text.slice(0,Math.max(0,lowerBoundLen-1));return slicedText?slicedText+ellipsis:"";}
function measureLabelSize(ctx,lines,fonts){const fontsKey=fonts.reduce(function(prev,item){prev+=item.string;return prev;},"");const mapKey=lines.join()+fontsKey+(ctx._measureText?"-spriting":"");if(!widthCache.has(mapKey)){ctx.save();const count=lines.length;let width=0;let height=0;for(let i=0;i<count;i++){const font=fonts[Math.min(i,fonts.length-1)];ctx.font=font.string;const text=lines[i];width=Math.max(width,ctx.measureText(text).width);height+=font.lineHeight;}
ctx.restore();widthCache.set(mapKey,{width,height});}
return widthCache.get(mapKey);}
function toFonts(fonts,fitRatio){return fonts.map(function(f){f.size=Math.floor(f.size*fitRatio);f.lineHeight=undefined;return helpers.toFont(f);});}
function labelToDraw(ctx,rect,options,labelSize){const{overflow,padding}=options;const{width,height}=labelSize;if(overflow==="hidden"){return!(width+padding*2>rect.w||height+padding*2>rect.h);}else if(overflow==="fit"){const ratio=Math.min(rect.w/(width+padding*2),rect.h/(height+padding*2));if(ratio<1){return ratio;}}
return true;}
function getFontFromOptions(rect,labels){const{font,hoverFont}=labels;const optFont=(rect.active?hoverFont:font)||font;return helpers.isArray(optFont)?optFont.map((f)=>helpers.toFont(f)):[helpers.toFont(optFont)];}
function drawLabel(ctx,rect,options){const labels=options.labels;const content=labels.formatter;if(!content){return;}
const contents=helpers.isArray(content)?content:[content];let fonts=getFontFromOptions(rect,labels);let labelSize=measureLabelSize(ctx,contents,fonts);const lblToDraw=labelToDraw(ctx,rect,labels,labelSize);if(!lblToDraw){return;}
if(helpers.isNumber(lblToDraw)){labelSize={width:labelSize.width*lblToDraw,height:labelSize.height*lblToDraw};fonts=toFonts(fonts,lblToDraw);}
const{color,hoverColor,align}=labels;const optColor=(rect.active?hoverColor:color)||color;const colors=helpers.isArray(optColor)?optColor:[optColor];const xyPoint=calculateXYLabel(rect,labels,labelSize);ctx.textAlign=align;ctx.textBaseline="middle";let lhs=0;contents.forEach(function(l,i){const c=colors[Math.min(i,colors.length-1)];const f=fonts[Math.min(i,fonts.length-1)];const lh=f.lineHeight;ctx.font=f.string;ctx.fillStyle=c;ctx.fillText(l,xyPoint.x,xyPoint.y+lh/2+lhs);lhs+=lh;});}
function drawDivider(ctx,rect,options,item){const dividers=options.dividers;if(!dividers.display||!item._data.children.length){return;}
const{x,y,w,h}=rect;const{lineColor,lineCapStyle,lineDash,lineDashOffset,lineWidth}=dividers;ctx.save();ctx.strokeStyle=lineColor;ctx.lineCap=lineCapStyle;ctx.setLineDash(lineDash);ctx.lineDashOffset=lineDashOffset;ctx.lineWidth=lineWidth;ctx.beginPath();if(w>h){const w2=w/2;ctx.moveTo(x+w2,y);ctx.lineTo(x+w2,y+h);}else{const h2=h/2;ctx.moveTo(x,y+h2);ctx.lineTo(x+w,y+h2);}
ctx.stroke();ctx.restore();}
function calculateXYLabel(rect,options,labelSize){const{align,position,padding}=options;let x,y;x=calculateX(rect,align,padding);if(position==="top"){y=rect.y+padding;}else if(position==="bottom"){y=rect.y+rect.h-padding-labelSize.height;}else{y=rect.y+(rect.h-labelSize.height)/2+padding;}
return{x,y};}
function calculateX(rect,align,padding){if(align==="left"){return rect.x+padding;}else if(align==="right"){return rect.x+rect.w-padding;}
return rect.x+rect.w/2;}
class TreemapElement extends chart_js.Element{constructor(cfg){super();this.options=undefined;this.width=undefined;this.height=undefined;if(cfg){Object.assign(this,cfg);}}
draw(ctx,data){if(!data){return;}
const options=this.options;const{inner,outer}=boundingRects(this);const addRectPath=hasRadius(outer.radius)?helpers.addRoundedRectPath:addNormalRectPath;ctx.save();if(outer.w!==inner.w||outer.h!==inner.h){ctx.beginPath();addRectPath(ctx,outer);ctx.clip();addRectPath(ctx,inner);ctx.fillStyle=options.borderColor;ctx.fill("evenodd");}
ctx.beginPath();addRectPath(ctx,inner);ctx.fillStyle=options.backgroundColor;ctx.fill();drawDivider(ctx,inner,options,data);drawText(ctx,inner,options,data);ctx.restore();}
inRange(mouseX,mouseY,useFinalPosition){return inRange(this,mouseX,mouseY,useFinalPosition);}
inXRange(mouseX,useFinalPosition){return inRange(this,mouseX,null,useFinalPosition);}
inYRange(mouseY,useFinalPosition){return inRange(this,null,mouseY,useFinalPosition);}
getCenterPoint(useFinalPosition){const{x,y,width,height}=this.getProps(["x","y","width","height"],useFinalPosition);return{x:x+width/2,y:y+height/2,};}
tooltipPosition(){return this.getCenterPoint();}
getRange(axis){return axis==="x"?this.width/2:this.height/2;}}
TreemapElement.id="treemap";TreemapElement.defaults={borderRadius:0,borderWidth:0,captions:{align:undefined,color:"black",display:true,font:{},formatter:(ctx)=>ctx.raw.g||ctx.raw._data.label||"",padding:3,},dividers:{display:false,lineCapStyle:"butt",lineColor:"black",lineDash:[],lineDashOffset:0,lineWidth:1,},label:undefined,labels:{align:"center",color:"black",display:false,font:{},formatter(ctx){if(ctx.raw.g){return[ctx.raw.g,ctx.raw.v+""];}
return ctx.raw._data.label?[ctx.raw._data.label,ctx.raw.v+""]:ctx.raw.v+"";},overflow:"cut",position:"middle",padding:3,},rtl:false,spacing:0.5,unsorted:false,displayMode:"containerBoxes",};TreemapElement.descriptors={captions:{_fallback:true,},labels:{_fallback:true,},_scriptable:true,_indexable:false,};TreemapElement.defaultRoutes={backgroundColor:"backgroundColor",borderColor:"borderColor",};function getDims(itm,w2,s2,key){const a=itm._normalized;const ar=(w2*a)/s2;const d1=Math.sqrt(a*ar);const d2=a/d1;const w=key==="_ix"?d1:d2;const h=key==="_ix"?d2:d1;return{d1,d2,w,h};}
const getX=(rect,w)=>(rect.rtl?rect.x+rect.iw-w:rect.x+rect._ix);function buildRow(rect,itm,dims,sum){const r={x:getX(rect,dims.w),y:rect.y+rect._iy,w:dims.w,h:dims.h,a:itm._normalized,v:itm.value,vs:itm.values,s:sum,_data:itm._data,};if(itm.group){r.g=itm.group;r.l=itm.level;r.gs=itm.groupSum;}
return r;}
class Rect{constructor(r){r=r||{w:1,h:1};this.rtl=!!r.rtl;this.unsorted=!!r.unsorted;this.x=r.x||r.left||0;this.y=r.y||r.top||0;this._ix=0;this._iy=0;this.w=r.w||r.width||r.right-r.left;this.h=r.h||r.height||r.bottom-r.top;}
get area(){return this.w*this.h;}
get iw(){return this.w-this._ix;}
get ih(){return this.h-this._iy;}
get dir(){const ih=this.ih;return ih<=this.iw&&ih>0?"y":"x";}
get side(){return this.dir==="x"?this.iw:this.ih;}
map(arr){const{dir,side}=this;const key=dir==="x"?"_ix":"_iy";const sum=arr.nsum;const row=arr.get();const w2=side*side;const s2=sum*sum;const ret=[];let maxd2=0;let totd1=0;for(const itm of row){const dims=getDims(itm,w2,s2,key);totd1+=dims.d1;maxd2=Math.max(maxd2,dims.d2);ret.push(buildRow(this,itm,dims,arr.sum));this[key]+=dims.d1;}
this[dir==="x"?"_iy":"_ix"]+=maxd2;this[key]-=totd1;return ret;}}
const min=Math.min;const max=Math.max;function getStat(sa){return{min:sa.min,max:sa.max,sum:sa.sum,nmin:sa.nmin,nmax:sa.nmax,nsum:sa.nsum,};}
function getNewStat(sa,o){const v=+o[sa.key];const n=v*sa.ratio;o._normalized=n;return{min:min(sa.min,v),max:max(sa.max,v),sum:sa.sum+v,nmin:min(sa.nmin,n),nmax:max(sa.nmax,n),nsum:sa.nsum+n,};}
function setStat(sa,stat){Object.assign(sa,stat);}
function push(sa,o,stat){sa._arr.push(o);setStat(sa,stat);}
class StatArray{constructor(key,ratio){const me=this;me.key=key;me.ratio=ratio;me.reset();}
get length(){return this._arr.length;}
reset(){const me=this;me._arr=[];me._hist=[];me.sum=0;me.nsum=0;me.min=Infinity;me.max=-Infinity;me.nmin=Infinity;me.nmax=-Infinity;}
push(o){push(this,o,getNewStat(this,o));}
pushIf(o,fn,...args){const nstat=getNewStat(this,o);if(!fn(getStat(this),nstat,args)){return o;}
push(this,o,nstat);}
get(){return this._arr;}}
function compareAspectRatio(oldStat,newStat,args){if(oldStat.sum===0){return true;}
const[length]=args;const os2=oldStat.nsum*oldStat.nsum;const ns2=newStat.nsum*newStat.nsum;const l2=length*length;const or=Math.max((l2*oldStat.nmax)/os2,os2/(l2*oldStat.nmin));const nr=Math.max((l2*newStat.nmax)/ns2,ns2/(l2*newStat.nmin));return nr<=or;}
function squarify(values,rectangle,keys=[],grp,lvl,gsum){values=values||[];const rows=[];const rect=new Rect(rectangle);const row=new StatArray("value",rect.area/sum(values,keys[0]));let length=rect.side;const n=values.length;let i,o;if(!n){return rows;}
const tmp=values.slice();let key=index(tmp,keys[0]);if(!rectangle?.unsorted){sort(tmp,key);}
const val=(idx)=>(key?+tmp[idx][key]:+tmp[idx]);const gval=(idx)=>grp&&tmp[idx][grp];for(i=0;i<n;++i){o={value:val(i),groupSum:gsum,_data:values[tmp[i]._idx],level:undefined,group:undefined,};if(grp){o.level=lvl;o.group=gval(i);const tmpRef=tmp[i];o.values=keys.reduce(function(obj,k){obj[k]=+tmpRef[k];return obj;},{});}
o=row.pushIf(o,compareAspectRatio,length);if(o){rows.push(rect.map(row));length=rect.side;row.reset();row.push(o);}}
if(row.length){rows.push(rect.map(row));}
return flatten(rows);}
var version="3.1.0";function scaleRect(sq,xScale,yScale,sp){const sp2=sp*2;const x=xScale.getPixelForValue(sq.x);const y=yScale.getPixelForValue(sq.y);const w=xScale.getPixelForValue(sq.x+sq.w)-x;const h=yScale.getPixelForValue(sq.y+sq.h)-y;return{x:x+sp,y:y+sp,width:w-sp2,height:h-sp2,hidden:sp2>w||sp2>h,};}
function rectNotEqual(r1,r2){return(!r1||!r2||r1.x!==r2.x||r1.y!==r2.y||r1.w!==r2.w||r1.h!==r2.h||r1.rtl!==r2.rtl||r1.unsorted!==r2.unsorted);}
function arrayNotEqual(a,b){let i,n;if(!a||!b){return true;}
if(a===b){return false;}
if(a.length!==b.length){return true;}
for(i=0,n=a.length;i<n;++i){if(a[i]!==b[i]){return true;}}
return false;}
function buildData(tree,dataset,keys,mainRect){const treeLeafKey=dataset.treeLeafKey||"_leaf";if(helpers.isObject(tree)){tree=normalizeTreeToArray(keys,treeLeafKey,tree);}
const groups=dataset.groups||[];const glen=groups.length;const sp=dataset.displayMode==="headerBoxes"?0:helpers.valueOrDefault(dataset.spacing,0);const captions=dataset.captions||{};const font=helpers.toFont(captions.font);const padding=helpers.valueOrDefault(captions.padding,3);function recur(treeElements,gidx,rect,parent,gs){const g=getGroupKey(groups[gidx]);const pg=gidx>0&&getGroupKey(groups[gidx-1]);const gdata=group(treeElements,g,keys,treeLeafKey,pg,parent,groups.filter((item,index)=>index<=gidx));const gsq=squarify(gdata,rect,keys,g,gidx,gs);const ret=gsq.slice();if(gidx<glen-1){gsq.forEach((sq)=>{const bw=dataset.displayMode==="headerBoxes"?{l:0,r:0,t:0,b:0}:parseBorderWidth(dataset.borderWidth,sq.w/2,sq.h/2);const subRect={...rect,x:sq.x+sp+bw.l,y:sq.y+sp+bw.t,w:sq.w-2*sp-bw.l-bw.r,h:sq.h-2*sp-bw.t-bw.b,};if(shouldDrawCaption(dataset.displayMode,subRect,captions)){const captionHeight=getCaptionHeight(dataset.displayMode,subRect,font,padding);subRect.y+=captionHeight;subRect.h-=captionHeight;}
const children=[];gdata.forEach((gEl)=>{children.push(...recur(gEl.children,gidx+1,subRect,sq.g,sq.s));});ret.push(...children);sq.isLeaf=!children.length;});}else{gsq.forEach((sq)=>{sq.isLeaf=true;});}
return ret;}
const result=glen?recur(tree,0,mainRect):squarify(tree,mainRect,keys);return result.map((d)=>{if(dataset.displayMode!=="headerBoxes"||d.isLeaf){return d;}
if(!shouldDrawCaption(dataset.displayMode,d,captions)){return undefined;}
const captionHeight=getCaptionHeight(dataset.displayMode,d,font,padding);return{...d,h:captionHeight};}).filter((d)=>d);}
class TreemapController extends chart_js.DatasetController{constructor(chart,datasetIndex){super(chart,datasetIndex);this._groups=undefined;this._keys=undefined;this._rect=undefined;this._rectChanged=true;}
initialize(){this.enableOptionSharing=true;super.initialize();}
getMinMax(scale){return{min:0,max:scale.axis==="x"?scale.right-scale.left:scale.bottom-scale.top,};}
configure(){super.configure();const{xScale,yScale}=this.getMeta();if(!xScale||!yScale){return;}
const w=xScale.right-xScale.left;const h=yScale.bottom-yScale.top;const rect={x:0,y:0,w,h,rtl:!!this.options.rtl,unsorted:!!this.options.unsorted};if(rectNotEqual(this._rect,rect)){this._rect=rect;this._rectChanged=true;}
if(this._rectChanged){xScale.max=w;xScale.configure();yScale.max=h;yScale.configure();}}
update(mode){const dataset=this.getDataset();const{data}=this.getMeta();const groups=dataset.groups||[];const keys=[dataset.key||""].concat(dataset.sumKeys||[]);const tree=(dataset.tree=dataset.tree||dataset.data||[]);if(mode==="reset"){this.configure();}
if(this._rectChanged||arrayNotEqual(this._keys,keys)||arrayNotEqual(this._groups,groups)||this._prevTree!==tree){this._groups=groups.slice();this._keys=keys.slice();this._prevTree=tree;this._rectChanged=false;dataset.data=buildData(tree,dataset,this._keys,this._rect);this._dataCheck();this._resyncElements();}
this.updateElements(data,0,data.length,mode);}
updateElements(rects,start,count,mode){const reset=mode==="reset";const dataset=this.getDataset();const firstOpts=(this._rect.options=this.resolveDataElementOptions(start,mode));const sharedOptions=this.getSharedOptions(firstOpts);const includeOptions=this.includeOptions(mode,sharedOptions);const{xScale,yScale}=this.getMeta(this.index);for(let i=start;i<start+count;i++){const options=sharedOptions||this.resolveDataElementOptions(i,mode);const properties=scaleRect(dataset.data[i],xScale,yScale,options.spacing);if(reset){properties.width=0;properties.height=0;}
if(includeOptions){properties.options=options;}
this.updateElement(rects[i],i,properties,mode);}
this.updateSharedOptions(sharedOptions,mode,firstOpts);}
draw(){const{ctx,chartArea}=this.chart;const metadata=this.getMeta().data||[];const dataset=this.getDataset();const data=dataset.data;helpers.clipArea(ctx,chartArea);for(let i=0,ilen=metadata.length;i<ilen;++i){const rect=metadata[i];if(!rect.hidden){rect.draw(ctx,data[i]);}}
helpers.unclipArea(ctx);}}
TreemapController.id="treemap";TreemapController.version=version;TreemapController.defaults={dataElementType:"treemap",animations:{numbers:{type:"number",properties:["x","y","width","height"],},},};TreemapController.descriptors={_scriptable:true,_indexable:false,};TreemapController.overrides={interaction:{mode:"point",includeInvisible:true,intersect:true,},hover:{},plugins:{tooltip:{position:"treemap",intersect:true,callbacks:{title(items){if(items.length){const item=items[0];return item.dataset.key||"";}
return"";},label(item){const dataset=item.dataset;const dataItem=dataset.data[item.dataIndex];const label=dataItem.g||dataItem._data.label||dataset.label;return(label?label+": ":"")+dataItem.v;},},},},scales:{x:{type:"linear",alignToPixels:true,bounds:"data",display:false,},y:{type:"linear",alignToPixels:true,bounds:"data",display:false,reverse:true,},},};TreemapController.beforeRegister=function(){requireVersion("chart.js","3.8",chart_js.Chart.version);};TreemapController.afterRegister=function(){const tooltipPlugin=chart_js.registry.plugins.get("tooltip");if(tooltipPlugin){tooltipPlugin.positioners.treemap=function(active){if(!active.length){return false;}
const item=active[active.length-1];const el=item.element;return el.tooltipPosition();};}else{console.warn("Unable to register the treemap positioner because tooltip plugin is not registered");}};TreemapController.afterUnregister=function(){const tooltipPlugin=chart_js.registry.plugins.get("tooltip");if(tooltipPlugin){delete tooltipPlugin.positioners.treemap;}};chart_js.Chart.register(TreemapController,TreemapElement);exports.flatten=flatten;exports.getGroupKey=getGroupKey;exports.group=group;exports.index=index;exports.normalizeTreeToArray=normalizeTreeToArray;exports.requireVersion=requireVersion;exports.sort=sort;exports.sum=sum;});;

/* /survey/static/src/utils.js */
odoo.define('@survey/utils',[],function(require){'use strict';let __exports={};async function animate(el,keyFrame,duration){if(!el){return;}
const animation=el.animate(keyFrame,{duration,iterations:1,fill:"forwards",});await animation.finished;try{animation.commitStyles();}catch{}
animation.cancel();}
function normalizeToArray(els){if(els){if(els.nodeName&&["FORM","SELECT"].includes(els.nodeName)){return[els];}
return els[Symbol.iterator]?els:[els];}else{return[];}}
__exports.fadeOut=fadeOut;async function fadeOut(els,duration,afterFadeOutCallback){els=normalizeToArray(els);const promises=[];for(const el of els){promises.push(animate(el,[{opacity:0}],duration));}
await Promise.all(promises);for(const el of els){el.classList.add("d-none");}
afterFadeOutCallback?.();}
__exports.fadeIn=fadeIn;async function fadeIn(els,duration,afterFadeInCallback){els=normalizeToArray(els);const promises=[];for(const el of els){el.classList.remove("d-none");promises.push(animate(el,[{opacity:1}],duration));}
await Promise.all(promises);afterFadeInCallback?.();}
return __exports;});;

/* /survey/static/src/js/survey_preload_image_mixin.js */
odoo.define('@survey/js/survey_preload_image_mixin',[],function(require){'use strict';let __exports={};__exports.preloadBackground=preloadBackground;async function preloadBackground(imageUrl){let resolvePreload;const preloadPromise=new Promise(function(resolve,reject){resolvePreload=resolve;});const background=new Image();background.addEventListener("load",()=>resolvePreload(imageUrl),{once:true});background.src=imageUrl;return preloadPromise;}
return __exports;});;

/* /survey/static/src/interactions/survey_enter_tooltip.js */
odoo.define('@survey/interactions/survey_enter_tooltip',['@web/core/browser/feature_detection','@web/core/l10n/translation','@web/core/registry','@web/public/interaction'],function(require){'use strict';let __exports={};const{isMacOS}=require("@web/core/browser/feature_detection");const{appTranslateFn}=require("@web/core/l10n/translation");const _t=(str,...args)=>appTranslateFn(str,"survey",...args);const{registry}=require("@web/core/registry");const{Interaction}=require("@web/public/interaction");const SurveyEnterTooltip=__exports.SurveyEnterTooltip=class SurveyEnterTooltip extends Interaction{static selector=".o_survey_form #enter-tooltip";dynamicSelectors={...this.dynamicSelectors,_inputs:()=>document.querySelectorAll(".o_survey_form .form-control"),};dynamicContent={_inputs:{"t-on-focusin":this.updateEnterButtonText,"t-on-focusout":this.updateEnterButtonText,},_root:{"t-out":()=>this.enterTooltipText,},};setup(){this.isMac=isMacOS();this.defaultText=_t("or press Enter");this.otherText=isMacOS()?_t("or press ⌘+Enter"):_t("or press CTRL+Enter");this.enterTooltipText=this.defaultText;const{questionsLayout}=document.querySelector("form.o_survey-fill-form")?.dataset||{};this.surveyQuestionsLayout=questionsLayout;}
start(){const activeEl=document.activeElement;this.updateTooltip(document.hasFocus()&&activeEl.tagName.toLowerCase()==="textarea"&&activeEl.classList.contains("form-control"));this.updateContent();}
updateEnterButtonText(ev){const targetEl=ev.target;const isTextbox=ev.type==="focusin"&&targetEl.tagName.toLowerCase()==="textarea";this.updateTooltip(isTextbox);}
updateTooltip(isTextbox){this.enterTooltipText=isTextbox||["one_page","page_per_section"].includes(this.surveyQuestionsLayout)?this.otherText:this.defaultText;}}
registry.category("public.interactions").add("survey.SurveyEnterTooltip",SurveyEnterTooltip);return __exports;});;

/* /survey/static/src/interactions/survey_form.js */
odoo.define('@survey/interactions/survey_form',['@web/core/browser/cookie','@web/core/l10n/translation','@web/core/network/rpc','@web/core/confirmation_dialog/confirmation_dialog','@web/core/l10n/dates','@web/core/registry','@web/core/ui/ui_service','@web/core/utils/autoresize','@web/public/interaction','@web/core/utils/urls','@web/core/utils/scrolling','@survey/js/survey_preload_image_mixin','@survey/utils'],function(require){'use strict';let __exports={};const{cookie}=require("@web/core/browser/cookie");const{appTranslateFn}=require("@web/core/l10n/translation");const _t=(str,...args)=>appTranslateFn(str,"survey",...args);const{rpc}=require("@web/core/network/rpc");const{ConfirmationDialog}=require("@web/core/confirmation_dialog/confirmation_dialog");const{deserializeDate,deserializeDateTime,parseDateTime,parseDate,serializeDateTime,serializeDate,}=require("@web/core/l10n/dates");const{registry}=require("@web/core/registry");const{utils:uiUtils}=require("@web/core/ui/ui_service");const{resizeTextArea}=require("@web/core/utils/autoresize");const{Interaction}=require("@web/public/interaction");const{redirect}=require("@web/core/utils/urls");const{scrollTo}=require("@web/core/utils/scrolling");const{preloadBackground}=require("@survey/js/survey_preload_image_mixin");const{fadeIn,fadeOut}=require("@survey/utils");const{DateTime}=luxon;const SurveyForm=__exports.SurveyForm=class SurveyForm extends Interaction{static selector=".o_survey_form";dynamicSelectors={...this.dynamicSelectors,_background:()=>document.querySelector("div.o_survey_background"),};dynamicContent={_document:{"t-on-keydown":(ev)=>{if(this.listenOnKeydown){this.onKeyDown(ev);}},},".o_survey_lang_selector":{"t-on-change":this.onLanguageChange},".o_survey_form_choice_item":{"t-on-change":this.onChoiceItemChange},".o_survey_matrix_btn":{"t-on-click":this.onMatrixButtonClick},"input[type='radio']":{"t-on-click":this.onRadioChoiceClick},"button[type='submit']":{"t-on-click":this.onSubmit},".o_survey_choice_img img":{"t-on-click":this.onChoiceImageClick},".o_survey_breadcrumb_container .breadcrumb-item a":{"t-on-click.prevent":this.onBreadcrumbClick,},".o_survey_breadcrumb_container":{"t-att-class":()=>({"d-none":!this.showBreadcrumb}),},_background:{"t-att-class":()=>({o_survey_background_transition:this.background.transition}),"t-att-style":()=>{if(this.background.shouldUpdate){return{"background-image":`url("${this.background.image}")`,};}
return{};},},};setup(){this.dialog=this.services.dialog;this.fadeInOutDelay=400;this.formEl=this.el.querySelector("form.o_survey-fill-form");const optionsData=this.el.querySelector("form.o_survey-fill-form").dataset;this.options={scoringType:optionsData.scoringType,answerToken:optionsData.answerToken,surveyToken:optionsData.surveyToken,usersCanGoBack:!!optionsData.usersCanGoBack,sessionInProgress:!!optionsData.sessionInProgress,isStartScreen:!!optionsData.isStartScreen,readonly:!!optionsData.readonly,hasAnswered:!!optionsData.hasAnswered,isPageDescription:!!optionsData.isPageDescription,questionsLayout:optionsData.questionsLayout,triggeredQuestionsByAnswer:JSON.parse(optionsData.triggeredQuestionsByAnswer),triggeringAnswersByQuestion:JSON.parse(optionsData.triggeringAnswersByQuestion),selectedAnswers:JSON.parse(optionsData.selectedAnswers),refreshBackground:!!optionsData.refreshBackground,};this.readonly=this.options.readonly;this.selectedAnswers=this.options.selectedAnswers;this.imgZoomer=false;this.listenOnKeydown=!this.readonly;this.nextScreenResult;this.showBreadcrumb=false;this.notificationDestructors=[];this.background={transition:false,image:"",shouldUpdate:false,};const url=new URL(window.location.href);const languageChanged=url.searchParams.has("language-changed");if(languageChanged){url.searchParams.delete("language-changed");window.history.replaceState({},"",url.href);}
const backgroundUrl=document.querySelector("div.o_survey_background").style.backgroundImage?.slice(4,-1).replace(/['"]/g,"");const language=document.querySelector(".o_survey_lang_selector option[selected]")?.value;if(languageChanged&&backgroundUrl&&language){this.background.shouldUpdate=true;this.background.image=`/${language}/${backgroundUrl}`;}
this.submitting=false;this.breadcrumbData=null;if(!cookie.get(`survey_${this.options.surveyToken}`)){cookie.set(`survey_${this.options.surveyToken}`,this.options.answerToken,60*60*24,"optional");}
if(this.options.sessionInProgress&&(this.options.isStartScreen||this.options.hasAnswered||this.options.isPageDescription)){this.preventEnterSubmit=true;}}
async willStart(){const busService=this.services.bus_service;if(this.options.surveyToken&&this.options.sessionInProgress){busService.addChannel(this.options.surveyToken);await this.checkIsOnMainTab();busService.subscribe("next_question",this.onNextQuestionNotification.bind(this));busService.subscribe("end_session",this.onEndSessionNotification.bind(this));}
this.initChoiceItems();this.initTextArea();this.enableSubmitButtons();this.focusOnFirstInput();}
start(){this.surveyProgressEl=document.querySelector(".o_survey_progress_wrapper");this.surveyNavigationEl=document.querySelector(".o_survey_navigation_wrapper");if(!this.options.isStartScreen&&!this.readonly){this.initTimer();this.initBreadcrumb();}
this.updateNavigationListeners();this.updateContent();}
onKeyDown(ev){const ctrlKeyClicked=ev.ctrlKey||ev.metaKey;const inputFocused=document.activeElement.tagName.toLowerCase()==="input"&&document.hasFocus();if(["one_page","page_per_section"].includes(this.options.questionsLayout)&&!this.options.isStartScreen){if(inputFocused&&ev.key==="Enter"){ev.preventDefault();}
if(!ctrlKeyClicked||ev.key!=="Enter"){return;}}
if(this.el.querySelector("fieldset[disabled='disabled']")){return;}
if(this.imgZoomer&&!this.imgZoomer.isDestroyed()&&ev.key!=="Escape"){return;}
const textareaFocused=document.activeElement.tagName.toLowerCase()==="textarea"&&document.hasFocus();if((textareaFocused||inputFocused)&&(!ctrlKeyClicked||ev.key!=="Enter")){return;}
if(ev.key==="Enter"||ev.key==="ArrowRight"){ev.preventDefault();if(this.showingCorrectAnswers){this.showingCorrectAnswers=false;this.nextScreen(this.nextScreenPromise,this.nextScreenOptions);return;}
if(this.preventEnterSubmit){return;}
this.submitForm({isFinish:!!this.el.querySelector("button[value='finish']"),nextSkipped:this.el.querySelector("button[value='next_skipped']")?ev.key==="Enter":false,});return;}
if(ev.key==="ArrowLeft"){if(this.showingCorrectAnswers){return;}
document.querySelector(".o_survey_navigation_submit[value='previous']")?.click();return;}
if(this.showingCorrectAnswers||!ev.key.match(/[a-z]/i)){return;}
const choiceInputEl=this.el.querySelector(`input[data-selection-key=${ev.key.toUpperCase()}]`);if(choiceInputEl){choiceInputEl.checked=!choiceInputEl.checked;this.triggerEvent(choiceInputEl,"change");ev.preventDefault();}}
async onChoiceItemChange(ev){const targetEl=ev.currentTarget;let questionEl=targetEl.closest(".o_survey_form_choice");if(!questionEl){questionEl=targetEl.closest(".o_survey_question_matrix");if(!questionEl){return;}}
const surveyLastTriggeringAnswers=this.el.querySelector(".o_survey_form_content_data").dataset.surveyLastTriggeringAnswers;if(surveyLastTriggeringAnswers){const currentSelectedAnswers=Array.from(this.el.querySelectorAll(`
                .o_survey_form_choice[data-question-type='simple_choice_radio'] input:checked,
                .o_survey_form_choice[data-question-type='multiple_choice'] input:checked
            `)).map((input)=>parseInt(input.value));const submitButton=this.el.querySelector("button[type=submit]");if(currentSelectedAnswers.some((answerId)=>surveyLastTriggeringAnswers.includes(answerId))){submitButton.value="next";submitButton.textContent=_t("Continue");submitButton.classList.replace("btn-secondary","btn-primary");}else{submitButton.value="finish";submitButton.textContent=_t("Submit");submitButton.classList.replace("btn-primary","btn-secondary");}}
this.applyCommentAreaVisibility(questionEl);const isQuestionComplete=this.checkConditionalQuestionsConfiguration(targetEl,questionEl);if(!isQuestionComplete||!this.options.usersCanGoBack){return;}
const isLastQuestion=!!this.el.querySelector("button[value='finish']");if(isLastQuestion){return;}
const questionHasComment=targetEl.classList.contains("o_survey_js_form_other_comment")||targetEl.closest(".js_question-wrapper").querySelector(".o_survey_comment");if(!questionHasComment){await this.submitForm({nextSkipped:!!questionEl.dataset.isSkippedQuestion,});}}
onChoiceImageClick(ev){if(!uiUtils.isSmall()){ev.preventDefault();}
this.renderAt("survey.survey_image_zoomer",{sourceImage:ev.currentTarget.src},document.body);}
removeTimer(){if(this.timerEl){this.services["public.interactions"].stopInteractions(this.timerEl);this.timerEl.remove();}}
replaceContent(content,locationEl){const parser=new DOMParser();const contentEls=parser.parseFromString(content,"text/html").body.children;locationEl.replaceChildren();while(contentEls.length>0){this.insert(contentEls.item(0),locationEl);}}
onMatrixButtonClick(ev){if(this.readonly){return;}
const targetEl=ev.currentTarget;const inputEl=targetEl.querySelector("input");inputEl.checked=!inputEl.checked;this.triggerEvent(inputEl,"change");}
onRadioChoiceClick(ev){const targetEl=ev.currentTarget;if(targetEl.classList.contains("o_survey_form_choice_item_selected")){targetEl.checked=false;targetEl.classList.remove("o_survey_form_choice_item_selected");this.triggerEvent(targetEl,"change");}else{this.el.querySelector(`input[type="radio"][name="${targetEl.getAttribute(
                        "name"
                    )}"].o_survey_form_choice_item_selected`)?.classList.remove("o_survey_form_choice_item_selected");targetEl.classList.add("o_survey_form_choice_item_selected");}}
onSubmit(ev){ev.preventDefault();const targetEl=ev.currentTarget;if(targetEl.value==="previous"){this.submitForm({previousPageId:parseInt(targetEl.dataset.previousPageId)});}else if(targetEl.value==="next_skipped"){this.submitForm({nextSkipped:true});}else if(targetEl.value==="finish"&&!this.options.sessionInProgress){this.dialog.add(ConfirmationDialog,{title:_t("Submit confirmation"),body:_t("Are you sure you want to submit the survey?"),confirmLabel:_t("Submit"),confirm:()=>{this.waitForTimeout(()=>this.submitForm({isFinish:true}),0);},cancel:()=>{},});}else{this.submitForm();}}
onBreadcrumbClick(ev){const previousPageId=Number(ev.currentTarget.closest(".breadcrumb-item").dataset.pageId);this.submitForm({previousPageId});}
onNextQuestionNotification(notification){let serverDelayMS=(DateTime.now().toSeconds()-notification.question_start)*1000;if(serverDelayMS<0){serverDelayMS=0;}else if(serverDelayMS>1000){serverDelayMS=1000;}
this.fadeInOutDelay=(1000-serverDelayMS)/2;this.goToNextPage();}
onEndSessionNotification(){if(this.options.isStartScreen){return;}
this.fadeInOutDelay=400;this.goToNextPage(true);}
onLanguageChange(){const languageCode=this.el.querySelector(".o_survey_lang_selector[name='lang_code']").value;const pathName=document.location.pathname;const indexOfSurvey=pathName.indexOf("/survey/");if(indexOfSurvey>=0){const url=new URL(window.location.href);url.pathname=`/${languageCode}${pathName.substring(indexOfSurvey)}`;url.searchParams.set("language-changed",true);redirect(url.href);}}
goToNextPage(isFinish=false){fadeOut(this.el.querySelectorAll(".o_survey_main_title, .o_lang_selector"),400);this.preventEnterSubmit=false;this.readonly=false;this.nextScreen(rpc(`/survey/next_question/${this.options.surveyToken}/${this.options.answerToken}`),{initTimer:true,isFinish,});}
async submitForm(options={}){if(this.submitting){return;}
this.submitting=true;const params={};if(options.previousPageId){params.previous_page_id=options.previousPageId;}
if(options.nextSkipped){params.next_skipped_page_or_question=true;}
let route="/survey/submit";if(this.options.isStartScreen){params.lang_code=this.el.querySelector(".o_survey_lang_selector[name='lang_code']").value;route="/survey/begin";if(this.options.questionsLayout==="page_per_question"){fadeOut(this.el.querySelector(".o_survey_main_title"),400);}
fadeOut(this.el.querySelector(".o_survey_lang_selector"),400);}else{const formData=new FormData(this.formEl);if(!options.skipValidation){if(!this.validateForm(this.formEl,formData)){this.submitting=false;return;}}
this.prepareSubmitValues(formData,params);}
if(this.options.sessionInProgress){this.fadeInOutDelay=400;this.readonly=true;}
try{const submitPromise=rpc(`${route}/${this.options.surveyToken}/${this.options.answerToken}`,params);if(!this.options.isStartScreen&&this.options.scoringType==="scoring_with_answers_after_page"){const[correctAnswers]=await this.waitFor(submitPromise);if(Object.keys(correctAnswers).length&&this.el.querySelector(".js_question-wrapper")){this.showCorrectAnswers(correctAnswers,submitPromise,options);return;}}
await this.nextScreen(submitPromise,options);}finally{this.submitting=false;}}
async nextScreen(nextScreenPromise,options){const selectorsToFadeout=[".o_survey_form_content"];if(options.isFinish&&!this.nextScreenResult?.has_skipped_questions){document.querySelector('.o_survey_main_title_fade')?.classList.replace("opacity-100","opacity-0");selectorsToFadeout.push(".breadcrumb",".o_survey_timer");cookie.delete(`survey_${this.options.surveyToken}`);}
const fadeOutPromise=this.waitFor(fadeOut(this.el.querySelectorAll(selectorsToFadeout.join(",")),this.fadeInOutDelay));if(this.options.refreshBackground){this.background.transition=true;}
const nextScreenWithBackgroundPromise=(async()=>{const[,result]=await nextScreenPromise;this.nextScreenResult=result;if(this.options.refreshBackground&&result.background_image_url){return preloadBackground(result.background_image_url);}else{return Promise.resolve();}})();await this.waitFor(Promise.all([fadeOutPromise,nextScreenWithBackgroundPromise]));return this.onNextScreenDone(options);}
onNextScreenDone(options){const result=this.nextScreenResult;if((!(options&&options.isFinish)||result.has_skipped_questions)&&!this.options.sessionInProgress){this.preventEnterSubmit=false;}
if(result&&result.fields&&result.error==="validation"){fadeIn(this.el.querySelector(".o_survey_form_content"),0);this.showErrors(result.fields);return;}
if(!result||result.error){this.notificationDestructors.push(this.services.notification.add(_t("There was an error during the validation of the survey."),{type:"danger",sticky:true}));return;}
const formContentEl=this.el.querySelector(".o_survey_form_content");this.replaceContent(result.survey_content,formContentEl);if(result.survey_progress&&this.surveyProgressEl){this.replaceContent(result.survey_progress,this.surveyProgressEl);}else if(options.isFinish&&this.surveyProgressEl){this.surveyProgressEl.remove();}
if(result.survey_navigation&&this.surveyNavigationEl){this.replaceContent(result.survey_navigation,this.surveyNavigationEl);this.updateNavigationListeners();}
if(this.options.questionsLayout==="page_per_question"&&this.el.querySelector(".o_survey_finished")){options.isFinish=true;}
if(this.options.isStartScreen&&this.options.questionsLayout!=='page_per_question'){document.querySelector('.o_survey_main_title_fade')?.classList.replace("opacity-0","opacity-100");}
if(this.options.isStartScreen||(options&&options.initTimer)){this.initTimer();this.options.isStartScreen=false;}else{if(this.options.sessionInProgress){this.removeTimer();}}
if(options&&options.isFinish&&!result.has_skipped_questions){if(this.breadcrumbEl){this.showBreadcrumb=false;this.breadcrumbEl.replaceChildren();}
this.removeTimer();}else{this.updateBreadcrumb();}
this.initChoiceItems();this.initTextArea();if(this.options.sessionInProgress&&this.options.isPageDescription){this.preventEnterSubmit=true;}
if(this.options.refreshBackground){this.background.transition=false;this.background.image=result.background_image_url;this.background.shouldUpdate=true;}
fadeIn(formContentEl,this.fadeInOutDelay);this.enableSubmitButtons();this.focusOnFirstInput();this.scrollTop();this.scrollToFirstError();}
validateForm(formEl,formData){const errors={};const validationEmailMsg=_t("This answer must be an email address.");const validationDateMsg=_t("This is not a date");this.resetErrors();const data={};for(const[key,value]of formData.entries()){data[key]=value;}
const inactiveQuestionIds=this.options.sessionInProgress?[]:this.getInactiveConditionalQuestionIds();for(const inputEl of formEl.querySelectorAll("[data-question-type]")){const questionWrapperEl=inputEl.closest(".js_question-wrapper");const questionId=questionWrapperEl.id;if(inactiveQuestionIds.includes(parseInt(questionId))){continue;}
const questionRequired=questionWrapperEl.hasAttribute("data-required");const constrErrorMsg=questionWrapperEl.dataset.constrErrorMsg||"";const validationErrorMsg=questionWrapperEl.dataset.validationErrorMsg||"";const inputData={questionType:inputEl.dataset.questionType,validationLengthMin:Number(inputEl.dataset.validationLengthMin),validationLengthMax:Number(inputEl.dataset.validationLengthMax),validationFloatMin:Number(inputEl.dataset.validationFloatMin),validationFloatMax:Number(inputEl.dataset.validationFloatMax),minDate:inputEl.dataset.minDate,maxDate:inputEl.dataset.maxDate,};switch(inputData.questionType){case"char_box":if(questionRequired&&!inputEl.value){errors[questionId]=constrErrorMsg;}else if(inputEl.value&&inputEl.type==="email"&&!this.validateEmail(inputEl.value)){errors[questionId]=validationEmailMsg;}else{const lengthMin=inputData.validationLengthMin;const lengthMax=inputData.validationLengthMax;const length=inputEl.value.length;if(lengthMin&&(lengthMin>length||length>lengthMax)){errors[questionId]=validationErrorMsg;}}
break;case"text_box":if(questionRequired&&!inputEl.value){errors[questionId]=constrErrorMsg;}
break;case"numerical_box":if(questionRequired&&!data[questionId]){errors[questionId]=constrErrorMsg;}else{const floatMin=inputData.validationFloatMin;const floatMax=inputData.validationFloatMax;const value=parseFloat(inputEl.value);if(floatMin&&(floatMin>value||value>floatMax)){errors[questionId]=validationErrorMsg;}}
break;case"date":case"datetime":if(questionRequired&&!data[questionId]){errors[questionId]=constrErrorMsg;}else if(data[questionId]){const[parse,deserialize]=inputData.questionType==="date"?[parseDate,deserializeDate]:[parseDateTime,deserializeDateTime];const date=parse(inputEl.value);if(!date||!date.isValid){errors[questionId]=validationDateMsg;}else{const maxDate=deserialize(inputData.maxDate);const minDate=deserialize(inputData.minDate);if((maxDate.isValid&&date>maxDate)||(minDate.isValid&&date<minDate)){errors[questionId]=validationErrorMsg;}}}
break;case"scale":if(questionRequired&&!data[questionId]){errors[questionId]=constrErrorMsg;}
break;case"simple_choice_radio":case"multiple_choice":if(questionRequired){const textareaEl=questionWrapperEl.querySelector("textarea");if(!data[questionId]){errors[questionId]=constrErrorMsg;}else if(data[questionId]==="-1"&&!textareaEl.value){errors[questionId]=constrErrorMsg;}}
break;case"matrix":if(questionRequired){const subQuestionsIds=JSON.parse(inputEl.dataset.subQuestions);const questionBodySelector=`div[id="${questionId}"] > .o_survey_question_matrix > tbody`;for(const subQuestionId of subQuestionsIds){if(!(`${questionId}_${subQuestionId}`in data)){errors[questionId]=constrErrorMsg;this.el.querySelector(`${questionBodySelector} > tr[id="${subQuestionId}"] > th`).classList.add("bg-danger");}}}
break;}}
if(Object.keys(errors).length>0){this.showErrors(errors);return false;}
return true;}
validateEmail(email){const emailParts=email.split("@");return emailParts.length===2&&emailParts[0]&&emailParts[1];}
prepareSubmitValues(formData,params){for(const[key,value]of formData){if(["csrf_token","page_id","question_id","token"].includes(key)){params[key]=value;}}
for(const el of this.el.querySelectorAll("[data-question-type]")){switch(el.dataset.questionType){case"text_box":case"char_box":params[el.name]=el.value;break;case"numerical_box":params[el.name]=el.value;break;case"date":case"datetime":{const[parse,serialize]=el.dataset.questionType==="date"?[parseDate,serializeDate]:[parseDateTime,serializeDateTime];const date=parse(el.value);params[el.name]=date?serialize(date):"";break;}
case"scale":case"simple_choice_radio":case"multiple_choice":params=this.prepareSubmitChoices(params,el,el.dataset.name);break;case"matrix":params=this.prepareSubmitAnswersMatrix(params,el);break;}}}
prepareSubmitChoices(params,parentEl,questionId){for(const el of parentEl.querySelectorAll("input:checked")){if(el.value!=="-1"){params=this.prepareSubmitAnswer(params,questionId,el.value);}}
params=this.prepareSubmitComment(params,parentEl,questionId,false);return params;}
prepareSubmitAnswersMatrix(params,matrixTable){for(const el of matrixTable.querySelectorAll("input:checked")){params=this.prepareSubmitAnswerMatrix(params,matrixTable.dataset.name,Number(el.dataset.rowId),el.value);}
params=this.prepareSubmitComment(params,matrixTable.closest(".js_question-wrapper"),matrixTable.dataset.name,true);return params;}
prepareSubmitAnswerMatrix(params,questionId,rowId,colId,isComment){const value=questionId in params?params[questionId]:{};if(isComment){value["comment"]=colId;}else{if(rowId in value){value[rowId].push(colId);}else{value[rowId]=[colId];}}
params[questionId]=value;return params;}
prepareSubmitAnswer(params,questionId,value){if(questionId in params){if(params[questionId].constructor===Array){params[questionId].push(value);}else{params[questionId]=[params[questionId],value];}}else{params[questionId]=value;}
return params;}
prepareSubmitComment(params,parentEl,questionId,isMatrix){for(const el of parentEl.querySelectorAll("textarea")){if(el.value){const value={comment:el.value};if(isMatrix){params=this.prepareSubmitAnswerMatrix(params,questionId,el.name,el.value,true);}else{params=this.prepareSubmitAnswer(params,questionId,value);}}}
return params;}
initTextArea(){for(const el of this.el.querySelectorAll("textarea")){resizeTextArea(el);}}
initChoiceItems(){for(const el of this.el.querySelectorAll("input[type='radio'],input[type='checkbox']")){const matrixButtonEl=el.closest(".o_survey_matrix_btn");if(el.checked){const targetEl=matrixButtonEl?matrixButtonEl:el.closest("label");targetEl.classList.add("o_survey_selected");}}}
initBreadcrumb(){this.breadcrumbEl=this.el.querySelector(".o_survey_breadcrumb_container");if(!this.breadcrumbEl){return;}
const data=this.breadcrumbEl.dataset;this.breadcrumbData={surveyCanGoBack:!!data.canGoBack,pages:JSON.parse(data.pages),};this.showBreadcrumb=true;this.updateBreadcrumb();}
updateBreadcrumb(){if(!this.breadcrumbEl){this.initBreadcrumb();}else{const pageId=this.el.querySelector("input[name='page_id']")?.value;if(pageId){this.breadcrumbEl.replaceChildren();this.renderAt("survey.survey_breadcrumb_template",{currentPageId:parseInt(pageId),...this.breadcrumbData,},this.breadcrumbEl);}else{this.showBreadcrumb=false;}}}
initTimer(){this.removeTimer();const timerDataEl=this.el.querySelector(".o_survey_form_content_data");if(!timerDataEl){return;}
const timerData=timerDataEl.dataset;const questionTimeLimitReached=!!timerData.questionTimeLimitReached;const timeLimitMinutes=Number(timerData.timeLimitMinutes);const hasAnswered=!!timerData.hasAnswered;if(!questionTimeLimitReached&&!hasAnswered&&timeLimitMinutes){this.timerEl=document.createElement("span");this.timerEl.classList.add("o_survey_timer");this.insert(this.timerEl,this.el.querySelector(".o_survey_timer_container"));this.addListener(this.timerEl,"time_up",async()=>{if(this.showingCorrectAnswers){await this.nextScreen(this.nextScreenPromise,this.nextScreenOptions);}
this.submitForm({skipValidation:true,isFinish:!this.options.sessionInProgress,});});}}
applyCommentAreaVisibility(choiceItemGroupEl){if(!choiceItemGroupEl){return;}
const otherItemEl=choiceItemGroupEl.querySelector(".o_survey_js_form_other_comment");const commentInputEl=choiceItemGroupEl.querySelector("textarea[type='text']");if(!commentInputEl){return;}
if(otherItemEl?.checked||commentInputEl.classList.contains("o_survey_comment")){commentInputEl.disabled=false;commentInputEl.closest(".o_survey_comment_container").classList.remove("d-none");if(otherItemEl?.checked){commentInputEl.focus();}}else{commentInputEl.value="";commentInputEl.closest(".o_survey_comment_container").classList.add("d-none");commentInputEl.disabled=true;}}
focusOnFirstInput(){const inputEls=this.el.querySelector(".js_question-wrapper")?.querySelectorAll("input[type='text'],input[type='number'],textarea")||[];let firstTextInputEl=null;for(const inputEl of inputEls){if(inputEl.classList.contains("form-control")&&!inputEl.classList.contains("o_survey_comment")){firstTextInputEl=inputEl;break;}}
if(firstTextInputEl&&!uiUtils.isSmall()){firstTextInputEl.focus();}}
async checkIsOnMainTab(){const check=async(shouldReloadMasterTab)=>{if(await this.services.multi_tab.isOnMainTab()){if(shouldReloadMasterTab){window.location.reload();}
return;}
const checkAgain=()=>this.waitForTimeout(()=>check(true),1000);this.dialog.add(ConfirmationDialog,{title:_t("A problem has occurred"),body:_t("To take this survey, please close all other tabs on %(hostname)s",{hostname:window.location.hostname}),confirmLabel:_t("Continue here"),confirm:checkAgain,dismiss:checkAgain,});};return check(false);}
checkConditionalQuestionsConfiguration(targetEl,choiceItemGroupEl){let isQuestionComplete=false;const matrixButtonEl=targetEl.closest(".o_survey_matrix_btn");if(targetEl.type==="radio"){if(matrixButtonEl){for(const el of matrixButtonEl.closest("tr")?.querySelectorAll("td")||[]){el.classList.remove("o_survey_selected");}
if(targetEl.checked){matrixButtonEl.classList.add("o_survey_selected");}
if(this.options.questionsLayout==="page_per_question"){const subQuestionsIds=JSON.parse(matrixButtonEl.closest("table").dataset.subQuestions);const completedQuestions=[];for(const id of subQuestionsIds){if(this.el.querySelector(`tr[id="${id}"] input:checked`)){completedQuestions.push(id);}}
isQuestionComplete=completedQuestions.length===subQuestionsIds.length;}}else{const previouslySelectedAnswerEl=choiceItemGroupEl.querySelector("label.o_survey_selected");previouslySelectedAnswerEl?.classList.remove("o_survey_selected");const previouslySelectedAnswerId=previouslySelectedAnswerEl?.querySelector("input").value;if(previouslySelectedAnswerId&&this.options.questionsLayout!=="page_per_question"){this.selectedAnswers.splice(this.selectedAnswers.indexOf(parseInt(previouslySelectedAnswerId)),1);}
const newlySelectedAnswerEl=targetEl.closest("label");const newlySelectedAnswerId=targetEl.value;const isNewSelection=newlySelectedAnswerId!==previouslySelectedAnswerId;if(isNewSelection){newlySelectedAnswerEl.classList.add("o_survey_selected");isQuestionComplete=this.options.questionsLayout==="page_per_question";if(!isQuestionComplete){this.selectedAnswers.push(parseInt(newlySelectedAnswerId));}}
if(this.options.questionsLayout!=="page_per_question"){const toRecompute=(this.options.triggeredQuestionsByAnswer[previouslySelectedAnswerId]||[]).concat(this.options.triggeredQuestionsByAnswer[newlySelectedAnswerId]||[]);const conditionalQuestionsToRecomputeVisibility=new Set(toRecompute);this.applyConditionalQuestionsVisibility(conditionalQuestionsToRecomputeVisibility);}}}else{if(matrixButtonEl){matrixButtonEl.classList.toggle("o_survey_selected");}else{const labelEl=targetEl.closest("label");labelEl.classList.toggle("o_survey_selected");const answerId=targetEl.value;if(this.options.questionsLayout!=="page_per_question"){labelEl.classList.contains("o_survey_selected")?this.selectedAnswers.push(parseInt(answerId)):this.selectedAnswers.splice(this.selectedAnswers.indexOf(parseInt(answerId)),1);this.applyConditionalQuestionsVisibility(this.options.triggeredQuestionsByAnswer[answerId]);}}}
return isQuestionComplete;}
applyConditionalQuestionsVisibility(questionIds){if(!questionIds||(!questionIds.length&&!questionIds.size)){return;}
for(const questionId of questionIds){const dependingQuestionEl=this.el.querySelector(`.js_question-wrapper[id="${questionId}"]`);if(!dependingQuestionEl){continue;}
const hasNoSelectedTriggers=!this.options.triggeringAnswersByQuestion[questionId].some((answerId)=>this.selectedAnswers.includes(parseInt(answerId)));dependingQuestionEl.classList.toggle("d-none",hasNoSelectedTriggers);if(hasNoSelectedTriggers){for(const el of dependingQuestionEl.querySelectorAll("input")){if(el.type==="text"||el.type==="number"){el.value="";}else if(el.checked){el.checked=false;this.triggerEvent(el,"change");}}
for(const el of dependingQuestionEl.querySelectorAll("textarea")){el.value="";}}}
if(this.options.questionsLayout==="one_page"){const sections=this.el.querySelectorAll(".js_section_wrapper");for(const section of sections){if(!section.querySelector(".o_survey_description")){const hasVisibleQuestions=!!section.querySelector(".js_question-wrapper:not(.d-none)");section.classList.toggle("d-none",!hasVisibleQuestions);}}}}
getInactiveConditionalQuestionIds(){const inactiveQuestionIds=[];for(const[questionId,answerIds]of Object.entries(this.options.triggeringAnswersByQuestion||{})){if(!answerIds.some((answerId)=>this.selectedAnswers.includes(parseInt(answerId)))){inactiveQuestionIds.push(parseInt(questionId));}}
return inactiveQuestionIds;}
showCorrectAnswers(correctAnswers,submitPromise,options){for(const questionId of Object.keys(correctAnswers)){this.showQuestionAnswer(correctAnswers,questionId);}
const formEl=document.querySelector("form");for(const el of formEl.querySelectorAll("input, textarea, label, td")){el.blur();el.classList.add("pe-none");}
this.nextScreenPromise=submitPromise;this.nextScreenOptions=options;this.showingCorrectAnswers=true;formEl.querySelector("button[type='submit']").classList.add("d-none");const nextPageButtonEl=formEl.querySelector("button[id='next_page']");nextPageButtonEl.classList.remove("d-none");this.addListener(nextPageButtonEl,"click",async(ev)=>{ev.preventDefault();this.showingCorrectAnswers=false;return this.nextScreen(submitPromise,options);});}
showQuestionAnswer(correctAnswers,questionId){const correctAnswer=correctAnswers[questionId];const questionWrapperEl=this.el.querySelector(`.js_question-wrapper[id="${questionId}"]`);const answerWrapperEl=questionWrapperEl.querySelector(".o_survey_answer_wrapper");const questionType=questionWrapperEl.querySelector("[data-question-type]").dataset.questionType;if(["numerical_box","date","datetime"].includes(questionType)){const inputEl=answerWrapperEl.querySelector("input");let isCorrect;if(questionType==="numerical_box"){isCorrect=inputEl.valueAsNumber===correctAnswer;}else if(questionType==="datetime"){const datetime=parseDateTime(inputEl.value);const value=datetime?datetime.setZone("utc").toFormat("MM/dd/yyyy HH:mm:ss",{numberingSystem:"latn"}):"";isCorrect=value===correctAnswer;}else{isCorrect=inputEl.value===correctAnswer;}
answerWrapperEl.classList.add(`bg-${isCorrect ? "success" : "danger"}`);}else if(["simple_choice_radio","multiple_choice"].includes(questionType)){for(const buttonEl of answerWrapperEl.querySelectorAll(".o_survey_choice_btn")){const answerId=buttonEl.querySelector("input").value;const isCorrect=correctAnswer.includes(parseInt(answerId));buttonEl.classList.add(`bg-${isCorrect ? "success" : "danger"}`,"text-white");if(!isCorrect&&buttonEl.classList.contains("o_survey_selected")){let fromIcon="fa-check-circle";let toIcon="fa-times-circle";if(questionType==="multiple_choice"){fromIcon="fa-check-square";toIcon="fa-times-rectangle";}
buttonEl.querySelector(`i.${fromIcon}`)?.classList.replace(fromIcon,toIcon);}}}}
showErrors(errors){const errorKeys=Object.keys(errors||{});for(const key of errorKeys){this.el.querySelector(`[id="${key}"] > .o_survey_question_error`).replaceChildren();}
for(const key of errorKeys){const errorEl=this.el.querySelector(`[id="${key}"] > .o_survey_question_error`);const textEl=document.createElement("span");textEl.textContent=errors[key];this.insert(textEl,errorEl);errorEl.classList.add("slide_in");if(errorKeys[0]===key){scrollTo(this.el.querySelector(`.js_question-wrapper[id="${key}"]`),{behavior:"smooth",});}}}
scrollToFirstError(){const errorEl=this.el.querySelector(".o_survey_question_error :not(:empty)");errorEl?.scrollIntoView();}
resetErrors(){for(const el of this.el.querySelectorAll(".o_survey_question_error")){el.replaceChildren();el.classList.remove("slide_in");}
for(const notificationDestructor of this.notificationDestructors){notificationDestructor();}
this.notificationDestructors=[];for(const rowEl of this.el.querySelectorAll(".o_survey_question_matrix th.bg-danger")){rowEl.classList.remove("bg-danger");}}
triggerEvent(el,ev){el.dispatchEvent(new Event(ev,{bubbles:true}));}
scrollTop(){document.querySelector("#wrapwrap").scrollTo({top:0,behavior:"smooth"});}
enableSubmitButtons(){for(const submitButtonEl of this.el.querySelectorAll("button[type='submit']")){submitButtonEl.classList.remove("disabled");}}
updateNavigationListeners(){this.addListener(this.surveyNavigationEl.querySelectorAll(".o_survey_navigation_submit"),"click",this.onSubmit);}}
registry.category("public.interactions").add("survey.SurveyForm",SurveyForm);return __exports;});;

/* /survey/static/src/interactions/survey_image_zoomer.js */
odoo.define('@survey/interactions/survey_image_zoomer',['@web/public/interaction','@web/core/registry','@survey/utils'],function(require){'use strict';let __exports={};const{Interaction}=require("@web/public/interaction");const{registry}=require("@web/core/registry");const{fadeIn,fadeOut}=require("@survey/utils");const SurveyImageZoomer=__exports.SurveyImageZoomer=class SurveyImageZoomer extends Interaction{static selector=".o_survey_img_zoom_modal";dynamicContent={_root:{"t-on-click.prevent":this.onZoomerClick,},".o_survey_img_zoom_image":{"t-on-wheel":this.onImageScroll,"t-att-style":()=>({transform:`scale(${this.zoomImageScale}) !important`,}),},".o_survey_img_zoom_in_btn":{"t-on-click.stop":()=>this.addZoomSteps(1),},".o_survey_img_zoom_out_btn":{"t-on-click.stop":()=>this.addZoomSteps(-1),},};setup(){this.fadeInOutDelay=200;this.zoomImageScale=1;}
async willStart(){await fadeOut(this.el,0);fadeIn(this.el,this.fadeInOutDelay);}
onImageScroll(ev){ev.preventDefault();if(ev.wheelDelta>0||ev.detail<0){this.addZoomSteps(1);}else{this.addZoomSteps(-1);}}
async onZoomerClick(){await this.waitFor(fadeOut(this.el,this.fadeInOutDelay));this.el.remove();}
addZoomSteps(zoomStepNumber){const image=this.el.querySelector(".o_survey_img_zoom_image");const body=this.el.querySelector(".o_survey_img_zoom_body");const imageWidth=image.clientWidth;const imageHeight=image.clientHeight;const bodyWidth=body.clientWidth;const bodyHeight=body.clientHeight;const newZoomImageScale=this.zoomImageScale+zoomStepNumber*0.1;if(newZoomImageScale<=0.2){return;}
if(zoomStepNumber>0&&(imageWidth*newZoomImageScale>bodyWidth||imageHeight*newZoomImageScale>bodyHeight)){return;}
this.zoomImageScale=newZoomImageScale;}}
registry.category("public.interactions").add("survey.SurveyImageZoomer",SurveyImageZoomer);return __exports;});;

/* /survey/static/src/interactions/survey_print.js */
odoo.define('@survey/interactions/survey_print',['@web/public/interaction','@web/core/registry','@web/core/utils/autoresize'],function(require){'use strict';let __exports={};const{Interaction}=require("@web/public/interaction");const{registry}=require("@web/core/registry");const{resizeTextArea}=require("@web/core/utils/autoresize");const SurveyPrint=__exports.SurveyPrint=class SurveyPrint extends Interaction{static selector=".o_survey_print";dynamicContent={".o_survey_user_results_print":{"t-on-click":this.onPrintUserResultsClick},};start(){document.querySelectorAll("textarea").forEach((textarea)=>{resizeTextArea(textarea);});}
onPrintUserResultsClick(){window.print();}}
registry.category("public.interactions").add("survey.survey_print",SurveyPrint);return __exports;});;

/* /survey/static/src/interactions/survey_quick_access.js */
odoo.define('@survey/interactions/survey_quick_access',['@web/public/interaction','@web/core/network/rpc','@web/core/registry'],function(require){'use strict';let __exports={};const{Interaction}=require("@web/public/interaction");const{rpc}=require("@web/core/network/rpc");const{registry}=require("@web/core/registry");const SurveyQuickAccess=__exports.SurveyQuickAccess=class SurveyQuickAccess extends Interaction{static selector=".o_survey_quick_access";dynamicContent={_document:{"t-on-keypress":this.onKeyPress},"button[type='submit']":{"t-on-click.prevent":this.submitCode,"t-att-class":()=>({"d-none":this.isLaunchShown})},"#session_code":{"t-on-input":this.onSessionCodeInput},".o_survey_launch_session":{"t-on-click":this.onLaunchSessionClick,"t-att-class":()=>({"d-none":!this.isLaunchShown}),},".o_survey_session_error_not_launched":{"t-att-class":()=>({"d-none":this.errorCode!=="not_launched"})},".o_survey_session_error_invalid_code":{"t-att-class":()=>({"d-none":this.errorCode!=="invalid_code"})},};async onLaunchSessionClick(){const sessionResult=await this.waitFor(this.services.orm.call("survey.survey","action_start_session",[[parseInt(this.el.querySelector(".o_survey_launch_session").dataset.surveyId)]]));window.location=sessionResult.url;}
onSessionCodeInput(){this.errorCode="";this.isLaunchShown=false;}
onKeyPress(event){if(event.key==="Enter"){event.preventDefault();this.submitCode();}}
async submitCode(){this.errorCode="";const sessionCodeInputVal=encodeURIComponent(this.el.querySelector("input#session_code").value.trim());if(!sessionCodeInputVal){this.errorCode="invalid_code";return;}
const response=await this.waitFor(rpc(`/survey/check_session_code/${sessionCodeInputVal}`));this.protectSyncAfterAsync(()=>{if(response.survey_url){window.location=response.survey_url;}else{if(response.error&&response.error==="survey_session_not_launched"){this.errorCode="not_launched";if("survey_id"in response){this.isLaunchShown=true;this.el.querySelector(".o_survey_launch_session").dataset.surveyId=response.survey_id;}}else{this.errorCode="invalid_code";}}})();}}
registry.category("public.interactions").add("survey.survey_quick_access",SurveyQuickAccess);return __exports;});;

/* /survey/static/src/interactions/survey_result.js */
odoo.define('@survey/interactions/survey_result',['@web/public/interaction','@web/core/registry','@web/core/utils/urls','@web/core/hotkeys/hotkey_service'],function(require){'use strict';let __exports={};const{Interaction}=require("@web/public/interaction");const{registry}=require("@web/core/registry");const{redirect}=require("@web/core/utils/urls");const{getActiveHotkey}=require("@web/core/hotkeys/hotkey_service");const SurveyResult=__exports.SurveyResult=class SurveyResult extends Interaction{static selector=".o_survey_result";dynamicContent={".o_survey_results_topbar_clear_filters":{"t-on-click":this.onClearFiltersClick},".o_survey_results_data_tab:not(.active)":{"t-on-click":this.updateContent},".pagination_wrapper":{"t-on-click":this.updateContent},".filter-add-answer":{"t-on-click":this.onFilterAddAnswerClick},"i.filter-remove-answer":{"t-on-click":this.onFilterRemoveAnswerClick},"a.filter-finished-or-not":{"t-on-click":this.onFilterFinishedOrNotClick},"a.filter-finished":{"t-on-click":this.onFilterFinishedClick},"a.filter-failed":{"t-on-click":this.onFilterFailedClick},"a.filter-passed":{"t-on-click":this.onFilterPassedClick},"a.filter-passed-and-failed":{"t-on-click":this.onFilterPassedAndFailedClick},".o_survey_answer_image":{"t-on-click.prevent":this.onAnswerImageClick},".o_survey_results_print":{"t-on-click":this.onPrintResultsClick},_document:{"t-on-keydown":this.onKeydown,},};onFilterAddAnswerClick(ev){const params=new URLSearchParams(window.location.search);params.set("filters",this.prepareAnswersFilters(params.get("filters"),"add",ev));redirect(window.location.pathname+"?"+params.toString());}
onFilterRemoveAnswerClick(ev){const params=new URLSearchParams(window.location.search);const filters=this.prepareAnswersFilters(params.get("filters"),"remove",ev);if(filters){params.set("filters",filters);}else{params.delete("filters");}
redirect(window.location.pathname+"?"+params.toString());}
onClearFiltersClick(){const params=new URLSearchParams(window.location.search);params.delete("filters");params.delete("finished");params.delete("failed");params.delete("passed");redirect(window.location.pathname+"?"+params.toString());}
onFilterFinishedOrNotClick(){const params=new URLSearchParams(window.location.search);params.delete("finished");redirect(window.location.pathname+"?"+params.toString());}
onFilterFinishedClick(){const params=new URLSearchParams(window.location.search);params.set("finished","true");redirect(window.location.pathname+"?"+params.toString());}
onFilterFailedClick(){const params=new URLSearchParams(window.location.search);params.set("failed","true");params.delete("passed");redirect(window.location.pathname+"?"+params.toString());}
onFilterPassedClick(){const params=new URLSearchParams(window.location.search);params.set("passed","true");params.delete("failed");redirect(window.location.pathname+"?"+params.toString());}
onFilterPassedAndFailedClick(){const params=new URLSearchParams(window.location.search);params.delete("failed");params.delete("passed");redirect(window.location.pathname+"?"+params.toString());}
onAnswerImageClick(ev){this.renderAt("survey.survey_image_zoomer",{sourceImage:ev.currentTarget.src},document.body);}
onPrintResultsClick(){for(const paginatorEl of document.querySelectorAll(".survey_table_with_pagination")){paginatorEl.dispatchEvent(new Event("save_state_and_show_all"));}
window.print();for(const paginatorEl of document.querySelectorAll(".survey_table_with_pagination")){paginatorEl.dispatchEvent(new Event("restore_state"));}}
onKeydown(ev){if(getActiveHotkey(ev)==="control+p"){ev.preventDefault();ev.stopImmediatePropagation();this.onPrintResultsClick();}}
prepareAnswersFilters(filters,operation,ev){const cellDataset=ev.currentTarget.dataset;const filter=`${cellDataset.modelShortKey},${cellDataset.rowId || 0},${cellDataset.recordId}`;if(operation==="add"){if(filters){filters=!filters.split("|").includes(filter)?(filters+=`|${filter}`):filters;}else{filters=filter;}}else if(operation==="remove"){filters=filters.split("|").filter((filterItem)=>filterItem!==filter).join("|");}else{throw new Error('`operation` parameter for `prepareAnswersFilters` must be either "add" or "remove".');}
return filters;}}
registry.category("public.interactions").add("survey.SurveyResult",SurveyResult);return __exports;});;

/* /survey/static/src/interactions/survey_result_chart.js */
odoo.define('@survey/interactions/survey_result_chart',['@web/core/l10n/translation','@web/core/assets','@web/public/interaction','@web/core/registry'],function(require){'use strict';let __exports={};const{appTranslateFn}=require("@web/core/l10n/translation");const _t=(str,...args)=>appTranslateFn(str,"survey",...args);const{loadBundle}=require("@web/core/assets");const{Interaction}=require("@web/public/interaction");const{registry}=require("@web/core/registry");const D3_COLORS=["#1f77b4","#ff7f0e","#aec7e8","#ffbb78","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5","#8c564b","#c49c94","#e377c2","#f7b6d2","#7f7f7f","#c7c7c7","#bcbd22","#dbdb8d","#17becf","#9edae5",];const SurveyResultChart=__exports.SurveyResultChart=class SurveyResultChart extends Interaction{static selector=".survey_graph";start(){this.graphData=JSON.parse(this.el.dataset.graphData);this.rightAnswers=this.el.dataset.rightAnswers||[];if(this.graphData&&this.graphData.length!==0){switch(this.el.dataset.graphType){case"multi_bar":this.chartConfig=this.getMultibarChartConfig();break;case"bar":this.chartConfig=this.getBarChartConfig();break;case"pie":this.chartConfig=this.getPieChartConfig();break;case"doughnut":this.chartConfig=this.getDoughnutChartConfig();break;case"by_section":this.chartConfig=this.getSectionResultsChartConfig();break;}
this.chart=this.loadChart();this.registerCleanup(()=>this.chart?.destroy());}}
async willStart(){await loadBundle("web.chartjs_lib");}
getMultibarChartConfig(){return{type:"bar",data:{labels:this.graphData[0].values.map(this.markIfCorrect,this),datasets:this.graphData.map(function(group,index){const data=group.values.map(function(value){return value.count;});return{label:group.key,data:data,backgroundColor:D3_COLORS[index%20],};}),},options:{scales:{x:{ticks:{callback:function(val,index){const value=this.getLabelForValue(val);const tickLimit=25;return value?.length>tickLimit?`${value.slice(0, tickLimit)}...`:value;},},},y:{ticks:{precision:0,},beginAtZero:true,},},plugins:{tooltip:{callbacks:{title:function(tooltipItem){return tooltipItem.label;},},},},},};}
getBarChartConfig(){return{type:"bar",data:{labels:this.graphData[0].values.map(this.markIfCorrect,this),datasets:this.graphData.map(function(group){const data=group.values.map(function(value){return value.count;});return{label:group.key,data:data,backgroundColor:data.map(function(val,index){return D3_COLORS[index%20];}),};}),},options:{plugins:{legend:{display:false,},tooltip:{enabled:false,},},scales:{x:{ticks:{callback:function(val,index){const value=this.getLabelForValue(val);const tickLimit=35;return value?.length>tickLimit?`${value.slice(0, tickLimit)}...`:value;},},},y:{ticks:{precision:0,},beginAtZero:true,},},},};}
getPieChartConfig(){const counts=this.graphData.map(function(point){return point.count;});return{type:"pie",data:{labels:this.graphData.map(this.markIfCorrect,this),datasets:[{label:"",data:counts,backgroundColor:counts.map(function(val,index){return D3_COLORS[index%20];}),},],},options:{aspectRatio:2,},};}
getDoughnutChartConfig(){const totalsGraphData=this.graphData.totals;const counts=totalsGraphData.map(function(point){return point.count;});return{type:"doughnut",data:{labels:totalsGraphData.map(this.markIfCorrect,this),datasets:[{label:"",data:counts,backgroundColor:counts.map(function(val,index){return D3_COLORS[index%20];}),borderColor:"rgba(0, 0, 0, 0.1)",},],},options:{plugins:{title:{display:true,text:_t("Overall Performance"),},},aspectRatio:2,},};}
getSectionResultsChartConfig(){const sectionGraphData=this.graphData.by_section;const resultKeys={correct:_t("Correct"),partial:_t("Partially"),incorrect:_t("Incorrect"),skipped:_t("Unanswered"),};let resultColorIndex=0;const datasets=[];for(const resultKey in resultKeys){const data=[];for(const section in sectionGraphData){data.push((sectionGraphData[section][resultKey]/sectionGraphData[section]["question_count"])*100);}
datasets.push({label:resultKeys[resultKey],data:data,backgroundColor:D3_COLORS[resultColorIndex%20],});resultColorIndex++;}
return{type:"bar",data:{labels:Object.keys(sectionGraphData),datasets:datasets,},options:{plugins:{title:{display:true,text:_t("Performance by Section"),},legend:{display:true,},tooltip:{callbacks:{label:(tooltipItem)=>{const xLabel=tooltipItem.label;const roundedValue=Math.round(tooltipItem.parsed.y*100)/100;return`${xLabel}: ${roundedValue}%`;},},},},scales:{x:{ticks:{callback:function(val,index){const value=this.getLabelForValue(val);const tickLimit=20;return value?.length>tickLimit?`${value.slice(0, tickLimit)}...`:value;},},},y:{gridLines:{display:false,},ticks:{precision:0,callback:function(label){return label+"%";},maxTicksLimit:5,stepSize:25,},beginAtZero:true,suggestedMin:0,suggestedMax:100,},},},};}
markIfCorrect(value){return value.text+(this.rightAnswers.indexOf(value.text)>=0?" \u2713":"");}
loadChart(){this.el.style.position="relative";const canvas=this.el.querySelector("canvas");const ctx=canvas.getContext("2d");return new Chart(ctx,this.chartConfig);}}
registry.category("public.interactions").add("survey.survey_result_chart",SurveyResultChart);return __exports;});;

/* /survey/static/src/interactions/survey_result_pagination.js */
odoo.define('@survey/interactions/survey_result_pagination',['@web/public/interaction','@web/core/registry','@web/core/utils/render'],function(require){'use strict';let __exports={};const{Interaction}=require("@web/public/interaction");const{registry}=require("@web/core/registry");const{renderToMarkup}=require("@web/core/utils/render");const SurveyResultPagination=__exports.SurveyResultPagination=class SurveyResultPagination extends Interaction{static selector=".survey_table_with_pagination";dynamicContent={"li.o_survey_js_results_pagination a":{"t-on-click.prevent":this.onPageClick,},".o_survey_question_answers_show_btn":{"t-on-click":this.onShowAllAnswers,"t-att-class":()=>({"d-none":this.paginationState.showAll,}),},".pagination":{"t-att-class":()=>({"d-none":this.paginationState.showAll,}),},".o_survey_results_table_wrapper":{"t-att-class":()=>({"h-auto":this.paginationState.showAll,}),},tbody:{"t-out":()=>this.tableContent,},};setup(){this.limit=this.el.dataset.record_limit;this.questionData=this.parseAnswersJSON();this.elCount=this.questionData.length;this.paginationState={currentPage:1,minIdx:0,maxIdx:Math.min(this.elCount,this.limit),showAll:false,hideFilter:this.el.dataset.hideFilter,};this.el.addEventListener("save_state_and_show_all",()=>{this.paginationStateBackup=Object.assign({},this.paginationState);this.onShowAllAnswers();this.updateContent();});this.el.addEventListener("restore_state",()=>{if(this.paginationStateBackup){this.paginationState=this.paginationStateBackup;}
this.updateContent();});}
parseAnswersJSON(){const keys=["id","value","url"];return JSON.parse(this.el.dataset.answersJson).map((entry,index)=>{const content=Object.fromEntries(entry.map((value,index)=>[keys[index],value]));return{index:index,...content};});}
get tableContent(){return renderToMarkup("survey.paginated_results_rows",{records:this.questionData.slice(this.paginationState.minIdx,this.paginationState.maxIdx),hide_filter:this.paginationState.hideFilter,});}
onPageClick(ev){this.pageBtnsEl=this.el.querySelector("ul.pagination");this.pageBtnsEl.querySelector(`li:nth-child(${this.paginationState.currentPage})`).classList.remove("active");this.paginationState.currentPage=ev.currentTarget.text;this.pageBtnsEl.querySelector(`li:nth-child(${this.paginationState.currentPage})`).classList.add("active");this.paginationState.minIdx=this.limit*(this.paginationState.currentPage-1);this.paginationState.maxIdx=Math.min(this.elCount,this.limit*this.paginationState.currentPage);}
onShowAllAnswers(){this.paginationState.showAll=true;this.paginationState.minIdx=0;this.paginationState.maxIdx=this.elCount;}}
registry.category("public.interactions").add("survey.survey_result_pagination",SurveyResultPagination);return __exports;});;

/* /survey/static/src/interactions/survey_session_chart.js */
odoo.define('@survey/interactions/survey_session_chart',['@web/core/assets','@survey/interactions/survey_session_colors','@web/core/registry','@web/public/interaction'],function(require){'use strict';let __exports={};const{loadJS}=require("@web/core/assets");const SESSION_CHART_COLORS=require("@survey/interactions/survey_session_colors")[Symbol.for("default")];const{registry}=require("@web/core/registry");const{Interaction}=require("@web/public/interaction");const SurveySessionChart=__exports.SurveySessionChart=class SurveySessionChart extends Interaction{static selector=".o_survey_session_chart";dynamicContent={_root:{"t-on-updateState":this.updateState,"t-att-class":()=>({chart_is_ready:!!this.chart}),},};setup(){const sessionManageEl=this.el.closest(".o_survey_session_manage");this.questionType=sessionManageEl.dataset.questionType;this.answersValidity=JSON.parse(sessionManageEl.dataset.answersValidity);this.hasCorrectAnswers=sessionManageEl.dataset.hasCorrectAnswers;this.questionStatistics=this.processQuestionStatistics(JSON.parse(sessionManageEl.dataset.questionStatistics));this.showAnswers=false;this.showInputs=false;}
async willStart(){await loadJS("/survey/static/src/js/libs/chartjs-plugin-datalabels.js");}
start(){const canvas=this.el.querySelector("canvas");const ctx=canvas.getContext("2d");this.chart=new Chart(ctx,this.buildChartConfiguration());this.registerCleanup(()=>this.chart.destroy());this.env.bus.trigger("SURVEY:CHART_INTERACTION_STARTED");}
updateState(ev){if("showInputs"in ev.detail){this.showInputs=ev.detail.showInputs;}
if("showAnswers"in ev.detail){this.showAnswers=ev.detail.showAnswers;}
this.updateChart(ev.detail.questionStatistics);}
updateChart(questionStatistics){if(questionStatistics){this.questionStatistics=this.processQuestionStatistics(questionStatistics);}
if(this.chart){const chartData=this.chart.data.datasets[0].data;for(let i=0;i<chartData.length;i++){const value=this.showInputs?this.questionStatistics[i].count:0;this.chart.data.datasets[0].data[i]=value;}
this.chart.update();}}
buildChartConfiguration(){return{type:"bar",data:{labels:this.extractChartLabels(),datasets:[{backgroundColor:this.getBackgroundColor.bind(this),data:this.extractChartData(),},],},options:{maintainAspectRatio:false,plugins:{datalabels:{color:this.getLabelColor.bind(this),font:{size:"50",weight:"bold",},anchor:"end",align:"top",},legend:{display:false,},tooltip:{enabled:false,},},scales:{y:{ticks:{display:false,},grid:{display:false,},},x:{ticks:{minRotation:20,maxRotation:90,font:{size:"35",weight:"bold",},color:"#212529",autoSkip:false,},grid:{drawOnChartArea:false,color:"rgba(0, 0, 0, 0.2)",},},},layout:{padding:{left:0,right:0,top:70,bottom:0,},},},plugins:[ChartDataLabels,{beforeInit:function(chart){const nbrCol=chart.data.labels.length;const minRatio=0.4;const charPerLineBreakpoints=[[1,2,35,minRatio],[3,4,30,minRatio],[5,6,30,0.45],[7,8,30,0.65],[9,null,30,0.7],];let charPerLine;let fontRatio;charPerLineBreakpoints.forEach(([lowerBound,upperBound,value,ratio])=>{if(nbrCol>=lowerBound&&(upperBound===null||nbrCol<=upperBound)){charPerLine=value;fontRatio=ratio;}});if(charPerLine<35){const allWords=chart.data.labels.reduce((accumulator,words)=>accumulator.concat(" ".concat(words)));const maxWordLength=Math.max(...allWords.split(" ").map((word)=>word.length));fontRatio=maxWordLength>charPerLine?minRatio:fontRatio;chart.options.scales.x.ticks.font.size=Math.min(parseInt(chart.options.scales.x.ticks.font.size),(chart.width*fontRatio)/nbrCol);}
chart.data.labels.forEach(function(label,index,labelsList){const words=label.split(" ");const resultLines=[];let currentLine=[];for(let i=0;i<words.length;i++){let word=words[i];while(word.length>charPerLine){resultLines.push(word.slice(0,charPerLine-1)+"-");word=word.slice(charPerLine-1);}
currentLine.push(word);const nextWord=i+1<words.length?words[i+1]:null;if(nextWord){const nextLength=currentLine.join(" ").length+nextWord.length;if(nextLength<=charPerLine){continue;}}
const newLabelLine=currentLine.join(" ");resultLines.push(newLabelLine);currentLine=[];}
labelsList[index]=resultLines;});},},],};}
extractChartLabels(){return this.questionStatistics.map((point)=>point.text);}
extractChartData(){return Array(this.questionStatistics.length).fill(0);}
getBackgroundColor(metaData){const opacity=this.showAnswers&&this.hasCorrectAnswers&&!this.isValidAnswer(metaData.dataIndex)?"0.2":"0.8";const rgb=SESSION_CHART_COLORS[metaData.dataIndex%SESSION_CHART_COLORS.length];return`rgba(${rgb},${opacity})`;}
getLabelColor(metaData){let color="#212529";if(this.showAnswers&&this.hasCorrectAnswers){color=this.isValidAnswer(metaData.dataIndex)?"#2CBB70":"#D9534F";}
return color;}
isValidAnswer(answerIndex){return this.answersValidity[answerIndex];}
processQuestionStatistics(rawStatistics){if(["multiple_choice","scale"].includes(this.questionType)){return rawStatistics[0].values;}
return rawStatistics;}}
registry.category("public.interactions").add("survey.survey_session_chart",SurveySessionChart);return __exports;});;

/* /survey/static/src/interactions/survey_session_colors.js */
odoo.define('@survey/interactions/survey_session_colors',[],function(require){'use strict';let __exports={};__exports[Symbol.for("default")]=["31,119,180","255,127,14","174,199,232","255,187,120","44,160,44","152,223,138","214,39,40","255,152,150","148,103,189","197,176,213","140,86,75","196,156,148","227,119,194","247,182,210","127,127,127","199,199,199","188,189,34","219,219,141","23,190,207","158,218,229",];return __exports;});;

/* /survey/static/src/interactions/survey_session_leaderboard.js */
odoo.define('@survey/interactions/survey_session_leaderboard',['@survey/utils','@web/public/interaction','@web/core/registry','@web/core/network/rpc','@survey/interactions/survey_session_colors'],function(require){'use strict';let __exports={};const{fadeIn,fadeOut}=require("@survey/utils");const{Interaction}=require("@web/public/interaction");const{registry}=require("@web/core/registry");const{rpc}=require("@web/core/network/rpc");const SESSION_CHART_COLORS=require("@survey/interactions/survey_session_colors")[Symbol.for("default")];const SurveySessionLeaderboard=__exports.SurveySessionLeaderboard=class SurveySessionLeaderboard extends Interaction{static selector=".o_survey_session_manage .o_survey_session_leaderboard";dynamicContent={_root:{"t-on-showLeaderboard":this.showLeaderboard,"t-on-hideLeaderboard":this.hideLeaderboard,},".o_survey_session_leaderboard_bar":{"t-att-style":this.getBarStyle,},".o_survey_session_leaderboard_bar_question":{"t-att-style":this.getBarQuestionStyle,},};getBarStyle(barEl){if(this.leaderboardAnimationPhase==="prepareScores"){const currentScore=parseInt(barEl.closest(".o_survey_session_leaderboard_item").dataset.currentScore);if(currentScore&&currentScore!==0){return{transition:"width 1s cubic-bezier(.4,0,.4,1)",width:this.BAR_MIN_WIDTH,};}}else if(this.leaderboardAnimationPhase==="sumScores"){const{baseRatio,questionRatio}=this.getBarRatios(barEl);const updatedScoreRatio=1-questionRatio;const updatedScoreWidth=`calc(calc(100% - ${this.BAR_WIDTH}) * ${
                updatedScoreRatio * baseRatio
            })`;return{transition:"width ease .5s cubic-bezier(.5,0,.66,1.11)",width:updatedScoreWidth,minWidth:"0px",};}
return{};}
getBarQuestionStyle(barEl){if(this.leaderboardAnimationPhase==="showQuestionScores"){return{transition:"width 1s ease-out",width:`calc(calc(100% - ${this.BAR_WIDTH}) * ${barEl.dataset.widthRatio} + ${this.BAR_MIN_WIDTH})`,};}else if(this.leaderboardAnimationPhase==="sumScores"){const{baseRatio,questionRatio}=this.getBarRatios(barEl);const questionWidth=`calc(calc(calc(100% - ${this.BAR_WIDTH}) * ${
                questionRatio * baseRatio
            }) + ${this.BAR_MIN_WIDTH})`;return{transition:"width ease .5s cubic-bezier(.5,0,.66,1.11)",width:questionWidth,};}
return{};}
getBarRatios(barEl){const item=barEl.closest(".o_survey_session_leaderboard_item");const updatedScore=parseInt(item.dataset.updatedScore);const questionScore=parseInt(item.dataset.questionScore);const maxUpdatedScore=parseInt(item.dataset.maxUpdatedScore);const baseRatio=maxUpdatedScore?updatedScore/maxUpdatedScore:1;const questionRatio=questionScore/(updatedScore||1);return{baseRatio,questionRatio};}
setup(){this.fadeInOutTime=400;this.BAR_MIN_WIDTH="3rem";this.BAR_WIDTH="24rem";this.BAR_HEIGHT="3.8rem";this.surveyAccessToken=this.el.closest(".o_survey_session_manage").dataset.surveyAccessToken;this.sessionResults=this.el.parentElement.querySelector(".o_survey_session_results");}
showLeaderboard(ev){let resolveFadeOut;let fadeOutPromise;const resultsEl=this.el.parentElement.querySelector(".o_survey_session_results");if(ev.detail.fadeOut){fadeOutPromise=new Promise((resolve,reject)=>{resolveFadeOut=resolve;});fadeOut(resultsEl,this.fadeInOutTime,()=>{resultsEl.dispatchEvent(new CustomEvent("setDisplayNone"));resolveFadeOut();});}else{fadeOutPromise=Promise.resolve();resultsEl.dispatchEvent(new CustomEvent("setDisplayNone"));this.removeChildren(this.el.querySelector(".o_survey_session_leaderboard_container"));}
const leaderboardPromise=rpc(`/survey/session/leaderboard/${this.surveyAccessToken}`);this.waitFor(Promise.all([fadeOutPromise,leaderboardPromise])).then(this.protectSyncAfterAsync((results)=>{const leaderboardResults=results[1];const renderedTemplate=document.createElement("div");const parser=new DOMParser();const parsedResults=parser.parseFromString(leaderboardResults,"text/html").body.firstChild;if(parsedResults){this.insert(parsedResults,renderedTemplate);}
this.insert(renderedTemplate,this.el.querySelector(".o_survey_session_leaderboard_container"));this.el.querySelectorAll(".o_survey_session_leaderboard_item").forEach((item,index)=>{const rgb=SESSION_CHART_COLORS[index%10];item.querySelector(".o_survey_session_leaderboard_bar").style.backgroundColor=`rgba(${rgb},1)`;item.querySelector(".o_survey_session_leaderboard_bar_question").style.backgroundColor=`rgba(${rgb},0.4)`;});fadeIn(this.el,this.fadeInOutTime,async()=>{if(ev.detail.isScoredQuestion){await this.waitFor(this.prepareScores());await this.waitFor(this.showQuestionScores());await this.waitFor(this.sumScores());await this.waitFor(this.reorderScores());this.leaderboardAnimationPhase=null;}});}));}
hideLeaderboard(){fadeOut(this.el,this.fadeInOutTime,()=>{this.removeChildren(this.el.querySelector(".o_survey_session_leaderboard_container"));fadeIn(this.sessionResults,this.fadeInOutTime);});}
animateScoreCounter(scoreEl,currentScore,totalScore,increment,plusSign){this.waitForTimeout(()=>{const nextScore=Math.min(totalScore,currentScore+increment);scoreEl.textContent=`${plusSign ? "+ " : ""}${Math.round(nextScore)} p`;if(nextScore<totalScore){this.animateScoreCounter(scoreEl,nextScore,totalScore,increment,plusSign);}},25);}
animateMoveTo(scoreEl,position,offset,timeout){let animationDone;const animationPromise=new Promise(function(resolve){animationDone=resolve;});scoreEl.style.top=`calc(calc(${this.BAR_HEIGHT} * ${position}) + ${offset}rem)`;this.waitForTimeout(animationDone,timeout);return animationPromise;}
async prepareScores(){let animationDone;const animationPromise=new Promise(function(resolve){animationDone=resolve;});this.waitForTimeout(()=>{this.leaderboardAnimationPhase="prepareScores";this.waitForTimeout(animationDone,1000);},300);return animationPromise;}
async reorderScores(){let animationDone;const animationPromise=new Promise(function(resolve){animationDone=resolve;});this.waitForTimeout(()=>{this.leaderboardAnimationPhase="reorderScores";this.el.querySelectorAll(".o_survey_session_leaderboard_item").forEach(async(item)=>{const currentPosition=parseInt(item.dataset.currentPosition);const newPosition=parseInt(item.dataset.newPosition);if(currentPosition!==newPosition){const offset=newPosition>currentPosition?2:-2;await this.waitFor(this.animateMoveTo(item,newPosition,offset,300));item.style.transition="top ease-in-out .1s";await this.waitFor(this.animateMoveTo(item,newPosition,offset*-0.3,100));await this.waitFor(this.animateMoveTo(item,newPosition,0,0));animationDone();}});},1800);return animationPromise;}
async showQuestionScores(){let animationDone;const animationPromise=new Promise(function(resolve){animationDone=resolve;});this.waitForTimeout(()=>{this.leaderboardAnimationPhase="showQuestionScores";this.el.querySelectorAll(".o_survey_session_leaderboard_bar_question").forEach((barEl)=>{const scoreEl=barEl.querySelector(".o_survey_session_leaderboard_bar_question_score");scoreEl.textContent="0 p";const questionScore=parseInt(barEl.dataset.questionScore);if(questionScore&&questionScore>0){let increment=parseInt(barEl.dataset.maxQuestionScore/40);if(!increment||increment===0){increment=1;}
scoreEl.textContent="+ 0 p";this.waitForTimeout(()=>{this.animateScoreCounter(scoreEl,0,questionScore,increment,true);},400);}
this.waitForTimeout(animationDone,1400);});},300);return animationPromise;}
async sumScores(){let animationDone;const animationPromise=new Promise(function(resolve){animationDone=resolve;});this.waitForTimeout(()=>{this.leaderboardAnimationPhase="sumScores";this.el.querySelectorAll(".o_survey_session_leaderboard_item").forEach((item)=>{const currentScore=parseInt(item.dataset.currentScore);const updatedScore=parseInt(item.dataset.updatedScore);let increment=parseInt(item.dataset.maxQuestionScore/40);if(!increment||increment===0){increment=1;}
this.animateScoreCounter(item.querySelector(".o_survey_session_leaderboard_score"),currentScore,updatedScore,increment,false);this.waitForTimeout(animationDone,500);});},1400);return animationPromise;}}
registry.category("public.interactions").add("survey.survey_session_leaderboard",SurveySessionLeaderboard);return __exports;});;

/* /survey/static/src/interactions/survey_session_manage.js */
odoo.define('@survey/interactions/survey_session_manage',['@survey/js/survey_preload_image_mixin','@web/core/l10n/translation','@web/core/network/rpc','@web/core/browser/browser','@web/public/interaction','@web/core/registry','@survey/utils','@web/core/hotkeys/hotkey_service'],function(require){'use strict';let __exports={};const{preloadBackground}=require("@survey/js/survey_preload_image_mixin");const{appTranslateFn}=require("@web/core/l10n/translation");const _t=(str,...args)=>appTranslateFn(str,"survey",...args);const{rpc}=require("@web/core/network/rpc");const{browser}=require("@web/core/browser/browser");const{Interaction}=require("@web/public/interaction");const{registry}=require("@web/core/registry");const{fadeIn,fadeOut}=require("@survey/utils");const{getActiveHotkey}=require("@web/core/hotkeys/hotkey_service");const nextPageTooltips={closingWords:_t("End of Survey"),leaderboard:_t("Show Leaderboard"),leaderboardFinal:_t("Show Final Leaderboard"),nextQuestion:_t("Next"),results:_t("Show Correct Answer(s)"),startScreen:_t("Start"),userInputs:_t("Show Results"),};const SurveySessionManage=__exports.SurveySessionManage=class SurveySessionManage extends Interaction{static selector=".o_survey_session_manage";dynamicContent={_document:{"t-on-keydown":this.onKeyDown,},".o_survey_session_copy":{"t-on-click.prevent":this.onCopySessionLink,},".o_survey_session_navigation_next":{"t-on-click.prevent":this.onNext,"t-att-class":()=>({"d-none":this.isSessionClosed||(this.isLastQuestion&&this.currentScreen==="leaderboardFinal"),}),},".o_survey_session_navigation_previous":{"t-on-click.prevent":this.onBack,"t-att-class":()=>({"d-none":this.isFirstQuestion||this.isSessionClosed}),},".o_survey_session_close":{"t-on-click.prevent":this.onEndSessionClick,},".o_survey_session_attendees_count":{"t-out":()=>this.sessionAttendeesCountText,},".o_survey_session_navigation_next_label":{"t-out":()=>this.sessionNavigationNextLabel,},".o_survey_session_results":{"t-att-class":()=>({"d-none":this.isSessionClosed||this.leaderboardIsFadingOut||this.hideResults,}),"t-on-setDisplayNone":()=>{this.hideResults=true;},},".o_survey_session_description_done":{"t-att-class":()=>({"d-none":!this.isSessionClosed}),},};setup(){if(this.el.dataset.isSessionClosed){this.isSessionClosed=true;this.el.classList.remove("invisible");return;}
this.fadeInOutTime=500;this.answersRefreshDelay=2000;this.isSessionClosed=false;this.leaderboardIsFadingOut=false;this.hideResults=false;this.chartEl=this.el.querySelector(".o_survey_session_chart");this.leaderboardEl=this.el.querySelector(".o_survey_session_leaderboard");this.timerEl=this.el.querySelector(".o_survey_timer_container .o_survey_timer");this.textAnswersEl=this.el.querySelector(".o_survey_session_text_answers_container");this.surveyId=parseInt(this.el.dataset.surveyId);this.attendeesCount=this.el.dataset.attendeesCount?parseInt(this.el.dataset.attendeesCount,10):0;this.surveyHasConditionalQuestions=this.el.dataset.surveyHasConditionalQuestions;this.surveyAccessToken=this.el.dataset.surveyAccessToken;this.isStartScreen=this.el.dataset.isStartScreen;this.isFirstQuestion=this.el.dataset.isFirstQuestion;this.isLastQuestion=this.el.dataset.isLastQuestion;this.surveyLastTriggeringAnswers=JSON.parse(this.el.dataset.surveyLastTriggeringAnswers||"[]");this.isScoredQuestion=this.el.dataset.isScoredQuestion;this.sessionShowLeaderboard=this.el.dataset.sessionShowLeaderboard;this.hasCorrectAnswers=this.el.dataset.hasCorrectAnswers;this.showBarChart=this.el.dataset.showBarChart;this.showTextAnswers=this.el.dataset.showTextAnswers;this.stopNextQuestion=false;this.refreshBackground=this.el.dataset.refreshBackground;this.copyBtnTooltip=window.Tooltip.getOrCreateInstance(this.el.querySelector(".o_survey_session_copy"),{title:_t("Click to copy link"),placement:"right",container:"body",trigger:"hover",offset:"0, 3",delay:0,});this.registerCleanup(()=>{this.copyBtnPopover?.dispose();this.copyBtnTooltip?.dispose();});this.sessionAttendeesCountText="";this.sessionNavigationNextLabel="";this.el.classList.remove("invisible");this.setupIntervals();}
async willStart(){if(this.chartEl&&!this.chartEl.classList.contains("chart_is_ready")){let resolveChartPromise;const chartPromise=new Promise(function(resolve){resolveChartPromise=resolve;});this.env.bus.addEventListener("SURVEY:CHART_INTERACTION_STARTED",resolveChartPromise);await chartPromise;}}
start(){this.setupCurrentScreen();this.startTimer();if(this.el.dataset.goingBack){this.chartUpdateState({showInputs:true,showAnswers:true});if(this.sessionShowLeaderboard&&this.isScoredQuestion){this.currentScreen="leaderboard";this.leaderboardEl.dispatchEvent(new CustomEvent("showLeaderboard",{detail:{fadeOut:false,isScoredQuestion:this.isScoredQuestion,},}));}else{this.currentScreen="results";}
this.refreshResults();}}
async onCopySessionLink(ev){const copyBtnTooltipHideDelay=800;this.copyBtnTooltip?.dispose();delete this.copyBtnTooltip;this.copyBtnPopover=window.Popover.getOrCreateInstance(ev.currentTarget,{content:_t("Copied!"),trigger:"manual",placement:"right",container:"body",offset:"0, 3",});await this.waitFor(browser.navigator.clipboard.writeText(ev.currentTarget.innerText.trim()));this.protectSyncAfterAsync(()=>{this.copyBtnPopover.show();this.waitForTimeout(()=>this.copyBtnPopover.hide(),copyBtnTooltipHideDelay);})();}
onNext(ev){const screenToDisplay=this.getNextScreen();switch(screenToDisplay){case"userInputs":this.chartUpdateState({showInputs:true});break;case"results":this.chartUpdateState({showAnswers:true});clearInterval(this.resultsRefreshInterval);delete this.resultsRefreshInterval;break;case"leaderboard":case"leaderboardFinal":if(!this.currentScreen.startsWith("leaderboard")){this.leaderboardEl.dispatchEvent(new CustomEvent("showLeaderboard",{detail:{fadeOut:true,isScoredQuestion:this.isScoredQuestion,},}));}
break;default:if(!this.isLastQuestion||!this.sessionShowLeaderboard){this.goToNextQuestion();}
break;}
this.currentScreen=screenToDisplay;if(!["question","nextQuestion"].includes(screenToDisplay)){this.updateNextScreenTooltip();}}
onBack(ev){const screenToDisplay=this.getPreviousScreen();switch(screenToDisplay){case"question":this.chartUpdateState({showInputs:false});break;case"userInputs":this.chartUpdateState({showAnswers:false});if(!this.resultsRefreshInterval){this.resultsRefreshInterval=setInterval(this.refreshResults.bind(this),this.answersRefreshDelay);}
break;case"results":if(this.isScoredQuestion||this.isLastQuestion){this.leaderboardEl.dispatchEvent(new Event("hideLeaderboard"));}
clearInterval(this.resultsRefreshInterval);delete this.resultsRefreshInterval;break;case"previousQuestion":if(this.isFirstQuestion){return;}
this.goToNextQuestion(true);break;}
this.currentScreen=screenToDisplay;if(!["question","nextQuestion"].includes(screenToDisplay)){this.updateNextScreenTooltip();}}
getNextScreen(){if(this.currentScreen==="question"&&this.isScoredQuestion){return"userInputs";}else if(this.hasCorrectAnswers&&["question","userInputs"].includes(this.currentScreen)){return"results";}else if(this.sessionShowLeaderboard){if(this.isLastQuestion){return"leaderboardFinal";}else if(["question","userInputs","results"].includes(this.currentScreen)&&this.isScoredQuestion){return"leaderboard";}}
return"nextQuestion";}
getPreviousScreen(){if(this.currentScreen==="userInputs"&&this.isScoredQuestion){return"question";}else if((this.currentScreen==="results"&&this.isScoredQuestion)||(this.currentScreen==="leaderboard"&&!this.isScoredQuestion)||(this.currentScreen==="leaderboardFinal"&&this.isScoredQuestion)){return"userInputs";}else if((this.currentScreen==="leaderboard"&&this.isScoredQuestion)||(this.currentScreen==="leaderboardFinal"&&!this.isScoredQuestion)){return"results";}
return"previousQuestion";}
async goToNextQuestion(goBack){if(this.stopNextQuestion){return;}
this.stopNextQuestion=true;this.leaderboardIsFadingOut=true;this.isStartScreen=false;let resolveFadeOut;const fadeOutPromise=new Promise(function(resolve){resolveFadeOut=resolve;});fadeOut(this.el,this.fadeInOutTime,()=>{this.leaderboardIsFadingOut=false;resolveFadeOut();});if(this.refreshBackground){document.querySelector("div.o_survey_background").classList.add("o_survey_background_transition");}
if(this.resultsRefreshInterval){clearInterval(this.resultsRefreshInterval);delete this.resultsRefreshInterval;}
this.nextQuestion=await this.waitFor(rpc(`/survey/session/next_question/${this.surveyAccessToken}`,{go_back:goBack,}));let preloadBgPromise;if(this.refreshBackground&&this.nextQuestion.background_image_url){preloadBgPromise=preloadBackground(this.nextQuestion.background_image_url);}else{preloadBgPromise=Promise.resolve();}
await this.waitFor(Promise.all([fadeOutPromise,preloadBgPromise]));this.protectSyncAfterAsync(()=>this.onNextQuestionDone(goBack))();}
async onNextQuestionDone(goBack){if(!this.nextQuestion.question_html){this.isSessionClosed=true;this.onEndSessionClick();return;}
const parser=new DOMParser();const newContent=parser.parseFromString(this.nextQuestion.question_html,"text/html").body.firstChild;newContent.style.opacity=0;if(goBack){newContent.dataset.goingBack=true;}
if(this.refreshBackground){const surveyBackground=newContent.querySelector("div.o_survey_background");if(surveyBackground){surveyBackground.style.backgroundImage=`url(${this.nextQuestion.background_image_url})`;surveyBackground.classList.remove("o_survey_background_transition");}}
this.el.parentNode.replaceChild(newContent,this.el);fadeIn(newContent,this.fadeInOutTime);await this.services["public.interactions"].startInteractions(newContent);this.services["public.interactions"].stopInteractions(this.el);}
async onEndSessionClick(ev){const showResults=ev?.currentTarget?.dataset?.showResults;await this.waitFor(this.services.orm.call("survey.survey","action_end_session",[[this.surveyId]]));this.protectSyncAfterAsync(()=>{if(showResults){window.location.href=`/survey/results/${encodeURIComponent(this.surveyId)}`;}else{window.location.reload();}})();}
onKeyDown(ev){const hotkey=getActiveHotkey(ev);if(hotkey==="arrowright"||hotkey==="space"){this.onNext(ev);}else if(hotkey==="arrowleft"){this.onBack(ev);}}
setupCurrentScreen(){if(this.isStartScreen){this.currentScreen="startScreen";}else if(!this.isScoredQuestion&&this.showBarChart){this.currentScreen="userInputs";}else{this.currentScreen="question";}
this.chartUpdateState({showInputs:this.currentScreen==="userInputs"});this.updateNextScreenTooltip();}
chartUpdateState(options){this.chartEl?.dispatchEvent(new CustomEvent("updateState",{detail:options,}));}
updateNextScreenTooltip(){let tooltip;if(this.currentScreen==="startScreen"){tooltip=nextPageTooltips.startScreen;}else if(this.isLastQuestion&&!this.surveyHasConditionalQuestions&&!this.isScoredQuestion&&!this.sessionShowLeaderboard){tooltip=nextPageTooltips.closingWords;}else{const nextScreen=this.getNextScreen();if(nextScreen==="nextQuestion"||this.surveyHasConditionalQuestions){tooltip=nextPageTooltips.nextQuestion;}
tooltip=nextPageTooltips[nextScreen];}
const sessionNavigationNextEl=this.el.querySelector(".o_survey_session_navigation_next_label");if(sessionNavigationNextEl&&tooltip){this.sessionNavigationNextLabel=tooltip;this.updateContent();}}
setupIntervals(){if(this.isStartScreen){this.attendeesRefreshInterval=setInterval(this.refreshAttendeesCount.bind(this),this.answersRefreshDelay);}else{if(this.attendeesRefreshInterval){clearInterval(this.attendeesRefreshInterval);}
if(!this.resultsRefreshInterval){this.resultsRefreshInterval=setInterval(this.refreshResults.bind(this),this.answersRefreshDelay);}}}
startTimer(el){const surveyManagerEl=el||this.el;const timerData=surveyManagerEl.dataset;const questionTimeLimitReached=!!timerData.questionTimeLimitReached;const timeLimitMinutes=Number(timerData.timeLimitMinutes);const hasAnswered=!!timerData.hasAnswered;if(this.timerEl&&!questionTimeLimitReached&&!hasAnswered&&timeLimitMinutes){this.addListener(surveyManagerEl,"time_up",async()=>{if(this.currentScreen==="question"&&this.isScoredQuestion){this.onNext();}});this.timerEl.dispatchEvent(new CustomEvent("start_timer",{detail:{timeLimitMinutes:timeLimitMinutes,timer:timerData.timer,},}));}}
refreshResults(){this.waitFor(rpc(`/survey/session/results/${this.surveyAccessToken}`)).then(this.protectSyncAfterAsync((questionResults)=>{if(questionResults){this.attendeesCount=questionResults.attendees_count;if(!this.isStartScreen&&this.showBarChart&&questionResults.question_statistics_graph){const parsedStatistics=JSON.parse(questionResults.question_statistics_graph);if(parsedStatistics.length>0){this.chartUpdateState({questionStatistics:parsedStatistics});}}else if(!this.isStartScreen&&this.showTextAnswers){this.textAnswersEl.dispatchEvent(new CustomEvent("updateTextAnswers",{detail:{questionType:this.el.dataset.questionType,inputLineValues:questionResults.input_line_values,},}));}
if(this.surveyLastTriggeringAnswers.length){this.isLastQuestion=!questionResults.answer_count||!this.surveyLastTriggeringAnswers.some((answerId)=>questionResults.selected_answers.includes(answerId));this.updateNextScreenTooltip();}
const progressBar=this.el.querySelector(".progress-bar");if(progressBar){const max=this.attendeesCount>0?this.attendeesCount:1;const percentage=Math.min(Math.round((questionResults.answer_count/max)*100),100);progressBar.style.width=`${percentage}%`;}
if(this.attendeesCount&&this.attendeesCount>0){const answerCount=Math.min(questionResults.answer_count,this.attendeesCount);const answerCountElement=this.el.querySelector(".o_survey_session_answer_count");const progressBarTextElement=this.el.querySelector(".progress-bar.o_survey_session_progress_small span");if(answerCountElement){answerCountElement.textContent=answerCount;}
if(progressBarTextElement){progressBarTextElement.textContent=`${answerCount} / ${this.attendeesCount}`;}}}}),this.protectSyncAfterAsync(()=>{clearInterval(this.resultsRefreshInterval);delete this.resultsRefreshInterval;}));}
refreshAttendeesCount(){this.waitFor(this.services.orm.read("survey.survey",[this.surveyId],["session_answer_count"])).then(this.protectSyncAfterAsync((result)=>{if(result&&result.length===1){this.sessionAttendeesCountText=String(result[0].session_answer_count);}}),this.protectSyncAfterAsync((err)=>{clearInterval(this.attendeesRefreshInterval);console.error(err);}));}}
registry.category("public.interactions").add("survey.survey_session_manage",SurveySessionManage);return __exports;});;

/* /survey/static/src/interactions/survey_session_text_answers.js */
odoo.define('@survey/interactions/survey_session_text_answers',['@web/core/l10n/dates','@web/core/registry','@web/core/utils/render','@web/public/interaction','@survey/interactions/survey_session_colors'],function(require){'use strict';let __exports={};const{formatDate,formatDateTime}=require("@web/core/l10n/dates");const{registry}=require("@web/core/registry");const{renderToElement}=require("@web/core/utils/render");const{Interaction}=require("@web/public/interaction");const SESSION_CHART_COLORS=require("@survey/interactions/survey_session_colors")[Symbol.for("default")];const{DateTime}=luxon;const SurveySessionTextAnswers=__exports.SurveySessionTextAnswers=class SurveySessionTextAnswers extends Interaction{static selector=".o_survey_session_text_answers_container";dynamicContent={_root:{"t-on-updateTextAnswers":this.updateTextAnswers,},};setup(){this.answerIds=[];}
updateTextAnswers(ev){const inputLineValues=ev.detail.inputLineValues;const questionType=ev.detail.questionType;inputLineValues.forEach((inputLineValue)=>{if(!this.answerIds.includes(inputLineValue.id)&&inputLineValue.value){let textValue=inputLineValue.value;if(questionType==="date"){textValue=formatDate(DateTime.fromFormat(textValue,"yyyy-MM-dd"));}else if(questionType==="datetime"){textValue=formatDateTime(DateTime.fromFormat(textValue,"yyyy-MM-dd HH:mm:ss"));}
const textAnswerEl=renderToElement("survey.survey_session_text_answer",{value:textValue,borderColor:`rgb(${SESSION_CHART_COLORS[this.answerIds.length % 10]})`,});this.insert(textAnswerEl,this.el);const spanWidth=textAnswerEl.querySelector("span").offsetWidth;const containerEl=textAnswerEl.querySelector(".o_survey_session_text_answer_container");textAnswerEl.style.width=`calc(${spanWidth}px + 1.2rem)`;containerEl.style.width=`calc(${spanWidth}px + 1.2rem)`;containerEl.style.opacity="1";this.answerIds.push(inputLineValue.id);}});}}
registry.category("public.interactions").add("survey.survey_session_text_answers",SurveySessionTextAnswers);return __exports;});;

/* /survey/static/src/interactions/survey_timer.js */
odoo.define('@survey/interactions/survey_timer',['@web/public/interaction','@web/core/l10n/dates','@web/core/registry'],function(require){'use strict';let __exports={};const{Interaction}=require("@web/public/interaction");const{deserializeDateTime}=require("@web/core/l10n/dates");const{registry}=require("@web/core/registry");const{DateTime}=luxon;const SurveyTimer=__exports.SurveyTimer=class SurveyTimer extends Interaction{static selector=".o_survey_timer_container .o_survey_timer";start(){const surveyFormContentEl=document.querySelector(".o_survey_form_content_data");const surveySessionManageEl=document.querySelector(".o_survey_session_manage");this.timeDifference=null;if(surveyFormContentEl){if(surveyFormContentEl.dataset.serverTime){this.timeDifference=DateTime.utc().diff(deserializeDateTime(surveyFormContentEl.dataset.serverTime)).milliseconds;}
this.startTimer(surveyFormContentEl.dataset);}else if(surveySessionManageEl){this.addListener(this.el,"start_timer",(ev)=>{this.startTimer(ev.detail);});}}
destroy(){clearInterval(this.surveyTimerInterval);}
startTimer(timerData){this.timeLimitMinutes=Number(timerData.timeLimitMinutes);this.timer=timerData.timer;this.surveyTimerInterval=null;this.setupTimer();}
setupTimer(){this.countDownDate=DateTime.fromISO(this.timer,{zone:"utc"}).plus({minutes:this.timeLimitMinutes,});if(Math.abs(this.timeDifference)>=500){this.countDownDate=this.countDownDate.plus({milliseconds:this.timeDifference});}
if(this.timeLimitMinutes<=0||this.countDownDate.diff(DateTime.utc()).seconds<0){this.triggerTimeUp();}else{this.updateTimer();this.surveyTimerInterval=setInterval(this.updateTimer.bind(this),1000);}}
formatTime(time){return time>9?time:"0"+time;}
triggerTimeUp(){this.el.dispatchEvent(new Event("time_up"));}
updateTimer(){const timeLeft=Math.round(this.countDownDate.diff(DateTime.utc()).milliseconds/1000);if(timeLeft>=0){const timeLeftMinutes=parseInt(timeLeft/60);const timeLeftSeconds=timeLeft-timeLeftMinutes*60;this.el.textContent=this.formatTime(timeLeftMinutes)+":"+this.formatTime(timeLeftSeconds);}else{if(this.surveyTimerInterval){clearInterval(this.surveyTimerInterval);}
this.triggerTimeUp();}}}
registry.category("public.interactions").add("survey.SurveyTimer",SurveyTimer);return __exports;});

                    /*******************************************
                    *  Templates                               *
                    *******************************************/

                    odoo.define("survey.survey_assets.bundle.xml", ["@web/core/templates"], function(require) {
                        "use strict";
                        const { checkPrimaryTemplateParents, registerTemplate, registerTemplateExtension } = require("@web/core/templates");
                        /* survey.survey_assets */
                        registerTemplate("survey.survey_image_zoomer", `/survey/static/src/interactions/survey_image_zoomer_templates.xml`, `<t t-name="survey.survey_image_zoomer" xml:space="preserve">
        <div role="dialog" class="o_survey_img_zoom_modal show modal fade d-flex align-items-center p-0" data-bs-backdrop="false" aria-label="Image Zoom Dialog" tabindex="-1">
            <div class="o_survey_img_zoom_dialog modal-dialog h-100 w-100 mw-100 py-0" role="Picture Enlarged">
                <div class="modal-content h-100 bg-transparent">
                    <div class="o_survey_img_zoom_body modal-body h-100 bg-transparent d-flex justify-content-center">
                        <button type="button" data-bs-dismiss="modal" aria-label="close" class="o_survey_img_zoom_close_btn close text-white btn-close-white btn-close position-absolute"/>
                        <img class="o_survey_img_zoom_image img img-fluid d-block m-auto" t-att-src="sourceImage" alt="Zoomed Image"/>
                        <div class="o_survey_img_zoom_controls_wrapper position-absolute">
                            <button type="button" class="o_survey_img_zoom_in_btn text-white me-1" aria-label="Zoom in">
                                <span class="fa fa-plus"/>
                            </button>
                            <button type="button" class="o_survey_img_zoom_out_btn text-white ms-1" aria-label="Zoom out">
                                <span class="fa fa-minus"/>
                            </button>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </t>

`);
registerTemplate("survey.survey_breadcrumb_template", `/survey/static/src/interactions/survey_breadcrumb_templates.xml`, `<t t-name="survey.survey_breadcrumb_template" xml:space="preserve">
    <ol class="breadcrumb justify-content-end bg-transparent">
        <t t-set="canGoBack" t-value="surveyCanGoBack"/>
        <t t-foreach="pages" t-as="page" t-key="page_index">
            <t t-set="isActivePage" t-value="page.id === currentPageId"/>
            <li t-att-class="'breadcrumb-item' + (isActivePage ? ' active fw-bold' : '')" t-att-data-page-id="page.id" t-att-data-page-title="page.title">
                <t t-if="currentPageId === page.id">


                    <t t-set="canGoBack" t-value="false"/>
                </t>
                <t t-if="canGoBack">
                    <a class="text-primary text-break" href="#">
                        <span t-esc="page.title"/>
                    </a>
                </t>
                <t t-else="">
                    <span t-att-class="'text-break ' + (isActivePage ? 'text-black' : 'text-muted')" t-esc="page.title"/>
                </t>
            </li>
        </t>
    </ol>
</t>

`);
registerTemplate("survey.paginated_results_rows", `/survey/static/src/xml/survey_paginated_results_rows_template.xml`, `<t t-name="survey.paginated_results_rows" xml:space="preserve">
        <t t-foreach="records" t-as="input_line" t-key="input_line.id">
            <tr>
                <td>
                    <a t-att-href="input_line.url">
                        <t t-esc="input_line.index + 1"/>
                    </a>
                </td>
                <td>

                    <t t-if="hide_filter">
                        <t t-esc="input_line.value"/>
                    </t>
                    <t t-else="">
                        <div class="d-flex justify-content-between">
                            <t t-esc="input_line.value"/>
                            <a class="text-primary filter-add-answer d-print-none" data-model-short-key="L" t-att-data-record-id="input_line.id" role="button" aria-label="Filter surveys" title="Only show survey results having selected this answer">
                                <i class="fa fa-filter"/>
                            </a>
                        </div>
                    </t>
                </td>
            </tr>
        </t>
    </t>

`);
                    });
