
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements.  See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership.  The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License.  You may obtain a copy of the License at
*
*   http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied.  See the License for the
* specific language governing permissions and limitations
* under the License.
*/

!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).echarts={})}(this,(function(t){"use strict";
/*! *****************************************************************************
    Copyright (c) Microsoft Corporation.

    Permission to use, copy, modify, and/or distribute this software for any
    purpose with or without fee is hereby granted.

    THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
    REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
    AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
    INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
    LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
    OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
    PERFORMANCE OF THIS SOFTWARE.
    ***************************************************************************** */var e=function(t,n){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])})(t,n)};function n(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}var i=function(){return(i=Object.assign||function(t){for(var e,n=1,i=arguments.length;n<i;n++)for(var r in e=arguments[n])Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t}).apply(this,arguments)};function r(){for(var t=0,e=0,n=arguments.length;e<n;e++)t+=arguments[e].length;var i=Array(t),r=0;for(e=0;e<n;e++)for(var a=arguments[e],o=0,s=a.length;o<s;o++,r++)i[r]=a[o];return i}var a=function(){this.firefox=!1,this.ie=!1,this.edge=!1,this.newEdge=!1,this.weChat=!1},o=new function(){this.browser=new a,this.node=!1,this.wxa=!1,this.worker=!1,this.canvasSupported=!1,this.svgSupported=!1,this.touchEventsSupported=!1,this.pointerEventsSupported=!1,this.domSupported=!1,this.transformSupported=!1,this.transform3dSupported=!1};"object"==typeof wx&&"function"==typeof wx.getSystemInfoSync?(o.wxa=!0,o.canvasSupported=!0,o.touchEventsSupported=!0):"undefined"==typeof document&&"undefined"!=typeof self?(o.worker=!0,o.canvasSupported=!0):"undefined"==typeof navigator?(o.node=!0,o.canvasSupported=!0,o.svgSupported=!0):function(t,e){var n=e.browser,i=t.match(/Firefox\/([\d.]+)/),r=t.match(/MSIE\s([\d.]+)/)||t.match(/Trident\/.+?rv:(([\d.]+))/),a=t.match(/Edge?\/([\d.]+)/),o=/micromessenger/i.test(t);i&&(n.firefox=!0,n.version=i[1]);r&&(n.ie=!0,n.version=r[1]);a&&(n.edge=!0,n.version=a[1],n.newEdge=+a[1].split(".")[0]>18);o&&(n.weChat=!0);e.canvasSupported=!!document.createElement("canvas").getContext,e.svgSupported="undefined"!=typeof SVGRect,e.touchEventsSupported="ontouchstart"in window&&!n.ie&&!n.edge,e.pointerEventsSupported="onpointerdown"in window&&(n.edge||n.ie&&+n.version>=11),e.domSupported="undefined"!=typeof document;var s=document.documentElement.style;e.transform3dSupported=(n.ie&&"transition"in s||n.edge||"WebKitCSSMatrix"in window&&"m11"in new WebKitCSSMatrix||"MozPerspective"in s)&&!("OTransition"in s),e.transformSupported=e.transform3dSupported||n.ie&&+n.version>=9}(navigator.userAgent,o);var s={"[object Function]":!0,"[object RegExp]":!0,"[object Date]":!0,"[object Error]":!0,"[object CanvasGradient]":!0,"[object CanvasPattern]":!0,"[object Image]":!0,"[object Canvas]":!0},l={"[object Int8Array]":!0,"[object Uint8Array]":!0,"[object Uint8ClampedArray]":!0,"[object Int16Array]":!0,"[object Uint16Array]":!0,"[object Int32Array]":!0,"[object Uint32Array]":!0,"[object Float32Array]":!0,"[object Float64Array]":!0},u=Object.prototype.toString,h=Array.prototype,c=h.forEach,p=h.filter,f=h.slice,d=h.map,g=function(){}.constructor,y=g?g.prototype:null,v={};function m(t,e){v[t]=e}var _=2311;function x(){return _++}function b(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];"undefined"!=typeof console&&console.error.apply(console,t)}function w(t){if(null==t||"object"!=typeof t)return t;var e=t,n=u.call(t);if("[object Array]"===n){if(!ot(t)){e=[];for(var i=0,r=t.length;i<r;i++)e[i]=w(t[i])}}else if(l[n]){if(!ot(t)){var a=t.constructor;if(a.from)e=a.from(t);else{e=new a(t.length);for(i=0,r=t.length;i<r;i++)e[i]=w(t[i])}}}else if(!s[n]&&!ot(t)&&!X(t))for(var o in e={},t)t.hasOwnProperty(o)&&(e[o]=w(t[o]));return e}function S(t,e,n){if(!W(e)||!W(t))return n?w(e):t;for(var i in e)if(e.hasOwnProperty(i)){var r=t[i],a=e[i];!W(a)||!W(r)||z(a)||z(r)||X(a)||X(r)||U(a)||U(r)||ot(a)||ot(r)?!n&&i in t||(t[i]=w(e[i])):S(r,a,n)}return t}function M(t,e){if(Object.assign)Object.assign(t,e);else for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}function T(t,e,n){for(var i=N(e),r=0;r<i.length;r++){var a=i[r];(n?null!=e[a]:null==t[a])&&(t[a]=e[a])}return t}var C=function(){return v.createCanvas()};function A(t,e){if(t){if(t.indexOf)return t.indexOf(e);for(var n=0,i=t.length;n<i;n++)if(t[n]===e)return n}return-1}function D(t,e){var n=t.prototype;function i(){}for(var r in i.prototype=e.prototype,t.prototype=new i,n)n.hasOwnProperty(r)&&(t.prototype[r]=n[r]);t.prototype.constructor=t,t.superClass=e}function I(t,e,n){if(t="prototype"in t?t.prototype:t,e="prototype"in e?e.prototype:e,Object.getOwnPropertyNames)for(var i=Object.getOwnPropertyNames(e),r=0;r<i.length;r++){var a=i[r];"constructor"!==a&&(n?null!=e[a]:null==t[a])&&(t[a]=e[a])}else T(t,e,n)}function k(t){return!!t&&("string"!=typeof t&&"number"==typeof t.length)}function L(t,e,n){if(t&&e)if(t.forEach&&t.forEach===c)t.forEach(e,n);else if(t.length===+t.length)for(var i=0,r=t.length;i<r;i++)e.call(n,t[i],i,t);else for(var a in t)t.hasOwnProperty(a)&&e.call(n,t[a],a,t)}function P(t,e,n){if(!t)return[];if(!e)return tt(t);if(t.map&&t.map===d)return t.map(e,n);for(var i=[],r=0,a=t.length;r<a;r++)i.push(e.call(n,t[r],r,t));return i}function O(t,e,n,i){if(t&&e){for(var r=0,a=t.length;r<a;r++)n=e.call(i,n,t[r],r,t);return n}}function R(t,e,n){if(!t)return[];if(!e)return tt(t);if(t.filter&&t.filter===p)return t.filter(e,n);for(var i=[],r=0,a=t.length;r<a;r++)e.call(n,t[r],r,t)&&i.push(t[r]);return i}function N(t){if(!t)return[];if(Object.keys)return Object.keys(t);var e=[];for(var n in t)t.hasOwnProperty(n)&&e.push(n);return e}v.createCanvas=function(){return document.createElement("canvas")};var E=y&&F(y.bind)?y.call.bind(y.bind):function(t,e){for(var n=[],i=2;i<arguments.length;i++)n[i-2]=arguments[i];return function(){return t.apply(e,n.concat(f.call(arguments)))}};function B(t){for(var e=[],n=1;n<arguments.length;n++)e[n-1]=arguments[n];return function(){return t.apply(this,e.concat(f.call(arguments)))}}function z(t){return Array.isArray?Array.isArray(t):"[object Array]"===u.call(t)}function F(t){return"function"==typeof t}function V(t){return"string"==typeof t}function H(t){return"[object String]"===u.call(t)}function G(t){return"number"==typeof t}function W(t){var e=typeof t;return"function"===e||!!t&&"object"===e}function U(t){return!!s[u.call(t)]}function Y(t){return!!l[u.call(t)]}function X(t){return"object"==typeof t&&"number"==typeof t.nodeType&&"object"==typeof t.ownerDocument}function q(t){return null!=t.colorStops}function j(t){return null!=t.image}function Z(t){return"[object RegExp]"===u.call(t)}function K(t){return t!=t}function $(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];for(var n=0,i=t.length;n<i;n++)if(null!=t[n])return t[n]}function J(t,e){return null!=t?t:e}function Q(t,e,n){return null!=t?t:null!=e?e:n}function tt(t){for(var e=[],n=1;n<arguments.length;n++)e[n-1]=arguments[n];return f.apply(t,e)}function et(t){if("number"==typeof t)return[t,t,t,t];var e=t.length;return 2===e?[t[0],t[1],t[0],t[1]]:3===e?[t[0],t[1],t[2],t[1]]:t}function nt(t,e){if(!t)throw new Error(e)}function it(t){return null==t?null:"function"==typeof t.trim?t.trim():t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}var rt="__ec_primitive__";function at(t){t[rt]=!0}function ot(t){return t[rt]}var st=function(){function t(e){this.data={};var n=z(e);this.data={};var i=this;function r(t,e){n?i.set(t,e):i.set(e,t)}e instanceof t?e.each(r):e&&L(e,r)}return t.prototype.get=function(t){return this.data.hasOwnProperty(t)?this.data[t]:null},t.prototype.set=function(t,e){return this.data[t]=e},t.prototype.each=function(t,e){for(var n in this.data)this.data.hasOwnProperty(n)&&t.call(e,this.data[n],n)},t.prototype.keys=function(){return N(this.data)},t.prototype.removeKey=function(t){delete this.data[t]},t}();function lt(t){return new st(t)}function ut(t,e){var n;if(Object.create)n=Object.create(t);else{var i=function(){};i.prototype=t,n=new i}return e&&M(n,e),n}function ht(t,e){return t.hasOwnProperty(e)}function ct(){}var pt=Object.freeze({__proto__:null,$override:m,guid:x,logError:b,clone:w,merge:S,mergeAll:function(t,e){for(var n=t[0],i=1,r=t.length;i<r;i++)n=S(n,t[i],e);return n},extend:M,defaults:T,createCanvas:C,indexOf:A,inherits:D,mixin:I,isArrayLike:k,each:L,map:P,reduce:O,filter:R,find:function(t,e,n){if(t&&e)for(var i=0,r=t.length;i<r;i++)if(e.call(n,t[i],i,t))return t[i]},keys:N,bind:E,curry:B,isArray:z,isFunction:F,isString:V,isStringSafe:H,isNumber:G,isObject:W,isBuiltInObject:U,isTypedArray:Y,isDom:X,isGradientObject:q,isPatternObject:j,isRegExp:Z,eqNaN:K,retrieve:$,retrieve2:J,retrieve3:Q,slice:tt,normalizeCssArray:et,assert:nt,trim:it,setAsPrimitive:at,isPrimitive:ot,HashMap:st,createHashMap:lt,concatArray:function(t,e){for(var n=new t.constructor(t.length+e.length),i=0;i<t.length;i++)n[i]=t[i];var r=t.length;for(i=0;i<e.length;i++)n[i+r]=e[i];return n},createObject:ut,hasOwn:ht,noop:ct});function ft(t,e){return null==t&&(t=0),null==e&&(e=0),[t,e]}function dt(t){return[t[0],t[1]]}function gt(t,e,n){return t[0]=e[0]+n[0],t[1]=e[1]+n[1],t}function yt(t,e,n){return t[0]=e[0]-n[0],t[1]=e[1]-n[1],t}function vt(t){return Math.sqrt(_t(t))}var mt=vt;function _t(t){return t[0]*t[0]+t[1]*t[1]}var xt=_t;function bt(t,e,n){return t[0]=e[0]*n,t[1]=e[1]*n,t}function wt(t,e){var n=vt(e);return 0===n?(t[0]=0,t[1]=0):(t[0]=e[0]/n,t[1]=e[1]/n),t}function St(t,e){return Math.sqrt((t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1]))}var Mt=St;function Tt(t,e){return(t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1])}var Ct=Tt;function At(t,e,n,i){return t[0]=e[0]+i*(n[0]-e[0]),t[1]=e[1]+i*(n[1]-e[1]),t}function Dt(t,e,n){var i=e[0],r=e[1];return t[0]=n[0]*i+n[2]*r+n[4],t[1]=n[1]*i+n[3]*r+n[5],t}function It(t,e,n){return t[0]=Math.min(e[0],n[0]),t[1]=Math.min(e[1],n[1]),t}function kt(t,e,n){return t[0]=Math.max(e[0],n[0]),t[1]=Math.max(e[1],n[1]),t}var Lt=Object.freeze({__proto__:null,create:ft,copy:function(t,e){return t[0]=e[0],t[1]=e[1],t},clone:dt,set:function(t,e,n){return t[0]=e,t[1]=n,t},add:gt,scaleAndAdd:function(t,e,n,i){return t[0]=e[0]+n[0]*i,t[1]=e[1]+n[1]*i,t},sub:yt,len:vt,length:mt,lenSquare:_t,lengthSquare:xt,mul:function(t,e,n){return t[0]=e[0]*n[0],t[1]=e[1]*n[1],t},div:function(t,e,n){return t[0]=e[0]/n[0],t[1]=e[1]/n[1],t},dot:function(t,e){return t[0]*e[0]+t[1]*e[1]},scale:bt,normalize:wt,distance:St,dist:Mt,distanceSquare:Tt,distSquare:Ct,negate:function(t,e){return t[0]=-e[0],t[1]=-e[1],t},lerp:At,applyTransform:Dt,min:It,max:kt}),Pt=function(t,e){this.target=t,this.topTarget=e&&e.topTarget},Ot=function(){function t(t){this.handler=t,t.on("mousedown",this._dragStart,this),t.on("mousemove",this._drag,this),t.on("mouseup",this._dragEnd,this)}return t.prototype._dragStart=function(t){for(var e=t.target;e&&!e.draggable;)e=e.parent;e&&(this._draggingTarget=e,e.dragging=!0,this._x=t.offsetX,this._y=t.offsetY,this.handler.dispatchToElement(new Pt(e,t),"dragstart",t.event))},t.prototype._drag=function(t){var e=this._draggingTarget;if(e){var n=t.offsetX,i=t.offsetY,r=n-this._x,a=i-this._y;this._x=n,this._y=i,e.drift(r,a,t),this.handler.dispatchToElement(new Pt(e,t),"drag",t.event);var o=this.handler.findHover(n,i,e).target,s=this._dropTarget;this._dropTarget=o,e!==o&&(s&&o!==s&&this.handler.dispatchToElement(new Pt(s,t),"dragleave",t.event),o&&o!==s&&this.handler.dispatchToElement(new Pt(o,t),"dragenter",t.event))}},t.prototype._dragEnd=function(t){var e=this._draggingTarget;e&&(e.dragging=!1),this.handler.dispatchToElement(new Pt(e,t),"dragend",t.event),this._dropTarget&&this.handler.dispatchToElement(new Pt(this._dropTarget,t),"drop",t.event),this._draggingTarget=null,this._dropTarget=null},t}(),Rt=function(){function t(t){t&&(this._$eventProcessor=t)}return t.prototype.on=function(t,e,n,i){this._$handlers||(this._$handlers={});var r=this._$handlers;if("function"==typeof e&&(i=n,n=e,e=null),!n||!t)return this;var a=this._$eventProcessor;null!=e&&a&&a.normalizeQuery&&(e=a.normalizeQuery(e)),r[t]||(r[t]=[]);for(var o=0;o<r[t].length;o++)if(r[t][o].h===n)return this;var s={h:n,query:e,ctx:i||this,callAtLast:n.zrEventfulCallAtLast},l=r[t].length-1,u=r[t][l];return u&&u.callAtLast?r[t].splice(l,0,s):r[t].push(s),this},t.prototype.isSilent=function(t){var e=this._$handlers;return!e||!e[t]||!e[t].length},t.prototype.off=function(t,e){var n=this._$handlers;if(!n)return this;if(!t)return this._$handlers={},this;if(e){if(n[t]){for(var i=[],r=0,a=n[t].length;r<a;r++)n[t][r].h!==e&&i.push(n[t][r]);n[t]=i}n[t]&&0===n[t].length&&delete n[t]}else delete n[t];return this},t.prototype.trigger=function(t){for(var e=[],n=1;n<arguments.length;n++)e[n-1]=arguments[n];if(!this._$handlers)return this;var i=this._$handlers[t],r=this._$eventProcessor;if(i)for(var a=e.length,o=i.length,s=0;s<o;s++){var l=i[s];if(!r||!r.filter||null==l.query||r.filter(t,l.query))switch(a){case 0:l.h.call(l.ctx);break;case 1:l.h.call(l.ctx,e[0]);break;case 2:l.h.call(l.ctx,e[0],e[1]);break;default:l.h.apply(l.ctx,e)}}return r&&r.afterTrigger&&r.afterTrigger(t),this},t.prototype.triggerWithContext=function(t){if(!this._$handlers)return this;var e=this._$handlers[t],n=this._$eventProcessor;if(e)for(var i=arguments,r=i.length,a=i[r-1],o=e.length,s=0;s<o;s++){var l=e[s];if(!n||!n.filter||null==l.query||n.filter(t,l.query))switch(r){case 0:l.h.call(a);break;case 1:l.h.call(a,i[0]);break;case 2:l.h.call(a,i[0],i[1]);break;default:l.h.apply(a,i.slice(1,r-1))}}return n&&n.afterTrigger&&n.afterTrigger(t),this},t}(),Nt=Math.log(2);function Et(t,e,n,i,r,a){var o=i+"-"+r,s=t.length;if(a.hasOwnProperty(o))return a[o];if(1===e){var l=Math.round(Math.log((1<<s)-1&~r)/Nt);return t[n][l]}for(var u=i|1<<n,h=n+1;i&1<<h;)h++;for(var c=0,p=0,f=0;p<s;p++){var d=1<<p;d&r||(c+=(f%2?-1:1)*t[n][p]*Et(t,e-1,h,u,r|d,a),f++)}return a[o]=c,c}function Bt(t,e){var n=[[t[0],t[1],1,0,0,0,-e[0]*t[0],-e[0]*t[1]],[0,0,0,t[0],t[1],1,-e[1]*t[0],-e[1]*t[1]],[t[2],t[3],1,0,0,0,-e[2]*t[2],-e[2]*t[3]],[0,0,0,t[2],t[3],1,-e[3]*t[2],-e[3]*t[3]],[t[4],t[5],1,0,0,0,-e[4]*t[4],-e[4]*t[5]],[0,0,0,t[4],t[5],1,-e[5]*t[4],-e[5]*t[5]],[t[6],t[7],1,0,0,0,-e[6]*t[6],-e[6]*t[7]],[0,0,0,t[6],t[7],1,-e[7]*t[6],-e[7]*t[7]]],i={},r=Et(n,8,0,0,0,i);if(0!==r){for(var a=[],o=0;o<8;o++)for(var s=0;s<8;s++)null==a[s]&&(a[s]=0),a[s]+=((o+s)%2?-1:1)*Et(n,7,0===o?1:0,1<<o,1<<s,i)/r*e[o];return function(t,e,n){var i=e*a[6]+n*a[7]+1;t[0]=(e*a[0]+n*a[1]+a[2])/i,t[1]=(e*a[3]+n*a[4]+a[5])/i}}}function zt(t,e,n,i,r){if(e.getBoundingClientRect&&o.domSupported&&!Ft(e)){var a=e.___zrEVENTSAVED||(e.___zrEVENTSAVED={}),s=function(t,e,n){for(var i=n?"invTrans":"trans",r=e[i],a=e.srcCoords,o=[],s=[],l=!0,u=0;u<4;u++){var h=t[u].getBoundingClientRect(),c=2*u,p=h.left,f=h.top;o.push(p,f),l=l&&a&&p===a[c]&&f===a[c+1],s.push(t[u].offsetLeft,t[u].offsetTop)}return l&&r?r:(e.srcCoords=o,e[i]=n?Bt(s,o):Bt(o,s))}(function(t,e){var n=e.markers;if(n)return n;n=e.markers=[];for(var i=["left","right"],r=["top","bottom"],a=0;a<4;a++){var o=document.createElement("div"),s=a%2,l=(a>>1)%2;o.style.cssText=["position: absolute","visibility: hidden","padding: 0","margin: 0","border-width: 0","user-select: none","width:0","height:0",i[s]+":0",r[l]+":0",i[1-s]+":auto",r[1-l]+":auto",""].join("!important;"),t.appendChild(o),n.push(o)}return n}(e,a),a,r);if(s)return s(t,n,i),!0}return!1}function Ft(t){return"CANVAS"===t.nodeName.toUpperCase()}var Vt="undefined"!=typeof window&&!!window.addEventListener,Ht=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Gt=[];function Wt(t,e,n,i){return n=n||{},i||!o.canvasSupported?Ut(t,e,n):o.browser.firefox&&null!=e.layerX&&e.layerX!==e.offsetX?(n.zrX=e.layerX,n.zrY=e.layerY):null!=e.offsetX?(n.zrX=e.offsetX,n.zrY=e.offsetY):Ut(t,e,n),n}function Ut(t,e,n){if(o.domSupported&&t.getBoundingClientRect){var i=e.clientX,r=e.clientY;if(Ft(t)){var a=t.getBoundingClientRect();return n.zrX=i-a.left,void(n.zrY=r-a.top)}if(zt(Gt,t,i,r))return n.zrX=Gt[0],void(n.zrY=Gt[1])}n.zrX=n.zrY=0}function Yt(t){return t||window.event}function Xt(t,e,n){if(null!=(e=Yt(e)).zrX)return e;var i=e.type;if(i&&i.indexOf("touch")>=0){var r="touchend"!==i?e.targetTouches[0]:e.changedTouches[0];r&&Wt(t,r,e,n)}else{Wt(t,e,e,n);var a=function(t){var e=t.wheelDelta;if(e)return e;var n=t.deltaX,i=t.deltaY;if(null==n||null==i)return e;return 3*(0!==i?Math.abs(i):Math.abs(n))*(i>0?-1:i<0?1:n>0?-1:1)}(e);e.zrDelta=a?a/120:-(e.detail||0)/3}var o=e.button;return null==e.which&&void 0!==o&&Ht.test(e.type)&&(e.which=1&o?1:2&o?3:4&o?2:0),e}var qt=Vt?function(t){t.preventDefault(),t.stopPropagation(),t.cancelBubble=!0}:function(t){t.returnValue=!1,t.cancelBubble=!0},jt=function(){function t(){this._track=[]}return t.prototype.recognize=function(t,e,n){return this._doTrack(t,e,n),this._recognize(t)},t.prototype.clear=function(){return this._track.length=0,this},t.prototype._doTrack=function(t,e,n){var i=t.touches;if(i){for(var r={points:[],touches:[],target:e,event:t},a=0,o=i.length;a<o;a++){var s=i[a],l=Wt(n,s,{});r.points.push([l.zrX,l.zrY]),r.touches.push(s)}this._track.push(r)}},t.prototype._recognize=function(t){for(var e in Kt)if(Kt.hasOwnProperty(e)){var n=Kt[e](this._track,t);if(n)return n}},t}();function Zt(t){var e=t[1][0]-t[0][0],n=t[1][1]-t[0][1];return Math.sqrt(e*e+n*n)}var Kt={pinch:function(t,e){var n=t.length;if(n){var i,r=(t[n-1]||{}).points,a=(t[n-2]||{}).points||r;if(a&&a.length>1&&r&&r.length>1){var o=Zt(r)/Zt(a);!isFinite(o)&&(o=1),e.pinchScale=o;var s=[((i=r)[0][0]+i[1][0])/2,(i[0][1]+i[1][1])/2];return e.pinchX=s[0],e.pinchY=s[1],{type:"pinch",target:t[0].target,event:e}}}}},$t="silent";function Jt(){qt(this.event)}var Qt=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.handler=null,e}return n(e,t),e.prototype.dispose=function(){},e.prototype.setCursor=function(){},e}(Rt),te=function(t,e){this.x=t,this.y=e},ee=["click","dblclick","mousewheel","mouseout","mouseup","mousedown","mousemove","contextmenu"],ne=function(t){function e(e,n,i,r){var a=t.call(this)||this;return a._hovered=new te(0,0),a.storage=e,a.painter=n,a.painterRoot=r,i=i||new Qt,a.proxy=null,a.setHandlerProxy(i),a._draggingMgr=new Ot(a),a}return n(e,t),e.prototype.setHandlerProxy=function(t){this.proxy&&this.proxy.dispose(),t&&(L(ee,(function(e){t.on&&t.on(e,this[e],this)}),this),t.handler=this),this.proxy=t},e.prototype.mousemove=function(t){var e=t.zrX,n=t.zrY,i=re(this,e,n),r=this._hovered,a=r.target;a&&!a.__zr&&(a=(r=this.findHover(r.x,r.y)).target);var o=this._hovered=i?new te(e,n):this.findHover(e,n),s=o.target,l=this.proxy;l.setCursor&&l.setCursor(s?s.cursor:"default"),a&&s!==a&&this.dispatchToElement(r,"mouseout",t),this.dispatchToElement(o,"mousemove",t),s&&s!==a&&this.dispatchToElement(o,"mouseover",t)},e.prototype.mouseout=function(t){var e=t.zrEventControl;"only_globalout"!==e&&this.dispatchToElement(this._hovered,"mouseout",t),"no_globalout"!==e&&this.trigger("globalout",{type:"globalout",event:t})},e.prototype.resize=function(){this._hovered=new te(0,0)},e.prototype.dispatch=function(t,e){var n=this[t];n&&n.call(this,e)},e.prototype.dispose=function(){this.proxy.dispose(),this.storage=null,this.proxy=null,this.painter=null},e.prototype.setCursorStyle=function(t){var e=this.proxy;e.setCursor&&e.setCursor(t)},e.prototype.dispatchToElement=function(t,e,n){var i=(t=t||{}).target;if(!i||!i.silent){for(var r="on"+e,a=function(t,e,n){return{type:t,event:n,target:e.target,topTarget:e.topTarget,cancelBubble:!1,offsetX:n.zrX,offsetY:n.zrY,gestureEvent:n.gestureEvent,pinchX:n.pinchX,pinchY:n.pinchY,pinchScale:n.pinchScale,wheelDelta:n.zrDelta,zrByTouch:n.zrByTouch,which:n.which,stop:Jt}}(e,t,n);i&&(i[r]&&(a.cancelBubble=!!i[r].call(i,a)),i.trigger(e,a),i=i.__hostTarget?i.__hostTarget:i.parent,!a.cancelBubble););a.cancelBubble||(this.trigger(e,a),this.painter&&this.painter.eachOtherLayer&&this.painter.eachOtherLayer((function(t){"function"==typeof t[r]&&t[r].call(t,a),t.trigger&&t.trigger(e,a)})))}},e.prototype.findHover=function(t,e,n){for(var i=this.storage.getDisplayList(),r=new te(t,e),a=i.length-1;a>=0;a--){var o=void 0;if(i[a]!==n&&!i[a].ignore&&(o=ie(i[a],t,e))&&(!r.topTarget&&(r.topTarget=i[a]),o!==$t)){r.target=i[a];break}}return r},e.prototype.processGesture=function(t,e){this._gestureMgr||(this._gestureMgr=new jt);var n=this._gestureMgr;"start"===e&&n.clear();var i=n.recognize(t,this.findHover(t.zrX,t.zrY,null).target,this.proxy.dom);if("end"===e&&n.clear(),i){var r=i.type;t.gestureEvent=r;var a=new te;a.target=i.target,this.dispatchToElement(a,r,i.event)}},e}(Rt);function ie(t,e,n){if(t[t.rectHover?"rectContain":"contain"](e,n)){for(var i=t,r=void 0,a=!1;i;){if(i.ignoreClip&&(a=!0),!a){var o=i.getClipPath();if(o&&!o.contain(e,n))return!1;i.silent&&(r=!0)}var s=i.__hostTarget;i=s||i.parent}return!r||$t}return!1}function re(t,e,n){var i=t.painter;return e<0||e>i.getWidth()||n<0||n>i.getHeight()}function ae(){return[1,0,0,1,0,0]}function oe(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t}function se(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t}function le(t,e,n){var i=e[0]*n[0]+e[2]*n[1],r=e[1]*n[0]+e[3]*n[1],a=e[0]*n[2]+e[2]*n[3],o=e[1]*n[2]+e[3]*n[3],s=e[0]*n[4]+e[2]*n[5]+e[4],l=e[1]*n[4]+e[3]*n[5]+e[5];return t[0]=i,t[1]=r,t[2]=a,t[3]=o,t[4]=s,t[5]=l,t}function ue(t,e,n){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4]+n[0],t[5]=e[5]+n[1],t}function he(t,e,n){var i=e[0],r=e[2],a=e[4],o=e[1],s=e[3],l=e[5],u=Math.sin(n),h=Math.cos(n);return t[0]=i*h+o*u,t[1]=-i*u+o*h,t[2]=r*h+s*u,t[3]=-r*u+h*s,t[4]=h*a+u*l,t[5]=h*l-u*a,t}function ce(t,e,n){var i=n[0],r=n[1];return t[0]=e[0]*i,t[1]=e[1]*r,t[2]=e[2]*i,t[3]=e[3]*r,t[4]=e[4]*i,t[5]=e[5]*r,t}function pe(t,e){var n=e[0],i=e[2],r=e[4],a=e[1],o=e[3],s=e[5],l=n*o-a*i;return l?(l=1/l,t[0]=o*l,t[1]=-a*l,t[2]=-i*l,t[3]=n*l,t[4]=(i*s-o*r)*l,t[5]=(a*r-n*s)*l,t):null}L(["click","mousedown","mouseup","mousewheel","dblclick","contextmenu"],(function(t){ne.prototype[t]=function(e){var n,i,r=e.zrX,a=e.zrY,o=re(this,r,a);if("mouseup"===t&&o||(i=(n=this.findHover(r,a)).target),"mousedown"===t)this._downEl=i,this._downPoint=[e.zrX,e.zrY],this._upEl=i;else if("mouseup"===t)this._upEl=i;else if("click"===t){if(this._downEl!==this._upEl||!this._downPoint||Mt(this._downPoint,[e.zrX,e.zrY])>4)return;this._downPoint=null}this.dispatchToElement(n,t,e)}}));var fe=Object.freeze({__proto__:null,create:ae,identity:oe,copy:se,mul:le,translate:ue,rotate:he,scale:ce,invert:pe,clone:function(t){var e=[1,0,0,1,0,0];return se(e,t),e}}),de=oe,ge=5e-5;function ye(t){return t>ge||t<-5e-5}var ve=[],me=[],_e=[1,0,0,1,0,0],xe=Math.abs,be=function(){function t(){}return t.prototype.setPosition=function(t){this.x=t[0],this.y=t[1]},t.prototype.setScale=function(t){this.scaleX=t[0],this.scaleY=t[1]},t.prototype.setOrigin=function(t){this.originX=t[0],this.originY=t[1]},t.prototype.needLocalTransform=function(){return ye(this.rotation)||ye(this.x)||ye(this.y)||ye(this.scaleX-1)||ye(this.scaleY-1)},t.prototype.updateTransform=function(){var t=this.parent,e=t&&t.transform,n=this.needLocalTransform(),i=this.transform;n||e?(i=i||[1,0,0,1,0,0],n?this.getLocalTransform(i):de(i),e&&(n?le(i,t.transform,i):se(i,t.transform)),this.transform=i,this._resolveGlobalScaleRatio(i)):i&&de(i)},t.prototype._resolveGlobalScaleRatio=function(t){var e=this.globalScaleRatio;if(null!=e&&1!==e){this.getGlobalScale(ve);var n=ve[0]<0?-1:1,i=ve[1]<0?-1:1,r=((ve[0]-n)*e+n)/ve[0]||0,a=((ve[1]-i)*e+i)/ve[1]||0;t[0]*=r,t[1]*=r,t[2]*=a,t[3]*=a}this.invTransform=this.invTransform||[1,0,0,1,0,0],pe(this.invTransform,t)},t.prototype.getLocalTransform=function(e){return t.getLocalTransform(this,e)},t.prototype.getComputedTransform=function(){for(var t=this,e=[];t;)e.push(t),t=t.parent;for(;t=e.pop();)t.updateTransform();return this.transform},t.prototype.setLocalTransform=function(t){if(t){var e=t[0]*t[0]+t[1]*t[1],n=t[2]*t[2]+t[3]*t[3];ye(e-1)&&(e=Math.sqrt(e)),ye(n-1)&&(n=Math.sqrt(n)),t[0]<0&&(e=-e),t[3]<0&&(n=-n),this.rotation=Math.atan2(-t[1]/n,t[0]/e),e<0&&n<0&&(this.rotation+=Math.PI,e=-e,n=-n),this.x=t[4],this.y=t[5],this.scaleX=e,this.scaleY=n}},t.prototype.decomposeTransform=function(){if(this.transform){var t=this.parent,e=this.transform;t&&t.transform&&(le(me,t.invTransform,e),e=me);var n=this.originX,i=this.originY;(n||i)&&(_e[4]=n,_e[5]=i,le(me,e,_e),me[4]-=n,me[5]-=i,e=me),this.setLocalTransform(e)}},t.prototype.getGlobalScale=function(t){var e=this.transform;return t=t||[],e?(t[0]=Math.sqrt(e[0]*e[0]+e[1]*e[1]),t[1]=Math.sqrt(e[2]*e[2]+e[3]*e[3]),e[0]<0&&(t[0]=-t[0]),e[3]<0&&(t[1]=-t[1]),t):(t[0]=1,t[1]=1,t)},t.prototype.transformCoordToLocal=function(t,e){var n=[t,e],i=this.invTransform;return i&&Dt(n,n,i),n},t.prototype.transformCoordToGlobal=function(t,e){var n=[t,e],i=this.transform;return i&&Dt(n,n,i),n},t.prototype.getLineScale=function(){var t=this.transform;return t&&xe(t[0]-1)>1e-10&&xe(t[3]-1)>1e-10?Math.sqrt(xe(t[0]*t[3]-t[2]*t[1])):1},t.getLocalTransform=function(t,e){de(e=e||[]);var n=t.originX||0,i=t.originY||0,r=t.scaleX,a=t.scaleY,o=t.rotation||0,s=t.x,l=t.y;return e[4]-=n,e[5]-=i,e[0]*=r,e[1]*=a,e[2]*=r,e[3]*=a,e[4]*=r,e[5]*=a,o&&he(e,e,o),e[4]+=n,e[5]+=i,e[4]+=s,e[5]+=l,e},t.initDefaultProps=function(){var e=t.prototype;e.x=0,e.y=0,e.scaleX=1,e.scaleY=1,e.originX=0,e.originY=0,e.rotation=0,e.globalScaleRatio=1}(),t}(),we={linear:function(t){return t},quadraticIn:function(t){return t*t},quadraticOut:function(t){return t*(2-t)},quadraticInOut:function(t){return(t*=2)<1?.5*t*t:-.5*(--t*(t-2)-1)},cubicIn:function(t){return t*t*t},cubicOut:function(t){return--t*t*t+1},cubicInOut:function(t){return(t*=2)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},quarticIn:function(t){return t*t*t*t},quarticOut:function(t){return 1- --t*t*t*t},quarticInOut:function(t){return(t*=2)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},quinticIn:function(t){return t*t*t*t*t},quinticOut:function(t){return--t*t*t*t*t+1},quinticInOut:function(t){return(t*=2)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},sinusoidalIn:function(t){return 1-Math.cos(t*Math.PI/2)},sinusoidalOut:function(t){return Math.sin(t*Math.PI/2)},sinusoidalInOut:function(t){return.5*(1-Math.cos(Math.PI*t))},exponentialIn:function(t){return 0===t?0:Math.pow(1024,t-1)},exponentialOut:function(t){return 1===t?1:1-Math.pow(2,-10*t)},exponentialInOut:function(t){return 0===t?0:1===t?1:(t*=2)<1?.5*Math.pow(1024,t-1):.5*(2-Math.pow(2,-10*(t-1)))},circularIn:function(t){return 1-Math.sqrt(1-t*t)},circularOut:function(t){return Math.sqrt(1- --t*t)},circularInOut:function(t){return(t*=2)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},elasticIn:function(t){var e,n=.1;return 0===t?0:1===t?1:(!n||n<1?(n=1,e=.1):e=.4*Math.asin(1/n)/(2*Math.PI),-n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/.4))},elasticOut:function(t){var e,n=.1;return 0===t?0:1===t?1:(!n||n<1?(n=1,e=.1):e=.4*Math.asin(1/n)/(2*Math.PI),n*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/.4)+1)},elasticInOut:function(t){var e,n=.1,i=.4;return 0===t?0:1===t?1:(!n||n<1?(n=1,e=.1):e=i*Math.asin(1/n)/(2*Math.PI),(t*=2)<1?n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i)*-.5:n*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i)*.5+1)},backIn:function(t){var e=1.70158;return t*t*((e+1)*t-e)},backOut:function(t){var e=1.70158;return--t*t*((e+1)*t+e)+1},backInOut:function(t){var e=2.5949095;return(t*=2)<1?t*t*((e+1)*t-e)*.5:.5*((t-=2)*t*((e+1)*t+e)+2)},bounceIn:function(t){return 1-we.bounceOut(1-t)},bounceOut:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},bounceInOut:function(t){return t<.5?.5*we.bounceIn(2*t):.5*we.bounceOut(2*t-1)+.5}},Se=function(){function t(t){this._initialized=!1,this._startTime=0,this._pausedTime=0,this._paused=!1,this._life=t.life||1e3,this._delay=t.delay||0,this.loop=null!=t.loop&&t.loop,this.gap=t.gap||0,this.easing=t.easing||"linear",this.onframe=t.onframe,this.ondestroy=t.ondestroy,this.onrestart=t.onrestart}return t.prototype.step=function(t,e){if(this._initialized||(this._startTime=t+this._delay,this._initialized=!0),!this._paused){var n=(t-this._startTime-this._pausedTime)/this._life;n<0&&(n=0),n=Math.min(n,1);var i=this.easing,r="string"==typeof i?we[i]:i,a="function"==typeof r?r(n):n;if(this.onframe&&this.onframe(a),1===n){if(!this.loop)return!0;this._restart(t),this.onrestart&&this.onrestart()}return!1}this._pausedTime+=e},t.prototype._restart=function(t){var e=(t-this._startTime-this._pausedTime)%this._life;this._startTime=t-e+this.gap,this._pausedTime=0},t.prototype.pause=function(){this._paused=!0},t.prototype.resume=function(){this._paused=!1},t}(),Me=function(t){this.value=t},Te=function(){function t(){this._len=0}return t.prototype.insert=function(t){var e=new Me(t);return this.insertEntry(e),e},t.prototype.insertEntry=function(t){this.head?(this.tail.next=t,t.prev=this.tail,t.next=null,this.tail=t):this.head=this.tail=t,this._len++},t.prototype.remove=function(t){var e=t.prev,n=t.next;e?e.next=n:this.head=n,n?n.prev=e:this.tail=e,t.next=t.prev=null,this._len--},t.prototype.len=function(){return this._len},t.prototype.clear=function(){this.head=this.tail=null,this._len=0},t}(),Ce=function(){function t(t){this._list=new Te,this._maxSize=10,this._map={},this._maxSize=t}return t.prototype.put=function(t,e){var n=this._list,i=this._map,r=null;if(null==i[t]){var a=n.len(),o=this._lastRemovedEntry;if(a>=this._maxSize&&a>0){var s=n.head;n.remove(s),delete i[s.key],r=s.value,this._lastRemovedEntry=s}o?o.value=e:o=new Me(e),o.key=t,n.insertEntry(o),i[t]=o}return r},t.prototype.get=function(t){var e=this._map[t],n=this._list;if(null!=e)return e!==n.tail&&(n.remove(e),n.insertEntry(e)),e.value},t.prototype.clear=function(){this._list.clear(),this._map={}},t.prototype.len=function(){return this._list.len()},t}(),Ae={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]};function De(t){return(t=Math.round(t))<0?0:t>255?255:t}function Ie(t){return t<0?0:t>1?1:t}function ke(t){var e=t;return e.length&&"%"===e.charAt(e.length-1)?De(parseFloat(e)/100*255):De(parseInt(e,10))}function Le(t){var e=t;return e.length&&"%"===e.charAt(e.length-1)?Ie(parseFloat(e)/100):Ie(parseFloat(e))}function Pe(t,e,n){return n<0?n+=1:n>1&&(n-=1),6*n<1?t+(e-t)*n*6:2*n<1?e:3*n<2?t+(e-t)*(2/3-n)*6:t}function Oe(t,e,n){return t+(e-t)*n}function Re(t,e,n,i,r){return t[0]=e,t[1]=n,t[2]=i,t[3]=r,t}function Ne(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t}var Ee=new Ce(20),Be=null;function ze(t,e){Be&&Ne(Be,e),Be=Ee.put(t,Be||e.slice())}function Fe(t,e){if(t){e=e||[];var n=Ee.get(t);if(n)return Ne(e,n);var i=(t+="").replace(/ /g,"").toLowerCase();if(i in Ae)return Ne(e,Ae[i]),ze(t,e),e;var r,a=i.length;if("#"===i.charAt(0))return 4===a||5===a?(r=parseInt(i.slice(1,4),16))>=0&&r<=4095?(Re(e,(3840&r)>>4|(3840&r)>>8,240&r|(240&r)>>4,15&r|(15&r)<<4,5===a?parseInt(i.slice(4),16)/15:1),ze(t,e),e):void Re(e,0,0,0,1):7===a||9===a?(r=parseInt(i.slice(1,7),16))>=0&&r<=16777215?(Re(e,(16711680&r)>>16,(65280&r)>>8,255&r,9===a?parseInt(i.slice(7),16)/255:1),ze(t,e),e):void Re(e,0,0,0,1):void 0;var o=i.indexOf("("),s=i.indexOf(")");if(-1!==o&&s+1===a){var l=i.substr(0,o),u=i.substr(o+1,s-(o+1)).split(","),h=1;switch(l){case"rgba":if(4!==u.length)return 3===u.length?Re(e,+u[0],+u[1],+u[2],1):Re(e,0,0,0,1);h=Le(u.pop());case"rgb":return 3!==u.length?void Re(e,0,0,0,1):(Re(e,ke(u[0]),ke(u[1]),ke(u[2]),h),ze(t,e),e);case"hsla":return 4!==u.length?void Re(e,0,0,0,1):(u[3]=Le(u[3]),Ve(u,e),ze(t,e),e);case"hsl":return 3!==u.length?void Re(e,0,0,0,1):(Ve(u,e),ze(t,e),e);default:return}}Re(e,0,0,0,1)}}function Ve(t,e){var n=(parseFloat(t[0])%360+360)%360/360,i=Le(t[1]),r=Le(t[2]),a=r<=.5?r*(i+1):r+i-r*i,o=2*r-a;return Re(e=e||[],De(255*Pe(o,a,n+1/3)),De(255*Pe(o,a,n)),De(255*Pe(o,a,n-1/3)),1),4===t.length&&(e[3]=t[3]),e}function He(t,e){var n=Fe(t);if(n){for(var i=0;i<3;i++)n[i]=e<0?n[i]*(1-e)|0:(255-n[i])*e+n[i]|0,n[i]>255?n[i]=255:n[i]<0&&(n[i]=0);return Xe(n,4===n.length?"rgba":"rgb")}}function Ge(t,e,n){if(e&&e.length&&t>=0&&t<=1){n=n||[];var i=t*(e.length-1),r=Math.floor(i),a=Math.ceil(i),o=e[r],s=e[a],l=i-r;return n[0]=De(Oe(o[0],s[0],l)),n[1]=De(Oe(o[1],s[1],l)),n[2]=De(Oe(o[2],s[2],l)),n[3]=Ie(Oe(o[3],s[3],l)),n}}var We=Ge;function Ue(t,e,n){if(e&&e.length&&t>=0&&t<=1){var i=t*(e.length-1),r=Math.floor(i),a=Math.ceil(i),o=Fe(e[r]),s=Fe(e[a]),l=i-r,u=Xe([De(Oe(o[0],s[0],l)),De(Oe(o[1],s[1],l)),De(Oe(o[2],s[2],l)),Ie(Oe(o[3],s[3],l))],"rgba");return n?{color:u,leftIndex:r,rightIndex:a,value:i}:u}}var Ye=Ue;function Xe(t,e){if(t&&t.length){var n=t[0]+","+t[1]+","+t[2];return"rgba"!==e&&"hsva"!==e&&"hsla"!==e||(n+=","+t[3]),e+"("+n+")"}}function qe(t,e){var n=Fe(t);return n?(.299*n[0]+.587*n[1]+.114*n[2])*n[3]/255+(1-n[3])*e:0}var je=Object.freeze({__proto__:null,parse:Fe,lift:He,toHex:function(t){var e=Fe(t);if(e)return((1<<24)+(e[0]<<16)+(e[1]<<8)+ +e[2]).toString(16).slice(1)},fastLerp:Ge,fastMapToColor:We,lerp:Ue,mapToColor:Ye,modifyHSL:function(t,e,n,i){var r=Fe(t);if(t)return r=function(t){if(t){var e,n,i=t[0]/255,r=t[1]/255,a=t[2]/255,o=Math.min(i,r,a),s=Math.max(i,r,a),l=s-o,u=(s+o)/2;if(0===l)e=0,n=0;else{n=u<.5?l/(s+o):l/(2-s-o);var h=((s-i)/6+l/2)/l,c=((s-r)/6+l/2)/l,p=((s-a)/6+l/2)/l;i===s?e=p-c:r===s?e=1/3+h-p:a===s&&(e=2/3+c-h),e<0&&(e+=1),e>1&&(e-=1)}var f=[360*e,n,u];return null!=t[3]&&f.push(t[3]),f}}(r),null!=e&&(r[0]=function(t){return(t=Math.round(t))<0?0:t>360?360:t}(e)),null!=n&&(r[1]=Le(n)),null!=i&&(r[2]=Le(i)),Xe(Ve(r),"rgba")},modifyAlpha:function(t,e){var n=Fe(t);if(n&&null!=e)return n[3]=Ie(e),Xe(n,"rgba")},stringify:Xe,lum:qe,random:function(){return"rgb("+Math.round(255*Math.random())+","+Math.round(255*Math.random())+","+Math.round(255*Math.random())+")"}}),Ze=Array.prototype.slice;function Ke(t,e,n){return(e-t)*n+t}function $e(t,e,n,i){for(var r=e.length,a=0;a<r;a++)t[a]=Ke(e[a],n[a],i)}function Je(t,e,n,i){for(var r=e.length,a=0;a<r;a++)t[a]=e[a]+n[a]*i;return t}function Qe(t,e,n,i){for(var r=e.length,a=r&&e[0].length,o=0;o<r;o++){t[o]||(t[o]=[]);for(var s=0;s<a;s++)t[o][s]=e[o][s]+n[o][s]*i}return t}function tn(t,e,n){var i=t,r=e;if(i.push&&r.push){var a=i.length,o=r.length;if(a!==o)if(a>o)i.length=o;else for(var s=a;s<o;s++)i.push(1===n?r[s]:Ze.call(r[s]));var l=i[0]&&i[0].length;for(s=0;s<i.length;s++)if(1===n)isNaN(i[s])&&(i[s]=r[s]);else for(var u=0;u<l;u++)isNaN(i[s][u])&&(i[s][u]=r[s][u])}}function en(t,e){var n=t.length;if(n!==e.length)return!1;for(var i=0;i<n;i++)if(t[i]!==e[i])return!1;return!0}function nn(t,e,n,i,r,a,o){var s=.5*(n-t),l=.5*(i-e);return(2*(e-n)+s+l)*o+(-3*(e-n)-2*s-l)*a+s*r+e}function rn(t,e,n,i,r,a,o,s){for(var l=e.length,u=0;u<l;u++)t[u]=nn(e[u],n[u],i[u],r[u],a,o,s)}function an(t){if(k(t)){var e=t.length;if(k(t[0])){for(var n=[],i=0;i<e;i++)n.push(Ze.call(t[i]));return n}return Ze.call(t)}return t}function on(t){return t[0]=Math.floor(t[0]),t[1]=Math.floor(t[1]),t[2]=Math.floor(t[2]),"rgba("+t.join(",")+")"}var sn,ln,un=[0,0,0,0],hn=function(){function t(t){this.keyframes=[],this.maxTime=0,this.arrDim=0,this.interpolable=!0,this._needsSort=!1,this._isAllValueEqual=!0,this._lastFrame=0,this._lastFramePercent=0,this.propName=t}return t.prototype.isFinished=function(){return this._finished},t.prototype.setFinished=function(){this._finished=!0,this._additiveTrack&&this._additiveTrack.setFinished()},t.prototype.needsAnimate=function(){return!this._isAllValueEqual&&this.keyframes.length>=2&&this.interpolable},t.prototype.getAdditiveTrack=function(){return this._additiveTrack},t.prototype.addKeyframe=function(t,e){t>=this.maxTime?this.maxTime=t:this._needsSort=!0;var n=this.keyframes,i=n.length;if(this.interpolable)if(k(e)){var r=function(t){return k(t&&t[0])?2:1}(e);if(i>0&&this.arrDim!==r)return void(this.interpolable=!1);if(1===r&&"number"!=typeof e[0]||2===r&&"number"!=typeof e[0][0])return void(this.interpolable=!1);if(i>0){var a=n[i-1];this._isAllValueEqual&&(1===r&&en(e,a.value)||(this._isAllValueEqual=!1))}this.arrDim=r}else{if(this.arrDim>0)return void(this.interpolable=!1);if("string"==typeof e){var o=Fe(e);o?(e=o,this.isValueColor=!0):this.interpolable=!1}else if("number"!=typeof e||isNaN(e))return void(this.interpolable=!1);if(this._isAllValueEqual&&i>0){a=n[i-1];(this.isValueColor&&!en(a.value,e)||a.value!==e)&&(this._isAllValueEqual=!1)}}var s={time:t,value:e,percent:0};return this.keyframes.push(s),s},t.prototype.prepare=function(t){var e=this.keyframes;this._needsSort&&e.sort((function(t,e){return t.time-e.time}));for(var n=this.arrDim,i=e.length,r=e[i-1],a=0;a<i;a++)e[a].percent=e[a].time/this.maxTime,n>0&&a!==i-1&&tn(e[a].value,r.value,n);if(t&&this.needsAnimate()&&t.needsAnimate()&&n===t.arrDim&&this.isValueColor===t.isValueColor&&!t._finished){this._additiveTrack=t;var o=e[0].value;for(a=0;a<i;a++)0===n?this.isValueColor?e[a].additiveValue=Je([],e[a].value,o,-1):e[a].additiveValue=e[a].value-o:1===n?e[a].additiveValue=Je([],e[a].value,o,-1):2===n&&(e[a].additiveValue=Qe([],e[a].value,o,-1))}},t.prototype.step=function(t,e){if(!this._finished){this._additiveTrack&&this._additiveTrack._finished&&(this._additiveTrack=null);var n,i=null!=this._additiveTrack,r=i?"additiveValue":"value",a=this.keyframes,o=this.keyframes.length,s=this.propName,l=this.arrDim,u=this.isValueColor;if(e<0)n=0;else if(e<this._lastFramePercent){for(n=Math.min(this._lastFrame+1,o-1);n>=0&&!(a[n].percent<=e);n--);n=Math.min(n,o-2)}else{for(n=this._lastFrame;n<o&&!(a[n].percent>e);n++);n=Math.min(n-1,o-2)}var h=a[n+1],c=a[n];if(c&&h){this._lastFrame=n,this._lastFramePercent=e;var p=h.percent-c.percent;if(0!==p){var f=(e-c.percent)/p,d=i?this._additiveValue:u?un:t[s];if((l>0||u)&&!d&&(d=this._additiveValue=[]),this.useSpline){var g=a[n][r],y=a[0===n?n:n-1][r],v=a[n>o-2?o-1:n+1][r],m=a[n>o-3?o-1:n+2][r];if(l>0)1===l?rn(d,y,g,v,m,f,f*f,f*f*f):function(t,e,n,i,r,a,o,s){for(var l=e.length,u=e[0].length,h=0;h<l;h++){t[h]||(t[1]=[]);for(var c=0;c<u;c++)t[h][c]=nn(e[h][c],n[h][c],i[h][c],r[h][c],a,o,s)}}(d,y,g,v,m,f,f*f,f*f*f);else if(u)rn(d,y,g,v,m,f,f*f,f*f*f),i||(t[s]=on(d));else{var _=void 0;_=this.interpolable?nn(y,g,v,m,f,f*f,f*f*f):v,i?this._additiveValue=_:t[s]=_}}else if(l>0)1===l?$e(d,c[r],h[r],f):function(t,e,n,i){for(var r=e.length,a=r&&e[0].length,o=0;o<r;o++){t[o]||(t[o]=[]);for(var s=0;s<a;s++)t[o][s]=Ke(e[o][s],n[o][s],i)}}(d,c[r],h[r],f);else if(u)$e(d,c[r],h[r],f),i||(t[s]=on(d));else{_=void 0;_=this.interpolable?Ke(c[r],h[r],f):function(t,e,n){return n>.5?e:t}(c[r],h[r],f),i?this._additiveValue=_:t[s]=_}i&&this._addToTarget(t)}}}},t.prototype._addToTarget=function(t){var e=this.arrDim,n=this.propName,i=this._additiveValue;0===e?this.isValueColor?(Fe(t[n],un),Je(un,un,i,1),t[n]=on(un)):t[n]=t[n]+i:1===e?Je(t[n],t[n],i,1):2===e&&Qe(t[n],t[n],i,1)},t}(),cn=function(){function t(t,e,n){this._tracks={},this._trackKeys=[],this._delay=0,this._maxTime=0,this._paused=!1,this._started=0,this._clip=null,this._target=t,this._loop=e,e&&n?b("Can' use additive animation on looped animation."):this._additiveAnimators=n}return t.prototype.getTarget=function(){return this._target},t.prototype.changeTarget=function(t){this._target=t},t.prototype.when=function(t,e){return this.whenWithKeys(t,e,N(e))},t.prototype.whenWithKeys=function(t,e,n){for(var i=this._tracks,r=0;r<n.length;r++){var a=n[r],o=i[a];if(!o){o=i[a]=new hn(a);var s=void 0,l=this._getAdditiveTrack(a);if(l){var u=l.keyframes[l.keyframes.length-1];s=u&&u.value,l.isValueColor&&s&&(s=on(s))}else s=this._target[a];if(null==s)continue;0!==t&&o.addKeyframe(0,an(s)),this._trackKeys.push(a)}o.addKeyframe(t,an(e[a]))}return this._maxTime=Math.max(this._maxTime,t),this},t.prototype.pause=function(){this._clip.pause(),this._paused=!0},t.prototype.resume=function(){this._clip.resume(),this._paused=!1},t.prototype.isPaused=function(){return!!this._paused},t.prototype._doneCallback=function(){this._setTracksFinished(),this._clip=null;var t=this._doneList;if(t)for(var e=t.length,n=0;n<e;n++)t[n].call(this)},t.prototype._abortedCallback=function(){this._setTracksFinished();var t=this.animation,e=this._abortedList;if(t&&t.removeClip(this._clip),this._clip=null,e)for(var n=0;n<e.length;n++)e[n].call(this)},t.prototype._setTracksFinished=function(){for(var t=this._tracks,e=this._trackKeys,n=0;n<e.length;n++)t[e[n]].setFinished()},t.prototype._getAdditiveTrack=function(t){var e,n=this._additiveAnimators;if(n)for(var i=0;i<n.length;i++){var r=n[i].getTrack(t);r&&(e=r)}return e},t.prototype.start=function(t,e){if(!(this._started>0)){this._started=1;for(var n=this,i=[],r=0;r<this._trackKeys.length;r++){var a=this._trackKeys[r],o=this._tracks[a],s=this._getAdditiveTrack(a),l=o.keyframes;if(o.prepare(s),o.needsAnimate())i.push(o);else if(!o.interpolable){var u=l[l.length-1];u&&(n._target[o.propName]=u.value)}}if(i.length||e){var h=new Se({life:this._maxTime,loop:this._loop,delay:this._delay,onframe:function(t){n._started=2;var e=n._additiveAnimators;if(e){for(var r=!1,a=0;a<e.length;a++)if(e[a]._clip){r=!0;break}r||(n._additiveAnimators=null)}for(a=0;a<i.length;a++)i[a].step(n._target,t);var o=n._onframeList;if(o)for(a=0;a<o.length;a++)o[a](n._target,t)},ondestroy:function(){n._doneCallback()}});this._clip=h,this.animation&&this.animation.addClip(h),t&&"spline"!==t&&(h.easing=t)}else this._doneCallback();return this}},t.prototype.stop=function(t){if(this._clip){var e=this._clip;t&&e.onframe(1),this._abortedCallback()}},t.prototype.delay=function(t){return this._delay=t,this},t.prototype.during=function(t){return t&&(this._onframeList||(this._onframeList=[]),this._onframeList.push(t)),this},t.prototype.done=function(t){return t&&(this._doneList||(this._doneList=[]),this._doneList.push(t)),this},t.prototype.aborted=function(t){return t&&(this._abortedList||(this._abortedList=[]),this._abortedList.push(t)),this},t.prototype.getClip=function(){return this._clip},t.prototype.getTrack=function(t){return this._tracks[t]},t.prototype.stopTracks=function(t,e){if(!t.length||!this._clip)return!0;for(var n=this._tracks,i=this._trackKeys,r=0;r<t.length;r++){var a=n[t[r]];a&&(e?a.step(this._target,1):1===this._started&&a.step(this._target,0),a.setFinished())}var o=!0;for(r=0;r<i.length;r++)if(!n[i[r]].isFinished()){o=!1;break}return o&&this._abortedCallback(),o},t.prototype.saveFinalToTarget=function(t,e){if(t){e=e||this._trackKeys;for(var n=0;n<e.length;n++){var i=e[n],r=this._tracks[i];if(r&&!r.isFinished()){var a=r.keyframes,o=a[a.length-1];if(o){var s=an(o.value);r.isValueColor&&(s=on(s)),t[i]=s}}}}},t.prototype.__changeFinalValue=function(t,e){e=e||N(t);for(var n=0;n<e.length;n++){var i=e[n],r=this._tracks[i];if(r){var a=r.keyframes;if(a.length>1){var o=a.pop();r.addKeyframe(o.time,t[i]),r.prepare(r.getAdditiveTrack())}}}},t}(),pn=function(){function t(t,e){this.x=t||0,this.y=e||0}return t.prototype.copy=function(t){return this.x=t.x,this.y=t.y,this},t.prototype.clone=function(){return new t(this.x,this.y)},t.prototype.set=function(t,e){return this.x=t,this.y=e,this},t.prototype.equal=function(t){return t.x===this.x&&t.y===this.y},t.prototype.add=function(t){return this.x+=t.x,this.y+=t.y,this},t.prototype.scale=function(t){this.x*=t,this.y*=t},t.prototype.scaleAndAdd=function(t,e){this.x+=t.x*e,this.y+=t.y*e},t.prototype.sub=function(t){return this.x-=t.x,this.y-=t.y,this},t.prototype.dot=function(t){return this.x*t.x+this.y*t.y},t.prototype.len=function(){return Math.sqrt(this.x*this.x+this.y*this.y)},t.prototype.lenSquare=function(){return this.x*this.x+this.y*this.y},t.prototype.normalize=function(){var t=this.len();return this.x/=t,this.y/=t,this},t.prototype.distance=function(t){var e=this.x-t.x,n=this.y-t.y;return Math.sqrt(e*e+n*n)},t.prototype.distanceSquare=function(t){var e=this.x-t.x,n=this.y-t.y;return e*e+n*n},t.prototype.negate=function(){return this.x=-this.x,this.y=-this.y,this},t.prototype.transform=function(t){if(t){var e=this.x,n=this.y;return this.x=t[0]*e+t[2]*n+t[4],this.y=t[1]*e+t[3]*n+t[5],this}},t.prototype.toArray=function(t){return t[0]=this.x,t[1]=this.y,t},t.prototype.fromArray=function(t){this.x=t[0],this.y=t[1]},t.set=function(t,e,n){t.x=e,t.y=n},t.copy=function(t,e){t.x=e.x,t.y=e.y},t.len=function(t){return Math.sqrt(t.x*t.x+t.y*t.y)},t.lenSquare=function(t){return t.x*t.x+t.y*t.y},t.dot=function(t,e){return t.x*e.x+t.y*e.y},t.add=function(t,e,n){t.x=e.x+n.x,t.y=e.y+n.y},t.sub=function(t,e,n){t.x=e.x-n.x,t.y=e.y-n.y},t.scale=function(t,e,n){t.x=e.x*n,t.y=e.y*n},t.scaleAndAdd=function(t,e,n,i){t.x=e.x+n.x*i,t.y=e.y+n.y*i},t.lerp=function(t,e,n,i){var r=1-i;t.x=r*e.x+i*n.x,t.y=r*e.y+i*n.y},t}(),fn=Math.min,dn=Math.max,gn=new pn,yn=new pn,vn=new pn,mn=new pn,_n=new pn,xn=new pn,bn=function(){function t(t,e,n,i){n<0&&isFinite(n)&&(t+=n,n=-n),i<0&&isFinite(i)&&(e+=i,i=-i),this.x=t,this.y=e,this.width=n,this.height=i}return t.prototype.union=function(t){var e=fn(t.x,this.x),n=fn(t.y,this.y);isFinite(this.x)&&isFinite(this.width)?this.width=dn(t.x+t.width,this.x+this.width)-e:this.width=t.width,isFinite(this.y)&&isFinite(this.height)?this.height=dn(t.y+t.height,this.y+this.height)-n:this.height=t.height,this.x=e,this.y=n},t.prototype.applyTransform=function(e){t.applyTransform(this,this,e)},t.prototype.calculateTransform=function(t){var e=this,n=t.width/e.width,i=t.height/e.height,r=[1,0,0,1,0,0];return ue(r,r,[-e.x,-e.y]),ce(r,r,[n,i]),ue(r,r,[t.x,t.y]),r},t.prototype.intersect=function(e,n){if(!e)return!1;e instanceof t||(e=t.create(e));var i=this,r=i.x,a=i.x+i.width,o=i.y,s=i.y+i.height,l=e.x,u=e.x+e.width,h=e.y,c=e.y+e.height,p=!(a<l||u<r||s<h||c<o);if(n){var f=1/0,d=0,g=Math.abs(a-l),y=Math.abs(u-r),v=Math.abs(s-h),m=Math.abs(c-o),_=Math.min(g,y),x=Math.min(v,m);a<l||u<r?_>d&&(d=_,g<y?pn.set(xn,-g,0):pn.set(xn,y,0)):_<f&&(f=_,g<y?pn.set(_n,g,0):pn.set(_n,-y,0)),s<h||c<o?x>d&&(d=x,v<m?pn.set(xn,0,-v):pn.set(xn,0,m)):_<f&&(f=_,v<m?pn.set(_n,0,v):pn.set(_n,0,-m))}return n&&pn.copy(n,p?_n:xn),p},t.prototype.contain=function(t,e){var n=this;return t>=n.x&&t<=n.x+n.width&&e>=n.y&&e<=n.y+n.height},t.prototype.clone=function(){return new t(this.x,this.y,this.width,this.height)},t.prototype.copy=function(e){t.copy(this,e)},t.prototype.plain=function(){return{x:this.x,y:this.y,width:this.width,height:this.height}},t.prototype.isFinite=function(){return isFinite(this.x)&&isFinite(this.y)&&isFinite(this.width)&&isFinite(this.height)},t.prototype.isZero=function(){return 0===this.width||0===this.height},t.create=function(e){return new t(e.x,e.y,e.width,e.height)},t.copy=function(t,e){t.x=e.x,t.y=e.y,t.width=e.width,t.height=e.height},t.applyTransform=function(e,n,i){if(i){if(i[1]<1e-5&&i[1]>-1e-5&&i[2]<1e-5&&i[2]>-1e-5){var r=i[0],a=i[3],o=i[4],s=i[5];return e.x=n.x*r+o,e.y=n.y*a+s,e.width=n.width*r,e.height=n.height*a,e.width<0&&(e.x+=e.width,e.width=-e.width),void(e.height<0&&(e.y+=e.height,e.height=-e.height))}gn.x=vn.x=n.x,gn.y=mn.y=n.y,yn.x=mn.x=n.x+n.width,yn.y=vn.y=n.y+n.height,gn.transform(i),mn.transform(i),yn.transform(i),vn.transform(i),e.x=fn(gn.x,yn.x,vn.x,mn.x),e.y=fn(gn.y,yn.y,vn.y,mn.y);var l=dn(gn.x,yn.x,vn.x,mn.x),u=dn(gn.y,yn.y,vn.y,mn.y);e.width=l-e.x,e.height=u-e.y}else e!==n&&t.copy(e,n)},t}(),wn={},Sn="12px sans-serif";var Mn={measureText:function(t,e){return sn||(sn=C().getContext("2d")),ln!==e&&(ln=sn.font=e||Sn),sn.measureText(t)}};function Tn(t,e){var n=wn[e=e||Sn];n||(n=wn[e]=new Ce(500));var i=n.get(t);return null==i&&(i=Mn.measureText(t,e).width,n.put(t,i)),i}function Cn(t,e,n,i){var r=Tn(t,e),a=kn(e),o=Dn(0,r,n),s=In(0,a,i);return new bn(o,s,r,a)}function An(t,e,n,i){var r=((t||"")+"").split("\n");if(1===r.length)return Cn(r[0],e,n,i);for(var a=new bn(0,0,0,0),o=0;o<r.length;o++){var s=Cn(r[o],e,n,i);0===o?a.copy(s):a.union(s)}return a}function Dn(t,e,n){return"right"===n?t-=e:"center"===n&&(t-=e/2),t}function In(t,e,n){return"middle"===n?t-=e/2:"bottom"===n&&(t-=e),t}function kn(t){return Tn("国",t)}function Ln(t,e){return"string"==typeof t?t.lastIndexOf("%")>=0?parseFloat(t)/100*e:parseFloat(t):t}function Pn(t,e,n){var i=e.position||"inside",r=null!=e.distance?e.distance:5,a=n.height,o=n.width,s=a/2,l=n.x,u=n.y,h="left",c="top";if(i instanceof Array)l+=Ln(i[0],n.width),u+=Ln(i[1],n.height),h=null,c=null;else switch(i){case"left":l-=r,u+=s,h="right",c="middle";break;case"right":l+=r+o,u+=s,c="middle";break;case"top":l+=o/2,u-=r,h="center",c="bottom";break;case"bottom":l+=o/2,u+=a+r,h="center";break;case"inside":l+=o/2,u+=s,h="center",c="middle";break;case"insideLeft":l+=r,u+=s,c="middle";break;case"insideRight":l+=o-r,u+=s,h="right",c="middle";break;case"insideTop":l+=o/2,u+=r,h="center";break;case"insideBottom":l+=o/2,u+=a-r,h="center",c="bottom";break;case"insideTopLeft":l+=r,u+=r;break;case"insideTopRight":l+=o-r,u+=r,h="right";break;case"insideBottomLeft":l+=r,u+=a-r,c="bottom";break;case"insideBottomRight":l+=o-r,u+=a-r,h="right",c="bottom"}return(t=t||{}).x=l,t.y=u,t.align=h,t.verticalAlign=c,t}var On=1;"undefined"!=typeof window&&(On=Math.max(window.devicePixelRatio||window.screen&&window.screen.deviceXDPI/window.screen.logicalXDPI||1,1));var Rn=On,Nn="#333",En="#ccc",Bn="__zr_normal__",zn=["x","y","scaleX","scaleY","originX","originY","rotation","ignore"],Fn={x:!0,y:!0,scaleX:!0,scaleY:!0,originX:!0,originY:!0,rotation:!0,ignore:!1},Vn={},Hn=new bn(0,0,0,0),Gn=function(){function t(t){this.id=x(),this.animators=[],this.currentStates=[],this.states={},this._init(t)}return t.prototype._init=function(t){this.attr(t)},t.prototype.drift=function(t,e,n){switch(this.draggable){case"horizontal":e=0;break;case"vertical":t=0}var i=this.transform;i||(i=this.transform=[1,0,0,1,0,0]),i[4]+=t,i[5]+=e,this.decomposeTransform(),this.markRedraw()},t.prototype.beforeUpdate=function(){},t.prototype.afterUpdate=function(){},t.prototype.update=function(){this.updateTransform(),this.__dirty&&this.updateInnerText()},t.prototype.updateInnerText=function(t){var e=this._textContent;if(e&&(!e.ignore||t)){this.textConfig||(this.textConfig={});var n=this.textConfig,i=n.local,r=e.attachedTransform,a=void 0,o=void 0,s=!1;r.parent=i?this:null;var l=!1;if(r.x=e.x,r.y=e.y,r.originX=e.originX,r.originY=e.originY,r.rotation=e.rotation,r.scaleX=e.scaleX,r.scaleY=e.scaleY,null!=n.position){var u=Hn;n.layoutRect?u.copy(n.layoutRect):u.copy(this.getBoundingRect()),i||u.applyTransform(this.transform),this.calculateTextPosition?this.calculateTextPosition(Vn,n,u):Pn(Vn,n,u),r.x=Vn.x,r.y=Vn.y,a=Vn.align,o=Vn.verticalAlign;var h=n.origin;if(h&&null!=n.rotation){var c=void 0,p=void 0;"center"===h?(c=.5*u.width,p=.5*u.height):(c=Ln(h[0],u.width),p=Ln(h[1],u.height)),l=!0,r.originX=-r.x+c+(i?0:u.x),r.originY=-r.y+p+(i?0:u.y)}}null!=n.rotation&&(r.rotation=n.rotation);var f=n.offset;f&&(r.x+=f[0],r.y+=f[1],l||(r.originX=-f[0],r.originY=-f[1]));var d=null==n.inside?"string"==typeof n.position&&n.position.indexOf("inside")>=0:n.inside,g=this._innerTextDefaultStyle||(this._innerTextDefaultStyle={}),y=void 0,v=void 0,m=void 0;d&&this.canBeInsideText()?(y=n.insideFill,v=n.insideStroke,null!=y&&"auto"!==y||(y=this.getInsideTextFill()),null!=v&&"auto"!==v||(v=this.getInsideTextStroke(y),m=!0)):(y=n.outsideFill,v=n.outsideStroke,null!=y&&"auto"!==y||(y=this.getOutsideFill()),null!=v&&"auto"!==v||(v=this.getOutsideStroke(y),m=!0)),(y=y||"#000")===g.fill&&v===g.stroke&&m===g.autoStroke&&a===g.align&&o===g.verticalAlign||(s=!0,g.fill=y,g.stroke=v,g.autoStroke=m,g.align=a,g.verticalAlign=o,e.setDefaultTextStyle(g)),s&&e.dirtyStyle(),e.markRedraw()}},t.prototype.canBeInsideText=function(){return!0},t.prototype.getInsideTextFill=function(){return"#fff"},t.prototype.getInsideTextStroke=function(t){return"#000"},t.prototype.getOutsideFill=function(){return this.__zr&&this.__zr.isDarkMode()?En:Nn},t.prototype.getOutsideStroke=function(t){var e=this.__zr&&this.__zr.getBackgroundColor(),n="string"==typeof e&&Fe(e);n||(n=[255,255,255,1]);for(var i=n[3],r=this.__zr.isDarkMode(),a=0;a<3;a++)n[a]=n[a]*i+(r?0:255)*(1-i);return n[3]=1,Xe(n,"rgba")},t.prototype.traverse=function(t,e){},t.prototype.attrKV=function(t,e){"textConfig"===t?this.setTextConfig(e):"textContent"===t?this.setTextContent(e):"clipPath"===t?this.setClipPath(e):"extra"===t?(this.extra=this.extra||{},M(this.extra,e)):this[t]=e},t.prototype.hide=function(){this.ignore=!0,this.markRedraw()},t.prototype.show=function(){this.ignore=!1,this.markRedraw()},t.prototype.attr=function(t,e){if("string"==typeof t)this.attrKV(t,e);else if(W(t))for(var n=N(t),i=0;i<n.length;i++){var r=n[i];this.attrKV(r,t[r])}return this.markRedraw(),this},t.prototype.saveCurrentToNormalState=function(t){this._innerSaveToNormal(t);for(var e=this._normalState,n=0;n<this.animators.length;n++){var i=this.animators[n],r=i.__fromStateTransition;if(!r||r===Bn){var a=i.targetName,o=a?e[a]:e;i.saveFinalToTarget(o)}}},t.prototype._innerSaveToNormal=function(t){var e=this._normalState;e||(e=this._normalState={}),t.textConfig&&!e.textConfig&&(e.textConfig=this.textConfig),this._savePrimaryToNormal(t,e,zn)},t.prototype._savePrimaryToNormal=function(t,e,n){for(var i=0;i<n.length;i++){var r=n[i];null==t[r]||r in e||(e[r]=this[r])}},t.prototype.hasState=function(){return this.currentStates.length>0},t.prototype.getState=function(t){return this.states[t]},t.prototype.ensureState=function(t){var e=this.states;return e[t]||(e[t]={}),e[t]},t.prototype.clearStates=function(t){this.useState(Bn,!1,t)},t.prototype.useState=function(e,n,i){var r=e===Bn;if(this.hasState()||!r){var a=this.currentStates,o=this.stateTransition;if(!(A(a,e)>=0)||!n&&1!==a.length){var s;if(this.stateProxy&&!r&&(s=this.stateProxy(e)),s||(s=this.states&&this.states[e]),s||r){r||this.saveCurrentToNormalState(s);var l=!(!s||!s.hoverLayer);return l&&this._toggleHoverLayerFlag(!0),this._applyStateObj(e,s,this._normalState,n,!i&&!this.__inHover&&o&&o.duration>0,o),this._textContent&&this._textContent.useState(e,n),this._textGuide&&this._textGuide.useState(e,n),r?(this.currentStates=[],this._normalState={}):n?this.currentStates.push(e):this.currentStates=[e],this._updateAnimationTargets(),this.markRedraw(),!l&&this.__inHover&&(this._toggleHoverLayerFlag(!1),this.__dirty&=~t.REDARAW_BIT),s}b("State "+e+" not exists.")}}},t.prototype.useStates=function(e,n){if(e.length){var i=[],r=this.currentStates,a=e.length,o=a===r.length;if(o)for(var s=0;s<a;s++)if(e[s]!==r[s]){o=!1;break}if(o)return;for(s=0;s<a;s++){var l=e[s],u=void 0;this.stateProxy&&(u=this.stateProxy(l,e)),u||(u=this.states[l]),u&&i.push(u)}var h=!(!i[a-1]||!i[a-1].hoverLayer);h&&this._toggleHoverLayerFlag(!0);var c=this._mergeStates(i),p=this.stateTransition;this.saveCurrentToNormalState(c),this._applyStateObj(e.join(","),c,this._normalState,!1,!n&&!this.__inHover&&p&&p.duration>0,p),this._textContent&&this._textContent.useStates(e),this._textGuide&&this._textGuide.useStates(e),this._updateAnimationTargets(),this.currentStates=e.slice(),this.markRedraw(),!h&&this.__inHover&&(this._toggleHoverLayerFlag(!1),this.__dirty&=~t.REDARAW_BIT)}else this.clearStates()},t.prototype._updateAnimationTargets=function(){for(var t=0;t<this.animators.length;t++){var e=this.animators[t];e.targetName&&e.changeTarget(this[e.targetName])}},t.prototype.removeState=function(t){var e=A(this.currentStates,t);if(e>=0){var n=this.currentStates.slice();n.splice(e,1),this.useStates(n)}},t.prototype.replaceState=function(t,e,n){var i=this.currentStates.slice(),r=A(i,t),a=A(i,e)>=0;r>=0?a?i.splice(r,1):i[r]=e:n&&!a&&i.push(e),this.useStates(i)},t.prototype.toggleState=function(t,e){e?this.useState(t,!0):this.removeState(t)},t.prototype._mergeStates=function(t){for(var e,n={},i=0;i<t.length;i++){var r=t[i];M(n,r),r.textConfig&&M(e=e||{},r.textConfig)}return e&&(n.textConfig=e),n},t.prototype._applyStateObj=function(t,e,n,i,r,a){var o=!(e&&i);e&&e.textConfig?(this.textConfig=M({},i?this.textConfig:n.textConfig),M(this.textConfig,e.textConfig)):o&&n.textConfig&&(this.textConfig=n.textConfig);for(var s={},l=!1,u=0;u<zn.length;u++){var h=zn[u],c=r&&Fn[h];e&&null!=e[h]?c?(l=!0,s[h]=e[h]):this[h]=e[h]:o&&null!=n[h]&&(c?(l=!0,s[h]=n[h]):this[h]=n[h])}if(!r)for(u=0;u<this.animators.length;u++){var p=this.animators[u],f=p.targetName;p.__changeFinalValue(f?(e||n)[f]:e||n)}l&&this._transitionState(t,s,a)},t.prototype._attachComponent=function(t){if(t.__zr&&!t.__hostTarget)throw new Error("Text element has been added to zrender.");if(t===this)throw new Error("Recursive component attachment.");var e=this.__zr;e&&t.addSelfToZr(e),t.__zr=e,t.__hostTarget=this},t.prototype._detachComponent=function(t){t.__zr&&t.removeSelfFromZr(t.__zr),t.__zr=null,t.__hostTarget=null},t.prototype.getClipPath=function(){return this._clipPath},t.prototype.setClipPath=function(t){this._clipPath&&this._clipPath!==t&&this.removeClipPath(),this._attachComponent(t),this._clipPath=t,this.markRedraw()},t.prototype.removeClipPath=function(){var t=this._clipPath;t&&(this._detachComponent(t),this._clipPath=null,this.markRedraw())},t.prototype.getTextContent=function(){return this._textContent},t.prototype.setTextContent=function(t){var e=this._textContent;if(e!==t){if(e&&e!==t&&this.removeTextContent(),t.__zr&&!t.__hostTarget)throw new Error("Text element has been added to zrender.");t.attachedTransform=new be,this._attachComponent(t),this._textContent=t,this.markRedraw()}},t.prototype.setTextConfig=function(t){this.textConfig||(this.textConfig={}),M(this.textConfig,t),this.markRedraw()},t.prototype.removeTextConfig=function(){this.textConfig=null,this.markRedraw()},t.prototype.removeTextContent=function(){var t=this._textContent;t&&(t.attachedTransform=null,this._detachComponent(t),this._textContent=null,this._innerTextDefaultStyle=null,this.markRedraw())},t.prototype.getTextGuideLine=function(){return this._textGuide},t.prototype.setTextGuideLine=function(t){this._textGuide&&this._textGuide!==t&&this.removeTextGuideLine(),this._attachComponent(t),this._textGuide=t,this.markRedraw()},t.prototype.removeTextGuideLine=function(){var t=this._textGuide;t&&(this._detachComponent(t),this._textGuide=null,this.markRedraw())},t.prototype.markRedraw=function(){this.__dirty|=t.REDARAW_BIT;var e=this.__zr;e&&(this.__inHover?e.refreshHover():e.refresh()),this.__hostTarget&&this.__hostTarget.markRedraw()},t.prototype.dirty=function(){this.markRedraw()},t.prototype._toggleHoverLayerFlag=function(t){this.__inHover=t;var e=this._textContent,n=this._textGuide;e&&(e.__inHover=t),n&&(n.__inHover=t)},t.prototype.addSelfToZr=function(t){this.__zr=t;var e=this.animators;if(e)for(var n=0;n<e.length;n++)t.animation.addAnimator(e[n]);this._clipPath&&this._clipPath.addSelfToZr(t),this._textContent&&this._textContent.addSelfToZr(t),this._textGuide&&this._textGuide.addSelfToZr(t)},t.prototype.removeSelfFromZr=function(t){this.__zr=null;var e=this.animators;if(e)for(var n=0;n<e.length;n++)t.animation.removeAnimator(e[n]);this._clipPath&&this._clipPath.removeSelfFromZr(t),this._textContent&&this._textContent.removeSelfFromZr(t),this._textGuide&&this._textGuide.removeSelfFromZr(t)},t.prototype.animate=function(t,e){var n=t?this[t]:this;if(n){var i=new cn(n,e);return this.addAnimator(i,t),i}b('Property "'+t+'" is not existed in element '+this.id)},t.prototype.addAnimator=function(t,e){var n=this.__zr,i=this;t.during((function(){i.updateDuringAnimation(e)})).done((function(){var e=i.animators,n=A(e,t);n>=0&&e.splice(n,1)})),this.animators.push(t),n&&n.animation.addAnimator(t),n&&n.wakeUp()},t.prototype.updateDuringAnimation=function(t){this.markRedraw()},t.prototype.stopAnimation=function(t,e){for(var n=this.animators,i=n.length,r=[],a=0;a<i;a++){var o=n[a];t&&t!==o.scope?r.push(o):o.stop(e)}return this.animators=r,this},t.prototype.animateTo=function(t,e,n){Wn(this,t,e,n)},t.prototype.animateFrom=function(t,e,n){Wn(this,t,e,n,!0)},t.prototype._transitionState=function(t,e,n,i){for(var r=Wn(this,e,n,i),a=0;a<r.length;a++)r[a].__fromStateTransition=t},t.prototype.getBoundingRect=function(){return null},t.prototype.getPaintRect=function(){return null},t.REDARAW_BIT=1,t.initDefaultProps=function(){var e=t.prototype;e.type="element",e.name="",e.ignore=!1,e.silent=!1,e.isGroup=!1,e.draggable=!1,e.dragging=!1,e.ignoreClip=!1,e.__inHover=!1,e.__dirty=t.REDARAW_BIT;var n={};function i(t,e,i){n[t+e+i]||(console.warn("DEPRECATED: '"+t+"' has been deprecated. use '"+e+"', '"+i+"' instead"),n[t+e+i]=!0)}function r(t,n,r,a){function o(t,e){Object.defineProperty(e,0,{get:function(){return t[r]},set:function(e){t[r]=e}}),Object.defineProperty(e,1,{get:function(){return t[a]},set:function(e){t[a]=e}})}Object.defineProperty(e,t,{get:function(){(i(t,r,a),this[n])||o(this,this[n]=[]);return this[n]},set:function(e){i(t,r,a),this[r]=e[0],this[a]=e[1],this[n]=e,o(this,e)}})}Object.defineProperty&&(!o.browser.ie||o.browser.version>8)&&(r("position","_legacyPos","x","y"),r("scale","_legacyScale","scaleX","scaleY"),r("origin","_legacyOrigin","originX","originY"))}(),t}();function Wn(t,e,n,i,r){var a=[];Xn(t,"",t,e,n=n||{},i,a,r);var o=a.length,s=!1,l=n.done,u=n.aborted,h=function(){s=!0,--o<=0&&(s?l&&l():u&&u())},c=function(){--o<=0&&(s?l&&l():u&&u())};o||l&&l(),a.length>0&&n.during&&a[0].during((function(t,e){n.during(e)}));for(var p=0;p<a.length;p++){var f=a[p];h&&f.done(h),c&&f.aborted(c),f.start(n.easing,n.force)}return a}function Un(t,e,n){for(var i=0;i<n;i++)t[i]=e[i]}function Yn(t,e,n){if(k(e[n]))if(k(t[n])||(t[n]=[]),Y(e[n])){var i=e[n].length;t[n].length!==i&&(t[n]=new e[n].constructor(i),Un(t[n],e[n],i))}else{var r=e[n],a=t[n],o=r.length;if(k(r[0]))for(var s=r[0].length,l=0;l<o;l++)a[l]?Un(a[l],r[l],s):a[l]=Array.prototype.slice.call(r[l]);else Un(a,r,o);a.length=r.length}else t[n]=e[n]}function Xn(t,e,n,i,r,a,o,s){for(var l=[],u=[],h=N(i),c=r.duration,p=r.delay,f=r.additive,d=r.setToFinal,g=!W(a),y=0;y<h.length;y++){if(null!=n[T=h[y]]&&null!=i[T]&&(g||a[T]))if(W(i[T])&&!k(i[T])){if(e){s||(n[T]=i[T],t.updateDuringAnimation(e));continue}Xn(t,T,n[T],i[T],r,a&&a[T],o,s)}else l.push(T),u.push(T);else s||(n[T]=i[T],t.updateDuringAnimation(e),u.push(T))}var v=l.length;if(v>0||r.force&&!o.length){for(var m=t.animators,_=[],x=0;x<m.length;x++)m[x].targetName===e&&_.push(m[x]);if(!f&&_.length)for(x=0;x<_.length;x++){if(_[x].stopTracks(u)){var b=A(m,_[x]);m.splice(b,1)}}var w=void 0,S=void 0,M=void 0;if(s){S={},d&&(w={});for(x=0;x<v;x++){S[T=l[x]]=n[T],d?w[T]=i[T]:n[T]=i[T]}}else if(d){M={};for(x=0;x<v;x++){var T;M[T=l[x]]=an(n[T]),Yn(n,i,T)}}var C=new cn(n,!1,f?_:null);C.targetName=e,r.scope&&(C.scope=r.scope),d&&w&&C.whenWithKeys(0,w,l),M&&C.whenWithKeys(0,M,l),C.whenWithKeys(null==c?500:c,s?S:i,l).delay(p||0),t.addAnimator(C,e),o.push(C)}}I(Gn,Rt),I(Gn,be);function qn(t,e,n,i){var r=e+1;if(r===n)return 1;if(i(t[r++],t[e])<0){for(;r<n&&i(t[r],t[r-1])<0;)r++;!function(t,e,n){n--;for(;e<n;){var i=t[e];t[e++]=t[n],t[n--]=i}}(t,e,r)}else for(;r<n&&i(t[r],t[r-1])>=0;)r++;return r-e}function jn(t,e,n,i,r){for(i===e&&i++;i<n;i++){for(var a,o=t[i],s=e,l=i;s<l;)r(o,t[a=s+l>>>1])<0?l=a:s=a+1;var u=i-s;switch(u){case 3:t[s+3]=t[s+2];case 2:t[s+2]=t[s+1];case 1:t[s+1]=t[s];break;default:for(;u>0;)t[s+u]=t[s+u-1],u--}t[s]=o}}function Zn(t,e,n,i,r,a){var o=0,s=0,l=1;if(a(t,e[n+r])>0){for(s=i-r;l<s&&a(t,e[n+r+l])>0;)o=l,(l=1+(l<<1))<=0&&(l=s);l>s&&(l=s),o+=r,l+=r}else{for(s=r+1;l<s&&a(t,e[n+r-l])<=0;)o=l,(l=1+(l<<1))<=0&&(l=s);l>s&&(l=s);var u=o;o=r-l,l=r-u}for(o++;o<l;){var h=o+(l-o>>>1);a(t,e[n+h])>0?o=h+1:l=h}return l}function Kn(t,e,n,i,r,a){var o=0,s=0,l=1;if(a(t,e[n+r])<0){for(s=r+1;l<s&&a(t,e[n+r-l])<0;)o=l,(l=1+(l<<1))<=0&&(l=s);l>s&&(l=s);var u=o;o=r-l,l=r-u}else{for(s=i-r;l<s&&a(t,e[n+r+l])>=0;)o=l,(l=1+(l<<1))<=0&&(l=s);l>s&&(l=s),o+=r,l+=r}for(o++;o<l;){var h=o+(l-o>>>1);a(t,e[n+h])<0?l=h:o=h+1}return l}function $n(t,e){var n,i,r=7,a=0;t.length;var o=[];function s(s){var l=n[s],u=i[s],h=n[s+1],c=i[s+1];i[s]=u+c,s===a-3&&(n[s+1]=n[s+2],i[s+1]=i[s+2]),a--;var p=Kn(t[h],t,l,u,0,e);l+=p,0!==(u-=p)&&0!==(c=Zn(t[l+u-1],t,h,c,c-1,e))&&(u<=c?function(n,i,a,s){var l=0;for(l=0;l<i;l++)o[l]=t[n+l];var u=0,h=a,c=n;if(t[c++]=t[h++],0==--s){for(l=0;l<i;l++)t[c+l]=o[u+l];return}if(1===i){for(l=0;l<s;l++)t[c+l]=t[h+l];return void(t[c+s]=o[u])}var p,f,d,g=r;for(;;){p=0,f=0,d=!1;do{if(e(t[h],o[u])<0){if(t[c++]=t[h++],f++,p=0,0==--s){d=!0;break}}else if(t[c++]=o[u++],p++,f=0,1==--i){d=!0;break}}while((p|f)<g);if(d)break;do{if(0!==(p=Kn(t[h],o,u,i,0,e))){for(l=0;l<p;l++)t[c+l]=o[u+l];if(c+=p,u+=p,(i-=p)<=1){d=!0;break}}if(t[c++]=t[h++],0==--s){d=!0;break}if(0!==(f=Zn(o[u],t,h,s,0,e))){for(l=0;l<f;l++)t[c+l]=t[h+l];if(c+=f,h+=f,0===(s-=f)){d=!0;break}}if(t[c++]=o[u++],1==--i){d=!0;break}g--}while(p>=7||f>=7);if(d)break;g<0&&(g=0),g+=2}if((r=g)<1&&(r=1),1===i){for(l=0;l<s;l++)t[c+l]=t[h+l];t[c+s]=o[u]}else{if(0===i)throw new Error;for(l=0;l<i;l++)t[c+l]=o[u+l]}}(l,u,h,c):function(n,i,a,s){var l=0;for(l=0;l<s;l++)o[l]=t[a+l];var u=n+i-1,h=s-1,c=a+s-1,p=0,f=0;if(t[c--]=t[u--],0==--i){for(p=c-(s-1),l=0;l<s;l++)t[p+l]=o[l];return}if(1===s){for(f=(c-=i)+1,p=(u-=i)+1,l=i-1;l>=0;l--)t[f+l]=t[p+l];return void(t[c]=o[h])}var d=r;for(;;){var g=0,y=0,v=!1;do{if(e(o[h],t[u])<0){if(t[c--]=t[u--],g++,y=0,0==--i){v=!0;break}}else if(t[c--]=o[h--],y++,g=0,1==--s){v=!0;break}}while((g|y)<d);if(v)break;do{if(0!==(g=i-Kn(o[h],t,n,i,i-1,e))){for(i-=g,f=(c-=g)+1,p=(u-=g)+1,l=g-1;l>=0;l--)t[f+l]=t[p+l];if(0===i){v=!0;break}}if(t[c--]=o[h--],1==--s){v=!0;break}if(0!==(y=s-Zn(t[u],o,0,s,s-1,e))){for(s-=y,f=(c-=y)+1,p=(h-=y)+1,l=0;l<y;l++)t[f+l]=o[p+l];if(s<=1){v=!0;break}}if(t[c--]=t[u--],0==--i){v=!0;break}d--}while(g>=7||y>=7);if(v)break;d<0&&(d=0),d+=2}(r=d)<1&&(r=1);if(1===s){for(f=(c-=i)+1,p=(u-=i)+1,l=i-1;l>=0;l--)t[f+l]=t[p+l];t[c]=o[h]}else{if(0===s)throw new Error;for(p=c-(s-1),l=0;l<s;l++)t[p+l]=o[l]}}(l,u,h,c))}return n=[],i=[],{mergeRuns:function(){for(;a>1;){var t=a-2;if(t>=1&&i[t-1]<=i[t]+i[t+1]||t>=2&&i[t-2]<=i[t]+i[t-1])i[t-1]<i[t+1]&&t--;else if(i[t]>i[t+1])break;s(t)}},forceMergeRuns:function(){for(;a>1;){var t=a-2;t>0&&i[t-1]<i[t+1]&&t--,s(t)}},pushRun:function(t,e){n[a]=t,i[a]=e,a+=1}}}function Jn(t,e,n,i){n||(n=0),i||(i=t.length);var r=i-n;if(!(r<2)){var a=0;if(r<32)jn(t,n,i,n+(a=qn(t,n,i,e)),e);else{var o=$n(t,e),s=function(t){for(var e=0;t>=32;)e|=1&t,t>>=1;return t+e}(r);do{if((a=qn(t,n,i,e))<s){var l=r;l>s&&(l=s),jn(t,n,n+l,n+a,e),a=l}o.pushRun(n,a),o.mergeRuns(),r-=a,n+=a}while(0!==r);o.forceMergeRuns()}}}var Qn=!1;function ti(){Qn||(Qn=!0,console.warn("z / z2 / zlevel of displayable is invalid, which may cause unexpected errors"))}function ei(t,e){return t.zlevel===e.zlevel?t.z===e.z?t.z2-e.z2:t.z-e.z:t.zlevel-e.zlevel}var ni,ii,ri=function(){function t(){this._roots=[],this._displayList=[],this._displayListLen=0,this.displayableSortFunc=ei}return t.prototype.traverse=function(t,e){for(var n=0;n<this._roots.length;n++)this._roots[n].traverse(t,e)},t.prototype.getDisplayList=function(t,e){e=e||!1;var n=this._displayList;return!t&&n.length||this.updateDisplayList(e),n},t.prototype.updateDisplayList=function(t){this._displayListLen=0;for(var e=this._roots,n=this._displayList,i=0,r=e.length;i<r;i++)this._updateAndAddDisplayable(e[i],null,t);n.length=this._displayListLen,o.canvasSupported&&Jn(n,ei)},t.prototype._updateAndAddDisplayable=function(t,e,n){if(!t.ignore||n){t.beforeUpdate(),t.update(),t.afterUpdate();var i=t.getClipPath();if(t.ignoreClip)e=null;else if(i){e=e?e.slice():[];for(var r=i,a=t;r;)r.parent=a,r.updateTransform(),e.push(r),a=r,r=r.getClipPath()}if(t.childrenRef){for(var o=t.childrenRef(),s=0;s<o.length;s++){var l=o[s];t.__dirty&&(l.__dirty|=Gn.REDARAW_BIT),this._updateAndAddDisplayable(l,e,n)}t.__dirty=0}else{var u=t;e&&e.length?u.__clipPaths=e:u.__clipPaths&&u.__clipPaths.length>0&&(u.__clipPaths=[]),isNaN(u.z)&&(ti(),u.z=0),isNaN(u.z2)&&(ti(),u.z2=0),isNaN(u.zlevel)&&(ti(),u.zlevel=0),this._displayList[this._displayListLen++]=u}var h=t.getDecalElement&&t.getDecalElement();h&&this._updateAndAddDisplayable(h,e,n);var c=t.getTextGuideLine();c&&this._updateAndAddDisplayable(c,e,n);var p=t.getTextContent();p&&this._updateAndAddDisplayable(p,e,n)}},t.prototype.addRoot=function(t){t.__zr&&t.__zr.storage===this||this._roots.push(t)},t.prototype.delRoot=function(t){if(t instanceof Array)for(var e=0,n=t.length;e<n;e++)this.delRoot(t[e]);else{var i=A(this._roots,t);i>=0&&this._roots.splice(i,1)}},t.prototype.delAllRoots=function(){this._roots=[],this._displayList=[],this._displayListLen=0},t.prototype.getRoots=function(){return this._roots},t.prototype.dispose=function(){this._displayList=null,this._roots=null},t}(),ai="undefined"!=typeof window&&(window.requestAnimationFrame&&window.requestAnimationFrame.bind(window)||window.msRequestAnimationFrame&&window.msRequestAnimationFrame.bind(window)||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame)||function(t){return setTimeout(t,16)},oi=function(t){function e(e){var n=t.call(this)||this;return n._running=!1,n._time=0,n._pausedTime=0,n._pauseStart=0,n._paused=!1,e=e||{},n.stage=e.stage||{},n.onframe=e.onframe||function(){},n}return n(e,t),e.prototype.addClip=function(t){t.animation&&this.removeClip(t),this._clipsHead?(this._clipsTail.next=t,t.prev=this._clipsTail,t.next=null,this._clipsTail=t):this._clipsHead=this._clipsTail=t,t.animation=this},e.prototype.addAnimator=function(t){t.animation=this;var e=t.getClip();e&&this.addClip(e)},e.prototype.removeClip=function(t){if(t.animation){var e=t.prev,n=t.next;e?e.next=n:this._clipsHead=n,n?n.prev=e:this._clipsTail=e,t.next=t.prev=t.animation=null}},e.prototype.removeAnimator=function(t){var e=t.getClip();e&&this.removeClip(e),t.animation=null},e.prototype.update=function(t){for(var e=(new Date).getTime()-this._pausedTime,n=e-this._time,i=this._clipsHead;i;){var r=i.next;i.step(e,n)?(i.ondestroy&&i.ondestroy(),this.removeClip(i),i=r):i=r}this._time=e,t||(this.onframe(n),this.trigger("frame",n),this.stage.update&&this.stage.update())},e.prototype._startLoop=function(){var t=this;this._running=!0,ai((function e(){t._running&&(ai(e),!t._paused&&t.update())}))},e.prototype.start=function(){this._running||(this._time=(new Date).getTime(),this._pausedTime=0,this._startLoop())},e.prototype.stop=function(){this._running=!1},e.prototype.pause=function(){this._paused||(this._pauseStart=(new Date).getTime(),this._paused=!0)},e.prototype.resume=function(){this._paused&&(this._pausedTime+=(new Date).getTime()-this._pauseStart,this._paused=!1)},e.prototype.clear=function(){for(var t=this._clipsHead;t;){var e=t.next;t.prev=t.next=t.animation=null,t=e}this._clipsHead=this._clipsTail=null},e.prototype.isFinished=function(){return null==this._clipsHead},e.prototype.animate=function(t,e){e=e||{},this.start();var n=new cn(t,e.loop);return this.addAnimator(n),n},e}(Rt),si=o.domSupported,li=(ii={pointerdown:1,pointerup:1,pointermove:1,pointerout:1},{mouse:ni=["click","dblclick","mousewheel","wheel","mouseout","mouseup","mousedown","mousemove","contextmenu"],touch:["touchstart","touchend","touchmove"],pointer:P(ni,(function(t){var e=t.replace("mouse","pointer");return ii.hasOwnProperty(e)?e:t}))}),ui=["mousemove","mouseup"],hi=["pointermove","pointerup"],ci=!1;function pi(t){var e=t.pointerType;return"pen"===e||"touch"===e}function fi(t){t&&(t.zrByTouch=!0)}function di(t,e){for(var n=e,i=!1;n&&9!==n.nodeType&&!(i=n.domBelongToZr||n!==e&&n===t.painterRoot);)n=n.parentNode;return i}var gi=function(t,e){this.stopPropagation=ct,this.stopImmediatePropagation=ct,this.preventDefault=ct,this.type=e.type,this.target=this.currentTarget=t.dom,this.pointerType=e.pointerType,this.clientX=e.clientX,this.clientY=e.clientY},yi={mousedown:function(t){t=Xt(this.dom,t),this.__mayPointerCapture=[t.zrX,t.zrY],this.trigger("mousedown",t)},mousemove:function(t){t=Xt(this.dom,t);var e=this.__mayPointerCapture;!e||t.zrX===e[0]&&t.zrY===e[1]||this.__togglePointerCapture(!0),this.trigger("mousemove",t)},mouseup:function(t){t=Xt(this.dom,t),this.__togglePointerCapture(!1),this.trigger("mouseup",t)},mouseout:function(t){di(this,(t=Xt(this.dom,t)).toElement||t.relatedTarget)||(this.__pointerCapturing&&(t.zrEventControl="no_globalout"),this.trigger("mouseout",t))},wheel:function(t){ci=!0,t=Xt(this.dom,t),this.trigger("mousewheel",t)},mousewheel:function(t){ci||(t=Xt(this.dom,t),this.trigger("mousewheel",t))},touchstart:function(t){fi(t=Xt(this.dom,t)),this.__lastTouchMoment=new Date,this.handler.processGesture(t,"start"),yi.mousemove.call(this,t),yi.mousedown.call(this,t)},touchmove:function(t){fi(t=Xt(this.dom,t)),this.handler.processGesture(t,"change"),yi.mousemove.call(this,t)},touchend:function(t){fi(t=Xt(this.dom,t)),this.handler.processGesture(t,"end"),yi.mouseup.call(this,t),+new Date-+this.__lastTouchMoment<300&&yi.click.call(this,t)},pointerdown:function(t){yi.mousedown.call(this,t)},pointermove:function(t){pi(t)||yi.mousemove.call(this,t)},pointerup:function(t){yi.mouseup.call(this,t)},pointerout:function(t){pi(t)||yi.mouseout.call(this,t)}};L(["click","dblclick","contextmenu"],(function(t){yi[t]=function(e){e=Xt(this.dom,e),this.trigger(t,e)}}));var vi={pointermove:function(t){pi(t)||vi.mousemove.call(this,t)},pointerup:function(t){vi.mouseup.call(this,t)},mousemove:function(t){this.trigger("mousemove",t)},mouseup:function(t){var e=this.__pointerCapturing;this.__togglePointerCapture(!1),this.trigger("mouseup",t),e&&(t.zrEventControl="only_globalout",this.trigger("mouseout",t))}};function mi(t,e){var n=e.domHandlers;o.pointerEventsSupported?L(li.pointer,(function(i){xi(e,i,(function(e){n[i].call(t,e)}))})):(o.touchEventsSupported&&L(li.touch,(function(i){xi(e,i,(function(r){n[i].call(t,r),function(t){t.touching=!0,null!=t.touchTimer&&(clearTimeout(t.touchTimer),t.touchTimer=null),t.touchTimer=setTimeout((function(){t.touching=!1,t.touchTimer=null}),700)}(e)}))})),L(li.mouse,(function(i){xi(e,i,(function(r){r=Yt(r),e.touching||n[i].call(t,r)}))})))}function _i(t,e){function n(n){xi(e,n,(function(i){i=Yt(i),di(t,i.target)||(i=function(t,e){return Xt(t.dom,new gi(t,e),!0)}(t,i),e.domHandlers[n].call(t,i))}),{capture:!0})}o.pointerEventsSupported?L(hi,n):o.touchEventsSupported||L(ui,n)}function xi(t,e,n,i){t.mounted[e]=n,t.listenerOpts[e]=i,function(t,e,n,i){Vt?t.addEventListener(e,n,i):t.attachEvent("on"+e,n)}(t.domTarget,e,n,i)}function bi(t){var e,n,i,r,a=t.mounted;for(var o in a)a.hasOwnProperty(o)&&(e=t.domTarget,n=o,i=a[o],r=t.listenerOpts[o],Vt?e.removeEventListener(n,i,r):e.detachEvent("on"+n,i));t.mounted={}}var wi=function(t,e){this.mounted={},this.listenerOpts={},this.touching=!1,this.domTarget=t,this.domHandlers=e},Si=function(t){function e(e,n){var i=t.call(this)||this;return i.__pointerCapturing=!1,i.dom=e,i.painterRoot=n,i._localHandlerScope=new wi(e,yi),si&&(i._globalHandlerScope=new wi(document,vi)),mi(i,i._localHandlerScope),i}return n(e,t),e.prototype.dispose=function(){bi(this._localHandlerScope),si&&bi(this._globalHandlerScope)},e.prototype.setCursor=function(t){this.dom.style&&(this.dom.style.cursor=t||"default")},e.prototype.__togglePointerCapture=function(t){if(this.__mayPointerCapture=null,si&&+this.__pointerCapturing^+t){this.__pointerCapturing=t;var e=this._globalHandlerScope;t?_i(this,e):bi(e)}},e}(Rt),Mi=function(t){function e(e){var n=t.call(this)||this;return n.isGroup=!0,n._children=[],n.attr(e),n}return n(e,t),e.prototype.childrenRef=function(){return this._children},e.prototype.children=function(){return this._children.slice()},e.prototype.childAt=function(t){return this._children[t]},e.prototype.childOfName=function(t){for(var e=this._children,n=0;n<e.length;n++)if(e[n].name===t)return e[n]},e.prototype.childCount=function(){return this._children.length},e.prototype.add=function(t){if(t&&(t!==this&&t.parent!==this&&(this._children.push(t),this._doAdd(t)),t.__hostTarget))throw"This elemenet has been used as an attachment";return this},e.prototype.addBefore=function(t,e){if(t&&t!==this&&t.parent!==this&&e&&e.parent===this){var n=this._children,i=n.indexOf(e);i>=0&&(n.splice(i,0,t),this._doAdd(t))}return this},e.prototype.replaceAt=function(t,e){var n=this._children,i=n[e];if(t&&t!==this&&t.parent!==this&&t!==i){n[e]=t,i.parent=null;var r=this.__zr;r&&i.removeSelfFromZr(r),this._doAdd(t)}return this},e.prototype._doAdd=function(t){t.parent&&t.parent.remove(t),t.parent=this;var e=this.__zr;e&&e!==t.__zr&&t.addSelfToZr(e),e&&e.refresh()},e.prototype.remove=function(t){var e=this.__zr,n=this._children,i=A(n,t);return i<0||(n.splice(i,1),t.parent=null,e&&t.removeSelfFromZr(e),e&&e.refresh()),this},e.prototype.removeAll=function(){for(var t=this._children,e=this.__zr,n=0;n<t.length;n++){var i=t[n];e&&i.removeSelfFromZr(e),i.parent=null}return t.length=0,this},e.prototype.eachChild=function(t,e){for(var n=this._children,i=0;i<n.length;i++){var r=n[i];t.call(e,r,i)}return this},e.prototype.traverse=function(t,e){for(var n=0;n<this._children.length;n++){var i=this._children[n],r=t.call(e,i);i.isGroup&&!r&&i.traverse(t,e)}return this},e.prototype.addSelfToZr=function(e){t.prototype.addSelfToZr.call(this,e);for(var n=0;n<this._children.length;n++){this._children[n].addSelfToZr(e)}},e.prototype.removeSelfFromZr=function(e){t.prototype.removeSelfFromZr.call(this,e);for(var n=0;n<this._children.length;n++){this._children[n].removeSelfFromZr(e)}},e.prototype.getBoundingRect=function(t){for(var e=new bn(0,0,0,0),n=t||this._children,i=[],r=null,a=0;a<n.length;a++){var o=n[a];if(!o.ignore&&!o.invisible){var s=o.getBoundingRect(),l=o.getLocalTransform(i);l?(bn.applyTransform(e,s,l),(r=r||e.clone()).union(e)):(r=r||s.clone()).union(s)}}return r||e},e}(Gn);Mi.prototype.type="group";
/*!
    * ZRender, a high performance 2d drawing library.
    *
    * Copyright (c) 2013, Baidu Inc.
    * All rights reserved.
    *
    * LICENSE
    * https://github.com/ecomfe/zrender/blob/master/LICENSE.txt
    */
var Ti=!o.canvasSupported,Ci={},Ai={};var Di=function(){function t(t,e,n){var i=this;this._sleepAfterStill=10,this._stillFrameAccum=0,this._needsRefresh=!0,this._needsRefreshHover=!0,this._darkMode=!1,n=n||{},this.dom=e,this.id=t;var r=new ri,a=n.renderer||"canvas";if(Ti)throw new Error("IE8 support has been dropped since 5.0");if(Ci[a]||(a=N(Ci)[0]),!Ci[a])throw new Error("Renderer '"+a+"' is not imported. Please import it first.");n.useDirtyRect=null!=n.useDirtyRect&&n.useDirtyRect;var s=new Ci[a](e,r,n,t);this.storage=r,this.painter=s;var l=o.node||o.worker?null:new Si(s.getViewportRoot(),s.root);this.handler=new ne(r,s,l,s.root),this.animation=new oi({stage:{update:function(){return i._flush(!0)}}}),this.animation.start()}return t.prototype.add=function(t){t&&(this.storage.addRoot(t),t.addSelfToZr(this),this.refresh())},t.prototype.remove=function(t){t&&(this.storage.delRoot(t),t.removeSelfFromZr(this),this.refresh())},t.prototype.configLayer=function(t,e){this.painter.configLayer&&this.painter.configLayer(t,e),this.refresh()},t.prototype.setBackgroundColor=function(t){this.painter.setBackgroundColor&&this.painter.setBackgroundColor(t),this.refresh(),this._backgroundColor=t,this._darkMode=function(t){if(!t)return!1;if("string"==typeof t)return qe(t,1)<.4;if(t.colorStops){for(var e=t.colorStops,n=0,i=e.length,r=0;r<i;r++)n+=qe(e[r].color,1);return(n/=i)<.4}return!1}(t)},t.prototype.getBackgroundColor=function(){return this._backgroundColor},t.prototype.setDarkMode=function(t){this._darkMode=t},t.prototype.isDarkMode=function(){return this._darkMode},t.prototype.refreshImmediately=function(t){t||this.animation.update(!0),this._needsRefresh=!1,this.painter.refresh(),this._needsRefresh=!1},t.prototype.refresh=function(){this._needsRefresh=!0,this.animation.start()},t.prototype.flush=function(){this._flush(!1)},t.prototype._flush=function(t){var e,n=(new Date).getTime();this._needsRefresh&&(e=!0,this.refreshImmediately(t)),this._needsRefreshHover&&(e=!0,this.refreshHoverImmediately());var i=(new Date).getTime();e?(this._stillFrameAccum=0,this.trigger("rendered",{elapsedTime:i-n})):this._sleepAfterStill>0&&(this._stillFrameAccum++,this._stillFrameAccum>this._sleepAfterStill&&this.animation.stop())},t.prototype.setSleepAfterStill=function(t){this._sleepAfterStill=t},t.prototype.wakeUp=function(){this.animation.start(),this._stillFrameAccum=0},t.prototype.addHover=function(t){},t.prototype.removeHover=function(t){},t.prototype.clearHover=function(){},t.prototype.refreshHover=function(){this._needsRefreshHover=!0},t.prototype.refreshHoverImmediately=function(){this._needsRefreshHover=!1,this.painter.refreshHover&&"canvas"===this.painter.getType()&&this.painter.refreshHover()},t.prototype.resize=function(t){t=t||{},this.painter.resize(t.width,t.height),this.handler.resize()},t.prototype.clearAnimation=function(){this.animation.clear()},t.prototype.getWidth=function(){return this.painter.getWidth()},t.prototype.getHeight=function(){return this.painter.getHeight()},t.prototype.pathToImage=function(t,e){if(this.painter.pathToImage)return this.painter.pathToImage(t,e)},t.prototype.setCursorStyle=function(t){this.handler.setCursorStyle(t)},t.prototype.findHover=function(t,e){return this.handler.findHover(t,e)},t.prototype.on=function(t,e,n){return this.handler.on(t,e,n),this},t.prototype.off=function(t,e){this.handler.off(t,e)},t.prototype.trigger=function(t,e){this.handler.trigger(t,e)},t.prototype.clear=function(){for(var t=this.storage.getRoots(),e=0;e<t.length;e++)t[e]instanceof Mi&&t[e].removeSelfFromZr(this);this.storage.delAllRoots(),this.painter.clear()},t.prototype.dispose=function(){var t;this.animation.stop(),this.clear(),this.storage.dispose(),this.painter.dispose(),this.handler.dispose(),this.animation=this.storage=this.painter=this.handler=null,t=this.id,delete Ai[t]},t}();function Ii(t,e){var n=new Di(x(),t,e);return Ai[n.id]=n,n}function ki(t,e){Ci[t]=e}var Li=Object.freeze({__proto__:null,init:Ii,dispose:function(t){t.dispose()},disposeAll:function(){for(var t in Ai)Ai.hasOwnProperty(t)&&Ai[t].dispose();Ai={}},getInstance:function(t){return Ai[t]},registerPainter:ki,version:"5.1.0"}),Pi=1e-4;function Oi(t,e,n,i){var r=e[1]-e[0],a=n[1]-n[0];if(0===r)return 0===a?n[0]:(n[0]+n[1])/2;if(i)if(r>0){if(t<=e[0])return n[0];if(t>=e[1])return n[1]}else{if(t>=e[0])return n[0];if(t<=e[1])return n[1]}else{if(t===e[0])return n[0];if(t===e[1])return n[1]}return(t-e[0])/r*a+n[0]}function Ri(t,e){switch(t){case"center":case"middle":t="50%";break;case"left":case"top":t="0%";break;case"right":case"bottom":t="100%"}return"string"==typeof t?(n=t,n.replace(/^\s+|\s+$/g,"")).match(/%$/)?parseFloat(t)/100*e:parseFloat(t):null==t?NaN:+t;var n}function Ni(t,e,n){return null==e&&(e=10),e=Math.min(Math.max(0,e),20),t=(+t).toFixed(e),n?t:+t}function Ei(t){var e=t.toString(),n=e.indexOf("e");if(n>0){var i=+e.slice(n+1);return i<0?-i:0}var r=e.indexOf(".");return r<0?0:e.length-1-r}function Bi(t,e){var n=Math.log,i=Math.LN10,r=Math.floor(n(t[1]-t[0])/i),a=Math.round(n(Math.abs(e[1]-e[0]))/i),o=Math.min(Math.max(-r+a,0),20);return isFinite(o)?o:20}function zi(t,e,n){if(!t[e])return 0;var i=O(t,(function(t,e){return t+(isNaN(e)?0:e)}),0);if(0===i)return 0;for(var r=Math.pow(10,n),a=P(t,(function(t){return(isNaN(t)?0:t)/i*r*100})),o=100*r,s=P(a,(function(t){return Math.floor(t)})),l=O(s,(function(t,e){return t+e}),0),u=P(a,(function(t,e){return t-s[e]}));l<o;){for(var h=Number.NEGATIVE_INFINITY,c=null,p=0,f=u.length;p<f;++p)u[p]>h&&(h=u[p],c=p);++s[c],u[c]=0,++l}return s[e]/r}function Fi(t){var e=2*Math.PI;return(t%e+e)%e}function Vi(t){return t>-1e-4&&t<Pi}var Hi=/^(?:(\d{4})(?:[-\/](\d{1,2})(?:[-\/](\d{1,2})(?:[T ](\d{1,2})(?::(\d{1,2})(?::(\d{1,2})(?:[.,](\d+))?)?)?(Z|[\+\-]\d\d:?\d\d)?)?)?)?)?$/;function Gi(t){if(t instanceof Date)return t;if("string"==typeof t){var e=Hi.exec(t);if(!e)return new Date(NaN);if(e[8]){var n=+e[4]||0;return"Z"!==e[8].toUpperCase()&&(n-=+e[8].slice(0,3)),new Date(Date.UTC(+e[1],+(e[2]||1)-1,+e[3]||1,n,+(e[5]||0),+e[6]||0,+e[7]||0))}return new Date(+e[1],+(e[2]||1)-1,+e[3]||1,+e[4]||0,+(e[5]||0),+e[6]||0,+e[7]||0)}return null==t?new Date(NaN):new Date(Math.round(t))}function Wi(t){return Math.pow(10,Ui(t))}function Ui(t){if(0===t)return 0;var e=Math.floor(Math.log(t)/Math.LN10);return t/Math.pow(10,e)>=10&&e++,e}function Yi(t,e){var n=Ui(t),i=Math.pow(10,n),r=t/i;return t=(e?r<1.5?1:r<2.5?2:r<4?3:r<7?5:10:r<1?1:r<2?2:r<3?3:r<5?5:10)*i,n>=-20?+t.toFixed(n<0?-n:0):t}function Xi(t){var e=parseFloat(t);return e==t&&(0!==e||"string"!=typeof t||t.indexOf("x")<=0)?e:NaN}function qi(t){return!isNaN(Xi(t))}function ji(t,e){return 0===e?t:ji(e,t%e)}function Zi(t,e){return null==t?e:null==e?t:t*e/ji(t,e)}"undefined"!=typeof console&&console.warn&&console.log;function Ki(t){0}function $i(t){throw new Error(t)}var Ji="series\0";function Qi(t){return t instanceof Array?t:null==t?[]:[t]}function tr(t,e,n){if(t){t[e]=t[e]||{},t.emphasis=t.emphasis||{},t.emphasis[e]=t.emphasis[e]||{};for(var i=0,r=n.length;i<r;i++){var a=n[i];!t.emphasis[e].hasOwnProperty(a)&&t[e].hasOwnProperty(a)&&(t.emphasis[e][a]=t[e][a])}}}var er=["fontStyle","fontWeight","fontSize","fontFamily","rich","tag","color","textBorderColor","textBorderWidth","width","height","lineHeight","align","verticalAlign","baseline","shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY","textShadowColor","textShadowBlur","textShadowOffsetX","textShadowOffsetY","backgroundColor","borderColor","borderWidth","borderRadius","padding"];function nr(t){return!W(t)||z(t)||t instanceof Date?t:t.value}function ir(t,e,n){var i="normalMerge"===n,r="replaceMerge"===n,a="replaceAll"===n;t=t||[],e=(e||[]).slice();var o=lt();L(e,(function(t,n){W(t)||(e[n]=null)}));var s,l,u=function(t,e,n){var i=[];if("replaceAll"===n)return i;for(var r=0;r<t.length;r++){var a=t[r];a&&null!=a.id&&e.set(a.id,r),i.push({existing:"replaceMerge"===n||lr(a)?null:a,newOption:null,keyInfo:null,brandNew:null})}return i}(t,o,n);return(i||r)&&function(t,e,n,i){L(i,(function(r,a){if(r&&null!=r.id){var o=ar(r.id),s=n.get(o);if(null!=s){var l=t[s];nt(!l.newOption,'Duplicated option on id "'+o+'".'),l.newOption=r,l.existing=e[s],i[a]=null}}}))}(u,t,o,e),i&&function(t,e){L(e,(function(n,i){if(n&&null!=n.name)for(var r=0;r<t.length;r++){var a=t[r].existing;if(!t[r].newOption&&a&&(null==a.id||null==n.id)&&!lr(n)&&!lr(a)&&rr("name",a,n))return t[r].newOption=n,void(e[i]=null)}}))}(u,e),i||r?function(t,e,n){L(e,(function(e){if(e){for(var i,r=0;(i=t[r])&&(i.newOption||lr(i.existing)||i.existing&&null!=e.id&&!rr("id",e,i.existing));)r++;i?(i.newOption=e,i.brandNew=n):t.push({newOption:e,brandNew:n,existing:null,keyInfo:null}),r++}}))}(u,e,r):a&&function(t,e){L(e,(function(e){t.push({newOption:e,brandNew:!0,existing:null,keyInfo:null})}))}(u,e),s=u,l=lt(),L(s,(function(t){var e=t.existing;e&&l.set(e.id,t)})),L(s,(function(t){var e=t.newOption;nt(!e||null==e.id||!l.get(e.id)||l.get(e.id)===t,"id duplicates: "+(e&&e.id)),e&&null!=e.id&&l.set(e.id,t),!t.keyInfo&&(t.keyInfo={})})),L(s,(function(t,e){var n=t.existing,i=t.newOption,r=t.keyInfo;if(W(i)){if(r.name=null!=i.name?ar(i.name):n?n.name:Ji+e,n)r.id=ar(n.id);else if(null!=i.id)r.id=ar(i.id);else{var a=0;do{r.id="\0"+r.name+"\0"+a++}while(l.get(r.id))}l.set(r.id,t)}})),u}function rr(t,e,n){var i=or(e[t],null),r=or(n[t],null);return null!=i&&null!=r&&i===r}function ar(t){return or(t,"")}function or(t,e){if(null==t)return e;var n=typeof t;return"string"===n?t:"number"===n||H(t)?t+"":e}function sr(t){var e=t.name;return!(!e||!e.indexOf(Ji))}function lr(t){return t&&null!=t.id&&0===ar(t.id).indexOf("\0_ec_\0")}function ur(t,e){return null!=e.dataIndexInside?e.dataIndexInside:null!=e.dataIndex?z(e.dataIndex)?P(e.dataIndex,(function(e){return t.indexOfRawIndex(e)})):t.indexOfRawIndex(e.dataIndex):null!=e.name?z(e.name)?P(e.name,(function(e){return t.indexOfName(e)})):t.indexOfName(e.name):void 0}function hr(){var t="__ec_inner_"+cr++;return function(e){return e[t]||(e[t]={})}}var cr=Math.round(9*Math.random());function pr(t,e,n){var i=fr(e,n),r=i.mainTypeSpecified,a=i.queryOptionMap,o=i.others,s=n?n.defaultMainType:null;return!r&&s&&a.set(s,{}),a.each((function(e,i){var r=gr(t,i,e,{useDefault:s===i,enableAll:!n||null==n.enableAll||n.enableAll,enableNone:!n||null==n.enableNone||n.enableNone});o[i+"Models"]=r.models,o[i+"Model"]=r.models[0]})),o}function fr(t,e){var n;if(V(t)){var i={};i[t+"Index"]=0,n=i}else n=t;var r=lt(),a={},o=!1;return L(n,(function(t,n){if("dataIndex"!==n&&"dataIndexInside"!==n){var i=n.match(/^(\w+)(Index|Id|Name)$/)||[],s=i[1],l=(i[2]||"").toLowerCase();if(s&&l&&!(e&&e.includeMainTypes&&A(e.includeMainTypes,s)<0))o=o||!!s,(r.get(s)||r.set(s,{}))[l]=t}else a[n]=t})),{mainTypeSpecified:o,queryOptionMap:r,others:a}}var dr={useDefault:!0,enableAll:!1,enableNone:!1};function gr(t,e,n,i){i=i||dr;var r=n.index,a=n.id,o=n.name,s={models:null,specified:null!=r||null!=a||null!=o};if(!s.specified){var l=void 0;return s.models=i.useDefault&&(l=t.getComponent(e))?[l]:[],s}return"none"===r||!1===r?(nt(i.enableNone,'`"none"` or `false` is not a valid value on index option.'),s.models=[],s):("all"===r&&(nt(i.enableAll,'`"all"` is not a valid value on index option.'),r=a=o=null),s.models=t.queryComponents({mainType:e,index:r,id:a,name:o}),s)}function yr(t,e,n){t.setAttribute?t.setAttribute(e,n):t[e]=n}function vr(t,e,n,i,r){var a=null==e||"auto"===e;if(null==i)return i;if("number"==typeof i)return Ni(f=Ke(n||0,i,r),a?Math.max(Ei(n||0),Ei(i)):e);if("string"==typeof i)return r<1?n:i;for(var o=[],s=n,l=i,u=Math.max(s?s.length:0,l.length),h=0;h<u;++h){if("ordinal"===t.getDimensionInfo(h).type)o[h]=(r<1&&s?s:l)[h];else{var c=s&&s[h]?s[h]:0,p=l[h],f=Ke(c,p,r);o[h]=Ni(f,a?Math.max(Ei(c),Ei(p)):e)}}return o}var mr="___EC__COMPONENT__CONTAINER___",_r="___EC__EXTENDED_CLASS___";function xr(t){var e={main:"",sub:""};if(t){var n=t.split(".");e.main=n[0]||"",e.sub=n[1]||""}return e}function br(t,e){t.$constructor=t,t.extend=function(t){var e=this;function n(){for(var i=[],a=0;a<arguments.length;a++)i[a]=arguments[a];if(t.$constructor)t.$constructor.apply(this,arguments);else{if(wr(e)){var o=ut(n.prototype,new(e.bind.apply(e,r([void 0],i))));return o}e.apply(this,arguments)}}return n[_r]=!0,M(n.prototype,t),n.extend=this.extend,n.superCall=Tr,n.superApply=Cr,D(n,this),n.superClass=e,n}}function wr(t){return"function"==typeof t&&/^class\s/.test(Function.prototype.toString.call(t))}function Sr(t,e){t.extend=e.extend}var Mr=Math.round(10*Math.random());function Tr(t,e){for(var n=[],i=2;i<arguments.length;i++)n[i-2]=arguments[i];return this.superClass.prototype[e].apply(t,n)}function Cr(t,e,n){return this.superClass.prototype[e].apply(t,n)}function Ar(t){var e={};t.registerClass=function(t){var n,i=t.type||t.prototype.type;if(i){nt(/^[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)?$/.test(n=i),'componentType "'+n+'" illegal'),t.prototype.type=i;var r=xr(i);if(r.sub){if(r.sub!==mr){(function(t){var n=e[t.main];n&&n[mr]||((n=e[t.main]={})[mr]=!0);return n}(r))[r.sub]=t}}else e[r.main]=t}return t},t.getClass=function(t,n,i){var r=e[t];if(r&&r[mr]&&(r=n?r[n]:null),i&&!r)throw new Error(n?"Component "+t+"."+(n||"")+" is used but not imported.":t+".type should be specified.");return r},t.getClassesByMainType=function(t){var n=xr(t),i=[],r=e[n.main];return r&&r[mr]?L(r,(function(t,e){e!==mr&&i.push(t)})):i.push(r),i},t.hasClass=function(t){var n=xr(t);return!!e[n.main]},t.getAllClassMainTypes=function(){var t=[];return L(e,(function(e,n){t.push(n)})),t},t.hasSubTypes=function(t){var n=xr(t),i=e[n.main];return i&&i[mr]}}function Dr(t,e){for(var n=0;n<t.length;n++)t[n][1]||(t[n][1]=t[n][0]);return e=e||!1,function(n,i,r){for(var a={},o=0;o<t.length;o++){var s=t[o][1];if(!(i&&A(i,s)>=0||r&&A(r,s)<0)){var l=n.getShallow(s,e);null!=l&&(a[t[o][0]]=l)}}return a}}var Ir=Dr([["fill","color"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["opacity"],["shadowColor"]]),kr=function(){function t(){}return t.prototype.getAreaStyle=function(t,e){return Ir(this,t,e)},t}(),Lr=new Ce(50);function Pr(t){if("string"==typeof t){var e=Lr.get(t);return e&&e.image}return t}function Or(t,e,n,i,r){if(t){if("string"==typeof t){if(e&&e.__zrImageSrc===t||!n)return e;var a=Lr.get(t),o={hostEl:n,cb:i,cbPayload:r};return a?!Nr(e=a.image)&&a.pending.push(o):((e=new Image).onload=e.onerror=Rr,Lr.put(t,e.__cachedImgObj={image:e,pending:[o]}),e.src=e.__zrImageSrc=t),e}return t}return e}function Rr(){var t=this.__cachedImgObj;this.onload=this.onerror=this.__cachedImgObj=null;for(var e=0;e<t.pending.length;e++){var n=t.pending[e],i=n.cb;i&&i(this,n.cbPayload),n.hostEl.dirty()}t.pending.length=0}function Nr(t){return t&&t.width&&t.height}var Er=/\{([a-zA-Z0-9_]+)\|([^}]*)\}/g;function Br(t,e,n,i,r){if(!e)return"";var a=(t+"").split("\n");r=zr(e,n,i,r);for(var o=0,s=a.length;o<s;o++)a[o]=Fr(a[o],r);return a.join("\n")}function zr(t,e,n,i){var r=M({},i=i||{});r.font=e,n=J(n,"..."),r.maxIterations=J(i.maxIterations,2);var a=r.minChar=J(i.minChar,0);r.cnCharWidth=Tn("国",e);var o=r.ascCharWidth=Tn("a",e);r.placeholder=J(i.placeholder,"");for(var s=t=Math.max(0,t-1),l=0;l<a&&s>=o;l++)s-=o;var u=Tn(n,e);return u>s&&(n="",u=0),s=t-u,r.ellipsis=n,r.ellipsisWidth=u,r.contentWidth=s,r.containerWidth=t,r}function Fr(t,e){var n=e.containerWidth,i=e.font,r=e.contentWidth;if(!n)return"";var a=Tn(t,i);if(a<=n)return t;for(var o=0;;o++){if(a<=r||o>=e.maxIterations){t+=e.ellipsis;break}var s=0===o?Vr(t,r,e.ascCharWidth,e.cnCharWidth):a>0?Math.floor(t.length*r/a):0;a=Tn(t=t.substr(0,s),i)}return""===t&&(t=e.placeholder),t}function Vr(t,e,n,i){for(var r=0,a=0,o=t.length;a<o&&r<e;a++){var s=t.charCodeAt(a);r+=0<=s&&s<=127?n:i}return a}var Hr=function(){},Gr=function(t){this.tokens=[],t&&(this.tokens=t)},Wr=function(){this.width=0,this.height=0,this.contentWidth=0,this.contentHeight=0,this.outerWidth=0,this.outerHeight=0,this.lines=[]};function Ur(t,e,n,i,r){var a,o,s=""===e,l=r&&n.rich[r]||{},u=t.lines,h=l.font||n.font,c=!1;if(i){var p=l.padding,f=p?p[1]+p[3]:0;if(null!=l.width&&"auto"!==l.width){var d=Ln(l.width,i.width)+f;u.length>0&&d+i.accumWidth>i.width&&(a=e.split("\n"),c=!0),i.accumWidth=d}else{var g=qr(e,h,i.width,i.breakAll,i.accumWidth);i.accumWidth=g.accumWidth+f,o=g.linesWidths,a=g.lines}}else a=e.split("\n");for(var y=0;y<a.length;y++){var v=a[y],m=new Hr;if(m.styleName=r,m.text=v,m.isLineHolder=!v&&!s,"number"==typeof l.width?m.width=l.width:m.width=o?o[y]:Tn(v,h),y||c)u.push(new Gr([m]));else{var _=(u[u.length-1]||(u[0]=new Gr)).tokens,x=_.length;1===x&&_[0].isLineHolder?_[0]=m:(v||!x||s)&&_.push(m)}}}var Yr=O(",&?/;] ".split(""),(function(t,e){return t[e]=!0,t}),{});function Xr(t){return!function(t){var e=t.charCodeAt(0);return e>=33&&e<=255}(t)||!!Yr[t]}function qr(t,e,n,i,r){for(var a=[],o=[],s="",l="",u=0,h=0,c=0;c<t.length;c++){var p=t.charAt(c);if("\n"!==p){var f=Tn(p,e),d=!i&&!Xr(p);(a.length?h+f>n:r+h+f>n)?h?(s||l)&&(d?(s||(s=l,l="",h=u=0),a.push(s),o.push(h-u),l+=p,s="",h=u+=f):(l&&(s+=l,h+=u,l="",u=0),a.push(s),o.push(h),s=p,h=f)):d?(a.push(l),o.push(u),l=p,u=f):(a.push(p),o.push(f)):(h+=f,d?(l+=p,u+=f):(l&&(s+=l,l="",u=0),s+=p))}else l&&(s+=l,h+=u),a.push(s),o.push(h),s="",l="",u=0,h=0}return a.length||s||(s=t,l="",u=0),l&&(s+=l),s&&(a.push(s),o.push(h)),1===a.length&&(h+=r),{accumWidth:h,lines:a,linesWidths:o}}var jr="__zr_style_"+Math.round(10*Math.random()),Zr={shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,shadowColor:"#000",opacity:1,blend:"source-over"},Kr={style:{shadowBlur:!0,shadowOffsetX:!0,shadowOffsetY:!0,shadowColor:!0,opacity:!0}};Zr[jr]=!0;var $r=["z","z2","invisible"],Jr=function(t){function e(e){return t.call(this,e)||this}var i;return n(e,t),e.prototype._init=function(e){for(var n=N(e),i=0;i<n.length;i++){var r=n[i];"style"===r?this.useStyle(e[r]):t.prototype.attrKV.call(this,r,e[r])}this.style||this.useStyle({})},e.prototype.beforeBrush=function(){},e.prototype.afterBrush=function(){},e.prototype.innerBeforeBrush=function(){},e.prototype.innerAfterBrush=function(){},e.prototype.shouldBePainted=function(t,e,n,i){var r=this.transform;if(this.ignore||this.invisible||0===this.style.opacity||this.culling&&function(t,e,n){Qr.copy(t.getBoundingRect()),t.transform&&Qr.applyTransform(t.transform);return ta.width=e,ta.height=n,!Qr.intersect(ta)}(this,t,e)||r&&!r[0]&&!r[3])return!1;if(n&&this.__clipPaths)for(var a=0;a<this.__clipPaths.length;++a)if(this.__clipPaths[a].isZeroArea())return!1;if(i&&this.parent)for(var o=this.parent;o;){if(o.ignore)return!1;o=o.parent}return!0},e.prototype.contain=function(t,e){return this.rectContain(t,e)},e.prototype.traverse=function(t,e){t.call(e,this)},e.prototype.rectContain=function(t,e){var n=this.transformCoordToLocal(t,e);return this.getBoundingRect().contain(n[0],n[1])},e.prototype.getPaintRect=function(){var t=this._paintRect;if(!this._paintRect||this.__dirty){var e=this.transform,n=this.getBoundingRect(),i=this.style,r=i.shadowBlur||0,a=i.shadowOffsetX||0,o=i.shadowOffsetY||0;t=this._paintRect||(this._paintRect=new bn(0,0,0,0)),e?bn.applyTransform(t,n,e):t.copy(n),(r||a||o)&&(t.width+=2*r+Math.abs(a),t.height+=2*r+Math.abs(o),t.x=Math.min(t.x,t.x+a-r),t.y=Math.min(t.y,t.y+o-r));var s=this.dirtyRectTolerance;t.isZero()||(t.x=Math.floor(t.x-s),t.y=Math.floor(t.y-s),t.width=Math.ceil(t.width+1+2*s),t.height=Math.ceil(t.height+1+2*s))}return t},e.prototype.setPrevPaintRect=function(t){t?(this._prevPaintRect=this._prevPaintRect||new bn(0,0,0,0),this._prevPaintRect.copy(t)):this._prevPaintRect=null},e.prototype.getPrevPaintRect=function(){return this._prevPaintRect},e.prototype.animateStyle=function(t){return this.animate("style",t)},e.prototype.updateDuringAnimation=function(t){"style"===t?this.dirtyStyle():this.markRedraw()},e.prototype.attrKV=function(e,n){"style"!==e?t.prototype.attrKV.call(this,e,n):this.style?this.setStyle(n):this.useStyle(n)},e.prototype.setStyle=function(t,e){return"string"==typeof t?this.style[t]=e:M(this.style,t),this.dirtyStyle(),this},e.prototype.dirtyStyle=function(){this.markRedraw(),this.__dirty|=e.STYLE_CHANGED_BIT,this._rect&&(this._rect=null)},e.prototype.dirty=function(){this.dirtyStyle()},e.prototype.styleChanged=function(){return!!(this.__dirty&e.STYLE_CHANGED_BIT)},e.prototype.styleUpdated=function(){this.__dirty&=~e.STYLE_CHANGED_BIT},e.prototype.createStyle=function(t){return ut(Zr,t)},e.prototype.useStyle=function(t){t[jr]||(t=this.createStyle(t)),this.__inHover?this.__hoverStyle=t:this.style=t,this.dirtyStyle()},e.prototype.isStyleObject=function(t){return t[jr]},e.prototype._innerSaveToNormal=function(e){t.prototype._innerSaveToNormal.call(this,e);var n=this._normalState;e.style&&!n.style&&(n.style=this._mergeStyle(this.createStyle(),this.style)),this._savePrimaryToNormal(e,n,$r)},e.prototype._applyStateObj=function(e,n,i,r,a,o){t.prototype._applyStateObj.call(this,e,n,i,r,a,o);var s,l=!(n&&r);if(n&&n.style?a?r?s=n.style:(s=this._mergeStyle(this.createStyle(),i.style),this._mergeStyle(s,n.style)):(s=this._mergeStyle(this.createStyle(),r?this.style:i.style),this._mergeStyle(s,n.style)):l&&(s=i.style),s)if(a){var u=this.style;if(this.style=this.createStyle(l?{}:u),l)for(var h=N(u),c=0;c<h.length;c++){(f=h[c])in s&&(s[f]=s[f],this.style[f]=u[f])}var p=N(s);for(c=0;c<p.length;c++){var f=p[c];this.style[f]=this.style[f]}this._transitionState(e,{style:s},o,this.getAnimationStyleProps())}else this.useStyle(s);for(c=0;c<$r.length;c++){f=$r[c];n&&null!=n[f]?this[f]=n[f]:l&&null!=i[f]&&(this[f]=i[f])}},e.prototype._mergeStates=function(e){for(var n,i=t.prototype._mergeStates.call(this,e),r=0;r<e.length;r++){var a=e[r];a.style&&(n=n||{},this._mergeStyle(n,a.style))}return n&&(i.style=n),i},e.prototype._mergeStyle=function(t,e){return M(t,e),t},e.prototype.getAnimationStyleProps=function(){return Kr},e.STYLE_CHANGED_BIT=2,e.initDefaultProps=((i=e.prototype).type="displayable",i.invisible=!1,i.z=0,i.z2=0,i.zlevel=0,i.culling=!1,i.cursor="pointer",i.rectHover=!1,i.incremental=!1,i._rect=null,i.dirtyRectTolerance=0,void(i.__dirty=Gn.REDARAW_BIT|e.STYLE_CHANGED_BIT)),e}(Gn),Qr=new bn(0,0,0,0),ta=new bn(0,0,0,0);var ea=Math.pow,na=Math.sqrt,ia=1e-8,ra=1e-4,aa=na(3),oa=1/3,sa=ft(),la=ft(),ua=ft();function ha(t){return t>-1e-8&&t<ia}function ca(t){return t>ia||t<-1e-8}function pa(t,e,n,i,r){var a=1-r;return a*a*(a*t+3*r*e)+r*r*(r*i+3*a*n)}function fa(t,e,n,i,r){var a=1-r;return 3*(((e-t)*a+2*(n-e)*r)*a+(i-n)*r*r)}function da(t,e,n,i,r,a){var o=i+3*(e-n)-t,s=3*(n-2*e+t),l=3*(e-t),u=t-r,h=s*s-3*o*l,c=s*l-9*o*u,p=l*l-3*s*u,f=0;if(ha(h)&&ha(c)){if(ha(s))a[0]=0;else(M=-l/s)>=0&&M<=1&&(a[f++]=M)}else{var d=c*c-4*h*p;if(ha(d)){var g=c/h,y=-g/2;(M=-s/o+g)>=0&&M<=1&&(a[f++]=M),y>=0&&y<=1&&(a[f++]=y)}else if(d>0){var v=na(d),m=h*s+1.5*o*(-c+v),_=h*s+1.5*o*(-c-v);(M=(-s-((m=m<0?-ea(-m,oa):ea(m,oa))+(_=_<0?-ea(-_,oa):ea(_,oa))))/(3*o))>=0&&M<=1&&(a[f++]=M)}else{var x=(2*h*s-3*o*c)/(2*na(h*h*h)),b=Math.acos(x)/3,w=na(h),S=Math.cos(b),M=(-s-2*w*S)/(3*o),T=(y=(-s+w*(S+aa*Math.sin(b)))/(3*o),(-s+w*(S-aa*Math.sin(b)))/(3*o));M>=0&&M<=1&&(a[f++]=M),y>=0&&y<=1&&(a[f++]=y),T>=0&&T<=1&&(a[f++]=T)}}return f}function ga(t,e,n,i,r){var a=6*n-12*e+6*t,o=9*e+3*i-3*t-9*n,s=3*e-3*t,l=0;if(ha(o)){if(ca(a))(h=-s/a)>=0&&h<=1&&(r[l++]=h)}else{var u=a*a-4*o*s;if(ha(u))r[0]=-a/(2*o);else if(u>0){var h,c=na(u),p=(-a-c)/(2*o);(h=(-a+c)/(2*o))>=0&&h<=1&&(r[l++]=h),p>=0&&p<=1&&(r[l++]=p)}}return l}function ya(t,e,n,i,r,a){var o=(e-t)*r+t,s=(n-e)*r+e,l=(i-n)*r+n,u=(s-o)*r+o,h=(l-s)*r+s,c=(h-u)*r+u;a[0]=t,a[1]=o,a[2]=u,a[3]=c,a[4]=c,a[5]=h,a[6]=l,a[7]=i}function va(t,e,n,i,r,a,o,s,l,u,h){var c,p,f,d,g,y=.005,v=1/0;sa[0]=l,sa[1]=u;for(var m=0;m<1;m+=.05)la[0]=pa(t,n,r,o,m),la[1]=pa(e,i,a,s,m),(d=Ct(sa,la))<v&&(c=m,v=d);v=1/0;for(var _=0;_<32&&!(y<ra);_++)p=c-y,f=c+y,la[0]=pa(t,n,r,o,p),la[1]=pa(e,i,a,s,p),d=Ct(la,sa),p>=0&&d<v?(c=p,v=d):(ua[0]=pa(t,n,r,o,f),ua[1]=pa(e,i,a,s,f),g=Ct(ua,sa),f<=1&&g<v?(c=f,v=g):y*=.5);return h&&(h[0]=pa(t,n,r,o,c),h[1]=pa(e,i,a,s,c)),na(v)}function ma(t,e,n,i,r,a,o,s,l){for(var u=t,h=e,c=0,p=1/l,f=1;f<=l;f++){var d=f*p,g=pa(t,n,r,o,d),y=pa(e,i,a,s,d),v=g-u,m=y-h;c+=Math.sqrt(v*v+m*m),u=g,h=y}return c}function _a(t,e,n,i){var r=1-i;return r*(r*t+2*i*e)+i*i*n}function xa(t,e,n,i){return 2*((1-i)*(e-t)+i*(n-e))}function ba(t,e,n){var i=t+n-2*e;return 0===i?.5:(t-e)/i}function wa(t,e,n,i,r){var a=(e-t)*i+t,o=(n-e)*i+e,s=(o-a)*i+a;r[0]=t,r[1]=a,r[2]=s,r[3]=s,r[4]=o,r[5]=n}function Sa(t,e,n,i,r,a,o,s,l){var u,h=.005,c=1/0;sa[0]=o,sa[1]=s;for(var p=0;p<1;p+=.05){la[0]=_a(t,n,r,p),la[1]=_a(e,i,a,p),(y=Ct(sa,la))<c&&(u=p,c=y)}c=1/0;for(var f=0;f<32&&!(h<ra);f++){var d=u-h,g=u+h;la[0]=_a(t,n,r,d),la[1]=_a(e,i,a,d);var y=Ct(la,sa);if(d>=0&&y<c)u=d,c=y;else{ua[0]=_a(t,n,r,g),ua[1]=_a(e,i,a,g);var v=Ct(ua,sa);g<=1&&v<c?(u=g,c=v):h*=.5}}return l&&(l[0]=_a(t,n,r,u),l[1]=_a(e,i,a,u)),na(c)}function Ma(t,e,n,i,r,a,o){for(var s=t,l=e,u=0,h=1/o,c=1;c<=o;c++){var p=c*h,f=_a(t,n,r,p),d=_a(e,i,a,p),g=f-s,y=d-l;u+=Math.sqrt(g*g+y*y),s=f,l=d}return u}var Ta=Math.min,Ca=Math.max,Aa=Math.sin,Da=Math.cos,Ia=2*Math.PI,ka=ft(),La=ft(),Pa=ft();function Oa(t,e,n){if(0!==t.length){for(var i=t[0],r=i[0],a=i[0],o=i[1],s=i[1],l=1;l<t.length;l++)i=t[l],r=Ta(r,i[0]),a=Ca(a,i[0]),o=Ta(o,i[1]),s=Ca(s,i[1]);e[0]=r,e[1]=o,n[0]=a,n[1]=s}}function Ra(t,e,n,i,r,a){r[0]=Ta(t,n),r[1]=Ta(e,i),a[0]=Ca(t,n),a[1]=Ca(e,i)}var Na=[],Ea=[];function Ba(t,e,n,i,r,a,o,s,l,u){var h=ga,c=pa,p=h(t,n,r,o,Na);l[0]=1/0,l[1]=1/0,u[0]=-1/0,u[1]=-1/0;for(var f=0;f<p;f++){var d=c(t,n,r,o,Na[f]);l[0]=Ta(d,l[0]),u[0]=Ca(d,u[0])}p=h(e,i,a,s,Ea);for(f=0;f<p;f++){var g=c(e,i,a,s,Ea[f]);l[1]=Ta(g,l[1]),u[1]=Ca(g,u[1])}l[0]=Ta(t,l[0]),u[0]=Ca(t,u[0]),l[0]=Ta(o,l[0]),u[0]=Ca(o,u[0]),l[1]=Ta(e,l[1]),u[1]=Ca(e,u[1]),l[1]=Ta(s,l[1]),u[1]=Ca(s,u[1])}function za(t,e,n,i,r,a,o,s){var l=ba,u=_a,h=Ca(Ta(l(t,n,r),1),0),c=Ca(Ta(l(e,i,a),1),0),p=u(t,n,r,h),f=u(e,i,a,c);o[0]=Ta(t,r,p),o[1]=Ta(e,a,f),s[0]=Ca(t,r,p),s[1]=Ca(e,a,f)}function Fa(t,e,n,i,r,a,o,s,l){var u=It,h=kt,c=Math.abs(r-a);if(c%Ia<1e-4&&c>1e-4)return s[0]=t-n,s[1]=e-i,l[0]=t+n,void(l[1]=e+i);if(ka[0]=Da(r)*n+t,ka[1]=Aa(r)*i+e,La[0]=Da(a)*n+t,La[1]=Aa(a)*i+e,u(s,ka,La),h(l,ka,La),(r%=Ia)<0&&(r+=Ia),(a%=Ia)<0&&(a+=Ia),r>a&&!o?a+=Ia:r<a&&o&&(r+=Ia),o){var p=a;a=r,r=p}for(var f=0;f<a;f+=Math.PI/2)f>r&&(Pa[0]=Da(f)*n+t,Pa[1]=Aa(f)*i+e,u(s,Pa,s),h(l,Pa,l))}var Va={M:1,L:2,C:3,Q:4,A:5,Z:6,R:7},Ha=[],Ga=[],Wa=[],Ua=[],Ya=[],Xa=[],qa=Math.min,ja=Math.max,Za=Math.cos,Ka=Math.sin,$a=Math.sqrt,Ja=Math.abs,Qa=Math.PI,to=2*Qa,eo="undefined"!=typeof Float32Array,no=[];function io(t){return Math.round(t/Qa*1e8)/1e8%2*Qa}function ro(t,e){var n=io(t[0]);n<0&&(n+=to);var i=n-t[0],r=t[1];r+=i,!e&&r-n>=to?r=n+to:e&&n-r>=to?r=n-to:!e&&n>r?r=n+(to-io(n-r)):e&&n<r&&(r=n-(to-io(r-n))),t[0]=n,t[1]=r}var ao=function(){function t(t){this.dpr=1,this._version=0,this._xi=0,this._yi=0,this._x0=0,this._y0=0,this._len=0,t&&(this._saveData=!1),this._saveData&&(this.data=[])}return t.prototype.increaseVersion=function(){this._version++},t.prototype.getVersion=function(){return this._version},t.prototype.setScale=function(t,e,n){(n=n||0)>0&&(this._ux=Ja(n/Rn/t)||0,this._uy=Ja(n/Rn/e)||0)},t.prototype.setDPR=function(t){this.dpr=t},t.prototype.setContext=function(t){this._ctx=t},t.prototype.getContext=function(){return this._ctx},t.prototype.beginPath=function(){return this._ctx&&this._ctx.beginPath(),this.reset(),this},t.prototype.reset=function(){this._saveData&&(this._len=0),this._lineDash&&(this._lineDash=null,this._dashOffset=0),this._pathSegLen&&(this._pathSegLen=null,this._pathLen=0),this._version++},t.prototype.moveTo=function(t,e){return this.addData(Va.M,t,e),this._ctx&&this._ctx.moveTo(t,e),this._x0=t,this._y0=e,this._xi=t,this._yi=e,this},t.prototype.lineTo=function(t,e){var n=Ja(t-this._xi)>this._ux||Ja(e-this._yi)>this._uy||this._len<5;return this.addData(Va.L,t,e),this._ctx&&n&&(this._needsDash?this._dashedLineTo(t,e):this._ctx.lineTo(t,e)),n&&(this._xi=t,this._yi=e),this},t.prototype.bezierCurveTo=function(t,e,n,i,r,a){return this.addData(Va.C,t,e,n,i,r,a),this._ctx&&(this._needsDash?this._dashedBezierTo(t,e,n,i,r,a):this._ctx.bezierCurveTo(t,e,n,i,r,a)),this._xi=r,this._yi=a,this},t.prototype.quadraticCurveTo=function(t,e,n,i){return this.addData(Va.Q,t,e,n,i),this._ctx&&(this._needsDash?this._dashedQuadraticTo(t,e,n,i):this._ctx.quadraticCurveTo(t,e,n,i)),this._xi=n,this._yi=i,this},t.prototype.arc=function(t,e,n,i,r,a){no[0]=i,no[1]=r,ro(no,a),i=no[0];var o=(r=no[1])-i;return this.addData(Va.A,t,e,n,n,i,o,0,a?0:1),this._ctx&&this._ctx.arc(t,e,n,i,r,a),this._xi=Za(r)*n+t,this._yi=Ka(r)*n+e,this},t.prototype.arcTo=function(t,e,n,i,r){return this._ctx&&this._ctx.arcTo(t,e,n,i,r),this},t.prototype.rect=function(t,e,n,i){return this._ctx&&this._ctx.rect(t,e,n,i),this.addData(Va.R,t,e,n,i),this},t.prototype.closePath=function(){this.addData(Va.Z);var t=this._ctx,e=this._x0,n=this._y0;return t&&(this._needsDash&&this._dashedLineTo(e,n),t.closePath()),this._xi=e,this._yi=n,this},t.prototype.fill=function(t){t&&t.fill(),this.toStatic()},t.prototype.stroke=function(t){t&&t.stroke(),this.toStatic()},t.prototype.setLineDash=function(t){if(t instanceof Array){this._lineDash=t,this._dashIdx=0;for(var e=0,n=0;n<t.length;n++)e+=t[n];this._dashSum=e,this._needsDash=!0}else this._lineDash=null,this._needsDash=!1;return this},t.prototype.setLineDashOffset=function(t){return this._dashOffset=t,this},t.prototype.len=function(){return this._len},t.prototype.setData=function(t){var e=t.length;this.data&&this.data.length===e||!eo||(this.data=new Float32Array(e));for(var n=0;n<e;n++)this.data[n]=t[n];this._len=e},t.prototype.appendPath=function(t){t instanceof Array||(t=[t]);for(var e=t.length,n=0,i=this._len,r=0;r<e;r++)n+=t[r].len();eo&&this.data instanceof Float32Array&&(this.data=new Float32Array(i+n));for(r=0;r<e;r++)for(var a=t[r].data,o=0;o<a.length;o++)this.data[i++]=a[o];this._len=i},t.prototype.addData=function(t,e,n,i,r,a,o,s,l){if(this._saveData){var u=this.data;this._len+arguments.length>u.length&&(this._expandData(),u=this.data);for(var h=0;h<arguments.length;h++)u[this._len++]=arguments[h]}},t.prototype._expandData=function(){if(!(this.data instanceof Array)){for(var t=[],e=0;e<this._len;e++)t[e]=this.data[e];this.data=t}},t.prototype._dashedLineTo=function(t,e){var n,i,r=this._dashSum,a=this._lineDash,o=this._ctx,s=this._dashOffset,l=this._xi,u=this._yi,h=t-l,c=e-u,p=$a(h*h+c*c),f=l,d=u,g=a.length;for(s<0&&(s=r+s),f-=(s%=r)*(h/=p),d-=s*(c/=p);h>0&&f<=t||h<0&&f>=t||0===h&&(c>0&&d<=e||c<0&&d>=e);)f+=h*(n=a[i=this._dashIdx]),d+=c*n,this._dashIdx=(i+1)%g,h>0&&f<l||h<0&&f>l||c>0&&d<u||c<0&&d>u||o[i%2?"moveTo":"lineTo"](h>=0?qa(f,t):ja(f,t),c>=0?qa(d,e):ja(d,e));h=f-t,c=d-e,this._dashOffset=-$a(h*h+c*c)},t.prototype._dashedBezierTo=function(t,e,n,i,r,a){var o,s,l,u,h,c=this._ctx,p=this._dashSum,f=this._dashOffset,d=this._lineDash,g=this._xi,y=this._yi,v=0,m=this._dashIdx,_=d.length,x=0;for(f<0&&(f=p+f),f%=p,o=0;o<1;o+=.1)s=pa(g,t,n,r,o+.1)-pa(g,t,n,r,o),l=pa(y,e,i,a,o+.1)-pa(y,e,i,a,o),v+=$a(s*s+l*l);for(;m<_&&!((x+=d[m])>f);m++);for(o=(x-f)/v;o<=1;)u=pa(g,t,n,r,o),h=pa(y,e,i,a,o),m%2?c.moveTo(u,h):c.lineTo(u,h),o+=d[m]/v,m=(m+1)%_;m%2!=0&&c.lineTo(r,a),s=r-u,l=a-h,this._dashOffset=-$a(s*s+l*l)},t.prototype._dashedQuadraticTo=function(t,e,n,i){var r=n,a=i;n=(n+2*t)/3,i=(i+2*e)/3,t=(this._xi+2*t)/3,e=(this._yi+2*e)/3,this._dashedBezierTo(t,e,n,i,r,a)},t.prototype.toStatic=function(){if(this._saveData){var t=this.data;t instanceof Array&&(t.length=this._len,eo&&this._len>11&&(this.data=new Float32Array(t)))}},t.prototype.getBoundingRect=function(){Wa[0]=Wa[1]=Ya[0]=Ya[1]=Number.MAX_VALUE,Ua[0]=Ua[1]=Xa[0]=Xa[1]=-Number.MAX_VALUE;var t,e=this.data,n=0,i=0,r=0,a=0;for(t=0;t<this._len;){var o=e[t++],s=1===t;switch(s&&(r=n=e[t],a=i=e[t+1]),o){case Va.M:n=r=e[t++],i=a=e[t++],Ya[0]=r,Ya[1]=a,Xa[0]=r,Xa[1]=a;break;case Va.L:Ra(n,i,e[t],e[t+1],Ya,Xa),n=e[t++],i=e[t++];break;case Va.C:Ba(n,i,e[t++],e[t++],e[t++],e[t++],e[t],e[t+1],Ya,Xa),n=e[t++],i=e[t++];break;case Va.Q:za(n,i,e[t++],e[t++],e[t],e[t+1],Ya,Xa),n=e[t++],i=e[t++];break;case Va.A:var l=e[t++],u=e[t++],h=e[t++],c=e[t++],p=e[t++],f=e[t++]+p;t+=1;var d=!e[t++];s&&(r=Za(p)*h+l,a=Ka(p)*c+u),Fa(l,u,h,c,p,f,d,Ya,Xa),n=Za(f)*h+l,i=Ka(f)*c+u;break;case Va.R:Ra(r=n=e[t++],a=i=e[t++],r+e[t++],a+e[t++],Ya,Xa);break;case Va.Z:n=r,i=a}It(Wa,Wa,Ya),kt(Ua,Ua,Xa)}return 0===t&&(Wa[0]=Wa[1]=Ua[0]=Ua[1]=0),new bn(Wa[0],Wa[1],Ua[0]-Wa[0],Ua[1]-Wa[1])},t.prototype._calculateLength=function(){var t=this.data,e=this._len,n=this._ux,i=this._uy,r=0,a=0,o=0,s=0;this._pathSegLen||(this._pathSegLen=[]);for(var l=this._pathSegLen,u=0,h=0,c=0;c<e;){var p=t[c++],f=1===c;f&&(o=r=t[c],s=a=t[c+1]);var d=-1;switch(p){case Va.M:r=o=t[c++],a=s=t[c++];break;case Va.L:var g=t[c++],y=(_=t[c++])-a;(Ja(I=g-r)>n||Ja(y)>i||c===e-1)&&(d=Math.sqrt(I*I+y*y),r=g,a=_);break;case Va.C:var v=t[c++],m=t[c++],_=(g=t[c++],t[c++]),x=t[c++],b=t[c++];d=ma(r,a,v,m,g,_,x,b,10),r=x,a=b;break;case Va.Q:d=Ma(r,a,v=t[c++],m=t[c++],g=t[c++],_=t[c++],10),r=g,a=_;break;case Va.A:var w=t[c++],S=t[c++],M=t[c++],T=t[c++],C=t[c++],A=t[c++],D=A+C;c+=1;t[c++];f&&(o=Za(C)*M+w,s=Ka(C)*T+S),d=ja(M,T)*qa(to,Math.abs(A)),r=Za(D)*M+w,a=Ka(D)*T+S;break;case Va.R:o=r=t[c++],s=a=t[c++],d=2*t[c++]+2*t[c++];break;case Va.Z:var I=o-r;y=s-a;d=Math.sqrt(I*I+y*y),r=o,a=s}d>=0&&(l[h++]=d,u+=d)}return this._pathLen=u,u},t.prototype.rebuildPath=function(t,e){var n,i,r,a,o,s,l,u,h=this.data,c=this._ux,p=this._uy,f=this._len,d=e<1,g=0,y=0;if(!d||(this._pathSegLen||this._calculateLength(),l=this._pathSegLen,u=e*this._pathLen))t:for(var v=0;v<f;){var m=h[v++],_=1===v;switch(_&&(n=r=h[v],i=a=h[v+1]),m){case Va.M:n=r=h[v++],i=a=h[v++],t.moveTo(r,a);break;case Va.L:if(o=h[v++],s=h[v++],Ja(o-r)>c||Ja(s-a)>p||v===f-1){if(d){if(g+(G=l[y++])>u){var x=(u-g)/G;t.lineTo(r*(1-x)+o*x,a*(1-x)+s*x);break t}g+=G}t.lineTo(o,s),r=o,a=s}break;case Va.C:var b=h[v++],w=h[v++],S=h[v++],M=h[v++],T=h[v++],C=h[v++];if(d){if(g+(G=l[y++])>u){ya(r,b,S,T,x=(u-g)/G,Ha),ya(a,w,M,C,x,Ga),t.bezierCurveTo(Ha[1],Ga[1],Ha[2],Ga[2],Ha[3],Ga[3]);break t}g+=G}t.bezierCurveTo(b,w,S,M,T,C),r=T,a=C;break;case Va.Q:b=h[v++],w=h[v++],S=h[v++],M=h[v++];if(d){if(g+(G=l[y++])>u){wa(r,b,S,x=(u-g)/G,Ha),wa(a,w,M,x,Ga),t.quadraticCurveTo(Ha[1],Ga[1],Ha[2],Ga[2]);break t}g+=G}t.quadraticCurveTo(b,w,S,M),r=S,a=M;break;case Va.A:var A=h[v++],D=h[v++],I=h[v++],k=h[v++],L=h[v++],P=h[v++],O=h[v++],R=!h[v++],N=I>k?I:k,E=Ja(I-k)>.001,B=L+P,z=!1;if(d)g+(G=l[y++])>u&&(B=L+P*(u-g)/G,z=!0),g+=G;if(E&&t.ellipse?t.ellipse(A,D,I,k,O,L,B,R):t.arc(A,D,N,L,B,R),z)break t;_&&(n=Za(L)*I+A,i=Ka(L)*k+D),r=Za(B)*I+A,a=Ka(B)*k+D;break;case Va.R:n=r=h[v],i=a=h[v+1],o=h[v++],s=h[v++];var F=h[v++],V=h[v++];if(d){if(g+(G=l[y++])>u){var H=u-g;t.moveTo(o,s),t.lineTo(o+qa(H,F),s),(H-=F)>0&&t.lineTo(o+F,s+qa(H,V)),(H-=V)>0&&t.lineTo(o+ja(F-H,0),s+V),(H-=F)>0&&t.lineTo(o,s+ja(V-H,0));break t}g+=G}t.rect(o,s,F,V);break;case Va.Z:if(d){var G;if(g+(G=l[y++])>u){x=(u-g)/G;t.lineTo(r*(1-x)+n*x,a*(1-x)+i*x);break t}g+=G}t.closePath(),r=n,a=i}}},t.CMD=Va,t.initDefaultProps=function(){var e=t.prototype;e._saveData=!0,e._needsDash=!1,e._dashOffset=0,e._dashIdx=0,e._dashSum=0,e._ux=0,e._uy=0}(),t}();function oo(t,e,n,i,r,a,o){if(0===r)return!1;var s=r,l=0;if(o>e+s&&o>i+s||o<e-s&&o<i-s||a>t+s&&a>n+s||a<t-s&&a<n-s)return!1;if(t===n)return Math.abs(a-t)<=s/2;var u=(l=(e-i)/(t-n))*a-o+(t*i-n*e)/(t-n);return u*u/(l*l+1)<=s/2*s/2}function so(t,e,n,i,r,a,o,s,l,u,h){if(0===l)return!1;var c=l;return!(h>e+c&&h>i+c&&h>a+c&&h>s+c||h<e-c&&h<i-c&&h<a-c&&h<s-c||u>t+c&&u>n+c&&u>r+c&&u>o+c||u<t-c&&u<n-c&&u<r-c&&u<o-c)&&va(t,e,n,i,r,a,o,s,u,h,null)<=c/2}function lo(t,e,n,i,r,a,o,s,l){if(0===o)return!1;var u=o;return!(l>e+u&&l>i+u&&l>a+u||l<e-u&&l<i-u&&l<a-u||s>t+u&&s>n+u&&s>r+u||s<t-u&&s<n-u&&s<r-u)&&Sa(t,e,n,i,r,a,s,l,null)<=u/2}var uo=2*Math.PI;function ho(t){return(t%=uo)<0&&(t+=uo),t}var co=2*Math.PI;function po(t,e,n,i,r,a,o,s,l){if(0===o)return!1;var u=o;s-=t,l-=e;var h=Math.sqrt(s*s+l*l);if(h-u>n||h+u<n)return!1;if(Math.abs(i-r)%co<1e-4)return!0;if(a){var c=i;i=ho(r),r=ho(c)}else i=ho(i),r=ho(r);i>r&&(r+=co);var p=Math.atan2(l,s);return p<0&&(p+=co),p>=i&&p<=r||p+co>=i&&p+co<=r}function fo(t,e,n,i,r,a){if(a>e&&a>i||a<e&&a<i)return 0;if(i===e)return 0;var o=(a-e)/(i-e),s=i<e?1:-1;1!==o&&0!==o||(s=i<e?.5:-.5);var l=o*(n-t)+t;return l===r?1/0:l>r?s:0}var go=ao.CMD,yo=2*Math.PI;var vo=[-1,-1,-1],mo=[-1,-1];function _o(t,e,n,i,r,a,o,s,l,u){if(u>e&&u>i&&u>a&&u>s||u<e&&u<i&&u<a&&u<s)return 0;var h,c=da(e,i,a,s,u,vo);if(0===c)return 0;for(var p=0,f=-1,d=void 0,g=void 0,y=0;y<c;y++){var v=vo[y],m=0===v||1===v?.5:1;pa(t,n,r,o,v)<l||(f<0&&(f=ga(e,i,a,s,mo),mo[1]<mo[0]&&f>1&&(h=void 0,h=mo[0],mo[0]=mo[1],mo[1]=h),d=pa(e,i,a,s,mo[0]),f>1&&(g=pa(e,i,a,s,mo[1]))),2===f?v<mo[0]?p+=d<e?m:-m:v<mo[1]?p+=g<d?m:-m:p+=s<g?m:-m:v<mo[0]?p+=d<e?m:-m:p+=s<d?m:-m)}return p}function xo(t,e,n,i,r,a,o,s){if(s>e&&s>i&&s>a||s<e&&s<i&&s<a)return 0;var l=function(t,e,n,i,r){var a=t-2*e+n,o=2*(e-t),s=t-i,l=0;if(ha(a))ca(o)&&(h=-s/o)>=0&&h<=1&&(r[l++]=h);else{var u=o*o-4*a*s;if(ha(u))(h=-o/(2*a))>=0&&h<=1&&(r[l++]=h);else if(u>0){var h,c=na(u),p=(-o-c)/(2*a);(h=(-o+c)/(2*a))>=0&&h<=1&&(r[l++]=h),p>=0&&p<=1&&(r[l++]=p)}}return l}(e,i,a,s,vo);if(0===l)return 0;var u=ba(e,i,a);if(u>=0&&u<=1){for(var h=0,c=_a(e,i,a,u),p=0;p<l;p++){var f=0===vo[p]||1===vo[p]?.5:1;_a(t,n,r,vo[p])<o||(vo[p]<u?h+=c<e?f:-f:h+=a<c?f:-f)}return h}f=0===vo[0]||1===vo[0]?.5:1;return _a(t,n,r,vo[0])<o?0:a<e?f:-f}function bo(t,e,n,i,r,a,o,s){if((s-=e)>n||s<-n)return 0;var l=Math.sqrt(n*n-s*s);vo[0]=-l,vo[1]=l;var u=Math.abs(i-r);if(u<1e-4)return 0;if(u>=yo-1e-4){i=0,r=yo;var h=a?1:-1;return o>=vo[0]+t&&o<=vo[1]+t?h:0}if(i>r){var c=i;i=r,r=c}i<0&&(i+=yo,r+=yo);for(var p=0,f=0;f<2;f++){var d=vo[f];if(d+t>o){var g=Math.atan2(s,d);h=a?1:-1;g<0&&(g=yo+g),(g>=i&&g<=r||g+yo>=i&&g+yo<=r)&&(g>Math.PI/2&&g<1.5*Math.PI&&(h=-h),p+=h)}}return p}function wo(t,e,n,i,r){for(var a,o,s,l,u=t.data,h=t.len(),c=0,p=0,f=0,d=0,g=0,y=0;y<h;){var v=u[y++],m=1===y;switch(v===go.M&&y>1&&(n||(c+=fo(p,f,d,g,i,r))),m&&(d=p=u[y],g=f=u[y+1]),v){case go.M:p=d=u[y++],f=g=u[y++];break;case go.L:if(n){if(oo(p,f,u[y],u[y+1],e,i,r))return!0}else c+=fo(p,f,u[y],u[y+1],i,r)||0;p=u[y++],f=u[y++];break;case go.C:if(n){if(so(p,f,u[y++],u[y++],u[y++],u[y++],u[y],u[y+1],e,i,r))return!0}else c+=_o(p,f,u[y++],u[y++],u[y++],u[y++],u[y],u[y+1],i,r)||0;p=u[y++],f=u[y++];break;case go.Q:if(n){if(lo(p,f,u[y++],u[y++],u[y],u[y+1],e,i,r))return!0}else c+=xo(p,f,u[y++],u[y++],u[y],u[y+1],i,r)||0;p=u[y++],f=u[y++];break;case go.A:var _=u[y++],x=u[y++],b=u[y++],w=u[y++],S=u[y++],M=u[y++];y+=1;var T=!!(1-u[y++]);a=Math.cos(S)*b+_,o=Math.sin(S)*w+x,m?(d=a,g=o):c+=fo(p,f,a,o,i,r);var C=(i-_)*w/b+_;if(n){if(po(_,x,w,S,S+M,T,e,C,r))return!0}else c+=bo(_,x,w,S,S+M,T,C,r);p=Math.cos(S+M)*b+_,f=Math.sin(S+M)*w+x;break;case go.R:if(d=p=u[y++],g=f=u[y++],a=d+u[y++],o=g+u[y++],n){if(oo(d,g,a,g,e,i,r)||oo(a,g,a,o,e,i,r)||oo(a,o,d,o,e,i,r)||oo(d,o,d,g,e,i,r))return!0}else c+=fo(a,g,a,o,i,r),c+=fo(d,o,d,g,i,r);break;case go.Z:if(n){if(oo(p,f,d,g,e,i,r))return!0}else c+=fo(p,f,d,g,i,r);p=d,f=g}}return n||(s=f,l=g,Math.abs(s-l)<1e-4)||(c+=fo(p,f,d,g,i,r)||0),0!==c}var So=T({fill:"#000",stroke:null,strokePercent:1,fillOpacity:1,strokeOpacity:1,lineDashOffset:0,lineWidth:1,lineCap:"butt",miterLimit:10,strokeNoScale:!1,strokeFirst:!1},Zr),Mo={style:T({fill:!0,stroke:!0,strokePercent:!0,fillOpacity:!0,strokeOpacity:!0,lineDashOffset:!0,lineWidth:!0,miterLimit:!0},Kr.style)},To=["x","y","rotation","scaleX","scaleY","originX","originY","invisible","culling","z","z2","zlevel","parent"],Co=function(t){function e(e){return t.call(this,e)||this}var i;return n(e,t),e.prototype.update=function(){var n=this;t.prototype.update.call(this);var i=this.style;if(i.decal){var r=this._decalEl=this._decalEl||new e;r.buildPath===e.prototype.buildPath&&(r.buildPath=function(t){n.buildPath(t,n.shape)}),r.silent=!0;var a=r.style;for(var o in i)a[o]!==i[o]&&(a[o]=i[o]);a.fill=i.fill?i.decal:null,a.decal=null,a.shadowColor=null,i.strokeFirst&&(a.stroke=null);for(var s=0;s<To.length;++s)r[To[s]]=this[To[s]];r.__dirty|=Gn.REDARAW_BIT}else this._decalEl&&(this._decalEl=null)},e.prototype.getDecalElement=function(){return this._decalEl},e.prototype._init=function(e){var n=N(e);this.shape=this.getDefaultShape();var i=this.getDefaultStyle();i&&this.useStyle(i);for(var r=0;r<n.length;r++){var a=n[r],o=e[a];"style"===a?this.style?M(this.style,o):this.useStyle(o):"shape"===a?M(this.shape,o):t.prototype.attrKV.call(this,a,o)}this.style||this.useStyle({})},e.prototype.getDefaultStyle=function(){return null},e.prototype.getDefaultShape=function(){return{}},e.prototype.canBeInsideText=function(){return this.hasFill()},e.prototype.getInsideTextFill=function(){var t=this.style.fill;if("none"!==t){if(V(t)){var e=qe(t,0);return e>.5?Nn:e>.2?"#eee":En}if(t)return En}return Nn},e.prototype.getInsideTextStroke=function(t){var e=this.style.fill;if(V(e)){var n=this.__zr;if(!(!n||!n.isDarkMode())===qe(t,0)<.4)return e}},e.prototype.buildPath=function(t,e,n){},e.prototype.pathUpdated=function(){this.__dirty&=~e.SHAPE_CHANGED_BIT},e.prototype.createPathProxy=function(){this.path=new ao(!1)},e.prototype.hasStroke=function(){var t=this.style,e=t.stroke;return!(null==e||"none"===e||!(t.lineWidth>0))},e.prototype.hasFill=function(){var t=this.style.fill;return null!=t&&"none"!==t},e.prototype.getBoundingRect=function(){var t=this._rect,n=this.style,i=!t;if(i){var r=!1;this.path||(r=!0,this.createPathProxy());var a=this.path;(r||this.__dirty&e.SHAPE_CHANGED_BIT)&&(a.beginPath(),this.buildPath(a,this.shape,!1),this.pathUpdated()),t=a.getBoundingRect()}if(this._rect=t,this.hasStroke()&&this.path&&this.path.len()>0){var o=this._rectWithStroke||(this._rectWithStroke=t.clone());if(this.__dirty||i){o.copy(t);var s=n.strokeNoScale?this.getLineScale():1,l=n.lineWidth;if(!this.hasFill()){var u=this.strokeContainThreshold;l=Math.max(l,null==u?4:u)}s>1e-10&&(o.width+=l/s,o.height+=l/s,o.x-=l/s/2,o.y-=l/s/2)}return o}return t},e.prototype.contain=function(t,e){var n=this.transformCoordToLocal(t,e),i=this.getBoundingRect(),r=this.style;if(t=n[0],e=n[1],i.contain(t,e)){var a=this.path;if(this.hasStroke()){var o=r.lineWidth,s=r.strokeNoScale?this.getLineScale():1;if(s>1e-10&&(this.hasFill()||(o=Math.max(o,this.strokeContainThreshold)),function(t,e,n,i){return wo(t,e,!0,n,i)}(a,o/s,t,e)))return!0}if(this.hasFill())return function(t,e,n){return wo(t,0,!1,e,n)}(a,t,e)}return!1},e.prototype.dirtyShape=function(){this.__dirty|=e.SHAPE_CHANGED_BIT,this._rect&&(this._rect=null),this._decalEl&&this._decalEl.dirtyShape(),this.markRedraw()},e.prototype.dirty=function(){this.dirtyStyle(),this.dirtyShape()},e.prototype.animateShape=function(t){return this.animate("shape",t)},e.prototype.updateDuringAnimation=function(t){"style"===t?this.dirtyStyle():"shape"===t?this.dirtyShape():this.markRedraw()},e.prototype.attrKV=function(e,n){"shape"===e?this.setShape(n):t.prototype.attrKV.call(this,e,n)},e.prototype.setShape=function(t,e){var n=this.shape;return n||(n=this.shape={}),"string"==typeof t?n[t]=e:M(n,t),this.dirtyShape(),this},e.prototype.shapeChanged=function(){return!!(this.__dirty&e.SHAPE_CHANGED_BIT)},e.prototype.createStyle=function(t){return ut(So,t)},e.prototype._innerSaveToNormal=function(e){t.prototype._innerSaveToNormal.call(this,e);var n=this._normalState;e.shape&&!n.shape&&(n.shape=M({},this.shape))},e.prototype._applyStateObj=function(e,n,i,r,a,o){t.prototype._applyStateObj.call(this,e,n,i,r,a,o);var s,l=!(n&&r);if(n&&n.shape?a?r?s=n.shape:(s=M({},i.shape),M(s,n.shape)):(s=M({},r?this.shape:i.shape),M(s,n.shape)):l&&(s=i.shape),s)if(a){this.shape=M({},this.shape);for(var u={},h=N(s),c=0;c<h.length;c++){var p=h[c];"object"==typeof s[p]?this.shape[p]=s[p]:u[p]=s[p]}this._transitionState(e,{shape:u},o)}else this.shape=s,this.dirtyShape()},e.prototype._mergeStates=function(e){for(var n,i=t.prototype._mergeStates.call(this,e),r=0;r<e.length;r++){var a=e[r];a.shape&&(n=n||{},this._mergeStyle(n,a.shape))}return n&&(i.shape=n),i},e.prototype.getAnimationStyleProps=function(){return Mo},e.prototype.isZeroArea=function(){return!1},e.extend=function(t){var i=function(e){function i(n){var i=e.call(this,n)||this;return t.init&&t.init.call(i,n),i}return n(i,e),i.prototype.getDefaultStyle=function(){return w(t.style)},i.prototype.getDefaultShape=function(){return w(t.shape)},i}(e);for(var r in t)"function"==typeof t[r]&&(i.prototype[r]=t[r]);return i},e.SHAPE_CHANGED_BIT=4,e.initDefaultProps=((i=e.prototype).type="path",i.strokeContainThreshold=5,i.segmentIgnoreThreshold=0,i.subPixelOptimize=!1,i.autoBatch=!1,void(i.__dirty=Gn.REDARAW_BIT|Jr.STYLE_CHANGED_BIT|e.SHAPE_CHANGED_BIT)),e}(Jr),Ao=T({strokeFirst:!0,font:Sn,x:0,y:0,textAlign:"left",textBaseline:"top",miterLimit:2},So),Do=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.hasStroke=function(){var t=this.style,e=t.stroke;return null!=e&&"none"!==e&&t.lineWidth>0},e.prototype.hasFill=function(){var t=this.style.fill;return null!=t&&"none"!==t},e.prototype.createStyle=function(t){return ut(Ao,t)},e.prototype.setBoundingRect=function(t){this._rect=t},e.prototype.getBoundingRect=function(){var t=this.style;if(!this._rect){var e=t.text;null!=e?e+="":e="";var n=An(e,t.font,t.textAlign,t.textBaseline);if(n.x+=t.x||0,n.y+=t.y||0,this.hasStroke()){var i=t.lineWidth;n.x-=i/2,n.y-=i/2,n.width+=i,n.height+=i}this._rect=n}return this._rect},e.initDefaultProps=void(e.prototype.dirtyRectTolerance=10),e}(Jr);Do.prototype.type="tspan";var Io=T({x:0,y:0},Zr),ko={style:T({x:!0,y:!0,width:!0,height:!0,sx:!0,sy:!0,sWidth:!0,sHeight:!0},Kr.style)};var Lo=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.createStyle=function(t){return ut(Io,t)},e.prototype._getSize=function(t){var e=this.style,n=e[t];if(null!=n)return n;var i,r=(i=e.image)&&"string"!=typeof i&&i.width&&i.height?e.image:this.__image;if(!r)return 0;var a="width"===t?"height":"width",o=e[a];return null==o?r[t]:r[t]/r[a]*o},e.prototype.getWidth=function(){return this._getSize("width")},e.prototype.getHeight=function(){return this._getSize("height")},e.prototype.getAnimationStyleProps=function(){return ko},e.prototype.getBoundingRect=function(){var t=this.style;return this._rect||(this._rect=new bn(t.x||0,t.y||0,this.getWidth(),this.getHeight())),this._rect},e}(Jr);Lo.prototype.type="image";var Po=Math.round;function Oo(t,e,n){if(!e)return t;var i=Po(2*t);return(i+Po(e))%2==0?i/2:(i+(n?1:-1))/2}var Ro=function(){this.x=0,this.y=0,this.width=0,this.height=0},No={},Eo=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultShape=function(){return new Ro},e.prototype.buildPath=function(t,e){var n,i,r,a;if(this.subPixelOptimize){var o=function(t,e,n){if(e){var i=e.x,r=e.y,a=e.width,o=e.height;t.x=i,t.y=r,t.width=a,t.height=o;var s=n&&n.lineWidth;return s?(t.x=Oo(i,s,!0),t.y=Oo(r,s,!0),t.width=Math.max(Oo(i+a,s,!1)-t.x,0===a?0:1),t.height=Math.max(Oo(r+o,s,!1)-t.y,0===o?0:1),t):t}}(No,e,this.style);n=o.x,i=o.y,r=o.width,a=o.height,o.r=e.r,e=o}else n=e.x,i=e.y,r=e.width,a=e.height;e.r?function(t,e){var n,i,r,a,o,s=e.x,l=e.y,u=e.width,h=e.height,c=e.r;u<0&&(s+=u,u=-u),h<0&&(l+=h,h=-h),"number"==typeof c?n=i=r=a=c:c instanceof Array?1===c.length?n=i=r=a=c[0]:2===c.length?(n=r=c[0],i=a=c[1]):3===c.length?(n=c[0],i=a=c[1],r=c[2]):(n=c[0],i=c[1],r=c[2],a=c[3]):n=i=r=a=0,n+i>u&&(n*=u/(o=n+i),i*=u/o),r+a>u&&(r*=u/(o=r+a),a*=u/o),i+r>h&&(i*=h/(o=i+r),r*=h/o),n+a>h&&(n*=h/(o=n+a),a*=h/o),t.moveTo(s+n,l),t.lineTo(s+u-i,l),0!==i&&t.arc(s+u-i,l+i,i,-Math.PI/2,0),t.lineTo(s+u,l+h-r),0!==r&&t.arc(s+u-r,l+h-r,r,0,Math.PI/2),t.lineTo(s+a,l+h),0!==a&&t.arc(s+a,l+h-a,a,Math.PI/2,Math.PI),t.lineTo(s,l+n),0!==n&&t.arc(s+n,l+n,n,Math.PI,1.5*Math.PI)}(t,e):t.rect(n,i,r,a)},e.prototype.isZeroArea=function(){return!this.shape.width||!this.shape.height},e}(Co);Eo.prototype.type="rect";var Bo={fill:"#000"},zo={style:T({fill:!0,stroke:!0,fillOpacity:!0,strokeOpacity:!0,lineWidth:!0,fontSize:!0,lineHeight:!0,width:!0,height:!0,textShadowColor:!0,textShadowBlur:!0,textShadowOffsetX:!0,textShadowOffsetY:!0,backgroundColor:!0,padding:!0,borderColor:!0,borderWidth:!0,borderRadius:!0},Kr.style)},Fo=function(t){function e(e){var n=t.call(this)||this;return n.type="text",n._children=[],n._defaultStyle=Bo,n.attr(e),n}return n(e,t),e.prototype.childrenRef=function(){return this._children},e.prototype.update=function(){this.styleChanged()&&this._updateSubTexts();for(var e=0;e<this._children.length;e++){var n=this._children[e];n.zlevel=this.zlevel,n.z=this.z,n.z2=this.z2,n.culling=this.culling,n.cursor=this.cursor,n.invisible=this.invisible}var i=this.attachedTransform;if(i){i.updateTransform();var r=i.transform;r?(this.transform=this.transform||[],se(this.transform,r)):this.transform=null}else t.prototype.update.call(this)},e.prototype.getComputedTransform=function(){return this.__hostTarget&&(this.__hostTarget.getComputedTransform(),this.__hostTarget.updateInnerText(!0)),this.attachedTransform?this.attachedTransform.getComputedTransform():t.prototype.getComputedTransform.call(this)},e.prototype._updateSubTexts=function(){var t;this._childCursor=0,Go(t=this.style),L(t.rich,Go),this.style.rich?this._updateRichTexts():this._updatePlainTexts(),this._children.length=this._childCursor,this.styleUpdated()},e.prototype.addSelfToZr=function(e){t.prototype.addSelfToZr.call(this,e);for(var n=0;n<this._children.length;n++)this._children[n].__zr=e},e.prototype.removeSelfFromZr=function(e){t.prototype.removeSelfFromZr.call(this,e);for(var n=0;n<this._children.length;n++)this._children[n].__zr=null},e.prototype.getBoundingRect=function(){if(this.styleChanged()&&this._updateSubTexts(),!this._rect){for(var t=new bn(0,0,0,0),e=this._children,n=[],i=null,r=0;r<e.length;r++){var a=e[r],o=a.getBoundingRect(),s=a.getLocalTransform(n);s?(t.copy(o),t.applyTransform(s),(i=i||t.clone()).union(t)):(i=i||o.clone()).union(o)}this._rect=i||t}return this._rect},e.prototype.setDefaultTextStyle=function(t){this._defaultStyle=t||Bo},e.prototype.setTextContent=function(t){throw new Error("Can't attach text on another text")},e.prototype._mergeStyle=function(t,e){if(!e)return t;var n=e.rich,i=t.rich||n&&{};return M(t,e),n&&i?(this._mergeRich(i,n),t.rich=i):i&&(t.rich=i),t},e.prototype._mergeRich=function(t,e){for(var n=N(e),i=0;i<n.length;i++){var r=n[i];t[r]=t[r]||{},M(t[r],e[r])}},e.prototype.getAnimationStyleProps=function(){return zo},e.prototype._getOrCreateChild=function(t){var e=this._children[this._childCursor];return e&&e instanceof t||(e=new t),this._children[this._childCursor++]=e,e.__zr=this.__zr,e.parent=this,e},e.prototype._updatePlainTexts=function(){var t=this.style,e=t.font||Sn,n=t.padding,i=function(t,e){null!=t&&(t+="");var n,i=e.overflow,r=e.padding,a=e.font,o="truncate"===i,s=kn(a),l=J(e.lineHeight,s),u="truncate"===e.lineOverflow,h=e.width,c=(n=null!=h&&"break"===i||"breakAll"===i?t?qr(t,e.font,h,"breakAll"===i,0).lines:[]:t?t.split("\n"):[]).length*l,p=J(e.height,c);if(c>p&&u){var f=Math.floor(p/l);n=n.slice(0,f)}var d=p,g=h;if(r&&(d+=r[0]+r[2],null!=g&&(g+=r[1]+r[3])),t&&o&&null!=g)for(var y=zr(h,a,e.ellipsis,{minChar:e.truncateMinChar,placeholder:e.placeholder}),v=0;v<n.length;v++)n[v]=Fr(n[v],y);if(null==h){var m=0;for(v=0;v<n.length;v++)m=Math.max(Tn(n[v],a),m);h=m}return{lines:n,height:p,outerHeight:d,lineHeight:l,calculatedLineHeight:s,contentHeight:c,width:h}}(Yo(t),t),r=Xo(t),a=!!t.backgroundColor,o=i.outerHeight,s=i.lines,l=i.lineHeight,u=this._defaultStyle,h=t.x||0,c=t.y||0,p=t.align||u.align||"left",f=t.verticalAlign||u.verticalAlign||"top",d=h,g=In(c,i.contentHeight,f);if(r||n){var y=i.width;n&&(y+=n[1]+n[3]);var v=Dn(h,y,p),m=In(c,o,f);r&&this._renderBackground(t,t,v,m,y,o)}g+=l/2,n&&(d=Uo(h,p,n),"top"===f?g+=n[0]:"bottom"===f&&(g-=n[2]));for(var _,x=0,b=!1,w=(null==(_="fill"in t?t.fill:(b=!0,u.fill))||"none"===_?null:_.image||_.colorStops?"#000":_),S=(Wo("stroke"in t?t.stroke:a||u.autoStroke&&!b?null:(x=2,u.stroke))),M=t.textShadowBlur>0,T=null!=t.width&&("truncate"===t.overflow||"break"===t.overflow||"breakAll"===t.overflow),C=i.calculatedLineHeight,A=0;A<s.length;A++){var D=this._getOrCreateChild(Do),I=D.createStyle();D.useStyle(I),I.text=s[A],I.x=d,I.y=g,p&&(I.textAlign=p),I.textBaseline="middle",I.opacity=t.opacity,I.strokeFirst=!0,M&&(I.shadowBlur=t.textShadowBlur||0,I.shadowColor=t.textShadowColor||"transparent",I.shadowOffsetX=t.textShadowOffsetX||0,I.shadowOffsetY=t.textShadowOffsetY||0),S&&(I.stroke=S,I.lineWidth=t.lineWidth||x,I.lineDash=t.lineDash,I.lineDashOffset=t.lineDashOffset||0),w&&(I.fill=w),I.font=e,g+=l,T&&D.setBoundingRect(new bn(Dn(I.x,t.width,I.textAlign),In(I.y,C,I.textBaseline),t.width,C))}},e.prototype._updateRichTexts=function(){var t=this.style,e=function(t,e){var n=new Wr;if(null!=t&&(t+=""),!t)return n;for(var i,r=e.width,a=e.height,o=e.overflow,s="break"!==o&&"breakAll"!==o||null==r?null:{width:r,accumWidth:0,breakAll:"breakAll"===o},l=Er.lastIndex=0;null!=(i=Er.exec(t));){var u=i.index;u>l&&Ur(n,t.substring(l,u),e,s),Ur(n,i[2],e,s,i[1]),l=Er.lastIndex}l<t.length&&Ur(n,t.substring(l,t.length),e,s);var h=[],c=0,p=0,f=e.padding,d="truncate"===o,g="truncate"===e.lineOverflow;function y(t,e,n){t.width=e,t.lineHeight=n,c+=n,p=Math.max(p,e)}t:for(var v=0;v<n.lines.length;v++){for(var m=n.lines[v],_=0,x=0,b=0;b<m.tokens.length;b++){var w=(P=m.tokens[b]).styleName&&e.rich[P.styleName]||{},S=P.textPadding=w.padding,M=S?S[1]+S[3]:0,T=P.font=w.font||e.font;P.contentHeight=kn(T);var C=J(w.height,P.contentHeight);if(P.innerHeight=C,S&&(C+=S[0]+S[2]),P.height=C,P.lineHeight=Q(w.lineHeight,e.lineHeight,C),P.align=w&&w.align||e.align,P.verticalAlign=w&&w.verticalAlign||"middle",g&&null!=a&&c+P.lineHeight>a){b>0?(m.tokens=m.tokens.slice(0,b),y(m,x,_),n.lines=n.lines.slice(0,v+1)):n.lines=n.lines.slice(0,v);break t}var A=w.width,D=null==A||"auto"===A;if("string"==typeof A&&"%"===A.charAt(A.length-1))P.percentWidth=A,h.push(P),P.contentWidth=Tn(P.text,T);else{if(D){var I=w.backgroundColor,k=I&&I.image;k&&Nr(k=Pr(k))&&(P.width=Math.max(P.width,k.width*C/k.height))}var L=d&&null!=r?r-x:null;null!=L&&L<P.width?!D||L<M?(P.text="",P.width=P.contentWidth=0):(P.text=Br(P.text,L-M,T,e.ellipsis,{minChar:e.truncateMinChar}),P.width=P.contentWidth=Tn(P.text,T)):P.contentWidth=Tn(P.text,T)}P.width+=M,x+=P.width,w&&(_=Math.max(_,P.lineHeight))}y(m,x,_)}for(n.outerWidth=n.width=J(r,p),n.outerHeight=n.height=J(a,c),n.contentHeight=c,n.contentWidth=p,f&&(n.outerWidth+=f[1]+f[3],n.outerHeight+=f[0]+f[2]),v=0;v<h.length;v++){var P,O=(P=h[v]).percentWidth;P.width=parseInt(O,10)/100*n.width}return n}(Yo(t),t),n=e.width,i=e.outerWidth,r=e.outerHeight,a=t.padding,o=t.x||0,s=t.y||0,l=this._defaultStyle,u=t.align||l.align,h=t.verticalAlign||l.verticalAlign,c=Dn(o,i,u),p=In(s,r,h),f=c,d=p;a&&(f+=a[3],d+=a[0]);var g=f+n;Xo(t)&&this._renderBackground(t,t,c,p,i,r);for(var y=!!t.backgroundColor,v=0;v<e.lines.length;v++){for(var m=e.lines[v],_=m.tokens,x=_.length,b=m.lineHeight,w=m.width,S=0,M=f,T=g,C=x-1,A=void 0;S<x&&(!(A=_[S]).align||"left"===A.align);)this._placeToken(A,t,b,d,M,"left",y),w-=A.width,M+=A.width,S++;for(;C>=0&&"right"===(A=_[C]).align;)this._placeToken(A,t,b,d,T,"right",y),w-=A.width,T-=A.width,C--;for(M+=(n-(M-f)-(g-T)-w)/2;S<=C;)A=_[S],this._placeToken(A,t,b,d,M+A.width/2,"center",y),M+=A.width,S++;d+=b}},e.prototype._placeToken=function(t,e,n,i,r,a,o){var s=e.rich[t.styleName]||{};s.text=t.text;var l=t.verticalAlign,u=i+n/2;"top"===l?u=i+t.height/2:"bottom"===l&&(u=i+n-t.height/2),!t.isLineHolder&&Xo(s)&&this._renderBackground(s,e,"right"===a?r-t.width:"center"===a?r-t.width/2:r,u-t.height/2,t.width,t.height);var h=!!s.backgroundColor,c=t.textPadding;c&&(r=Uo(r,a,c),u-=t.height/2-c[0]-t.innerHeight/2);var p=this._getOrCreateChild(Do),f=p.createStyle();p.useStyle(f);var d=this._defaultStyle,g=!1,y=0,v=Wo("fill"in s?s.fill:"fill"in e?e.fill:(g=!0,d.fill)),m=Wo("stroke"in s?s.stroke:"stroke"in e?e.stroke:h||o||d.autoStroke&&!g?null:(y=2,d.stroke)),_=s.textShadowBlur>0||e.textShadowBlur>0;f.text=t.text,f.x=r,f.y=u,_&&(f.shadowBlur=s.textShadowBlur||e.textShadowBlur||0,f.shadowColor=s.textShadowColor||e.textShadowColor||"transparent",f.shadowOffsetX=s.textShadowOffsetX||e.textShadowOffsetX||0,f.shadowOffsetY=s.textShadowOffsetY||e.textShadowOffsetY||0),f.textAlign=a,f.textBaseline="middle",f.font=t.font||Sn,f.opacity=Q(s.opacity,e.opacity,1),m&&(f.lineWidth=Q(s.lineWidth,e.lineWidth,y),f.lineDash=J(s.lineDash,e.lineDash),f.lineDashOffset=e.lineDashOffset||0,f.stroke=m),v&&(f.fill=v);var x=t.contentWidth,b=t.contentHeight;p.setBoundingRect(new bn(Dn(f.x,x,f.textAlign),In(f.y,b,f.textBaseline),x,b))},e.prototype._renderBackground=function(t,e,n,i,r,a){var o,s,l,u=t.backgroundColor,h=t.borderWidth,c=t.borderColor,p=V(u),f=t.borderRadius,d=this;if(p||h&&c){(o=this._getOrCreateChild(Eo)).useStyle(o.createStyle()),o.style.fill=null;var g=o.shape;g.x=n,g.y=i,g.width=r,g.height=a,g.r=f,o.dirtyShape()}if(p)(l=o.style).fill=u||null,l.fillOpacity=J(t.fillOpacity,1);else if(u&&u.image){(s=this._getOrCreateChild(Lo)).onload=function(){d.dirtyStyle()};var y=s.style;y.image=u.image,y.x=n,y.y=i,y.width=r,y.height=a}h&&c&&((l=o.style).lineWidth=h,l.stroke=c,l.strokeOpacity=J(t.strokeOpacity,1),l.lineDash=t.borderDash,l.lineDashOffset=t.borderDashOffset||0,o.strokeContainThreshold=0,o.hasFill()&&o.hasStroke()&&(l.strokeFirst=!0,l.lineWidth*=2));var v=(o||s).style;v.shadowBlur=t.shadowBlur||0,v.shadowColor=t.shadowColor||"transparent",v.shadowOffsetX=t.shadowOffsetX||0,v.shadowOffsetY=t.shadowOffsetY||0,v.opacity=Q(t.opacity,e.opacity,1)},e.makeFont=function(t){var e="";if(t.fontSize||t.fontFamily||t.fontWeight){var n="";n="string"!=typeof t.fontSize||-1===t.fontSize.indexOf("px")&&-1===t.fontSize.indexOf("rem")&&-1===t.fontSize.indexOf("em")?isNaN(+t.fontSize)?"12px":t.fontSize+"px":t.fontSize,e=[t.fontStyle,t.fontWeight,n,t.fontFamily||"sans-serif"].join(" ")}return e&&it(e)||t.textFont||t.font},e}(Jr),Vo={left:!0,right:1,center:1},Ho={top:1,bottom:1,middle:1};function Go(t){if(t){t.font=Fo.makeFont(t);var e=t.align;"middle"===e&&(e="center"),t.align=null==e||Vo[e]?e:"left";var n=t.verticalAlign;"center"===n&&(n="middle"),t.verticalAlign=null==n||Ho[n]?n:"top",t.padding&&(t.padding=et(t.padding))}}function Wo(t,e){return null==t||e<=0||"transparent"===t||"none"===t?null:t.image||t.colorStops?"#000":t}function Uo(t,e,n){return"right"===e?t-n[1]:"center"===e?t+n[3]/2-n[1]/2:t+n[3]}function Yo(t){var e=t.text;return null!=e&&(e+=""),e}function Xo(t){return!!(t.backgroundColor||t.borderWidth&&t.borderColor)}var qo=hr(),jo=1,Zo={},Ko=hr(),$o=["emphasis","blur","select"],Jo=["normal","emphasis","blur","select"],Qo="highlight",ts="downplay",es="select",ns="unselect",is="toggleSelect";function rs(t){return null!=t&&"none"!==t}var as=new Ce(100);function os(t){if("string"!=typeof t)return t;var e=as.get(t);return e||(e=He(t,-.1),as.put(t,e)),e}function ss(t,e,n){t.onHoverStateChange&&(t.hoverState||0)!==n&&t.onHoverStateChange(e),t.hoverState=n}function ls(t){ss(t,"emphasis",2)}function us(t){2===t.hoverState&&ss(t,"normal",0)}function hs(t){ss(t,"blur",1)}function cs(t){1===t.hoverState&&ss(t,"normal",0)}function ps(t){t.selected=!0}function fs(t){t.selected=!1}function ds(t,e,n){e(t,n)}function gs(t,e,n){ds(t,e,n),t.isGroup&&t.traverse((function(t){ds(t,e,n)}))}function ys(t,e){switch(e){case"emphasis":t.hoverState=2;break;case"normal":t.hoverState=0;break;case"blur":t.hoverState=1;break;case"select":t.selected=!0}}function vs(t,e){var n=this.states[t];if(this.style){if("emphasis"===t)return function(t,e,n,i){var r=n&&A(n,"select")>=0,a=!1;if(t instanceof Co){var o=Ko(t),s=r&&o.selectFill||o.normalFill,l=r&&o.selectStroke||o.normalStroke;if(rs(s)||rs(l)){var u=(i=i||{}).style||{};!rs(u.fill)&&rs(s)?(a=!0,i=M({},i),(u=M({},u)).fill=os(s)):!rs(u.stroke)&&rs(l)&&(a||(i=M({},i),u=M({},u)),u.stroke=os(l)),i.style=u}}if(i&&null==i.z2){a||(i=M({},i));var h=t.z2EmphasisLift;i.z2=t.z2+(null!=h?h:10)}return i}(this,0,e,n);if("blur"===t)return function(t,e,n){var i=A(t.currentStates,e)>=0,r=t.style.opacity,a=i?null:function(t,e,n,i){for(var r=t.style,a={},o=0;o<e.length;o++){var s=e[o],l=r[s];a[s]=null==l?i&&i[s]:l}for(o=0;o<t.animators.length;o++){var u=t.animators[o];u.__fromStateTransition&&u.__fromStateTransition.indexOf(n)<0&&"style"===u.targetName&&u.saveFinalToTarget(a,e)}return a}(t,["opacity"],e,{opacity:1}),o=(n=n||{}).style||{};return null==o.opacity&&(n=M({},n),o=M({opacity:i?r:.1*a.opacity},o),n.style=o),n}(this,t,n);if("select"===t)return function(t,e,n){if(n&&null==n.z2){n=M({},n);var i=t.z2SelectLift;n.z2=t.z2+(null!=i?i:9)}return n}(this,0,n)}return n}function ms(t){t.stateProxy=vs;var e=t.getTextContent(),n=t.getTextGuideLine();e&&(e.stateProxy=vs),n&&(n.stateProxy=vs)}function _s(t,e){!Cs(t,e)&&!t.__highByOuter&&gs(t,ls)}function xs(t,e){!Cs(t,e)&&!t.__highByOuter&&gs(t,us)}function bs(t,e){t.__highByOuter|=1<<(e||0),gs(t,ls)}function ws(t,e){!(t.__highByOuter&=~(1<<(e||0)))&&gs(t,us)}function Ss(t){gs(t,cs)}function Ms(t){gs(t,ps)}function Ts(t){gs(t,fs)}function Cs(t,e){return t.__highDownSilentOnTouch&&e.zrByTouch}function As(t){t.getModel().eachComponent((function(e,n){("series"===e?t.getViewOfSeriesModel(n):t.getViewOfComponentModel(n)).group.traverse((function(t){cs(t)}))}))}function Ds(t,e,n,i){var r=i.getModel();function a(t,e){for(var n=0;n<e.length;n++){var i=t.getItemGraphicEl(e[n]);i&&Ss(i)}}if(n=n||"coordinateSystem",null!=t&&e&&"none"!==e){var o=r.getSeriesByIndex(t),s=o.coordinateSystem;s&&s.master&&(s=s.master);var l=[];r.eachSeries((function(t){var r=o===t,u=t.coordinateSystem;if(u&&u.master&&(u=u.master),!("series"===n&&!r||"coordinateSystem"===n&&!(u&&s?u===s:r)||"series"===e&&r)){if(i.getViewOfSeriesModel(t).group.traverse((function(t){hs(t)})),k(e))a(t.getData(),e);else if(W(e))for(var h=N(e),c=0;c<h.length;c++)a(t.getData(h[c]),e[h[c]]);l.push(t)}})),r.eachComponent((function(t,e){if("series"!==t){var n=i.getViewOfComponentModel(e);n&&n.blurSeries&&n.blurSeries(l,r)}}))}}function Is(t,e,n){if(null!=t&&null!=e){var i=n.getModel().getComponent(t,e);if(i){var r=n.getViewOfComponentModel(i);r&&r.focusBlurEnabled&&r.group.traverse((function(t){hs(t)}))}}}function ks(t,e,n,i){var r={focusSelf:!1,dispatchers:null};if(null==t||"series"===t||null==e||null==n)return r;var a=i.getModel().getComponent(t,e);if(!a)return r;var o=i.getViewOfComponentModel(a);if(!o||!o.findHighDownDispatchers)return r;for(var s,l=o.findHighDownDispatchers(n),u=0;u<l.length;u++)if("self"===qo(l[u]).focus){s=!0;break}return{focusSelf:s,dispatchers:l}}function Ls(t){L(t.getAllData(),(function(e){var n=e.data,i=e.type;n.eachItemGraphicEl((function(e,n){t.isSelected(n,i)?Ms(e):Ts(e)}))}))}function Ps(t){var e=[];return t.eachSeries((function(t){L(t.getAllData(),(function(n){n.data;var i=n.type,r=t.getSelectedDataIndices();if(r.length>0){var a={dataIndex:r,seriesIndex:t.seriesIndex};null!=i&&(a.dataType=i),e.push(a)}}))})),e}function Os(t,e,n){!function(t,e){var n=!1===e,i=t;t.highDownSilentOnTouch&&(i.__highDownSilentOnTouch=t.highDownSilentOnTouch);n&&!i.__highDownDispatcher||(i.__highByOuter=i.__highByOuter||0,i.__highDownDispatcher=!n)}(t,!0),gs(t,ms),function(t,e,n){var i=qo(t);null!=e?(i.focus=e,i.blurScope=n):i.focus&&(i.focus=null)}(t,e,n)}var Rs=["emphasis","blur","select"],Ns={itemStyle:"getItemStyle",lineStyle:"getLineStyle",areaStyle:"getAreaStyle"};function Es(t,e,n,i){n=n||"itemStyle";for(var r=0;r<Rs.length;r++){var a=Rs[r],o=e.getModel([a,n]);t.ensureState(a).style=i?i(o):o[Ns[n]]()}}function Bs(t){return!(!t||!t.__highDownDispatcher)}function zs(t){var e=t.type;return e===es||e===ns||e===is}function Fs(t){var e=t.type;return e===Qo||e===ts}var Vs=ao.CMD,Hs=[[],[],[]],Gs=Math.sqrt,Ws=Math.atan2;var Us=Math.sqrt,Ys=Math.sin,Xs=Math.cos,qs=Math.PI;function js(t){return Math.sqrt(t[0]*t[0]+t[1]*t[1])}function Zs(t,e){return(t[0]*e[0]+t[1]*e[1])/(js(t)*js(e))}function Ks(t,e){return(t[0]*e[1]<t[1]*e[0]?-1:1)*Math.acos(Zs(t,e))}function $s(t,e,n,i,r,a,o,s,l,u,h){var c=l*(qs/180),p=Xs(c)*(t-n)/2+Ys(c)*(e-i)/2,f=-1*Ys(c)*(t-n)/2+Xs(c)*(e-i)/2,d=p*p/(o*o)+f*f/(s*s);d>1&&(o*=Us(d),s*=Us(d));var g=(r===a?-1:1)*Us((o*o*(s*s)-o*o*(f*f)-s*s*(p*p))/(o*o*(f*f)+s*s*(p*p)))||0,y=g*o*f/s,v=g*-s*p/o,m=(t+n)/2+Xs(c)*y-Ys(c)*v,_=(e+i)/2+Ys(c)*y+Xs(c)*v,x=Ks([1,0],[(p-y)/o,(f-v)/s]),b=[(p-y)/o,(f-v)/s],w=[(-1*p-y)/o,(-1*f-v)/s],S=Ks(b,w);if(Zs(b,w)<=-1&&(S=qs),Zs(b,w)>=1&&(S=0),S<0){var M=Math.round(S/qs*1e6)/1e6;S=2*qs+M%2*qs}h.addData(u,m,_,o,s,x,S,c,a)}var Js=/([mlvhzcqtsa])([^mlvhzcqtsa]*)/gi,Qs=/-?([0-9]*\.)?[0-9]+([eE]-?[0-9]+)?/g;var tl=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.applyTransform=function(t){},e}(Co);function el(t){return null!=t.setData}function nl(t,e){var n=function(t){var e=new ao;if(!t)return e;var n,i=0,r=0,a=i,o=r,s=ao.CMD,l=t.match(Js);if(!l)return e;for(var u=0;u<l.length;u++){for(var h=l[u],c=h.charAt(0),p=void 0,f=h.match(Qs)||[],d=f.length,g=0;g<d;g++)f[g]=parseFloat(f[g]);for(var y=0;y<d;){var v=void 0,m=void 0,_=void 0,x=void 0,b=void 0,w=void 0,S=void 0,M=i,T=r,C=void 0,A=void 0;switch(c){case"l":i+=f[y++],r+=f[y++],p=s.L,e.addData(p,i,r);break;case"L":i=f[y++],r=f[y++],p=s.L,e.addData(p,i,r);break;case"m":i+=f[y++],r+=f[y++],p=s.M,e.addData(p,i,r),a=i,o=r,c="l";break;case"M":i=f[y++],r=f[y++],p=s.M,e.addData(p,i,r),a=i,o=r,c="L";break;case"h":i+=f[y++],p=s.L,e.addData(p,i,r);break;case"H":i=f[y++],p=s.L,e.addData(p,i,r);break;case"v":r+=f[y++],p=s.L,e.addData(p,i,r);break;case"V":r=f[y++],p=s.L,e.addData(p,i,r);break;case"C":p=s.C,e.addData(p,f[y++],f[y++],f[y++],f[y++],f[y++],f[y++]),i=f[y-2],r=f[y-1];break;case"c":p=s.C,e.addData(p,f[y++]+i,f[y++]+r,f[y++]+i,f[y++]+r,f[y++]+i,f[y++]+r),i+=f[y-2],r+=f[y-1];break;case"S":v=i,m=r,C=e.len(),A=e.data,n===s.C&&(v+=i-A[C-4],m+=r-A[C-3]),p=s.C,M=f[y++],T=f[y++],i=f[y++],r=f[y++],e.addData(p,v,m,M,T,i,r);break;case"s":v=i,m=r,C=e.len(),A=e.data,n===s.C&&(v+=i-A[C-4],m+=r-A[C-3]),p=s.C,M=i+f[y++],T=r+f[y++],i+=f[y++],r+=f[y++],e.addData(p,v,m,M,T,i,r);break;case"Q":M=f[y++],T=f[y++],i=f[y++],r=f[y++],p=s.Q,e.addData(p,M,T,i,r);break;case"q":M=f[y++]+i,T=f[y++]+r,i+=f[y++],r+=f[y++],p=s.Q,e.addData(p,M,T,i,r);break;case"T":v=i,m=r,C=e.len(),A=e.data,n===s.Q&&(v+=i-A[C-4],m+=r-A[C-3]),i=f[y++],r=f[y++],p=s.Q,e.addData(p,v,m,i,r);break;case"t":v=i,m=r,C=e.len(),A=e.data,n===s.Q&&(v+=i-A[C-4],m+=r-A[C-3]),i+=f[y++],r+=f[y++],p=s.Q,e.addData(p,v,m,i,r);break;case"A":_=f[y++],x=f[y++],b=f[y++],w=f[y++],S=f[y++],$s(M=i,T=r,i=f[y++],r=f[y++],w,S,_,x,b,p=s.A,e);break;case"a":_=f[y++],x=f[y++],b=f[y++],w=f[y++],S=f[y++],$s(M=i,T=r,i+=f[y++],r+=f[y++],w,S,_,x,b,p=s.A,e)}}"z"!==c&&"Z"!==c||(p=s.Z,e.addData(p),i=a,r=o),n=p}return e.toStatic(),e}(t),i=M({},e);return i.buildPath=function(t){if(el(t)){t.setData(n.data),(e=t.getContext())&&t.rebuildPath(e,1)}else{var e=t;n.rebuildPath(e,1)}},i.applyTransform=function(t){!function(t,e){var n,i,r,a,o,s,l=t.data,u=t.len(),h=Vs.M,c=Vs.C,p=Vs.L,f=Vs.R,d=Vs.A,g=Vs.Q;for(r=0,a=0;r<u;){switch(n=l[r++],a=r,i=0,n){case h:case p:i=1;break;case c:i=3;break;case g:i=2;break;case d:var y=e[4],v=e[5],m=Gs(e[0]*e[0]+e[1]*e[1]),_=Gs(e[2]*e[2]+e[3]*e[3]),x=Ws(-e[1]/_,e[0]/m);l[r]*=m,l[r++]+=y,l[r]*=_,l[r++]+=v,l[r++]*=m,l[r++]*=_,l[r++]+=x,l[r++]+=x,a=r+=2;break;case f:s[0]=l[r++],s[1]=l[r++],Dt(s,s,e),l[a++]=s[0],l[a++]=s[1],s[0]+=l[r++],s[1]+=l[r++],Dt(s,s,e),l[a++]=s[0],l[a++]=s[1]}for(o=0;o<i;o++){var b=Hs[o];b[0]=l[r++],b[1]=l[r++],Dt(b,b,e),l[a++]=b[0],l[a++]=b[1]}}t.increaseVersion()}(n,t),this.dirtyShape()},i}function il(t,e){return new tl(nl(t,e))}var rl=function(){this.cx=0,this.cy=0,this.r=0},al=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultShape=function(){return new rl},e.prototype.buildPath=function(t,e,n){n&&t.moveTo(e.cx+e.r,e.cy),t.arc(e.cx,e.cy,e.r,0,2*Math.PI)},e}(Co);al.prototype.type="circle";var ol=function(){this.cx=0,this.cy=0,this.rx=0,this.ry=0},sl=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultShape=function(){return new ol},e.prototype.buildPath=function(t,e){var n=.5522848,i=e.cx,r=e.cy,a=e.rx,o=e.ry,s=a*n,l=o*n;t.moveTo(i-a,r),t.bezierCurveTo(i-a,r-l,i-s,r-o,i,r-o),t.bezierCurveTo(i+s,r-o,i+a,r-l,i+a,r),t.bezierCurveTo(i+a,r+l,i+s,r+o,i,r+o),t.bezierCurveTo(i-s,r+o,i-a,r+l,i-a,r),t.closePath()},e}(Co);sl.prototype.type="ellipse";var ll=Math.PI,ul=2*ll,hl=Math.sin,cl=Math.cos,pl=Math.acos,fl=Math.atan2,dl=Math.abs,gl=Math.sqrt,yl=Math.max,vl=Math.min,ml=1e-4;function _l(t,e,n,i,r,a,o){var s=t-n,l=e-i,u=(o?a:-a)/gl(s*s+l*l),h=u*l,c=-u*s,p=t+h,f=e+c,d=n+h,g=i+c,y=(p+d)/2,v=(f+g)/2,m=d-p,_=g-f,x=m*m+_*_,b=r-a,w=p*g-d*f,S=(_<0?-1:1)*gl(yl(0,b*b*x-w*w)),M=(w*_-m*S)/x,T=(-w*m-_*S)/x,C=(w*_+m*S)/x,A=(-w*m+_*S)/x,D=M-y,I=T-v,k=C-y,L=A-v;return D*D+I*I>k*k+L*L&&(M=C,T=A),{cx:M,cy:T,x01:-h,y01:-c,x11:M*(r/b-1),y11:T*(r/b-1)}}function xl(t,e){var n=yl(e.r,0),i=yl(e.r0||0,0),r=n>0;if(r||i>0){if(r||(n=i,i=0),i>n){var a=n;n=i,i=a}var o,s=!!e.clockwise,l=e.startAngle,u=e.endAngle;if(l===u)o=0;else{var h=[l,u];ro(h,!s),o=dl(h[0]-h[1])}var c=e.cx,p=e.cy,f=e.cornerRadius||0,d=e.innerCornerRadius||0;if(n>ml)if(o>ul-ml)t.moveTo(c+n*cl(l),p+n*hl(l)),t.arc(c,p,n,l,u,!s),i>ml&&(t.moveTo(c+i*cl(u),p+i*hl(u)),t.arc(c,p,i,u,l,s));else{var g=dl(n-i)/2,y=vl(g,f),v=vl(g,d),m=v,_=y,x=n*cl(l),b=n*hl(l),w=i*cl(u),S=i*hl(u),M=void 0,T=void 0,C=void 0,A=void 0;if((y>ml||v>ml)&&(M=n*cl(u),T=n*hl(u),C=i*cl(l),A=i*hl(l),o<ll)){var D=function(t,e,n,i,r,a,o,s){var l=n-t,u=i-e,h=o-r,c=s-a,p=c*l-h*u;if(!(p*p<ml))return[t+(p=(h*(e-a)-c*(t-r))/p)*l,e+p*u]}(x,b,C,A,M,T,w,S);if(D){var I=x-D[0],k=b-D[1],L=M-D[0],P=T-D[1],O=1/hl(pl((I*L+k*P)/(gl(I*I+k*k)*gl(L*L+P*P)))/2),R=gl(D[0]*D[0]+D[1]*D[1]);m=vl(v,(i-R)/(O-1)),_=vl(y,(n-R)/(O+1))}}if(o>ml)if(_>ml){var N=_l(C,A,x,b,n,_,s),E=_l(M,T,w,S,n,_,s);t.moveTo(c+N.cx+N.x01,p+N.cy+N.y01),_<y?t.arc(c+N.cx,p+N.cy,_,fl(N.y01,N.x01),fl(E.y01,E.x01),!s):(t.arc(c+N.cx,p+N.cy,_,fl(N.y01,N.x01),fl(N.y11,N.x11),!s),t.arc(c,p,n,fl(N.cy+N.y11,N.cx+N.x11),fl(E.cy+E.y11,E.cx+E.x11),!s),t.arc(c+E.cx,p+E.cy,_,fl(E.y11,E.x11),fl(E.y01,E.x01),!s))}else t.moveTo(c+x,p+b),t.arc(c,p,n,l,u,!s);else t.moveTo(c+x,p+b);if(i>ml&&o>ml)if(m>ml){N=_l(w,S,M,T,i,-m,s),E=_l(x,b,C,A,i,-m,s);t.lineTo(c+N.cx+N.x01,p+N.cy+N.y01),m<v?t.arc(c+N.cx,p+N.cy,m,fl(N.y01,N.x01),fl(E.y01,E.x01),!s):(t.arc(c+N.cx,p+N.cy,m,fl(N.y01,N.x01),fl(N.y11,N.x11),!s),t.arc(c,p,i,fl(N.cy+N.y11,N.cx+N.x11),fl(E.cy+E.y11,E.cx+E.x11),s),t.arc(c+E.cx,p+E.cy,m,fl(E.y11,E.x11),fl(E.y01,E.x01),!s))}else t.lineTo(c+w,p+S),t.arc(c,p,i,u,l,s);else t.lineTo(c+w,p+S)}else t.moveTo(c,p);t.closePath()}}var bl=function(){this.cx=0,this.cy=0,this.r0=0,this.r=0,this.startAngle=0,this.endAngle=2*Math.PI,this.clockwise=!0,this.cornerRadius=0,this.innerCornerRadius=0},wl=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultShape=function(){return new bl},e.prototype.buildPath=function(t,e){xl(t,e)},e.prototype.isZeroArea=function(){return this.shape.startAngle===this.shape.endAngle||this.shape.r===this.shape.r0},e}(Co);wl.prototype.type="sector";var Sl=function(){this.cx=0,this.cy=0,this.r=0,this.r0=0},Ml=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultShape=function(){return new Sl},e.prototype.buildPath=function(t,e){var n=e.cx,i=e.cy,r=2*Math.PI;t.moveTo(n+e.r,i),t.arc(n,i,e.r,0,r,!1),t.moveTo(n+e.r0,i),t.arc(n,i,e.r0,0,r,!0)},e}(Co);function Tl(t,e,n,i,r,a,o){var s=.5*(n-t),l=.5*(i-e);return(2*(e-n)+s+l)*o+(-3*(e-n)-2*s-l)*a+s*r+e}function Cl(t,e,n){var i=e.smooth,r=e.points;if(r&&r.length>=2){if(i&&"spline"!==i){var a=function(t,e,n,i){var r,a,o,s,l=[],u=[],h=[],c=[];if(i){o=[1/0,1/0],s=[-1/0,-1/0];for(var p=0,f=t.length;p<f;p++)It(o,o,t[p]),kt(s,s,t[p]);It(o,o,i[0]),kt(s,s,i[1])}for(p=0,f=t.length;p<f;p++){var d=t[p];if(n)r=t[p?p-1:f-1],a=t[(p+1)%f];else{if(0===p||p===f-1){l.push(dt(t[p]));continue}r=t[p-1],a=t[p+1]}yt(u,a,r),bt(u,u,e);var g=St(d,r),y=St(d,a),v=g+y;0!==v&&(g/=v,y/=v),bt(h,u,-g),bt(c,u,y);var m=gt([],d,h),_=gt([],d,c);i&&(kt(m,m,o),It(m,m,s),kt(_,_,o),It(_,_,s)),l.push(m),l.push(_)}return n&&l.push(l.shift()),l}(r,i,n,e.smoothConstraint);t.moveTo(r[0][0],r[0][1]);for(var o=r.length,s=0;s<(n?o:o-1);s++){var l=a[2*s],u=a[2*s+1],h=r[(s+1)%o];t.bezierCurveTo(l[0],l[1],u[0],u[1],h[0],h[1])}}else{"spline"===i&&(r=function(t,e){for(var n=t.length,i=[],r=0,a=1;a<n;a++)r+=St(t[a-1],t[a]);var o=r/2;for(o=o<n?n:o,a=0;a<o;a++){var s=a/(o-1)*(e?n:n-1),l=Math.floor(s),u=s-l,h=void 0,c=t[l%n],p=void 0,f=void 0;e?(h=t[(l-1+n)%n],p=t[(l+1)%n],f=t[(l+2)%n]):(h=t[0===l?l:l-1],p=t[l>n-2?n-1:l+1],f=t[l>n-3?n-1:l+2]);var d=u*u,g=u*d;i.push([Tl(h[0],c[0],p[0],f[0],u,d,g),Tl(h[1],c[1],p[1],f[1],u,d,g)])}return i}(r,n)),t.moveTo(r[0][0],r[0][1]);s=1;for(var c=r.length;s<c;s++)t.lineTo(r[s][0],r[s][1])}n&&t.closePath()}}Ml.prototype.type="ring";var Al=function(){this.points=null,this.smooth=0,this.smoothConstraint=null},Dl=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultShape=function(){return new Al},e.prototype.buildPath=function(t,e){Cl(t,e,!0)},e}(Co);Dl.prototype.type="polygon";var Il=function(){this.points=null,this.percent=1,this.smooth=0,this.smoothConstraint=null},kl=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultStyle=function(){return{stroke:"#000",fill:null}},e.prototype.getDefaultShape=function(){return new Il},e.prototype.buildPath=function(t,e){Cl(t,e,!1)},e}(Co);kl.prototype.type="polyline";var Ll={},Pl=function(){this.x1=0,this.y1=0,this.x2=0,this.y2=0,this.percent=1},Ol=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultStyle=function(){return{stroke:"#000",fill:null}},e.prototype.getDefaultShape=function(){return new Pl},e.prototype.buildPath=function(t,e){var n,i,r,a;if(this.subPixelOptimize){var o=function(t,e,n){if(e){var i=e.x1,r=e.x2,a=e.y1,o=e.y2;t.x1=i,t.x2=r,t.y1=a,t.y2=o;var s=n&&n.lineWidth;return s?(Po(2*i)===Po(2*r)&&(t.x1=t.x2=Oo(i,s,!0)),Po(2*a)===Po(2*o)&&(t.y1=t.y2=Oo(a,s,!0)),t):t}}(Ll,e,this.style);n=o.x1,i=o.y1,r=o.x2,a=o.y2}else n=e.x1,i=e.y1,r=e.x2,a=e.y2;var s=e.percent;0!==s&&(t.moveTo(n,i),s<1&&(r=n*(1-s)+r*s,a=i*(1-s)+a*s),t.lineTo(r,a))},e.prototype.pointAt=function(t){var e=this.shape;return[e.x1*(1-t)+e.x2*t,e.y1*(1-t)+e.y2*t]},e}(Co);Ol.prototype.type="line";var Rl=[],Nl=function(){this.x1=0,this.y1=0,this.x2=0,this.y2=0,this.cpx1=0,this.cpy1=0,this.percent=1};function El(t,e,n){var i=t.cpx2,r=t.cpy2;return null===i||null===r?[(n?fa:pa)(t.x1,t.cpx1,t.cpx2,t.x2,e),(n?fa:pa)(t.y1,t.cpy1,t.cpy2,t.y2,e)]:[(n?xa:_a)(t.x1,t.cpx1,t.x2,e),(n?xa:_a)(t.y1,t.cpy1,t.y2,e)]}var Bl=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultStyle=function(){return{stroke:"#000",fill:null}},e.prototype.getDefaultShape=function(){return new Nl},e.prototype.buildPath=function(t,e){var n=e.x1,i=e.y1,r=e.x2,a=e.y2,o=e.cpx1,s=e.cpy1,l=e.cpx2,u=e.cpy2,h=e.percent;0!==h&&(t.moveTo(n,i),null==l||null==u?(h<1&&(wa(n,o,r,h,Rl),o=Rl[1],r=Rl[2],wa(i,s,a,h,Rl),s=Rl[1],a=Rl[2]),t.quadraticCurveTo(o,s,r,a)):(h<1&&(ya(n,o,l,r,h,Rl),o=Rl[1],l=Rl[2],r=Rl[3],ya(i,s,u,a,h,Rl),s=Rl[1],u=Rl[2],a=Rl[3]),t.bezierCurveTo(o,s,l,u,r,a)))},e.prototype.pointAt=function(t){return El(this.shape,t,!1)},e.prototype.tangentAt=function(t){var e=El(this.shape,t,!0);return wt(e,e)},e}(Co);Bl.prototype.type="bezier-curve";var zl=function(){this.cx=0,this.cy=0,this.r=0,this.startAngle=0,this.endAngle=2*Math.PI,this.clockwise=!0},Fl=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultStyle=function(){return{stroke:"#000",fill:null}},e.prototype.getDefaultShape=function(){return new zl},e.prototype.buildPath=function(t,e){var n=e.cx,i=e.cy,r=Math.max(e.r,0),a=e.startAngle,o=e.endAngle,s=e.clockwise,l=Math.cos(a),u=Math.sin(a);t.moveTo(l*r+n,u*r+i),t.arc(n,i,r,a,o,!s)},e}(Co);Fl.prototype.type="arc";var Vl=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="compound",e}return n(e,t),e.prototype._updatePathDirty=function(){for(var t=this.shape.paths,e=this.shapeChanged(),n=0;n<t.length;n++)e=e||t[n].shapeChanged();e&&this.dirtyShape()},e.prototype.beforeBrush=function(){this._updatePathDirty();for(var t=this.shape.paths||[],e=this.getGlobalScale(),n=0;n<t.length;n++)t[n].path||t[n].createPathProxy(),t[n].path.setScale(e[0],e[1],t[n].segmentIgnoreThreshold)},e.prototype.buildPath=function(t,e){for(var n=e.paths||[],i=0;i<n.length;i++)n[i].buildPath(t,n[i].shape,!0)},e.prototype.afterBrush=function(){for(var t=this.shape.paths||[],e=0;e<t.length;e++)t[e].pathUpdated()},e.prototype.getBoundingRect=function(){return this._updatePathDirty.call(this),Co.prototype.getBoundingRect.call(this)},e}(Co),Hl=function(){function t(t){this.colorStops=t||[]}return t.prototype.addColorStop=function(t,e){this.colorStops.push({offset:t,color:e})},t}(),Gl=function(t){function e(e,n,i,r,a,o){var s=t.call(this,a)||this;return s.x=null==e?0:e,s.y=null==n?0:n,s.x2=null==i?1:i,s.y2=null==r?0:r,s.type="linear",s.global=o||!1,s}return n(e,t),e}(Hl),Wl=function(t){function e(e,n,i,r,a){var o=t.call(this,r)||this;return o.x=null==e?.5:e,o.y=null==n?.5:n,o.r=null==i?.5:i,o.type="radial",o.global=a||!1,o}return n(e,t),e}(Hl),Ul=[0,0],Yl=[0,0],Xl=new pn,ql=new pn,jl=function(){function t(t,e){this._corners=[],this._axes=[],this._origin=[0,0];for(var n=0;n<4;n++)this._corners[n]=new pn;for(n=0;n<2;n++)this._axes[n]=new pn;t&&this.fromBoundingRect(t,e)}return t.prototype.fromBoundingRect=function(t,e){var n=this._corners,i=this._axes,r=t.x,a=t.y,o=r+t.width,s=a+t.height;if(n[0].set(r,a),n[1].set(o,a),n[2].set(o,s),n[3].set(r,s),e)for(var l=0;l<4;l++)n[l].transform(e);pn.sub(i[0],n[1],n[0]),pn.sub(i[1],n[3],n[0]),i[0].normalize(),i[1].normalize();for(l=0;l<2;l++)this._origin[l]=i[l].dot(n[0])},t.prototype.intersect=function(t,e){var n=!0,i=!e;return Xl.set(1/0,1/0),ql.set(0,0),!this._intersectCheckOneSide(this,t,Xl,ql,i,1)&&(n=!1,i)||!this._intersectCheckOneSide(t,this,Xl,ql,i,-1)&&(n=!1,i)||i||pn.copy(e,n?Xl:ql),n},t.prototype._intersectCheckOneSide=function(t,e,n,i,r,a){for(var o=!0,s=0;s<2;s++){var l=this._axes[s];if(this._getProjMinMaxOnAxis(s,t._corners,Ul),this._getProjMinMaxOnAxis(s,e._corners,Yl),Ul[1]<Yl[0]||Ul[0]>Yl[1]){if(o=!1,r)return o;var u=Math.abs(Yl[0]-Ul[1]),h=Math.abs(Ul[0]-Yl[1]);Math.min(u,h)>i.len()&&(u<h?pn.scale(i,l,-u*a):pn.scale(i,l,h*a))}else if(n){u=Math.abs(Yl[0]-Ul[1]),h=Math.abs(Ul[0]-Yl[1]);Math.min(u,h)<n.len()&&(u<h?pn.scale(n,l,u*a):pn.scale(n,l,-h*a))}}return o},t.prototype._getProjMinMaxOnAxis=function(t,e,n){for(var i=this._axes[t],r=this._origin,a=e[0].dot(i)+r[t],o=a,s=a,l=1;l<e.length;l++){var u=e[l].dot(i)+r[t];o=Math.min(u,o),s=Math.max(u,s)}n[0]=o,n[1]=s},t}(),Zl=[],Kl=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.notClear=!0,e.incremental=!0,e._displayables=[],e._temporaryDisplayables=[],e._cursor=0,e}return n(e,t),e.prototype.traverse=function(t,e){t.call(e,this)},e.prototype.useStyle=function(){this.style={}},e.prototype.getCursor=function(){return this._cursor},e.prototype.innerAfterBrush=function(){this._cursor=this._displayables.length},e.prototype.clearDisplaybles=function(){this._displayables=[],this._temporaryDisplayables=[],this._cursor=0,this.markRedraw(),this.notClear=!1},e.prototype.clearTemporalDisplayables=function(){this._temporaryDisplayables=[]},e.prototype.addDisplayable=function(t,e){e?this._temporaryDisplayables.push(t):this._displayables.push(t),this.markRedraw()},e.prototype.addDisplayables=function(t,e){e=e||!1;for(var n=0;n<t.length;n++)this.addDisplayable(t[n],e)},e.prototype.getDisplayables=function(){return this._displayables},e.prototype.getTemporalDisplayables=function(){return this._temporaryDisplayables},e.prototype.eachPendingDisplayable=function(t){for(var e=this._cursor;e<this._displayables.length;e++)t&&t(this._displayables[e]);for(e=0;e<this._temporaryDisplayables.length;e++)t&&t(this._temporaryDisplayables[e])},e.prototype.update=function(){this.updateTransform();for(var t=this._cursor;t<this._displayables.length;t++){(e=this._displayables[t]).parent=this,e.update(),e.parent=null}for(t=0;t<this._temporaryDisplayables.length;t++){var e;(e=this._temporaryDisplayables[t]).parent=this,e.update(),e.parent=null}},e.prototype.getBoundingRect=function(){if(!this._rect){for(var t=new bn(1/0,1/0,-1/0,-1/0),e=0;e<this._displayables.length;e++){var n=this._displayables[e],i=n.getBoundingRect().clone();n.needLocalTransform()&&i.applyTransform(n.getLocalTransform(Zl)),t.union(i)}this._rect=t}return this._rect},e.prototype.contain=function(t,e){var n=this.transformCoordToLocal(t,e);if(this.getBoundingRect().contain(n[0],n[1]))for(var i=0;i<this._displayables.length;i++){if(this._displayables[i].contain(t,e))return!0}return!1},e}(Jr),$l=Math.max,Jl=Math.min,Ql={};var tu=function(t,e){var i=nl(t,e);return function(t){function e(e){var n=t.call(this,e)||this;return n.applyTransform=i.applyTransform,n.buildPath=i.buildPath,n}return n(e,t),e}(tl)};function eu(t,e){Ql[t]=e}function nu(t,e,n,i){var r=il(t,e);return n&&("center"===i&&(n=ru(n,r.getBoundingRect())),ou(r,n)),r}function iu(t,e,n){var i=new Lo({style:{image:t,x:e.x,y:e.y,width:e.width,height:e.height},onload:function(t){if("center"===n){var r={width:t.width,height:t.height};i.setStyle(ru(e,r))}}});return i}function ru(t,e){var n,i=e.width/e.height,r=t.height*i;return n=r<=t.width?t.height:(r=t.width)/i,{x:t.x+t.width/2-r/2,y:t.y+t.height/2-n/2,width:r,height:n}}var au=function(t,e){for(var n=[],i=t.length,r=0;r<i;r++){var a=t[r];a.path||a.createPathProxy(),a.shapeChanged()&&a.buildPath(a.path,a.shape,!0),n.push(a.path)}var o=new Co(e);return o.createPathProxy(),o.buildPath=function(t){if(el(t)){t.appendPath(n);var e=t.getContext();e&&t.rebuildPath(e,1)}},o};function ou(t,e){if(t.applyTransform){var n=t.getBoundingRect().calculateTransform(e);t.applyTransform(n)}}function su(t,e,n,i,r,a,o){var s,l=!1;"function"==typeof r?(o=a,a=r,r=null):W(r)&&(a=r.cb,o=r.during,l=r.isFrom,s=r.removeOpt,r=r.dataIndex);var u,h="update"===t,c="remove"===t;if(i&&i.ecModel){var p=i.ecModel.getUpdatePayload();u=p&&p.animation}var f=i&&i.isAnimationEnabled();if(c||e.stopAnimation("remove"),f){var d=void 0,g=void 0,y=void 0;u?(d=u.duration||0,g=u.easing||"cubicOut",y=u.delay||0):c?(d=J((s=s||{}).duration,200),g=J(s.easing,"cubicOut"),y=0):(d=i.getShallow(h?"animationDurationUpdate":"animationDuration"),g=i.getShallow(h?"animationEasingUpdate":"animationEasing"),y=i.getShallow(h?"animationDelayUpdate":"animationDelay")),"function"==typeof y&&(y=y(r,i.getAnimationDelayParams?i.getAnimationDelayParams(e,r):null)),"function"==typeof d&&(d=d(r)),d>0?l?e.animateFrom(n,{duration:d,delay:y||0,easing:g,done:a,force:!!a||!!o,scope:t,during:o}):e.animateTo(n,{duration:d,delay:y||0,easing:g,done:a,force:!!a||!!o,setToFinal:!0,scope:t,during:o}):(e.stopAnimation(),!l&&e.attr(n),a&&a())}else e.stopAnimation(),!l&&e.attr(n),o&&o(1),a&&a()}function lu(t,e,n,i,r,a){su("update",t,e,n,i,r,a)}function uu(t,e,n,i,r,a){su("init",t,e,n,i,r,a)}function hu(t,e,n,i,r,a){fu(t)||su("remove",t,e,n,i,r,a)}function cu(t,e,n,i){t.removeTextContent(),t.removeTextGuideLine(),hu(t,{style:{opacity:0}},e,n,i)}function pu(t,e,n){function i(){t.parent&&t.parent.remove(t)}t.isGroup?t.traverse((function(t){t.isGroup||cu(t,e,n,i)})):cu(t,e,n,i)}function fu(t){if(!t.__zr)return!0;for(var e=0;e<t.animators.length;e++){if("remove"===t.animators[e].scope)return!0}return!1}function du(t){return!t.isGroup}eu("circle",al),eu("ellipse",sl),eu("sector",wl),eu("ring",Ml),eu("polygon",Dl),eu("polyline",kl),eu("rect",Eo),eu("line",Ol),eu("bezierCurve",Bl),eu("arc",Fl);var gu={};function yu(t,e){for(var n=0;n<$o.length;n++){var i=$o[n],r=e[i],a=t.ensureState(i);a.style=a.style||{},a.style.text=r}var o=t.currentStates.slice();t.clearStates(!0),t.setStyle({text:e.normal}),t.useStates(o,!0)}function vu(t,e,n){var i,r=t.labelFetcher,a=t.labelDataIndex,o=t.labelDimIndex,s=e.normal;r&&(i=r.getFormattedLabel(a,"normal",null,o,s&&s.get("formatter"),null!=n?{interpolatedValue:n}:null)),null==i&&(i=F(t.defaultText)?t.defaultText(a,t,n):t.defaultText);for(var l={normal:i},u=0;u<$o.length;u++){var h=$o[u],c=e[h];l[h]=J(r?r.getFormattedLabel(a,h,null,o,c&&c.get("formatter")):null,i)}return l}function mu(t,e,n,i){n=n||gu;for(var r=t instanceof Fo,a=!1,o=0;o<Jo.length;o++){if((p=e[Jo[o]])&&p.getShallow("show")){a=!0;break}}var s=r?t:t.getTextContent();if(a){r||(s||(s=new Fo,t.setTextContent(s)),t.stateProxy&&(s.stateProxy=t.stateProxy));var l=vu(n,e),u=e.normal,h=!!u.getShallow("show"),c=xu(u,i&&i.normal,n,!1,!r);c.text=l.normal,r||t.setTextConfig(bu(u,n,!1));for(o=0;o<$o.length;o++){var p,f=$o[o];if(p=e[f]){var d=s.ensureState(f),g=!!J(p.getShallow("show"),h);if(g!==h&&(d.ignore=!g),d.style=xu(p,i&&i[f],n,!0,!r),d.style.text=l[f],!r)t.ensureState(f).textConfig=bu(p,n,!0)}}s.silent=!!u.getShallow("silent"),null!=s.style.x&&(c.x=s.style.x),null!=s.style.y&&(c.y=s.style.y),s.ignore=!h,s.useStyle(c),s.dirty(),n.enableTextSetter&&(Cu(s).setLabelText=function(t){var i=vu(n,e,t);yu(s,i)})}else s&&(s.ignore=!0);t.dirty()}function _u(t,e){e=e||"label";for(var n={normal:t.getModel(e)},i=0;i<$o.length;i++){var r=$o[i];n[r]=t.getModel([r,e])}return n}function xu(t,e,n,i,r){var a={};return function(t,e,n,i,r){n=n||gu;var a,o=e.ecModel,s=o&&o.option.textStyle,l=function(t){var e;for(;t&&t!==t.ecModel;){var n=(t.option||gu).rich;if(n){e=e||{};for(var i=N(n),r=0;r<i.length;r++){e[i[r]]=1}}t=t.parentModel}return e}(e);if(l)for(var u in a={},l)if(l.hasOwnProperty(u)){var h=e.getModel(["rich",u]);Tu(a[u]={},h,s,n,i,r,!1,!0)}a&&(t.rich=a);var c=e.get("overflow");c&&(t.overflow=c);var p=e.get("minMargin");null!=p&&(t.margin=p);Tu(t,e,s,n,i,r,!0,!1)}(a,t,n,i,r),e&&M(a,e),a}function bu(t,e,n){e=e||{};var i,r={},a=t.getShallow("rotate"),o=J(t.getShallow("distance"),n?null:5),s=t.getShallow("offset");return"outside"===(i=t.getShallow("position")||(n?null:"inside"))&&(i=e.defaultOutsidePosition||"top"),null!=i&&(r.position=i),null!=s&&(r.offset=s),null!=a&&(a*=Math.PI/180,r.rotation=a),null!=o&&(r.distance=o),r.outsideFill="inherit"===t.get("color")?e.inheritColor||null:"auto",r}var wu=["fontStyle","fontWeight","fontSize","fontFamily","textShadowColor","textShadowBlur","textShadowOffsetX","textShadowOffsetY"],Su=["align","lineHeight","width","height","tag","verticalAlign"],Mu=["padding","borderWidth","borderRadius","borderDashOffset","backgroundColor","borderColor","shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY"];function Tu(t,e,n,i,r,a,o,s){n=!r&&n||gu;var l=i&&i.inheritColor,u=e.getShallow("color"),h=e.getShallow("textBorderColor"),c=J(e.getShallow("opacity"),n.opacity);"inherit"!==u&&"auto"!==u||(u=l||null),"inherit"!==h&&"auto"!==h||(h=l||null),a||(u=u||n.color,h=h||n.textBorderColor),null!=u&&(t.fill=u),null!=h&&(t.stroke=h);var p=J(e.getShallow("textBorderWidth"),n.textBorderWidth);null!=p&&(t.lineWidth=p);var f=J(e.getShallow("textBorderType"),n.textBorderType);null!=f&&(t.lineDash=f);var d=J(e.getShallow("textBorderDashOffset"),n.textBorderDashOffset);null!=d&&(t.lineDashOffset=d),r||null!=c||s||(c=i&&i.defaultOpacity),null!=c&&(t.opacity=c),r||a||null==t.fill&&i.inheritColor&&(t.fill=i.inheritColor);for(var g=0;g<wu.length;g++){var y=wu[g];null!=(m=J(e.getShallow(y),n[y]))&&(t[y]=m)}for(g=0;g<Su.length;g++){y=Su[g];null!=(m=e.getShallow(y))&&(t[y]=m)}if(null==t.verticalAlign){var v=e.getShallow("baseline");null!=v&&(t.verticalAlign=v)}if(!o||!i.disableBox){for(g=0;g<Mu.length;g++){var m;y=Mu[g];null!=(m=e.getShallow(y))&&(t[y]=m)}var _=e.getShallow("borderType");null!=_&&(t.borderDash=_),"auto"!==t.backgroundColor&&"inherit"!==t.backgroundColor||!l||(t.backgroundColor=l),"auto"!==t.borderColor&&"inherit"!==t.borderColor||!l||(t.borderColor=l)}}var Cu=hr();var Au,Du,Iu=["textStyle","color"],ku=new Fo,Lu=function(){function t(){}return t.prototype.getTextColor=function(t){var e=this.ecModel;return this.getShallow("color")||(!t&&e?e.get(Iu):null)},t.prototype.getFont=function(){return t={fontStyle:this.getShallow("fontStyle"),fontWeight:this.getShallow("fontWeight"),fontSize:this.getShallow("fontSize"),fontFamily:this.getShallow("fontFamily")},e=this.ecModel,n=e&&e.getModel("textStyle"),it([t.fontStyle||n&&n.getShallow("fontStyle")||"",t.fontWeight||n&&n.getShallow("fontWeight")||"",(t.fontSize||n&&n.getShallow("fontSize")||12)+"px",t.fontFamily||n&&n.getShallow("fontFamily")||"sans-serif"].join(" "));var t,e,n},t.prototype.getTextRect=function(t){return ku.useStyle({text:t,fontStyle:this.getShallow("fontStyle"),fontWeight:this.getShallow("fontWeight"),fontSize:this.getShallow("fontSize"),fontFamily:this.getShallow("fontFamily"),verticalAlign:this.getShallow("verticalAlign")||this.getShallow("baseline"),padding:this.getShallow("padding"),lineHeight:this.getShallow("lineHeight"),rich:this.getShallow("rich")}),ku.update(),ku.getBoundingRect()},t}(),Pu=[["lineWidth","width"],["stroke","color"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"],["lineDash","type"],["lineDashOffset","dashOffset"],["lineCap","cap"],["lineJoin","join"],["miterLimit"]],Ou=Dr(Pu),Ru=function(){function t(){}return t.prototype.getLineStyle=function(t){return Ou(this,t)},t}(),Nu=[["fill","color"],["stroke","borderColor"],["lineWidth","borderWidth"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"],["lineDash","borderType"],["lineDashOffset","borderDashOffset"],["lineCap","borderCap"],["lineJoin","borderJoin"],["miterLimit","borderMiterLimit"]],Eu=Dr(Nu),Bu=function(){function t(){}return t.prototype.getItemStyle=function(t,e){return Eu(this,t,e)},t}(),zu=function(){function t(t,e,n){this.parentModel=e,this.ecModel=n,this.option=t}return t.prototype.init=function(t,e,n){for(var i=[],r=3;r<arguments.length;r++)i[r-3]=arguments[r]},t.prototype.mergeOption=function(t,e){S(this.option,t,!0)},t.prototype.get=function(t,e){return null==t?this.option:this._doGet(this.parsePath(t),!e&&this.parentModel)},t.prototype.getShallow=function(t,e){var n=this.option,i=null==n?n:n[t];if(null==i&&!e){var r=this.parentModel;r&&(i=r.getShallow(t))}return i},t.prototype.getModel=function(e,n){var i=null!=e,r=i?this.parsePath(e):null;return new t(i?this._doGet(r):this.option,n=n||this.parentModel&&this.parentModel.getModel(this.resolveParentPath(r)),this.ecModel)},t.prototype.isEmpty=function(){return null==this.option},t.prototype.restoreData=function(){},t.prototype.clone=function(){return new(0,this.constructor)(w(this.option))},t.prototype.parsePath=function(t){return"string"==typeof t?t.split("."):t},t.prototype.resolveParentPath=function(t){return t},t.prototype.isAnimationEnabled=function(){if(!o.node&&this.option){if(null!=this.option.animation)return!!this.option.animation;if(this.parentModel)return this.parentModel.isAnimationEnabled()}},t.prototype._doGet=function(t,e){var n=this.option;if(!t)return n;for(var i=0;i<t.length&&(!t[i]||null!=(n=n&&"object"==typeof n?n[t[i]]:null));i++);return null==n&&e&&(n=e._doGet(this.resolveParentPath(t),e.parentModel)),n},t}();br(zu),Au=zu,Du=["__\0is_clz",Mr++].join("_"),Au.prototype[Du]=!0,Au.isInstance=function(t){return!(!t||!t[Du])},I(zu,Ru),I(zu,Bu),I(zu,kr),I(zu,Lu);var Fu=Math.round(10*Math.random());function Vu(t){return[t||"",Fu++].join("_")}var Hu="ZH",Gu="EN",Wu=Gu,Uu={},Yu={},Xu=o.domSupported&&(document.documentElement.lang||navigator.language||navigator.browserLanguage).toUpperCase().indexOf(Hu)>-1?Hu:Wu;function qu(t,e){t=t.toUpperCase(),Yu[t]=new zu(e),Uu[t]=e}qu(Gu,{time:{month:["January","February","March","April","May","June","July","August","September","October","November","December"],monthAbbr:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayOfWeek:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayOfWeekAbbr:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]},legend:{selector:{all:"All",inverse:"Inv"}},toolbox:{brush:{title:{rect:"Box Select",polygon:"Lasso Select",lineX:"Horizontally Select",lineY:"Vertically Select",keep:"Keep Selections",clear:"Clear Selections"}},dataView:{title:"Data View",lang:["Data View","Close","Refresh"]},dataZoom:{title:{zoom:"Zoom",back:"Zoom Reset"}},magicType:{title:{line:"Switch to Line Chart",bar:"Switch to Bar Chart",stack:"Stack",tiled:"Tile"}},restore:{title:"Restore"},saveAsImage:{title:"Save as Image",lang:["Right Click to Save Image"]}},series:{typeNames:{pie:"Pie chart",bar:"Bar chart",line:"Line chart",scatter:"Scatter plot",effectScatter:"Ripple scatter plot",radar:"Radar chart",tree:"Tree",treemap:"Treemap",boxplot:"Boxplot",candlestick:"Candlestick",k:"K line chart",heatmap:"Heat map",map:"Map",parallel:"Parallel coordinate map",lines:"Line graph",graph:"Relationship graph",sankey:"Sankey diagram",funnel:"Funnel chart",gauge:"Guage",pictorialBar:"Pictorial bar",themeRiver:"Theme River Map",sunburst:"Sunburst"}},aria:{general:{withTitle:'This is a chart about "{title}"',withoutTitle:"This is a chart"},series:{single:{prefix:"",withName:" with type {seriesType} named {seriesName}.",withoutName:" with type {seriesType}."},multiple:{prefix:". It consists of {seriesCount} series count.",withName:" The {seriesId} series is a {seriesType} representing {seriesName}.",withoutName:" The {seriesId} series is a {seriesType}.",separator:{middle:"",end:""}}},data:{allData:"The data is as follows: ",partialData:"The first {displayCnt} items are: ",withName:"the data for {name} is {value}",withoutName:"{value}",separator:{middle:", ",end:". "}}}}),qu(Hu,{time:{month:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],monthAbbr:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],dayOfWeek:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],dayOfWeekAbbr:["日","一","二","三","四","五","六"]},legend:{selector:{all:"全选",inverse:"反选"}},toolbox:{brush:{title:{rect:"矩形选择",polygon:"圈选",lineX:"横向选择",lineY:"纵向选择",keep:"保持选择",clear:"清除选择"}},dataView:{title:"数据视图",lang:["数据视图","关闭","刷新"]},dataZoom:{title:{zoom:"区域缩放",back:"区域缩放还原"}},magicType:{title:{line:"切换为折线图",bar:"切换为柱状图",stack:"切换为堆叠",tiled:"切换为平铺"}},restore:{title:"还原"},saveAsImage:{title:"保存为图片",lang:["右键另存为图片"]}},series:{typeNames:{pie:"饼图",bar:"柱状图",line:"折线图",scatter:"散点图",effectScatter:"涟漪散点图",radar:"雷达图",tree:"树图",treemap:"矩形树图",boxplot:"箱型图",candlestick:"K线图",k:"K线图",heatmap:"热力图",map:"地图",parallel:"平行坐标图",lines:"线图",graph:"关系图",sankey:"桑基图",funnel:"漏斗图",gauge:"仪表盘图",pictorialBar:"象形柱图",themeRiver:"主题河流图",sunburst:"旭日图"}},aria:{general:{withTitle:"这是一个关于“{title}”的图表。",withoutTitle:"这是一个图表，"},series:{single:{prefix:"",withName:"图表类型是{seriesType}，表示{seriesName}。",withoutName:"图表类型是{seriesType}。"},multiple:{prefix:"它由{seriesCount}个图表系列组成。",withName:"第{seriesId}个系列是一个表示{seriesName}的{seriesType}，",withoutName:"第{seriesId}个系列是一个{seriesType}，",separator:{middle:"；",end:"。"}}},data:{allData:"其数据是——",partialData:"其中，前{displayCnt}项是——",withName:"{name}的数据是{value}",withoutName:"{value}",separator:{middle:"，",end:""}}}});var ju=1e3,Zu=6e4,Ku=36e5,$u=864e5,Ju=31536e6,Qu={year:"{yyyy}",month:"{MMM}",day:"{d}",hour:"{HH}:{mm}",minute:"{HH}:{mm}",second:"{HH}:{mm}:{ss}",millisecond:"{hh}:{mm}:{ss} {SSS}",none:"{yyyy}-{MM}-{dd} {hh}:{mm}:{ss} {SSS}"},th="{yyyy}-{MM}-{dd}",eh={year:"{yyyy}",month:"{yyyy}-{MM}",day:th,hour:"{yyyy}-{MM}-{dd} "+Qu.hour,minute:"{yyyy}-{MM}-{dd} "+Qu.minute,second:"{yyyy}-{MM}-{dd} "+Qu.second,millisecond:Qu.none},nh=["year","month","day","hour","minute","second","millisecond"],ih=["year","half-year","quarter","month","week","half-week","day","half-day","quarter-day","hour","minute","second","millisecond"];function rh(t,e){return"0000".substr(0,e-(t+="").length)+t}function ah(t){switch(t){case"half-year":case"quarter":return"month";case"week":case"half-week":return"day";case"half-day":case"quarter-day":return"hour";default:return t}}function oh(t){return t===ah(t)}function sh(t,e,n,i){var r=Gi(t),a=r[hh(n)](),o=r[ch(n)]()+1,s=Math.floor((o-1)/4)+1,l=r[ph(n)](),u=r["get"+(n?"UTC":"")+"Day"](),h=r[fh(n)](),c=(h-1)%12+1,p=r[dh(n)](),f=r[gh(n)](),d=r[yh(n)](),g=(i instanceof zu?i:function(t){return Yu[t]}(i||Xu)||Yu.EN).getModel("time"),y=g.get("month"),v=g.get("monthAbbr"),m=g.get("dayOfWeek"),_=g.get("dayOfWeekAbbr");return(e||"").replace(/{yyyy}/g,a+"").replace(/{yy}/g,a%100+"").replace(/{Q}/g,s+"").replace(/{MMMM}/g,y[o-1]).replace(/{MMM}/g,v[o-1]).replace(/{MM}/g,rh(o,2)).replace(/{M}/g,o+"").replace(/{dd}/g,rh(l,2)).replace(/{d}/g,l+"").replace(/{eeee}/g,m[u]).replace(/{ee}/g,_[u]).replace(/{e}/g,u+"").replace(/{HH}/g,rh(h,2)).replace(/{H}/g,h+"").replace(/{hh}/g,rh(c+"",2)).replace(/{h}/g,c+"").replace(/{mm}/g,rh(p,2)).replace(/{m}/g,p+"").replace(/{ss}/g,rh(f,2)).replace(/{s}/g,f+"").replace(/{SSS}/g,rh(d,3)).replace(/{S}/g,d+"")}function lh(t,e){var n=Gi(t),i=n[ch(e)]()+1,r=n[ph(e)](),a=n[fh(e)](),o=n[dh(e)](),s=n[gh(e)](),l=0===n[yh(e)](),u=l&&0===s,h=u&&0===o,c=h&&0===a,p=c&&1===r;return p&&1===i?"year":p?"month":c?"day":h?"hour":u?"minute":l?"second":"millisecond"}function uh(t,e,n){var i="number"==typeof t?Gi(t):t;switch(e=e||lh(t,n)){case"year":return i[hh(n)]();case"half-year":return i[ch(n)]()>=6?1:0;case"quarter":return Math.floor((i[ch(n)]()+1)/4);case"month":return i[ch(n)]();case"day":return i[ph(n)]();case"half-day":return i[fh(n)]()/24;case"hour":return i[fh(n)]();case"minute":return i[dh(n)]();case"second":return i[gh(n)]();case"millisecond":return i[yh(n)]()}}function hh(t){return t?"getUTCFullYear":"getFullYear"}function ch(t){return t?"getUTCMonth":"getMonth"}function ph(t){return t?"getUTCDate":"getDate"}function fh(t){return t?"getUTCHours":"getHours"}function dh(t){return t?"getUTCMinutes":"getMinutes"}function gh(t){return t?"getUTCSeconds":"getSeconds"}function yh(t){return t?"getUTCSeconds":"getSeconds"}function vh(t){return t?"setUTCFullYear":"setFullYear"}function mh(t){return t?"setUTCMonth":"setMonth"}function _h(t){return t?"setUTCDate":"setDate"}function xh(t){return t?"setUTCHours":"setHours"}function bh(t){return t?"setUTCMinutes":"setMinutes"}function wh(t){return t?"setUTCSeconds":"setSeconds"}function Sh(t){return t?"setUTCSeconds":"setSeconds"}function Mh(t){if(!qi(t))return V(t)?t:"-";var e=(t+"").split(".");return e[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g,"$1,")+(e.length>1?"."+e[1]:"")}var Th=et,Ch=/([&<>"'])/g,Ah={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"};function Dh(t){return null==t?"":(t+"").replace(Ch,(function(t,e){return Ah[e]}))}var Ih=["a","b","c","d","e","f","g"],kh=function(t,e){return"{"+t+(null==e?"":e)+"}"};function Lh(t,e,n){z(e)||(e=[e]);var i=e.length;if(!i)return"";for(var r=e[0].$vars||[],a=0;a<r.length;a++){var o=Ih[a];t=t.replace(kh(o),kh(o,0))}for(var s=0;s<i;s++)for(var l=0;l<r.length;l++){var u=e[s][r[l]];t=t.replace(kh(Ih[l],s),n?Dh(u):u)}return t}function Ph(t,e){return e=e||"transparent",V(t)?t:W(t)&&t.colorStops&&(t.colorStops[0]||{}).color||e}var Oh=L,Rh=["left","right","top","bottom","width","height"],Nh=[["width","left","right"],["height","top","bottom"]];function Eh(t,e,n,i,r){var a=0,o=0;null==i&&(i=1/0),null==r&&(r=1/0);var s=0;e.eachChild((function(l,u){var h,c,p=l.getBoundingRect(),f=e.childAt(u+1),d=f&&f.getBoundingRect();if("horizontal"===t){var g=p.width+(d?-d.x+p.x:0);(h=a+g)>i||l.newline?(a=0,h=g,o+=s+n,s=p.height):s=Math.max(s,p.height)}else{var y=p.height+(d?-d.y+p.y:0);(c=o+y)>r||l.newline?(a+=s+n,o=0,c=y,s=p.width):s=Math.max(s,p.width)}l.newline||(l.x=a,l.y=o,l.markRedraw(),"horizontal"===t?a=h+n:o=c+n)}))}B(Eh,"vertical"),B(Eh,"horizontal");function Bh(t,e,n){n=Th(n||0);var i=e.width,r=e.height,a=Ri(t.left,i),o=Ri(t.top,r),s=Ri(t.right,i),l=Ri(t.bottom,r),u=Ri(t.width,i),h=Ri(t.height,r),c=n[2]+n[0],p=n[1]+n[3],f=t.aspect;switch(isNaN(u)&&(u=i-s-p-a),isNaN(h)&&(h=r-l-c-o),null!=f&&(isNaN(u)&&isNaN(h)&&(f>i/r?u=.8*i:h=.8*r),isNaN(u)&&(u=f*h),isNaN(h)&&(h=u/f)),isNaN(a)&&(a=i-s-u-p),isNaN(o)&&(o=r-l-h-c),t.left||t.right){case"center":a=i/2-u/2-n[3];break;case"right":a=i-u-p}switch(t.top||t.bottom){case"middle":case"center":o=r/2-h/2-n[0];break;case"bottom":o=r-h-c}a=a||0,o=o||0,isNaN(u)&&(u=i-p-a-(s||0)),isNaN(h)&&(h=r-c-o-(l||0));var d=new bn(a+n[3],o+n[0],u,h);return d.margin=n,d}function zh(t){var e=t.layoutMode||t.constructor.layoutMode;return W(e)?e:e?{type:e}:null}function Fh(t,e,n){var i=n&&n.ignoreSize;!z(i)&&(i=[i,i]);var r=o(Nh[0],0),a=o(Nh[1],1);function o(n,r){var a={},o=0,u={},h=0;if(Oh(n,(function(e){u[e]=t[e]})),Oh(n,(function(t){s(e,t)&&(a[t]=u[t]=e[t]),l(a,t)&&o++,l(u,t)&&h++})),i[r])return l(e,n[1])?u[n[2]]=null:l(e,n[2])&&(u[n[1]]=null),u;if(2!==h&&o){if(o>=2)return a;for(var c=0;c<n.length;c++){var p=n[c];if(!s(a,p)&&s(t,p)){a[p]=t[p];break}}return a}return u}function s(t,e){return t.hasOwnProperty(e)}function l(t,e){return null!=t[e]&&"auto"!==t[e]}function u(t,e,n){Oh(t,(function(t){e[t]=n[t]}))}u(Nh[0],t,r),u(Nh[1],t,a)}function Vh(t){return function(t,e){return e&&t&&Oh(Rh,(function(n){e.hasOwnProperty(n)&&(t[n]=e[n])})),t}({},t)}var Hh=hr(),Gh=function(t){function e(e,n,i){var r=t.call(this,e,n,i)||this;return r.uid=Vu("ec_cpt_model"),r}return n(e,t),e.prototype.init=function(t,e,n){this.mergeDefaultAndTheme(t,n)},e.prototype.mergeDefaultAndTheme=function(t,e){var n=zh(this),i=n?Vh(t):{};S(t,e.getTheme().get(this.mainType)),S(t,this.getDefaultOption()),n&&Fh(t,i,n)},e.prototype.mergeOption=function(t,e){S(this.option,t,!0);var n=zh(this);n&&Fh(this.option,t,n)},e.prototype.optionUpdated=function(t,e){},e.prototype.getDefaultOption=function(){var t=this.constructor;if(!function(t){return!(!t||!t[_r])}(t))return t.defaultOption;var e=Hh(this);if(!e.defaultOption){for(var n=[],i=t;i;){var r=i.prototype.defaultOption;r&&n.push(r),i=i.superClass}for(var a={},o=n.length-1;o>=0;o--)a=S(a,n[o],!0);e.defaultOption=a}return e.defaultOption},e.prototype.getReferringComponents=function(t,e){var n=t+"Index",i=t+"Id";return gr(this.ecModel,t,{index:this.get(n,!0),id:this.get(i,!0)},e)},e.prototype.getBoxLayoutParams=function(){var t=this;return{left:t.get("left"),top:t.get("top"),right:t.get("right"),bottom:t.get("bottom"),width:t.get("width"),height:t.get("height")}},e.protoInitialize=function(){var t=e.prototype;t.type="component",t.id="",t.name="",t.mainType="",t.subType="",t.componentIndex=0}(),e}(zu);Sr(Gh,zu),Ar(Gh),function(t){var e={};t.registerSubTypeDefaulter=function(t,n){var i=xr(t);e[i.main]=n},t.determineSubType=function(n,i){var r=i.type;if(!r){var a=xr(n).main;t.hasSubTypes(n)&&e[a]&&(r=e[a](i))}return r}}(Gh),function(t,e){function n(t,e){return t[e]||(t[e]={predecessor:[],successor:[]}),t[e]}t.topologicalTravel=function(t,i,r,a){if(t.length){var o=function(t){var i={},r=[];return L(t,(function(a){var o=n(i,a),s=function(t,e){var n=[];return L(t,(function(t){A(e,t)>=0&&n.push(t)})),n}(o.originalDeps=e(a),t);o.entryCount=s.length,0===o.entryCount&&r.push(a),L(s,(function(t){A(o.predecessor,t)<0&&o.predecessor.push(t);var e=n(i,t);A(e.successor,t)<0&&e.successor.push(a)}))})),{graph:i,noEntryList:r}}(i),s=o.graph,l=o.noEntryList,u={};for(L(t,(function(t){u[t]=!0}));l.length;){var h=l.pop(),c=s[h],p=!!u[h];p&&(r.call(a,h,c.originalDeps.slice()),delete u[h]),L(c.successor,p?d:f)}L(u,(function(){var t="";throw new Error(t)}))}function f(t){s[t].entryCount--,0===s[t].entryCount&&l.push(t)}function d(t){u[t]=!0,f(t)}}}(Gh,(function(t){var e=[];L(Gh.getClassesByMainType(t),(function(t){e=e.concat(t.dependencies||t.prototype.dependencies||[])})),e=P(e,(function(t){return xr(t).main})),"dataset"!==t&&A(e,"dataset")<=0&&e.unshift("dataset");return e}));var Wh="";"undefined"!=typeof navigator&&(Wh=navigator.platform||"");var Uh="rgba(0, 0, 0, 0.2)",Yh={darkMode:"auto",color:["#5470c6","#91cc75","#fac858","#ee6666","#73c0de","#3ba272","#fc8452","#9a60b4","#ea7ccc"],gradientColor:["#f6efa6","#d88273","#bf444c"],aria:{decal:{decals:[{color:Uh,dashArrayX:[1,0],dashArrayY:[2,5],symbolSize:1,rotation:Math.PI/6},{color:Uh,symbol:"circle",dashArrayX:[[8,8],[0,8,8,0]],dashArrayY:[6,0],symbolSize:.8},{color:Uh,dashArrayX:[1,0],dashArrayY:[4,3],rotation:-Math.PI/4},{color:Uh,dashArrayX:[[6,6],[0,6,6,0]],dashArrayY:[6,0]},{color:Uh,dashArrayX:[[1,0],[1,6]],dashArrayY:[1,0,6,0],rotation:Math.PI/4},{color:Uh,symbol:"triangle",dashArrayX:[[9,9],[0,9,9,0]],dashArrayY:[7,2],symbolSize:.75}]}},textStyle:{fontFamily:Wh.match(/^Win/)?"Microsoft YaHei":"sans-serif",fontSize:12,fontStyle:"normal",fontWeight:"normal"},blendMode:null,stateAnimation:{duration:300,easing:"cubicOut"},animation:"auto",animationDuration:1e3,animationDurationUpdate:500,animationEasing:"cubicInOut",animationEasingUpdate:"cubicInOut",animationThreshold:2e3,progressiveThreshold:3e3,progressive:400,hoverLayerThreshold:3e3,useUTC:!1},Xh=lt(["tooltip","label","itemName","itemId","seriesName"]),qh="original",jh="arrayRows",Zh="objectRows",Kh="keyedColumns",$h="typedArray",Jh="unknown",Qh="column",tc="row",ec=1,nc=2,ic=3,rc=hr();function ac(t,e,n){var i={},r=sc(e);if(!r||!t)return i;var a,o,s=[],l=[],u=e.ecModel,h=rc(u).datasetMap,c=r.uid+"_"+n.seriesLayoutBy;L(t=t.slice(),(function(e,n){var r=W(e)?e:t[n]={name:e};"ordinal"===r.type&&null==a&&(a=n,o=d(r)),i[r.name]=[]}));var p=h.get(c)||h.set(c,{categoryWayDim:o,valueWayDim:0});function f(t,e,n){for(var i=0;i<n;i++)t.push(e+i)}function d(t){var e=t.dimsDef;return e?e.length:1}return L(t,(function(t,e){var n=t.name,r=d(t);if(null==a){var o=p.valueWayDim;f(i[n],o,r),f(l,o,r),p.valueWayDim+=r}else if(a===e)f(i[n],0,r),f(s,0,r);else{o=p.categoryWayDim;f(i[n],o,r),f(l,o,r),p.categoryWayDim+=r}})),s.length&&(i.itemName=s),l.length&&(i.seriesName=l),i}function oc(t,e,n){var i={};if(!sc(t))return i;var r,a=e.sourceFormat,o=e.dimensionsDefine;a!==Zh&&a!==Kh||L(o,(function(t,e){"name"===(W(t)?t.name:t)&&(r=e)}));var s=function(){for(var t={},i={},s=[],l=0,u=Math.min(5,n);l<u;l++){var h=uc(e.data,a,e.seriesLayoutBy,o,e.startIndex,l);s.push(h);var c=h===ic;if(c&&null==t.v&&l!==r&&(t.v=l),(null==t.n||t.n===t.v||!c&&s[t.n]===ic)&&(t.n=l),p(t)&&s[t.n]!==ic)return t;c||(h===nc&&null==i.v&&l!==r&&(i.v=l),null!=i.n&&i.n!==i.v||(i.n=l))}function p(t){return null!=t.v&&null!=t.n}return p(t)?t:p(i)?i:null}();if(s){i.value=[s.v];var l=null!=r?r:s.n;i.itemName=[l],i.seriesName=[l]}return i}function sc(t){if(!t.get("data",!0))return gr(t.ecModel,"dataset",{index:t.get("datasetIndex",!0),id:t.get("datasetId",!0)},dr).models[0]}function lc(t,e){return uc(t.data,t.sourceFormat,t.seriesLayoutBy,t.dimensionsDefine,t.startIndex,e)}function uc(t,e,n,i,r,a){var o,s,l;if(Y(t))return ic;if(i){var u=i[a];W(u)?(s=u.name,l=u.type):V(u)&&(s=u)}if(null!=l)return"ordinal"===l?ec:ic;if(e===jh){var h=t;if(n===tc){for(var c=h[a],p=0;p<(c||[]).length&&p<5;p++)if(null!=(o=m(c[r+p])))return o}else for(p=0;p<h.length&&p<5;p++){var f=h[r+p];if(f&&null!=(o=m(f[a])))return o}}else if(e===Zh){var d=t;if(!s)return ic;for(p=0;p<d.length&&p<5;p++){if((y=d[p])&&null!=(o=m(y[s])))return o}}else if(e===Kh){if(!s)return ic;if(!(c=t[s])||Y(c))return ic;for(p=0;p<c.length&&p<5;p++)if(null!=(o=m(c[p])))return o}else if(e===qh){var g=t;for(p=0;p<g.length&&p<5;p++){var y,v=nr(y=g[p]);if(!z(v))return ic;if(null!=(o=m(v[a])))return o}}function m(t){var e=V(t);return null!=t&&isFinite(t)&&""!==t?e?nc:ic:e&&"-"!==t?ec:void 0}return ic}var hc=lt();var cc,pc,fc,dc=hr(),gc=hr(),yc=function(){function t(){}return t.prototype.getColorFromPalette=function(t,e,n){var i=Qi(this.get("color",!0)),r=this.get("colorLayer",!0);return mc(this,dc,i,r,t,e,n)},t.prototype.clearColorPalette=function(){!function(t,e){e(t).paletteIdx=0,e(t).paletteNameMap={}}(this,dc)},t}();function vc(t,e,n,i){var r=Qi(t.get(["aria","decal","decals"]));return mc(t,gc,r,null,e,n,i)}function mc(t,e,n,i,r,a,o){var s=e(a=a||t),l=s.paletteIdx||0,u=s.paletteNameMap=s.paletteNameMap||{};if(u.hasOwnProperty(r))return u[r];var h=null!=o&&i?function(t,e){for(var n=t.length,i=0;i<n;i++)if(t[i].length>e)return t[i];return t[n-1]}(i,o):n;if((h=h||n)&&h.length){var c=h[l];return r&&(u[r]=c),s.paletteIdx=(l+1)%h.length,c}}var _c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.init=function(t,e,n,i,r,a){i=i||{},this.option=null,this._theme=new zu(i),this._locale=new zu(r),this._optionManager=a},e.prototype.setOption=function(t,e,n){var i=wc(e);this._optionManager.setOption(t,n,i),this._resetOption(null,i)},e.prototype.resetOption=function(t,e){return this._resetOption(t,wc(e))},e.prototype._resetOption=function(t,e){var n=!1,i=this._optionManager;if(!t||"recreate"===t){var r=i.mountOption("recreate"===t);this.option&&"recreate"!==t?(this.restoreData(),this._mergeOption(r,e)):fc(this,r),n=!0}if("timeline"!==t&&"media"!==t||this.restoreData(),!t||"recreate"===t||"timeline"===t){var a=i.getTimelineOption(this);a&&(n=!0,this._mergeOption(a,e))}if(!t||"recreate"===t||"media"===t){var o=i.getMediaOption(this);o.length&&L(o,(function(t){n=!0,this._mergeOption(t,e)}),this)}return n},e.prototype.mergeOption=function(t){this._mergeOption(t,null)},e.prototype._mergeOption=function(t,e){var n=this.option,i=this._componentsMap,r=this._componentsCount,a=[],o=lt(),s=e&&e.replaceMergeMainTypeMap;rc(this).datasetMap=lt(),L(t,(function(t,e){null!=t&&(Gh.hasClass(e)?e&&(a.push(e),o.set(e,!0)):n[e]=null==n[e]?w(t):S(n[e],t,!0))})),s&&s.each((function(t,e){Gh.hasClass(e)&&!o.get(e)&&(a.push(e),o.set(e,!0))})),Gh.topologicalTravel(a,Gh.getAllClassMainTypes(),(function(e){var a=function(t,e,n){var i=hc.get(e);if(!i)return n;var r=i(t);return r?n.concat(r):n}(this,e,Qi(t[e])),o=i.get(e),l=o?s&&s.get(e)?"replaceMerge":"normalMerge":"replaceAll",u=ir(o,a,l);(function(t,e,n){L(t,(function(t){var i=t.newOption;W(i)&&(t.keyInfo.mainType=e,t.keyInfo.subType=function(t,e,n,i){return e.type?e.type:n?n.subType:i.determineSubType(t,e)}(e,i,t.existing,n))}))})(u,e,Gh),n[e]=null,i.set(e,null),r.set(e,0);var h=[],c=[],p=0;L(u,(function(t,n){var i=t.existing,r=t.newOption;if(r){var a="series"===e,o=Gh.getClass(e,t.keyInfo.subType,!a);if(!o)return;if(i&&i.constructor===o)i.name=t.keyInfo.name,i.mergeOption(r,this),i.optionUpdated(r,!1);else{var s=M({componentIndex:n},t.keyInfo);M(i=new o(r,this,this,s),s),t.brandNew&&(i.__requireNewView=!0),i.init(r,this,this),i.optionUpdated(null,!0)}}else i&&(i.mergeOption({},this),i.optionUpdated({},!1));i?(h.push(i.option),c.push(i),p++):(h.push(void 0),c.push(void 0))}),this),n[e]=h,i.set(e,c),r.set(e,p),"series"===e&&cc(this)}),this),this._seriesIndices||cc(this)},e.prototype.getOption=function(){var t=w(this.option);return L(t,(function(e,n){if(Gh.hasClass(n)){for(var i=Qi(e),r=i.length,a=!1,o=r-1;o>=0;o--)i[o]&&!lr(i[o])?a=!0:(i[o]=null,!a&&r--);i.length=r,t[n]=i}})),delete t["\0_ec_inner"],t},e.prototype.getTheme=function(){return this._theme},e.prototype.getLocaleModel=function(){return this._locale},e.prototype.getLocale=function(t){return this.getLocaleModel().get(t)},e.prototype.setUpdatePayload=function(t){this._payload=t},e.prototype.getUpdatePayload=function(){return this._payload},e.prototype.getComponent=function(t,e){var n=this._componentsMap.get(t);if(n){var i=n[e||0];if(i)return i;if(null==e)for(var r=0;r<n.length;r++)if(n[r])return n[r]}},e.prototype.queryComponents=function(t){var e=t.mainType;if(!e)return[];var n,i=t.index,r=t.id,a=t.name,o=this._componentsMap.get(e);return o&&o.length?(null!=i?(n=[],L(Qi(i),(function(t){o[t]&&n.push(o[t])}))):n=null!=r?xc("id",r,o):null!=a?xc("name",a,o):R(o,(function(t){return!!t})),bc(n,t)):[]},e.prototype.findComponents=function(t){var e,n,i,r,a,o=t.query,s=t.mainType,l=(n=s+"Index",i=s+"Id",r=s+"Name",!(e=o)||null==e[n]&&null==e[i]&&null==e[r]?null:{mainType:s,index:e[n],id:e[i],name:e[r]}),u=l?this.queryComponents(l):R(this._componentsMap.get(s),(function(t){return!!t}));return a=bc(u,t),t.filter?R(a,t.filter):a},e.prototype.eachComponent=function(t,e,n){var i=this._componentsMap;if(F(t)){var r=e,a=t;i.each((function(t,e){for(var n=0;t&&n<t.length;n++){var i=t[n];i&&a.call(r,e,i,i.componentIndex)}}))}else for(var o=V(t)?i.get(t):W(t)?this.findComponents(t):null,s=0;o&&s<o.length;s++){var l=o[s];l&&e.call(n,l,l.componentIndex)}},e.prototype.getSeriesByName=function(t){var e=or(t,null);return R(this._componentsMap.get("series"),(function(t){return!!t&&null!=e&&t.name===e}))},e.prototype.getSeriesByIndex=function(t){return this._componentsMap.get("series")[t]},e.prototype.getSeriesByType=function(t){return R(this._componentsMap.get("series"),(function(e){return!!e&&e.subType===t}))},e.prototype.getSeries=function(){return R(this._componentsMap.get("series").slice(),(function(t){return!!t}))},e.prototype.getSeriesCount=function(){return this._componentsCount.get("series")},e.prototype.eachSeries=function(t,e){pc(this),L(this._seriesIndices,(function(n){var i=this._componentsMap.get("series")[n];t.call(e,i,n)}),this)},e.prototype.eachRawSeries=function(t,e){L(this._componentsMap.get("series"),(function(n){n&&t.call(e,n,n.componentIndex)}))},e.prototype.eachSeriesByType=function(t,e,n){pc(this),L(this._seriesIndices,(function(i){var r=this._componentsMap.get("series")[i];r.subType===t&&e.call(n,r,i)}),this)},e.prototype.eachRawSeriesByType=function(t,e,n){return L(this.getSeriesByType(t),e,n)},e.prototype.isSeriesFiltered=function(t){return pc(this),null==this._seriesIndicesMap.get(t.componentIndex)},e.prototype.getCurrentSeriesIndices=function(){return(this._seriesIndices||[]).slice()},e.prototype.filterSeries=function(t,e){pc(this);var n=[];L(this._seriesIndices,(function(i){var r=this._componentsMap.get("series")[i];t.call(e,r,i)&&n.push(i)}),this),this._seriesIndices=n,this._seriesIndicesMap=lt(n)},e.prototype.restoreData=function(t){cc(this);var e=this._componentsMap,n=[];e.each((function(t,e){Gh.hasClass(e)&&n.push(e)})),Gh.topologicalTravel(n,Gh.getAllClassMainTypes(),(function(n){L(e.get(n),(function(e){!e||"series"===n&&function(t,e){if(e){var n=e.seriesIndex,i=e.seriesId,r=e.seriesName;return null!=n&&t.componentIndex!==n||null!=i&&t.id!==i||null!=r&&t.name!==r}}(e,t)||e.restoreData()}))}))},e.internalField=(cc=function(t){var e=t._seriesIndices=[];L(t._componentsMap.get("series"),(function(t){t&&e.push(t.componentIndex)})),t._seriesIndicesMap=lt(e)},pc=function(t){},void(fc=function(t,e){t.option={},t.option["\0_ec_inner"]=1,t._componentsMap=lt({series:[]}),t._componentsCount=lt();var n=e.aria;W(n)&&null==n.enabled&&(n.enabled=!0),function(t,e){var n=t.color&&!t.colorLayer;L(e,(function(e,i){"colorLayer"===i&&n||Gh.hasClass(i)||("object"==typeof e?t[i]=t[i]?S(t[i],e,!1):w(e):null==t[i]&&(t[i]=e))}))}(e,t._theme.option),S(e,Yh,!1),t._mergeOption(e,null)})),e}(zu);function xc(t,e,n){if(z(e)){var i=lt();return L(e,(function(t){null!=t&&(null!=or(t,null)&&i.set(t,!0))})),R(n,(function(e){return e&&i.get(e[t])}))}var r=or(e,null);return R(n,(function(e){return e&&null!=r&&e[t]===r}))}function bc(t,e){return e.hasOwnProperty("subType")?R(t,(function(t){return t&&t.subType===e.subType})):t}function wc(t){var e=lt();return t&&L(Qi(t.replaceMerge),(function(t){e.set(t,!0)})),{replaceMergeMainTypeMap:e}}I(_c,yc);var Sc=["getDom","getZr","getWidth","getHeight","getDevicePixelRatio","dispatchAction","isDisposed","on","off","getDataURL","getConnectedDataURL","getOption","getId","updateLabelLayout"],Mc=function(t){L(Sc,(function(e){this[e]=E(t[e],t)}),this)},Tc={},Cc=function(){function t(){this._coordinateSystems=[]}return t.prototype.create=function(t,e){var n=[];L(Tc,(function(i,r){var a=i.create(t,e);n=n.concat(a||[])})),this._coordinateSystems=n},t.prototype.update=function(t,e){L(this._coordinateSystems,(function(n){n.update&&n.update(t,e)}))},t.prototype.getCoordinateSystems=function(){return this._coordinateSystems.slice()},t.register=function(t,e){Tc[t]=e},t.get=function(t){return Tc[t]},t}(),Ac=/^(min|max)?(.+)$/,Dc=function(){function t(t){this._timelineOptions=[],this._mediaList=[],this._currentMediaIndices=[],this._api=t}return t.prototype.setOption=function(t,e,n){t&&(L(Qi(t.series),(function(t){t&&t.data&&Y(t.data)&&at(t.data)})),L(Qi(t.dataset),(function(t){t&&t.source&&Y(t.source)&&at(t.source)}))),t=w(t);var i=this._optionBackup,r=function(t,e,n){var i,r,a=[],o=t.baseOption,s=t.timeline,l=t.options,u=t.media,h=!!t.media,c=!!(l||s||o&&o.timeline);o?(r=o).timeline||(r.timeline=s):((c||h)&&(t.options=t.media=null),r=t);h&&z(u)&&L(u,(function(t){t&&t.option&&(t.query?a.push(t):i||(i=t))}));function p(t){L(e,(function(e){e(t,n)}))}return p(r),L(l,(function(t){return p(t)})),L(a,(function(t){return p(t.option)})),{baseOption:r,timelineOptions:l||[],mediaDefault:i,mediaList:a}}(t,e,!i);this._newBaseOption=r.baseOption,i?(r.timelineOptions.length&&(i.timelineOptions=r.timelineOptions),r.mediaList.length&&(i.mediaList=r.mediaList),r.mediaDefault&&(i.mediaDefault=r.mediaDefault)):this._optionBackup=r},t.prototype.mountOption=function(t){var e=this._optionBackup;return this._timelineOptions=e.timelineOptions,this._mediaList=e.mediaList,this._mediaDefault=e.mediaDefault,this._currentMediaIndices=[],w(t?e.baseOption:this._newBaseOption)},t.prototype.getTimelineOption=function(t){var e,n=this._timelineOptions;if(n.length){var i=t.getComponent("timeline");i&&(e=w(n[i.getCurrentIndex()]))}return e},t.prototype.getMediaOption=function(t){var e,n,i=this._api.getWidth(),r=this._api.getHeight(),a=this._mediaList,o=this._mediaDefault,s=[],l=[];if(!a.length&&!o)return l;for(var u=0,h=a.length;u<h;u++)Ic(a[u].query,i,r)&&s.push(u);return!s.length&&o&&(s=[-1]),s.length&&(e=s,n=this._currentMediaIndices,e.join(",")!==n.join(","))&&(l=P(s,(function(t){return w(-1===t?o.option:a[t].option)}))),this._currentMediaIndices=s,l},t}();function Ic(t,e,n){var i={width:e,height:n,aspectratio:e/n},r=!0;return L(t,(function(t,e){var n=e.match(Ac);if(n&&n[1]&&n[2]){var a=n[1],o=n[2].toLowerCase();(function(t,e,n){return"min"===n?t>=e:"max"===n?t<=e:t===e})(i[o],t,a)||(r=!1)}})),r}var kc=L,Lc=W,Pc=["areaStyle","lineStyle","nodeStyle","linkStyle","chordStyle","label","labelLine"];function Oc(t){var e=t&&t.itemStyle;if(e)for(var n=0,i=Pc.length;n<i;n++){var r=Pc[n],a=e.normal,o=e.emphasis;a&&a[r]&&(t[r]=t[r]||{},t[r].normal?S(t[r].normal,a[r]):t[r].normal=a[r],a[r]=null),o&&o[r]&&(t[r]=t[r]||{},t[r].emphasis?S(t[r].emphasis,o[r]):t[r].emphasis=o[r],o[r]=null)}}function Rc(t,e,n){if(t&&t[e]&&(t[e].normal||t[e].emphasis)){var i=t[e].normal,r=t[e].emphasis;i&&(n?(t[e].normal=t[e].emphasis=null,T(t[e],i)):t[e]=i),r&&(t.emphasis=t.emphasis||{},t.emphasis[e]=r,r.focus&&(t.emphasis.focus=r.focus),r.blurScope&&(t.emphasis.blurScope=r.blurScope))}}function Nc(t){Rc(t,"itemStyle"),Rc(t,"lineStyle"),Rc(t,"areaStyle"),Rc(t,"label"),Rc(t,"labelLine"),Rc(t,"upperLabel"),Rc(t,"edgeLabel")}function Ec(t,e){var n=Lc(t)&&t[e],i=Lc(n)&&n.textStyle;if(i){0;for(var r=0,a=er.length;r<a;r++){var o=er[r];i.hasOwnProperty(o)&&(n[o]=i[o])}}}function Bc(t){t&&(Nc(t),Ec(t,"label"),t.emphasis&&Ec(t.emphasis,"label"))}function zc(t){return z(t)?t:t?[t]:[]}function Fc(t){return(z(t)?t[0]:t)||{}}function Vc(t,e){kc(zc(t.series),(function(t){Lc(t)&&function(t){if(Lc(t)){Oc(t),Nc(t),Ec(t,"label"),Ec(t,"upperLabel"),Ec(t,"edgeLabel"),t.emphasis&&(Ec(t.emphasis,"label"),Ec(t.emphasis,"upperLabel"),Ec(t.emphasis,"edgeLabel"));var e=t.markPoint;e&&(Oc(e),Bc(e));var n=t.markLine;n&&(Oc(n),Bc(n));var i=t.markArea;i&&Bc(i);var r=t.data;if("graph"===t.type){r=r||t.nodes;var a=t.links||t.edges;if(a&&!Y(a))for(var o=0;o<a.length;o++)Bc(a[o]);L(t.categories,(function(t){Nc(t)}))}if(r&&!Y(r))for(o=0;o<r.length;o++)Bc(r[o]);if((e=t.markPoint)&&e.data){var s=e.data;for(o=0;o<s.length;o++)Bc(s[o])}if((n=t.markLine)&&n.data){var l=n.data;for(o=0;o<l.length;o++)z(l[o])?(Bc(l[o][0]),Bc(l[o][1])):Bc(l[o])}"gauge"===t.type?(Ec(t,"axisLabel"),Ec(t,"title"),Ec(t,"detail")):"treemap"===t.type?(Rc(t.breadcrumb,"itemStyle"),L(t.levels,(function(t){Nc(t)}))):"tree"===t.type&&Nc(t.leaves)}}(t)}));var n=["xAxis","yAxis","radiusAxis","angleAxis","singleAxis","parallelAxis","radar"];e&&n.push("valueAxis","categoryAxis","logAxis","timeAxis"),kc(n,(function(e){kc(zc(t[e]),(function(t){t&&(Ec(t,"axisLabel"),Ec(t.axisPointer,"label"))}))})),kc(zc(t.parallel),(function(t){var e=t&&t.parallelAxisDefault;Ec(e,"axisLabel"),Ec(e&&e.axisPointer,"label")})),kc(zc(t.calendar),(function(t){Rc(t,"itemStyle"),Ec(t,"dayLabel"),Ec(t,"monthLabel"),Ec(t,"yearLabel")})),kc(zc(t.radar),(function(t){Ec(t,"name"),t.name&&null==t.axisName&&(t.axisName=t.name,delete t.name),null!=t.nameGap&&null==t.axisNameGap&&(t.axisNameGap=t.nameGap,delete t.nameGap)})),kc(zc(t.geo),(function(t){Lc(t)&&(Bc(t),kc(zc(t.regions),(function(t){Bc(t)})))})),kc(zc(t.timeline),(function(t){Bc(t),Rc(t,"label"),Rc(t,"itemStyle"),Rc(t,"controlStyle",!0);var e=t.data;z(e)&&L(e,(function(t){W(t)&&(Rc(t,"label"),Rc(t,"itemStyle"))}))})),kc(zc(t.toolbox),(function(t){Rc(t,"iconStyle"),kc(t.feature,(function(t){Rc(t,"iconStyle")}))})),Ec(Fc(t.axisPointer),"label"),Ec(Fc(t.tooltip).axisPointer,"label")}function Hc(t){t&&L(Gc,(function(e){e[0]in t&&!(e[1]in t)&&(t[e[1]]=t[e[0]])}))}var Gc=[["x","left"],["y","top"],["x2","right"],["y2","bottom"]],Wc=["grid","geo","parallel","legend","toolbox","title","visualMap","dataZoom","timeline"],Uc=[["borderRadius","barBorderRadius"],["borderColor","barBorderColor"],["borderWidth","barBorderWidth"]];function Yc(t){var e=t&&t.itemStyle;if(e)for(var n=0;n<Uc.length;n++){var i=Uc[n][1],r=Uc[n][0];null!=e[i]&&(e[r]=e[i])}}function Xc(t){t&&"edge"===t.alignTo&&null!=t.margin&&null==t.edgeDistance&&(t.edgeDistance=t.margin)}function qc(t){t&&t.downplay&&!t.blur&&(t.blur=t.downplay)}function jc(t,e){if(t)for(var n=0;n<t.length;n++)e(t[n]),t[n]&&jc(t[n].children,e)}function Zc(t,e){Vc(t,e),t.series=Qi(t.series),L(t.series,(function(t){if(W(t)){var e=t.type;if("line"===e)null!=t.clipOverflow&&(t.clip=t.clipOverflow);else if("pie"===e||"gauge"===e){if(null!=t.clockWise&&(t.clockwise=t.clockWise),Xc(t.label),(r=t.data)&&!Y(r))for(var n=0;n<r.length;n++)Xc(r[n]);null!=t.hoverOffset&&(t.emphasis=t.emphasis||{},(t.emphasis.scaleSize=null)&&(t.emphasis.scaleSize=t.hoverOffset))}else if("gauge"===e){var i=function(t,e){for(var n=e.split(","),i=t,r=0;r<n.length&&null!=(i=i&&i[n[r]]);r++);return i}(t,"pointer.color");null!=i&&function(t,e,n,i){for(var r,a=e.split(","),o=t,s=0;s<a.length-1;s++)null==o[r=a[s]]&&(o[r]={}),o=o[r];(i||null==o[a[s]])&&(o[a[s]]=n)}(t,"itemStyle.color",i)}else if("bar"===e){var r;if(Yc(t),Yc(t.backgroundStyle),Yc(t.emphasis),(r=t.data)&&!Y(r))for(n=0;n<r.length;n++)"object"==typeof r[n]&&(Yc(r[n]),Yc(r[n]&&r[n].emphasis))}else if("sunburst"===e){var a=t.highlightPolicy;a&&(t.emphasis=t.emphasis||{},t.emphasis.focus||(t.emphasis.focus=a)),qc(t),jc(t.data,qc)}else"graph"===e||"sankey"===e?function(t){t&&null!=t.focusNodeAdjacency&&(t.emphasis=t.emphasis||{},null==t.emphasis.focus&&(t.emphasis.focus="adjacency"))}(t):"map"===e&&(t.mapType&&!t.map&&(t.map=t.mapType),t.mapLocation&&T(t,t.mapLocation));null!=t.hoverAnimation&&(t.emphasis=t.emphasis||{},t.emphasis&&null==t.emphasis.scale&&(t.emphasis.scale=t.hoverAnimation)),Hc(t)}})),t.dataRange&&(t.visualMap=t.dataRange),L(Wc,(function(e){var n=t[e];n&&(z(n)||(n=[n]),L(n,(function(t){Hc(t)})))}))}function Kc(t){L(t,(function(e,n){var i=[],r=[NaN,NaN],a=[e.stackResultDimension,e.stackedOverDimension],o=e.data,s=e.isStackedByIndex,l=o.map(a,(function(a,l,u){var h,c,p=o.get(e.stackedDimension,u);if(isNaN(p))return r;s?c=o.getRawIndex(u):h=o.get(e.stackedByDimension,u);for(var f=NaN,d=n-1;d>=0;d--){var g=t[d];if(s||(c=g.data.rawIndexOf(g.stackedByDimension,h)),c>=0){var y=g.data.getByRawIndex(g.stackResultDimension,c);if(p>=0&&y>0||p<=0&&y<0){p+=y,f=y;break}}}return i[0]=p,i[1]=f,i}));o.hostModel.setData(l),e.data=l}))}var $c,Jc,Qc,tp,ep,np=function(t){this.data=t.data||(t.sourceFormat===Kh?{}:[]),this.sourceFormat=t.sourceFormat||Jh,this.seriesLayoutBy=t.seriesLayoutBy||Qh,this.startIndex=t.startIndex||0,this.dimensionsDefine=t.dimensionsDefine,this.dimensionsDetectedCount=t.dimensionsDetectedCount,this.encodeDefine=t.encodeDefine,this.metaRawOption=t.metaRawOption};function ip(t){return t instanceof np}function rp(t,e,n,i){n=n||sp(t);var r=e.seriesLayoutBy,a=function(t,e,n,i,r){var a,o;if(!t)return{dimensionsDefine:lp(r),startIndex:o,dimensionsDetectedCount:a};if(e===jh){var s=t;"auto"===i||null==i?up((function(t){null!=t&&"-"!==t&&(V(t)?null==o&&(o=1):o=0)}),n,s,10):o=G(i)?i:i?1:0,r||1!==o||(r=[],up((function(t,e){r[e]=null!=t?t+"":""}),n,s,1/0)),a=r?r.length:n===tc?s.length:s[0]?s[0].length:null}else if(e===Zh)r||(r=function(t){var e,n=0;for(;n<t.length&&!(e=t[n++]););if(e){var i=[];return L(e,(function(t,e){i.push(e)})),i}}(t));else if(e===Kh)r||(r=[],L(t,(function(t,e){r.push(e)})));else if(e===qh){var l=nr(t[0]);a=z(l)&&l.length||1}return{startIndex:o,dimensionsDefine:lp(r),dimensionsDetectedCount:a}}(t,n,r,e.sourceHeader,e.dimensions);return new np({data:t,sourceFormat:n,seriesLayoutBy:r,dimensionsDefine:a.dimensionsDefine,startIndex:a.startIndex,dimensionsDetectedCount:a.dimensionsDetectedCount,encodeDefine:op(i),metaRawOption:w(e)})}function ap(t){return new np({data:t,sourceFormat:Y(t)?$h:qh})}function op(t){return t?lt(t):null}function sp(t){var e=Jh;if(Y(t))e=$h;else if(z(t)){0===t.length&&(e=jh);for(var n=0,i=t.length;n<i;n++){var r=t[n];if(null!=r){if(z(r)){e=jh;break}if(W(r)){e=Zh;break}}}}else if(W(t))for(var a in t)if(ht(t,a)&&k(t[a])){e=Kh;break}return e}function lp(t){if(t){var e=lt();return P(t,(function(t,n){var i={name:(t=W(t)?t:{name:t}).name,displayName:t.displayName,type:t.type};if(null==i.name)return i;i.name+="",null==i.displayName&&(i.displayName=i.name);var r=e.get(i.name);return r?i.name+="-"+r.count++:e.set(i.name,{count:1}),i}))}}function up(t,e,n,i){if(e===tc)for(var r=0;r<n.length&&r<i;r++)t(n[r]?n[r][0]:null,r);else{var a=n[0]||[];for(r=0;r<a.length&&r<i;r++)t(a[r],r)}}var hp=function(){function t(t,e){var n=ip(t)?t:ap(t);this._source=n;var i=this._data=n.data;n.sourceFormat===$h&&(this._offset=0,this._dimSize=e,this._data=i),ep(this,i,n)}return t.prototype.getSource=function(){return this._source},t.prototype.count=function(){return 0},t.prototype.getItem=function(t,e){},t.prototype.appendData=function(t){},t.prototype.clean=function(){},t.protoInitialize=function(){var e=t.prototype;e.pure=!1,e.persistent=!0}(),t.internalField=function(){var t;ep=function(t,r,a){var o=a.sourceFormat,s=a.seriesLayoutBy,l=a.startIndex,u=a.dimensionsDefine,h=tp[xp(o,s)];if(M(t,h),o===$h)t.getItem=e,t.count=i,t.fillStorage=n;else{var c=fp(o,s);t.getItem=E(c,null,r,l,u);var p=yp(o,s);t.count=E(p,null,r,l,u)}};var e=function(t,e){t-=this._offset,e=e||[];for(var n=this._data,i=this._dimSize,r=i*t,a=0;a<i;a++)e[a]=n[r+a];return e},n=function(t,e,n,i){for(var r=this._data,a=this._dimSize,o=0;o<a;o++){for(var s=i[o],l=null==s[0]?1/0:s[0],u=null==s[1]?-1/0:s[1],h=e-t,c=n[o],p=0;p<h;p++){var f=r[p*a+o];c[t+p]=f,f<l&&(l=f),f>u&&(u=f)}s[0]=l,s[1]=u}},i=function(){return this._data?this._data.length/this._dimSize:0};function r(t){for(var e=0;e<t.length;e++)this._data.push(t[e])}(t={}).arrayRows_column={pure:!0,appendData:r},t.arrayRows_row={pure:!0,appendData:function(){throw new Error('Do not support appendData when set seriesLayoutBy: "row".')}},t.objectRows={pure:!0,appendData:r},t.keyedColumns={pure:!0,appendData:function(t){var e=this._data;L(t,(function(t,n){for(var i=e[n]||(e[n]=[]),r=0;r<(t||[]).length;r++)i.push(t[r])}))}},t.original={appendData:r},t.typedArray={persistent:!1,pure:!0,appendData:function(t){this._data=t},clean:function(){this._offset+=this.count(),this._data=null}},tp=t}(),t}(),cp=function(t,e,n,i){return t[i]},pp=(($c={}).arrayRows_column=function(t,e,n,i){return t[i+e]},$c.arrayRows_row=function(t,e,n,i){i+=e;for(var r=[],a=t,o=0;o<a.length;o++){var s=a[o];r.push(s?s[i]:null)}return r},$c.objectRows=cp,$c.keyedColumns=function(t,e,n,i){for(var r=[],a=0;a<n.length;a++){var o=n[a].name;0;var s=t[o];r.push(s?s[i]:null)}return r},$c.original=cp,$c);function fp(t,e){var n=pp[xp(t,e)];return n}var dp=function(t,e,n){return t.length},gp=((Jc={}).arrayRows_column=function(t,e,n){return Math.max(0,t.length-e)},Jc.arrayRows_row=function(t,e,n){var i=t[0];return i?Math.max(0,i.length-e):0},Jc.objectRows=dp,Jc.keyedColumns=function(t,e,n){var i=n[0].name;var r=t[i];return r?r.length:0},Jc.original=dp,Jc);function yp(t,e){var n=gp[xp(t,e)];return n}var vp=function(t,e,n){return null!=e?t[e]:t},mp=((Qc={}).arrayRows=vp,Qc.objectRows=function(t,e,n){return null!=e?t[n]:t},Qc.keyedColumns=vp,Qc.original=function(t,e,n){var i=nr(t);return null!=e&&i instanceof Array?i[e]:i},Qc.typedArray=vp,Qc);function _p(t){var e=mp[t];return e}function xp(t,e){return t===jh?t+"_"+e:t}function bp(t,e,n){if(t){var i=t.getRawDataItem(e);if(null!=i){var r,a,o=t.getProvider().getSource().sourceFormat,s=t.getDimensionInfo(n);return s&&(r=s.name,a=s.index),_p(o)(i,a,r)}}}var wp=/\{@(.+?)\}/g,Sp=function(){function t(){}return t.prototype.getDataParams=function(t,e){var n=this.getData(e),i=this.getRawValue(t,e),r=n.getRawIndex(t),a=n.getName(t),o=n.getRawDataItem(t),s=n.getItemVisual(t,"style"),l=s&&s[n.getItemVisual(t,"drawType")||"fill"],u=s&&s.stroke,h=this.mainType,c="series"===h,p=n.userOutput;return{componentType:h,componentSubType:this.subType,componentIndex:this.componentIndex,seriesType:c?this.subType:null,seriesIndex:this.seriesIndex,seriesId:c?this.id:null,seriesName:c?this.name:null,name:a,dataIndex:r,data:o,dataType:e,value:i,color:l,borderColor:u,dimensionNames:p?p.dimensionNames:null,encode:p?p.encode:null,$vars:["seriesName","name","value"]}},t.prototype.getFormattedLabel=function(t,e,n,i,r,a){e=e||"normal";var o=this.getData(n),s=this.getDataParams(t,n);(a&&(s.value=a.interpolatedValue),null!=i&&z(s.value)&&(s.value=s.value[i]),r)||(r=o.getItemModel(t).get("normal"===e?["label","formatter"]:[e,"label","formatter"]));return"function"==typeof r?(s.status=e,s.dimensionIndex=i,r(s)):"string"==typeof r?Lh(r,s).replace(wp,(function(e,n){var i=n.length,r="["===n.charAt(0)&&"]"===n.charAt(i-1)?+n.slice(1,i-1):n,s=bp(o,t,r);if(a&&z(a.interpolatedValue)){var l=o.getDimensionInfo(r);l&&(s=a.interpolatedValue[l.index])}return null!=s?s+"":""})):void 0},t.prototype.getRawValue=function(t,e){return bp(this.getData(e),t)},t.prototype.formatTooltip=function(t,e,n){},t}();function Mp(t){return new Tp(t)}var Tp=function(){function t(t){t=t||{},this._reset=t.reset,this._plan=t.plan,this._count=t.count,this._onDirty=t.onDirty,this._dirty=!0}return t.prototype.perform=function(t){var e,n=this._upstream,i=t&&t.skip;if(this._dirty&&n){var r=this.context;r.data=r.outputData=n.context.outputData}this.__pipeline&&(this.__pipeline.currentTask=this),this._plan&&!i&&(e=this._plan(this.context));var a,o=h(this._modBy),s=this._modDataCount||0,l=h(t&&t.modBy),u=t&&t.modDataCount||0;function h(t){return!(t>=1)&&(t=1),t}o===l&&s===u||(e="reset"),(this._dirty||"reset"===e)&&(this._dirty=!1,a=this._doReset(i)),this._modBy=l,this._modDataCount=u;var c=t&&t.step;if(this._dueEnd=n?n._outputDueEnd:this._count?this._count(this.context):1/0,this._progress){var p=this._dueIndex,f=Math.min(null!=c?this._dueIndex+c:1/0,this._dueEnd);if(!i&&(a||p<f)){var d=this._progress;if(z(d))for(var g=0;g<d.length;g++)this._doProgress(d[g],p,f,l,u);else this._doProgress(d,p,f,l,u)}this._dueIndex=f;var y=null!=this._settedOutputEnd?this._settedOutputEnd:f;0,this._outputDueEnd=y}else this._dueIndex=this._outputDueEnd=null!=this._settedOutputEnd?this._settedOutputEnd:this._dueEnd;return this.unfinished()},t.prototype.dirty=function(){this._dirty=!0,this._onDirty&&this._onDirty(this.context)},t.prototype._doProgress=function(t,e,n,i,r){Cp.reset(e,n,i,r),this._callingProgress=t,this._callingProgress({start:e,end:n,count:n-e,next:Cp.next},this.context)},t.prototype._doReset=function(t){var e,n;this._dueIndex=this._outputDueEnd=this._dueEnd=0,this._settedOutputEnd=null,!t&&this._reset&&((e=this._reset(this.context))&&e.progress&&(n=e.forceFirstProgress,e=e.progress),z(e)&&!e.length&&(e=null)),this._progress=e,this._modBy=this._modDataCount=null;var i=this._downstream;return i&&i.dirty(),n},t.prototype.unfinished=function(){return this._progress&&this._dueIndex<this._dueEnd},t.prototype.pipe=function(t){(this._downstream!==t||this._dirty)&&(this._downstream=t,t._upstream=this,t.dirty())},t.prototype.dispose=function(){this._disposed||(this._upstream&&(this._upstream._downstream=null),this._downstream&&(this._downstream._upstream=null),this._dirty=!1,this._disposed=!0)},t.prototype.getUpstream=function(){return this._upstream},t.prototype.getDownstream=function(){return this._downstream},t.prototype.setOutputEnd=function(t){this._outputDueEnd=this._settedOutputEnd=t},t}(),Cp=function(){var t,e,n,i,r,a={reset:function(l,u,h,c){e=l,t=u,n=h,i=c,r=Math.ceil(i/n),a.next=n>1&&i>0?s:o}};return a;function o(){return e<t?e++:null}function s(){var a=e%r*n+Math.ceil(e/r),o=e>=t?null:a<i?a:e;return e++,o}}();function Ap(t,e){var n=e&&e.type;if("ordinal"===n){var i=e&&e.ordinalMeta;return i?i.parseAndCollect(t):t}return"time"===n&&"number"!=typeof t&&null!=t&&"-"!==t&&(t=+Gi(t)),null==t||""===t?NaN:+t}lt({number:function(t){return parseFloat(t)},time:function(t){return+Gi(t)},trim:function(t){return"string"==typeof t?it(t):t}});var Dp=function(){function t(){}return t.prototype.getRawData=function(){throw new Error("not supported")},t.prototype.getRawDataItem=function(t){throw new Error("not supported")},t.prototype.cloneRawData=function(){},t.prototype.getDimensionInfo=function(t){},t.prototype.cloneAllDimensionInfo=function(){},t.prototype.count=function(){},t.prototype.retrieveValue=function(t,e){},t.prototype.retrieveValueFromItem=function(t,e){},t.prototype.convertValue=function(t,e){return Ap(t,e)},t}();function Ip(t){var e=t.sourceFormat;if(!Np(e)){var n="";0,$i(n)}return t.data}function kp(t){var e=t.sourceFormat,n=t.data;if(!Np(e)){var i="";0,$i(i)}if(e===jh){for(var r=[],a=0,o=n.length;a<o;a++)r.push(n[a].slice());return r}if(e===Zh){for(r=[],a=0,o=n.length;a<o;a++)r.push(M({},n[a]));return r}}function Lp(t,e,n){if(null!=n)return"number"==typeof n||!isNaN(n)&&!ht(e,n)?t[n]:ht(e,n)?e[n]:void 0}function Pp(t){return w(t)}var Op=lt();function Rp(t,e,n,i){var r="";e.length||$i(r),W(t)||$i(r);var a=t.type,o=Op.get(a);o||$i(r);var s=P(e,(function(t){return function(t,e){var n=new Dp,i=t.data,r=n.sourceFormat=t.sourceFormat,a=t.startIndex,o="";t.seriesLayoutBy!==Qh&&$i(o);var s=[],l={},u=t.dimensionsDefine;if(u)L(u,(function(t,e){var n=t.name,i={index:e,name:n,displayName:t.displayName};if(s.push(i),null!=n){var r="";ht(l,n)&&$i(r),l[n]=i}}));else for(var h=0;h<t.dimensionsDetectedCount;h++)s.push({index:h});var c=fp(r,Qh);e.__isBuiltIn&&(n.getRawDataItem=function(t){return c(i,a,s,t)},n.getRawData=E(Ip,null,t)),n.cloneRawData=E(kp,null,t);var p=yp(r,Qh);n.count=E(p,null,i,a,s);var f=_p(r);n.retrieveValue=function(t,e){var n=c(i,a,s,t);return d(n,e)};var d=n.retrieveValueFromItem=function(t,e){if(null!=t){var n=s[e];return n?f(t,e,n.name):void 0}};return n.getDimensionInfo=E(Lp,null,s,l),n.cloneAllDimensionInfo=E(Pp,null,s),n}(t,o)})),l=Qi(o.transform({upstream:s[0],upstreamList:s,config:w(t.config)}));return P(l,(function(t,n){var i,r="";W(t)||$i(r),t.data||$i(r),Np(sp(t.data))||$i(r);var a=e[0];if(a&&0===n&&!t.dimensions){var o=a.startIndex;o&&(t.data=a.data.slice(0,o).concat(t.data)),i={seriesLayoutBy:Qh,sourceHeader:o,dimensions:a.metaRawOption.dimensions}}else i={seriesLayoutBy:Qh,sourceHeader:0,dimensions:t.dimensions};return rp(t.data,i,null,null)}))}function Np(t){return t===jh||t===Zh}var Ep=function(){function t(t){this._sourceList=[],this._upstreamSignList=[],this._versionSignBase=0,this._sourceHost=t}return t.prototype.dirty=function(){this._setLocalSource([],[])},t.prototype._setLocalSource=function(t,e){this._sourceList=t,this._upstreamSignList=e,this._versionSignBase++,this._versionSignBase>9e10&&(this._versionSignBase=0)},t.prototype._getVersionSign=function(){return this._sourceHost.uid+"_"+this._versionSignBase},t.prototype.prepareSource=function(){this._isDirty()&&this._createSource()},t.prototype._createSource=function(){this._setLocalSource([],[]);var t,e,n=this._sourceHost,i=this._getUpstreamSourceManagers(),r=!!i.length;if(zp(n)){var a=n,o=void 0,s=void 0,l=void 0;if(r){var u=i[0];u.prepareSource(),o=(l=u.getSource()).data,s=l.sourceFormat,e=[u._getVersionSign()]}else s=Y(o=a.get("data",!0))?$h:qh,e=[];var h=this._getSourceMetaRawOption(),c=l?l.metaRawOption:null;t=[rp(o,{seriesLayoutBy:J(h.seriesLayoutBy,c?c.seriesLayoutBy:null),sourceHeader:J(h.sourceHeader,c?c.sourceHeader:null),dimensions:J(h.dimensions,c?c.dimensions:null)},s,a.get("encode",!0))]}else{var p=n;if(r){var f=this._applyTransform(i);t=f.sourceList,e=f.upstreamSignList}else{t=[rp(p.get("source",!0),this._getSourceMetaRawOption(),null,null)],e=[]}}this._setLocalSource(t,e)},t.prototype._applyTransform=function(t){var e,n=this._sourceHost,i=n.get("transform",!0),r=n.get("fromTransformResult",!0);if(null!=r){var a="";1!==t.length&&Fp(a)}var o,s=[],l=[];return L(t,(function(t){t.prepareSource();var e=t.getSource(r||0),n="";null==r||e||Fp(n),s.push(e),l.push(t._getVersionSign())})),i?e=function(t,e,n){var i=Qi(t),r=i.length,a="";r||$i(a);for(var o=0,s=r;o<s;o++)e=Rp(i[o],e),o!==s-1&&(e.length=Math.max(e.length,1));return e}(i,s,n.componentIndex):null!=r&&(e=[(o=s[0],new np({data:o.data,sourceFormat:o.sourceFormat,seriesLayoutBy:o.seriesLayoutBy,dimensionsDefine:w(o.dimensionsDefine),startIndex:o.startIndex,dimensionsDetectedCount:o.dimensionsDetectedCount,encodeDefine:op(o.encodeDefine)}))]),{sourceList:e,upstreamSignList:l}},t.prototype._isDirty=function(){if(!this._sourceList.length)return!0;for(var t=this._getUpstreamSourceManagers(),e=0;e<t.length;e++){var n=t[e];if(n._isDirty()||this._upstreamSignList[e]!==n._getVersionSign())return!0}},t.prototype.getSource=function(t){return this._sourceList[t||0]},t.prototype._getUpstreamSourceManagers=function(){var t=this._sourceHost;if(zp(t)){var e=sc(t);return e?[e.getSourceManager()]:[]}return P(function(t){return t.get("transform",!0)||t.get("fromTransformResult",!0)?gr(t.ecModel,"dataset",{index:t.get("fromDatasetIndex",!0),id:t.get("fromDatasetId",!0)},dr).models:[]}(t),(function(t){return t.getSourceManager()}))},t.prototype._getSourceMetaRawOption=function(){var t,e,n,i=this._sourceHost;if(zp(i))t=i.get("seriesLayoutBy",!0),e=i.get("sourceHeader",!0),n=i.get("dimensions",!0);else if(!this._getUpstreamSourceManagers().length){var r=i;t=r.get("seriesLayoutBy",!0),e=r.get("sourceHeader",!0),n=r.get("dimensions",!0)}return{seriesLayoutBy:t,sourceHeader:e,dimensions:n}},t}();function Bp(t){t.option.transform&&at(t.option.transform)}function zp(t){return"series"===t.mainType}function Fp(t){throw new Error(t)}function Vp(t,e){return e.type=t,e}function Hp(t){var e,n,i,r,a=t.series,o=t.dataIndex,s=t.multipleSeries,l=a.getData(),u=l.mapDimensionsAll("defaultedTooltip"),h=u.length,c=a.getRawValue(o),p=z(c),f=function(t,e){return Ph(t.getData().getItemVisual(e,"style")[t.visualDrawType])}(a,o);if(h>1||p&&!h){var d=function(t,e,n,i,r){var a=e.getData(),o=O(t,(function(t,e,n){var i=a.getDimensionInfo(n);return t||i&&!1!==i.tooltip&&null!=i.displayName}),!1),s=[],l=[],u=[];function h(t,e){var n=a.getDimensionInfo(e);n&&!1!==n.otherDims.tooltip&&(o?u.push(Vp("nameValue",{markerType:"subItem",markerColor:r,name:n.displayName,value:t,valueType:n.type})):(s.push(t),l.push(n.type)))}return i.length?L(i,(function(t){h(bp(a,n,t),t)})):L(t,h),{inlineValues:s,inlineValueTypes:l,blocks:u}}(c,a,o,u,f);e=d.inlineValues,n=d.inlineValueTypes,i=d.blocks,r=d.inlineValues[0]}else if(h){var g=l.getDimensionInfo(u[0]);r=e=bp(l,o,u[0]),n=g.type}else r=e=p?c[0]:c;var y=sr(a),v=y&&a.name||"",m=l.getName(o),_=s?v:m;return Vp("section",{header:v,noHeader:s||!y,sortParam:r,blocks:[Vp("nameValue",{markerType:"item",markerColor:f,name:_,noName:!it(_),value:e,valueType:n})].concat(i||[])})}var Gp=hr();function Wp(t,e){return t.getName(e)||t.getId(e)}var Up=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e._selectedDataIndicesMap={},e}return n(e,t),e.prototype.init=function(t,e,n){this.seriesIndex=this.componentIndex,this.dataTask=Mp({count:Xp,reset:qp}),this.dataTask.context={model:this},this.mergeDefaultAndTheme(t,n),(Gp(this).sourceManager=new Ep(this)).prepareSource();var i=this.getInitialData(t,n);Zp(i,this),this.dataTask.context.data=i,Gp(this).dataBeforeProcessed=i,Yp(this),this._initSelectedMapFromData(i)},e.prototype.mergeDefaultAndTheme=function(t,e){var n=zh(this),i=n?Vh(t):{},r=this.subType;Gh.hasClass(r)&&(r+="Series"),S(t,e.getTheme().get(this.subType)),S(t,this.getDefaultOption()),tr(t,"label",["show"]),this.fillDataTextStyle(t.data),n&&Fh(t,i,n)},e.prototype.mergeOption=function(t,e){t=S(this.option,t,!0),this.fillDataTextStyle(t.data);var n=zh(this);n&&Fh(this.option,t,n);var i=Gp(this).sourceManager;i.dirty(),i.prepareSource();var r=this.getInitialData(t,e);Zp(r,this),this.dataTask.dirty(),this.dataTask.context.data=r,Gp(this).dataBeforeProcessed=r,Yp(this),this._initSelectedMapFromData(r)},e.prototype.fillDataTextStyle=function(t){if(t&&!Y(t))for(var e=["show"],n=0;n<t.length;n++)t[n]&&t[n].label&&tr(t[n],"label",e)},e.prototype.getInitialData=function(t,e){},e.prototype.appendData=function(t){this.getRawData().appendData(t.data)},e.prototype.getData=function(t){var e=$p(this);if(e){var n=e.context.data;return null==t?n:n.getLinkedData(t)}return Gp(this).data},e.prototype.getAllData=function(){var t=this.getData();return t&&t.getLinkedDataAll?t.getLinkedDataAll():[{data:t}]},e.prototype.setData=function(t){var e=$p(this);if(e){var n=e.context;n.outputData=t,e!==this.dataTask&&(n.data=t)}Gp(this).data=t},e.prototype.getSource=function(){return Gp(this).sourceManager.getSource()},e.prototype.getRawData=function(){return Gp(this).dataBeforeProcessed},e.prototype.getBaseAxis=function(){var t=this.coordinateSystem;return t&&t.getBaseAxis&&t.getBaseAxis()},e.prototype.formatTooltip=function(t,e,n){return Hp({series:this,dataIndex:t,multipleSeries:e})},e.prototype.isAnimationEnabled=function(){if(o.node)return!1;var t=this.getShallow("animation");return t&&this.getData().count()>this.getShallow("animationThreshold")&&(t=!1),!!t},e.prototype.restoreData=function(){this.dataTask.dirty()},e.prototype.getColorFromPalette=function(t,e,n){var i=this.ecModel,r=yc.prototype.getColorFromPalette.call(this,t,e,n);return r||(r=i.getColorFromPalette(t,e,n)),r},e.prototype.coordDimToDataDim=function(t){return this.getRawData().mapDimensionsAll(t)},e.prototype.getProgressive=function(){return this.get("progressive")},e.prototype.getProgressiveThreshold=function(){return this.get("progressiveThreshold")},e.prototype.select=function(t,e){this._innerSelect(this.getData(e),t)},e.prototype.unselect=function(t,e){var n=this.option.selectedMap;if(n)for(var i=this.getData(e),r=0;r<t.length;r++){var a=Wp(i,t[r]);n[a]=!1,this._selectedDataIndicesMap[a]=-1}},e.prototype.toggleSelect=function(t,e){for(var n=[],i=0;i<t.length;i++)n[0]=t[i],this.isSelected(t[i],e)?this.unselect(n,e):this.select(n,e)},e.prototype.getSelectedDataIndices=function(){for(var t=this._selectedDataIndicesMap,e=N(t),n=[],i=0;i<e.length;i++){var r=t[e[i]];r>=0&&n.push(r)}return n},e.prototype.isSelected=function(t,e){var n=this.option.selectedMap;return n&&n[Wp(this.getData(e),t)]||!1},e.prototype._innerSelect=function(t,e){var n,i,r=this.option.selectedMode,a=e.length;if(r&&a)if("multiple"===r)for(var o=this.option.selectedMap||(this.option.selectedMap={}),s=0;s<a;s++){var l=e[s];o[h=Wp(t,l)]=!0,this._selectedDataIndicesMap[h]=t.getRawIndex(l)}else if("single"===r||!0===r){var u=e[a-1],h=Wp(t,u);this.option.selectedMap=((n={})[h]=!0,n),this._selectedDataIndicesMap=((i={})[h]=t.getRawIndex(u),i)}},e.prototype._initSelectedMapFromData=function(t){if(!this.option.selectedMap){var e=[];t.hasItemOption&&t.each((function(n){var i=t.getRawDataItem(n);i&&i.selected&&e.push(n)})),e.length>0&&this._innerSelect(t,e)}},e.registerClass=function(t){return Gh.registerClass(t)},e.protoInitialize=function(){var t=e.prototype;t.type="series.__base__",t.seriesIndex=0,t.useColorPaletteOnData=!1,t.ignoreStyleOnData=!1,t.hasSymbolVisual=!1,t.defaultSymbol="circle",t.visualStyleAccessPath="itemStyle",t.visualDrawType="fill"}(),e}(Gh);function Yp(t){var e=t.name;sr(t)||(t.name=function(t){var e=t.getRawData(),n=e.mapDimensionsAll("seriesName"),i=[];return L(n,(function(t){var n=e.getDimensionInfo(t);n.displayName&&i.push(n.displayName)})),i.join(" ")}(t)||e)}function Xp(t){return t.model.getRawData().count()}function qp(t){var e=t.model;return e.setData(e.getRawData().cloneShallow()),jp}function jp(t,e){e.outputData&&t.end>e.outputData.count()&&e.model.getRawData().cloneShallow(e.outputData)}function Zp(t,e){L(r(t.CHANGABLE_METHODS,t.DOWNSAMPLE_METHODS),(function(n){t.wrapMethod(n,B(Kp,e))}))}function Kp(t,e){var n=$p(t);return n&&n.setOutputEnd((e||this).count()),e}function $p(t){var e=(t.ecModel||{}).scheduler,n=e&&e.getPipeline(t.uid);if(n){var i=n.currentTask;if(i){var r=i.agentStubMap;r&&(i=r.get(t.uid))}return i}}I(Up,Sp),I(Up,yc),Sr(Up,Gh);var Jp=function(){function t(){this.group=new Mi,this.uid=Vu("viewComponent")}return t.prototype.init=function(t,e){},t.prototype.render=function(t,e,n,i){},t.prototype.dispose=function(t,e){},t.prototype.updateView=function(t,e,n,i){},t.prototype.updateLayout=function(t,e,n,i){},t.prototype.updateVisual=function(t,e,n,i){},t.prototype.blurSeries=function(t,e){},t}();function Qp(){var t=hr();return function(e){var n=t(e),i=e.pipelineContext,r=!!n.large,a=!!n.progressiveRender,o=n.large=!(!i||!i.large),s=n.progressiveRender=!(!i||!i.progressiveRender);return!(r===o&&a===s)&&"reset"}}br(Jp),Ar(Jp);var tf=hr(),ef=Qp(),nf=function(){function t(){this.group=new Mi,this.uid=Vu("viewChart"),this.renderTask=Mp({plan:of,reset:sf}),this.renderTask.context={view:this}}return t.prototype.init=function(t,e){},t.prototype.render=function(t,e,n,i){},t.prototype.highlight=function(t,e,n,i){af(t.getData(),i,"emphasis")},t.prototype.downplay=function(t,e,n,i){af(t.getData(),i,"normal")},t.prototype.remove=function(t,e){this.group.removeAll()},t.prototype.dispose=function(t,e){},t.prototype.updateView=function(t,e,n,i){this.render(t,e,n,i)},t.prototype.updateLayout=function(t,e,n,i){this.render(t,e,n,i)},t.prototype.updateVisual=function(t,e,n,i){this.render(t,e,n,i)},t.markUpdateMethod=function(t,e){tf(t).updateMethod=e},t.protoInitialize=void(t.prototype.type="chart"),t}();function rf(t,e,n){t&&("emphasis"===e?bs:ws)(t,n)}function af(t,e,n){var i=ur(t,e),r=e&&null!=e.highlightKey?function(t){var e=Zo[t];return null==e&&jo<=32&&(e=Zo[t]=jo++),e}(e.highlightKey):null;null!=i?L(Qi(i),(function(e){rf(t.getItemGraphicEl(e),n,r)})):t.eachItemGraphicEl((function(t){rf(t,n,r)}))}function of(t){return ef(t.model)}function sf(t){var e=t.model,n=t.ecModel,i=t.api,r=t.payload,a=e.pipelineContext.progressiveRender,o=t.view,s=r&&tf(r).updateMethod,l=a?"incrementalPrepareRender":s&&o[s]?s:"render";return"render"!==l&&o[l](e,n,i,r),lf[l]}br(nf),Ar(nf);var lf={incrementalPrepareRender:{progress:function(t,e){e.view.incrementalRender(t,e.model,e.ecModel,e.api,e.payload)}},render:{forceFirstProgress:!0,progress:function(t,e){e.view.render(e.model,e.ecModel,e.api,e.payload)}}};function uf(t,e,n){var i,r,a,o,s,l=0,u=0,h=null;function c(){u=(new Date).getTime(),h=null,t.apply(a,o||[])}e=e||0;var p=function(){for(var t=[],p=0;p<arguments.length;p++)t[p]=arguments[p];i=(new Date).getTime(),a=this,o=t;var f=s||e,d=s||n;s=null,r=i-(d?l:u)-f,clearTimeout(h),d?h=setTimeout(c,f):r>=0?c():h=setTimeout(c,-r),l=i};return p.clear=function(){h&&(clearTimeout(h),h=null)},p.debounceNextCall=function(t){s=t},p}var hf=hr(),cf={itemStyle:Dr(Nu,!0),lineStyle:Dr(Pu,!0)},pf={lineStyle:"stroke",itemStyle:"fill"};function ff(t,e){var n=t.visualStyleMapper||cf[e];return n||(console.warn("Unkown style type '"+e+"'."),cf.itemStyle)}function df(t,e){var n=t.visualDrawType||pf[e];return n||(console.warn("Unkown style type '"+e+"'."),"fill")}var gf={createOnAllSeries:!0,performRawSeries:!0,reset:function(t,e){var n=t.getData(),i=t.visualStyleAccessPath||"itemStyle",r=t.getModel(i),a=ff(t,i)(r),o=r.getShallow("decal");o&&(n.setVisual("decal",o),o.dirty=!0);var s=df(t,i),l=a[s],u=F(l)?l:null,h="auto"===a.fill||"auto"===a.stroke;if(!a[s]||u||h){var c=t.getColorFromPalette(t.name,null,e.getSeriesCount());a[s]||(a[s]=c,n.setVisual("colorFromPalette",!0)),a.fill="auto"===a.fill||"function"==typeof a.fill?c:a.fill,a.stroke="auto"===a.stroke||"function"==typeof a.stroke?c:a.stroke}if(n.setVisual("style",a),n.setVisual("drawType",s),!e.isSeriesFiltered(t)&&u)return n.setVisual("colorFromPalette",!1),{dataEach:function(e,n){var i=t.getDataParams(n),r=M({},a);r[s]=u(i),e.setItemVisual(n,"style",r)}}}},yf=new zu,vf={createOnAllSeries:!0,performRawSeries:!0,reset:function(t,e){if(!t.ignoreStyleOnData&&!e.isSeriesFiltered(t)){var n=t.getData(),i=t.visualStyleAccessPath||"itemStyle",r=ff(t,i),a=n.getVisual("drawType");return{dataEach:n.hasItemOption?function(t,e){var n=t.getRawDataItem(e);if(n&&n[i]){yf.option=n[i];var o=r(yf);M(t.ensureUniqueItemVisual(e,"style"),o),yf.option.decal&&(t.setItemVisual(e,"decal",yf.option.decal),yf.option.decal.dirty=!0),a in o&&t.setItemVisual(e,"colorFromPalette",!1)}}:null}}}},mf={performRawSeries:!0,overallReset:function(t){var e=lt();t.eachSeries((function(t){if(t.useColorPaletteOnData){var n=e.get(t.type);n||(n={},e.set(t.type,n)),hf(t).scope=n}})),t.eachSeries((function(e){if(e.useColorPaletteOnData&&!t.isSeriesFiltered(e)){var n=e.getRawData(),i={},r=e.getData(),a=hf(e).scope,o=e.visualStyleAccessPath||"itemStyle",s=df(e,o);r.each((function(t){var e=r.getRawIndex(t);i[e]=t})),n.each((function(t){var o=i[t];if(r.getItemVisual(o,"colorFromPalette")){var l=r.ensureUniqueItemVisual(o,"style"),u=n.getName(t)||t+"",h=n.count();l[s]=e.getColorFromPalette(u,a,h)}}))}}))}},_f=Math.PI;var xf=function(){function t(t,e,n,i){this._stageTaskMap=lt(),this.ecInstance=t,this.api=e,n=this._dataProcessorHandlers=n.slice(),i=this._visualHandlers=i.slice(),this._allHandlers=n.concat(i)}return t.prototype.restoreData=function(t,e){t.restoreData(e),this._stageTaskMap.each((function(t){var e=t.overallTask;e&&e.dirty()}))},t.prototype.getPerformArgs=function(t,e){if(t.__pipeline){var n=this._pipelineMap.get(t.__pipeline.id),i=n.context,r=!e&&n.progressiveEnabled&&(!i||i.progressiveRender)&&t.__idxInPipeline>n.blockIndex?n.step:null,a=i&&i.modDataCount;return{step:r,modBy:null!=a?Math.ceil(a/r):null,modDataCount:a}}},t.prototype.getPipeline=function(t){return this._pipelineMap.get(t)},t.prototype.updateStreamModes=function(t,e){var n=this._pipelineMap.get(t.uid),i=t.getData().count(),r=n.progressiveEnabled&&e.incrementalPrepareRender&&i>=n.threshold,a=t.get("large")&&i>=t.get("largeThreshold"),o="mod"===t.get("progressiveChunkMode")?i:null;t.pipelineContext=n.context={progressiveRender:r,modDataCount:o,large:a}},t.prototype.restorePipelines=function(t){var e=this,n=e._pipelineMap=lt();t.eachSeries((function(t){var i=t.getProgressive(),r=t.uid;n.set(r,{id:r,head:null,tail:null,threshold:t.getProgressiveThreshold(),progressiveEnabled:i&&!(t.preventIncremental&&t.preventIncremental()),blockIndex:-1,step:Math.round(i||700),count:0}),e._pipe(t,t.dataTask)}))},t.prototype.prepareStageTasks=function(){var t=this._stageTaskMap,e=this.api.getModel(),n=this.api;L(this._allHandlers,(function(i){var r=t.get(i.uid)||t.set(i.uid,{}),a="";nt(!(i.reset&&i.overallReset),a),i.reset&&this._createSeriesStageTask(i,r,e,n),i.overallReset&&this._createOverallStageTask(i,r,e,n)}),this)},t.prototype.prepareView=function(t,e,n,i){var r=t.renderTask,a=r.context;a.model=e,a.ecModel=n,a.api=i,r.__block=!t.incrementalPrepareRender,this._pipe(e,r)},t.prototype.performDataProcessorTasks=function(t,e){this._performStageTasks(this._dataProcessorHandlers,t,e,{block:!0})},t.prototype.performVisualTasks=function(t,e,n){this._performStageTasks(this._visualHandlers,t,e,n)},t.prototype._performStageTasks=function(t,e,n,i){i=i||{};var r=!1,a=this;function o(t,e){return t.setDirty&&(!t.dirtyMap||t.dirtyMap.get(e.__pipeline.id))}L(t,(function(t,s){if(!i.visualType||i.visualType===t.visualType){var l=a._stageTaskMap.get(t.uid),u=l.seriesTaskMap,h=l.overallTask;if(h){var c,p=h.agentStubMap;p.each((function(t){o(i,t)&&(t.dirty(),c=!0)})),c&&h.dirty(),a.updatePayload(h,n);var f=a.getPerformArgs(h,i.block);p.each((function(t){t.perform(f)})),h.perform(f)&&(r=!0)}else u&&u.each((function(s,l){o(i,s)&&s.dirty();var u=a.getPerformArgs(s,i.block);u.skip=!t.performRawSeries&&e.isSeriesFiltered(s.context.model),a.updatePayload(s,n),s.perform(u)&&(r=!0)}))}})),this.unfinished=r||this.unfinished},t.prototype.performSeriesTasks=function(t){var e;t.eachSeries((function(t){e=t.dataTask.perform()||e})),this.unfinished=e||this.unfinished},t.prototype.plan=function(){this._pipelineMap.each((function(t){var e=t.tail;do{if(e.__block){t.blockIndex=e.__idxInPipeline;break}e=e.getUpstream()}while(e)}))},t.prototype.updatePayload=function(t,e){"remain"!==e&&(t.context.payload=e)},t.prototype._createSeriesStageTask=function(t,e,n,i){var r=this,a=e.seriesTaskMap,o=e.seriesTaskMap=lt(),s=t.seriesType,l=t.getTargetSeries;function u(e){var s=e.uid,l=o.set(s,a&&a.get(s)||Mp({plan:Tf,reset:Cf,count:If}));l.context={model:e,ecModel:n,api:i,useClearVisual:t.isVisual&&!t.isLayout,plan:t.plan,reset:t.reset,scheduler:r},r._pipe(e,l)}t.createOnAllSeries?n.eachRawSeries(u):s?n.eachRawSeriesByType(s,u):l&&l(n,i).each(u)},t.prototype._createOverallStageTask=function(t,e,n,i){var r=this,a=e.overallTask=e.overallTask||Mp({reset:bf});a.context={ecModel:n,api:i,overallReset:t.overallReset,scheduler:r};var o=a.agentStubMap,s=a.agentStubMap=lt(),l=t.seriesType,u=t.getTargetSeries,h=!0,c=!1,p="";function f(t){var e=t.uid,n=s.set(e,o&&o.get(e)||(c=!0,Mp({reset:wf,onDirty:Mf})));n.context={model:t,overallProgress:h},n.agent=a,n.__block=h,r._pipe(t,n)}nt(!t.createOnAllSeries,p),l?n.eachRawSeriesByType(l,f):u?u(n,i).each(f):(h=!1,L(n.getSeries(),f)),c&&a.dirty()},t.prototype._pipe=function(t,e){var n=t.uid,i=this._pipelineMap.get(n);!i.head&&(i.head=e),i.tail&&i.tail.pipe(e),i.tail=e,e.__idxInPipeline=i.count++,e.__pipeline=i},t.wrapStageHandler=function(t,e){return F(t)&&(t={overallReset:t,seriesType:kf(t)}),t.uid=Vu("stageHandler"),e&&(t.visualType=e),t},t}();function bf(t){t.overallReset(t.ecModel,t.api,t.payload)}function wf(t){return t.overallProgress&&Sf}function Sf(){this.agent.dirty(),this.getDownstream().dirty()}function Mf(){this.agent&&this.agent.dirty()}function Tf(t){return t.plan?t.plan(t.model,t.ecModel,t.api,t.payload):null}function Cf(t){t.useClearVisual&&t.data.clearAllVisual();var e=t.resetDefines=Qi(t.reset(t.model,t.ecModel,t.api,t.payload));return e.length>1?P(e,(function(t,e){return Df(e)})):Af}var Af=Df(0);function Df(t){return function(e,n){var i=n.data,r=n.resetDefines[t];if(r&&r.dataEach)for(var a=e.start;a<e.end;a++)r.dataEach(i,a);else r&&r.progress&&r.progress(e,i)}}function If(t){return t.data.count()}function kf(t){Lf=null;try{t(Pf,Of)}catch(t){}return Lf}var Lf,Pf={},Of={};function Rf(t,e){for(var n in e.prototype)t[n]=ct}Rf(Pf,_c),Rf(Of,Mc),Pf.eachSeriesByType=Pf.eachRawSeriesByType=function(t){Lf=t},Pf.eachComponent=function(t){"series"===t.mainType&&t.subType&&(Lf=t.subType)};var Nf=["#37A2DA","#32C5E9","#67E0E3","#9FE6B8","#FFDB5C","#ff9f7f","#fb7293","#E062AE","#E690D1","#e7bcf3","#9d96f5","#8378EA","#96BFFF"],Ef={color:Nf,colorLayer:[["#37A2DA","#ffd85c","#fd7b5f"],["#37A2DA","#67E0E3","#FFDB5C","#ff9f7f","#E062AE","#9d96f5"],["#37A2DA","#32C5E9","#9FE6B8","#FFDB5C","#ff9f7f","#fb7293","#e7bcf3","#8378EA","#96BFFF"],Nf]},Bf="#B9B8CE",zf="#100C2A",Ff=function(){return{axisLine:{lineStyle:{color:Bf}},splitLine:{lineStyle:{color:"#484753"}},splitArea:{areaStyle:{color:["rgba(255,255,255,0.02)","rgba(255,255,255,0.05)"]}},minorSplitLine:{lineStyle:{color:"#20203B"}}}},Vf=["#4992ff","#7cffb2","#fddd60","#ff6e76","#58d9f9","#05c091","#ff8a45","#8d48e3","#dd79ff"],Hf={darkMode:!0,color:Vf,backgroundColor:zf,axisPointer:{lineStyle:{color:"#817f91"},crossStyle:{color:"#817f91"},label:{color:"#fff"}},legend:{textStyle:{color:Bf}},textStyle:{color:Bf},title:{textStyle:{color:"#EEF1FA"},subtextStyle:{color:"#B9B8CE"}},toolbox:{iconStyle:{borderColor:Bf}},dataZoom:{borderColor:"#71708A",textStyle:{color:Bf},brushStyle:{color:"rgba(135,163,206,0.3)"},handleStyle:{color:"#353450",borderColor:"#C5CBE3"},moveHandleStyle:{color:"#B0B6C3",opacity:.3},fillerColor:"rgba(135,163,206,0.2)",emphasis:{handleStyle:{borderColor:"#91B7F2",color:"#4D587D"},moveHandleStyle:{color:"#636D9A",opacity:.7}},dataBackground:{lineStyle:{color:"#71708A",width:1},areaStyle:{color:"#71708A"}},selectedDataBackground:{lineStyle:{color:"#87A3CE"},areaStyle:{color:"#87A3CE"}}},visualMap:{textStyle:{color:Bf}},timeline:{lineStyle:{color:Bf},label:{color:Bf},controlStyle:{color:Bf,borderColor:Bf}},calendar:{itemStyle:{color:zf},dayLabel:{color:Bf},monthLabel:{color:Bf},yearLabel:{color:Bf}},timeAxis:Ff(),logAxis:Ff(),valueAxis:Ff(),categoryAxis:Ff(),line:{symbol:"circle"},graph:{color:Vf},gauge:{title:{color:Bf},axisLine:{lineStyle:{color:[[1,"rgba(207,212,219,0.2)"]]}},axisLabel:{color:Bf},detail:{color:"#EEF1FA"}},candlestick:{itemStyle:{color:"#f64e56",color0:"#54ea92",borderColor:"#f64e56",borderColor0:"#54ea92"}}};Hf.categoryAxis.splitLine.show=!1;var Gf=function(){function t(){}return t.prototype.normalizeQuery=function(t){var e={},n={},i={};if(V(t)){var r=xr(t);e.mainType=r.main||null,e.subType=r.sub||null}else{var a=["Index","Name","Id"],o={name:1,dataIndex:1,dataType:1};L(t,(function(t,r){for(var s=!1,l=0;l<a.length;l++){var u=a[l],h=r.lastIndexOf(u);if(h>0&&h===r.length-u.length){var c=r.slice(0,h);"data"!==c&&(e.mainType=c,e[u.toLowerCase()]=t,s=!0)}}o.hasOwnProperty(r)&&(n[r]=t,s=!0),s||(i[r]=t)}))}return{cptQuery:e,dataQuery:n,otherQuery:i}},t.prototype.filter=function(t,e){var n=this.eventInfo;if(!n)return!0;var i=n.targetEl,r=n.packedEvent,a=n.model,o=n.view;if(!a||!o)return!0;var s=e.cptQuery,l=e.dataQuery;return u(s,a,"mainType")&&u(s,a,"subType")&&u(s,a,"index","componentIndex")&&u(s,a,"name")&&u(s,a,"id")&&u(l,r,"name")&&u(l,r,"dataIndex")&&u(l,r,"dataType")&&(!o.filterForExposedEvent||o.filterForExposedEvent(t,e.otherQuery,i,r));function u(t,e,n,i){return null==t[n]||e[i||n]===t[n]}},t.prototype.afterTrigger=function(){this.eventInfo=null},t}(),Wf={createOnAllSeries:!0,performRawSeries:!0,reset:function(t,e){var n=t.getData();if(t.legendSymbol&&n.setVisual("legendSymbol",t.legendSymbol),t.hasSymbolVisual){var i=t.get("symbol"),r=t.get("symbolSize"),a=t.get("symbolKeepAspect"),o=t.get("symbolRotate"),s=t.get("symbolOffset"),l=F(i),u=F(r),h=F(o),c=F(s),p=l||u||h||c,f=!l&&i?i:t.defaultSymbol,d=u?null:r,g=h?null:o,y=c?null:s;if(n.setVisual({legendSymbol:t.legendSymbol||f,symbol:f,symbolSize:d,symbolKeepAspect:a,symbolRotate:g,symbolOffset:y}),!e.isSeriesFiltered(t))return{dataEach:p?function(e,n){var a=t.getRawValue(n),p=t.getDataParams(n);l&&e.setItemVisual(n,"symbol",i(a,p)),u&&e.setItemVisual(n,"symbolSize",r(a,p)),h&&e.setItemVisual(n,"symbolRotate",o(a,p)),c&&e.setItemVisual(n,"symbolOffset",s(a,p))}:null}}}};var Uf=2*Math.PI,Yf=ao.CMD,Xf=["top","right","bottom","left"];function qf(t,e,n,i,r){var a=n.width,o=n.height;switch(t){case"top":i.set(n.x+a/2,n.y-e),r.set(0,-1);break;case"bottom":i.set(n.x+a/2,n.y+o+e),r.set(0,1);break;case"left":i.set(n.x-e,n.y+o/2),r.set(-1,0);break;case"right":i.set(n.x+a+e,n.y+o/2),r.set(1,0)}}function jf(t,e,n,i,r,a,o,s,l){o-=t,s-=e;var u=Math.sqrt(o*o+s*s),h=(o/=u)*n+t,c=(s/=u)*n+e;if(Math.abs(i-r)%Uf<1e-4)return l[0]=h,l[1]=c,u-n;if(a){var p=i;i=ho(r),r=ho(p)}else i=ho(i),r=ho(r);i>r&&(r+=Uf);var f=Math.atan2(s,o);if(f<0&&(f+=Uf),f>=i&&f<=r||f+Uf>=i&&f+Uf<=r)return l[0]=h,l[1]=c,u-n;var d=n*Math.cos(i)+t,g=n*Math.sin(i)+e,y=n*Math.cos(r)+t,v=n*Math.sin(r)+e,m=(d-o)*(d-o)+(g-s)*(g-s),_=(y-o)*(y-o)+(v-s)*(v-s);return m<_?(l[0]=d,l[1]=g,Math.sqrt(m)):(l[0]=y,l[1]=v,Math.sqrt(_))}function Zf(t,e,n,i,r,a,o,s){var l=r-t,u=a-e,h=n-t,c=i-e,p=Math.sqrt(h*h+c*c),f=(l*(h/=p)+u*(c/=p))/p;s&&(f=Math.min(Math.max(f,0),1)),f*=p;var d=o[0]=t+f*h,g=o[1]=e+f*c;return Math.sqrt((d-r)*(d-r)+(g-a)*(g-a))}function Kf(t,e,n,i,r,a,o){n<0&&(t+=n,n=-n),i<0&&(e+=i,i=-i);var s=t+n,l=e+i,u=o[0]=Math.min(Math.max(r,t),s),h=o[1]=Math.min(Math.max(a,e),l);return Math.sqrt((u-r)*(u-r)+(h-a)*(h-a))}var $f=[];function Jf(t,e,n){var i=Kf(e.x,e.y,e.width,e.height,t.x,t.y,$f);return n.set($f[0],$f[1]),i}function Qf(t,e,n){for(var i,r,a=0,o=0,s=0,l=0,u=1/0,h=e.data,c=t.x,p=t.y,f=0;f<h.length;){var d=h[f++];1===f&&(s=a=h[f],l=o=h[f+1]);var g=u;switch(d){case Yf.M:a=s=h[f++],o=l=h[f++];break;case Yf.L:g=Zf(a,o,h[f],h[f+1],c,p,$f,!0),a=h[f++],o=h[f++];break;case Yf.C:g=va(a,o,h[f++],h[f++],h[f++],h[f++],h[f],h[f+1],c,p,$f),a=h[f++],o=h[f++];break;case Yf.Q:g=Sa(a,o,h[f++],h[f++],h[f],h[f+1],c,p,$f),a=h[f++],o=h[f++];break;case Yf.A:var y=h[f++],v=h[f++],m=h[f++],_=h[f++],x=h[f++],b=h[f++];f+=1;var w=!!(1-h[f++]);i=Math.cos(x)*m+y,r=Math.sin(x)*_+v,f<=1&&(s=i,l=r),g=jf(y,v,_,x,x+b,w,(c-y)*_/m+y,p,$f),a=Math.cos(x+b)*m+y,o=Math.sin(x+b)*_+v;break;case Yf.R:g=Kf(s=a=h[f++],l=o=h[f++],h[f++],h[f++],c,p,$f);break;case Yf.Z:g=Zf(a,o,s,l,c,p,$f,!0),a=s,o=l}g<u&&(u=g,n.set($f[0],$f[1]))}return u}var td=new pn,ed=new pn,nd=new pn,id=new pn,rd=new pn;function ad(t,e){if(t){var n=t.getTextGuideLine(),i=t.getTextContent();if(i&&n){var r=t.textGuideLineConfig||{},a=[[0,0],[0,0],[0,0]],o=r.candidates||Xf,s=i.getBoundingRect().clone();s.applyTransform(i.getComputedTransform());var l=1/0,u=r.anchor,h=t.getComputedTransform(),c=h&&pe([],h),p=e.get("length2")||0;u&&nd.copy(u);for(var f=0;f<o.length;f++){qf(o[f],0,s,td,id),pn.scaleAndAdd(ed,td,id,p),ed.transform(c);var d=t.getBoundingRect(),g=u?u.distance(ed):t instanceof Co?Qf(ed,t.path,nd):Jf(ed,d,nd);g<l&&(l=g,ed.transform(h),nd.transform(h),nd.toArray(a[0]),ed.toArray(a[1]),td.toArray(a[2]))}ld(a,e.get("minTurnAngle")),n.setShape({points:a})}}}var od=[],sd=new pn;function ld(t,e){if(e<=180&&e>0){e=e/180*Math.PI,td.fromArray(t[0]),ed.fromArray(t[1]),nd.fromArray(t[2]),pn.sub(id,td,ed),pn.sub(rd,nd,ed);var n=id.len(),i=rd.len();if(!(n<.001||i<.001)){id.scale(1/n),rd.scale(1/i);var r=id.dot(rd);if(Math.cos(e)<r){var a=Zf(ed.x,ed.y,nd.x,nd.y,td.x,td.y,od,!1);sd.fromArray(od),sd.scaleAndAdd(rd,a/Math.tan(Math.PI-e));var o=nd.x!==ed.x?(sd.x-ed.x)/(nd.x-ed.x):(sd.y-ed.y)/(nd.y-ed.y);if(isNaN(o))return;o<0?pn.copy(sd,ed):o>1&&pn.copy(sd,nd),sd.toArray(t[1])}}}}function ud(t,e,n){if(n<=180&&n>0){n=n/180*Math.PI,td.fromArray(t[0]),ed.fromArray(t[1]),nd.fromArray(t[2]),pn.sub(id,ed,td),pn.sub(rd,nd,ed);var i=id.len(),r=rd.len();if(!(i<.001||r<.001))if(id.scale(1/i),rd.scale(1/r),id.dot(e)<Math.cos(n)){var a=Zf(ed.x,ed.y,nd.x,nd.y,td.x,td.y,od,!1);sd.fromArray(od);var o=Math.PI/2,s=o+Math.acos(rd.dot(e))-n;if(s>=o)pn.copy(sd,nd);else{sd.scaleAndAdd(rd,a/Math.tan(Math.PI/2-s));var l=nd.x!==ed.x?(sd.x-ed.x)/(nd.x-ed.x):(sd.y-ed.y)/(nd.y-ed.y);if(isNaN(l))return;l<0?pn.copy(sd,ed):l>1&&pn.copy(sd,nd)}sd.toArray(t[1])}}}function hd(t,e,n,i){var r="normal"===n,a=r?t:t.ensureState(n);a.ignore=e;var o=i.get("smooth");o&&!0===o&&(o=.3),a.shape=a.shape||{},o>0&&(a.shape.smooth=o);var s=i.getModel("lineStyle").getLineStyle();r?t.useStyle(s):a.style=s}function cd(t,e){var n=e.smooth,i=e.points;if(i)if(t.moveTo(i[0][0],i[0][1]),n>0&&i.length>=3){var r=Mt(i[0],i[1]),a=Mt(i[1],i[2]);if(!r||!a)return t.lineTo(i[1][0],i[1][1]),void t.lineTo(i[2][0],i[2][1]);var o=Math.min(r,a)*n,s=At([],i[1],i[0],o/r),l=At([],i[1],i[2],o/a),u=At([],s,l,.5);t.bezierCurveTo(s[0],s[1],s[0],s[1],u[0],u[1]),t.bezierCurveTo(l[0],l[1],l[0],l[1],i[2][0],i[2][1])}else for(var h=1;h<i.length;h++)t.lineTo(i[h][0],i[h][1])}function pd(t,e,n){var i=t.getTextGuideLine(),r=t.getTextContent();if(r){for(var a=e.normal,o=a.get("show"),s=r.ignore,l=0;l<Jo.length;l++){var u=Jo[l],h=e[u],c="normal"===u;if(h){var p=h.get("show");if((c?s:J(r.states[u]&&r.states[u].ignore,s))||!J(p,o)){var f=c?i:i&&i.states.normal;f&&(f.ignore=!0);continue}i||(i=new kl,t.setTextGuideLine(i),c||!s&&o||hd(i,!0,"normal",e.normal),t.stateProxy&&(i.stateProxy=t.stateProxy)),hd(i,!1,u,h)}}if(i){T(i.style,n),i.style.fill=null;var d=a.get("showAbove");(t.textGuideLineConfig=t.textGuideLineConfig||{}).showAbove=d||!1,i.buildPath=cd}}else i&&t.removeTextGuideLine()}function fd(t,e){e=e||"labelLine";for(var n={normal:t.getModel(e)},i=0;i<$o.length;i++){var r=$o[i];n[r]=t.getModel([r,e])}return n}function dd(t,e,n,i,r,a){var o=t.length;if(!(o<2)){t.sort((function(t,n){return t.rect[e]-n.rect[e]}));for(var s,l=0,u=!1,h=0,c=0;c<o;c++){var p=t[c],f=p.rect;(s=f[e]-l)<0&&(f[e]-=s,p.label[e]-=s,u=!0),h+=Math.max(-s,0),l=f[e]+f[n]}h>0&&a&&x(-h/o,0,o);var d,g,y=t[0],v=t[o-1];return m(),d<0&&b(-d,.8),g<0&&b(g,.8),m(),_(d,g,1),_(g,d,-1),m(),d<0&&w(-d),g<0&&w(g),u}function m(){d=y.rect[e]-i,g=r-v.rect[e]-v.rect[n]}function _(t,e,n){if(t<0){var i=Math.min(e,-t);if(i>0){x(i*n,0,o);var r=i+t;r<0&&b(-r*n,1)}else b(-t*n,1)}}function x(n,i,r){0!==n&&(u=!0);for(var a=i;a<r;a++){var o=t[a];o.rect[e]+=n,o.label[e]+=n}}function b(i,r){for(var a=[],s=0,l=1;l<o;l++){var u=t[l-1].rect,h=Math.max(t[l].rect[e]-u[e]-u[n],0);a.push(h),s+=h}if(s){var c=Math.min(Math.abs(i)/s,r);if(i>0)for(l=0;l<o-1;l++){x(a[l]*c,0,l+1)}else for(l=o-1;l>0;l--){x(-(a[l-1]*c),l,o)}}}function w(t){var e=t<0?-1:1;t=Math.abs(t);for(var n=Math.ceil(t/(o-1)),i=0;i<o-1;i++)if(e>0?x(n,0,i+1):x(-n,o-i-1,o),(t-=n)<=0)return}}function gd(t,e,n,i){return dd(t,"y","height",e,n,i)}function yd(t){if(t){for(var e=[],n=0;n<t.length;n++)e.push(t[n].slice());return e}}function vd(t,e){var n=t.label,i=e&&e.getTextGuideLine();return{dataIndex:t.dataIndex,dataType:t.dataType,seriesIndex:t.seriesModel.seriesIndex,text:t.label.style.text,rect:t.hostRect,labelRect:t.rect,align:n.style.align,verticalAlign:n.style.verticalAlign,labelLinePoints:yd(i&&i.shape.points)}}var md=["align","verticalAlign","width","height","fontSize"],_d=new be,xd=hr(),bd=hr();function wd(t,e,n){for(var i=0;i<n.length;i++){var r=n[i];null!=e[r]&&(t[r]=e[r])}}var Sd=["x","y","rotation"],Md=function(){function t(){this._labelList=[],this._chartViewList=[]}return t.prototype.clearLabels=function(){this._labelList=[],this._chartViewList=[]},t.prototype._addLabel=function(t,e,n,i,r){var a=i.style,o=i.__hostTarget.textConfig||{},s=i.getComputedTransform(),l=i.getBoundingRect().plain();bn.applyTransform(l,l,s),s?_d.setLocalTransform(s):(_d.x=_d.y=_d.rotation=_d.originX=_d.originY=0,_d.scaleX=_d.scaleY=1);var u,h=i.__hostTarget;if(h){u=h.getBoundingRect().plain();var c=h.getComputedTransform();bn.applyTransform(u,u,c)}var p=u&&h.getTextGuideLine();this._labelList.push({label:i,labelLine:p,seriesModel:n,dataIndex:t,dataType:e,layoutOption:r,computedLayoutOption:null,rect:l,hostRect:u,priority:u?u.width*u.height:0,defaultAttr:{ignore:i.ignore,labelGuideIgnore:p&&p.ignore,x:_d.x,y:_d.y,scaleX:_d.scaleX,scaleY:_d.scaleY,rotation:_d.rotation,style:{x:a.x,y:a.y,align:a.align,verticalAlign:a.verticalAlign,width:a.width,height:a.height,fontSize:a.fontSize},cursor:i.cursor,attachedPos:o.position,attachedRot:o.rotation}})},t.prototype.addLabelsOfSeries=function(t){var e=this;this._chartViewList.push(t);var n=t.__model,i=n.get("labelLayout");(F(i)||N(i).length)&&t.group.traverse((function(t){if(t.ignore)return!0;var r=t.getTextContent(),a=qo(t);r&&!r.disableLabelLayout&&e._addLabel(a.dataIndex,a.dataType,n,r,i)}))},t.prototype.updateLayoutConfig=function(t){var e=t.getWidth(),n=t.getHeight();function i(t,e){return function(){ad(t,e)}}for(var r=0;r<this._labelList.length;r++){var a=this._labelList[r],o=a.label,s=o.__hostTarget,l=a.defaultAttr,u=void 0;u=(u="function"==typeof a.layoutOption?a.layoutOption(vd(a,s)):a.layoutOption)||{},a.computedLayoutOption=u;var h=Math.PI/180;s&&s.setTextConfig({local:!1,position:null!=u.x||null!=u.y?null:l.attachedPos,rotation:null!=u.rotate?u.rotate*h:l.attachedRot,offset:[u.dx||0,u.dy||0]});var c=!1;if(null!=u.x?(o.x=Ri(u.x,e),o.setStyle("x",0),c=!0):(o.x=l.x,o.setStyle("x",l.style.x)),null!=u.y?(o.y=Ri(u.y,n),o.setStyle("y",0),c=!0):(o.y=l.y,o.setStyle("y",l.style.y)),u.labelLinePoints){var p=s.getTextGuideLine();p&&(p.setShape({points:u.labelLinePoints}),c=!1)}xd(o).needsUpdateLabelLine=c,o.rotation=null!=u.rotate?u.rotate*h:l.rotation,o.scaleX=l.scaleX,o.scaleY=l.scaleY;for(var f=0;f<md.length;f++){var d=md[f];o.setStyle(d,null!=u[d]?u[d]:l.style[d])}if(u.draggable){if(o.draggable=!0,o.cursor="move",s){var g=a.seriesModel;if(null!=a.dataIndex)g=a.seriesModel.getData(a.dataType).getItemModel(a.dataIndex);o.on("drag",i(s,g.getModel("labelLine")))}}else o.off("drag"),o.cursor=l.cursor}},t.prototype.layout=function(t){var e,n=t.getWidth(),i=t.getHeight(),r=function(t){for(var e=[],n=0;n<t.length;n++){var i=t[n];if(!i.defaultAttr.ignore){var r=i.label,a=r.getComputedTransform(),o=r.getBoundingRect(),s=!a||a[1]<1e-5&&a[2]<1e-5,l=r.style.margin||0,u=o.clone();u.applyTransform(a),u.x-=l/2,u.y-=l/2,u.width+=l,u.height+=l;var h=s?new jl(o,a):null;e.push({label:r,labelLine:i.labelLine,rect:u,localRect:o,obb:h,priority:i.priority,defaultAttr:i.defaultAttr,layoutOption:i.computedLayoutOption,axisAligned:s,transform:a})}}return e}(this._labelList),a=R(r,(function(t){return"shiftX"===t.layoutOption.moveOverlap})),o=R(r,(function(t){return"shiftY"===t.layoutOption.moveOverlap}));dd(a,"x","width",0,n,e),gd(o,0,i),function(t){var e=[];t.sort((function(t,e){return e.priority-t.priority}));var n=new bn(0,0,0,0);function i(t){if(!t.ignore){var e=t.ensureState("emphasis");null==e.ignore&&(e.ignore=!1)}t.ignore=!0}for(var r=0;r<t.length;r++){var a=t[r],o=a.axisAligned,s=a.localRect,l=a.transform,u=a.label,h=a.labelLine;n.copy(a.rect),n.width-=.1,n.height-=.1,n.x+=.05,n.y+=.05;for(var c=a.obb,p=!1,f=0;f<e.length;f++){var d=e[f];if(n.intersect(d.rect)){if(o&&d.axisAligned){p=!0;break}if(d.obb||(d.obb=new jl(d.localRect,d.transform)),c||(c=new jl(s,l)),c.intersect(d.obb)){p=!0;break}}}p?(i(u),h&&i(h)):(u.attr("ignore",a.defaultAttr.ignore),h&&h.attr("ignore",a.defaultAttr.labelGuideIgnore),e.push(a))}}(R(r,(function(t){return t.layoutOption.hideOverlap})))},t.prototype.processLabelsOverall=function(){var t=this;L(this._chartViewList,(function(e){var n=e.__model,i=e.ignoreLabelLineUpdate,r=n.isAnimationEnabled();e.group.traverse((function(e){if(e.ignore)return!0;var a=!i,o=e.getTextContent();!a&&o&&(a=xd(o).needsUpdateLabelLine),a&&t._updateLabelLine(e,n),r&&t._animateLabels(e,n)}))}))},t.prototype._updateLabelLine=function(t,e){var n=t.getTextContent(),i=qo(t),r=i.dataIndex;if(n&&null!=r){var a=e.getData(i.dataType),o=a.getItemModel(r),s={},l=a.getItemVisual(r,"style"),u=a.getVisual("drawType");s.stroke=l[u];var h=o.getModel("labelLine");pd(t,fd(o),s),ad(t,h)}},t.prototype._animateLabels=function(t,e){var n=t.getTextContent(),i=t.getTextGuideLine();if(n&&!n.ignore&&!n.invisible&&!t.disableLabelAnimation&&!fu(t)){var r=(f=xd(n)).oldLayout,a=qo(t),o=a.dataIndex,s={x:n.x,y:n.y,rotation:n.rotation},l=e.getData(a.dataType);if(r){n.attr(r);var u=t.prevStates;u&&(A(u,"select")>=0&&n.attr(f.oldLayoutSelect),A(u,"emphasis")>=0&&n.attr(f.oldLayoutEmphasis)),lu(n,s,e,o)}else if(n.attr(s),!Cu(n).valueAnimation){var h=J(n.style.opacity,1);n.style.opacity=0,uu(n,{style:{opacity:h}},e,o)}if(f.oldLayout=s,n.states.select){var c=f.oldLayoutSelect={};wd(c,s,Sd),wd(c,n.states.select,Sd)}if(n.states.emphasis){var p=f.oldLayoutEmphasis={};wd(p,s,Sd),wd(p,n.states.emphasis,Sd)}!function(t,e,n,i,r){var a=Cu(t);if(a.valueAnimation){var o=a.defaultInterpolatedText,s=J(a.interpolatedValue,a.prevValue),l=a.value;(null==s?uu:lu)(t,{},i,e,null,(function(i){var u=vr(n,a.precision,s,l,i);a.interpolatedValue=1===i?null:u;var h=vu({labelDataIndex:e,labelFetcher:r,defaultText:o?o(u):u+""},a.statesModels,u);yu(t,h)}))}}(n,o,l,e,e)}if(i&&!i.ignore&&!i.invisible){r=(f=bd(i)).oldLayout;var f,d={points:i.shape.points};r?(i.attr({shape:r}),lu(i,{shape:d},e)):(i.setShape(d),i.style.strokePercent=0,uu(i,{style:{strokePercent:1}},e)),f.oldLayout=d}},t}();function Td(t,e,n,i,r){var a=t+e;n.isSilent(a)||i.eachComponent({mainType:"series",subType:"pie"},(function(t){for(var e=t.seriesIndex,i=r.selected,o=0;o<i.length;o++)if(i[o].seriesIndex===e){var s=t.getData(),l=ur(s,r.fromActionPayload);n.trigger(a,{type:a,seriesId:t.id,name:z(l)?s.getName(l[0]):s.getName(l),selected:M({},t.option.selectedMap)})}}))}function Cd(t,e,n){for(var i;t&&(!e(t)||(i=t,!n));)t=t.__hostTarget||t.parent;return i}var Ad=Math.round(9*Math.random()),Dd=function(){function t(){this._id="__ec_inner_"+Ad++}return t.prototype.get=function(t){return this._guard(t)[this._id]},t.prototype.set=function(t,e){var n=this._guard(t);return"function"==typeof Object.defineProperty?Object.defineProperty(n,this._id,{value:e,enumerable:!1,configurable:!0}):n[this._id]=e,this},t.prototype.delete=function(t){return!!this.has(t)&&(delete this._guard(t)[this._id],!0)},t.prototype.has=function(t){return!!this._guard(t)[this._id]},t.prototype._guard=function(t){if(t!==Object(t))throw TypeError("Value of WeakMap is not a non-null object.");return t},t}(),Id=Co.extend({type:"triangle",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(t,e){var n=e.cx,i=e.cy,r=e.width/2,a=e.height/2;t.moveTo(n,i-a),t.lineTo(n+r,i+a),t.lineTo(n-r,i+a),t.closePath()}}),kd=Co.extend({type:"diamond",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(t,e){var n=e.cx,i=e.cy,r=e.width/2,a=e.height/2;t.moveTo(n,i-a),t.lineTo(n+r,i),t.lineTo(n,i+a),t.lineTo(n-r,i),t.closePath()}}),Ld=Co.extend({type:"pin",shape:{x:0,y:0,width:0,height:0},buildPath:function(t,e){var n=e.x,i=e.y,r=e.width/5*3,a=Math.max(r,e.height),o=r/2,s=o*o/(a-o),l=i-a+o+s,u=Math.asin(s/o),h=Math.cos(u)*o,c=Math.sin(u),p=Math.cos(u),f=.6*o,d=.7*o;t.moveTo(n-h,l+s),t.arc(n,l,o,Math.PI-u,2*Math.PI+u),t.bezierCurveTo(n+h-c*f,l+s+p*f,n,i-d,n,i),t.bezierCurveTo(n,i-d,n-h+c*f,l+s+p*f,n-h,l+s),t.closePath()}}),Pd=Co.extend({type:"arrow",shape:{x:0,y:0,width:0,height:0},buildPath:function(t,e){var n=e.height,i=e.width,r=e.x,a=e.y,o=i/3*2;t.moveTo(r,a),t.lineTo(r+o,a+n),t.lineTo(r,a+n/4*3),t.lineTo(r-o,a+n),t.lineTo(r,a),t.closePath()}}),Od={line:function(t,e,n,i,r){r.x1=t,r.y1=e+i/2,r.x2=t+n,r.y2=e+i/2},rect:function(t,e,n,i,r){r.x=t,r.y=e,r.width=n,r.height=i},roundRect:function(t,e,n,i,r){r.x=t,r.y=e,r.width=n,r.height=i,r.r=Math.min(n,i)/4},square:function(t,e,n,i,r){var a=Math.min(n,i);r.x=t,r.y=e,r.width=a,r.height=a},circle:function(t,e,n,i,r){r.cx=t+n/2,r.cy=e+i/2,r.r=Math.min(n,i)/2},diamond:function(t,e,n,i,r){r.cx=t+n/2,r.cy=e+i/2,r.width=n,r.height=i},pin:function(t,e,n,i,r){r.x=t+n/2,r.y=e+i/2,r.width=n,r.height=i},arrow:function(t,e,n,i,r){r.x=t+n/2,r.y=e+i/2,r.width=n,r.height=i},triangle:function(t,e,n,i,r){r.cx=t+n/2,r.cy=e+i/2,r.width=n,r.height=i}},Rd={};L({line:Ol,rect:Eo,roundRect:Eo,square:Eo,circle:al,diamond:kd,pin:Ld,arrow:Pd,triangle:Id},(function(t,e){Rd[e]=new t}));var Nd=Co.extend({type:"symbol",shape:{symbolType:"",x:0,y:0,width:0,height:0},calculateTextPosition:function(t,e,n){var i=Pn(t,e,n),r=this.shape;return r&&"pin"===r.symbolType&&"inside"===e.position&&(i.y=n.y+.4*n.height),i},buildPath:function(t,e,n){var i=e.symbolType;if("none"!==i){var r=Rd[i];r||(r=Rd[i="rect"]),Od[i](e.x,e.y,e.width,e.height,r.shape),r.buildPath(t,r.shape,n)}}});function Ed(t,e){if("image"!==this.type){var n=this.style;this.__isEmptyBrush?(n.stroke=t,n.fill=e||"#fff",n.lineWidth=2):"line"===this.shape.symbolType?n.stroke=t:n.fill=t,this.markRedraw()}}function Bd(t,e,n,i,r,a,o){var s,l=0===t.indexOf("empty");return l&&(t=t.substr(5,1).toLowerCase()+t.substr(6)),(s=0===t.indexOf("image://")?iu(t.slice(8),new bn(e,n,i,r),o?"center":"cover"):0===t.indexOf("path://")?nu(t.slice(7),{},new bn(e,n,i,r),o?"center":"cover"):new Nd({shape:{symbolType:t,x:e,y:n,width:i,height:r}})).__isEmptyBrush=l,s.setColor=Ed,a&&s.setColor(a),s}function zd(t,e,n){for(var i="radial"===e.type?function(t,e,n){var i=n.width,r=n.height,a=Math.min(i,r),o=null==e.x?.5:e.x,s=null==e.y?.5:e.y,l=null==e.r?.5:e.r;return e.global||(o=o*i+n.x,s=s*r+n.y,l*=a),t.createRadialGradient(o,s,0,o,s,l)}(t,e,n):function(t,e,n){var i=null==e.x?0:e.x,r=null==e.x2?1:e.x2,a=null==e.y?0:e.y,o=null==e.y2?0:e.y2;return e.global||(i=i*n.width+n.x,r=r*n.width+n.x,a=a*n.height+n.y,o=o*n.height+n.y),i=isNaN(i)?0:i,r=isNaN(r)?1:r,a=isNaN(a)?0:a,o=isNaN(o)?0:o,t.createLinearGradient(i,a,r,o)}(t,e,n),r=e.colorStops,a=0;a<r.length;a++)i.addColorStop(r[a].offset,r[a].color);return i}function Fd(t,e){return t&&"solid"!==t&&e>0?(e=e||1,"dashed"===t?[4*e,2*e]:"dotted"===t?[e]:G(t)?[t]:z(t)?t:null):null}var Vd=new ao(!0);function Hd(t){var e=t.stroke;return!(null==e||"none"===e||!(t.lineWidth>0))}function Gd(t){var e=t.fill;return null!=e&&"none"!==e}function Wd(t,e){if(null!=e.fillOpacity&&1!==e.fillOpacity){var n=t.globalAlpha;t.globalAlpha=e.fillOpacity*e.opacity,t.fill(),t.globalAlpha=n}else t.fill()}function Ud(t,e){if(null!=e.strokeOpacity&&1!==e.strokeOpacity){var n=t.globalAlpha;t.globalAlpha=e.strokeOpacity*e.opacity,t.stroke(),t.globalAlpha=n}else t.stroke()}function Yd(t,e,n){var i=Or(e.image,e.__image,n);if(Nr(i)){var r=t.createPattern(i,e.repeat||"repeat");if("function"==typeof DOMMatrix&&r.setTransform){var a=new DOMMatrix;a.rotateSelf(0,0,(e.rotation||0)/Math.PI*180),a.scaleSelf(e.scaleX||1,e.scaleY||1),a.translateSelf(e.x||0,e.y||0),r.setTransform(a)}return r}}var Xd=["shadowBlur","shadowOffsetX","shadowOffsetY"],qd=[["lineCap","butt"],["lineJoin","miter"],["miterLimit",10]];function jd(t,e,n,i,r){var a=!1;if(!i&&e===(n=n||{}))return!1;if(i||e.opacity!==n.opacity){a||($d(t,r),a=!0);var o=Math.max(Math.min(e.opacity,1),0);t.globalAlpha=isNaN(o)?Zr.opacity:o}(i||e.blend!==n.blend)&&(a||($d(t,r),a=!0),t.globalCompositeOperation=e.blend||Zr.blend);for(var s=0;s<Xd.length;s++){var l=Xd[s];(i||e[l]!==n[l])&&(a||($d(t,r),a=!0),t[l]=t.dpr*(e[l]||0))}return(i||e.shadowColor!==n.shadowColor)&&(a||($d(t,r),a=!0),t.shadowColor=e.shadowColor||Zr.shadowColor),a}function Zd(t,e,n,i,r){var a=Jd(e,r.inHover),o=i?null:n&&Jd(n,r.inHover)||{};if(a===o)return!1;var s=jd(t,a,o,i,r);if((i||a.fill!==o.fill)&&(s||($d(t,r),s=!0),t.fillStyle=a.fill),(i||a.stroke!==o.stroke)&&(s||($d(t,r),s=!0),t.strokeStyle=a.stroke),(i||a.opacity!==o.opacity)&&(s||($d(t,r),s=!0),t.globalAlpha=null==a.opacity?1:a.opacity),e.hasStroke()){var l=a.lineWidth/(a.strokeNoScale&&e&&e.getLineScale?e.getLineScale():1);t.lineWidth!==l&&(s||($d(t,r),s=!0),t.lineWidth=l)}for(var u=0;u<qd.length;u++){var h=qd[u],c=h[0];(i||a[c]!==o[c])&&(s||($d(t,r),s=!0),t[c]=a[c]||h[1])}return s}function Kd(t,e){var n=e.transform,i=t.dpr||1;n?t.setTransform(i*n[0],i*n[1],i*n[2],i*n[3],i*n[4],i*n[5]):t.setTransform(i,0,0,i,0,0)}function $d(t,e){e.batchFill&&t.fill(),e.batchStroke&&t.stroke(),e.batchFill="",e.batchStroke=""}function Jd(t,e){return e&&t.__hoverStyle||t.style}function Qd(t,e){tg(t,e,{inHover:!1,viewWidth:0,viewHeight:0},!0)}function tg(t,e,n,i){var r=e.transform;if(!e.shouldBePainted(n.viewWidth,n.viewHeight,!1,!1))return e.__dirty&=~Gn.REDARAW_BIT,void(e.__isRendered=!1);var a=e.__clipPaths,o=n.prevElClipPaths,s=!1,l=!1;if(o&&!function(t,e){if(t===e||!t&&!e)return!1;if(!t||!e||t.length!==e.length)return!0;for(var n=0;n<t.length;n++)if(t[n]!==e[n])return!0;return!1}(a,o)||(o&&o.length&&($d(t,n),t.restore(),l=s=!0,n.prevElClipPaths=null,n.allClipped=!1,n.prevEl=null),a&&a.length&&($d(t,n),t.save(),function(t,e,n){for(var i=!1,r=0;r<t.length;r++){var a=t[r];i=i||a.isZeroArea(),Kd(e,a),e.beginPath(),a.buildPath(e,a.shape),e.clip()}n.allClipped=i}(a,t,n),s=!0),n.prevElClipPaths=a),n.allClipped)e.__isRendered=!1;else{e.beforeBrush&&e.beforeBrush(),e.innerBeforeBrush();var u=n.prevEl;u||(l=s=!0);var h,c,p=e instanceof Co&&e.autoBatch&&function(t){var e=Gd(t),n=Hd(t);return!(t.lineDash||!(+e^+n)||e&&"string"!=typeof t.fill||n&&"string"!=typeof t.stroke||t.strokePercent<1||t.strokeOpacity<1||t.fillOpacity<1)}(e.style);s||(h=r,c=u.transform,h&&c?h[0]!==c[0]||h[1]!==c[1]||h[2]!==c[2]||h[3]!==c[3]||h[4]!==c[4]||h[5]!==c[5]:h||c)?($d(t,n),Kd(t,e)):p||$d(t,n);var f=Jd(e,n.inHover);e instanceof Co?(1!==n.lastDrawType&&(l=!0,n.lastDrawType=1),Zd(t,e,u,l,n),p&&(n.batchFill||n.batchStroke)||t.beginPath(),function(t,e,n,i){var r=Hd(n),a=Gd(n),o=n.strokePercent,s=o<1,l=!e.path;e.silent&&!s||!l||e.createPathProxy();var u=e.path||Vd;if(!i){var h=n.fill,c=n.stroke,p=a&&!!h.colorStops,f=r&&!!c.colorStops,d=a&&!!h.image,g=r&&!!c.image,y=void 0,v=void 0,m=void 0,_=void 0,x=void 0;(p||f)&&(x=e.getBoundingRect()),p&&(y=e.__dirty?zd(t,h,x):e.__canvasFillGradient,e.__canvasFillGradient=y),f&&(v=e.__dirty?zd(t,c,x):e.__canvasStrokeGradient,e.__canvasStrokeGradient=v),d&&(m=e.__dirty||!e.__canvasFillPattern?Yd(t,h,e):e.__canvasFillPattern,e.__canvasFillPattern=m),g&&(_=e.__dirty||!e.__canvasStrokePattern?Yd(t,c,e):e.__canvasStrokePattern,e.__canvasStrokePattern=m),p?t.fillStyle=y:d&&(m?t.fillStyle=m:a=!1),f?t.strokeStyle=v:g&&(_?t.strokeStyle=_:r=!1)}var b=n.lineDash&&n.lineWidth>0&&Fd(n.lineDash,n.lineWidth),w=n.lineDashOffset,S=!!t.setLineDash,M=e.getGlobalScale();if(u.setScale(M[0],M[1],e.segmentIgnoreThreshold),b){var T=n.strokeNoScale&&e.getLineScale?e.getLineScale():1;T&&1!==T&&(b=P(b,(function(t){return t/T})),w/=T)}var C=!0;(l||e.__dirty&Co.SHAPE_CHANGED_BIT||b&&!S&&r)&&(u.setDPR(t.dpr),s?u.setContext(null):(u.setContext(t),C=!1),u.reset(),b&&!S&&(u.setLineDash(b),u.setLineDashOffset(w)),e.buildPath(u,e.shape,i),u.toStatic(),e.pathUpdated()),C&&u.rebuildPath(t,s?o:1),b&&S&&(t.setLineDash(b),t.lineDashOffset=w),i||(n.strokeFirst?(r&&Ud(t,n),a&&Wd(t,n)):(a&&Wd(t,n),r&&Ud(t,n))),b&&S&&t.setLineDash([])}(t,e,f,p),p&&(n.batchFill=f.fill||"",n.batchStroke=f.stroke||"")):e instanceof Do?(3!==n.lastDrawType&&(l=!0,n.lastDrawType=3),Zd(t,e,u,l,n),function(t,e,n){var i=n.text;if(null!=i&&(i+=""),i){t.font=n.font||Sn,t.textAlign=n.textAlign,t.textBaseline=n.textBaseline;var r=void 0;if(t.setLineDash){var a=n.lineDash&&n.lineWidth>0&&Fd(n.lineDash,n.lineWidth),o=n.lineDashOffset;if(a){var s=n.strokeNoScale&&e.getLineScale?e.getLineScale():1;s&&1!==s&&(a=P(a,(function(t){return t/s})),o/=s),t.setLineDash(a),t.lineDashOffset=o,r=!0}}n.strokeFirst?(Hd(n)&&t.strokeText(i,n.x,n.y),Gd(n)&&t.fillText(i,n.x,n.y)):(Gd(n)&&t.fillText(i,n.x,n.y),Hd(n)&&t.strokeText(i,n.x,n.y)),r&&t.setLineDash([])}}(t,e,f)):e instanceof Lo?(2!==n.lastDrawType&&(l=!0,n.lastDrawType=2),function(t,e,n,i,r){jd(t,Jd(e,r.inHover),n&&Jd(n,r.inHover),i,r)}(t,e,u,l,n),function(t,e,n){var i=e.__image=Or(n.image,e.__image,e,e.onload);if(i&&Nr(i)){var r=n.x||0,a=n.y||0,o=e.getWidth(),s=e.getHeight(),l=i.width/i.height;if(null==o&&null!=s?o=s*l:null==s&&null!=o?s=o/l:null==o&&null==s&&(o=i.width,s=i.height),n.sWidth&&n.sHeight){var u=n.sx||0,h=n.sy||0;t.drawImage(i,u,h,n.sWidth,n.sHeight,r,a,o,s)}else if(n.sx&&n.sy){var c=o-(u=n.sx),p=s-(h=n.sy);t.drawImage(i,u,h,c,p,r,a,o,s)}else t.drawImage(i,r,a,o,s)}}(t,e,f)):e instanceof Kl&&(4!==n.lastDrawType&&(l=!0,n.lastDrawType=4),function(t,e,n){var i=e.getDisplayables(),r=e.getTemporalDisplayables();t.save();var a,o,s={prevElClipPaths:null,prevEl:null,allClipped:!1,viewWidth:n.viewWidth,viewHeight:n.viewHeight,inHover:n.inHover};for(a=e.getCursor(),o=i.length;a<o;a++){(h=i[a]).beforeBrush&&h.beforeBrush(),h.innerBeforeBrush(),tg(t,h,s,a===o-1),h.innerAfterBrush(),h.afterBrush&&h.afterBrush(),s.prevEl=h}for(var l=0,u=r.length;l<u;l++){var h;(h=r[l]).beforeBrush&&h.beforeBrush(),h.innerBeforeBrush(),tg(t,h,s,l===u-1),h.innerAfterBrush(),h.afterBrush&&h.afterBrush(),s.prevEl=h}e.clearTemporalDisplayables(),e.notClear=!0,t.restore()}(t,e,n)),p&&i&&$d(t,n),e.innerAfterBrush(),e.afterBrush&&e.afterBrush(),n.prevEl=e,e.__dirty=0,e.__isRendered=!0}}var eg,ng=new Dd,ig=new Ce(100),rg=["symbol","symbolSize","symbolKeepAspect","color","backgroundColor","dashArrayX","dashArrayY","maxTileWidth","maxTileHeight"];function ag(t,e){if("none"===t)return null;var n=e.getDevicePixelRatio(),i=e.getZr(),r="svg"===i.painter.type;t.dirty&&ng.delete(t);var a=ng.get(t);if(a)return a;var o=T(t,{symbol:"rect",symbolSize:1,symbolKeepAspect:!0,color:"rgba(0, 0, 0, 0.2)",backgroundColor:null,dashArrayX:5,dashArrayY:5,rotation:0,maxTileWidth:512,maxTileHeight:512});"none"===o.backgroundColor&&(o.backgroundColor=null);var s={repeat:"repeat"};return function(t){for(var e,a=[n],s=!0,l=0;l<rg.length;++l){var u=o[rg[l]],h=typeof u;if(null!=u&&!z(u)&&"string"!==h&&"number"!==h&&"boolean"!==h){s=!1;break}a.push(u)}if(s){e=a.join(",")+(r?"-svg":"");var c=ig.get(e);c&&(r?t.svgElement=c:t.image=c)}var p,f=sg(o.dashArrayX),d=function(t){if(!t||"object"==typeof t&&0===t.length)return[0,0];if("number"==typeof t){var e=Math.ceil(t);return[e,e]}var n=P(t,(function(t){return Math.ceil(t)}));return t.length%2?n.concat(n):n}(o.dashArrayY),g=og(o.symbol),y=(b=f,P(b,(function(t){return lg(t)}))),v=lg(d),m=!r&&C(),_=r&&i.painter.createSVGElement("g"),x=function(){for(var t=1,e=0,n=y.length;e<n;++e)t=Zi(t,y[e]);var i=1;for(e=0,n=g.length;e<n;++e)i=Zi(i,g[e].length);t*=i;var r=v*y.length*g.length;return{width:Math.max(1,Math.min(t,o.maxTileWidth)),height:Math.max(1,Math.min(r,o.maxTileHeight))}}();var b;m&&(m.width=x.width*n,m.height=x.height*n,p=m.getContext("2d"));(function(){p&&(p.clearRect(0,0,m.width,m.height),o.backgroundColor&&(p.fillStyle=o.backgroundColor,p.fillRect(0,0,m.width,m.height)));for(var t=0,e=0;e<d.length;++e)t+=d[e];if(t<=0)return;var a=-v,s=0,l=0,u=0;for(;a<x.height;){if(s%2==0){for(var h=l/2%g.length,c=0,y=0,b=0;c<2*x.width;){var w=0;for(e=0;e<f[u].length;++e)w+=f[u][e];if(w<=0)break;if(y%2==0){var S=.5*(1-o.symbolSize),M=c+f[u][y]*S,T=a+d[s]*S,C=f[u][y]*o.symbolSize,A=d[s]*o.symbolSize,D=b/2%g[h].length;I(M,T,C,A,g[h][D])}c+=f[u][y],++b,++y===f[u].length&&(y=0)}++u===f.length&&(u=0)}a+=d[s],++l,++s===d.length&&(s=0)}function I(t,e,a,s,l){var u=r?1:n,h=Bd(l,t*u,e*u,a*u,s*u,o.color,o.symbolKeepAspect);r?_.appendChild(i.painter.paintOne(h)):Qd(p,h)}})(),s&&ig.put(e,m||_);t.image=m,t.svgElement=_,t.svgWidth=x.width,t.svgHeight=x.height}(s),s.rotation=o.rotation,s.scaleX=s.scaleY=r?1:1/n,ng.set(t,s),t.dirty=!1,s}function og(t){if(!t||0===t.length)return[["rect"]];if("string"==typeof t)return[[t]];for(var e=!0,n=0;n<t.length;++n)if("string"!=typeof t[n]){e=!1;break}if(e)return og([t]);var i=[];for(n=0;n<t.length;++n)"string"==typeof t[n]?i.push([t[n]]):i.push(t[n]);return i}function sg(t){if(!t||0===t.length)return[[0,0]];if("number"==typeof t)return[[r=Math.ceil(t),r]];for(var e=!0,n=0;n<t.length;++n)if("number"!=typeof t[n]){e=!1;break}if(e)return sg([t]);var i=[];for(n=0;n<t.length;++n)if("number"==typeof t[n]){var r=Math.ceil(t[n]);i.push([r,r])}else{(r=P(t[n],(function(t){return Math.ceil(t)}))).length%2==1?i.push(r.concat(r)):i.push(r)}return i}function lg(t){for(var e=0,n=0;n<t.length;++n)e+=t[n];return t.length%2==1?2*e:e}function ug(t){V(t)&&(t=(new DOMParser).parseFromString(t,"text/xml"));var e=t;for(9===e.nodeType&&(e=e.firstChild);"svg"!==e.nodeName.toLowerCase()||1!==e.nodeType;)e=e.nextSibling;return e}var hg={fill:"fill",stroke:"stroke","stroke-width":"lineWidth",opacity:"opacity","fill-opacity":"fillOpacity","stroke-opacity":"strokeOpacity","stroke-dasharray":"lineDash","stroke-dashoffset":"lineDashOffset","stroke-linecap":"lineCap","stroke-linejoin":"lineJoin","stroke-miterlimit":"miterLimit","font-family":"fontFamily","font-size":"fontSize","font-style":"fontStyle","font-weight":"fontWeight","text-anchor":"textAlign",visibility:"visibility",display:"display"},cg=N(hg),pg={"alignment-baseline":"textBaseline","stop-color":"stopColor"},fg=N(pg),dg=function(){function t(){this._defs={},this._root=null}return t.prototype.parse=function(t,e){e=e||{};var n=ug(t);if(!n)throw new Error("Illegal svg");this._defsUsePending=[];var i=new Mi;this._root=i;var r=[],a=n.getAttribute("viewBox")||"",o=parseFloat(n.getAttribute("width")||e.width),s=parseFloat(n.getAttribute("height")||e.height);isNaN(o)&&(o=null),isNaN(s)&&(s=null),xg(n,i,null,!0,!1);for(var l,u,h=n.firstChild;h;)this._parseNode(h,i,r,null,!1,!1),h=h.nextSibling;if(function(t,e){for(var n=0;n<e.length;n++){var i=e[n];i[0].style[i[1]]=t[i[2]]}}(this._defs,this._defsUsePending),this._defsUsePending=[],a){var c=Mg(a);c.length>=4&&(l={x:parseFloat(c[0]||0),y:parseFloat(c[1]||0),width:parseFloat(c[2]),height:parseFloat(c[3])})}if(l&&null!=o&&null!=s&&(u=Dg(l,{x:0,y:0,width:o,height:s}),!e.ignoreViewBox)){var p=i;(i=new Mi).add(p),p.scaleX=p.scaleY=u.scale,p.x=u.x,p.y=u.y}return e.ignoreRootClip||null==o||null==s||i.setClipPath(new Eo({shape:{x:0,y:0,width:o,height:s}})),{root:i,width:o,height:s,viewBoxRect:l,viewBoxTransform:u,named:r}},t.prototype._parseNode=function(t,e,n,i,r,a){var o,s=t.nodeName.toLowerCase(),l=i;if("defs"===s&&(r=!0),"text"===s&&(a=!0),"defs"===s||"switch"===s)o=e;else{if(!r){var u=eg[s];if(u&&ht(eg,s)){o=u.call(this,t,e);var h=t.getAttribute("name");if(h){var c={name:h,namedFrom:null,svgNodeTagLower:s,el:o};n.push(c),"g"===s&&(l=c)}else i&&n.push({name:i.name,namedFrom:i,svgNodeTagLower:s,el:o});e.add(o)}}var p=gg[s];if(p&&ht(gg,s)){var f=p.call(this,t),d=t.getAttribute("id");d&&(this._defs[d]=f)}}if(o&&o.isGroup)for(var g=t.firstChild;g;)1===g.nodeType?this._parseNode(g,o,n,l,r,a):3===g.nodeType&&a&&this._parseText(g,o),g=g.nextSibling},t.prototype._parseText=function(t,e){var n=new Do({style:{text:t.textContent},silent:!0,x:this._textX||0,y:this._textY||0});mg(e,n),xg(t,n,this._defsUsePending,!1,!1),function(t,e){var n=e.__selfStyle;if(n){var i=n.textBaseline,r=i;i&&"auto"!==i?"baseline"===i?r="alphabetic":"before-edge"===i||"text-before-edge"===i?r="top":"after-edge"===i||"text-after-edge"===i?r="bottom":"central"!==i&&"mathematical"!==i||(r="middle"):r="alphabetic",t.style.textBaseline=r}var a=e.__inheritedStyle;if(a){var o=a.textAlign,s=o;o&&("middle"===o&&(s="center"),t.style.textAlign=s)}}(n,e);var i=n.style,r=i.fontSize;r&&r<9&&(i.fontSize=9,n.scaleX*=r/9,n.scaleY*=r/9);var a=(i.fontSize||i.fontFamily)&&[i.fontStyle,i.fontWeight,(i.fontSize||12)+"px",i.fontFamily||"sans-serif"].join(" ");i.font=a;var o=n.getBoundingRect();return this._textX+=o.width,e.add(n),n},t.internalField=void(eg={g:function(t,e){var n=new Mi;return mg(e,n),xg(t,n,this._defsUsePending,!1,!1),n},rect:function(t,e){var n=new Eo;return mg(e,n),xg(t,n,this._defsUsePending,!1,!1),n.setShape({x:parseFloat(t.getAttribute("x")||"0"),y:parseFloat(t.getAttribute("y")||"0"),width:parseFloat(t.getAttribute("width")||"0"),height:parseFloat(t.getAttribute("height")||"0")}),n.silent=!0,n},circle:function(t,e){var n=new al;return mg(e,n),xg(t,n,this._defsUsePending,!1,!1),n.setShape({cx:parseFloat(t.getAttribute("cx")||"0"),cy:parseFloat(t.getAttribute("cy")||"0"),r:parseFloat(t.getAttribute("r")||"0")}),n.silent=!0,n},line:function(t,e){var n=new Ol;return mg(e,n),xg(t,n,this._defsUsePending,!1,!1),n.setShape({x1:parseFloat(t.getAttribute("x1")||"0"),y1:parseFloat(t.getAttribute("y1")||"0"),x2:parseFloat(t.getAttribute("x2")||"0"),y2:parseFloat(t.getAttribute("y2")||"0")}),n.silent=!0,n},ellipse:function(t,e){var n=new sl;return mg(e,n),xg(t,n,this._defsUsePending,!1,!1),n.setShape({cx:parseFloat(t.getAttribute("cx")||"0"),cy:parseFloat(t.getAttribute("cy")||"0"),rx:parseFloat(t.getAttribute("rx")||"0"),ry:parseFloat(t.getAttribute("ry")||"0")}),n.silent=!0,n},polygon:function(t,e){var n,i=t.getAttribute("points");i&&(n=_g(i));var r=new Dl({shape:{points:n||[]},silent:!0});return mg(e,r),xg(t,r,this._defsUsePending,!1,!1),r},polyline:function(t,e){var n,i=t.getAttribute("points");i&&(n=_g(i));var r=new kl({shape:{points:n||[]},silent:!0});return mg(e,r),xg(t,r,this._defsUsePending,!1,!1),r},image:function(t,e){var n=new Lo;return mg(e,n),xg(t,n,this._defsUsePending,!1,!1),n.setStyle({image:t.getAttribute("xlink:href"),x:+t.getAttribute("x"),y:+t.getAttribute("y"),width:+t.getAttribute("width"),height:+t.getAttribute("height")}),n.silent=!0,n},text:function(t,e){var n=t.getAttribute("x")||"0",i=t.getAttribute("y")||"0",r=t.getAttribute("dx")||"0",a=t.getAttribute("dy")||"0";this._textX=parseFloat(n)+parseFloat(r),this._textY=parseFloat(i)+parseFloat(a);var o=new Mi;return mg(e,o),xg(t,o,this._defsUsePending,!1,!0),o},tspan:function(t,e){var n=t.getAttribute("x"),i=t.getAttribute("y");null!=n&&(this._textX=parseFloat(n)),null!=i&&(this._textY=parseFloat(i));var r=t.getAttribute("dx")||"0",a=t.getAttribute("dy")||"0",o=new Mi;return mg(e,o),xg(t,o,this._defsUsePending,!1,!0),this._textX+=parseFloat(r),this._textY+=parseFloat(a),o},path:function(t,e){var n=il(t.getAttribute("d")||"");return mg(e,n),xg(t,n,this._defsUsePending,!1,!1),n.silent=!0,n}}),t}(),gg={lineargradient:function(t){var e=parseInt(t.getAttribute("x1")||"0",10),n=parseInt(t.getAttribute("y1")||"0",10),i=parseInt(t.getAttribute("x2")||"10",10),r=parseInt(t.getAttribute("y2")||"0",10),a=new Gl(e,n,i,r);return yg(t,a),vg(t,a),a},radialgradient:function(t){var e=parseInt(t.getAttribute("cx")||"0",10),n=parseInt(t.getAttribute("cy")||"0",10),i=parseInt(t.getAttribute("r")||"0",10),r=new Wl(e,n,i);return yg(t,r),vg(t,r),r}};function yg(t,e){"userSpaceOnUse"===t.getAttribute("gradientUnits")&&(e.global=!0)}function vg(t,e){for(var n=t.firstChild;n;){if(1===n.nodeType&&"stop"===n.nodeName.toLocaleLowerCase()){var i=n.getAttribute("offset"),r=void 0;r=i&&i.indexOf("%")>0?parseInt(i,10)/100:i?parseFloat(i):0;var a={};Ag(n,a,a);var o=a.stopColor||n.getAttribute("stop-color")||"#000000";e.colorStops.push({offset:r,color:o})}n=n.nextSibling}}function mg(t,e){t&&t.__inheritedStyle&&(e.__inheritedStyle||(e.__inheritedStyle={}),T(e.__inheritedStyle,t.__inheritedStyle))}function _g(t){for(var e=Mg(t),n=[],i=0;i<e.length;i+=2){var r=parseFloat(e[i]),a=parseFloat(e[i+1]);n.push([r,a])}return n}function xg(t,e,n,i,r){var a=e,o=a.__inheritedStyle=a.__inheritedStyle||{},s={};1===t.nodeType&&(function(t,e){var n=t.getAttribute("transform");if(n){n=n.replace(/,/g," ");var i=[],r=null;n.replace(Tg,(function(t,e,n){return i.push(e,n),""}));for(var a=i.length-1;a>0;a-=2){var o=i[a],s=void 0;switch(r=r||[1,0,0,1,0,0],i[a-1]){case"translate":s=Mg(o),ue(r,r,[parseFloat(s[0]),parseFloat(s[1]||"0")]);break;case"scale":s=Mg(o),ce(r,r,[parseFloat(s[0]),parseFloat(s[1]||s[0])]);break;case"rotate":s=Mg(o),he(r,r,-parseFloat(s[0])/180*Math.PI);break;case"skew":s=Mg(o),console.warn("Skew transform is not supported yet");break;case"matrix":s=Mg(o),r[0]=parseFloat(s[0]),r[1]=parseFloat(s[1]),r[2]=parseFloat(s[2]),r[3]=parseFloat(s[3]),r[4]=parseFloat(s[4]),r[5]=parseFloat(s[5])}}e.setLocalTransform(r)}}(t,e),Ag(t,o,s),i||function(t,e,n){for(var i=0;i<cg.length;i++){var r=cg[i];null!=(a=t.getAttribute(r))&&(e[hg[r]]=a)}for(i=0;i<fg.length;i++){var a;r=fg[i];null!=(a=t.getAttribute(r))&&(n[pg[r]]=a)}}(t,o,s)),a.style=a.style||{},null!=o.fill&&(a.style.fill=wg(a,"fill",o.fill,n)),null!=o.stroke&&(a.style.stroke=wg(a,"stroke",o.stroke,n)),L(["lineWidth","opacity","fillOpacity","strokeOpacity","miterLimit","fontSize"],(function(t){null!=o[t]&&(a.style[t]=parseFloat(o[t]))})),L(["lineDashOffset","lineCap","lineJoin","fontWeight","fontFamily","fontStyle","textAlign"],(function(t){null!=o[t]&&(a.style[t]=o[t])})),r&&(a.__selfStyle=s),o.lineDash&&(a.style.lineDash=P(Mg(o.lineDash),(function(t){return parseFloat(t)}))),"hidden"!==o.visibility&&"collapse"!==o.visibility||(a.invisible=!0),"none"===o.display&&(a.ignore=!0),a.z=-1e4,a.z2=-1e3}var bg=/^url\(\s*#(.*?)\)/;function wg(t,e,n,i){var r=n&&n.match(bg);if(!r)return"none"===n&&(n=null),n;var a=it(r[1]);i.push([t,e,a])}var Sg=/-?([0-9]*\.)?[0-9]+([eE]-?[0-9]+)?/g;function Mg(t){return t.match(Sg)||[]}var Tg=/(translate|scale|rotate|skewX|skewY|matrix)\(([\-\s0-9\.eE,]*)\)/g;var Cg=/([^\s:;]+)\s*:\s*([^:;]+)/g;function Ag(t,e,n){var i,r=t.getAttribute("style");if(r)for(Cg.lastIndex=0;null!=(i=Cg.exec(r));){var a=i[1],o=ht(hg,a)?hg[a]:null;o&&(e[o]=i[2]);var s=ht(pg,a)?pg[a]:null;s&&(n[s]=i[2])}}function Dg(t,e){var n=e.width/t.width,i=e.height/t.height,r=Math.min(n,i);return{scale:r,x:-(t.x+t.width/2)*r+(e.x+e.width/2),y:-(t.y+t.height/2)*r+(e.y+e.height/2)}}function Ig(t,e){return Math.abs(t-e)<1e-8}function kg(t,e,n){var i=0,r=t[0];if(!r)return!1;for(var a=1;a<t.length;a++){var o=t[a];i+=fo(r[0],r[1],o[0],o[1],e,n),r=o}var s=t[0];return Ig(r[0],s[0])&&Ig(r[1],s[1])||(i+=fo(r[0],r[1],s[0],s[1],e,n)),0!==i}var Lg=[],Pg=function(){function t(t){this.name=t}return t.prototype.getCenter=function(){},t}(),Og=function(t){function e(e,n,i){var r=t.call(this,e)||this;if(r.type="geoJSON",r.geometries=n,i)i=[i[0],i[1]];else{var a=r.getBoundingRect();i=[a.x+a.width/2,a.y+a.height/2]}return r._center=i,r}return n(e,t),e.prototype.getBoundingRect=function(){var t=this._rect;if(t)return t;for(var e=Number.MAX_VALUE,n=[e,e],i=[-e,-e],r=[],a=[],o=this.geometries,s=0;s<o.length;s++){if("polygon"===o[s].type)Oa(o[s].exterior,r,a),It(n,n,r),kt(i,i,a)}return 0===s&&(n[0]=n[1]=i[0]=i[1]=0),this._rect=new bn(n[0],n[1],i[0]-n[0],i[1]-n[1])},e.prototype.contain=function(t){var e=this.getBoundingRect(),n=this.geometries;if(!e.contain(t[0],t[1]))return!1;t:for(var i=0,r=n.length;i<r;i++)if("polygon"===n[i].type){var a=n[i].exterior,o=n[i].interiors;if(kg(a,t[0],t[1])){for(var s=0;s<(o?o.length:0);s++)if(kg(o[s],t[0],t[1]))continue t;return!0}}return!1},e.prototype.transformTo=function(t,e,n,i){var r=this.getBoundingRect(),a=r.width/r.height;n?i||(i=n/a):n=a*i;for(var o=new bn(t,e,n,i),s=r.calculateTransform(o),l=this.geometries,u=0;u<l.length;u++)if("polygon"===l[u].type){for(var h=l[u].exterior,c=l[u].interiors,p=0;p<h.length;p++)Dt(h[p],h[p],s);for(var f=0;f<(c?c.length:0);f++)for(p=0;p<c[f].length;p++)Dt(c[f][p],c[f][p],s)}(r=this._rect).copy(o),this._center=[r.x+r.width/2,r.y+r.height/2]},e.prototype.cloneShallow=function(t){null==t&&(t=this.name);var n=new e(t,this.geometries,this._center);return n._rect=this._rect,n.transformTo=null,n},e.prototype.getCenter=function(){return this._center},e.prototype.setCenter=function(t){this._center=t},e}(Pg),Rg=function(t){function e(e,n){var i=t.call(this,e)||this;return i.type="geoSVG",i._elOnlyForCalculate=n,i}return n(e,t),e.prototype.getCenter=function(){var t=this._center;return t||(t=this._center=this._calculateCenter()),t},e.prototype._calculateCenter=function(){for(var t=this._elOnlyForCalculate,e=t.getBoundingRect(),n=[e.x+e.width/2,e.y+e.height/2],i=oe(Lg),r=t;r&&!r.isGeoSVGGraphicRoot;)le(i,r.getLocalTransform(),i),r=r.parent;return pe(i,i),Dt(n,n,i),n},e}(Pg),Ng=lt(["rect","circle","line","ellipse","polygon","polyline","path","text","tspan","g"]),Eg=function(){function t(t,e){this.type="geoSVG",this._usedGraphicMap=lt(),this._freedGraphics=[],this._mapName=t,this._parsedXML=ug(e)}return t.prototype.load=function(){var t=this._firstGraphic;if(!t){t=this._firstGraphic=this._buildGraphic(this._parsedXML),this._freedGraphics.push(t),this._boundingRect=this._firstGraphic.boundingRect.clone();var e=function(t){var e=[],n=lt();return L(t,(function(t){if(null==t.namedFrom){var i=new Rg(t.name,t.el);e.push(i),n.set(t.name,i)}})),{regions:e,regionsMap:n}}(t.named),n=e.regions,i=e.regionsMap;this._regions=n,this._regionsMap=i}return{boundingRect:this._boundingRect,regions:this._regions,regionsMap:this._regionsMap}},t.prototype._buildGraphic=function(t){var e,n,i,r;try{nt(null!=(n=(e=t&&(i=t,r={ignoreViewBox:!0,ignoreRootClip:!0},(new dg).parse(i,r))||{}).root))}catch(t){throw new Error("Invalid svg format\n"+t.message)}var a=new Mi;a.add(n),a.isGeoSVGGraphicRoot=!0;var o=e.width,s=e.height,l=e.viewBoxRect,u=this._boundingRect;if(!u){var h=void 0,c=void 0,p=void 0,f=void 0;if(null!=o?(h=0,p=o):l&&(h=l.x,p=l.width),null!=s?(c=0,f=s):l&&(c=l.y,f=l.height),null==h||null==c){var d=n.getBoundingRect();null==h&&(h=d.x,p=d.width),null==c&&(c=d.y,f=d.height)}u=this._boundingRect=new bn(h,c,p,f)}if(l){var g=Dg(l,u);n.scaleX=n.scaleY=g.scale,n.x=g.x,n.y=g.y}a.setClipPath(new Eo({shape:u.plain()}));var y=[];return L(e.named,(function(t){var e;null!=Ng.get(t.svgNodeTagLower)&&(y.push(t),(e=t.el).silent=!1,e.isGroup&&e.traverse((function(t){t.silent=!1})))})),{root:a,boundingRect:u,named:y}},t.prototype.useGraphic=function(t){var e=this._usedGraphicMap,n=e.get(t);return n||(n=this._freedGraphics.pop()||this._buildGraphic(this._parsedXML),e.set(t,n),n)},t.prototype.freeGraphic=function(t){var e=this._usedGraphicMap,n=e.get(t);n&&(e.removeKey(t),this._freedGraphics.push(n))},t}();function Bg(t,e,n){for(var i=[],r=e[0],a=e[1],o=0;o<t.length;o+=2){var s=t.charCodeAt(o)-64,l=t.charCodeAt(o+1)-64;s=s>>1^-(1&s),l=l>>1^-(1&l),r=s+=r,a=l+=a,i.push([s/n,l/n])}return i}function zg(t,e){return P(R((t=function(t){if(!t.UTF8Encoding)return t;var e=t,n=e.UTF8Scale;null==n&&(n=1024);for(var i=e.features,r=0;r<i.length;r++){var a=i[r].geometry;if("Polygon"===a.type)for(var o=a.coordinates,s=0;s<o.length;s++)o[s]=Bg(o[s],a.encodeOffsets[s],n);else if("MultiPolygon"===a.type)for(o=a.coordinates,s=0;s<o.length;s++)for(var l=o[s],u=0;u<l.length;u++)l[u]=Bg(l[u],a.encodeOffsets[s][u],n)}return e.UTF8Encoding=!1,e}(t)).features,(function(t){return t.geometry&&t.properties&&t.geometry.coordinates.length>0})),(function(t){var n=t.properties,i=t.geometry,r=[];if("Polygon"===i.type){var a=i.coordinates;r.push({type:"polygon",exterior:a[0],interiors:a.slice(1)})}"MultiPolygon"===i.type&&L(a=i.coordinates,(function(t){t[0]&&r.push({type:"polygon",exterior:t[0],interiors:t.slice(1)})}));var o=new Og(n[e||"name"],r,n.cp);return o.properties=n,o}))}for(var Fg=[126,25],Vg=[[[0,3.5],[7,11.2],[15,11.9],[30,7],[42,.7],[52,.7],[56,7.7],[59,.7],[64,.7],[64,0],[5,0],[0,3.5]],[[13,16.1],[19,14.7],[16,21.7],[11,23.1],[13,16.1]],[[12,32.2],[14,38.5],[15,38.5],[13,32.2],[12,32.2]],[[16,47.6],[12,53.2],[13,53.2],[18,47.6],[16,47.6]],[[6,64.4],[8,70],[9,70],[8,64.4],[6,64.4]],[[23,82.6],[29,79.8],[30,79.8],[25,82.6],[23,82.6]],[[37,70.7],[43,62.3],[44,62.3],[39,70.7],[37,70.7]],[[48,51.1],[51,45.5],[53,45.5],[50,51.1],[48,51.1]],[[51,35],[51,28.7],[53,28.7],[53,35],[51,35]],[[52,22.4],[55,17.5],[56,17.5],[53,22.4],[52,22.4]],[[58,12.6],[62,7],[63,7],[60,12.6],[58,12.6]],[[0,3.5],[0,93.1],[64,93.1],[64,0],[63,0],[63,92.4],[1,92.4],[1,3.5],[0,3.5]]],Hg=0;Hg<Vg.length;Hg++)for(var Gg=0;Gg<Vg[Hg].length;Gg++)Vg[Hg][Gg][0]/=10.5,Vg[Hg][Gg][1]/=-14,Vg[Hg][Gg][0]+=Fg[0],Vg[Hg][Gg][1]+=Fg[1];var Wg={"南海诸岛":[32,80],"广东":[0,-10],"香港":[10,5],"澳门":[-10,10],"天津":[5,5]};var Ug={Russia:[100,60],"United States":[-99,38],"United States of America":[-99,38]};var Yg=[[[123.45165252685547,25.73527164402261],[123.49731445312499,25.73527164402261],[123.49731445312499,25.750734064600884],[123.45165252685547,25.750734064600884],[123.45165252685547,25.73527164402261]]];var Xg=function(){function t(t,e,n){var i;this.type="geoJSON",this._parsedMap=lt(),this._mapName=t,this._specialAreas=n,this._geoJSON=V(i=e)?"undefined"!=typeof JSON&&JSON.parse?JSON.parse(i):new Function("return ("+i+");")():i}return t.prototype.load=function(t,e){e=e||"name";var n=this._parsedMap.get(e);if(!n){var i=this._parseToRegions(e);n=this._parsedMap.set(e,{regions:i,boundingRect:qg(i)})}var r=lt(),a=[];return L(n.regions,(function(e){var n=e.name;t&&t.hasOwnProperty(n)&&(e=e.cloneShallow(n=t[n])),a.push(e),r.set(n,e)})),{regions:a,boundingRect:n.boundingRect||new bn(0,0,0,0),regionsMap:r}},t.prototype._parseToRegions=function(t){var e,n,i=this._mapName,r=this._geoJSON;try{e=r?zg(r,t):[]}catch(t){throw new Error("Invalid geoJson format\n"+t.message)}return n=e,"china"===i&&n.push(new Og("南海诸岛",P(Vg,(function(t){return{type:"polygon",exterior:t}})),Fg)),L(e,(function(t){var e=t.name;!function(t,e){if("china"===t){var n=Wg[e.name];if(n){var i=e.getCenter();i[0]+=n[0]/10.5,i[1]+=-n[1]/14,e.setCenter(i)}}}(i,t),function(t,e){if("world"===t){var n=Ug[e.name];if(n){var i=[n[0],n[1]];e.setCenter(i)}}}(i,t),function(t,e){"china"===t&&"台湾"===e.name&&e.geometries.push({type:"polygon",exterior:Yg[0]})}(i,t);var n=this._specialAreas&&this._specialAreas[e];n&&t.transformTo(n.left,n.top,n.width,n.height)}),this),e},t.prototype.getMapForUser=function(){return{geoJson:this._geoJSON,geoJSON:this._geoJSON,specialAreas:this._specialAreas}},t}();function qg(t){for(var e,n=0;n<t.length;n++){var i=t[n].getBoundingRect();(e=e||i.clone()).union(i)}return e}var jg=lt(),Zg=function(t,e,n){if(e.svg){var i=new Eg(t,e.svg);jg.set(t,i)}else{var r=e.geoJson||e.geoJSON;r&&!e.features?n=e.specialAreas:r=e;i=new Xg(t,r,n);jg.set(t,i)}},Kg=function(t){var e=jg.get(t);return e&&"geoJSON"===e.type&&e.getMapForUser()},$g=nt,Jg=L,Qg=F,ty=W,ey=A,ny="undefined"!=typeof window,iy=2e3,ry=4500,ay={PROCESSOR:{FILTER:1e3,SERIES_FILTER:800,STATISTIC:5e3},VISUAL:{LAYOUT:1e3,PROGRESSIVE_LAYOUT:1100,GLOBAL:iy,CHART:3e3,POST_CHART_LAYOUT:4600,COMPONENT:4e3,BRUSH:5e3,CHART_ITEM:ry,ARIA:6e3,DECAL:7e3}},oy=/^[a-zA-Z0-9_]+$/,sy="__connectUpdateStatus";function ly(t){return function(){for(var e=[],n=0;n<arguments.length;n++)e[n]=arguments[n];if(!this.isDisposed())return hy(this,t,e);By(this.id)}}function uy(t){return function(){for(var e=[],n=0;n<arguments.length;n++)e[n]=arguments[n];return hy(this,t,e)}}function hy(t,e,n){return n[0]=n[0]&&n[0].toLowerCase(),Rt.prototype[e].apply(t,n)}var cy,py,fy,dy,gy,yy,vy,my,_y,xy,by,wy,Sy,My,Ty,Cy,Ay,Dy,Iy,ky,Ly,Py=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e}(Rt),Oy=Py.prototype;Oy.on=uy("on"),Oy.off=uy("off");var Ry=function(t){function e(e,n,i){var r=t.call(this,new Gf)||this;r._chartsViews=[],r._chartsMap={},r._componentsViews=[],r._componentsMap={},r._pendingActions=[],i=i||{},"string"==typeof n&&(n=Yy[n]),r._dom=e;var a="canvas",o=!1,s=r._zr=Ii(e,{renderer:i.renderer||a,devicePixelRatio:i.devicePixelRatio,width:i.width,height:i.height,useDirtyRect:null==i.useDirtyRect?o:i.useDirtyRect});r._throttledZrFlush=uf(E(s.flush,s),17),(n=w(n))&&Zc(n,!0),r._theme=n,r._locale=function(t){if(V(t)){var e=Uu[t.toUpperCase()]||{};return t===Hu||t===Gu?w(e):S(w(e),w(Uu.EN),!1)}return S(w(t),w(Uu.EN),!1)}(i.locale||Xu),r._coordSysMgr=new Cc;var l=r._api=Ay(r);function u(t,e){return t.__prio-e.__prio}return Jn(Uy,u),Jn(Vy,u),r._scheduler=new xf(r,l,Vy,Uy),r._messageCenter=new Py,r._labelManager=new Md,r._initEvents(),r.resize=E(r.resize,r),s.animation.on("frame",r._onframe,r),xy(s,r),by(s,r),at(r),r}return n(e,t),e.prototype._onframe=function(){if(!this._disposed){Ly(this);var t=this._scheduler;if(this.__optionUpdated){var e=this.__optionUpdated.silent;this.__flagInMainProcess=!0,cy(this),dy.update.call(this),this._zr.flush(),this.__flagInMainProcess=!1,this.__optionUpdated=!1,my.call(this,e),_y.call(this,e)}else if(t.unfinished){var n=1,i=this._model,r=this._api;t.unfinished=!1;do{var a=+new Date;t.performSeriesTasks(i),t.performDataProcessorTasks(i),yy(this,i),t.performVisualTasks(i),Ty(this,this._model,r,"remain"),n-=+new Date-a}while(n>0&&t.unfinished);t.unfinished||this._zr.flush()}}},e.prototype.getDom=function(){return this._dom},e.prototype.getId=function(){return this.id},e.prototype.getZr=function(){return this._zr},e.prototype.setOption=function(t,e,n){if(this._disposed)By(this.id);else{var i,r,a;if(ty(e)&&(n=e.lazyUpdate,i=e.silent,r=e.replaceMerge,a=e.transition,e=e.notMerge),this.__flagInMainProcess=!0,!this._model||e){var o=new Dc(this._api),s=this._theme,l=this._model=new _c;l.scheduler=this._scheduler,l.init(null,null,null,s,this._locale,o)}this._model.setOption(t,{replaceMerge:r},Hy),Iy(this,a),n?(this.__optionUpdated={silent:i},this.__flagInMainProcess=!1,this.getZr().wakeUp()):(cy(this),dy.update.call(this),this._zr.flush(),this.__optionUpdated=!1,this.__flagInMainProcess=!1,my.call(this,i),_y.call(this,i))}},e.prototype.setTheme=function(){console.error("ECharts#setTheme() is DEPRECATED in ECharts 3.0")},e.prototype.getModel=function(){return this._model},e.prototype.getOption=function(){return this._model&&this._model.getOption()},e.prototype.getWidth=function(){return this._zr.getWidth()},e.prototype.getHeight=function(){return this._zr.getHeight()},e.prototype.getDevicePixelRatio=function(){return this._zr.painter.dpr||ny&&window.devicePixelRatio||1},e.prototype.getRenderedCanvas=function(t){if(o.canvasSupported)return(t=M({},t||{})).pixelRatio=t.pixelRatio||this.getDevicePixelRatio(),t.backgroundColor=t.backgroundColor||this._model.get("backgroundColor"),this._zr.painter.getRenderedCanvas(t)},e.prototype.getSvgDataURL=function(){if(o.svgSupported){var t=this._zr;return L(t.storage.getDisplayList(),(function(t){t.stopAnimation(null,!0)})),t.painter.toDataURL()}},e.prototype.getDataURL=function(t){if(!this._disposed){var e=(t=t||{}).excludeComponents,n=this._model,i=[],r=this;Jg(e,(function(t){n.eachComponent({mainType:t},(function(t){var e=r._componentsMap[t.__viewId];e.group.ignore||(i.push(e),e.group.ignore=!0)}))}));var a="svg"===this._zr.painter.getType()?this.getSvgDataURL():this.getRenderedCanvas(t).toDataURL("image/"+(t&&t.type||"png"));return Jg(i,(function(t){t.group.ignore=!1})),a}By(this.id)},e.prototype.getConnectedDataURL=function(t){if(this._disposed)By(this.id);else if(o.canvasSupported){var e="svg"===t.type,n=this.group,i=Math.min,r=Math.max,a=1/0;if(jy[n]){var s=a,l=a,u=-1/0,h=-1/0,c=[],p=t&&t.pixelRatio||this.getDevicePixelRatio();L(qy,(function(a,o){if(a.group===n){var p=e?a.getZr().painter.getSvgDom().innerHTML:a.getRenderedCanvas(w(t)),f=a.getDom().getBoundingClientRect();s=i(f.left,s),l=i(f.top,l),u=r(f.right,u),h=r(f.bottom,h),c.push({dom:p,left:f.left,top:f.top})}}));var f=(u*=p)-(s*=p),d=(h*=p)-(l*=p),g=C(),y=Ii(g,{renderer:e?"svg":"canvas"});if(y.resize({width:f,height:d}),e){var v="";return Jg(c,(function(t){var e=t.left-s,n=t.top-l;v+='<g transform="translate('+e+","+n+')">'+t.dom+"</g>"})),y.painter.getSvgRoot().innerHTML=v,t.connectedBackgroundColor&&y.painter.setBackgroundColor(t.connectedBackgroundColor),y.refreshImmediately(),y.painter.toDataURL()}return t.connectedBackgroundColor&&y.add(new Eo({shape:{x:0,y:0,width:f,height:d},style:{fill:t.connectedBackgroundColor}})),Jg(c,(function(t){var e=new Lo({style:{x:t.left*p-s,y:t.top*p-l,image:t.dom}});y.add(e)})),y.refreshImmediately(),g.toDataURL("image/"+(t&&t.type||"png"))}return this.getDataURL(t)}},e.prototype.convertToPixel=function(t,e){return gy(this,"convertToPixel",t,e)},e.prototype.convertFromPixel=function(t,e){return gy(this,"convertFromPixel",t,e)},e.prototype.containPixel=function(t,e){var n;if(!this._disposed)return L(pr(this._model,t),(function(t,i){i.indexOf("Models")>=0&&L(t,(function(t){var r=t.coordinateSystem;if(r&&r.containPoint)n=n||!!r.containPoint(e);else if("seriesModels"===i){var a=this._chartsMap[t.__viewId];a&&a.containPoint&&(n=n||a.containPoint(e,t))}else 0}),this)}),this),!!n;By(this.id)},e.prototype.getVisual=function(t,e){var n=pr(this._model,t,{defaultMainType:"series"}),i=n.seriesModel;var r=i.getData(),a=n.hasOwnProperty("dataIndexInside")?n.dataIndexInside:n.hasOwnProperty("dataIndex")?r.indexOfRawIndex(n.dataIndex):null;return null!=a?function(t,e,n){switch(n){case"color":return t.getItemVisual(e,"style")[t.getVisual("drawType")];case"opacity":return t.getItemVisual(e,"style").opacity;case"symbol":case"symbolSize":case"liftZ":return t.getItemVisual(e,n)}}(r,a,e):function(t,e){switch(e){case"color":return t.getVisual("style")[t.getVisual("drawType")];case"opacity":return t.getVisual("style").opacity;case"symbol":case"symbolSize":case"liftZ":return t.getVisual(e)}}(r,e)},e.prototype.getViewOfComponentModel=function(t){return this._componentsMap[t.__viewId]},e.prototype.getViewOfSeriesModel=function(t){return this._chartsMap[t.__viewId]},e.prototype._initEvents=function(){var t,e,n,i=this;Jg(Ey,(function(t){var e=function(e){var n,r=i.getModel(),a=e.target,o="globalout"===t;if(o?n={}:a&&Cd(a,(function(t){var e=qo(t);if(e&&null!=e.dataIndex){var i=e.dataModel||r.getSeriesByIndex(e.seriesIndex);return n=i&&i.getDataParams(e.dataIndex,e.dataType)||{},!0}if(e.eventData)return n=M({},e.eventData),!0}),!0),n){var s=n.componentType,l=n.componentIndex;"markLine"!==s&&"markPoint"!==s&&"markArea"!==s||(s="series",l=n.seriesIndex);var u=s&&null!=l&&r.getComponent(s,l),h=u&&i["series"===u.mainType?"_chartsMap":"_componentsMap"][u.__viewId];0,n.event=e,n.type=t,i._$eventProcessor.eventInfo={targetEl:a,packedEvent:n,model:u,view:h},i.trigger(t,n)}};e.zrEventfulCallAtLast=!0,i._zr.on(t,e,i)})),Jg(Fy,(function(t,e){i._messageCenter.on(e,(function(t){this.trigger(e,t)}),i)})),Jg(["selectchanged"],(function(t){i._messageCenter.on(t,(function(e){this.trigger(t,e)}),i)})),t=this._messageCenter,e=this,n=this._api,t.on("selectchanged",(function(t){var i=n.getModel();t.isFromClick?(Td("map","selectchanged",e,i,t),Td("pie","selectchanged",e,i,t)):"select"===t.fromAction?(Td("map","selected",e,i,t),Td("pie","selected",e,i,t)):"unselect"===t.fromAction&&(Td("map","unselected",e,i,t),Td("pie","unselected",e,i,t))}))},e.prototype.isDisposed=function(){return this._disposed},e.prototype.clear=function(){this._disposed?By(this.id):this.setOption({series:[]},!0)},e.prototype.dispose=function(){if(this._disposed)By(this.id);else{this._disposed=!0,yr(this.getDom(),$y,"");var t=this._api,e=this._model;Jg(this._componentsViews,(function(n){n.dispose(e,t)})),Jg(this._chartsViews,(function(n){n.dispose(e,t)})),this._zr.dispose(),delete qy[this.id]}},e.prototype.resize=function(t){if(this._disposed)By(this.id);else{this._zr.resize(t);var e=this._model;if(this._loadingFX&&this._loadingFX.resize(),e){var n=e.resetOption("media"),i=t&&t.silent;this.__flagInMainProcess=!0,n&&cy(this),dy.update.call(this,{type:"resize",animation:M({duration:0},t&&t.animation)}),this.__flagInMainProcess=!1,my.call(this,i),_y.call(this,i)}}},e.prototype.showLoading=function(t,e){if(this._disposed)By(this.id);else if(ty(t)&&(e=t,t=""),t=t||"default",this.hideLoading(),Xy[t]){var n=Xy[t](this._api,e),i=this._zr;this._loadingFX=n,i.add(n)}},e.prototype.hideLoading=function(){this._disposed?By(this.id):(this._loadingFX&&this._zr.remove(this._loadingFX),this._loadingFX=null)},e.prototype.makeActionFromEvent=function(t){var e=M({},t);return e.type=Fy[t.type],e},e.prototype.dispatchAction=function(t,e){if(this._disposed)By(this.id);else if(ty(e)||(e={silent:!!e}),zy[t.type]&&this._model)if(this.__flagInMainProcess)this._pendingActions.push(t);else{var n=e.silent;vy.call(this,t,n);var i=e.flush;i?this._zr.flush():!1!==i&&o.browser.weChat&&this._throttledZrFlush(),my.call(this,n),_y.call(this,n)}},e.prototype.updateLabelLayout=function(){var t=this._labelManager;t.updateLayoutConfig(this._api),t.layout(this._api),t.processLabelsOverall()},e.prototype.appendData=function(t){if(this._disposed)By(this.id);else{var e=t.seriesIndex,n=this.getModel().getSeriesByIndex(e);0,n.appendData(t),this._scheduler.unfinished=!0,this.getZr().wakeUp()}},e.internalField=function(){function t(t){for(var e=[],n=t.currentStates,i=0;i<n.length;i++){var r=n[i];"emphasis"!==r&&"blur"!==r&&"select"!==r&&e.push(r)}t.selected&&t.states.select&&e.push("select"),2===t.hoverState&&t.states.emphasis?e.push("emphasis"):1===t.hoverState&&t.states.blur&&e.push("blur"),t.useStates(e)}function e(t,e){t.preventAutoZ||i(e.group,t.get("z")||0,t.get("zlevel")||0,-1/0)}function i(t,e,n,r){var a=t.getTextContent(),o=t.getTextGuideLine();if(t.isGroup)for(var s=t.childrenRef(),l=0;l<s.length;l++)r=Math.max(i(s[l],e,n,r),r);else t.z=e,t.zlevel=n,r=Math.max(t.z2,r);if(a&&(a.z=e,a.zlevel=n,isFinite(r)&&(a.z2=r+2)),o){var u=t.textGuideLineConfig;o.z=e,o.zlevel=n,isFinite(r)&&(o.z2=r+(u&&u.showAbove?1:-1))}return r}function r(t,e){e.group.traverse((function(t){if(!fu(t)){var e=t.getTextContent(),n=t.getTextGuideLine();t.stateTransition&&(t.stateTransition=null),e&&e.stateTransition&&(e.stateTransition=null),n&&n.stateTransition&&(n.stateTransition=null),t.hasState()?(t.prevStates=t.currentStates,t.clearStates()):t.prevStates&&(t.prevStates=null)}}))}function a(e,n){var i=e.getModel("stateAnimation"),r=e.isAnimationEnabled(),a=i.get("duration"),o=a>0?{duration:a,delay:i.get("delay"),easing:i.get("easing")}:null;n.group.traverse((function(e){if(e.states&&e.states.emphasis){if(fu(e))return;if(e instanceof Co&&function(t){var e=Ko(t);e.normalFill=t.style.fill,e.normalStroke=t.style.stroke;var n=t.states.select||{};e.selectFill=n.style&&n.style.fill||null,e.selectStroke=n.style&&n.style.stroke||null}(e),e.__dirty){var n=e.prevStates;n&&e.useStates(n)}if(r){e.stateTransition=o;var i=e.getTextContent(),a=e.getTextGuideLine();i&&(i.stateTransition=o),a&&(a.stateTransition=o)}e.__dirty&&t(e)}}))}cy=function(t){var e=t._scheduler;e.restorePipelines(t._model),e.prepareStageTasks(),py(t,!0),py(t,!1),e.plan()},py=function(t,e){for(var n=t._model,i=t._scheduler,r=e?t._componentsViews:t._chartsViews,a=e?t._componentsMap:t._chartsMap,o=t._zr,s=t._api,l=0;l<r.length;l++)r[l].__alive=!1;function u(t){var l=t.__requireNewView;t.__requireNewView=!1;var u="_ec_"+t.id+"_"+t.type,h=!l&&a[u];if(!h){var c=xr(t.type),p=e?Jp.getClass(c.main,c.sub):nf.getClass(c.sub);0,(h=new p).init(n,s),a[u]=h,r.push(h),o.add(h.group)}t.__viewId=h.__id=u,h.__alive=!0,h.__model=t,h.group.__ecComponentInfo={mainType:t.mainType,index:t.componentIndex},!e&&i.prepareView(h,t,n,s)}e?n.eachComponent((function(t,e){"series"!==t&&u(e)})):n.eachSeries(u);for(l=0;l<r.length;){var h=r[l];h.__alive?l++:(!e&&h.renderTask.dispose(),o.remove(h.group),h.dispose(n,s),r.splice(l,1),a[h.__id]===h&&delete a[h.__id],h.__id=h.group.__ecComponentInfo=null)}},fy=function(t,e,n,i,r){var a=t._model;if(a.setUpdatePayload(n),i){var o={};o[i+"Id"]=n[i+"Id"],o[i+"Index"]=n[i+"Index"],o[i+"Name"]=n[i+"Name"];var s={mainType:i,query:o};r&&(s.subType=r);var l,u=n.excludeSeriesId;null!=u&&(l=lt(),Jg(Qi(u),(function(t){var e=or(t,null);null!=e&&l.set(e,!0)}))),Fs(n)&&As(t._api),a&&a.eachComponent(s,(function(e){if(!l||null==l.get(e.id)){if(Fs(n))if(e instanceof Up)n.type!==Qo||n.notBlur||function(t,e,n){var i=t.seriesIndex,r=t.getData(e.dataType),a=ur(r,e);a=(z(a)?a[0]:a)||0;var o=r.getItemGraphicEl(a);if(!o)for(var s=r.count(),l=0;!o&&l<s;)o=r.getItemGraphicEl(l++);if(o){var u=qo(o);Ds(i,u.focus,u.blurScope,n)}else{var h=t.get(["emphasis","focus"]),c=t.get(["emphasis","blurScope"]);null!=h&&Ds(i,h,c,n)}}(e,n,t._api);else{var r=ks(e.mainType,e.componentIndex,n.name,t._api),a=r.focusSelf,o=r.dispatchers;n.type===Qo&&a&&!n.notBlur&&Is(e.mainType,e.componentIndex,t._api),o&&Jg(o,(function(t){n.type===Qo?bs(t):ws(t)}))}else zs(n)&&e instanceof Up&&(!function(t,e,n){if(zs(e)){var i=e.dataType,r=ur(t.getData(i),e);z(r)||(r=[r]),t[e.type===is?"toggleSelect":e.type===es?"select":"unselect"](r,i)}}(e,n,t._api),Ls(e),ky(t));h(t["series"===i?"_chartsMap":"_componentsMap"][e.__viewId])}}),t)}else Jg([].concat(t._componentsViews).concat(t._chartsViews),h);function h(i){i&&i.__alive&&i[e]&&i[e](i.__model,a,t._api,n)}},dy={prepareAndUpdate:function(t){cy(this),dy.update.call(this,t)},update:function(t){var e=this._model,n=this._api,i=this._zr,r=this._coordSysMgr,a=this._scheduler;if(e){e.setUpdatePayload(t),a.restoreData(e,t),a.performSeriesTasks(e),r.create(e,n),a.performDataProcessorTasks(e,t),yy(this,e),r.update(e,n),wy(e),a.performVisualTasks(e,t),Sy(this,e,n,t);var s=e.get("backgroundColor")||"transparent",l=e.get("darkMode");if(o.canvasSupported)i.setBackgroundColor(s),null!=l&&"auto"!==l&&i.setDarkMode(l);else{var u=Fe(s);s=Xe(u,"rgb"),0===u[3]&&(s="transparent")}Cy(e,n)}},updateTransform:function(t){var e=this,n=this._model,i=this._api;if(n){n.setUpdatePayload(t);var r=[];n.eachComponent((function(a,o){if("series"!==a){var s=e.getViewOfComponentModel(o);if(s&&s.__alive)if(s.updateTransform){var l=s.updateTransform(o,n,i,t);l&&l.update&&r.push(s)}else r.push(s)}}));var a=lt();n.eachSeries((function(r){var o=e._chartsMap[r.__viewId];if(o.updateTransform){var s=o.updateTransform(r,n,i,t);s&&s.update&&a.set(r.uid,1)}else a.set(r.uid,1)})),wy(n),this._scheduler.performVisualTasks(n,t,{setDirty:!0,dirtyMap:a}),Ty(this,n,i,t,a),Cy(n,this._api)}},updateView:function(t){var e=this._model;e&&(e.setUpdatePayload(t),nf.markUpdateMethod(t,"updateView"),wy(e),this._scheduler.performVisualTasks(e,t,{setDirty:!0}),Sy(this,this._model,this._api,t),Cy(e,this._api))},updateVisual:function(t){var e=this,n=this._model;n&&(n.setUpdatePayload(t),n.eachSeries((function(t){t.getData().clearAllVisual()})),nf.markUpdateMethod(t,"updateVisual"),wy(n),this._scheduler.performVisualTasks(n,t,{visualType:"visual",setDirty:!0}),n.eachComponent((function(i,r){if("series"!==i){var a=e.getViewOfComponentModel(r);a&&a.__alive&&a.updateVisual(r,n,e._api,t)}})),n.eachSeries((function(i){e._chartsMap[i.__viewId].updateVisual(i,n,e._api,t)})),Cy(n,this._api))},updateLayout:function(t){dy.update.call(this,t)}},gy=function(t,e,n,i){if(t._disposed)By(t.id);else{for(var r,a=t._model,o=t._coordSysMgr.getCoordinateSystems(),s=pr(a,n),l=0;l<o.length;l++){var u=o[l];if(u[e]&&null!=(r=u[e](a,s,i)))return r}0}},yy=function(t,e){var n=t._chartsMap,i=t._scheduler;e.eachSeries((function(t){i.updateStreamModes(t,n[t.__viewId])}))},vy=function(t,e){var n=this,i=this.getModel(),r=t.type,a=t.escapeConnect,o=zy[r],s=o.actionInfo,l=(s.update||"update").split(":"),u=l.pop(),h=null!=l[0]&&xr(l[0]);this.__flagInMainProcess=!0;var c=[t],p=!1;t.batch&&(p=!0,c=P(t.batch,(function(e){return(e=T(M({},e),t)).batch=null,e})));var f,d=[],g=zs(t),y=Fs(t);if(Jg(c,(function(e){if((f=(f=o.action(e,n._model,n._api))||M({},e)).type=s.event||f.type,d.push(f),y){var i=fr(t),r=i.queryOptionMap,a=i.mainTypeSpecified?r.keys()[0]:"series";fy(n,u,e,a),ky(n)}else g?(fy(n,u,e,"series"),ky(n)):h&&fy(n,u,e,h.main,h.sub)})),"none"===u||y||g||h||(this.__optionUpdated?(cy(this),dy.update.call(this,t),this.__optionUpdated=!1):dy[u].call(this,t)),f=p?{type:s.event||r,escapeConnect:a,batch:d}:d[0],this.__flagInMainProcess=!1,!e){var v=this._messageCenter;if(v.trigger(f.type,f),g){var m={type:"selectchanged",escapeConnect:a,selected:Ps(i),isFromClick:t.isFromClick||!1,fromAction:t.type,fromActionPayload:t};v.trigger(m.type,m)}}},my=function(t){for(var e=this._pendingActions;e.length;){var n=e.shift();vy.call(this,n,t)}},_y=function(t){!t&&this.trigger("updated")},xy=function(t,e){t.on("rendered",(function(n){e.trigger("rendered",n),!t.animation.isFinished()||e.__optionUpdated||e._scheduler.unfinished||e._pendingActions.length||e.trigger("finished")}))},by=function(t,e){t.on("mouseover",(function(t){var n=Cd(t.target,Bs);n&&(!function(t,e,n){var i=qo(t),r=ks(i.componentMainType,i.componentIndex,i.componentHighDownName,n),a=r.dispatchers,o=r.focusSelf;a?(o&&Is(i.componentMainType,i.componentIndex,n),L(a,(function(t){return _s(t,e)}))):(Ds(i.seriesIndex,i.focus,i.blurScope,n),"self"===i.focus&&Is(i.componentMainType,i.componentIndex,n),_s(t,e))}(n,t,e._api),ky(e))})).on("mouseout",(function(t){var n=Cd(t.target,Bs);n&&(!function(t,e,n){As(n);var i=qo(t),r=ks(i.componentMainType,i.componentIndex,i.componentHighDownName,n).dispatchers;r?L(r,(function(t){return xs(t,e)})):xs(t,e)}(n,t,e._api),ky(e))})).on("click",(function(t){var n=Cd(t.target,(function(t){return null!=qo(t).dataIndex}),!0);if(n){var i=n.selected?"unselect":"select",r=qo(n);e._api.dispatchAction({type:i,dataType:r.dataType,dataIndexInside:r.dataIndex,seriesIndex:r.seriesIndex,isFromClick:!0})}}))},wy=function(t){t.clearColorPalette(),t.eachSeries((function(t){t.clearColorPalette()}))},Sy=function(t,e,n,i){My(t,e,n,i),Jg(t._chartsViews,(function(t){t.__alive=!1})),Ty(t,e,n,i),Jg(t._chartsViews,(function(t){t.__alive||t.remove(e,n)}))},My=function(t,n,i,o,s){Jg(s||t._componentsViews,(function(t){var s=t.__model;r(s,t),t.render(s,n,i,o),e(s,t),a(s,t)}))},Ty=function(t,n,i,s,l){var u=t._scheduler,h=t._labelManager;h.clearLabels();var c=!1;n.eachSeries((function(e){var n=t._chartsMap[e.__viewId];n.__alive=!0;var i=n.renderTask;u.updatePayload(i,s),r(e,n),l&&l.get(e.uid)&&i.dirty(),i.perform(u.getPerformArgs(i))&&(c=!0),e.__transientTransitionOpt=null,n.group.silent=!!e.get("silent"),function(t,e){var n=t.get("blendMode")||null;0;e.group.traverse((function(t){t.isGroup||(t.style.blend=n),t.eachPendingDisplayable&&t.eachPendingDisplayable((function(t){t.style.blend=n}))}))}(e,n),Ls(e),h.addLabelsOfSeries(n)})),u.unfinished=c||u.unfinished,h.updateLayoutConfig(i),h.layout(i),h.processLabelsOverall(),n.eachSeries((function(n){var i=t._chartsMap[n.__viewId];e(n,i),a(n,i)})),function(t,e){var n=t._zr.storage,i=0;n.traverse((function(t){t.isGroup||i++})),i>e.get("hoverLayerThreshold")&&!o.node&&!o.worker&&e.eachSeries((function(e){if(!e.preventUsingHoverLayer){var n=t._chartsMap[e.__viewId];n.__alive&&n.group.traverse((function(t){t.states.emphasis&&(t.states.emphasis.hoverLayer=!0)}))}}))}(t,n)},Cy=function(t,e){Jg(Wy,(function(n){n(t,e)}))},ky=function(t){t.__needsUpdateStatus=!0,t.getZr().wakeUp()},Ly=function(e){e.__needsUpdateStatus&&(e.getZr().storage.traverse((function(e){fu(e)||t(e)})),e.__needsUpdateStatus=!1)},Ay=function(t){return new(function(e){function i(){return null!==e&&e.apply(this,arguments)||this}return n(i,e),i.prototype.getCoordinateSystems=function(){return t._coordSysMgr.getCoordinateSystems()},i.prototype.getComponentByElement=function(e){for(;e;){var n=e.__ecComponentInfo;if(null!=n)return t._model.getComponent(n.mainType,n.index);e=e.parent}},i.prototype.enterEmphasis=function(e,n){bs(e,n),ky(t)},i.prototype.leaveEmphasis=function(e,n){ws(e,n),ky(t)},i.prototype.enterBlur=function(e){!function(t){gs(t,hs)}(e),ky(t)},i.prototype.leaveBlur=function(e){Ss(e),ky(t)},i.prototype.enterSelect=function(e){Ms(e),ky(t)},i.prototype.leaveSelect=function(e){Ts(e),ky(t)},i.prototype.getModel=function(){return t.getModel()},i.prototype.getViewOfComponentModel=function(e){return t.getViewOfComponentModel(e)},i.prototype.getViewOfSeriesModel=function(e){return t.getViewOfSeriesModel(e)},i}(Mc))(t)},Dy=function(t){function e(t,e){for(var n=0;n<t.length;n++){t[n][sy]=e}}Jg(Fy,(function(n,i){t._messageCenter.on(i,(function(n){if(jy[t.group]&&0!==t[sy]){if(n&&n.escapeConnect)return;var i=t.makeActionFromEvent(n),r=[];Jg(qy,(function(e){e!==t&&e.group===t.group&&r.push(e)})),e(r,0),Jg(r,(function(t){1!==t[sy]&&t.dispatchAction(i)})),e(r,2)}}))}))},Iy=function(t,e){var n=t._model;L(Qi(e),(function(t){var e,i=t.from,r=t.to;null==r&&$i(e);var a={includeMainTypes:["series"],enableAll:!1,enableNone:!1},o=i?pr(n,i,a):null,s=pr(n,r,a).seriesModel;null==s&&(e=""),o&&o.seriesModel!==s&&(e=""),null!=e&&$i(e),s.__transientTransitionOpt={from:i?i.dimension:null,to:r.dimension,dividingMethod:t.dividingMethod}}))}}(),e}(Rt),Ny=Ry.prototype;Ny.on=ly("on"),Ny.off=ly("off"),Ny.one=function(t,e,n){var i=this;Ki(),this.on.call(this,t,(function n(){for(var r=[],a=0;a<arguments.length;a++)r[a]=arguments[a];e&&e.apply&&e.apply(this,r),i.off(t,n)}),n)};var Ey=["click","dblclick","mouseover","mouseout","mousemove","mousedown","mouseup","globalout","contextmenu"];function By(t){0}var zy={},Fy={},Vy=[],Hy=[],Gy=[],Wy=[],Uy=[],Yy={},Xy={},qy={},jy={},Zy=+new Date-0,Ky=+new Date-0,$y="_echarts_instance_";function Jy(t){jy[t]=!1}var Qy=Jy;function tv(t){return qy[function(t,e){return t.getAttribute?t.getAttribute(e):t[e]}(t,$y)]}function ev(t,e){Yy[t]=e}function nv(t){ey(Hy,t)<0&&Hy.push(t)}function iv(t,e){cv(Vy,t,e,2e3)}function rv(t){ey(Gy,t)<0&&t&&Gy.push(t)}function av(t){ey(Wy,t)<0&&t&&Wy.push(t)}function ov(t,e,n){"function"==typeof e&&(n=e,e="");var i=ty(t)?t.type:[t,t={event:e}][0];t.event=(t.event||i).toLowerCase(),e=t.event,Fy[e]||($g(oy.test(i)&&oy.test(e)),zy[i]||(zy[i]={action:n,actionInfo:t}),Fy[e]=i)}function sv(t,e){Cc.register(t,e)}function lv(t,e){cv(Uy,t,e,1e3,"layout")}function uv(t,e){cv(Uy,t,e,3e3,"visual")}var hv=[];function cv(t,e,n,i,r){if((Qg(e)||ty(e))&&(n=e,e=i),!(ey(hv,n)>=0)){hv.push(n);var a=xf.wrapStageHandler(n,r);a.__prio=e,a.__raw=n,t.push(a)}}function pv(t,e){Xy[t]=e}function fv(t,e,n){Zg(t,e,n)}var dv=function(t){var e=(t=w(t)).type,n="";e||$i(n);var i=e.split(":");2!==i.length&&$i(n);var r=!1;"echarts"===i[0]&&(e=i[1],r=!0),t.__isBuiltIn=r,Op.set(e,t)};uv(iy,gf),uv(ry,vf),uv(ry,mf),uv(iy,Wf),uv(ry,{createOnAllSeries:!0,performRawSeries:!0,reset:function(t,e){if(t.hasSymbolVisual&&!e.isSeriesFiltered(t))return{dataEach:t.getData().hasItemOption?function(t,e){var n=t.getItemModel(e),i=n.getShallow("symbol",!0),r=n.getShallow("symbolSize",!0),a=n.getShallow("symbolRotate",!0),o=n.getShallow("symbolOffset",!0),s=n.getShallow("symbolKeepAspect",!0);null!=i&&t.setItemVisual(e,"symbol",i),null!=r&&t.setItemVisual(e,"symbolSize",r),null!=a&&t.setItemVisual(e,"symbolRotate",a),null!=o&&t.setItemVisual(e,"symbolOffset",o),null!=s&&t.setItemVisual(e,"symbolKeepAspect",s)}:null}}}),uv(7e3,(function(t,e){t.eachRawSeries((function(n){if(!t.isSeriesFiltered(n)){var i=n.getData();i.hasItemVisual()&&i.each((function(t){var n=i.getItemVisual(t,"decal");n&&(i.ensureUniqueItemVisual(t,"style").decal=ag(n,e))}));var r=i.getVisual("decal");if(r)i.getVisual("style").decal=ag(r,e)}}))})),nv(Zc),iv(900,(function(t){var e=lt();t.eachSeries((function(t){var n=t.get("stack");if(n){var i=e.get(n)||e.set(n,[]),r=t.getData(),a={stackResultDimension:r.getCalculationInfo("stackResultDimension"),stackedOverDimension:r.getCalculationInfo("stackedOverDimension"),stackedDimension:r.getCalculationInfo("stackedDimension"),stackedByDimension:r.getCalculationInfo("stackedByDimension"),isStackedByIndex:r.getCalculationInfo("isStackedByIndex"),data:r,seriesModel:t};if(!a.stackedDimension||!a.isStackedByIndex&&!a.stackedByDimension)return;i.length&&r.setCalculationInfo("stackedOnSeries",i[i.length-1].seriesModel),i.push(a)}})),e.each(Kc)})),pv("default",(function(t,e){T(e=e||{},{text:"loading",textColor:"#000",fontSize:12,fontWeight:"normal",fontStyle:"normal",fontFamily:"sans-serif",maskColor:"rgba(255, 255, 255, 0.8)",showSpinner:!0,color:"#5470c6",spinnerRadius:10,lineWidth:5,zlevel:0});var n=new Mi,i=new Eo({style:{fill:e.maskColor},zlevel:e.zlevel,z:1e4});n.add(i);var r,a=new Fo({style:{text:e.text,fill:e.textColor,fontSize:e.fontSize,fontWeight:e.fontWeight,fontStyle:e.fontStyle,fontFamily:e.fontFamily},zlevel:e.zlevel,z:10001}),o=new Eo({style:{fill:"none"},textContent:a,textConfig:{position:"right",distance:10},zlevel:e.zlevel,z:10001});return n.add(o),e.showSpinner&&((r=new Fl({shape:{startAngle:-_f/2,endAngle:-_f/2+.1,r:e.spinnerRadius},style:{stroke:e.color,lineCap:"round",lineWidth:e.lineWidth},zlevel:e.zlevel,z:10001})).animateShape(!0).when(1e3,{endAngle:3*_f/2}).start("circularInOut"),r.animateShape(!0).when(1e3,{startAngle:3*_f/2}).delay(300).start("circularInOut"),n.add(r)),n.resize=function(){var n=a.getBoundingRect().width,s=e.showSpinner?e.spinnerRadius:0,l=(t.getWidth()-2*s-(e.showSpinner&&n?10:0)-n)/2-(e.showSpinner&&n?0:5+n/2)+(e.showSpinner?0:n/2)+(n?0:s),u=t.getHeight()/2;e.showSpinner&&r.setShape({cx:l,cy:u}),o.setShape({x:l-s,y:u-s,width:2*s,height:2*s}),i.setShape({x:0,y:0,width:t.getWidth(),height:t.getHeight()})},n.resize(),n})),ov({type:Qo,event:Qo,update:Qo},ct),ov({type:ts,event:ts,update:ts},ct),ov({type:es,event:es,update:es},ct),ov({type:ns,event:ns,update:ns},ct),ov({type:is,event:is,update:is},ct),ev("light",Ef),ev("dark",Hf);var gv=[],yv={registerPreprocessor:nv,registerProcessor:iv,registerPostInit:rv,registerPostUpdate:av,registerAction:ov,registerCoordinateSystem:sv,registerLayout:lv,registerVisual:uv,registerTransform:dv,registerLoading:pv,registerMap:fv,PRIORITY:ay,ComponentModel:Gh,ComponentView:Jp,SeriesModel:Up,ChartView:nf,registerComponentModel:function(t){Gh.registerClass(t)},registerComponentView:function(t){Jp.registerClass(t)},registerSeriesModel:function(t){Up.registerClass(t)},registerChartView:function(t){nf.registerClass(t)},registerSubTypeDefaulter:function(t,e){Gh.registerSubTypeDefaulter(t,e)},registerPainter:function(t,e){ki(t,e)}};function vv(t){z(t)?L(t,(function(t){vv(t)})):A(gv,t)>=0||(gv.push(t),F(t)&&(t={install:t}),t.install(yv))}function mv(t){return null==t?0:t.length||1}function _v(t){return t}var xv=function(){function t(t,e,n,i,r,a){this._old=t,this._new=e,this._oldKeyGetter=n||_v,this._newKeyGetter=i||_v,this.context=r,this._diffModeMultiple="multiple"===a}return t.prototype.add=function(t){return this._add=t,this},t.prototype.update=function(t){return this._update=t,this},t.prototype.updateManyToOne=function(t){return this._updateManyToOne=t,this},t.prototype.updateOneToMany=function(t){return this._updateOneToMany=t,this},t.prototype.remove=function(t){return this._remove=t,this},t.prototype.execute=function(){this[this._diffModeMultiple?"_executeMultiple":"_executeOneToOne"]()},t.prototype._executeOneToOne=function(){var t=this._old,e=this._new,n={},i=new Array(t.length),r=new Array(e.length);this._initIndexMap(t,null,i,"_oldKeyGetter"),this._initIndexMap(e,n,r,"_newKeyGetter");for(var a=0;a<t.length;a++){var o=i[a],s=n[o],l=mv(s);if(l>1){var u=s.shift();1===s.length&&(n[o]=s[0]),this._update&&this._update(u,a)}else 1===l?(n[o]=null,this._update&&this._update(s,a)):this._remove&&this._remove(a)}this._performRestAdd(r,n)},t.prototype._executeMultiple=function(){var t=this._old,e=this._new,n={},i={},r=[],a=[];this._initIndexMap(t,n,r,"_oldKeyGetter"),this._initIndexMap(e,i,a,"_newKeyGetter");for(var o=0;o<r.length;o++){var s=r[o],l=n[s],u=i[s],h=mv(l),c=mv(u);if(h>1&&1===c)this._updateManyToOne&&this._updateManyToOne(u,l),i[s]=null;else if(1===h&&c>1)this._updateOneToMany&&this._updateOneToMany(u,l),i[s]=null;else if(1===h&&1===c)this._update&&this._update(u,l),i[s]=null;else if(h>1)for(var p=0;p<h;p++)this._remove&&this._remove(l[p]);else this._remove&&this._remove(l)}this._performRestAdd(a,i)},t.prototype._performRestAdd=function(t,e){for(var n=0;n<t.length;n++){var i=t[n],r=e[i],a=mv(r);if(a>1)for(var o=0;o<a;o++)this._add&&this._add(r[o]);else 1===a&&this._add&&this._add(r);e[i]=null}},t.prototype._initIndexMap=function(t,e,n,i){for(var r=this._diffModeMultiple,a=0;a<t.length;a++){var o="_ec_"+this[i](t[a],a);if(r||(n[a]=o),e){var s=e[o],l=mv(s);0===l?(e[o]=a,r&&n.push(o)):1===l?e[o]=[s,a]:s.push(a)}}},t}();function bv(t,e){return t.hasOwnProperty(e)||(t[e]=[]),t[e]}var wv,Sv,Mv,Tv,Cv,Av,Dv,Iv,kv,Lv,Pv,Ov,Rv,Nv,Ev=function(t){this.otherDims={},null!=t&&M(this,t)},Bv=Math.floor,zv=W,Fv=P,Vv="undefined",Hv={float:typeof Float64Array===Vv?Array:Float64Array,int:typeof Int32Array===Vv?Array:Int32Array,ordinal:Array,number:Array,time:Array},Gv=typeof Uint32Array===Vv?Array:Uint32Array,Wv=typeof Int32Array===Vv?Array:Int32Array,Uv=typeof Uint16Array===Vv?Array:Uint16Array,Yv=["hasItemOption","_nameList","_idList","_invertedIndicesMap","_rawData","_dimValueGetter","_count","_rawCount","_nameDimIdx","_idDimIdx","_nameRepeatCount"],Xv=["_extent","_approximateExtent","_rawExtent"],qv=function(){function t(t,e){this.type="list",this._count=0,this._rawCount=0,this._storage={},this._storageArr=[],this._nameList=[],this._idList=[],this._visual={},this._layout={},this._itemVisuals=[],this._itemLayouts=[],this._graphicEls=[],this._rawExtent={},this._extent={},this._approximateExtent={},this._calculationInfo={},this.hasItemOption=!0,this.TRANSFERABLE_METHODS=["cloneShallow","downSample","lttbDownSample","map"],this.CHANGABLE_METHODS=["filterSelf","selectRange"],this.DOWNSAMPLE_METHODS=["downSample","lttbDownSample"],this.getRawIndex=Cv,t=t||["x","y"];for(var n={},i=[],r={},a=0;a<t.length;a++){var o=t[a],s=V(o)?new Ev({name:o}):o instanceof Ev?o:new Ev(o),l=s.name;s.type=s.type||"float",s.coordDim||(s.coordDim=l,s.coordDimIndex=0);var u=s.otherDims=s.otherDims||{};i.push(l),n[l]=s,s.index=a,s.createInvertedIndices&&(r[l]=[]),0===u.itemName&&(this._nameDimIdx=a,this._nameOrdinalMeta=s.ordinalMeta),0===u.itemId&&(this._idDimIdx=a,this._idOrdinalMeta=s.ordinalMeta)}this.dimensions=i,this._dimensionInfos=n,this.hostModel=e,this._dimensionsSummary=function(t){var e={},n=e.encode={},i=lt(),r=[],a=[],o=e.userOutput={dimensionNames:t.dimensions.slice(),encode:{}};L(t.dimensions,(function(e){var s,l=t.getDimensionInfo(e),u=l.coordDim;if(u){var h=l.coordDimIndex;bv(n,u)[h]=e,l.isExtraCoord||(i.set(u,1),"ordinal"!==(s=l.type)&&"time"!==s&&(r[0]=e),bv(o.encode,u)[h]=l.index),l.defaultTooltip&&a.push(e)}Xh.each((function(t,e){var i=bv(n,e),r=l.otherDims[e];null!=r&&!1!==r&&(i[r]=l.name)}))}));var s=[],l={};i.each((function(t,e){var i=n[e];l[e]=i[0],s=s.concat(i)})),e.dataDimsOnCoord=s,e.encodeFirstDimNotExtra=l;var u=n.label;u&&u.length&&(r=u.slice());var h=n.tooltip;return h&&h.length?a=h.slice():a.length||(a=r.slice()),n.defaultedLabel=r,n.defaultedTooltip=a,e}(this),this._invertedIndicesMap=r,this.userOutput=this._dimensionsSummary.userOutput}return t.prototype.getDimension=function(t){return"number"!=typeof t&&(isNaN(t)||this._dimensionInfos.hasOwnProperty(t))||(t=this.dimensions[t]),t},t.prototype.getDimensionInfo=function(t){return this._dimensionInfos[this.getDimension(t)]},t.prototype.getDimensionsOnCoord=function(){return this._dimensionsSummary.dataDimsOnCoord.slice()},t.prototype.mapDimension=function(t,e){var n=this._dimensionsSummary;if(null==e)return n.encodeFirstDimNotExtra[t];var i=n.encode[t];return i?i[e]:null},t.prototype.mapDimensionsAll=function(t){return(this._dimensionsSummary.encode[t]||[]).slice()},t.prototype.initData=function(t,e,n){var i=ip(t)||k(t),r=i?new hp(t,this.dimensions.length):t;this._rawData=r;var a=r.getSource().sourceFormat;this._storage={},this._indices=null,this._dontMakeIdFromName=null!=this._idDimIdx||a===$h||!!r.fillStorage,this._nameList=(e||[]).slice(),this._idList=[],this._nameRepeatCount={},n||(this.hasItemOption=!1),this.defaultDimValueGetter=wv[a],this._dimValueGetter=n=n||this.defaultDimValueGetter,this._dimValueGetterArrayRows=wv.arrayRows,this._rawExtent={},this._initDataFromProvider(0,r.count()),r.pure&&(this.hasItemOption=!1)},t.prototype.getProvider=function(){return this._rawData},t.prototype.appendData=function(t){var e=this._rawData,n=this.count();e.appendData(t);var i=e.count();e.persistent||(i+=n),this._initDataFromProvider(n,i,!0)},t.prototype.appendValues=function(t,e){for(var n=this._storage,i=this.dimensions,r=i.length,a=this._rawExtent,o=this.count(),s=o+Math.max(t.length,e?e.length:0),l=0;l<r;l++){var u=i[l];a[u]||(a[u]=Ov()),Tv(n,this._dimensionInfos[u],s,!0)}for(var h=Fv(i,(function(t){return a[t]})),c=this._storageArr=Fv(i,(function(t){return n[t]})),p=[],f=o;f<s;f++){for(var d=f-o,g=0;g<r;g++){u=i[g];var y=this._dimValueGetterArrayRows(t[d]||p,u,d,g);c[g][f]=y;var v=h[g];y<v[0]&&(v[0]=y),y>v[1]&&(v[1]=y)}e&&(this._nameList[f]=e[d],this._dontMakeIdFromName||kv(this,f))}this._rawCount=this._count=s,this._extent={},Sv(this)},t.prototype._initDataFromProvider=function(t,e,n){if(!(t>=e)){for(var i=this._rawData,r=this._storage,a=this.dimensions,o=a.length,s=this._dimensionInfos,l=this._nameList,u=this._idList,h=this._rawExtent,c=i.getSource().sourceFormat===qh,p=0;p<o;p++){var f=a[p];h[f]||(h[f]=Ov()),Tv(r,s[f],e,n)}var d=this._storageArr=Fv(a,(function(t){return r[t]})),g=Fv(a,(function(t){return h[t]}));if(i.fillStorage)i.fillStorage(t,e,d,g);else for(var y=[],v=t;v<e;v++){y=i.getItem(v,y);for(var m=0;m<o;m++){f=a[m];var _=d[m],x=this._dimValueGetter(y,f,v,m);_[v]=x;var b=g[m];x<b[0]&&(b[0]=x),x>b[1]&&(b[1]=x)}if(c&&!i.pure&&y){var w=y.name;null==l[v]&&null!=w&&(l[v]=or(w,null));var S=y.id;null==u[v]&&null!=S&&(u[v]=or(S,null))}this._dontMakeIdFromName||kv(this,v)}!i.persistent&&i.clean&&i.clean(),this._rawCount=this._count=e,this._extent={},Sv(this)}},t.prototype.count=function(){return this._count},t.prototype.getIndices=function(){var t,e=this._indices;if(e){var n=e.constructor,i=this._count;if(n===Array){t=new n(i);for(var r=0;r<i;r++)t[r]=e[r]}else t=new n(e.buffer,0,i)}else{t=new(n=Mv(this))(this.count());for(r=0;r<t.length;r++)t[r]=r}return t},t.prototype.getByDimIdx=function(t,e){if(!(e>=0&&e<this._count))return NaN;var n=this._storageArr[t];return n?n[this.getRawIndex(e)]:NaN},t.prototype.get=function(t,e){if(!(e>=0&&e<this._count))return NaN;var n=this._storage[t];return n?n[this.getRawIndex(e)]:NaN},t.prototype.getByRawIndex=function(t,e){if(!(e>=0&&e<this._rawCount))return NaN;var n=this._storage[t];return n?n[e]:NaN},t.prototype.getValues=function(t,e){var n=[];z(t)||(e=t,t=this.dimensions);for(var i=0,r=t.length;i<r;i++)n.push(this.get(t[i],e));return n},t.prototype.hasValue=function(t){for(var e=this._dimensionsSummary.dataDimsOnCoord,n=0,i=e.length;n<i;n++)if(isNaN(this.get(e[n],t)))return!1;return!0},t.prototype.getDataExtent=function(t){t=this.getDimension(t);var e=this._storage[t],n=Ov();if(!e)return n;var i,r=this.count();if(!this._indices)return this._rawExtent[t].slice();if(i=this._extent[t])return i.slice();for(var a=(i=n)[0],o=i[1],s=0;s<r;s++){var l=e[this.getRawIndex(s)];l<a&&(a=l),l>o&&(o=l)}return i=[a,o],this._extent[t]=i,i},t.prototype.getApproximateExtent=function(t){return t=this.getDimension(t),this._approximateExtent[t]||this.getDataExtent(t)},t.prototype.setApproximateExtent=function(t,e){e=this.getDimension(e),this._approximateExtent[e]=t.slice()},t.prototype.getCalculationInfo=function(t){return this._calculationInfo[t]},t.prototype.setCalculationInfo=function(t,e){zv(t)?M(this._calculationInfo,t):this._calculationInfo[t]=e},t.prototype.getSum=function(t){var e=0;if(this._storage[t])for(var n=0,i=this.count();n<i;n++){var r=this.get(t,n);isNaN(r)||(e+=r)}return e},t.prototype.getMedian=function(t){var e=[];this.each(t,(function(t){isNaN(t)||e.push(t)}));var n=e.sort((function(t,e){return t-e})),i=this.count();return 0===i?0:i%2==1?n[(i-1)/2]:(n[i/2]+n[i/2-1])/2},t.prototype.rawIndexOf=function(t,e){var n=t&&this._invertedIndicesMap[t];var i=n[e];return null==i||isNaN(i)?-1:i},t.prototype.indexOfName=function(t){for(var e=0,n=this.count();e<n;e++)if(this.getName(e)===t)return e;return-1},t.prototype.indexOfRawIndex=function(t){if(t>=this._rawCount||t<0)return-1;if(!this._indices)return t;var e=this._indices,n=e[t];if(null!=n&&n<this._count&&n===t)return t;for(var i=0,r=this._count-1;i<=r;){var a=(i+r)/2|0;if(e[a]<t)i=a+1;else{if(!(e[a]>t))return a;r=a-1}}return-1},t.prototype.indicesOfNearest=function(t,e,n){var i=this._storage[t],r=[];if(!i)return r;null==n&&(n=1/0);for(var a=1/0,o=-1,s=0,l=0,u=this.count();l<u;l++){var h=e-i[this.getRawIndex(l)],c=Math.abs(h);c<=n&&((c<a||c===a&&h>=0&&o<0)&&(a=c,o=h,s=0),h===o&&(r[s++]=l))}return r.length=s,r},t.prototype.getRawDataItem=function(t){if(this._rawData.persistent)return this._rawData.getItem(this.getRawIndex(t));for(var e=[],n=0;n<this.dimensions.length;n++){var i=this.dimensions[n];e.push(this.get(i,t))}return e},t.prototype.getName=function(t){var e=this.getRawIndex(t),n=this._nameList[e];return null==n&&null!=this._nameDimIdx&&(n=Iv(this,this._nameDimIdx,this._nameOrdinalMeta,e)),null==n&&(n=""),n},t.prototype.getId=function(t){return Dv(this,this.getRawIndex(t))},t.prototype.each=function(t,e,n,i){var r=this;if(this._count){"function"==typeof t&&(i=n,n=e,e=t,t=[]);var a=n||i||this,o=Fv(Lv(t),this.getDimension,this);0;for(var s=o.length,l=Fv(o,(function(t){return r._dimensionInfos[t].index})),u=this._storageArr,h=0,c=this.count();h<c;h++){var p=this.getRawIndex(h);switch(s){case 0:e.call(a,h);break;case 1:e.call(a,u[l[0]][p],h);break;case 2:e.call(a,u[l[0]][p],u[l[1]][p],h);break;default:for(var f=0,d=[];f<s;f++)d[f]=u[l[f]][p];d[f]=h,e.apply(a,d)}}}},t.prototype.filterSelf=function(t,e,n,i){var r=this;if(this._count){"function"==typeof t&&(i=n,n=e,e=t,t=[]);var a=n||i||this,o=Fv(Lv(t),this.getDimension,this);0;for(var s=this.count(),l=new(Mv(this))(s),u=[],h=o.length,c=0,p=Fv(o,(function(t){return r._dimensionInfos[t].index})),f=p[0],d=this._storageArr,g=0;g<s;g++){var y=void 0,v=this.getRawIndex(g);if(0===h)y=e.call(a,g);else if(1===h){var m=d[f][v];y=e.call(a,m,g)}else{for(var _=0;_<h;_++)u[_]=d[p[_]][v];u[_]=g,y=e.apply(a,u)}y&&(l[c++]=v)}return c<s&&(this._indices=l),this._count=c,this._extent={},this.getRawIndex=this._indices?Av:Cv,this}},t.prototype.selectRange=function(t){var e=this,n=this._count;if(n){var i=[];for(var r in t)t.hasOwnProperty(r)&&i.push(r);0;var a=i.length;if(a){var o=this.count(),s=new(Mv(this))(o),l=0,u=i[0],h=Fv(i,(function(t){return e._dimensionInfos[t].index})),c=t[u][0],p=t[u][1],f=this._storageArr,d=!1;if(!this._indices){var g=0;if(1===a){for(var y=f[h[0]],v=0;v<n;v++){((b=y[v])>=c&&b<=p||isNaN(b))&&(s[l++]=g),g++}d=!0}else if(2===a){y=f[h[0]];var m=f[h[1]],_=t[i[1]][0],x=t[i[1]][1];for(v=0;v<n;v++){var b=y[v],w=m[v];(b>=c&&b<=p||isNaN(b))&&(w>=_&&w<=x||isNaN(w))&&(s[l++]=g),g++}d=!0}}if(!d)if(1===a)for(v=0;v<o;v++){var S=this.getRawIndex(v);((b=f[h[0]][S])>=c&&b<=p||isNaN(b))&&(s[l++]=S)}else for(v=0;v<o;v++){for(var M=!0,T=(S=this.getRawIndex(v),0);T<a;T++){var C=i[T];((b=f[h[T]][S])<t[C][0]||b>t[C][1])&&(M=!1)}M&&(s[l++]=this.getRawIndex(v))}return l<o&&(this._indices=s),this._count=l,this._extent={},this.getRawIndex=this._indices?Av:Cv,this}}},t.prototype.mapArray=function(t,e,n,i){"function"==typeof t&&(i=n,n=e,e=t,t=[]),n=n||i||this;var r=[];return this.each(t,(function(){r.push(e&&e.apply(this,arguments))}),n),r},t.prototype.map=function(t,e,n,i){var r=n||i||this,a=Fv(Lv(t),this.getDimension,this);var o=Pv(this,a),s=o._storage;o._indices=this._indices,o.getRawIndex=o._indices?Av:Cv;for(var l=[],u=a.length,h=this.count(),c=[],p=o._rawExtent,f=0;f<h;f++){for(var d=0;d<u;d++)c[d]=this.get(a[d],f);c[u]=f;var g=e&&e.apply(r,c);if(null!=g){"object"!=typeof g&&(l[0]=g,g=l);for(var y=this.getRawIndex(f),v=0;v<g.length;v++){var m=a[v],_=g[v],x=p[m],b=s[m];b&&(b[y]=_),_<x[0]&&(x[0]=_),_>x[1]&&(x[1]=_)}}}return o},t.prototype.downSample=function(t,e,n,i){for(var r=Pv(this,[t]),a=r._storage,o=[],s=Bv(1/e),l=a[t],u=this.count(),h=r._rawExtent[t],c=new(Mv(this))(u),p=0,f=0;f<u;f+=s){s>u-f&&(s=u-f,o.length=s);for(var d=0;d<s;d++){var g=this.getRawIndex(f+d);o[d]=l[g]}var y=n(o),v=this.getRawIndex(Math.min(f+i(o,y)||0,u-1));l[v]=y,y<h[0]&&(h[0]=y),y>h[1]&&(h[1]=y),c[p++]=v}return r._count=p,r._indices=c,r.getRawIndex=Av,r},t.prototype.lttbDownSample=function(t,e){var n,i,r,a=Pv(this,[]),o=a._storage[t],s=this.count(),l=new(Mv(this))(s),u=0,h=Bv(1/e),c=this.getRawIndex(0);l[u++]=c;for(var p=1;p<s-1;p+=h){for(var f=Math.min(p+h,s-1),d=Math.min(p+2*h,s),g=(d+f)/2,y=0,v=f;v<d;v++){var m=o[S=this.getRawIndex(v)];isNaN(m)||(y+=m)}y/=d-f;var _=p,x=Math.min(p+h,s),b=p-1,w=o[c];n=-1,r=_;for(v=_;v<x;v++){var S;m=o[S=this.getRawIndex(v)];isNaN(m)||(i=Math.abs((b-g)*(m-w)-(b-v)*(y-w)))>n&&(n=i,r=S)}l[u++]=r,c=r}return l[u++]=this.getRawIndex(s-1),a._count=u,a._indices=l,a.getRawIndex=Av,a},t.prototype.getItemModel=function(t){var e=this.hostModel,n=this.getRawDataItem(t);return new zu(n,e,e&&e.ecModel)},t.prototype.diff=function(t){var e=this;return new xv(t?t.getIndices():[],this.getIndices(),(function(e){return Dv(t,e)}),(function(t){return Dv(e,t)}))},t.prototype.getVisual=function(t){var e=this._visual;return e&&e[t]},t.prototype.setVisual=function(t,e){this._visual=this._visual||{},zv(t)?M(this._visual,t):this._visual[t]=e},t.prototype.getItemVisual=function(t,e){var n=this._itemVisuals[t],i=n&&n[e];return null==i?this.getVisual(e):i},t.prototype.hasItemVisual=function(){return this._itemVisuals.length>0},t.prototype.ensureUniqueItemVisual=function(t,e){var n=this._itemVisuals,i=n[t];i||(i=n[t]={});var r=i[e];return null==r&&(z(r=this.getVisual(e))?r=r.slice():zv(r)&&(r=M({},r)),i[e]=r),r},t.prototype.setItemVisual=function(t,e,n){var i=this._itemVisuals[t]||{};this._itemVisuals[t]=i,zv(e)?M(i,e):i[e]=n},t.prototype.clearAllVisual=function(){this._visual={},this._itemVisuals=[]},t.prototype.setLayout=function(t,e){if(zv(t))for(var n in t)t.hasOwnProperty(n)&&this.setLayout(n,t[n]);else this._layout[t]=e},t.prototype.getLayout=function(t){return this._layout[t]},t.prototype.getItemLayout=function(t){return this._itemLayouts[t]},t.prototype.setItemLayout=function(t,e,n){this._itemLayouts[t]=n?M(this._itemLayouts[t]||{},e):e},t.prototype.clearItemLayouts=function(){this._itemLayouts.length=0},t.prototype.setItemGraphicEl=function(t,e){var n=this.hostModel;if(e){var i=qo(e);i.dataIndex=t,i.dataType=this.dataType,i.seriesIndex=n&&n.seriesIndex,"group"===e.type&&e.traverse(Rv,e)}this._graphicEls[t]=e},t.prototype.getItemGraphicEl=function(t){return this._graphicEls[t]},t.prototype.eachItemGraphicEl=function(t,e){L(this._graphicEls,(function(n,i){n&&t&&t.call(e,n,i)}))},t.prototype.cloneShallow=function(e){e||(e=new t(Fv(this.dimensions,this.getDimensionInfo,this),this.hostModel));if(e._storage=this._storage,e._storageArr=this._storageArr,Nv(e,this),this._indices){var n=this._indices.constructor;if(n===Array){var i=this._indices.length;e._indices=new n(i);for(var r=0;r<i;r++)e._indices[r]=this._indices[r]}else e._indices=new n(this._indices)}else e._indices=null;return e.getRawIndex=e._indices?Av:Cv,e},t.prototype.wrapMethod=function(t,e){var n=this[t];"function"==typeof n&&(this.__wrappedMethods=this.__wrappedMethods||[],this.__wrappedMethods.push(t),this[t]=function(){var t=n.apply(this,arguments);return e.apply(this,[t].concat(tt(arguments)))})},t.internalField=function(){function e(t,e,n,i){return Ap(t[i],this._dimensionInfos[e])}wv={arrayRows:e,objectRows:function(t,e,n,i){return Ap(t[e],this._dimensionInfos[e])},keyedColumns:e,original:function(t,e,n,i){var r=t&&(null==t.value?t:t.value);return!this._rawData.pure&&function(t){return W(t)&&!(t instanceof Array)}(t)&&(this.hasItemOption=!0),Ap(r instanceof Array?r[i]:r,this._dimensionInfos[e])},typedArray:function(t,e,n,i){return t[i]}},Sv=function(t){var e=t._invertedIndicesMap;L(e,(function(n,i){var r=t._dimensionInfos[i].ordinalMeta;if(r){n=e[i]=new Wv(r.categories.length);for(var a=0;a<n.length;a++)n[a]=-1;for(a=0;a<t._count;a++)n[t.get(i,a)]=a}}))},Iv=function(t,e,n,i){var r,a=t._storageArr[e];return a&&(r=a[i],n&&n.categories.length&&(r=n.categories[r])),or(r,null)},Mv=function(t){return t._rawCount>65535?Gv:Uv},Tv=function(t,e,n,i){var r=Hv[e.type],a=e.name;if(i){var o=t[a],s=o&&o.length;if(s!==n){for(var l=new r(n),u=0;u<s;u++)l[u]=o[u];t[a]=l}}else t[a]=new r(n)},Cv=function(t){return t},Av=function(t){return t<this._count&&t>=0?this._indices[t]:-1},Dv=function(t,e){var n=t._idList[e];return null==n&&null!=t._idDimIdx&&(n=Iv(t,t._idDimIdx,t._idOrdinalMeta,e)),null==n&&(n="e\0\0"+e),n},Lv=function(t){return z(t)||(t=null!=t?[t]:[]),t},function(t,e){for(var n=0;n<e.length;n++)t._dimensionInfos[e[n]]||console.error("Unkown dimension "+e[n])},Pv=function(e,n){var i=e.dimensions,r=new t(Fv(i,e.getDimensionInfo,e),e.hostModel);Nv(r,e);for(var a,o,s=r._storage={},l=e._storage,u=r._storageArr=[],h=0;h<i.length;h++){var c=i[h];l[c]&&(A(n,c)>=0?(s[c]=(a=l[c],o=void 0,(o=a.constructor)===Array?a.slice():new o(a)),r._rawExtent[c]=Ov(),r._extent[c]=null):s[c]=l[c],u.push(s[c]))}return r},Ov=function(){return[1/0,-1/0]},Rv=function(t){var e=qo(t),n=qo(this);e.seriesIndex=n.seriesIndex,e.dataIndex=n.dataIndex,e.dataType=n.dataType},Nv=function(t,e){L(Yv.concat(e.__wrappedMethods||[]),(function(n){e.hasOwnProperty(n)&&(t[n]=e[n])})),t.__wrappedMethods=e.__wrappedMethods,L(Xv,(function(n){t[n]=w(e[n])})),t._calculationInfo=M({},e._calculationInfo)},kv=function(t,e){var n=t._nameList,i=t._idList,r=t._nameDimIdx,a=t._idDimIdx,o=n[e],s=i[e];if(null==o&&null!=r&&(n[e]=o=Iv(t,r,t._nameOrdinalMeta,e)),null==s&&null!=a&&(i[e]=s=Iv(t,a,t._idOrdinalMeta,e)),null==s&&null!=o){var l=t._nameRepeatCount,u=l[o]=(l[o]||0)+1;s=o,u>1&&(s+="__ec__"+u),i[e]=s}}}(),t}();function jv(t,e,n){ip(e)||(e=ap(e)),n=n||{},t=(t||[]).slice();for(var i=(n.dimsDef||[]).slice(),r=lt(),a=lt(),o=[],s=function(t,e,n,i){var r=Math.max(t.dimensionsDetectedCount||1,e.length,n.length,i||0);return L(e,(function(t){var e;W(t)&&(e=t.dimsDef)&&(r=Math.max(r,e.length))})),r}(e,t,i,n.dimCount),l=0;l<s;l++){var u=i[l],h=i[l]=M({},W(u)?u:{name:u}),c=h.name,p=o[l]=new Ev;null!=c&&null==r.get(c)&&(p.name=p.displayName=c,r.set(c,l)),null!=h.type&&(p.type=h.type),null!=h.displayName&&(p.displayName=h.displayName)}var f=n.encodeDef;!f&&n.encodeDefaulter&&(f=n.encodeDefaulter(e,s));var d=lt(f);d.each((function(t,e){var n=Qi(t).slice();if(1===n.length&&!V(n[0])&&n[0]<0)d.set(e,!1);else{var i=d.set(e,[]);L(n,(function(t,n){var a=V(t)?r.get(t):t;null!=a&&a<s&&(i[n]=a,y(o[a],e,n))}))}}));var g=0;function y(t,e,n){null!=Xh.get(e)?t.otherDims[e]=n:(t.coordDim=e,t.coordDimIndex=n,a.set(e,!0))}L(t,(function(t){var e,n,i,r;if(V(t))e=t,r={};else{e=(r=t).name;var a=r.ordinalMeta;r.ordinalMeta=null,(r=w(r)).ordinalMeta=a,n=r.dimsDef,i=r.otherDims,r.name=r.coordDim=r.coordDimIndex=r.dimsDef=r.otherDims=null}var s=d.get(e);if(!1!==s){if(!(s=Qi(s)).length)for(var l=0;l<(n&&n.length||1);l++){for(;g<o.length&&null!=o[g].coordDim;)g++;g<o.length&&s.push(g++)}L(s,(function(t,a){var s=o[t];if(y(T(s,r),e,a),null==s.name&&n){var l=n[a];!W(l)&&(l={name:l}),s.name=s.displayName=l.name,s.defaultTooltip=l.defaultTooltip}i&&T(s.otherDims,i)}))}}));var v=n.generateCoord,m=n.generateCoordCount,_=null!=m;m=v?m||1:0;for(var x=v||"value",b=0;b<s;b++){null==(p=o[b]=o[b]||new Ev).coordDim&&(p.coordDim=Zv(x,a,_),p.coordDimIndex=0,(!v||m<=0)&&(p.isExtraCoord=!0),m--),null==p.name&&(p.name=Zv(p.coordDim,r,!1)),null!=p.type||lc(e,b)!==ec&&(!p.isExtraCoord||null==p.otherDims.itemName&&null==p.otherDims.seriesName)||(p.type="ordinal")}return o}function Zv(t,e,n){if(n||null!=e.get(t)){for(var i=0;null!=e.get(t+i);)i++;t+=i}return e.set(t,!0),t}function Kv(t,e){return jv((e=e||{}).coordDimensions||[],t,{dimsDef:e.dimensionsDefine||t.dimensionsDefine,encodeDef:e.encodeDefine||t.encodeDefine,dimCount:e.dimensionsCount,encodeDefaulter:e.encodeDefaulter,generateCoord:e.generateCoord,generateCoordCount:e.generateCoordCount})}var $v=function(t){this.coordSysDims=[],this.axisMap=lt(),this.categoryAxisMap=lt(),this.coordSysName=t};var Jv={cartesian2d:function(t,e,n,i){var r=t.getReferringComponents("xAxis",dr).models[0],a=t.getReferringComponents("yAxis",dr).models[0];e.coordSysDims=["x","y"],n.set("x",r),n.set("y",a),Qv(r)&&(i.set("x",r),e.firstCategoryDimIndex=0),Qv(a)&&(i.set("y",a),null==e.firstCategoryDimIndex&&(e.firstCategoryDimIndex=1))},singleAxis:function(t,e,n,i){var r=t.getReferringComponents("singleAxis",dr).models[0];e.coordSysDims=["single"],n.set("single",r),Qv(r)&&(i.set("single",r),e.firstCategoryDimIndex=0)},polar:function(t,e,n,i){var r=t.getReferringComponents("polar",dr).models[0],a=r.findAxisModel("radiusAxis"),o=r.findAxisModel("angleAxis");e.coordSysDims=["radius","angle"],n.set("radius",a),n.set("angle",o),Qv(a)&&(i.set("radius",a),e.firstCategoryDimIndex=0),Qv(o)&&(i.set("angle",o),null==e.firstCategoryDimIndex&&(e.firstCategoryDimIndex=1))},geo:function(t,e,n,i){e.coordSysDims=["lng","lat"]},parallel:function(t,e,n,i){var r=t.ecModel,a=r.getComponent("parallel",t.get("parallelIndex")),o=e.coordSysDims=a.dimensions.slice();L(a.parallelAxisIndex,(function(t,a){var s=r.getComponent("parallelAxis",t),l=o[a];n.set(l,s),Qv(s)&&(i.set(l,s),null==e.firstCategoryDimIndex&&(e.firstCategoryDimIndex=a))}))}};function Qv(t){return"category"===t.get("type")}function tm(t,e,n){var i,r,a,o,s=(n=n||{}).byIndex,l=n.stackedCoordDimension,u=!(!t||!t.get("stack"));if(L(e,(function(t,n){V(t)&&(e[n]=t={name:t}),u&&!t.isExtraCoord&&(s||i||!t.ordinalMeta||(i=t),r||"ordinal"===t.type||"time"===t.type||l&&l!==t.coordDim||(r=t))})),!r||s||i||(s=!0),r){a="__\0ecstackresult",o="__\0ecstackedover",i&&(i.createInvertedIndices=!0);var h=r.coordDim,c=r.type,p=0;L(e,(function(t){t.coordDim===h&&p++})),e.push({name:a,coordDim:h,coordDimIndex:p,type:c,isExtraCoord:!0,isCalculationCoord:!0}),p++,e.push({name:o,coordDim:o,coordDimIndex:p,type:c,isExtraCoord:!0,isCalculationCoord:!0})}return{stackedDimension:r&&r.name,stackedByDimension:i&&i.name,isStackedByIndex:s,stackedOverDimension:o,stackResultDimension:a}}function em(t,e){return!!e&&e===t.getCalculationInfo("stackedDimension")}function nm(t,e){return em(t,e)?t.getCalculationInfo("stackResultDimension"):e}function im(t,e,n){n=n||{},ip(t)||(t=ap(t));var i,r=e.get("coordinateSystem"),a=Cc.get(r),o=function(t){var e=t.get("coordinateSystem"),n=new $v(e),i=Jv[e];if(i)return i(t,n,n.axisMap,n.categoryAxisMap),n}(e);o&&o.coordSysDims&&(i=P(o.coordSysDims,(function(t){var e={name:t},n=o.axisMap.get(t);if(n){var i=n.get("type");e.type=function(t){return"category"===t?"ordinal":"time"===t?"time":"float"}(i)}return e}))),i||(i=a&&(a.getDimensionsInfo?a.getDimensionsInfo():a.dimensions.slice())||["x","y"]);var s,l,u=n.useEncodeDefaulter,h=Kv(t,{coordDimensions:i,generateCoord:n.generateCoord,encodeDefaulter:F(u)?u:u?B(ac,i,e):null});o&&L(h,(function(t,e){var i=t.coordDim,r=o.categoryAxisMap.get(i);r&&(null==s&&(s=e),t.ordinalMeta=r.getOrdinalMeta(),n.createInvertedIndices&&(t.createInvertedIndices=!0)),null!=t.otherDims.itemName&&(l=!0)})),l||null==s||(h[s].otherDims.itemName=0);var c=tm(e,h),p=new qv(h,e);p.setCalculationInfo(c);var f=null!=s&&function(t){if(t.sourceFormat===qh){var e=function(t){var e=0;for(;e<t.length&&null==t[e];)e++;return t[e]}(t.data||[]);return null!=e&&!z(nr(e))}}(t)?function(t,e,n,i){return i===s?n:this.defaultDimValueGetter(t,e,n,i)}:null;return p.hasItemOption=!1,p.initData(t,null,f),p}var rm=function(){function t(t){this._setting=t||{},this._extent=[1/0,-1/0]}return t.prototype.getSetting=function(t){return this._setting[t]},t.prototype.unionExtent=function(t){var e=this._extent;t[0]<e[0]&&(e[0]=t[0]),t[1]>e[1]&&(e[1]=t[1])},t.prototype.unionExtentFromData=function(t,e){this.unionExtent(t.getApproximateExtent(e))},t.prototype.getExtent=function(){return this._extent.slice()},t.prototype.setExtent=function(t,e){var n=this._extent;isNaN(t)||(n[0]=t),isNaN(e)||(n[1]=e)},t.prototype.isInExtentRange=function(t){return this._extent[0]<=t&&this._extent[1]>=t},t.prototype.isBlank=function(){return this._isBlank},t.prototype.setBlank=function(t){this._isBlank=t},t}();Ar(rm);var am=function(){function t(t){this.categories=t.categories||[],this._needCollect=t.needCollect,this._deduplication=t.deduplication}return t.createByAxisModel=function(e){var n=e.option,i=n.data,r=i&&P(i,om);return new t({categories:r,needCollect:!r,deduplication:!1!==n.dedplication})},t.prototype.getOrdinal=function(t){return this._getOrCreateMap().get(t)},t.prototype.parseAndCollect=function(t){var e,n=this._needCollect;if("string"!=typeof t&&!n)return t;if(n&&!this._deduplication)return e=this.categories.length,this.categories[e]=t,e;var i=this._getOrCreateMap();return null==(e=i.get(t))&&(n?(e=this.categories.length,this.categories[e]=t,i.set(t,e)):e=NaN),e},t.prototype._getOrCreateMap=function(){return this._map||(this._map=lt(this.categories))},t}();function om(t){return W(t)&&null!=t.value?t.value:t+""}var sm=Ni;function lm(t,e,n,i){var r={},a=t[1]-t[0],o=r.interval=Yi(a/e,!0);null!=n&&o<n&&(o=r.interval=n),null!=i&&o>i&&(o=r.interval=i);var s=r.intervalPrecision=um(o);return function(t,e){!isFinite(t[0])&&(t[0]=e[0]),!isFinite(t[1])&&(t[1]=e[1]),hm(t,0,e),hm(t,1,e),t[0]>t[1]&&(t[0]=t[1])}(r.niceTickExtent=[sm(Math.ceil(t[0]/o)*o,s),sm(Math.floor(t[1]/o)*o,s)],t),r}function um(t){return Ei(t)+2}function hm(t,e,n){t[e]=Math.max(Math.min(t[e],n[1]),n[0])}function cm(t,e){return t>=e[0]&&t<=e[1]}function pm(t,e){return e[1]===e[0]?.5:(t-e[0])/(e[1]-e[0])}function fm(t,e){return t*(e[1]-e[0])+e[0]}var dm=function(t){function e(e){var n=t.call(this,e)||this;n.type="ordinal";var i=n.getSetting("ordinalMeta");return i||(i=new am({})),z(i)&&(i=new am({categories:P(i,(function(t){return W(t)?t.value:t}))})),n._ordinalMeta=i,n._extent=n.getSetting("extent")||[0,i.categories.length-1],n}return n(e,t),e.prototype.parse=function(t){return"string"==typeof t?this._ordinalMeta.getOrdinal(t):Math.round(t)},e.prototype.contain=function(t){return cm(t=this.parse(t),this._extent)&&null!=this._ordinalMeta.categories[t]},e.prototype.normalize=function(t){return pm(t=this._getTickNumber(this.parse(t)),this._extent)},e.prototype.scale=function(t){return t=Math.round(fm(t,this._extent)),this.getRawOrdinalNumber(t)},e.prototype.getTicks=function(){for(var t=[],e=this._extent,n=e[0];n<=e[1];)t.push({value:n}),n++;return t},e.prototype.getMinorTicks=function(t){},e.prototype.setSortInfo=function(t){if(null!=t){for(var e=t.ordinalNumbers,n=this._ordinalNumbersByTick=[],i=this._ticksByOrdinalNumber=[],r=0,a=this._ordinalMeta.categories.length,o=Math.min(a,e.length);r<o;++r){var s=e[r];n[r]=s,i[s]=r}for(var l=0;r<a;++r){for(;null!=i[l];)l++;n.push(l),i[l]=r}}else this._ordinalNumbersByTick=this._ticksByOrdinalNumber=null},e.prototype._getTickNumber=function(t){var e=this._ticksByOrdinalNumber;return e&&t>=0&&t<e.length?e[t]:t},e.prototype.getRawOrdinalNumber=function(t){var e=this._ordinalNumbersByTick;return e&&t>=0&&t<e.length?e[t]:t},e.prototype.getLabel=function(t){if(!this.isBlank()){var e=this.getRawOrdinalNumber(t.value),n=this._ordinalMeta.categories[e];return null==n?"":n+""}},e.prototype.count=function(){return this._extent[1]-this._extent[0]+1},e.prototype.unionExtentFromData=function(t,e){this.unionExtent(t.getApproximateExtent(e))},e.prototype.isInExtentRange=function(t){return t=this._getTickNumber(t),this._extent[0]<=t&&this._extent[1]>=t},e.prototype.getOrdinalMeta=function(){return this._ordinalMeta},e.prototype.niceTicks=function(){},e.prototype.niceExtent=function(){},e.type="ordinal",e}(rm);rm.registerClass(dm);var gm=Ni,ym=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="interval",e._interval=0,e._intervalPrecision=2,e}return n(e,t),e.prototype.parse=function(t){return t},e.prototype.contain=function(t){return cm(t,this._extent)},e.prototype.normalize=function(t){return pm(t,this._extent)},e.prototype.scale=function(t){return fm(t,this._extent)},e.prototype.setExtent=function(t,e){var n=this._extent;isNaN(t)||(n[0]=parseFloat(t)),isNaN(e)||(n[1]=parseFloat(e))},e.prototype.unionExtent=function(t){var e=this._extent;t[0]<e[0]&&(e[0]=t[0]),t[1]>e[1]&&(e[1]=t[1]),this.setExtent(e[0],e[1])},e.prototype.getInterval=function(){return this._interval},e.prototype.setInterval=function(t){this._interval=t,this._niceExtent=this._extent.slice(),this._intervalPrecision=um(t)},e.prototype.getTicks=function(t){var e=this._interval,n=this._extent,i=this._niceExtent,r=this._intervalPrecision,a=[];if(!e)return a;n[0]<i[0]&&(t?a.push({value:gm(i[0]-e,r)}):a.push({value:n[0]}));for(var o=i[0];o<=i[1]&&(a.push({value:o}),(o=gm(o+e,r))!==a[a.length-1].value);)if(a.length>1e4)return[];var s=a.length?a[a.length-1].value:i[1];return n[1]>s&&(t?a.push({value:gm(s+e,r)}):a.push({value:n[1]})),a},e.prototype.getMinorTicks=function(t){for(var e=this.getTicks(!0),n=[],i=this.getExtent(),r=1;r<e.length;r++){for(var a=e[r],o=e[r-1],s=0,l=[],u=(a.value-o.value)/t;s<t-1;){var h=gm(o.value+(s+1)*u);h>i[0]&&h<i[1]&&l.push(h),s++}n.push(l)}return n},e.prototype.getLabel=function(t,e){if(null==t)return"";var n=e&&e.precision;return null==n?n=Ei(t.value)||0:"auto"===n&&(n=this._intervalPrecision),Mh(gm(t.value,n,!0))},e.prototype.niceTicks=function(t,e,n){t=t||5;var i=this._extent,r=i[1]-i[0];if(isFinite(r)){r<0&&(r=-r,i.reverse());var a=lm(i,t,e,n);this._intervalPrecision=a.intervalPrecision,this._interval=a.interval,this._niceExtent=a.niceTickExtent}},e.prototype.niceExtent=function(t){var e=this._extent;if(e[0]===e[1])if(0!==e[0]){var n=e[0];t.fixMax||(e[1]+=n/2),e[0]-=n/2}else e[1]=1;var i=e[1]-e[0];isFinite(i)||(e[0]=0,e[1]=1),this.niceTicks(t.splitNumber,t.minInterval,t.maxInterval);var r=this._interval;t.fixMin||(e[0]=gm(Math.floor(e[0]/r)*r)),t.fixMax||(e[1]=gm(Math.ceil(e[1]/r)*r))},e.type="interval",e}(rm);rm.registerClass(ym);var vm="undefined"!=typeof Float32Array?Float32Array:Array;function mm(t){return t.get("stack")||"__ec_stack_"+t.seriesIndex}function _m(t){return t.dim+t.index}function xm(t,e){var n=[];return e.eachSeriesByType(t,(function(t){Tm(t)&&!Cm(t)&&n.push(t)})),n}function bm(t){var e=function(t){var e={};L(t,(function(t){var n=t.coordinateSystem.getBaseAxis();if("time"===n.type||"value"===n.type)for(var i=t.getData(),r=n.dim+"_"+n.index,a=i.mapDimension(n.dim),o=0,s=i.count();o<s;++o){var l=i.get(a,o);e[r]?e[r].push(l):e[r]=[l]}}));var n={};for(var i in e)if(e.hasOwnProperty(i)){var r=e[i];if(r){r.sort((function(t,e){return t-e}));for(var a=null,o=1;o<r.length;++o){var s=r[o]-r[o-1];s>0&&(a=null===a?s:Math.min(a,s))}n[i]=a}}return n}(t),n=[];return L(t,(function(t){var i,r=t.coordinateSystem.getBaseAxis(),a=r.getExtent();if("category"===r.type)i=r.getBandWidth();else if("value"===r.type||"time"===r.type){var o=r.dim+"_"+r.index,s=e[o],l=Math.abs(a[1]-a[0]),u=r.scale.getExtent(),h=Math.abs(u[1]-u[0]);i=s?l/h*s:l}else{var c=t.getData();i=Math.abs(a[1]-a[0])/c.count()}var p=Ri(t.get("barWidth"),i),f=Ri(t.get("barMaxWidth"),i),d=Ri(t.get("barMinWidth")||1,i),g=t.get("barGap"),y=t.get("barCategoryGap");n.push({bandWidth:i,barWidth:p,barMaxWidth:f,barMinWidth:d,barGap:g,barCategoryGap:y,axisKey:_m(r),stackId:mm(t)})})),function(t){var e={};L(t,(function(t,n){var i=t.axisKey,r=t.bandWidth,a=e[i]||{bandWidth:r,remainedWidth:r,autoWidthCount:0,categoryGap:null,gap:"20%",stacks:{}},o=a.stacks;e[i]=a;var s=t.stackId;o[s]||a.autoWidthCount++,o[s]=o[s]||{width:0,maxWidth:0};var l=t.barWidth;l&&!o[s].width&&(o[s].width=l,l=Math.min(a.remainedWidth,l),a.remainedWidth-=l);var u=t.barMaxWidth;u&&(o[s].maxWidth=u);var h=t.barMinWidth;h&&(o[s].minWidth=h);var c=t.barGap;null!=c&&(a.gap=c);var p=t.barCategoryGap;null!=p&&(a.categoryGap=p)}));var n={};return L(e,(function(t,e){n[e]={};var i=t.stacks,r=t.bandWidth,a=t.categoryGap;if(null==a){var o=N(i).length;a=Math.max(35-4*o,15)+"%"}var s=Ri(a,r),l=Ri(t.gap,1),u=t.remainedWidth,h=t.autoWidthCount,c=(u-s)/(h+(h-1)*l);c=Math.max(c,0),L(i,(function(t){var e=t.maxWidth,n=t.minWidth;if(t.width){i=t.width;e&&(i=Math.min(i,e)),n&&(i=Math.max(i,n)),t.width=i,u-=i+l*i,h--}else{var i=c;e&&e<i&&(i=Math.min(e,u)),n&&n>i&&(i=n),i!==c&&(t.width=i,u-=i+l*i,h--)}})),c=(u-s)/(h+(h-1)*l),c=Math.max(c,0);var p,f=0;L(i,(function(t,e){t.width||(t.width=c),p=t,f+=t.width*(1+l)})),p&&(f-=p.width*l);var d=-f/2;L(i,(function(t,i){n[e][i]=n[e][i]||{bandWidth:r,offset:d,width:t.width},d+=t.width*(1+l)}))})),n}(n)}function wm(t,e,n){if(t&&e){var i=t[_m(e)];return null!=i&&null!=n?i[mm(n)]:i}}function Sm(t,e){var n=xm(t,e),i=bm(n),r={};L(n,(function(t){var e=t.getData(),n=t.coordinateSystem,a=n.getBaseAxis(),o=mm(t),s=i[_m(a)][o],l=s.offset,u=s.width,h=n.getOtherAxis(a),c=t.get("barMinHeight")||0;r[o]=r[o]||[],e.setLayout({bandWidth:s.bandWidth,offset:l,size:u});for(var p=e.mapDimension(h.dim),f=e.mapDimension(a.dim),d=em(e,p),g=h.isHorizontal(),y=Am(a,h),v=0,m=e.count();v<m;v++){var _=e.get(p,v),x=e.get(f,v),b=_>=0?"p":"n",w=y;d&&(r[o][x]||(r[o][x]={p:y,n:y}),w=r[o][x][b]);var S,M=void 0,T=void 0,C=void 0,A=void 0;if(g)M=w,T=(S=n.dataToPoint([_,x]))[1]+l,C=S[0]-y,A=u,Math.abs(C)<c&&(C=(C<0?-1:1)*c),isNaN(C)||d&&(r[o][x][b]+=C);else M=(S=n.dataToPoint([x,_]))[0]+l,T=w,C=u,A=S[1]-y,Math.abs(A)<c&&(A=(A<=0?-1:1)*c),isNaN(A)||d&&(r[o][x][b]+=A);e.setItemLayout(v,{x:M,y:T,width:C,height:A})}}))}var Mm={seriesType:"bar",plan:Qp(),reset:function(t){if(Tm(t)&&Cm(t)){var e=t.getData(),n=t.coordinateSystem,i=n.master.getRect(),r=n.getBaseAxis(),a=n.getOtherAxis(r),o=e.mapDimension(a.dim),s=e.mapDimension(r.dim),l=a.isHorizontal(),u=l?0:1,h=wm(bm([t]),r,t).width;return h>.5||(h=.5),{progress:function(t,e){for(var c,p=t.count,f=new vm(2*p),d=new vm(2*p),g=new vm(p),y=[],v=[],m=0,_=0;null!=(c=t.next());)v[u]=e.get(o,c),v[1-u]=e.get(s,c),y=n.dataToPoint(v,null,y),d[m]=l?i.x+i.width:y[0],f[m++]=y[0],d[m]=l?y[1]:i.y+i.height,f[m++]=y[1],g[_++]=c;e.setLayout({largePoints:f,largeDataIndices:g,largeBackgroundPoints:d,barWidth:h,valueAxisStart:Am(r,a),backgroundStart:l?i.x:i.y,valueAxisHorizontal:l})}}}}};function Tm(t){return t.coordinateSystem&&"cartesian2d"===t.coordinateSystem.type}function Cm(t){return t.pipelineContext&&t.pipelineContext.large}function Am(t,e,n){return e.toGlobalCoord(e.dataToCoord("log"===e.type?1:0))}var Dm=function(t){function e(e){var n=t.call(this,e)||this;return n.type="time",n}return n(e,t),e.prototype.getLabel=function(t){var e=this.getSetting("useUTC");return sh(t.value,eh[function(t){switch(t){case"year":case"month":return"day";case"millisecond":return"millisecond";default:return"second"}}(ah(this._minLevelUnit))]||eh.second,e,this.getSetting("locale"))},e.prototype.getFormattedLabel=function(t,e,n){var i=this.getSetting("useUTC");return function(t,e,n,i,r){var a=null;if("string"==typeof n)a=n;else if("function"==typeof n)a=n(t.value,e,{level:t.level});else{var o=M({},Qu);if(t.level>0)for(var s=0;s<nh.length;++s)o[nh[s]]="{primary|"+o[nh[s]]+"}";var l=n?!1===n.inherit?n:T(n,o):o,u=lh(t.value,r);if(l[u])a=l[u];else if(l.inherit){for(s=ih.indexOf(u)-1;s>=0;--s)if(l[u]){a=l[u];break}a=a||o.none}if(z(a)){var h=null==t.level?0:t.level>=0?t.level:a.length+t.level;a=a[h=Math.min(h,a.length-1)]}}return sh(new Date(t.value),a,r,i)}(t,e,n,this.getSetting("locale"),i)},e.prototype.getTicks=function(t){var e=this._interval,n=this._extent,i=[];if(!e)return i;i.push({value:n[0],level:0});var r=this.getSetting("useUTC"),a=function(t,e,n,i){var r=1e4,a=ih,o=0;function s(t,e,n,r,a,o,s){for(var l=new Date(e),u=e,h=l[r]();u<n&&u<=i[1];)s.push({value:u}),h+=t,l[a](h),u=l.getTime();s.push({value:u,notAdd:!0})}function l(t,r,a){var o=[],l=!r.length;if(!function(t,e,n,i){var r=Gi(e),a=Gi(n),o=function(t){return uh(r,t,i)===uh(a,t,i)},s=function(){return o("year")},l=function(){return s()&&o("month")},u=function(){return l()&&o("day")},h=function(){return u()&&o("hour")},c=function(){return h()&&o("minute")},p=function(){return c()&&o("second")},f=function(){return p()&&o("millisecond")};switch(t){case"year":return s();case"month":return l();case"day":return u();case"hour":return h();case"minute":return c();case"second":return p();case"millisecond":return f()}}(ah(t),i[0],i[1],n)){l&&(r=[{value:Nm(new Date(i[0]),t,n)},{value:i[1]}]);for(var u=0;u<r.length-1;u++){var h=r[u].value,c=r[u+1].value;if(h!==c){var p=void 0,f=void 0,d=void 0,g=!1;switch(t){case"year":p=Math.max(1,Math.round(e/$u/365)),f=hh(n),d=vh(n);break;case"half-year":case"quarter":case"month":p=Lm(e),f=ch(n),d=mh(n);break;case"week":case"half-week":case"day":p=km(e),f=ph(n),d=_h(n),g=!0;break;case"half-day":case"quarter-day":case"hour":p=Pm(e),f=fh(n),d=xh(n);break;case"minute":p=Om(e,!0),f=dh(n),d=bh(n);break;case"second":p=Om(e,!1),f=gh(n),d=wh(n);break;case"millisecond":p=Rm(e),f=yh(n),d=Sh(n)}s(p,h,c,f,d,g,o),"year"===t&&a.length>1&&0===u&&a.unshift({value:a[0].value-p})}}for(u=0;u<o.length;u++)a.push(o[u]);return o}}for(var u=[],h=[],c=0,p=0,f=0;f<a.length&&o++<r;++f){var d=ah(a[f]);if(oh(a[f]))if(l(a[f],u[u.length-1]||[],h),d!==(a[f+1]?ah(a[f+1]):null)){if(h.length){p=c,h.sort((function(t,e){return t.value-e.value}));for(var g=[],y=0;y<h.length;++y){var v=h[y].value;0!==y&&h[y-1].value===v||(g.push(h[y]),v>=i[0]&&v<=i[1]&&c++)}var m=(i[1]-i[0])/e;if(c>1.5*m&&p>m/1.5)break;if(u.push(g),c>m||t===a[f])break}h=[]}}0;var _=R(P(u,(function(t){return R(t,(function(t){return t.value>=i[0]&&t.value<=i[1]&&!t.notAdd}))})),(function(t){return t.length>0})),x=[],b=_.length-1;for(f=0;f<_.length;++f)for(var w=_[f],S=0;S<w.length;++S)x.push({value:w[S].value,level:b-f});x.sort((function(t,e){return t.value-e.value}));var M=[];for(f=0;f<x.length;++f)0!==f&&x[f].value===x[f-1].value||M.push(x[f]);return M}(this._minLevelUnit,this._approxInterval,r,n);return(i=i.concat(a)).push({value:n[1],level:0}),i},e.prototype.niceExtent=function(t){var e=this._extent;if(e[0]===e[1]&&(e[0]-=$u,e[1]+=$u),e[1]===-1/0&&e[0]===1/0){var n=new Date;e[1]=+new Date(n.getFullYear(),n.getMonth(),n.getDate()),e[0]=e[1]-$u}this.niceTicks(t.splitNumber,t.minInterval,t.maxInterval)},e.prototype.niceTicks=function(t,e,n){t=t||10;var i=this._extent,r=i[1]-i[0];this._approxInterval=r/t,null!=e&&this._approxInterval<e&&(this._approxInterval=e),null!=n&&this._approxInterval>n&&(this._approxInterval=n);var a=Im.length,o=Math.min(function(t,e,n,i){for(;n<i;){var r=n+i>>>1;t[r][1]<e?n=r+1:i=r}return n}(Im,this._approxInterval,0,a),a-1);this._interval=Im[o][1],this._minLevelUnit=Im[Math.max(o-1,0)][0]},e.prototype.parse=function(t){return"number"==typeof t?t:+Gi(t)},e.prototype.contain=function(t){return cm(this.parse(t),this._extent)},e.prototype.normalize=function(t){return pm(this.parse(t),this._extent)},e.prototype.scale=function(t){return fm(t,this._extent)},e.type="time",e}(ym),Im=[["second",ju],["minute",Zu],["hour",Ku],["quarter-day",216e5],["half-day",432e5],["day",10368e4],["half-week",3024e5],["week",6048e5],["month",26784e5],["quarter",8208e6],["half-year",Ju/2],["year",Ju]];function km(t,e){return(t/=$u)>16?16:t>7.5?7:t>3.5?4:t>1.5?2:1}function Lm(t){return(t/=2592e6)>6?6:t>3?3:t>2?2:1}function Pm(t){return(t/=Ku)>12?12:t>6?6:t>3.5?4:t>2?2:1}function Om(t,e){return(t/=e?Zu:ju)>30?30:t>20?20:t>15?15:t>10?10:t>5?5:t>2?2:1}function Rm(t){return Yi(t,!0)}function Nm(t,e,n){var i=new Date(t);switch(ah(e)){case"year":case"month":i[mh(n)](0);case"day":i[_h(n)](1);case"hour":i[xh(n)](0);case"minute":i[bh(n)](0);case"second":i[wh(n)](0),i[Sh(n)](0)}return i.getTime()}rm.registerClass(Dm);var Em=rm.prototype,Bm=ym.prototype,zm=Ei,Fm=Ni,Vm=Math.floor,Hm=Math.ceil,Gm=Math.pow,Wm=Math.log,Um=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="log",e.base=10,e._originalScale=new ym,e._interval=0,e}return n(e,t),e.prototype.getTicks=function(t){var e=this._originalScale,n=this._extent,i=e.getExtent();return P(Bm.getTicks.call(this,t),(function(t){var e=t.value,r=Ni(Gm(this.base,e));return r=e===n[0]&&this._fixMin?Xm(r,i[0]):r,{value:r=e===n[1]&&this._fixMax?Xm(r,i[1]):r}}),this)},e.prototype.setExtent=function(t,e){var n=this.base;t=Wm(t)/Wm(n),e=Wm(e)/Wm(n),Bm.setExtent.call(this,t,e)},e.prototype.getExtent=function(){var t=this.base,e=Em.getExtent.call(this);e[0]=Gm(t,e[0]),e[1]=Gm(t,e[1]);var n=this._originalScale.getExtent();return this._fixMin&&(e[0]=Xm(e[0],n[0])),this._fixMax&&(e[1]=Xm(e[1],n[1])),e},e.prototype.unionExtent=function(t){this._originalScale.unionExtent(t);var e=this.base;t[0]=Wm(t[0])/Wm(e),t[1]=Wm(t[1])/Wm(e),Em.unionExtent.call(this,t)},e.prototype.unionExtentFromData=function(t,e){this.unionExtent(t.getApproximateExtent(e))},e.prototype.niceTicks=function(t){t=t||10;var e=this._extent,n=e[1]-e[0];if(!(n===1/0||n<=0)){var i=Wi(n);for(t/n*i<=.5&&(i*=10);!isNaN(i)&&Math.abs(i)<1&&Math.abs(i)>0;)i*=10;var r=[Ni(Hm(e[0]/i)*i),Ni(Vm(e[1]/i)*i)];this._interval=i,this._niceExtent=r}},e.prototype.niceExtent=function(t){Bm.niceExtent.call(this,t),this._fixMin=t.fixMin,this._fixMax=t.fixMax},e.prototype.parse=function(t){return t},e.prototype.contain=function(t){return cm(t=Wm(t)/Wm(this.base),this._extent)},e.prototype.normalize=function(t){return pm(t=Wm(t)/Wm(this.base),this._extent)},e.prototype.scale=function(t){return t=fm(t,this._extent),Gm(this.base,t)},e.type="log",e}(rm),Ym=Um.prototype;function Xm(t,e){return Fm(t,zm(e))}Ym.getMinorTicks=Bm.getMinorTicks,Ym.getLabel=Bm.getLabel,rm.registerClass(Um);var qm=function(){function t(t,e,n){this._prepareParams(t,e,n)}return t.prototype._prepareParams=function(t,e,n){n[1]<n[0]&&(n=[NaN,NaN]),this._dataMin=n[0],this._dataMax=n[1];var i=this._isOrdinal="ordinal"===t.type;this._needCrossZero=e.getNeedCrossZero&&e.getNeedCrossZero();var r=this._modelMinRaw=e.get("min",!0);F(r)?this._modelMinNum=Km(t,r({min:n[0],max:n[1]})):"dataMin"!==r&&(this._modelMinNum=Km(t,r));var a=this._modelMaxRaw=e.get("max",!0);if(F(a)?this._modelMaxNum=Km(t,a({min:n[0],max:n[1]})):"dataMax"!==a&&(this._modelMaxNum=Km(t,a)),i)this._axisDataLen=e.getCategories().length;else{var o=e.get("boundaryGap"),s=z(o)?o:[o||0,o||0];"boolean"==typeof s[0]||"boolean"==typeof s[1]?this._boundaryGapInner=[0,0]:this._boundaryGapInner=[Ln(s[0],1),Ln(s[1],1)]}},t.prototype.calculate=function(){var t=this._isOrdinal,e=this._dataMin,n=this._dataMax,i=this._axisDataLen,r=this._boundaryGapInner,a=t?null:n-e||Math.abs(e),o="dataMin"===this._modelMinRaw?e:this._modelMinNum,s="dataMax"===this._modelMaxRaw?n:this._modelMaxNum,l=null!=o,u=null!=s;null==o&&(o=t?i?0:NaN:e-r[0]*a),null==s&&(s=t?i?i-1:NaN:n+r[1]*a),(null==o||!isFinite(o))&&(o=NaN),(null==s||!isFinite(s))&&(s=NaN),o>s&&(o=NaN,s=NaN);var h=K(o)||K(s)||t&&!i;this._needCrossZero&&(o>0&&s>0&&!l&&(o=0),o<0&&s<0&&!u&&(s=0));var c=this._determinedMin,p=this._determinedMax;return null!=c&&(o=c,l=!0),null!=p&&(s=p,u=!0),{min:o,max:s,minFixed:l,maxFixed:u,isBlank:h}},t.prototype.modifyDataMinMax=function(t,e){this[Zm[t]]=e},t.prototype.setDeterminedMinMax=function(t,e){var n=jm[t];this[n]=e},t.prototype.freeze=function(){this.frozen=!0},t}(),jm={min:"_determinedMin",max:"_determinedMax"},Zm={min:"_dataMin",max:"_dataMax"};function Km(t,e){return null==e?null:K(e)?NaN:t.parse(e)}function $m(t,e){var n=t.type,i=function(t,e,n){var i=t.rawExtentInfo;return i||(i=new qm(t,e,n),t.rawExtentInfo=i,i)}(t,e,t.getExtent()).calculate();t.setBlank(i.isBlank);var r=i.min,a=i.max,o=e.ecModel;if(o&&"time"===n){var s=xm("bar",o),l=!1;if(L(s,(function(t){l=l||t.getBaseAxis()===e.axis})),l){var u=bm(s),h=function(t,e,n,i){var r=n.axis.getExtent(),a=r[1]-r[0],o=wm(i,n.axis);if(void 0===o)return{min:t,max:e};var s=1/0;L(o,(function(t){s=Math.min(t.offset,s)}));var l=-1/0;L(o,(function(t){l=Math.max(t.offset+t.width,l)})),s=Math.abs(s),l=Math.abs(l);var u=s+l,h=e-t,c=h/(1-(s+l)/a)-h;return{min:t-=c*(s/u),max:e+=c*(l/u)}}(r,a,e,u);r=h.min,a=h.max}}return{extent:[r,a],fixMin:i.minFixed,fixMax:i.maxFixed}}function Jm(t,e){var n=$m(t,e),i=n.extent,r=e.get("splitNumber");t instanceof Um&&(t.base=e.get("logBase"));var a=t.type;t.setExtent(i[0],i[1]),t.niceExtent({splitNumber:r,fixMin:n.fixMin,fixMax:n.fixMax,minInterval:"interval"===a||"time"===a?e.get("minInterval"):null,maxInterval:"interval"===a||"time"===a?e.get("maxInterval"):null});var o=e.get("interval");null!=o&&t.setInterval&&t.setInterval(o)}function Qm(t,e){if(e=e||t.get("type"))switch(e){case"category":return new dm({ordinalMeta:t.getOrdinalMeta?t.getOrdinalMeta():t.getCategories(),extent:[1/0,-1/0]});case"time":return new Dm({locale:t.ecModel.getLocaleModel(),useUTC:t.ecModel.get("useUTC")});default:return new(rm.getClass(e)||ym)}}function t_(t){var e,n,i=t.getLabelModel().get("formatter"),r="category"===t.type?t.scale.getExtent()[0]:null;return"time"===t.scale.type?(n=i,function(e,i){return t.scale.getFormattedLabel(e,i,n)}):"string"==typeof i?function(e){return function(n){var i=t.scale.getLabel(n);return e.replace("{value}",null!=i?i:"")}}(i):"function"==typeof i?(e=i,function(n,i){return null!=r&&(i=n.value-r),e(function(t,e){return"category"===t.type?t.scale.getLabel(e):e.value}(t,n),i,null!=n.level?{level:n.level}:null)}):function(e){return t.scale.getLabel(e)}}function e_(t,e){var n=e*Math.PI/180,i=t.width,r=t.height,a=i*Math.abs(Math.cos(n))+Math.abs(r*Math.sin(n)),o=i*Math.abs(Math.sin(n))+Math.abs(r*Math.cos(n));return new bn(t.x,t.y,a,o)}function n_(t){var e=t.get("interval");return null==e?"auto":e}function i_(t){return"category"===t.type&&0===n_(t.getLabelModel())}var r_=function(){function t(){}return t.prototype.getNeedCrossZero=function(){return!this.option.scale},t.prototype.getCoordSysModel=function(){},t}();var a_={isDimensionStacked:em,enableDataStack:tm,getStackedDimension:nm};var o_=Object.freeze({__proto__:null,createList:function(t){return im(t.getSource(),t)},getLayoutRect:Bh,dataStack:a_,createScale:function(t,e){var n=e;e instanceof zu||(n=new zu(e));var i=Qm(n);return i.setExtent(t[0],t[1]),Jm(i,n),i},mixinAxisModelCommonMethods:function(t){I(t,r_)},getECData:qo,createTextStyle:function(t,e){return xu(t,null,null,"normal"!==(e=e||{}).state)},createDimensions:Kv,createSymbol:Bd,enableHoverEmphasis:Os}),s_=Object.freeze({__proto__:null,linearMap:Oi,round:Ni,asc:function(t){return t.sort((function(t,e){return t-e})),t},getPrecision:function(t){if(t=+t,isNaN(t))return 0;for(var e=1,n=0;Math.round(t*e)/e!==t;)e*=10,n++;return n},getPrecisionSafe:Ei,getPixelPrecision:Bi,getPercentWithPrecision:zi,MAX_SAFE_INTEGER:9007199254740991,remRadian:Fi,isRadianAroundZero:Vi,parseDate:Gi,quantity:Wi,quantityExponent:Ui,nice:Yi,quantile:function(t,e){var n=(t.length-1)*e+1,i=Math.floor(n),r=+t[i-1],a=n-i;return a?r+a*(t[i]-r):r},reformIntervals:function(t){t.sort((function(t,e){return s(t,e,0)?-1:1}));for(var e=-1/0,n=1,i=0;i<t.length;){for(var r=t[i].interval,a=t[i].close,o=0;o<2;o++)r[o]<=e&&(r[o]=e,a[o]=o?1:1-n),e=r[o],n=a[o];r[0]===r[1]&&a[0]*a[1]!=1?t.splice(i,1):i++}return t;function s(t,e,n){return t.interval[n]<e.interval[n]||t.interval[n]===e.interval[n]&&(t.close[n]-e.close[n]==(n?-1:1)||!n&&s(t,e,1))}},isNumeric:qi,numericToNumber:Xi}),l_=Object.freeze({__proto__:null,parse:Gi,format:sh}),u_=Object.freeze({__proto__:null,extendShape:function(t){return Co.extend(t)},extendPath:function(t,e){return tu(t,e)},makePath:nu,makeImage:iu,mergePath:au,resizePath:ou,createIcon:function(t,e,n){var i=M({rectHover:!0},e),r=i.style={strokeNoScale:!0};if(n=n||{x:-1,y:-1,width:2,height:2},t)return 0===t.indexOf("image://")?(r.image=t.slice(8),T(r,n),new Lo(i)):nu(t.replace("path://",""),i,n,"center")},updateProps:lu,initProps:uu,getTransform:function(t,e){for(var n=oe([]);t&&t!==e;)le(n,t.getLocalTransform(),n),t=t.parent;return n},clipPointsByRect:function(t,e){return P(t,(function(t){var n=t[0];n=$l(n,e.x),n=Jl(n,e.x+e.width);var i=t[1];return i=$l(i,e.y),[n,i=Jl(i,e.y+e.height)]}))},clipRectByRect:function(t,e){var n=$l(t.x,e.x),i=Jl(t.x+t.width,e.x+e.width),r=$l(t.y,e.y),a=Jl(t.y+t.height,e.y+e.height);if(i>=n&&a>=r)return{x:n,y:r,width:i-n,height:a-r}},registerShape:eu,getShapeClass:function(t){if(Ql.hasOwnProperty(t))return Ql[t]},Group:Mi,Image:Lo,Text:Fo,Circle:al,Ellipse:sl,Sector:wl,Ring:Ml,Polygon:Dl,Polyline:kl,Rect:Eo,Line:Ol,BezierCurve:Bl,Arc:Fl,IncrementalDisplayable:Kl,CompoundPath:Vl,LinearGradient:Gl,RadialGradient:Wl,BoundingRect:bn}),h_=Object.freeze({__proto__:null,addCommas:Mh,toCamelCase:function(t,e){return t=(t||"").toLowerCase().replace(/-(.)/g,(function(t,e){return e.toUpperCase()})),e&&t&&(t=t.charAt(0).toUpperCase()+t.slice(1)),t},normalizeCssArray:Th,encodeHTML:Dh,formatTpl:Lh,getTooltipMarker:function(t,e){var n=V(t)?{color:t,extraCssText:e}:t||{},i=n.color,r=n.type;e=n.extraCssText;var a=n.renderMode||"html";return i?"html"===a?"subItem"===r?'<span style="display:inline-block;vertical-align:middle;margin-right:8px;margin-left:3px;border-radius:4px;width:4px;height:4px;background-color:'+Dh(i)+";"+(e||"")+'"></span>':'<span style="display:inline-block;margin-right:4px;border-radius:10px;width:10px;height:10px;background-color:'+Dh(i)+";"+(e||"")+'"></span>':{renderMode:a,content:"{"+(n.markerId||"markerX")+"|}  ",style:"subItem"===r?{width:4,height:4,borderRadius:2,backgroundColor:i}:{width:10,height:10,borderRadius:5,backgroundColor:i}}:""},formatTime:function(t,e,n){"week"!==t&&"month"!==t&&"quarter"!==t&&"half-year"!==t&&"year"!==t||(t="MM-dd\nyyyy");var i=Gi(e),r=n?"UTC":"",a=i["get"+r+"FullYear"](),o=i["get"+r+"Month"]()+1,s=i["get"+r+"Date"](),l=i["get"+r+"Hours"](),u=i["get"+r+"Minutes"](),h=i["get"+r+"Seconds"](),c=i["get"+r+"Milliseconds"]();return t=t.replace("MM",rh(o,2)).replace("M",o).replace("yyyy",a).replace("yy",a%100+"").replace("dd",rh(s,2)).replace("d",s).replace("hh",rh(l,2)).replace("h",l).replace("mm",rh(u,2)).replace("m",u).replace("ss",rh(h,2)).replace("s",h).replace("SSS",rh(c,3))},capitalFirst:function(t){return t?t.charAt(0).toUpperCase()+t.substr(1):t},truncateText:Br,getTextRect:function(t,e,n,i,r,a,o,s){return Ki(),new Fo({style:{text:t,font:e,align:n,verticalAlign:i,padding:r,rich:a,overflow:o?"truncate":null,lineHeight:s}}).getBoundingRect()}}),c_=Object.freeze({__proto__:null,map:P,each:L,indexOf:A,inherits:D,reduce:O,filter:R,bind:E,curry:B,isArray:z,isString:V,isObject:W,isFunction:F,extend:M,defaults:T,clone:w,merge:S}),p_=hr();function f_(t){return"category"===t.type?function(t){var e=t.getLabelModel(),n=g_(t,e);return!e.get("show")||t.scale.isBlank()?{labels:[],labelCategoryInterval:n.labelCategoryInterval}:n}(t):function(t){var e=t.scale.getTicks(),n=t_(t);return{labels:P(e,(function(e,i){return{formattedLabel:n(e,i),rawLabel:t.scale.getLabel(e),tickValue:e.value}}))}}(t)}function d_(t,e){return"category"===t.type?function(t,e){var n,i,r=y_(t,"ticks"),a=n_(e),o=v_(r,a);if(o)return o;e.get("show")&&!t.scale.isBlank()||(n=[]);if(F(a))n=x_(t,a,!0);else if("auto"===a){var s=g_(t,t.getLabelModel());i=s.labelCategoryInterval,n=P(s.labels,(function(t){return t.tickValue}))}else n=__(t,i=a,!0);return m_(r,a,{ticks:n,tickCategoryInterval:i})}(t,e):{ticks:P(t.scale.getTicks(),(function(t){return t.value}))}}function g_(t,e){var n,i,r=y_(t,"labels"),a=n_(e),o=v_(r,a);return o||(F(a)?n=x_(t,a):(i="auto"===a?function(t){var e=p_(t).autoInterval;return null!=e?e:p_(t).autoInterval=t.calculateCategoryInterval()}(t):a,n=__(t,i)),m_(r,a,{labels:n,labelCategoryInterval:i}))}function y_(t,e){return p_(t)[e]||(p_(t)[e]=[])}function v_(t,e){for(var n=0;n<t.length;n++)if(t[n].key===e)return t[n].value}function m_(t,e,n){return t.push({key:e,value:n}),n}function __(t,e,n){var i=t_(t),r=t.scale,a=r.getExtent(),o=t.getLabelModel(),s=[],l=Math.max((e||0)+1,1),u=a[0],h=r.count();0!==u&&l>1&&h/l>2&&(u=Math.round(Math.ceil(u/l)*l));var c=i_(t),p=o.get("showMinLabel")||c,f=o.get("showMaxLabel")||c;p&&u!==a[0]&&g(a[0]);for(var d=u;d<=a[1];d+=l)g(d);function g(t){var e={value:t};s.push(n?t:{formattedLabel:i(e),rawLabel:r.getLabel(e),tickValue:t})}return f&&d-l!==a[1]&&g(a[1]),s}function x_(t,e,n){var i=t.scale,r=t_(t),a=[];return L(i.getTicks(),(function(t){var o=i.getLabel(t),s=t.value;e(t.value,o)&&a.push(n?s:{formattedLabel:r(t),rawLabel:o,tickValue:s})})),a}var b_=[0,1],w_=function(){function t(t,e,n){this.onBand=!1,this.inverse=!1,this.dim=t,this.scale=e,this._extent=n||[0,0]}return t.prototype.contain=function(t){var e=this._extent,n=Math.min(e[0],e[1]),i=Math.max(e[0],e[1]);return t>=n&&t<=i},t.prototype.containData=function(t){return this.scale.contain(t)},t.prototype.getExtent=function(){return this._extent.slice()},t.prototype.getPixelPrecision=function(t){return Bi(t||this.scale.getExtent(),this._extent)},t.prototype.setExtent=function(t,e){var n=this._extent;n[0]=t,n[1]=e},t.prototype.dataToCoord=function(t,e){var n=this._extent,i=this.scale;return t=i.normalize(t),this.onBand&&"ordinal"===i.type&&S_(n=n.slice(),i.count()),Oi(t,b_,n,e)},t.prototype.coordToData=function(t,e){var n=this._extent,i=this.scale;this.onBand&&"ordinal"===i.type&&S_(n=n.slice(),i.count());var r=Oi(t,n,b_,e);return this.scale.scale(r)},t.prototype.pointToData=function(t,e){},t.prototype.getTicksCoords=function(t){var e=(t=t||{}).tickModel||this.getTickModel(),n=P(d_(this,e).ticks,(function(t){return{coord:this.dataToCoord("ordinal"===this.scale.type?this.scale.getRawOrdinalNumber(t):t),tickValue:t}}),this);return function(t,e,n,i){var r=e.length;if(!t.onBand||n||!r)return;var a,o,s=t.getExtent();if(1===r)e[0].coord=s[0],a=e[1]={coord:s[0]};else{var l=e[r-1].tickValue-e[0].tickValue,u=(e[r-1].coord-e[0].coord)/l;L(e,(function(t){t.coord-=u/2})),o=1+t.scale.getExtent()[1]-e[r-1].tickValue,a={coord:e[r-1].coord+u*o},e.push(a)}var h=s[0]>s[1];c(e[0].coord,s[0])&&(i?e[0].coord=s[0]:e.shift());i&&c(s[0],e[0].coord)&&e.unshift({coord:s[0]});c(s[1],a.coord)&&(i?a.coord=s[1]:e.pop());i&&c(a.coord,s[1])&&e.push({coord:s[1]});function c(t,e){return t=Ni(t),e=Ni(e),h?t>e:t<e}}(this,n,e.get("alignWithLabel"),t.clamp),n},t.prototype.getMinorTicksCoords=function(){if("ordinal"===this.scale.type)return[];var t=this.model.getModel("minorTick").get("splitNumber");return t>0&&t<100||(t=5),P(this.scale.getMinorTicks(t),(function(t){return P(t,(function(t){return{coord:this.dataToCoord(t),tickValue:t}}),this)}),this)},t.prototype.getViewLabels=function(){return f_(this).labels},t.prototype.getLabelModel=function(){return this.model.getModel("axisLabel")},t.prototype.getTickModel=function(){return this.model.getModel("axisTick")},t.prototype.getBandWidth=function(){var t=this._extent,e=this.scale.getExtent(),n=e[1]-e[0]+(this.onBand?1:0);0===n&&(n=1);var i=Math.abs(t[1]-t[0]);return Math.abs(i)/n},t.prototype.calculateCategoryInterval=function(){return function(t){var e=function(t){var e=t.getLabelModel();return{axisRotate:t.getRotate?t.getRotate():t.isHorizontal&&!t.isHorizontal()?90:0,labelRotate:e.get("rotate")||0,font:e.getFont()}}(t),n=t_(t),i=(e.axisRotate-e.labelRotate)/180*Math.PI,r=t.scale,a=r.getExtent(),o=r.count();if(a[1]-a[0]<1)return 0;var s=1;o>40&&(s=Math.max(1,Math.floor(o/40)));for(var l=a[0],u=t.dataToCoord(l+1)-t.dataToCoord(l),h=Math.abs(u*Math.cos(i)),c=Math.abs(u*Math.sin(i)),p=0,f=0;l<=a[1];l+=s){var d,g,y=An(n({value:l}),e.font,"center","top");d=1.3*y.width,g=1.3*y.height,p=Math.max(p,d,7),f=Math.max(f,g,7)}var v=p/h,m=f/c;isNaN(v)&&(v=1/0),isNaN(m)&&(m=1/0);var _=Math.max(0,Math.floor(Math.min(v,m))),x=p_(t.model),b=t.getExtent(),w=x.lastAutoInterval,S=x.lastTickCount;return null!=w&&null!=S&&Math.abs(w-_)<=1&&Math.abs(S-o)<=1&&w>_&&x.axisExtent0===b[0]&&x.axisExtent1===b[1]?_=w:(x.lastTickCount=o,x.lastAutoInterval=_,x.axisExtent0=b[0],x.axisExtent1=b[1]),_}(this)},t}();function S_(t,e){var n=(t[1]-t[0])/e/2;t[0]+=n,t[1]-=n}function M_(){return!1}function T_(t,e,n){var i=C(),r=e.getWidth(),a=e.getHeight(),o=i.style;return o&&(o.position="absolute",o.left="0",o.top="0",o.width=r+"px",o.height=a+"px",i.setAttribute("data-zr-dom-id",t)),i.width=r*n,i.height=a*n,i}var C_=function(t){function e(e,n,i){var r,a=t.call(this)||this;a.motionBlur=!1,a.lastFrameAlpha=.7,a.dpr=1,a.virtual=!1,a.config={},a.incremental=!1,a.zlevel=0,a.maxRepaintRectCount=5,a.__dirty=!0,a.__firstTimePaint=!0,a.__used=!1,a.__drawIndex=0,a.__startIndex=0,a.__endIndex=0,a.__prevStartIndex=null,a.__prevEndIndex=null,i=i||Rn,"string"==typeof e?r=T_(e,n,i):W(e)&&(e=(r=e).id),a.id=e,a.dom=r;var o=r.style;return o&&(r.onselectstart=M_,o.webkitUserSelect="none",o.userSelect="none",o.webkitTapHighlightColor="rgba(0,0,0,0)",o["-webkit-touch-callout"]="none",o.padding="0",o.margin="0",o.borderWidth="0"),a.domBack=null,a.ctxBack=null,a.painter=n,a.config=null,a.dpr=i,a}return n(e,t),e.prototype.getElementCount=function(){return this.__endIndex-this.__startIndex},e.prototype.afterBrush=function(){this.__prevStartIndex=this.__startIndex,this.__prevEndIndex=this.__endIndex},e.prototype.initContext=function(){this.ctx=this.dom.getContext("2d"),this.ctx.dpr=this.dpr},e.prototype.setUnpainted=function(){this.__firstTimePaint=!0},e.prototype.createBackBuffer=function(){var t=this.dpr;this.domBack=T_("back-"+this.id,this.painter,t),this.ctxBack=this.domBack.getContext("2d"),1!==t&&this.ctxBack.scale(t,t)},e.prototype.createRepaintRects=function(t,e,n,i){if(this.__firstTimePaint)return this.__firstTimePaint=!1,null;var r,a=[],o=this.maxRepaintRectCount,s=!1,l=new bn(0,0,0,0);function u(t){if(t.isFinite()&&!t.isZero())if(0===a.length){(e=new bn(0,0,0,0)).copy(t),a.push(e)}else{for(var e,n=!1,i=1/0,r=0,u=0;u<a.length;++u){var h=a[u];if(h.intersect(t)){var c=new bn(0,0,0,0);c.copy(h),c.union(t),a[u]=c,n=!0;break}if(s){l.copy(t),l.union(h);var p=t.width*t.height,f=h.width*h.height,d=l.width*l.height-p-f;d<i&&(i=d,r=u)}}if(s&&(a[r].union(t),n=!0),!n)(e=new bn(0,0,0,0)).copy(t),a.push(e);s||(s=a.length>=o)}}for(var h=this.__startIndex;h<this.__endIndex;++h){if(f=t[h]){var c=f.shouldBePainted(n,i,!0,!0);(d=f.__isRendered&&(f.__dirty&Gn.REDARAW_BIT||!c)?f.getPrevPaintRect():null)&&u(d);var p=c&&(f.__dirty&Gn.REDARAW_BIT||!f.__isRendered)?f.getPaintRect():null;p&&u(p)}}for(h=this.__prevStartIndex;h<this.__prevEndIndex;++h){var f,d;c=(f=e[h]).shouldBePainted(n,i,!0,!0);if(f&&(!c||!f.__zr)&&f.__isRendered)(d=f.getPrevPaintRect())&&u(d)}do{r=!1;for(h=0;h<a.length;)if(a[h].isZero())a.splice(h,1);else{for(var g=h+1;g<a.length;)a[h].intersect(a[g])?(r=!0,a[h].union(a[g]),a.splice(g,1)):g++;h++}}while(r);return this._paintRects=a,a},e.prototype.debugGetPaintRects=function(){return(this._paintRects||[]).slice()},e.prototype.resize=function(t,e){var n=this.dpr,i=this.dom,r=i.style,a=this.domBack;r&&(r.width=t+"px",r.height=e+"px"),i.width=t*n,i.height=e*n,a&&(a.width=t*n,a.height=e*n,1!==n&&this.ctxBack.scale(n,n))},e.prototype.clear=function(t,e,n){var i=this.dom,r=this.ctx,a=i.width,o=i.height;e=e||this.clearColor;var s=this.motionBlur&&!t,l=this.lastFrameAlpha,u=this.dpr,h=this;s&&(this.domBack||this.createBackBuffer(),this.ctxBack.globalCompositeOperation="copy",this.ctxBack.drawImage(i,0,0,a/u,o/u));var c=this.domBack;function p(t,n,i,a){if(r.clearRect(t,n,i,a),e&&"transparent"!==e){var o=void 0;q(e)?(o=e.__canvasGradient||zd(r,e,{x:0,y:0,width:i,height:a}),e.__canvasGradient=o):j(e)&&(o=Yd(r,e,{dirty:function(){h.setUnpainted(),h.__painter.refresh()}})),r.save(),r.fillStyle=o||e,r.fillRect(t,n,i,a),r.restore()}s&&(r.save(),r.globalAlpha=l,r.drawImage(c,t,n,i,a),r.restore())}!n||s?p(0,0,a,o):n.length&&L(n,(function(t){p(t.x*u,t.y*u,t.width*u,t.height*u)}))},e}(Rt),A_=1e5,D_=314159,I_=.01;function k_(t){return parseInt(t,10)}var L_=function(){function t(t,e,n,i){this.type="canvas",this._zlevelList=[],this._prevDisplayList=[],this._layers={},this._layerConfig={},this._needsManuallyCompositing=!1,this.type="canvas";var r=!t.nodeName||"CANVAS"===t.nodeName.toUpperCase();this._opts=n=M({},n||{}),this.dpr=n.devicePixelRatio||Rn,this._singleCanvas=r,this.root=t;var a=t.style;a&&(a.webkitTapHighlightColor="transparent",a.webkitUserSelect="none",a.userSelect="none",a["-webkit-touch-callout"]="none",t.innerHTML=""),this.storage=e;var o=this._zlevelList;this._prevDisplayList=[];var s=this._layers;if(r){var l=t,u=l.width,h=l.height;null!=n.width&&(u=n.width),null!=n.height&&(h=n.height),this.dpr=n.devicePixelRatio||1,l.width=u*this.dpr,l.height=h*this.dpr,this._width=u,this._height=h;var c=new C_(l,this,this.dpr);c.__builtin__=!0,c.initContext(),s[314159]=c,c.zlevel=D_,o.push(D_),this._domRoot=t}else{this._width=this._getSize(0),this._height=this._getSize(1);var p=this._domRoot=function(t,e){var n=document.createElement("div");return n.style.cssText=["position:relative","width:"+t+"px","height:"+e+"px","padding:0","margin:0","border-width:0"].join(";")+";",n}(this._width,this._height);t.appendChild(p)}}return t.prototype.getType=function(){return"canvas"},t.prototype.isSingleCanvas=function(){return this._singleCanvas},t.prototype.getViewportRoot=function(){return this._domRoot},t.prototype.getViewportRootOffset=function(){var t=this.getViewportRoot();if(t)return{offsetLeft:t.offsetLeft||0,offsetTop:t.offsetTop||0}},t.prototype.refresh=function(t){var e=this.storage.getDisplayList(!0),n=this._prevDisplayList,i=this._zlevelList;this._redrawId=Math.random(),this._paintList(e,n,t,this._redrawId);for(var r=0;r<i.length;r++){var a=i[r],o=this._layers[a];if(!o.__builtin__&&o.refresh){var s=0===r?this._backgroundColor:null;o.refresh(s)}}return this._opts.useDirtyRect&&(this._prevDisplayList=e.slice()),this},t.prototype.refreshHover=function(){this._paintHoverList(this.storage.getDisplayList(!1))},t.prototype._paintHoverList=function(t){var e=t.length,n=this._hoverlayer;if(n&&n.clear(),e){for(var i,r={inHover:!0,viewWidth:this._width,viewHeight:this._height},a=0;a<e;a++){var o=t[a];o.__inHover&&(n||(n=this._hoverlayer=this.getLayer(A_)),i||(i=n.ctx).save(),tg(i,o,r,a===e-1))}i&&i.restore()}},t.prototype.getHoverLayer=function(){return this.getLayer(A_)},t.prototype.paintOne=function(t,e){Qd(t,e)},t.prototype._paintList=function(t,e,n,i){if(this._redrawId===i){n=n||!1,this._updateLayerStatus(t);var r=this._doPaintList(t,e,n),a=r.finished,o=r.needsRefreshHover;if(this._needsManuallyCompositing&&this._compositeManually(),o&&this._paintHoverList(t),a)this.eachLayer((function(t){t.afterBrush&&t.afterBrush()}));else{var s=this;ai((function(){s._paintList(t,e,n,i)}))}}},t.prototype._compositeManually=function(){var t=this.getLayer(D_).ctx,e=this._domRoot.width,n=this._domRoot.height;t.clearRect(0,0,e,n),this.eachBuiltinLayer((function(i){i.virtual&&t.drawImage(i.dom,0,0,e,n)}))},t.prototype._doPaintList=function(t,e,n){for(var i=this,r=[],a=this._opts.useDirtyRect,s=0;s<this._zlevelList.length;s++){var l=this._zlevelList[s],u=this._layers[l];u.__builtin__&&u!==this._hoverlayer&&(u.__dirty||n)&&r.push(u)}for(var h=!0,c=!1,p=function(o){var s=r[o],l=s.ctx,u=a&&s.createRepaintRects(t,e,f._width,f._height);l.save();var p,d=n?s.__startIndex:s.__drawIndex,g=!n&&s.incremental&&Date.now,y=g&&Date.now(),v=s.zlevel===f._zlevelList[0]?f._backgroundColor:null;if(s.__startIndex===s.__endIndex)s.clear(!1,v,u);else if(d===s.__startIndex){var m=t[d];m.incremental&&m.notClear&&!n||s.clear(!1,v,u)}-1===d&&(console.error("For some unknown reason. drawIndex is -1"),d=s.__startIndex);var _=function(e){var n={inHover:!1,allClipped:!1,prevEl:null,viewWidth:i._width,viewHeight:i._height};for(p=d;p<s.__endIndex;p++){var r=t[p];if(r.__inHover&&(c=!0),i._doPaintEl(r,s,a,e,n,p===s.__endIndex-1),g)if(Date.now()-y>15)break}n.prevElClipPaths&&l.restore()};if(u)if(0===u.length)p=s.__endIndex;else for(var x=f.dpr,b=0;b<u.length;++b){var w=u[b];l.save(),l.beginPath(),l.rect(w.x*x,w.y*x,w.width*x,w.height*x),l.clip(),_(w),l.restore()}else l.save(),_(),l.restore();s.__drawIndex=p,s.__drawIndex<s.__endIndex&&(h=!1)},f=this,d=0;d<r.length;d++)p(d);return o.wxa&&L(this._layers,(function(t){t&&t.ctx&&t.ctx.draw&&t.ctx.draw()})),{finished:h,needsRefreshHover:c}},t.prototype._doPaintEl=function(t,e,n,i,r,a){var o=e.ctx;if(n){var s=t.getPaintRect();(!i||s&&s.intersect(i))&&(tg(o,t,r,a),t.setPrevPaintRect(s))}else tg(o,t,r,a)},t.prototype.getLayer=function(t,e){this._singleCanvas&&!this._needsManuallyCompositing&&(t=D_);var n=this._layers[t];return n||((n=new C_("zr_"+t,this,this.dpr)).zlevel=t,n.__builtin__=!0,this._layerConfig[t]?S(n,this._layerConfig[t],!0):this._layerConfig[t-I_]&&S(n,this._layerConfig[t-I_],!0),e&&(n.virtual=e),this.insertLayer(t,n),n.initContext()),n},t.prototype.insertLayer=function(t,e){var n=this._layers,i=this._zlevelList,r=i.length,a=this._domRoot,o=null,s=-1;if(n[t])b("ZLevel "+t+" has been used already");else if(function(t){return!!t&&(!!t.__builtin__||"function"==typeof t.resize&&"function"==typeof t.refresh)}(e)){if(r>0&&t>i[0]){for(s=0;s<r-1&&!(i[s]<t&&i[s+1]>t);s++);o=n[i[s]]}if(i.splice(s+1,0,t),n[t]=e,!e.virtual)if(o){var l=o.dom;l.nextSibling?a.insertBefore(e.dom,l.nextSibling):a.appendChild(e.dom)}else a.firstChild?a.insertBefore(e.dom,a.firstChild):a.appendChild(e.dom);e.__painter=this}else b("Layer of zlevel "+t+" is not valid")},t.prototype.eachLayer=function(t,e){for(var n=this._zlevelList,i=0;i<n.length;i++){var r=n[i];t.call(e,this._layers[r],r)}},t.prototype.eachBuiltinLayer=function(t,e){for(var n=this._zlevelList,i=0;i<n.length;i++){var r=n[i],a=this._layers[r];a.__builtin__&&t.call(e,a,r)}},t.prototype.eachOtherLayer=function(t,e){for(var n=this._zlevelList,i=0;i<n.length;i++){var r=n[i],a=this._layers[r];a.__builtin__||t.call(e,a,r)}},t.prototype.getLayers=function(){return this._layers},t.prototype._updateLayerStatus=function(t){function e(t){a&&(a.__endIndex!==t&&(a.__dirty=!0),a.__endIndex=t)}if(this.eachBuiltinLayer((function(t,e){t.__dirty=t.__used=!1})),this._singleCanvas)for(var n=1;n<t.length;n++){if((s=t[n]).zlevel!==t[n-1].zlevel||s.incremental){this._needsManuallyCompositing=!0;break}}var i,r,a=null,o=0;for(r=0;r<t.length;r++){var s,l=(s=t[r]).zlevel,u=void 0;i!==l&&(i=l,o=0),s.incremental?((u=this.getLayer(l+.001,this._needsManuallyCompositing)).incremental=!0,o=1):u=this.getLayer(l+(o>0?I_:0),this._needsManuallyCompositing),u.__builtin__||b("ZLevel "+l+" has been used by unkown layer "+u.id),u!==a&&(u.__used=!0,u.__startIndex!==r&&(u.__dirty=!0),u.__startIndex=r,u.incremental?u.__drawIndex=-1:u.__drawIndex=r,e(r),a=u),s.__dirty&Gn.REDARAW_BIT&&!s.__inHover&&(u.__dirty=!0,u.incremental&&u.__drawIndex<0&&(u.__drawIndex=r))}e(r),this.eachBuiltinLayer((function(t,e){!t.__used&&t.getElementCount()>0&&(t.__dirty=!0,t.__startIndex=t.__endIndex=t.__drawIndex=0),t.__dirty&&t.__drawIndex<0&&(t.__drawIndex=t.__startIndex)}))},t.prototype.clear=function(){return this.eachBuiltinLayer(this._clearLayer),this},t.prototype._clearLayer=function(t){t.clear()},t.prototype.setBackgroundColor=function(t){this._backgroundColor=t,L(this._layers,(function(t){t.setUnpainted()}))},t.prototype.configLayer=function(t,e){if(e){var n=this._layerConfig;n[t]?S(n[t],e,!0):n[t]=e;for(var i=0;i<this._zlevelList.length;i++){var r=this._zlevelList[i];if(r===t||r===t+I_)S(this._layers[r],n[t],!0)}}},t.prototype.delLayer=function(t){var e=this._layers,n=this._zlevelList,i=e[t];i&&(i.dom.parentNode.removeChild(i.dom),delete e[t],n.splice(A(n,t),1))},t.prototype.resize=function(t,e){if(this._domRoot.style){var n=this._domRoot;n.style.display="none";var i=this._opts;if(null!=t&&(i.width=t),null!=e&&(i.height=e),t=this._getSize(0),e=this._getSize(1),n.style.display="",this._width!==t||e!==this._height){for(var r in n.style.width=t+"px",n.style.height=e+"px",this._layers)this._layers.hasOwnProperty(r)&&this._layers[r].resize(t,e);this.refresh(!0)}this._width=t,this._height=e}else{if(null==t||null==e)return;this._width=t,this._height=e,this.getLayer(D_).resize(t,e)}return this},t.prototype.clearLayer=function(t){var e=this._layers[t];e&&e.clear()},t.prototype.dispose=function(){this.root.innerHTML="",this.root=this.storage=this._domRoot=this._layers=null},t.prototype.getRenderedCanvas=function(t){if(t=t||{},this._singleCanvas&&!this._compositeManually)return this._layers[314159].dom;var e=new C_("image",this,t.pixelRatio||this.dpr);e.initContext(),e.clear(!1,t.backgroundColor||this._backgroundColor);var n=e.ctx;if(t.pixelRatio<=this.dpr){this.refresh();var i=e.dom.width,r=e.dom.height;this.eachLayer((function(t){t.__builtin__?n.drawImage(t.dom,0,0,i,r):t.renderToCanvas&&(n.save(),t.renderToCanvas(n),n.restore())}))}else for(var a={inHover:!1,viewWidth:this._width,viewHeight:this._height},o=this.storage.getDisplayList(!0),s=0,l=o.length;s<l;s++){var u=o[s];tg(n,u,a,s===l-1)}return e.dom},t.prototype.getWidth=function(){return this._width},t.prototype.getHeight=function(){return this._height},t.prototype._getSize=function(t){var e=this._opts,n=["width","height"][t],i=["clientWidth","clientHeight"][t],r=["paddingLeft","paddingTop"][t],a=["paddingRight","paddingBottom"][t];if(null!=e[n]&&"auto"!==e[n])return parseFloat(e[n]);var o=this.root,s=document.defaultView.getComputedStyle(o);return(o[i]||k_(s[n])||k_(o.style[n]))-(k_(s[r])||0)-(k_(s[a])||0)|0},t.prototype.pathToImage=function(t,e){e=e||this.dpr;var n=document.createElement("canvas"),i=n.getContext("2d"),r=t.getBoundingRect(),a=t.style,o=a.shadowBlur*e,s=a.shadowOffsetX*e,l=a.shadowOffsetY*e,u=t.hasStroke()?a.lineWidth:0,h=Math.max(u/2,-s+o),c=Math.max(u/2,s+o),p=Math.max(u/2,-l+o),f=Math.max(u/2,l+o),d=r.width+h+c,g=r.height+p+f;n.width=d*e,n.height=g*e,i.scale(e,e),i.clearRect(0,0,d,g),i.dpr=e;var y={x:t.x,y:t.y,scaleX:t.scaleX,scaleY:t.scaleY,rotation:t.rotation,originX:t.originX,originY:t.originY};t.x=h-r.x,t.y=p-r.y,t.rotation=0,t.scaleX=1,t.scaleY=1,t.updateTransform(),t&&tg(i,t,{inHover:!1,viewWidth:this._width,viewHeight:this._height},!0);var v=new Lo({style:{x:0,y:0,image:n}});return M(t,y),v},t}();var P_=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.hasSymbolVisual=!0,n}return n(e,t),e.prototype.getInitialData=function(t){return im(this.getSource(),this,{useEncodeDefaulter:!0})},e.prototype.getLegendIcon=function(t){var e=new Mi,n=Bd("line",0,t.itemHeight/2,t.itemWidth,0,t.lineStyle.stroke,!1);e.add(n),n.setStyle(t.lineStyle);var i=this.getData().getVisual("symbol"),r="none"===i?"circle":i,a=.8*t.itemHeight,o=Bd(r,(t.itemWidth-a)/2,(t.itemHeight-a)/2,a,a,t.itemStyle.fill,t.symbolKeepAspect);return e.add(o),o.setStyle(t.itemStyle),r.indexOf("empty")>-1&&(o.style.stroke=o.style.fill,o.style.fill="#fff",o.style.lineWidth=2),e},e.type="series.line",e.dependencies=["grid","polar"],e.defaultOption={zlevel:0,z:3,coordinateSystem:"cartesian2d",legendHoverLink:!0,clip:!0,label:{position:"top"},endLabel:{show:!1,valueAnimation:!0,distance:8},lineStyle:{width:2,type:"solid"},emphasis:{scale:!0,lineStyle:{width:"bolder"}},step:!1,smooth:!1,smoothMonotone:null,symbol:"emptyCircle",symbolSize:4,symbolRotate:null,showSymbol:!0,showAllSymbol:"auto",connectNulls:!1,sampling:"none",animationEasing:"linear",progressive:0,hoverLayerThreshold:1/0},e}(Up);function O_(t,e){var n=t.mapDimensionsAll("defaultedLabel"),i=n.length;if(1===i){var r=bp(t,e,n[0]);return null!=r?r+"":null}if(i){for(var a=[],o=0;o<n.length;o++)a.push(bp(t,e,n[o]));return a.join(" ")}}function R_(t,e){var n=t.mapDimensionsAll("defaultedLabel");if(!z(e))return e+"";for(var i=[],r=0;r<n.length;r++){var a=t.getDimensionInfo(n[r]);a&&i.push(e[a.index])}return i.join(" ")}var N_=function(t){function e(e,n,i,r){var a=t.call(this)||this;return a.updateData(e,n,i,r),a}return n(e,t),e.prototype._createSymbol=function(t,e,n,i,r){this.removeAll();var a=Bd(t,-1,-1,2,2,null,r);a.attr({z2:100,culling:!0,scaleX:i[0]/2,scaleY:i[1]/2}),a.drift=E_,this._symbolType=t,this.add(a)},e.prototype.stopSymbolAnimation=function(t){this.childAt(0).stopAnimation(null,t)},e.prototype.getSymbolPath=function(){return this.childAt(0)},e.prototype.highlight=function(){bs(this.childAt(0))},e.prototype.downplay=function(){ws(this.childAt(0))},e.prototype.setZ=function(t,e){var n=this.childAt(0);n.zlevel=t,n.z=e},e.prototype.setDraggable=function(t){var e=this.childAt(0);e.draggable=t,e.cursor=t?"move":e.cursor},e.prototype.updateData=function(t,n,i,r){this.silent=!1;var a=t.getItemVisual(n,"symbol")||"circle",o=t.hostModel,s=e.getSymbolSize(t,n),l=a!==this._symbolType,u=r&&r.disableAnimation;if(l){var h=t.getItemVisual(n,"symbolKeepAspect");this._createSymbol(a,t,n,s,h)}else{(p=this.childAt(0)).silent=!1;var c={scaleX:s[0]/2,scaleY:s[1]/2};u?p.attr(c):lu(p,c,o,n)}if(this._updateCommon(t,n,s,i,r),l){var p=this.childAt(0);if(!u){c={scaleX:this._sizeX,scaleY:this._sizeY,style:{opacity:p.style.opacity}};p.scaleX=p.scaleY=0,p.style.opacity=0,uu(p,c,o,n)}}u&&this.childAt(0).stopAnimation("remove"),this._seriesModel=o},e.prototype._updateCommon=function(t,e,n,i,r){var a,o,s,l,u,h,c,p,f=this.childAt(0),d=t.hostModel;if(i&&(a=i.emphasisItemStyle,o=i.blurItemStyle,s=i.selectItemStyle,l=i.focus,u=i.blurScope,h=i.labelStatesModels,c=i.hoverScale,p=i.cursorStyle),!i||t.hasItemOption){var g=i&&i.itemModel?i.itemModel:t.getItemModel(e),y=g.getModel("emphasis");a=y.getModel("itemStyle").getItemStyle(),s=g.getModel(["select","itemStyle"]).getItemStyle(),o=g.getModel(["blur","itemStyle"]).getItemStyle(),l=y.get("focus"),u=y.get("blurScope"),h=_u(g),c=y.getShallow("scale"),p=g.getShallow("cursor")}var v=t.getItemVisual(e,"symbolRotate");f.attr("rotation",(v||0)*Math.PI/180||0);var m=t.getItemVisual(e,"symbolOffset")||0;m&&(z(m)||(m=[m,m]),f.x=Ri(m[0],n[0]),f.y=Ri(J(m[1],m[0])||0,n[1])),p&&f.attr("cursor",p);var _=t.getItemVisual(e,"style"),x=_.fill;if(f instanceof Lo){var b=f.style;f.useStyle(M({image:b.image,x:b.x,y:b.y,width:b.width,height:b.height},_))}else f.__isEmptyBrush?f.useStyle(M({},_)):f.useStyle(_),f.style.decal=null,f.setColor(x,r&&r.symbolInnerColor),f.style.strokeNoScale=!0;var w=t.getItemVisual(e,"liftZ"),S=this._z2;null!=w?null==S&&(this._z2=f.z2,f.z2+=w):null!=S&&(f.z2=S,this._z2=null);var T=r&&r.useNameLabel;mu(f,h,{labelFetcher:d,labelDataIndex:e,defaultText:function(e){return T?t.getName(e):O_(t,e)},inheritColor:x,defaultOpacity:_.opacity}),this._sizeX=n[0]/2,this._sizeY=n[1]/2;var C=f.ensureState("emphasis");if(C.style=a,f.ensureState("select").style=s,f.ensureState("blur").style=o,c){var A=Math.max(1.1,3/this._sizeY);C.scaleX=this._sizeX*A,C.scaleY=this._sizeY*A}this.setSymbolScale(1),Os(this,l,u)},e.prototype.setSymbolScale=function(t){this.scaleX=this.scaleY=t},e.prototype.fadeOut=function(t,e){var n=this.childAt(0),i=this._seriesModel,r=qo(this).dataIndex,a=e&&e.animation;if(this.silent=n.silent=!0,e&&e.fadeLabel){var o=n.getTextContent();o&&hu(o,{style:{opacity:0}},i,{dataIndex:r,removeOpt:a,cb:function(){n.removeTextContent()}})}else n.removeTextContent();hu(n,{style:{opacity:0},scaleX:0,scaleY:0},i,{dataIndex:r,cb:t,removeOpt:a})},e.getSymbolSize=function(t,e){var n=t.getItemVisual(e,"symbolSize");return z(n)?n.slice():[+n,+n]},e}(Mi);function E_(t,e){this.parent.drift(t,e)}function B_(t,e,n,i){return e&&!isNaN(e[0])&&!isNaN(e[1])&&!(i.isIgnore&&i.isIgnore(n))&&!(i.clipShape&&!i.clipShape.contain(e[0],e[1]))&&"none"!==t.getItemVisual(n,"symbol")}function z_(t){return null==t||W(t)||(t={isIgnore:t}),t||{}}function F_(t){var e=t.hostModel,n=e.getModel("emphasis");return{emphasisItemStyle:n.getModel("itemStyle").getItemStyle(),blurItemStyle:e.getModel(["blur","itemStyle"]).getItemStyle(),selectItemStyle:e.getModel(["select","itemStyle"]).getItemStyle(),focus:n.get("focus"),blurScope:n.get("blurScope"),hoverScale:n.get("scale"),labelStatesModels:_u(e),cursorStyle:e.get("cursor")}}var V_=function(){function t(t){this.group=new Mi,this._SymbolCtor=t||N_}return t.prototype.updateData=function(t,e){e=z_(e);var n=this.group,i=t.hostModel,r=this._data,a=this._SymbolCtor,o=e.disableAnimation,s=F_(t),l={disableAnimation:o},u=e.getSymbolPoint||function(e){return t.getItemLayout(e)};r||n.removeAll(),t.diff(r).add((function(i){var r=u(i);if(B_(t,r,i,e)){var o=new a(t,i,s,l);o.setPosition(r),t.setItemGraphicEl(i,o),n.add(o)}})).update((function(h,c){var p=r.getItemGraphicEl(c),f=u(h);if(B_(t,f,h,e)){if(p){p.updateData(t,h,s,l);var d={x:f[0],y:f[1]};o?p.attr(d):lu(p,d,i)}else(p=new a(t,h)).setPosition(f);n.add(p),t.setItemGraphicEl(h,p)}else n.remove(p)})).remove((function(t){var e=r.getItemGraphicEl(t);e&&e.fadeOut((function(){n.remove(e)}))})).execute(),this._getSymbolPoint=u,this._data=t},t.prototype.isPersistent=function(){return!0},t.prototype.updateLayout=function(){var t=this,e=this._data;e&&e.eachItemGraphicEl((function(e,n){var i=t._getSymbolPoint(n);e.setPosition(i),e.markRedraw()}))},t.prototype.incrementalPrepareUpdate=function(t){this._seriesScope=F_(t),this._data=null,this.group.removeAll()},t.prototype.incrementalUpdate=function(t,e,n){function i(t){t.isGroup||(t.incremental=!0,t.ensureState("emphasis").hoverLayer=!0)}n=z_(n);for(var r=t.start;r<t.end;r++){var a=e.getItemLayout(r);if(B_(e,a,r,n)){var o=new this._SymbolCtor(e,r,this._seriesScope);o.traverse(i),o.setPosition(a),this.group.add(o),e.setItemGraphicEl(r,o)}}},t.prototype.remove=function(t){var e=this.group,n=this._data;n&&t?n.eachItemGraphicEl((function(t){t.fadeOut((function(){e.remove(t)}))})):e.removeAll()},t}();function H_(t,e,n){var i=t.getBaseAxis(),r=t.getOtherAxis(i),a=function(t,e){var n=0,i=t.scale.getExtent();"start"===e?n=i[0]:"end"===e?n=i[1]:i[0]>0?n=i[0]:i[1]<0&&(n=i[1]);return n}(r,n),o=i.dim,s=r.dim,l=e.mapDimension(s),u=e.mapDimension(o),h="x"===s||"radius"===s?1:0,c=P(t.dimensions,(function(t){return e.mapDimension(t)})),p=!1,f=e.getCalculationInfo("stackResultDimension");return em(e,c[0])&&(p=!0,c[0]=f),em(e,c[1])&&(p=!0,c[1]=f),{dataDimsForPoint:c,valueStart:a,valueAxisDim:s,baseAxisDim:o,stacked:!!p,valueDim:l,baseDim:u,baseDataOffset:h,stackedOverDimension:e.getCalculationInfo("stackedOverDimension")}}function G_(t,e,n,i){var r=NaN;t.stacked&&(r=n.get(n.getCalculationInfo("stackedOverDimension"),i)),isNaN(r)&&(r=t.valueStart);var a=t.baseDataOffset,o=[];return o[a]=n.get(t.baseDim,i),o[1-a]=r,e.dataToPoint(o)}var W_="undefined"!=typeof Float32Array,U_=W_?Float32Array:Array;function Y_(t){return z(t)?W_?new Float32Array(t):t:new U_(t)}var X_=Math.min,q_=Math.max;function j_(t,e){return isNaN(t)||isNaN(e)}function Z_(t,e,n,i,r,a,o,s,l){for(var u,h,c,p,f,d,g=n,y=0;y<i;y++){var v=e[2*g],m=e[2*g+1];if(g>=r||g<0)break;if(j_(v,m)){if(l){g+=a;continue}break}if(g===n)t[a>0?"moveTo":"lineTo"](v,m),c=v,p=m;else{var _=v-u,x=m-h;if(_*_+x*x<.5){g+=a;continue}if(o>0){var b=g+a,w=e[2*b],S=e[2*b+1],M=y+1;if(l)for(;j_(w,S)&&M<i;)M++,w=e[2*(b+=a)],S=e[2*b+1];var T=.5,C=0,A=0,D=void 0,I=void 0;if(M>=i||j_(w,S))f=v,d=m;else{C=w-u,A=S-h;var k=v-u,L=w-v,P=m-h,O=S-m,R=void 0,N=void 0;"x"===s?(R=Math.abs(k),N=Math.abs(L),f=v-R*o,d=m,D=v+R*o,I=m):"y"===s?(R=Math.abs(P),N=Math.abs(O),f=v,d=m-R*o,D=v,I=m+R*o):(R=Math.sqrt(k*k+P*P),f=v-C*o*(1-(T=(N=Math.sqrt(L*L+O*O))/(N+R))),d=m-A*o*(1-T),I=m+A*o*T,D=X_(D=v+C*o*T,q_(w,v)),I=X_(I,q_(S,m)),D=q_(D,X_(w,v)),d=m-(A=(I=q_(I,X_(S,m)))-m)*R/N,f=X_(f=v-(C=D-v)*R/N,q_(u,v)),d=X_(d,q_(h,m)),D=v+(C=v-(f=q_(f,X_(u,v))))*N/R,I=m+(A=m-(d=q_(d,X_(h,m))))*N/R)}t.bezierCurveTo(c,p,f,d,v,m),c=D,p=I}else t.lineTo(v,m)}u=v,h=m,g+=a}return y}var K_=function(){this.smooth=0,this.smoothConstraint=!0},$_=function(t){function e(e){var n=t.call(this,e)||this;return n.type="ec-polyline",n}return n(e,t),e.prototype.getDefaultStyle=function(){return{stroke:"#000",fill:null}},e.prototype.getDefaultShape=function(){return new K_},e.prototype.buildPath=function(t,e){var n=e.points,i=0,r=n.length/2;if(e.connectNulls){for(;r>0&&j_(n[2*r-2],n[2*r-1]);r--);for(;i<r&&j_(n[2*i],n[2*i+1]);i++);}for(;i<r;)i+=Z_(t,n,i,r,r,1,e.smooth,e.smoothMonotone,e.connectNulls)+1},e.prototype.getPointOn=function(t,e){this.path||(this.createPathProxy(),this.buildPath(this.path,this.shape));for(var n,i,r=this.path.data,a=ao.CMD,o="x"===e,s=[],l=0;l<r.length;){var u=void 0,h=void 0,c=void 0,p=void 0,f=void 0,d=void 0,g=void 0;switch(r[l++]){case a.M:n=r[l++],i=r[l++];break;case a.L:if(u=r[l++],h=r[l++],(g=o?(t-n)/(u-n):(t-i)/(h-i))<=1&&g>=0){var y=o?(h-i)*g+i:(u-n)*g+n;return o?[t,y]:[y,t]}n=u,i=h;break;case a.C:u=r[l++],h=r[l++],c=r[l++],p=r[l++],f=r[l++],d=r[l++];var v=o?da(n,u,c,f,t,s):da(i,h,p,d,t,s);if(v>0)for(var m=0;m<v;m++){var _=s[m];if(_<=1&&_>=0){y=o?pa(i,h,p,d,_):pa(n,u,c,f,_);return o?[t,y]:[y,t]}}n=f,i=d}}},e}(Co),J_=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e}(K_),Q_=function(t){function e(e){var n=t.call(this,e)||this;return n.type="ec-polygon",n}return n(e,t),e.prototype.getDefaultShape=function(){return new J_},e.prototype.buildPath=function(t,e){var n=e.points,i=e.stackedOnPoints,r=0,a=n.length/2,o=e.smoothMonotone;if(e.connectNulls){for(;a>0&&j_(n[2*a-2],n[2*a-1]);a--);for(;r<a&&j_(n[2*r],n[2*r+1]);r++);}for(;r<a;){var s=Z_(t,n,r,a,a,1,e.smooth,o,e.connectNulls);Z_(t,i,r+s-1,s,a,-1,e.stackedOnSmooth,o,e.connectNulls),r+=s+1,t.closePath()}},e}(Co);function tx(t,e,n,i,r){var a=t.getArea(),o=a.x,s=a.y,l=a.width,u=a.height,h=n.get(["lineStyle","width"])||2;o-=h/2,s-=h/2,l+=h,u+=h,o=Math.floor(o),l=Math.round(l);var c=new Eo({shape:{x:o,y:s,width:l,height:u}});if(e){var p=t.getBaseAxis(),f=p.isHorizontal(),d=p.inverse;f?(d&&(c.shape.x+=l),c.shape.width=0):(d||(c.shape.y+=u),c.shape.height=0),uu(c,{shape:{width:l,height:u,x:o,y:s}},n,null,i,"function"==typeof r?function(t){r(t,c)}:null)}return c}function ex(t,e,n){var i=t.getArea(),r=Ni(i.r0,1),a=Ni(i.r,1),o=new wl({shape:{cx:Ni(t.cx,1),cy:Ni(t.cy,1),r0:r,r:a,startAngle:i.startAngle,endAngle:i.endAngle,clockwise:i.clockwise}});e&&("angle"===t.getBaseAxis().dim?o.shape.endAngle=i.startAngle:o.shape.r=r,uu(o,{shape:{endAngle:i.endAngle,r:a}},n));return o}function nx(t,e){return t.type===e}function ix(t,e){if(t.length===e.length){for(var n=0;n<t.length;n++)if(t[n]!==e[n])return;return!0}}function rx(t){for(var e=1/0,n=1/0,i=-1/0,r=-1/0,a=0;a<t.length;){var o=t[a++],s=t[a++];isNaN(o)||(e=Math.min(o,e),i=Math.max(o,i)),isNaN(s)||(n=Math.min(s,n),r=Math.max(s,r))}return[[e,n],[i,r]]}function ax(t,e){var n=rx(t),i=n[0],r=n[1],a=rx(e),o=a[0],s=a[1];return Math.max(Math.abs(i[0]-o[0]),Math.abs(i[1]-o[1]),Math.abs(r[0]-s[0]),Math.abs(r[1]-s[1]))}function ox(t){return"number"==typeof t?t:t?.5:0}function sx(t,e,n){for(var i=e.getBaseAxis(),r="x"===i.dim||"radius"===i.dim?0:1,a=[],o=0,s=[],l=[],u=[];o<t.length-2;o+=2)switch(u[0]=t[o+2],u[1]=t[o+3],l[0]=t[o],l[1]=t[o+1],a.push(l[0],l[1]),n){case"end":s[r]=u[r],s[1-r]=l[1-r],a.push(s[0],s[1]);break;case"middle":var h=(l[r]+u[r])/2,c=[];s[r]=c[r]=h,s[1-r]=l[1-r],c[1-r]=u[1-r],a.push(s[0],s[1]),a.push(c[0],c[1]);break;default:s[r]=l[r],s[1-r]=u[1-r],a.push(s[0],s[1])}return a.push(t[o++],t[o++]),a}function lx(t,e,n){var i=t.get("showAllSymbol"),r="auto"===i;if(!i||r){var a=n.getAxesByScale("ordinal")[0];if(a&&(!r||!function(t,e){var n=t.getExtent(),i=Math.abs(n[1]-n[0])/t.scale.count();isNaN(i)&&(i=0);for(var r=e.count(),a=Math.max(1,Math.round(r/5)),o=0;o<r;o+=a)if(1.5*N_.getSymbolSize(e,o)[t.isHorizontal()?1:0]>i)return!1;return!0}(a,e))){var o=e.mapDimension(a.dim),s={};return L(a.getViewLabels(),(function(t){var e=a.scale.getRawOrdinalNumber(t.tickValue);s[e]=1})),function(t){return!s.hasOwnProperty(e.get(o,t))}}}}function ux(t,e){return[t[2*e],t[2*e+1]]}function hx(t,e,n,i){if(nx(e,"cartesian2d")){var r=i.getModel("endLabel"),a=r.get("show"),o=r.get("valueAnimation"),s=i.getData(),l={lastFrameIndex:0},u=a?function(n,i){t._endLabelOnDuring(n,i,s,l,o,r,e)}:null,h=e.getBaseAxis().isHorizontal(),c=tx(e,n,i,(function(){var e=t._endLabel;e&&n&&null!=l.originalX&&e.attr({x:l.originalX,y:l.originalY})}),u);if(!i.get("clip",!0)){var p=c.shape,f=Math.max(p.width,p.height);h?(p.y-=f,p.height+=2*f):(p.x-=f,p.width+=2*f)}return u&&u(1,c),c}return ex(e,n,i)}var cx=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.init=function(){var t=new Mi,e=new V_;this.group.add(e.group),this._symbolDraw=e,this._lineGroup=t},e.prototype.render=function(t,e,n){var i=this,r=t.coordinateSystem,a=this.group,o=t.getData(),s=t.getModel("lineStyle"),l=t.getModel("areaStyle"),u=o.getLayout("points")||[],h="polar"===r.type,c=this._coordSys,p=this._symbolDraw,f=this._polyline,d=this._polygon,g=this._lineGroup,y=t.get("animation"),v=!l.isEmpty(),m=l.get("origin"),_=H_(r,o,m),x=v&&function(t,e,n){if(!n.valueDim)return[];for(var i=e.count(),r=Y_(2*i),a=0;a<i;a++){var o=G_(n,t,e,a);r[2*a]=o[0],r[2*a+1]=o[1]}return r}(r,o,_),b=t.get("showSymbol"),w=b&&!h&&lx(t,o,r),S=this._data;S&&S.eachItemGraphicEl((function(t,e){t.__temp&&(a.remove(t),S.setItemGraphicEl(e,null))})),b||p.remove(),a.add(g);var M,C=!h&&t.get("step");r&&r.getArea&&t.get("clip",!0)&&(null!=(M=r.getArea()).width?(M.x-=.1,M.y-=.1,M.width+=.2,M.height+=.2):M.r0&&(M.r0-=.5,M.r+=.5)),this._clipShapeForSymbol=M;var A=function(t,e){var n=t.getVisual("visualMeta");if(n&&n.length&&t.count()&&"cartesian2d"===e.type){for(var i,r,a=n.length-1;a>=0;a--){var o=n[a].dimension,s=t.dimensions[o],l=t.getDimensionInfo(s);if("x"===(i=l&&l.coordDim)||"y"===i){r=n[a];break}}if(r){var u=e.getAxis(i),h=P(r.stops,(function(t){return{offset:0,coord:u.toGlobalCoord(u.dataToCoord(t.value)),color:t.color}})),c=h.length,p=r.outerColors.slice();c&&h[0].coord>h[c-1].coord&&(h.reverse(),p.reverse());var f=h[0].coord-10,d=h[c-1].coord+10,g=d-f;if(g<.001)return"transparent";L(h,(function(t){t.offset=(t.coord-f)/g})),h.push({offset:c?h[c-1].offset:.5,color:p[1]||"transparent"}),h.unshift({offset:c?h[0].offset:.5,color:p[0]||"transparent"});var y=new Gl(0,0,0,0,h,!0);return y[i]=f,y[i+"2"]=d,y}}}(o,r)||o.getVisual("style")[o.getVisual("drawType")];f&&c.type===r.type&&C===this._step?(v&&!d?d=this._newPolygon(u,x):d&&!v&&(g.remove(d),d=this._polygon=null),h||this._initOrUpdateEndLabel(t,r,Ph(A)),g.setClipPath(hx(this,r,!1,t)),b&&p.updateData(o,{isIgnore:w,clipShape:M,disableAnimation:!0,getSymbolPoint:function(t){return[u[2*t],u[2*t+1]]}}),ix(this._stackedOnPoints,x)&&ix(this._points,u)||(y?this._doUpdateAnimation(o,x,r,n,C,m):(C&&(u=sx(u,r,C),x&&(x=sx(x,r,C))),f.setShape({points:u}),d&&d.setShape({points:u,stackedOnPoints:x})))):(b&&p.updateData(o,{isIgnore:w,clipShape:M,disableAnimation:!0,getSymbolPoint:function(t){return[u[2*t],u[2*t+1]]}}),y&&this._initSymbolLabelAnimation(o,r,M),C&&(u=sx(u,r,C),x&&(x=sx(x,r,C))),f=this._newPolyline(u),v&&(d=this._newPolygon(u,x)),h||this._initOrUpdateEndLabel(t,r,Ph(A)),g.setClipPath(hx(this,r,!0,t)));var D=t.get(["emphasis","focus"]),I=t.get(["emphasis","blurScope"]);(f.useStyle(T(s.getLineStyle(),{fill:"none",stroke:A,lineJoin:"bevel"})),Es(f,t,"lineStyle"),f.style.lineWidth>0&&"bolder"===t.get(["emphasis","lineStyle","width"]))&&(f.getState("emphasis").style.lineWidth=+f.style.lineWidth+1);qo(f).seriesIndex=t.seriesIndex,Os(f,D,I);var k=ox(t.get("smooth")),O=t.get("smoothMonotone"),R=t.get("connectNulls");if(f.setShape({smooth:k,smoothMonotone:O,connectNulls:R}),d){var N=o.getCalculationInfo("stackedOnSeries"),E=0;d.useStyle(T(l.getAreaStyle(),{fill:A,opacity:.7,lineJoin:"bevel",decal:o.getVisual("style").decal})),N&&(E=ox(N.get("smooth"))),d.setShape({smooth:k,stackedOnSmooth:E,smoothMonotone:O,connectNulls:R}),Es(d,t,"areaStyle"),qo(d).seriesIndex=t.seriesIndex,Os(d,D,I)}var B=function(t){i._changePolyState(t)};o.eachItemGraphicEl((function(t){t&&(t.onHoverStateChange=B)})),this._polyline.onHoverStateChange=B,this._data=o,this._coordSys=r,this._stackedOnPoints=x,this._points=u,this._step=C,this._valueOrigin=m},e.prototype.dispose=function(){},e.prototype.highlight=function(t,e,n,i){var r=t.getData(),a=ur(r,i);if(this._changePolyState("emphasis"),!(a instanceof Array)&&null!=a&&a>=0){var o=r.getLayout("points"),s=r.getItemGraphicEl(a);if(!s){var l=o[2*a],u=o[2*a+1];if(isNaN(l)||isNaN(u))return;if(this._clipShapeForSymbol&&!this._clipShapeForSymbol.contain(l,u))return;(s=new N_(r,a)).x=l,s.y=u,s.setZ(t.get("zlevel"),t.get("z"));var h=s.getSymbolPath().getTextContent();h&&(h.z2=this._polyline.z2+1),s.__temp=!0,r.setItemGraphicEl(a,s),s.stopSymbolAnimation(!0),this.group.add(s)}s.highlight()}else nf.prototype.highlight.call(this,t,e,n,i)},e.prototype.downplay=function(t,e,n,i){var r=t.getData(),a=ur(r,i);if(this._changePolyState("normal"),null!=a&&a>=0){var o=r.getItemGraphicEl(a);o&&(o.__temp?(r.setItemGraphicEl(a,null),this.group.remove(o)):o.downplay())}else nf.prototype.downplay.call(this,t,e,n,i)},e.prototype._changePolyState=function(t){var e=this._polygon;ys(this._polyline,t),e&&ys(e,t)},e.prototype._newPolyline=function(t){var e=this._polyline;return e&&this._lineGroup.remove(e),e=new $_({shape:{points:t},segmentIgnoreThreshold:2,z2:10}),this._lineGroup.add(e),this._polyline=e,e},e.prototype._newPolygon=function(t,e){var n=this._polygon;return n&&this._lineGroup.remove(n),n=new Q_({shape:{points:t,stackedOnPoints:e},segmentIgnoreThreshold:2}),this._lineGroup.add(n),this._polygon=n,n},e.prototype._initSymbolLabelAnimation=function(t,e,n){var i,r,a=e.getBaseAxis(),o=a.inverse;"cartesian2d"===e.type?(i=a.isHorizontal(),r=!1):"polar"===e.type&&(i="angle"===a.dim,r=!0);var s=t.hostModel,l=s.get("animationDuration");"function"==typeof l&&(l=l(null));var u=s.get("animationDelay")||0,h="function"==typeof u?u(null):u;t.eachItemGraphicEl((function(t,a){var s=t;if(s){var c=[t.x,t.y],p=void 0,f=void 0,d=void 0;if(r){var g=n,y=e.pointToCoord(c);i?(p=g.startAngle,f=g.endAngle,d=-y[1]/180*Math.PI):(p=g.r0,f=g.r,d=y[0])}else{var v=n;i?(p=v.x,f=v.x+v.width,d=t.x):(p=v.y+v.height,f=v.y,d=t.y)}var m=f===p?0:(d-p)/(f-p);o&&(m=1-m);var _="function"==typeof u?u(a):l*m+h,x=s.getSymbolPath(),b=x.getTextContent();s.attr({scaleX:0,scaleY:0}),s.animateTo({scaleX:1,scaleY:1},{duration:200,delay:_}),b&&b.animateFrom({style:{opacity:0}},{duration:300,delay:_}),x.disableLabelAnimation=!0}}))},e.prototype._initOrUpdateEndLabel=function(t,e,n){var i=t.getModel("endLabel");if(i.get("show")){var r=t.getData(),a=this._polyline,o=this._endLabel;o||((o=this._endLabel=new Fo({z2:200})).ignoreClip=!0,a.setTextContent(this._endLabel),a.disableLabelAnimation=!0);var s=function(t){for(var e,n,i=t.length/2;i>0&&(e=t[2*i-2],n=t[2*i-1],isNaN(e)||isNaN(n));i--);return i-1}(r.getLayout("points"));s>=0&&(mu(a,_u(t,"endLabel"),{inheritColor:n,labelFetcher:t,labelDataIndex:s,defaultText:function(t,e,n){return null!=n?R_(r,n):O_(r,t)},enableTextSetter:!0},function(t,e){var n=e.getBaseAxis(),i=n.isHorizontal(),r=n.inverse,a=i?r?"right":"left":"center",o=i?"middle":r?"top":"bottom";return{normal:{align:t.get("align")||a,verticalAlign:t.get("verticalAlign")||o}}}(i,e)),a.textConfig.position=null)}else this._endLabel&&(this._polyline.removeTextContent(),this._endLabel=null)},e.prototype._endLabelOnDuring=function(t,e,n,i,r,a,o){var s=this._endLabel,l=this._polyline;if(s){t<1&&null==i.originalX&&(i.originalX=s.x,i.originalY=s.y);var u=n.getLayout("points"),h=n.hostModel,c=h.get("connectNulls"),p=a.get("precision"),f=a.get("distance")||0,d=o.getBaseAxis(),g=d.isHorizontal(),y=d.inverse,v=e.shape,m=y?g?v.x:v.y+v.height:g?v.x+v.width:v.y,_=(g?f:0)*(y?-1:1),x=(g?0:-f)*(y?-1:1),b=g?"x":"y",w=function(t,e,n){for(var i,r,a=t.length/2,o="x"===n?0:1,s=0,l=-1,u=0;u<a;u++)if(r=t[2*u+o],!isNaN(r)&&!isNaN(t[2*u+1-o]))if(0!==u){if(i<=e&&r>=e||i>=e&&r<=e){l=u;break}s=u,i=r}else i=r;return{range:[s,l],t:(e-i)/(r-i)}}(u,m,b),S=w.range,M=S[1]-S[0],T=void 0;if(M>=1){if(M>1&&!c){var C=ux(u,S[0]);s.attr({x:C[0]+_,y:C[1]+x}),r&&(T=h.getRawValue(S[0]))}else{(C=l.getPointOn(m,b))&&s.attr({x:C[0]+_,y:C[1]+x});var A=h.getRawValue(S[0]),D=h.getRawValue(S[1]);r&&(T=vr(n,p,A,D,w.t))}i.lastFrameIndex=S[0]}else{var I=1===t||i.lastFrameIndex>0?S[0]:0;C=ux(u,I);r&&(T=h.getRawValue(I)),s.attr({x:C[0]+_,y:C[1]+x})}r&&Cu(s).setLabelText(T)}},e.prototype._doUpdateAnimation=function(t,e,n,i,r,a){var o=this._polyline,s=this._polygon,l=t.hostModel,u=function(t,e,n,i,r,a,o,s){for(var l=function(t,e){var n=[];return e.diff(t).add((function(t){n.push({cmd:"+",idx:t})})).update((function(t,e){n.push({cmd:"=",idx:e,idx1:t})})).remove((function(t){n.push({cmd:"-",idx:t})})).execute(),n}(t,e),u=[],h=[],c=[],p=[],f=[],d=[],g=[],y=H_(r,e,o),v=(H_(a,t,s),t.getLayout("points")||[]),m=e.getLayout("points")||[],_=0;_<l.length;_++){var x=l[_],b=!0,w=void 0,S=void 0;switch(x.cmd){case"=":w=2*x.idx,S=2*x.idx1;var M=v[w],T=v[w+1],C=m[S],A=m[S+1];(isNaN(M)||isNaN(T))&&(M=C,T=A),u.push(M,T),h.push(C,A),c.push(n[w],n[w+1]),p.push(i[S],i[S+1]),g.push(e.getRawIndex(x.idx1));break;case"+":var D=x.idx,I=y.dataDimsForPoint,k=r.dataToPoint([e.get(I[0],D),e.get(I[1],D)]);S=2*D,u.push(k[0],k[1]),h.push(m[S],m[S+1]);var L=G_(y,r,e,D);c.push(L[0],L[1]),p.push(i[S],i[S+1]),g.push(e.getRawIndex(D));break;case"-":b=!1}b&&(f.push(x),d.push(d.length))}d.sort((function(t,e){return g[t]-g[e]}));var P=u.length,O=Y_(P),R=Y_(P),N=Y_(P),E=Y_(P),B=[];for(_=0;_<d.length;_++){var z=d[_],F=2*_,V=2*z;O[F]=u[V],O[F+1]=u[V+1],R[F]=h[V],R[F+1]=h[V+1],N[F]=c[V],N[F+1]=c[V+1],E[F]=p[V],E[F+1]=p[V+1],B[_]=f[z]}return{current:O,next:R,stackedOnCurrent:N,stackedOnNext:E,status:B}}(this._data,t,this._stackedOnPoints,e,this._coordSys,n,this._valueOrigin,a),h=u.current,c=u.stackedOnCurrent,p=u.next,f=u.stackedOnNext;if(r&&(h=sx(u.current,n,r),c=sx(u.stackedOnCurrent,n,r),p=sx(u.next,n,r),f=sx(u.stackedOnNext,n,r)),ax(h,p)>3e3||s&&ax(c,f)>3e3)return o.setShape({points:p}),void(s&&s.setShape({points:p,stackedOnPoints:f}));o.shape.__points=u.current,o.shape.points=h;var d={shape:{points:p}};u.current!==h&&(d.shape.__points=u.next),o.stopAnimation(),lu(o,d,l),s&&(s.setShape({points:h,stackedOnPoints:c}),s.stopAnimation(),lu(s,{shape:{stackedOnPoints:f}},l),o.shape.points!==s.shape.points&&(s.shape.points=o.shape.points));for(var g=[],y=u.status,v=0;v<y.length;v++){if("="===y[v].cmd){var m=t.getItemGraphicEl(y[v].idx1);m&&g.push({el:m,ptIdx:v})}}o.animators&&o.animators.length&&o.animators[0].during((function(){s&&s.dirtyShape();for(var t=o.shape.__points,e=0;e<g.length;e++){var n=g[e].el,i=2*g[e].ptIdx;n.x=t[i],n.y=t[i+1],n.markRedraw()}}))},e.prototype.remove=function(t){var e=this.group,n=this._data;this._lineGroup.removeAll(),this._symbolDraw.remove(!0),n&&n.eachItemGraphicEl((function(t,i){t.__temp&&(e.remove(t),n.setItemGraphicEl(i,null))})),this._polyline=this._polygon=this._coordSys=this._points=this._stackedOnPoints=this._endLabel=this._data=null},e.type="line",e}(nf);var px={average:function(t){for(var e=0,n=0,i=0;i<t.length;i++)isNaN(t[i])||(e+=t[i],n++);return 0===n?NaN:e/n},sum:function(t){for(var e=0,n=0;n<t.length;n++)e+=t[n]||0;return e},max:function(t){for(var e=-1/0,n=0;n<t.length;n++)t[n]>e&&(e=t[n]);return isFinite(e)?e:NaN},min:function(t){for(var e=1/0,n=0;n<t.length;n++)t[n]<e&&(e=t[n]);return isFinite(e)?e:NaN},nearest:function(t){return t[0]}},fx=function(t){return Math.round(t.length/2)};function dx(t){return{seriesType:t,reset:function(t,e,n){var i=t.getData(),r=t.get("sampling"),a=t.coordinateSystem,o=i.count();if(o>10&&"cartesian2d"===a.type&&r){var s=a.getBaseAxis(),l=a.getOtherAxis(s),u=s.getExtent(),h=n.getDevicePixelRatio(),c=Math.abs(u[1]-u[0])*(h||1),p=Math.round(o/c);if(p>1){"lttb"===r&&t.setData(i.lttbDownSample(i.mapDimension(l.dim),1/p));var f=void 0;"string"==typeof r?f=px[r]:"function"==typeof r&&(f=r),f&&t.setData(i.downSample(i.mapDimension(l.dim),1/p,f,fx))}}}}}var gx=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.getInitialData=function(t,e){return im(this.getSource(),this,{useEncodeDefaulter:!0})},e.prototype.getMarkerPosition=function(t){var e=this.coordinateSystem;if(e){var n=e.dataToPoint(e.clampData(t)),i=this.getData(),r=i.getLayout("offset"),a=i.getLayout("size");return n[e.getBaseAxis().isHorizontal()?0:1]+=r+a/2,n}return[NaN,NaN]},e.type="series.__base_bar__",e.defaultOption={zlevel:0,z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,barMinHeight:0,barMinAngle:0,large:!1,largeThreshold:400,progressive:3e3,progressiveChunkMode:"mod"},e}(Up);Up.registerClass(gx);var yx=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}var i,r;return n(e,t),e.prototype.getInitialData=function(){return im(this.getSource(),this,{useEncodeDefaulter:!0,createInvertedIndices:!!this.get("realtimeSort",!0)||null})},e.prototype.getProgressive=function(){return!!this.get("large")&&this.get("progressive")},e.prototype.getProgressiveThreshold=function(){var t=this.get("progressiveThreshold"),e=this.get("largeThreshold");return e>t&&(t=e),t},e.prototype.brushSelector=function(t,e,n){return n.rect(e.getItemLayout(t))},e.type="series.bar",e.dependencies=["grid","polar"],e.defaultOption=(i=gx.defaultOption,r={clip:!0,roundCap:!1,showBackground:!1,backgroundStyle:{color:"rgba(180, 180, 180, 0.2)",borderColor:null,borderWidth:0,borderType:"solid",borderRadius:0,shadowBlur:0,shadowColor:null,shadowOffsetX:0,shadowOffsetY:0,opacity:1},select:{itemStyle:{borderColor:"#212121"}},realtimeSort:!1},S(S({},i,!0),r,!0)),e}(gx),vx=function(){this.cx=0,this.cy=0,this.r0=0,this.r=0,this.startAngle=0,this.endAngle=2*Math.PI,this.clockwise=!0},mx=function(t){function e(e){var n=t.call(this,e)||this;return n.type="sausage",n}return n(e,t),e.prototype.getDefaultShape=function(){return new vx},e.prototype.buildPath=function(t,e){var n=e.cx,i=e.cy,r=Math.max(e.r0||0,0),a=Math.max(e.r,0),o=.5*(a-r),s=r+o,l=e.startAngle,u=e.endAngle,h=e.clockwise,c=Math.cos(l),p=Math.sin(l),f=Math.cos(u),d=Math.sin(u);(h?u-l<2*Math.PI:l-u<2*Math.PI)&&(t.moveTo(c*r+n,p*r+i),t.arc(c*s+n,p*s+i,o,-Math.PI+l,l,!h)),t.arc(n,i,a,l,u,!h),t.moveTo(f*a+n,d*a+i),t.arc(f*s+n,d*s+i,o,u-2*Math.PI,u-Math.PI,!h),0!==r&&(t.arc(n,i,r,u,l,h),t.moveTo(c*r+n,d*r+i)),t.closePath()},e}(Co),_x=[0,0],xx=Math.max,bx=Math.min;var Sx=function(t){function e(){var n=t.call(this)||this;return n.type=e.type,n._isFirstFrame=!0,n}return n(e,t),e.prototype.render=function(t,e,n,i){this._model=t,this._removeOnRenderedListener(n),this._updateDrawMode(t);var r=t.get("coordinateSystem");("cartesian2d"===r||"polar"===r)&&(this._isLargeDraw?this._renderLarge(t,e,n):this._renderNormal(t,e,n,i))},e.prototype.incrementalPrepareRender=function(t){this._clear(),this._updateDrawMode(t),this._updateLargeClip(t)},e.prototype.incrementalRender=function(t,e){this._incrementalRenderLarge(t,e)},e.prototype._updateDrawMode=function(t){var e=t.pipelineContext.large;null!=this._isLargeDraw&&e===this._isLargeDraw||(this._isLargeDraw=e,this._clear())},e.prototype._renderNormal=function(t,e,n,i){var r,a=this.group,o=t.getData(),s=this._data,l=t.coordinateSystem,u=l.getBaseAxis();"cartesian2d"===l.type?r=u.isHorizontal():"polar"===l.type&&(r="angle"===u.dim);var h=t.isAnimationEnabled()?t:null,c=function(t,e){var n=t.get("realtimeSort",!0),i=e.getBaseAxis();0;if(n&&"category"===i.type&&"cartesian2d"===e.type)return{baseAxis:i,otherAxis:e.getOtherAxis(i)}}(t,l);c&&this._enableRealtimeSort(c,o,n);var p=t.get("clip",!0)||c,f=function(t,e){var n=t.getArea&&t.getArea();if(nx(t,"cartesian2d")){var i=t.getBaseAxis();if("category"!==i.type||!i.onBand){var r=e.getLayout("bandWidth");i.isHorizontal()?(n.x-=r,n.width+=2*r):(n.y-=r,n.height+=2*r)}}return n}(l,o);a.removeClipPath();var d=t.get("roundCap",!0),g=t.get("showBackground",!0),y=t.getModel("backgroundStyle"),v=y.get("borderRadius")||0,m=[],_=this._backgroundEls,x=i&&i.isInitSort,b=i&&"changeAxisOrder"===i.type;function w(t){var e=Ax[l.type](o,t),n=function(t,e,n){return new("polar"===t.type?wl:Eo)({shape:Ox(e,n,t),silent:!0,z2:0})}(l,r,e);return n.useStyle(y.getItemStyle()),"cartesian2d"===l.type&&n.setShape("r",v),m[t]=n,n}o.diff(s).add((function(e){var n=o.getItemModel(e),i=Ax[l.type](o,e,n);if(g&&w(e),o.hasValue(e)){var s=!1;p&&(s=Mx[l.type](f,i));var y=Tx[l.type](t,o,e,i,r,h,u.model,!1,d);Dx(y,o,e,n,i,t,r,"polar"===l.type),x?y.attr({shape:i}):c?Cx(c,h,y,i,e,r,!1,!1):uu(y,{shape:i},t,e),o.setItemGraphicEl(e,y),a.add(y),y.ignore=s}})).update((function(e,n){var i=o.getItemModel(e),S=Ax[l.type](o,e,i);if(g){var M=void 0;0===_.length?M=w(n):((M=_[n]).useStyle(y.getItemStyle()),"cartesian2d"===l.type&&M.setShape("r",v),m[e]=M);var T=Ax[l.type](o,e);lu(M,{shape:Ox(r,T,l)},h,e)}var C=s.getItemGraphicEl(n);if(!o.hasValue(e))return a.remove(C),void(C=null);var A=!1;p&&(A=Mx[l.type](f,S))&&a.remove(C),C||(C=Tx[l.type](t,o,e,S,r,h,u.model,!!C,d)),b||Dx(C,o,e,i,S,t,r,"polar"===l.type),x?C.attr({shape:S}):c?Cx(c,h,C,S,e,r,!0,b):lu(C,{shape:S},t,e,null),o.setItemGraphicEl(e,C),C.ignore=A,a.add(C)})).remove((function(e){var n=s.getItemGraphicEl(e);n&&pu(n,t,e)})).execute();var S=this._backgroundGroup||(this._backgroundGroup=new Mi);S.removeAll();for(var M=0;M<m.length;++M)S.add(m[M]);a.add(S),this._backgroundEls=m,this._data=o},e.prototype._renderLarge=function(t,e,n){this._clear(),Lx(t,this.group),this._updateLargeClip(t)},e.prototype._incrementalRenderLarge=function(t,e){this._removeBackground(),Lx(e,this.group,!0)},e.prototype._updateLargeClip=function(t){var e=t.get("clip",!0)?function(t,e,n,i,r){return t?"polar"===t.type?ex(t,e,n):"cartesian2d"===t.type?tx(t,e,n,i,r):null:null}(t.coordinateSystem,!1,t):null;e?this.group.setClipPath(e):this.group.removeClipPath()},e.prototype._enableRealtimeSort=function(t,e,n){var i=this;if(e.count()){var r=t.baseAxis;if(this._isFirstFrame)this._dispatchInitSort(e,t,n),this._isFirstFrame=!1;else{var a=function(t){var n=e.getItemGraphicEl(t);if(n){var i=n.shape;return(r.isHorizontal()?Math.abs(i.height):Math.abs(i.width))||0}return 0};this._onRendered=function(){i._updateSortWithinSameData(e,a,r,n)},n.getZr().on("rendered",this._onRendered)}}},e.prototype._dataSort=function(t,e,n){var i=[];return t.each(t.mapDimension(e.dim),(function(t,e){var r=n(e);r=null==r?NaN:r,i.push({dataIndex:e,mappedValue:r,ordinalNumber:t})})),i.sort((function(t,e){return e.mappedValue-t.mappedValue})),{ordinalNumbers:P(i,(function(t){return t.ordinalNumber}))}},e.prototype._isOrderChangedWithinSameData=function(t,e,n){for(var i=n.scale,r=t.mapDimension(n.dim),a=Number.MAX_VALUE,o=0,s=i.getOrdinalMeta().categories.length;o<s;++o){var l=t.rawIndexOf(r,i.getRawOrdinalNumber(o)),u=l<0?Number.MIN_VALUE:e(t.indexOfRawIndex(l));if(u>a)return!0;a=u}return!1},e.prototype._isOrderDifferentInView=function(t,e){for(var n=e.scale,i=n.getExtent(),r=Math.max(0,i[0]),a=Math.min(i[1],n.getOrdinalMeta().categories.length-1);r<=a;++r)if(t.ordinalNumbers[r]!==n.getRawOrdinalNumber(r))return!0},e.prototype._updateSortWithinSameData=function(t,e,n,i){if(this._isOrderChangedWithinSameData(t,e,n)){var r=this._dataSort(t,n,e);this._isOrderDifferentInView(r,n)&&(this._removeOnRenderedListener(i),i.dispatchAction({type:"changeAxisOrder",componentType:n.dim+"Axis",axisId:n.index,sortInfo:r}))}},e.prototype._dispatchInitSort=function(t,e,n){var i=e.baseAxis,r=this._dataSort(t,i,(function(n){return t.get(t.mapDimension(e.otherAxis.dim),n)}));n.dispatchAction({type:"changeAxisOrder",componentType:i.dim+"Axis",isInitSort:!0,axisId:i.index,sortInfo:r,animation:{duration:0}})},e.prototype.remove=function(t,e){this._clear(this._model),this._removeOnRenderedListener(e)},e.prototype.dispose=function(t,e){this._removeOnRenderedListener(e)},e.prototype._removeOnRenderedListener=function(t){this._onRendered&&(t.getZr().off("rendered",this._onRendered),this._onRendered=null)},e.prototype._clear=function(t){var e=this.group,n=this._data;t&&t.isAnimationEnabled()&&n&&!this._isLargeDraw?(this._removeBackground(),this._backgroundEls=[],n.eachItemGraphicEl((function(e){pu(e,t,qo(e).dataIndex)}))):e.removeAll(),this._data=null,this._isFirstFrame=!0},e.prototype._removeBackground=function(){this.group.remove(this._backgroundGroup),this._backgroundGroup=null},e.type="bar",e}(nf),Mx={cartesian2d:function(t,e){var n=e.width<0?-1:1,i=e.height<0?-1:1;n<0&&(e.x+=e.width,e.width=-e.width),i<0&&(e.y+=e.height,e.height=-e.height);var r=t.x+t.width,a=t.y+t.height,o=xx(e.x,t.x),s=bx(e.x+e.width,r),l=xx(e.y,t.y),u=bx(e.y+e.height,a),h=s<o,c=u<l;return e.x=h&&o>r?s:o,e.y=c&&l>a?u:l,e.width=h?0:s-o,e.height=c?0:u-l,n<0&&(e.x+=e.width,e.width=-e.width),i<0&&(e.y+=e.height,e.height=-e.height),h||c},polar:function(t,e){var n=e.r0<=e.r?1:-1;if(n<0){var i=e.r;e.r=e.r0,e.r0=i}var r=bx(e.r,t.r),a=xx(e.r0,t.r0);e.r=r,e.r0=a;var o=r-a<0;if(n<0){i=e.r;e.r=e.r0,e.r0=i}return o}},Tx={cartesian2d:function(t,e,n,i,r,a,o,s,l){var u=new Eo({shape:M({},i),z2:1});(u.__dataIndex=n,u.name="item",a)&&(u.shape[r?"height":"width"]=0);return u},polar:function(t,e,n,i,r,a,o,s,l){var u=i.startAngle<i.endAngle,h=new(!r&&l?mx:wl)({shape:T({clockwise:u},i),z2:1});if(h.name="item",a){var c=r?"r":"endAngle",p={};h.shape[c]=r?0:i.startAngle,p[c]=i[c],(s?lu:uu)(h,{shape:p},a)}return h}};function Cx(t,e,n,i,r,a,o,s){var l,u;a?(u={x:i.x,width:i.width},l={y:i.y,height:i.height}):(u={y:i.y,height:i.height},l={x:i.x,width:i.width}),s||(o?lu:uu)(n,{shape:l},e,r,null),(o?lu:uu)(n,{shape:u},e?t.baseAxis.model:null,r)}var Ax={cartesian2d:function(t,e,n){var i=t.getItemLayout(e),r=n?function(t,e){var n=t.get(["itemStyle","borderColor"]);if(!n||"none"===n)return 0;var i=t.get(["itemStyle","borderWidth"])||0,r=isNaN(e.width)?Number.MAX_VALUE:Math.abs(e.width),a=isNaN(e.height)?Number.MAX_VALUE:Math.abs(e.height);return Math.min(i,r,a)}(n,i):0,a=i.width>0?1:-1,o=i.height>0?1:-1;return{x:i.x+a*r/2,y:i.y+o*r/2,width:i.width-a*r,height:i.height-o*r}},polar:function(t,e,n){var i=t.getItemLayout(e);return{cx:i.cx,cy:i.cy,r0:i.r0,r:i.r,startAngle:i.startAngle,endAngle:i.endAngle}}};function Dx(t,e,n,i,r,a,o,s){var l=e.getItemVisual(n,"style");s||t.setShape("r",i.get(["itemStyle","borderRadius"])||0),t.useStyle(l);var u=i.getShallow("cursor");if(u&&t.attr("cursor",u),!s){var h=o?r.height>0?"bottom":"top":r.width>0?"left":"right",c=_u(i);mu(t,c,{labelFetcher:a,labelDataIndex:n,defaultText:O_(a.getData(),n),inheritColor:l.fill,defaultOpacity:l.opacity,defaultOutsidePosition:h}),function(t,e,n,i){if(t){var r=Cu(t);r.prevValue=r.value,r.value=n;var a=e.normal;r.valueAnimation=a.get("valueAnimation"),r.valueAnimation&&(r.precision=a.get("precision"),r.defaultInterpolatedText=i,r.statesModels=e)}}(t.getTextContent(),c,a.getRawValue(n),(function(t){return R_(e,t)}))}var p=i.getModel(["emphasis"]);Os(t,p.get("focus"),p.get("blurScope")),Es(t,i),function(t){return null!=t.startAngle&&null!=t.endAngle&&t.startAngle===t.endAngle}(r)&&(t.style.fill="none",t.style.stroke="none",L(t.states,(function(t){t.style&&(t.style.fill=t.style.stroke="none")})))}var Ix=function(){},kx=function(t){function e(e){var n=t.call(this,e)||this;return n.type="largeBar",n}return n(e,t),e.prototype.getDefaultShape=function(){return new Ix},e.prototype.buildPath=function(t,e){for(var n=e.points,i=this.__startPoint,r=this.__baseDimIdx,a=0;a<n.length;a+=2)i[r]=n[a+r],t.moveTo(i[0],i[1]),t.lineTo(n[a],n[a+1])},e}(Co);function Lx(t,e,n){var i=t.getData(),r=[],a=i.getLayout("valueAxisHorizontal")?1:0;r[1-a]=i.getLayout("valueAxisStart");var o=i.getLayout("largeDataIndices"),s=i.getLayout("barWidth"),l=t.getModel("backgroundStyle");if(t.get("showBackground",!0)){var u=i.getLayout("largeBackgroundPoints"),h=[];h[1-a]=i.getLayout("backgroundStart");var c=new kx({shape:{points:u},incremental:!!n,silent:!0,z2:0});c.__startPoint=h,c.__baseDimIdx=a,c.__largeDataIndices=o,c.__barWidth=s,function(t,e,n){var i=e.get("borderColor")||e.get("color"),r=e.getItemStyle();t.useStyle(r),t.style.fill=null,t.style.stroke=i,t.style.lineWidth=n.getLayout("barWidth")}(c,l,i),e.add(c)}var p=new kx({shape:{points:i.getLayout("largePoints")},incremental:!!n});p.__startPoint=r,p.__baseDimIdx=a,p.__largeDataIndices=o,p.__barWidth=s,e.add(p),function(t,e,n){var i=n.getVisual("style");t.useStyle(M({},i)),t.style.fill=null,t.style.stroke=i.fill,t.style.lineWidth=n.getLayout("barWidth")}(p,0,i),qo(p).seriesIndex=t.seriesIndex,t.get("silent")||(p.on("mousedown",Px),p.on("mousemove",Px))}var Px=uf((function(t){var e=function(t,e,n){var i=t.__baseDimIdx,r=1-i,a=t.shape.points,o=t.__largeDataIndices,s=Math.abs(t.__barWidth/2),l=t.__startPoint[r];_x[0]=e,_x[1]=n;for(var u=_x[i],h=_x[1-i],c=u-s,p=u+s,f=0,d=a.length/2;f<d;f++){var g=2*f,y=a[g+i],v=a[g+r];if(y>=c&&y<=p&&(l<=v?h>=l&&h<=v:h>=v&&h<=l))return o[f]}return-1}(this,t.offsetX,t.offsetY);qo(this).dataIndex=e>=0?e:null}),30,!1);function Ox(t,e,n){if(nx(n,"cartesian2d")){var i=e,r=n.getArea();return{x:t?i.x:r.x,y:t?r.y:i.y,width:t?i.width:r.width,height:t?r.height:i.height}}var a=e;return{cx:(r=n.getArea()).cx,cy:r.cy,r0:t?r.r0:a.r0,r:t?r.r:a.r,startAngle:t?a.startAngle:0,endAngle:t?a.endAngle:2*Math.PI}}var Rx=2*Math.PI,Nx=Math.PI/180;function Ex(t,e,n){e.eachSeriesByType(t,(function(t){var e=t.getData(),i=e.mapDimension("value"),r=function(t,e){return Bh(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()})}(t,n),a=t.get("center"),o=t.get("radius");z(o)||(o=[0,o]),z(a)||(a=[a,a]);var s=Ri(r.width,n.getWidth()),l=Ri(r.height,n.getHeight()),u=Math.min(s,l),h=Ri(a[0],s)+r.x,c=Ri(a[1],l)+r.y,p=Ri(o[0],u/2),f=Ri(o[1],u/2),d=-t.get("startAngle")*Nx,g=t.get("minAngle")*Nx,y=0;e.each(i,(function(t){!isNaN(t)&&y++}));var v=e.getSum(i),m=Math.PI/(v||y)*2,_=t.get("clockwise"),x=t.get("roseType"),b=t.get("stillShowZeroSum"),w=e.getDataExtent(i);w[0]=0;var S=Rx,M=0,T=d,C=_?1:-1;if(e.setLayout({viewRect:r,r:f}),e.each(i,(function(t,n){var i;if(isNaN(t))e.setItemLayout(n,{angle:NaN,startAngle:NaN,endAngle:NaN,clockwise:_,cx:h,cy:c,r0:p,r:x?NaN:f});else{(i="area"!==x?0===v&&b?m:t*m:Rx/y)<g?(i=g,S-=g):M+=t;var r=T+C*i;e.setItemLayout(n,{angle:i,startAngle:T,endAngle:r,clockwise:_,cx:h,cy:c,r0:p,r:x?Oi(t,w,[p,f]):f}),T=r}})),S<Rx&&y)if(S<=.001){var A=Rx/y;e.each(i,(function(t,n){if(!isNaN(t)){var i=e.getItemLayout(n);i.angle=A,i.startAngle=d+C*n*A,i.endAngle=d+C*(n+1)*A}}))}else m=S/M,T=d,e.each(i,(function(t,n){if(!isNaN(t)){var i=e.getItemLayout(n),r=i.angle===g?g:t*m;i.startAngle=T,i.endAngle=T+C*r,T+=C*r}}))}))}var Bx=Math.PI/180;function zx(t,e,n,i,r,a,o,s,l,u){if(!(t.length<2)){for(var h=t.length,c=0;c<h;c++)if("outer"===t[c].position&&"labelLine"===t[c].labelAlignTo){var p=t[c].label.x-u;t[c].linePoints[1][0]+=p,t[c].label.x=u}gd(t,l,l+o)&&function(t){for(var a={list:[],maxY:0},o={list:[],maxY:0},s=0;s<t.length;s++)if("none"===t[s].labelAlignTo){var l=t[s],u=l.label.y>n?o:a,h=Math.abs(l.label.y-n);if(h>u.maxY){var c=l.label.x-e-l.len2*r,p=i+l.len,d=Math.abs(c)<p?Math.sqrt(h*h/(1-c*c/p/p)):p;u.rB=d,u.maxY=h}u.list.push(l)}f(a),f(o)}(t)}function f(t){for(var a=t.rB,o=a*a,s=0;s<t.list.length;s++){var l=t.list[s],u=Math.abs(l.label.y-n),h=i+l.len,c=h*h,p=Math.sqrt((1-Math.abs(u*u/o))*c);l.label.x=e+(p+l.len2)*r}}}function Fx(t){return"center"===t.position}function Vx(t){var e,n,i=t.getData(),r=[],a=!1,o=(t.get("minShowLabelAngle")||0)*Bx,s=i.getLayout("viewRect"),l=i.getLayout("r"),u=s.width,h=s.x,c=s.y,p=s.height;function f(t){t.ignore=!0}i.each((function(t){var s=i.getItemGraphicEl(t),c=s.shape,p=s.getTextContent(),d=s.getTextGuideLine(),g=i.getItemModel(t),y=g.getModel("label"),v=y.get("position")||g.get(["emphasis","label","position"]),m=y.get("distanceToLabelLine"),_=y.get("alignTo"),x=Ri(y.get("edgeDistance"),u),b=y.get("bleedMargin"),w=g.getModel("labelLine"),S=w.get("length");S=Ri(S,u);var M=w.get("length2");if(M=Ri(M,u),Math.abs(c.endAngle-c.startAngle)<o)return L(p.states,f),void(p.ignore=!0);if(function(t){if(!t.ignore)return!0;for(var e in t.states)if(!1===t.states[e].ignore)return!0;return!1}(p)){var T,C,A,D,I=(c.startAngle+c.endAngle)/2,k=Math.cos(I),P=Math.sin(I);e=c.cx,n=c.cy;var O,R="inside"===v||"inner"===v;if("center"===v)T=c.cx,C=c.cy,D="center";else{var N=(R?(c.r+c.r0)/2*k:c.r*k)+e,E=(R?(c.r+c.r0)/2*P:c.r*P)+n;if(T=N+3*k,C=E+3*P,!R){var B=N+k*(S+l-c.r),z=E+P*(S+l-c.r),F=B+(k<0?-1:1)*M;T="edge"===_?k<0?h+x:h+u-x:F+(k<0?-m:m),C=z,A=[[N,E],[B,z],[F,z]]}D=R?"center":"edge"===_?k>0?"right":"left":k>0?"left":"right"}var V=y.get("rotate");if(O="number"==typeof V?V*(Math.PI/180):V?k<0?-I+Math.PI:-I:0,a=!!O,p.x=T,p.y=C,p.rotation=O,p.setStyle({verticalAlign:"middle"}),R){p.setStyle({align:D});var H=p.states.select;H&&(H.x+=p.x,H.y+=p.y)}else{var G=p.getBoundingRect().clone();G.applyTransform(p.getComputedTransform());var W=(p.style.margin||0)+2.1;G.y-=W/2,G.height+=W,r.push({label:p,labelLine:d,position:v,len:S,len2:M,minTurnAngle:w.get("minTurnAngle"),maxSurfaceAngle:w.get("maxSurfaceAngle"),surfaceNormal:new pn(k,P),linePoints:A,textAlign:D,labelDistance:m,labelAlignTo:_,edgeDistance:x,bleedMargin:b,rect:G})}s.setTextConfig({inside:R})}})),!a&&t.get("avoidLabelOverlap")&&function(t,e,n,i,r,a,o,s){for(var l=[],u=[],h=Number.MAX_VALUE,c=-Number.MAX_VALUE,p=0;p<t.length;p++){var f=t[p].label;Fx(t[p])||(f.x<e?(h=Math.min(h,f.x),l.push(t[p])):(c=Math.max(c,f.x),u.push(t[p])))}for(zx(u,e,n,i,1,0,a,0,s,c),zx(l,e,n,i,-1,0,a,0,s,h),p=0;p<t.length;p++){var d=t[p];if(f=d.label,!Fx(d)){var g=d.linePoints;if(g){var y="edge"===d.labelAlignTo,v=d.rect.width,m=void 0;(m=y?f.x<e?g[2][0]-d.labelDistance-o-d.edgeDistance:o+r-d.edgeDistance-g[2][0]-d.labelDistance:f.x<e?f.x-o-d.bleedMargin:o+r-f.x-d.bleedMargin)<d.rect.width&&(d.label.style.width=m,"edge"===d.labelAlignTo&&(v=m));var _=g[1][0]-g[2][0];y?f.x<e?g[2][0]=o+d.edgeDistance+v+d.labelDistance:g[2][0]=o+r-d.edgeDistance-v-d.labelDistance:(f.x<e?g[2][0]=f.x+d.labelDistance:g[2][0]=f.x-d.labelDistance,g[1][0]=g[2][0]+_),g[1][1]=g[2][1]=f.y}}}}(r,e,n,l,u,p,h,c);for(var d=0;d<r.length;d++){var g=r[d],y=g.label,v=g.labelLine,m=isNaN(y.x)||isNaN(y.y);if(y){y.setStyle({align:g.textAlign}),m&&(L(y.states,f),y.ignore=!0);var _=y.states.select;_&&(_.x+=y.x,_.y+=y.y)}if(v){var x=g.linePoints;m||!x?(L(v.states,f),v.ignore=!0):(ld(x,g.minTurnAngle),ud(x,g.surfaceNormal,g.maxSurfaceAngle),v.setShape({points:x}),y.__hostTarget.textGuideLineConfig={anchor:new pn(x[0][0],x[0][1])})}}}function Hx(t,e){var n=t.get("borderRadius");return null==n?null:(z(n)||(n=[n,n]),{innerCornerRadius:Ln(n[0],e.r0),cornerRadius:Ln(n[1],e.r)})}var Gx=function(t){function e(e,n,i){var r=t.call(this)||this;r.z2=2;var a=new Fo;return r.setTextContent(a),r.updateData(e,n,i,!0),r}return n(e,t),e.prototype.updateData=function(t,e,n,r){var a=this,o=t.hostModel,s=t.getItemModel(e),l=s.getModel("emphasis"),u=t.getItemLayout(e),h=M(Hx(s.getModel("itemStyle"),u)||{},u);if(isNaN(h.startAngle))a.setShape(h);else{if(r)a.setShape(h),"scale"===o.getShallow("animationType")?(a.shape.r=u.r0,uu(a,{shape:{r:u.r}},o,e)):null!=n?(a.setShape({startAngle:n,endAngle:n}),uu(a,{shape:{startAngle:u.startAngle,endAngle:u.endAngle}},o,e)):(a.shape.endAngle=u.startAngle,lu(a,{shape:{endAngle:u.endAngle}},o,e));else lu(a,{shape:h},o,e);a.useStyle(t.getItemVisual(e,"style")),Es(a,s);var c=(u.startAngle+u.endAngle)/2,p=o.get("selectedOffset"),f=Math.cos(c)*p,d=Math.sin(c)*p,g=s.getShallow("cursor");g&&a.attr("cursor",g),this._updateLabel(o,t,e),a.ensureState("emphasis").shape=i({r:u.r+(l.get("scale")&&l.get("scaleSize")||0)},Hx(l.getModel("itemStyle"),u)),M(a.ensureState("select"),{x:f,y:d,shape:Hx(s.getModel(["select","itemStyle"]),u)}),M(a.ensureState("blur"),{shape:Hx(s.getModel(["blur","itemStyle"]),u)});var y=a.getTextGuideLine(),v=a.getTextContent();y&&M(y.ensureState("select"),{x:f,y:d}),M(v.ensureState("select"),{x:f,y:d}),Os(this,l.get("focus"),l.get("blurScope"))}},e.prototype._updateLabel=function(t,e,n){var i=this,r=e.getItemModel(n),a=r.getModel("labelLine"),o=e.getItemVisual(n,"style"),s=o&&o.fill,l=o&&o.opacity;mu(i,_u(r),{labelFetcher:e.hostModel,labelDataIndex:n,inheritColor:s,defaultOpacity:l,defaultText:t.getFormattedLabel(n,"normal")||e.getName(n)});var u=i.getTextContent();i.setTextConfig({position:null,rotation:null}),u.attr({z2:10});var h=t.get(["label","position"]);if("outside"!==h&&"outer"!==h)i.removeTextGuideLine();else{var c=this.getTextGuideLine();c||(c=new kl,this.setTextGuideLine(c)),pd(this,fd(r),{stroke:s,opacity:Q(a.get(["lineStyle","opacity"]),l,1)})}},e}(wl),Wx=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.ignoreLabelLineUpdate=!0,e}return n(e,t),e.prototype.init=function(){var t=new Mi;this._sectorGroup=t},e.prototype.render=function(t,e,n,i){var r,a=t.getData(),o=this._data,s=this.group;if(!o&&a.count()>0){for(var l=a.getItemLayout(0),u=1;isNaN(l&&l.startAngle)&&u<a.count();++u)l=a.getItemLayout(u);l&&(r=l.startAngle)}a.diff(o).add((function(t){var e=new Gx(a,t,r);a.setItemGraphicEl(t,e),s.add(e)})).update((function(t,e){var n=o.getItemGraphicEl(e);n.updateData(a,t,r),n.off("click"),s.add(n),a.setItemGraphicEl(t,n)})).remove((function(e){pu(o.getItemGraphicEl(e),t,e)})).execute(),Vx(t),"expansion"!==t.get("animationTypeUpdate")&&(this._data=a)},e.prototype.dispose=function(){},e.prototype.containPoint=function(t,e){var n=e.getData().getItemLayout(0);if(n){var i=t[0]-n.cx,r=t[1]-n.cy,a=Math.sqrt(i*i+r*r);return a<=n.r&&a>=n.r0}},e.type="pie",e}(nf);var Ux=function(){function t(t,e){this._getDataWithEncodedVisual=t,this._getRawData=e}return t.prototype.getAllNames=function(){var t=this._getRawData();return t.mapArray(t.getName)},t.prototype.containName=function(t){return this._getRawData().indexOfName(t)>=0},t.prototype.indexOfName=function(t){return this._getDataWithEncodedVisual().indexOfName(t)},t.prototype.getItemVisual=function(t,e){return this._getDataWithEncodedVisual().getItemVisual(t,e)},t}(),Yx=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.useColorPaletteOnData=!0,e}return n(e,t),e.prototype.init=function(e){t.prototype.init.apply(this,arguments),this.legendVisualProvider=new Ux(E(this.getData,this),E(this.getRawData,this)),this._defaultLabelLine(e)},e.prototype.mergeOption=function(){t.prototype.mergeOption.apply(this,arguments)},e.prototype.getInitialData=function(){return function(t,e,n){e=z(e)&&{coordDimensions:e}||M({},e);var i=t.getSource(),r=Kv(i,e),a=new qv(r,t);return a.initData(i,n),a}(this,{coordDimensions:["value"],encodeDefaulter:B(oc,this)})},e.prototype.getDataParams=function(e){var n=this.getData(),i=t.prototype.getDataParams.call(this,e),r=[];return n.each(n.mapDimension("value"),(function(t){r.push(t)})),i.percent=zi(r,e,n.hostModel.get("percentPrecision")),i.$vars.push("percent"),i},e.prototype._defaultLabelLine=function(t){tr(t,"labelLine",["show"]);var e=t.labelLine,n=t.emphasis.labelLine;e.show=e.show&&t.label.show,n.show=n.show&&t.emphasis.label.show},e.type="series.pie",e.defaultOption={zlevel:0,z:2,legendHoverLink:!0,center:["50%","50%"],radius:[0,"75%"],clockwise:!0,startAngle:90,minAngle:0,minShowLabelAngle:0,selectedOffset:10,percentPrecision:2,stillShowZeroSum:!0,left:0,top:0,right:0,bottom:0,width:null,height:null,label:{rotate:0,show:!0,overflow:"truncate",position:"outer",alignTo:"none",edgeDistance:"25%",bleedMargin:10,distanceToLabelLine:5},labelLine:{show:!0,length:15,length2:15,smooth:!1,minTurnAngle:90,maxSurfaceAngle:90,lineStyle:{width:1,type:"solid"}},itemStyle:{borderWidth:1},labelLayout:{hideOverlap:!0},emphasis:{scale:!0,scaleSize:5},avoidLabelOverlap:!0,animationType:"expansion",animationDuration:1e3,animationTypeUpdate:"transition",animationEasingUpdate:"cubicInOut",animationDurationUpdate:500,animationEasing:"cubicInOut"},e}(Up);var Xx=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.type="grid",e.dependencies=["xAxis","yAxis"],e.layoutMode="box",e.defaultOption={show:!1,zlevel:0,z:0,left:"10%",top:60,right:"10%",bottom:70,containLabel:!1,backgroundColor:"rgba(0,0,0,0)",borderWidth:1,borderColor:"#ccc"},e}(Gh),qx=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.getCoordSysModel=function(){return this.getReferringComponents("grid",dr).models[0]},e.type="cartesian2dAxis",e}(Gh);I(qx,r_);var jx={show:!0,zlevel:0,z:0,inverse:!1,name:"",nameLocation:"end",nameRotate:null,nameTruncate:{maxWidth:null,ellipsis:"...",placeholder:"."},nameTextStyle:{},nameGap:15,silent:!1,triggerEvent:!1,tooltip:{show:!1},axisPointer:{},axisLine:{show:!0,onZero:!0,onZeroAxisIndex:null,lineStyle:{color:"#6E7079",width:1,type:"solid"},symbol:["none","none"],symbolSize:[10,15]},axisTick:{show:!0,inside:!1,length:5,lineStyle:{width:1}},axisLabel:{show:!0,inside:!1,rotate:0,showMinLabel:null,showMaxLabel:null,margin:8,fontSize:12},splitLine:{show:!0,lineStyle:{color:["#E0E6F1"],width:1,type:"solid"}},splitArea:{show:!1,areaStyle:{color:["rgba(250,250,250,0.2)","rgba(210,219,238,0.2)"]}}},Zx=S({boundaryGap:!0,deduplication:null,splitLine:{show:!1},axisTick:{alignWithLabel:!1,interval:"auto"},axisLabel:{interval:"auto"}},jx),Kx=S({boundaryGap:[0,0],axisLine:{show:"auto"},axisTick:{show:"auto"},splitNumber:5,minorTick:{show:!1,splitNumber:5,length:3,lineStyle:{}},minorSplitLine:{show:!1,lineStyle:{color:"#F4F7FD",width:1}}},jx),$x={category:Zx,value:Kx,time:S({scale:!0,splitNumber:6,axisLabel:{showMinLabel:!1,showMaxLabel:!1,rich:{primary:{fontWeight:"bold"}}},splitLine:{show:!1}},Kx),log:T({scale:!0,logBase:10},Kx)},Jx={value:1,category:1,time:1,log:1};function Qx(t,e,i,r){L(Jx,(function(a,o){var s=S(S({},$x[o],!0),r,!0),l=function(t){function i(){for(var n=[],i=0;i<arguments.length;i++)n[i]=arguments[i];var r=t.apply(this,n)||this;return r.type=e+"Axis."+o,r}return n(i,t),i.prototype.mergeDefaultAndTheme=function(t,e){var n=zh(this),i=n?Vh(t):{};S(t,e.getTheme().get(o+"Axis")),S(t,this.getDefaultOption()),t.type=tb(t),n&&Fh(t,i,n)},i.prototype.optionUpdated=function(){"category"===this.option.type&&(this.__ordinalMeta=am.createByAxisModel(this))},i.prototype.getCategories=function(t){var e=this.option;if("category"===e.type)return t?e.data:this.__ordinalMeta.categories},i.prototype.getOrdinalMeta=function(){return this.__ordinalMeta},i.type=e+"Axis."+o,i.defaultOption=s,i}(i);t.registerComponentModel(l)})),t.registerSubTypeDefaulter(e+"Axis",tb)}function tb(t){return t.type||(t.data?"category":"value")}var eb=function(){function t(t){this.type="cartesian",this._dimList=[],this._axes={},this.name=t||""}return t.prototype.getAxis=function(t){return this._axes[t]},t.prototype.getAxes=function(){return P(this._dimList,(function(t){return this._axes[t]}),this)},t.prototype.getAxesByScale=function(t){return t=t.toLowerCase(),R(this.getAxes(),(function(e){return e.scale.type===t}))},t.prototype.addAxis=function(t){var e=t.dim;this._axes[e]=t,this._dimList.push(e)},t}(),nb=["x","y"];function ib(t){return"interval"===t.type||"time"===t.type}var rb=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="cartesian2d",e.dimensions=nb,e}return n(e,t),e.prototype.calcAffineTransform=function(){this._transform=this._invTransform=null;var t=this.getAxis("x").scale,e=this.getAxis("y").scale;if(ib(t)&&ib(e)){var n=t.getExtent(),i=e.getExtent(),r=this.dataToPoint([n[0],i[0]]),a=this.dataToPoint([n[1],i[1]]),o=n[1]-n[0],s=i[1]-i[0];if(o&&s){var l=(a[0]-r[0])/o,u=(a[1]-r[1])/s,h=r[0]-n[0]*l,c=r[1]-i[0]*u,p=this._transform=[l,0,0,u,h,c];this._invTransform=pe([],p)}}},e.prototype.getBaseAxis=function(){return this.getAxesByScale("ordinal")[0]||this.getAxesByScale("time")[0]||this.getAxis("x")},e.prototype.containPoint=function(t){var e=this.getAxis("x"),n=this.getAxis("y");return e.contain(e.toLocalCoord(t[0]))&&n.contain(n.toLocalCoord(t[1]))},e.prototype.containData=function(t){return this.getAxis("x").containData(t[0])&&this.getAxis("y").containData(t[1])},e.prototype.dataToPoint=function(t,e,n){n=n||[];var i=t[0],r=t[1];if(this._transform&&null!=i&&isFinite(i)&&null!=r&&isFinite(r))return Dt(n,t,this._transform);var a=this.getAxis("x"),o=this.getAxis("y");return n[0]=a.toGlobalCoord(a.dataToCoord(i)),n[1]=o.toGlobalCoord(o.dataToCoord(r)),n},e.prototype.clampData=function(t,e){var n=this.getAxis("x").scale,i=this.getAxis("y").scale,r=n.getExtent(),a=i.getExtent(),o=n.parse(t[0]),s=i.parse(t[1]);return(e=e||[])[0]=Math.min(Math.max(Math.min(r[0],r[1]),o),Math.max(r[0],r[1])),e[1]=Math.min(Math.max(Math.min(a[0],a[1]),s),Math.max(a[0],a[1])),e},e.prototype.pointToData=function(t,e){if(e=e||[],this._invTransform)return Dt(e,t,this._invTransform);var n=this.getAxis("x"),i=this.getAxis("y");return e[0]=n.coordToData(n.toLocalCoord(t[0])),e[1]=i.coordToData(i.toLocalCoord(t[1])),e},e.prototype.getOtherAxis=function(t){return this.getAxis("x"===t.dim?"y":"x")},e.prototype.getArea=function(){var t=this.getAxis("x").getGlobalExtent(),e=this.getAxis("y").getGlobalExtent(),n=Math.min(t[0],t[1]),i=Math.min(e[0],e[1]),r=Math.max(t[0],t[1])-n,a=Math.max(e[0],e[1])-i;return new bn(n,i,r,a)},e}(eb),ab=function(t){function e(e,n,i,r,a){var o=t.call(this,e,n,i)||this;return o.index=0,o.type=r||"value",o.position=a||"bottom",o}return n(e,t),e.prototype.isHorizontal=function(){var t=this.position;return"top"===t||"bottom"===t},e.prototype.getGlobalExtent=function(t){var e=this.getExtent();return e[0]=this.toGlobalCoord(e[0]),e[1]=this.toGlobalCoord(e[1]),t&&e[0]>e[1]&&e.reverse(),e},e.prototype.pointToData=function(t,e){return this.coordToData(this.toLocalCoord(t["x"===this.dim?0:1]),e)},e.prototype.setCategorySortInfo=function(t){if("category"!==this.type)return!1;this.model.option.categorySortInfo=t,this.scale.setSortInfo(t)},e}(w_);function ob(t){return"cartesian2d"===t.get("coordinateSystem")}function sb(t){var e={xAxisModel:null,yAxisModel:null};return L(e,(function(n,i){var r=i.replace(/Model$/,""),a=t.getReferringComponents(r,dr).models[0];e[i]=a})),e}var lb=function(){function t(t,e,n){this.type="grid",this._coordsMap={},this._coordsList=[],this._axesMap={},this._axesList=[],this.axisPointerEnabled=!0,this.dimensions=nb,this._initCartesian(t,e,n),this.model=t}return t.prototype.getRect=function(){return this._rect},t.prototype.update=function(t,e){var n=this._axesMap;this._updateScale(t,this.model),L(n.x,(function(t){Jm(t.scale,t.model)})),L(n.y,(function(t){Jm(t.scale,t.model)}));var i={};L(n.x,(function(t){hb(n,"y",t,i)})),L(n.y,(function(t){hb(n,"x",t,i)})),this.resize(this.model,e)},t.prototype.resize=function(t,e,n){var i=t.getBoxLayoutParams(),r=!n&&t.get("containLabel"),a=Bh(i,{width:e.getWidth(),height:e.getHeight()});this._rect=a;var o=this._axesList;function s(){L(o,(function(t){var e=t.isHorizontal(),n=e?[0,a.width]:[0,a.height],i=t.inverse?1:0;t.setExtent(n[i],n[1-i]),function(t,e){var n=t.getExtent(),i=n[0]+n[1];t.toGlobalCoord="x"===t.dim?function(t){return t+e}:function(t){return i-t+e},t.toLocalCoord="x"===t.dim?function(t){return t-e}:function(t){return i-t+e}}(t,e?a.x:a.y)}))}s(),r&&(L(o,(function(t){if(!t.model.get(["axisLabel","inside"])){var e=function(t){var e=t.model,n=t.scale;if(e.get(["axisLabel","show"])&&!n.isBlank()){var i,r,a=n.getExtent();r=n instanceof dm?n.count():(i=n.getTicks()).length;var o,s=t.getLabelModel(),l=t_(t),u=1;r>40&&(u=Math.ceil(r/40));for(var h=0;h<r;h+=u){var c=l(i?i[h]:{value:a[0]+h},h),p=e_(s.getTextRect(c),s.get("rotate")||0);o?o.union(p):o=p}return o}}(t);if(e){var n=t.isHorizontal()?"height":"width",i=t.model.get(["axisLabel","margin"]);a[n]-=e[n]+i,"top"===t.position?a.y+=e.height+i:"left"===t.position&&(a.x+=e.width+i)}}})),s()),L(this._coordsList,(function(t){t.calcAffineTransform()}))},t.prototype.getAxis=function(t,e){var n=this._axesMap[t];if(null!=n)return n[e||0]},t.prototype.getAxes=function(){return this._axesList.slice()},t.prototype.getCartesian=function(t,e){if(null!=t&&null!=e){var n="x"+t+"y"+e;return this._coordsMap[n]}W(t)&&(e=t.yAxisIndex,t=t.xAxisIndex);for(var i=0,r=this._coordsList;i<r.length;i++)if(r[i].getAxis("x").index===t||r[i].getAxis("y").index===e)return r[i]},t.prototype.getCartesians=function(){return this._coordsList.slice()},t.prototype.convertToPixel=function(t,e,n){var i=this._findConvertTarget(e);return i.cartesian?i.cartesian.dataToPoint(n):i.axis?i.axis.toGlobalCoord(i.axis.dataToCoord(n)):null},t.prototype.convertFromPixel=function(t,e,n){var i=this._findConvertTarget(e);return i.cartesian?i.cartesian.pointToData(n):i.axis?i.axis.coordToData(i.axis.toLocalCoord(n)):null},t.prototype._findConvertTarget=function(t){var e,n,i=t.seriesModel,r=t.xAxisModel||i&&i.getReferringComponents("xAxis",dr).models[0],a=t.yAxisModel||i&&i.getReferringComponents("yAxis",dr).models[0],o=t.gridModel,s=this._coordsList;if(i)A(s,e=i.coordinateSystem)<0&&(e=null);else if(r&&a)e=this.getCartesian(r.componentIndex,a.componentIndex);else if(r)n=this.getAxis("x",r.componentIndex);else if(a)n=this.getAxis("y",a.componentIndex);else if(o){o.coordinateSystem===this&&(e=this._coordsList[0])}return{cartesian:e,axis:n}},t.prototype.containPoint=function(t){var e=this._coordsList[0];if(e)return e.containPoint(t)},t.prototype._initCartesian=function(t,e,n){var i=this,r=this,a={left:!1,right:!1,top:!1,bottom:!1},o={x:{},y:{}},s={x:0,y:0};if(e.eachComponent("xAxis",l("x"),this),e.eachComponent("yAxis",l("y"),this),!s.x||!s.y)return this._axesMap={},void(this._axesList=[]);function l(e){return function(n,i){if(ub(n,t)){var l=n.get("position");"x"===e?"top"!==l&&"bottom"!==l&&(l=a.bottom?"top":"bottom"):"left"!==l&&"right"!==l&&(l=a.left?"right":"left"),a[l]=!0;var u=new ab(e,Qm(n),[0,0],n.get("type"),l),h="category"===u.type;u.onBand=h&&n.get("boundaryGap"),u.inverse=n.get("inverse"),n.axis=u,u.model=n,u.grid=r,u.index=i,r._axesList.push(u),o[e][i]=u,s[e]++}}}this._axesMap=o,L(o.x,(function(e,n){L(o.y,(function(r,a){var o="x"+n+"y"+a,s=new rb(o);s.master=i,s.model=t,i._coordsMap[o]=s,i._coordsList.push(s),s.addAxis(e),s.addAxis(r)}))}))},t.prototype._updateScale=function(t,e){function n(t,e){L(function(t,e){var n={};return L(t.mapDimensionsAll(e),(function(e){n[nm(t,e)]=!0})),N(n)}(t,e.dim),(function(n){e.scale.unionExtentFromData(t,n)}))}L(this._axesList,(function(t){if(t.scale.setExtent(1/0,-1/0),"category"===t.type){var e=t.model.get("categorySortInfo");t.scale.setSortInfo(e)}})),t.eachSeries((function(t){if(ob(t)){var i=sb(t),r=i.xAxisModel,a=i.yAxisModel;if(!ub(r,e)||!ub(a,e))return;var o=this.getCartesian(r.componentIndex,a.componentIndex),s=t.getData(),l=o.getAxis("x"),u=o.getAxis("y");"list"===s.type&&(n(s,l),n(s,u))}}),this)},t.prototype.getTooltipAxes=function(t){var e=[],n=[];return L(this.getCartesians(),(function(i){var r=null!=t&&"auto"!==t?i.getAxis(t):i.getBaseAxis(),a=i.getOtherAxis(r);A(e,r)<0&&e.push(r),A(n,a)<0&&n.push(a)})),{baseAxes:e,otherAxes:n}},t.create=function(e,n){var i=[];return e.eachComponent("grid",(function(r,a){var o=new t(r,e,n);o.name="grid_"+a,o.resize(r,n,!0),r.coordinateSystem=o,i.push(o)})),e.eachSeries((function(t){if(ob(t)){var e=sb(t),n=e.xAxisModel,i=e.yAxisModel,r=n.getCoordSysModel();0;var a=r.coordinateSystem;t.coordinateSystem=a.getCartesian(n.componentIndex,i.componentIndex)}})),i},t.dimensions=nb,t}();function ub(t,e){return t.getCoordSysModel()===e}function hb(t,e,n,i){n.getAxesOnZeroOf=function(){return r?[r]:[]};var r,a=t[e],o=n.model,s=o.get(["axisLine","onZero"]),l=o.get(["axisLine","onZeroAxisIndex"]);if(s){if(null!=l)cb(a[l])&&(r=a[l]);else for(var u in a)if(a.hasOwnProperty(u)&&cb(a[u])&&!i[h(a[u])]){r=a[u];break}r&&(i[h(r)]=!0)}function h(t){return t.dim+"_"+t.index}}function cb(t){return t&&"category"!==t.type&&"time"!==t.type&&function(t){var e=t.scale.getExtent(),n=e[0],i=e[1];return!(n>0&&i>0||n<0&&i<0)}(t)}var pb=Math.PI,fb=function(){function t(t,e){this.group=new Mi,this.opt=e,this.axisModel=t,T(e,{labelOffset:0,nameDirection:1,tickDirection:1,labelDirection:1,silent:!0,handleAutoShown:function(){return!0}});var n=new Mi({x:e.position[0],y:e.position[1],rotation:e.rotation});n.updateTransform(),this._transformGroup=n}return t.prototype.hasBuilder=function(t){return!!db[t]},t.prototype.add=function(t){db[t](this.opt,this.axisModel,this.group,this._transformGroup)},t.prototype.getGroup=function(){return this.group},t.innerTextLayout=function(t,e,n){var i,r,a=Fi(e-t);return Vi(a)?(r=n>0?"top":"bottom",i="center"):Vi(a-pb)?(r=n>0?"bottom":"top",i="center"):(r="middle",i=a>0&&a<pb?n>0?"right":"left":n>0?"left":"right"),{rotation:a,textAlign:i,textVerticalAlign:r}},t.makeAxisEventDataBase=function(t){var e={componentType:t.mainType,componentIndex:t.componentIndex};return e[t.mainType+"Index"]=t.componentIndex,e},t.isLabelSilent=function(t){var e=t.get("tooltip");return t.get("silent")||!(t.get("triggerEvent")||e&&e.show)},t}(),db={axisLine:function(t,e,n,i){var r=e.get(["axisLine","show"]);if("auto"===r&&t.handleAutoShown&&(r=t.handleAutoShown("axisLine")),r){var a=e.axis.getExtent(),o=i.transform,s=[a[0],0],l=[a[1],0];o&&(Dt(s,s,o),Dt(l,l,o));var u=M({lineCap:"round"},e.getModel(["axisLine","lineStyle"]).getLineStyle()),h=new Ol({subPixelOptimize:!0,shape:{x1:s[0],y1:s[1],x2:l[0],y2:l[1]},style:u,strokeContainThreshold:t.strokeContainThreshold||5,silent:!0,z2:1});h.anid="line",n.add(h);var c=e.get(["axisLine","symbol"]),p=e.get(["axisLine","symbolSize"]),f=e.get(["axisLine","symbolOffset"])||0;if("number"==typeof f&&(f=[f,f]),null!=c){"string"==typeof c&&(c=[c,c]),"string"!=typeof p&&"number"!=typeof p||(p=[p,p]);var d=p[0],g=p[1];L([{rotate:t.rotation+Math.PI/2,offset:f[0],r:0},{rotate:t.rotation-Math.PI/2,offset:f[1],r:Math.sqrt((s[0]-l[0])*(s[0]-l[0])+(s[1]-l[1])*(s[1]-l[1]))}],(function(e,i){if("none"!==c[i]&&null!=c[i]){var r=Bd(c[i],-d/2,-g/2,d,g,u.stroke,!0),a=e.r+e.offset;r.attr({rotation:e.rotate,x:s[0]+a*Math.cos(t.rotation),y:s[1]-a*Math.sin(t.rotation),silent:!0,z2:11}),n.add(r)}}))}}},axisTickLabel:function(t,e,n,i){var r=function(t,e,n,i){var r=n.axis,a=n.getModel("axisTick"),o=a.get("show");"auto"===o&&i.handleAutoShown&&(o=i.handleAutoShown("axisTick"));if(!o||r.scale.isBlank())return;for(var s=a.getModel("lineStyle"),l=i.tickDirection*a.get("length"),u=mb(r.getTicksCoords(),e.transform,l,T(s.getLineStyle(),{stroke:n.get(["axisLine","lineStyle","color"])}),"ticks"),h=0;h<u.length;h++)t.add(u[h]);return u}(n,i,e,t),a=function(t,e,n,i){var r=n.axis;if(!$(i.axisLabelShow,n.get(["axisLabel","show"]))||r.scale.isBlank())return;var a=n.getModel("axisLabel"),o=a.get("margin"),s=r.getViewLabels(),l=($(i.labelRotate,a.get("rotate"))||0)*pb/180,u=fb.innerTextLayout(i.rotation,l,i.labelDirection),h=n.getCategories&&n.getCategories(!0),c=[],p=fb.isLabelSilent(n),f=n.get("triggerEvent");return L(s,(function(s,l){var d="ordinal"===r.scale.type?r.scale.getRawOrdinalNumber(s.tickValue):s.tickValue,g=s.formattedLabel,y=s.rawLabel,v=a;if(h&&h[d]){var m=h[d];W(m)&&m.textStyle&&(v=new zu(m.textStyle,a,n.ecModel))}var _=v.getTextColor()||n.get(["axisLine","lineStyle","color"]),x=r.dataToCoord(d),b=new Fo({x:x,y:i.labelOffset+i.labelDirection*o,rotation:u.rotation,silent:p,z2:10,style:xu(v,{text:g,align:v.getShallow("align",!0)||u.textAlign,verticalAlign:v.getShallow("verticalAlign",!0)||v.getShallow("baseline",!0)||u.textVerticalAlign,fill:"function"==typeof _?_("category"===r.type?y:"value"===r.type?d+"":d,l):_})});if(b.anid="label_"+d,f){var w=fb.makeAxisEventDataBase(n);w.targetType="axisLabel",w.value=y,qo(b).eventData=w}e.add(b),b.updateTransform(),c.push(b),t.add(b),b.decomposeTransform()})),c}(n,i,e,t);!function(t,e,n){if(i_(t.axis))return;var i=t.get(["axisLabel","showMinLabel"]),r=t.get(["axisLabel","showMaxLabel"]);n=n||[];var a=(e=e||[])[0],o=e[1],s=e[e.length-1],l=e[e.length-2],u=n[0],h=n[1],c=n[n.length-1],p=n[n.length-2];!1===i?(gb(a),gb(u)):yb(a,o)&&(i?(gb(o),gb(h)):(gb(a),gb(u)));!1===r?(gb(s),gb(c)):yb(l,s)&&(r?(gb(l),gb(p)):(gb(s),gb(c)))}(e,a,r),function(t,e,n,i){var r=n.axis,a=n.getModel("minorTick");if(!a.get("show")||r.scale.isBlank())return;var o=r.getMinorTicksCoords();if(!o.length)return;for(var s=a.getModel("lineStyle"),l=i*a.get("length"),u=T(s.getLineStyle(),T(n.getModel("axisTick").getLineStyle(),{stroke:n.get(["axisLine","lineStyle","color"])})),h=0;h<o.length;h++)for(var c=mb(o[h],e.transform,l,u,"minorticks_"+h),p=0;p<c.length;p++)t.add(c[p])}(n,i,e,t.tickDirection)},axisName:function(t,e,n,i){var r=$(t.axisName,e.get("name"));if(r){var a,o,s=e.get("nameLocation"),l=t.nameDirection,u=e.getModel("nameTextStyle"),h=e.get("nameGap")||0,c=e.axis.getExtent(),p=c[0]>c[1]?-1:1,f=["start"===s?c[0]-p*h:"end"===s?c[1]+p*h:(c[0]+c[1])/2,vb(s)?t.labelOffset+l*h:0],d=e.get("nameRotate");null!=d&&(d=d*pb/180),vb(s)?a=fb.innerTextLayout(t.rotation,null!=d?d:t.rotation,l):(a=function(t,e,n,i){var r,a,o=Fi(n-t),s=i[0]>i[1],l="start"===e&&!s||"start"!==e&&s;Vi(o-pb/2)?(a=l?"bottom":"top",r="center"):Vi(o-1.5*pb)?(a=l?"top":"bottom",r="center"):(a="middle",r=o<1.5*pb&&o>pb/2?l?"left":"right":l?"right":"left");return{rotation:o,textAlign:r,textVerticalAlign:a}}(t.rotation,s,d||0,c),null!=(o=t.axisNameAvailableWidth)&&(o=Math.abs(o/Math.sin(a.rotation)),!isFinite(o)&&(o=null)));var g=u.getFont(),y=e.get("nameTruncate",!0)||{},v=y.ellipsis,m=$(t.nameTruncateMaxWidth,y.maxWidth,o),_=new Fo({x:f[0],y:f[1],rotation:a.rotation,silent:fb.isLabelSilent(e),style:xu(u,{text:r,font:g,overflow:"truncate",width:m,ellipsis:v,fill:u.getTextColor()||e.get(["axisLine","lineStyle","color"]),align:u.get("align")||a.textAlign,verticalAlign:u.get("verticalAlign")||a.textVerticalAlign}),z2:1});if(function(t){var e=t.itemTooltipOption,n=t.componentModel,i=t.itemName,r=V(e)?{formatter:e}:e,a=n.mainType,o=n.componentIndex,s={componentType:a,name:i,$vars:["name"]};s[a+"Index"]=o;var l=t.formatterParamsExtra;l&&L(N(l),(function(t){ht(s,t)||(s[t]=l[t],s.$vars.push(t))}));var u=qo(t.el);u.componentMainType=a,u.componentIndex=o,u.tooltipConfig={name:i,option:T({content:i,formatterParams:s},r)}}({el:_,componentModel:e,itemName:r}),_.__fullText=r,_.anid="name",e.get("triggerEvent")){var x=fb.makeAxisEventDataBase(e);x.targetType="axisName",x.name=r,qo(_).eventData=x}i.add(_),_.updateTransform(),n.add(_),_.decomposeTransform()}}};function gb(t){t&&(t.ignore=!0)}function yb(t,e){var n=t&&t.getBoundingRect().clone(),i=e&&e.getBoundingRect().clone();if(n&&i){var r=oe([]);return he(r,r,-t.rotation),n.applyTransform(le([],r,t.getLocalTransform())),i.applyTransform(le([],r,e.getLocalTransform())),n.intersect(i)}}function vb(t){return"middle"===t||"center"===t}function mb(t,e,n,i,r){for(var a=[],o=[],s=[],l=0;l<t.length;l++){var u=t[l].coord;o[0]=u,o[1]=0,s[0]=u,s[1]=n,e&&(Dt(o,o,e),Dt(s,s,e));var h=new Ol({subPixelOptimize:!0,shape:{x1:o[0],y1:o[1],x2:s[0],y2:s[1]},style:i,z2:2,autoBatch:!0,silent:!0});h.anid=r+"_"+t[l].tickValue,a.push(h)}return a}function _b(t){var e=xb(t);if(e){var n=e.axisPointerModel,i=e.axis.scale,r=n.option,a=n.get("status"),o=n.get("value");null!=o&&(o=i.parse(o));var s=function(t){return!!t.get(["handle","show"])}(n);null==a&&(r.status=s?"show":"hide");var l=i.getExtent().slice();l[0]>l[1]&&l.reverse(),(null==o||o>l[1])&&(o=l[1]),o<l[0]&&(o=l[0]),r.value=o,s&&(r.status=e.axis.scale.isBlank()?"hide":"show")}}function xb(t){var e,n=(t.ecModel.getComponent("axisPointer")||{}).coordSysAxesInfo;return n&&n.axesInfo[(e=t,e.type+"||"+e.id)]}var bb={},wb=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(e,n,i,r){this.axisPointerClass&&_b(e),t.prototype.render.apply(this,arguments),this._doUpdateAxisPointerClass(e,i,!0)},e.prototype.updateAxisPointer=function(t,e,n,i){this._doUpdateAxisPointerClass(t,n,!1)},e.prototype.remove=function(t,e){var n=this._axisPointer;n&&n.remove(e)},e.prototype.dispose=function(e,n){this._disposeAxisPointer(n),t.prototype.dispose.apply(this,arguments)},e.prototype._doUpdateAxisPointerClass=function(t,n,i){var r=e.getAxisPointerClass(this.axisPointerClass);if(r){var a=function(t){var e=xb(t);return e&&e.axisPointerModel}(t);a?(this._axisPointer||(this._axisPointer=new r)).render(t,a,n,i):this._disposeAxisPointer(n)}},e.prototype._disposeAxisPointer=function(t){this._axisPointer&&this._axisPointer.dispose(t),this._axisPointer=null},e.registerAxisPointerClass=function(t,e){bb[t]=e},e.getAxisPointerClass=function(t){return t&&bb[t]},e.type="axis",e}(Jp),Sb=hr();var Mb=["axisLine","axisTickLabel","axisName"],Tb=["splitArea","splitLine","minorSplitLine"],Cb=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.axisPointerClass="CartesianAxisPointer",n}return n(e,t),e.prototype.render=function(e,n,i,r){this.group.removeAll();var a=this._axisGroup;if(this._axisGroup=new Mi,this.group.add(this._axisGroup),e.get("show")){var o=e.getCoordSysModel(),s=function(t,e,n){n=n||{};var i=t.coordinateSystem,r=e.axis,a={},o=r.getAxesOnZeroOf()[0],s=r.position,l=o?"onZero":s,u=r.dim,h=i.getRect(),c=[h.x,h.x+h.width,h.y,h.y+h.height],p={left:0,right:1,top:0,bottom:1,onZero:2},f=e.get("offset")||0,d="x"===u?[c[2]-f,c[3]+f]:[c[0]-f,c[1]+f];if(o){var g=o.toGlobalCoord(o.dataToCoord(0));d[p.onZero]=Math.max(Math.min(g,d[1]),d[0])}a.position=["y"===u?d[p[l]]:c[0],"x"===u?d[p[l]]:c[3]],a.rotation=Math.PI/2*("x"===u?0:1),a.labelDirection=a.tickDirection=a.nameDirection={top:-1,bottom:1,left:-1,right:1}[s],a.labelOffset=o?d[p[s]]-d[p.onZero]:0,e.get(["axisTick","inside"])&&(a.tickDirection=-a.tickDirection),$(n.labelInside,e.get(["axisLabel","inside"]))&&(a.labelDirection=-a.labelDirection);var y=e.get(["axisLabel","rotate"]);return a.labelRotate="top"===l?-y:y,a.z2=1,a}(o,e),l=new fb(e,M({handleAutoShown:function(t){for(var n=o.coordinateSystem.getCartesians(),i=0;i<n.length;i++){var r=n[i].getOtherAxis(e.axis).type;if("value"===r||"log"===r)return!0}return!1}},s));L(Mb,l.add,l),this._axisGroup.add(l.getGroup()),L(Tb,(function(t){e.get([t,"show"])&&Ab[t](this,this._axisGroup,e,o)}),this),function(t,e,n){if(t&&e){var i,r=(i={},t.traverse((function(t){du(t)&&t.anid&&(i[t.anid]=t)})),i);e.traverse((function(t){if(du(t)&&t.anid){var e=r[t.anid];if(e){var i=a(t);t.attr(a(e)),lu(t,i,n,qo(t).dataIndex)}}}))}function a(t){var e={x:t.x,y:t.y,rotation:t.rotation};return function(t){return null!=t.shape}(t)&&(e.shape=M({},t.shape)),e}}(a,this._axisGroup,e),t.prototype.render.call(this,e,n,i,r)}},e.prototype.remove=function(){Sb(this).splitAreaColors=null},e.type="cartesianAxis",e}(wb),Ab={splitLine:function(t,e,n,i){var r=n.axis;if(!r.scale.isBlank()){var a=n.getModel("splitLine"),o=a.getModel("lineStyle"),s=o.get("color");s=z(s)?s:[s];for(var l=i.coordinateSystem.getRect(),u=r.isHorizontal(),h=0,c=r.getTicksCoords({tickModel:a}),p=[],f=[],d=o.getLineStyle(),g=0;g<c.length;g++){var y=r.toGlobalCoord(c[g].coord);u?(p[0]=y,p[1]=l.y,f[0]=y,f[1]=l.y+l.height):(p[0]=l.x,p[1]=y,f[0]=l.x+l.width,f[1]=y);var v=h++%s.length,m=c[g].tickValue;e.add(new Ol({anid:null!=m?"line_"+c[g].tickValue:null,subPixelOptimize:!0,autoBatch:!0,shape:{x1:p[0],y1:p[1],x2:f[0],y2:f[1]},style:T({stroke:s[v]},d),silent:!0}))}}},minorSplitLine:function(t,e,n,i){var r=n.axis,a=n.getModel("minorSplitLine").getModel("lineStyle"),o=i.coordinateSystem.getRect(),s=r.isHorizontal(),l=r.getMinorTicksCoords();if(l.length)for(var u=[],h=[],c=a.getLineStyle(),p=0;p<l.length;p++)for(var f=0;f<l[p].length;f++){var d=r.toGlobalCoord(l[p][f].coord);s?(u[0]=d,u[1]=o.y,h[0]=d,h[1]=o.y+o.height):(u[0]=o.x,u[1]=d,h[0]=o.x+o.width,h[1]=d),e.add(new Ol({anid:"minor_line_"+l[p][f].tickValue,subPixelOptimize:!0,autoBatch:!0,shape:{x1:u[0],y1:u[1],x2:h[0],y2:h[1]},style:c,silent:!0}))}},splitArea:function(t,e,n,i){!function(t,e,n,i){var r=n.axis;if(!r.scale.isBlank()){var a=n.getModel("splitArea"),o=a.getModel("areaStyle"),s=o.get("color"),l=i.coordinateSystem.getRect(),u=r.getTicksCoords({tickModel:a,clamp:!0});if(u.length){var h=s.length,c=Sb(t).splitAreaColors,p=lt(),f=0;if(c)for(var d=0;d<u.length;d++){var g=c.get(u[d].tickValue);if(null!=g){f=(g+(h-1)*d)%h;break}}var y=r.toGlobalCoord(u[0].coord),v=o.getAreaStyle();for(s=z(s)?s:[s],d=1;d<u.length;d++){var m=r.toGlobalCoord(u[d].coord),_=void 0,x=void 0,b=void 0,w=void 0;r.isHorizontal()?(_=y,x=l.y,b=m-_,w=l.height,y=_+b):(_=l.x,x=y,b=l.width,y=x+(w=m-x));var S=u[d-1].tickValue;null!=S&&p.set(S,f),e.add(new Eo({anid:null!=S?"area_"+S:null,shape:{x:_,y:x,width:b,height:w},style:T({fill:s[f]},v),autoBatch:!0,silent:!0})),f=(f+1)%h}Sb(t).splitAreaColors=p}}}(t,e,n,i)}},Db=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="xAxis",e}(Cb),Ib=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=Db.type,e}return n(e,t),e.type="yAxis",e}(Cb),kb=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="grid",e}return n(e,t),e.prototype.render=function(t,e){this.group.removeAll(),t.get("show")&&this.group.add(new Eo({shape:t.coordinateSystem.getRect(),style:T({fill:t.get("backgroundColor")},t.getItemStyle()),silent:!0,z2:-1}))},e.type="grid",e}(Jp),Lb={offset:0};var Pb={label:{enabled:!0},decal:{show:!1}},Ob=hr(),Rb={};function Nb(t,e){var n=t.getModel("aria");if(n.get("enabled")){var i=w(Pb);S(i.label,t.getLocaleModel().get("aria"),!1),S(n.option,i,!1),function(){if(n.getModel("decal").get("show")){var e=lt();t.eachSeries((function(t){if(t.useColorPaletteOnData){var n=e.get(t.type);n||(n={},e.set(t.type,n)),Ob(t).scope=n}})),t.eachRawSeries((function(e){if(!t.isSeriesFiltered(e))if("function"!=typeof e.enableAriaDecal){var n=e.getData();if(e.useColorPaletteOnData){var i=e.getRawData(),r={},a=Ob(e).scope;n.each((function(t){var e=n.getRawIndex(t);r[e]=t}));var o=i.count();i.each((function(t){var s=r[t],l=i.getName(t)||t+"",h=vc(e.ecModel,l,a,o),c=n.getItemVisual(s,"decal");n.setItemVisual(s,"decal",u(c,h))}))}else{var s=vc(e.ecModel,e.name,Rb,t.getSeriesCount()),l=n.getVisual("decal");n.setVisual("decal",u(l,s))}}else e.enableAriaDecal();function u(t,e){var n=t?M(M({},e),t):e;return n.dirty=!0,n}}))}}(),function(){var i=t.getLocaleModel().get("aria"),a=n.getModel("label");if(a.option=T(a.option,i),!a.get("enabled"))return;var o=e.getZr().dom;if(a.get("description"))return void o.setAttribute("aria-label",a.get("description"));var s,l=t.getSeriesCount(),u=a.get(["data","maxCount"])||10,h=a.get(["series","maxCount"])||10,c=Math.min(l,h);if(l<1)return;var p=function(){var e=t.get("title");e&&e.length&&(e=e[0]);return e&&e.text}();if(p){var f=a.get(["general","withTitle"]);s=r(f,{title:p})}else s=a.get(["general","withoutTitle"]);var d=[],g=l>1?a.get(["series","multiple","prefix"]):a.get(["series","single","prefix"]);s+=r(g,{seriesCount:l}),t.eachSeries((function(e,n){if(n<c){var i=void 0,o=e.get("name")?"withName":"withoutName";i=r(i=l>1?a.get(["series","multiple",o]):a.get(["series","single",o]),{seriesId:e.seriesIndex,seriesName:e.get("name"),seriesType:(_=e.subType,t.getLocaleModel().get(["series","typeNames"])[_]||"自定义图")});var s=e.getData();if(s.count()>u)i+=r(a.get(["data","partialData"]),{displayCnt:u});else i+=a.get(["data","allData"]);for(var h=[],p=0;p<s.count();p++)if(p<u){var f=s.getName(p),g=bp(s,p),y=a.get(["data",f?"withName":"withoutName"]);h.push(r(y,{name:f,value:g}))}var v=a.get(["data","separator","middle"]),m=a.get(["data","separator","end"]);i+=h.join(v)+m,d.push(i)}var _}));var y=a.getModel(["series","multiple","separator"]),v=y.get("middle"),m=y.get("end");s+=d.join(v)+m,o.setAttribute("aria-label",s)}()}function r(t,e){if("string"!=typeof t)return t;var n=t;return L(e,(function(t,e){n=n.replace(new RegExp("\\{\\s*"+e+"\\s*\\}","g"),t)})),n}}function Eb(t){if(t&&t.aria){var e=t.aria;null!=e.show&&(e.enabled=e.show),e.label=e.label||{},L(["description","general","series","data"],(function(t){null!=e[t]&&(e.label[t]=e[t])}))}}var Bb=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="dataset",e}return n(e,t),e.prototype.init=function(e,n,i){t.prototype.init.call(this,e,n,i),this._sourceManager=new Ep(this),Bp(this)},e.prototype.mergeOption=function(e,n){t.prototype.mergeOption.call(this,e,n),Bp(this)},e.prototype.optionUpdated=function(){this._sourceManager.dirty()},e.prototype.getSourceManager=function(){return this._sourceManager},e.type="dataset",e.defaultOption={seriesLayoutBy:Qh},e}(Gh),zb=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="dataset",e}return n(e,t),e.type="dataset",e}(Jp);vv([function(t){t.registerPainter("canvas",L_)}]),vv([function(t){t.registerChartView(cx),t.registerSeriesModel(P_),t.registerLayout(function(t,e){return{seriesType:t,plan:Qp(),reset:function(t){var n=t.getData(),i=t.coordinateSystem,r=t.pipelineContext,a=e||r.large;if(i){var o=P(i.dimensions,(function(t){return n.mapDimension(t)})).slice(0,2),s=o.length,l=n.getCalculationInfo("stackResultDimension");em(n,o[0])&&(o[0]=l),em(n,o[1])&&(o[1]=l);var u=n.getDimensionInfo(o[0]),h=n.getDimensionInfo(o[1]),c=u&&u.index,p=h&&h.index;return s&&{progress:function(t,e){for(var n=t.end-t.start,r=a&&Y_(n*s),o=[],l=[],u=t.start,h=0;u<t.end;u++){var f=void 0;if(1===s){var d=e.getByDimIdx(c,u);f=i.dataToPoint(d,null,l)}else o[0]=e.getByDimIdx(c,u),o[1]=e.getByDimIdx(p,u),f=i.dataToPoint(o,null,l);a?(r[h++]=f[0],r[h++]=f[1]):e.setItemLayout(u,f.slice())}a&&e.setLayout("points",r)}}}}}}("line",!0)),t.registerVisual({seriesType:"line",reset:function(t){var e=t.getData(),n=t.getModel("lineStyle").getLineStyle();n&&!n.stroke&&(n.stroke=e.getVisual("style").fill),e.setVisual("legendLineStyle",n)}}),t.registerProcessor(t.PRIORITY.PROCESSOR.STATISTIC,dx("line"))},function(t){t.registerChartView(Sx),t.registerSeriesModel(yx),t.registerLayout(t.PRIORITY.VISUAL.LAYOUT,B(Sm,"bar")),t.registerLayout(t.PRIORITY.VISUAL.PROGRESSIVE_LAYOUT,Mm),t.registerProcessor(t.PRIORITY.PROCESSOR.STATISTIC,dx("bar")),t.registerAction({type:"changeAxisOrder",event:"changeAxisOrder",update:"update"},(function(t,e){var n=t.componentType||"series";e.eachComponent({mainType:n,query:t},(function(e){t.sortInfo&&e.axis.setCategorySortInfo(t.sortInfo)}))}))},function(t){t.registerChartView(Wx),t.registerSeriesModel(Yx),function(t,e){function n(e,n){var i=[];return e.eachComponent({mainType:"series",subType:t,query:n},(function(t){i.push(t.seriesIndex)})),i}L([[t+"ToggleSelect","toggleSelect"],[t+"Select","select"],[t+"UnSelect","unselect"]],(function(t){e(t[0],(function(e,i,r){e=M({},e),r.dispatchAction(M(e,{type:t[1],seriesIndex:n(i,e)}))}))}))}("pie",t.registerAction),t.registerLayout(B(Ex,"pie")),t.registerProcessor(function(t){return{seriesType:t,reset:function(t,e){var n=e.findComponents({mainType:"legend"});if(n&&n.length){var i=t.getData();i.filterSelf((function(t){for(var e=i.getName(t),r=0;r<n.length;r++)if(!n[r].isSelected(e))return!1;return!0}))}}}}("pie"))}]),vv([function(t){t.registerComponentView(kb),t.registerComponentModel(Xx),t.registerCoordinateSystem("cartesian2d",lb),Qx(t,"x",qx,Lb),Qx(t,"y",qx,Lb),t.registerComponentView(Db),t.registerComponentView(Ib),t.registerPreprocessor((function(t){t.xAxis&&t.yAxis&&!t.grid&&(t.grid={})}))},function(t){t.registerPreprocessor(Eb),t.registerVisual(t.PRIORITY.VISUAL.ARIA,Nb)},function(t){t.registerComponentModel(Bb),t.registerComponentView(zb)}]),t.Axis=w_,t.ChartView=nf,t.ComponentModel=Gh,t.ComponentView=Jp,t.List=qv,t.Model=zu,t.PRIORITY=ay,t.SeriesModel=Up,t.color=je,t.connect=function(t){if(z(t)){var e=t;t=null,Jg(e,(function(e){null!=e.group&&(t=e.group)})),t=t||"g_"+Ky++,Jg(e,(function(e){e.group=t}))}return jy[t]=!0,t},t.dataTool={},t.dependencies={zrender:"5.1.0"},t.disConnect=Jy,t.disconnect=Qy,t.dispose=function(t){"string"==typeof t?t=qy[t]:t instanceof Ry||(t=tv(t)),t instanceof Ry&&!t.isDisposed()&&t.dispose()},t.env=o,t.extendChartView=function(t){var e=nf.extend(t);return nf.registerClass(e),e},t.extendComponentModel=function(t){var e=Gh.extend(t);return Gh.registerClass(e),e},t.extendComponentView=function(t){var e=Jp.extend(t);return Jp.registerClass(e),e},t.extendSeriesModel=function(t){var e=Up.extend(t);return Up.registerClass(e),e},t.format=h_,t.getCoordinateSystemDimensions=function(t){var e=Cc.get(t);if(e)return e.getDimensionsInfo?e.getDimensionsInfo():e.dimensions.slice()},t.getInstanceByDom=tv,t.getInstanceById=function(t){return qy[t]},t.getMap=function(t){return Kg(t)},t.graphic=u_,t.helper=o_,t.init=function(t,e,n){var i=tv(t);if(i)return i;var r=new Ry(t,e,n);return r.id="ec_"+Zy++,qy[r.id]=r,yr(t,$y,r.id),Dy(r),Jg(Gy,(function(t){t(r)})),r},t.innerDrawElementOnCanvas=Qd,t.matrix=fe,t.number=s_,t.parseGeoJSON=zg,t.parseGeoJson=zg,t.registerAction=ov,t.registerCoordinateSystem=sv,t.registerLayout=lv,t.registerLoading=pv,t.registerLocale=qu,t.registerMap=fv,t.registerPostInit=rv,t.registerPostUpdate=av,t.registerPreprocessor=nv,t.registerProcessor=iv,t.registerTheme=ev,t.registerTransform=dv,t.registerVisual=uv,t.setCanvasCreator=function(t){m("createCanvas",t)},t.throttle=uf,t.time=l_,t.use=vv,t.util=c_,t.vector=Lt,t.version="5.1.1",t.zrUtil=pt,t.zrender=Li,Object.defineProperty(t,"__esModule",{value:!0})}));
