!function(t,e){"function"==typeof define&&define.amd?define([],e):"object"==typeof module&&module.exports?module.exports=e():t.echarts=e()}(this,function(){var t,e;!function(){function i(t,e){if(!e)return t;if(0===t.indexOf(".")){var i=e.split("/"),n=t.split("/"),r=i.length-1,a=n.length,o=0,s=0;t:for(var u=0;a>u;u++)switch(n[u]){case"..":if(!(r>o))break t;o++,s++;break;case".":s++;break;default:break t}return i.length=r-o,n=n.slice(s),i.concat(n).join("/")}return t}function n(t){function e(e,o){if("string"==typeof e){var s=n[e];return s||(s=a(i(e,t)),n[e]=s),s}e instanceof Array&&(o=o||function(){},o.apply(this,r(e,o,t)))}var n={};return e}function r(e,n,r){for(var s=[],u=o[r],c=0,l=Math.min(e.length,n.length);l>c;c++){var h,f=i(e[c],r);switch(f){case"require":h=u&&u.require||t;break;case"exports":h=u.exports;break;case"module":h=u;break;default:h=a(f)}s.push(h)}return s}function a(t){var e=o[t];if(!e)throw new Error("No "+t);if(!e.defined){var i=e.factory,n=i.apply(this,r(e.deps||[],i,t));"undefined"!=typeof n&&(e.exports=n),e.defined=1}return e.exports}var o={};e=function(t,e,i){if(2===arguments.length&&(i=e,e=[],"function"!=typeof i)){var r=i;i=function(){return r}}o[t]={id:t,deps:e,factory:i,defined:0,exports:{},require:n(t)}},t=n("")}();var i="getAxis",n="coordinateSystem",r="setItemLayout",a="dimensions",o="hostModel",s="itemStyle",u="setItemVisual",c="setVisual",l="update",h="zlevel",f="updateProps",d="buildPath",p="closePath",v="bezierCurveTo",m="lineTo",g="moveTo",y="beginPath",x="contain",_="textBaseline",b="textAlign",w="eachItemGraphicEl",M="getItemGraphicEl",S="dataIndex",C="trigger",k="traverse",A="remove",z="__dirty",L="refresh",T="ignore",P="stopAnimation",D="animation",I="getLocalTransform",O="parent",B="transform",R="rotation",E="getDataParams",N="getItemModel",F="getRawValue",G="ordinal",V="getData",q="seriesIndex",H="normal",W="emphasis",Z="getComponent",j="getHeight",X="getWidth",U="splice",Y="isString",$="isObject",Q="position",K="toLowerCase",J="parsePercent",tt="replace",et="option",it="../util/clazz",nt="getFont",rt="getBoundingRect",at="textStyle",ot="getModel",st="ecModel",ut="substr",ct="defaults",lt="inside",ht="center",ft="middle",dt="bottom",pt="../core/util",vt="create",mt="height",gt="applyTransform",yt="distance",xt="undefined",_t="opacity",bt="stroke",wt="lineWidth",Mt="getShallow",St="isArray",Ct="getClass",kt="enableClassManagement",At="inherits",zt="extend",Lt="enableClassExtend",Tt="parseClassType",Pt="function",Dt="concat",It="number",Ot="string",Bt="indexOf",Rt="getContext",Et="canvas",Nt="length",Ft="filter",Gt="zrender/core/util",Vt="prototype",qt="require";e("zrender/graphic/Gradient",[qt],function(t){var e=function(t){this.colorStops=t||[]};return e[Vt]={constructor:e,addColorStop:function(t,e){this.colorStops.push({offset:t,color:e})}},e}),e(Gt,[qt,"../graphic/Gradient"],function(t){function e(t){if("object"==typeof t&&null!==t){var i=t;if(t instanceof Array){i=[];for(var n=0,r=t[Nt];r>n;n++)i[n]=e(t[n])}else if(!M(t)&&!S(t)){i={};for(var a in t)t.hasOwnProperty(a)&&(i[a]=e(t[a]))}return i}return t}function i(t,n,r){if(t){if(!n)return t;for(var a in n)if(n.hasOwnProperty(a)){var o=t[a],s=n[a];!w(s)||!w(o)||x(s)||x(o)||S(s)||S(o)||M(s)||M(o)?!r&&a in t||(t[a]=e(n[a],!0)):i(o,s,r)}return t}}function n(t,e){for(var n=t[0],r=1,a=t[Nt];a>r;r++)n=i(n,t[r],e);return n}function r(t,e){for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i]);return t}function a(t,e,i){for(var n in e)e.hasOwnProperty(n)&&(i?null!=e[n]:null==t[n])&&(t[n]=e[n]);return t}function o(){return document.createElement(Et)}function s(){return z||(z=N.createCanvas()[Rt]("2d")),z}function u(t,e){if(t){if(t[Bt])return t[Bt](e);for(var i=0,n=t[Nt];n>i;i++)if(t[i]===e)return i}return-1}function c(t,e){function i(){}var n=t[Vt];i[Vt]=e[Vt],t[Vt]=new i;for(var r in n)t[Vt][r]=n[r];t[Vt].constructor=t,t.superClass=e}function l(t,e,i){t=Vt in t?t[Vt]:t,e=Vt in e?e[Vt]:e,a(t,e,i)}function h(t){return t?typeof t==Ot?!1:typeof t[Nt]==It:void 0}function f(t,e,i){if(t&&e)if(t.forEach&&t.forEach===I)t.forEach(e,i);else if(t[Nt]===+t[Nt])for(var n=0,r=t[Nt];r>n;n++)e.call(i,t[n],n,t);else for(var a in t)t.hasOwnProperty(a)&&e.call(i,t[a],a,t)}function d(t,e,i){if(t&&e){if(t.map&&t.map===R)return t.map(e,i);for(var n=[],r=0,a=t[Nt];a>r;r++)n.push(e.call(i,t[r],r,t));return n}}function p(t,e,i,n){if(t&&e){if(t.reduce&&t.reduce===E)return t.reduce(e,i,n);for(var r=0,a=t[Nt];a>r;r++)i=e.call(n,i,t[r],r,t);return i}}function v(t,e,i){if(t&&e){if(t[Ft]&&t[Ft]===O)return t[Ft](e,i);for(var n=[],r=0,a=t[Nt];a>r;r++)e.call(i,t[r],r,t)&&n.push(t[r]);return n}}function m(t,e,i){if(t&&e)for(var n=0,r=t[Nt];r>n;n++)if(e.call(i,t[n],n,t))return t[n]}function g(t,e){var i=B.call(arguments,2);return function(){return t.apply(e,i[Dt](B.call(arguments)))}}function y(t){var e=B.call(arguments,1);return function(){return t.apply(this,e[Dt](B.call(arguments)))}}function x(t){return"[object Array]"===P.call(t)}function _(t){return typeof t===Pt}function b(t){return"[object String]"===P.call(t)}function w(t){var e=typeof t;return e===Pt||!!t&&"object"==e}function M(t){return!!T[P.call(t)]||t instanceof L}function S(t){return t&&1===t.nodeType&&typeof t.nodeName==Ot}function C(t){for(var e=0,i=arguments[Nt];i>e;e++)if(null!=arguments[e])return arguments[e]}function k(){return Function.call.apply(B,arguments)}function A(t,e){if(!t)throw new Error(e)}var z,L=t("../graphic/Gradient"),T={"[object Function]":1,"[object RegExp]":1,"[object Date]":1,"[object Error]":1,"[object CanvasGradient]":1},P=Object[Vt].toString,D=Array[Vt],I=D.forEach,O=D[Ft],B=D.slice,R=D.map,E=D.reduce,N={inherits:c,mixin:l,clone:e,merge:i,mergeAll:n,extend:r,defaults:a,getContext:s,createCanvas:o,indexOf:u,slice:k,find:m,isArrayLike:h,each:f,map:d,reduce:p,filter:v,bind:g,curry:y,isArray:x,isString:b,isObject:w,isFunction:_,isBuildInObject:M,isDom:S,retrieve:C,assert:A,noop:function(){}};return N}),e("echarts/util/clazz",[qt,Gt],function(t){function e(t,e){for(var i,n=t.constructor,r=t[e];(n=n.$superClass)&&(i=n[Vt][e])&&i===r;);return i}var i=t(Gt),n={},r=".",a="___EC__COMPONENT__CONTAINER___",o=n[Tt]=function(t){var e={main:"",sub:""};return t&&(t=t.split(r),e.main=t[0]||"",e.sub=t[1]||""),e};return n[Lt]=function(t,n){t[zt]=function(r){var a=function(){n&&n.apply(this,arguments),t.apply(this,arguments)};return i[zt](a[Vt],i[zt]({$superCall:function(t){var n=i.slice(arguments,1);return e(this,t).apply(this,n)},$superApply:function(t,i){return e(this,t).apply(this,i)}},r)),a[zt]=this[zt],i[At](a,this),a.$superClass=this,a}},n[kt]=function(t,e){function n(t){var e=r[t.main];return e&&e[a]||(e=r[t.main]={},e[a]=!0),e}e=e||{};var r={};if(t.registerClass=function(t,e){if(e)if(e=o(e),e.sub){if(e.sub!==a){var i=n(e);i[e.sub]=t}}else{if(r[e.main])throw new Error(e.main+"exists");r[e.main]=t}return t},t[Ct]=function(t,e,i){var n=r[t];if(n&&n[a]&&(n=e?n[e]:null),i&&!n)throw new Error("Component "+t+"."+(e||"")+" not exists");return n},t.getClassesByMainType=function(t){t=o(t);var e=[],n=r[t.main];return n&&n[a]?i.each(n,function(t,i){i!==a&&e.push(t)}):e.push(n),e},t.hasClass=function(t){return t=o(t),!!r[t.main]},t.getAllClassMainTypes=function(){var t=[];return i.each(r,function(e,i){t.push(i)}),t},t.hasSubTypes=function(t){t=o(t);var e=r[t.main];return e&&e[a]},t[Tt]=o,e.registerWhenExtend){var s=t[zt];s&&(t[zt]=function(e){var i=s.call(this,e);return t.registerClass(i,e.type)})}return t},n.setReadOnly=function(t,e){i[St](e)||(e=null!=e?[e]:[]),i.each(e,function(e){var n=t[e];Object.defineProperty&&Object.defineProperty(t,e,{value:n,writable:!1}),i[St](t[e])&&Object.freeze&&Object.freeze(t[e])})},n}),e("echarts/model/mixin/makeStyleMapper",[qt,Gt],function(t){var e=t(Gt);return function(t){for(var i=0;i<t[Nt];i++)t[i][1]||(t[i][1]=t[i][0]);return function(i){for(var n={},r=0;r<t[Nt];r++){var a=t[r][1];if(!(i&&e[Bt](i,a)>=0)){var o=this[Mt](a);null!=o&&(n[t[r][0]]=o)}}return n}}}),e("echarts/model/mixin/lineStyle",[qt,"./makeStyleMapper"],function(t){var e=t("./makeStyleMapper")([[wt,"width"],[bt,"color"],[_t],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"]]);return{getLineStyle:function(t){var i=e.call(this,t),n=this.getLineDash();return n&&(i.lineDash=n),i},getLineDash:function(){var t=this.get("type");return"solid"===t||null==t?null:"dashed"===t?[5,5]:[1,1]}}}),e("echarts/model/mixin/areaStyle",[qt,"./makeStyleMapper"],function(t){return{getAreaStyle:t("./makeStyleMapper")([["fill","color"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],[_t],["shadowColor"]])}}),e("zrender/core/vector",[],function(){var t=typeof Float32Array===xt?Array:Float32Array,e={create:function(e,i){var n=new t(2);return n[0]=e||0,n[1]=i||0,n},copy:function(t,e){return t[0]=e[0],t[1]=e[1],t},clone:function(e){var i=new t(2);return i[0]=e[0],i[1]=e[1],i},set:function(t,e,i){return t[0]=e,t[1]=i,t},add:function(t,e,i){return t[0]=e[0]+i[0],t[1]=e[1]+i[1],t},scaleAndAdd:function(t,e,i,n){return t[0]=e[0]+i[0]*n,t[1]=e[1]+i[1]*n,t},sub:function(t,e,i){return t[0]=e[0]-i[0],t[1]=e[1]-i[1],t},len:function(t){return Math.sqrt(this.lenSquare(t))},lenSquare:function(t){return t[0]*t[0]+t[1]*t[1]},mul:function(t,e,i){return t[0]=e[0]*i[0],t[1]=e[1]*i[1],t},div:function(t,e,i){return t[0]=e[0]/i[0],t[1]=e[1]/i[1],t},dot:function(t,e){return t[0]*e[0]+t[1]*e[1]},scale:function(t,e,i){return t[0]=e[0]*i,t[1]=e[1]*i,t},normalize:function(t,i){var n=e.len(i);return 0===n?(t[0]=0,t[1]=0):(t[0]=i[0]/n,t[1]=i[1]/n),t},distance:function(t,e){return Math.sqrt((t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1]))},distanceSquare:function(t,e){return(t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1])},negate:function(t,e){return t[0]=-e[0],t[1]=-e[1],t},lerp:function(t,e,i,n){return t[0]=e[0]+n*(i[0]-e[0]),t[1]=e[1]+n*(i[1]-e[1]),t},applyTransform:function(t,e,i){var n=e[0],r=e[1];return t[0]=i[0]*n+i[2]*r+i[4],t[1]=i[1]*n+i[3]*r+i[5],t},min:function(t,e,i){return t[0]=Math.min(e[0],i[0]),t[1]=Math.min(e[1],i[1]),t},max:function(t,e,i){return t[0]=Math.max(e[0],i[0]),t[1]=Math.max(e[1],i[1]),t}};return e[Nt]=e.len,e.lengthSquare=e.lenSquare,e.dist=e[yt],e.distSquare=e.distanceSquare,e}),e("zrender/core/matrix",[],function(){var t=typeof Float32Array===xt?Array:Float32Array,e={create:function(){var i=new t(6);return e.identity(i),i},identity:function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t},copy:function(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},mul:function(t,e,i){var n=e[0]*i[0]+e[2]*i[1],r=e[1]*i[0]+e[3]*i[1],a=e[0]*i[2]+e[2]*i[3],o=e[1]*i[2]+e[3]*i[3],s=e[0]*i[4]+e[2]*i[5]+e[4],u=e[1]*i[4]+e[3]*i[5]+e[5];return t[0]=n,t[1]=r,t[2]=a,t[3]=o,t[4]=s,t[5]=u,t},translate:function(t,e,i){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4]+i[0],t[5]=e[5]+i[1],t},rotate:function(t,e,i){var n=e[0],r=e[2],a=e[4],o=e[1],s=e[3],u=e[5],c=Math.sin(i),l=Math.cos(i);return t[0]=n*l+o*c,t[1]=-n*c+o*l,t[2]=r*l+s*c,t[3]=-r*c+l*s,t[4]=l*a+c*u,t[5]=l*u-c*a,t},scale:function(t,e,i){var n=i[0],r=i[1];return t[0]=e[0]*n,t[1]=e[1]*r,t[2]=e[2]*n,t[3]=e[3]*r,t[4]=e[4]*n,t[5]=e[5]*r,t},invert:function(t,e){var i=e[0],n=e[2],r=e[4],a=e[1],o=e[3],s=e[5],u=i*o-a*n;return u?(u=1/u,t[0]=o*u,t[1]=-a*u,t[2]=-n*u,t[3]=i*u,t[4]=(n*s-o*r)*u,t[5]=(a*r-i*s)*u,t):null}};return e}),e("zrender/core/BoundingRect",[qt,"./vector","./matrix"],function(t){function e(t,e,i,n){this.x=t,this.y=e,this.width=i,this[mt]=n}var i=t("./vector"),n=t("./matrix"),r=i[gt],a=Math.min,o=Math.abs,s=Math.max;return e[Vt]={constructor:e,union:function(t){var e=a(t.x,this.x),i=a(t.y,this.y);this.width=s(t.x+t.width,this.x+this.width)-e,this[mt]=s(t.y+t[mt],this.y+this[mt])-i,this.x=e,this.y=i},applyTransform:function(){var t=[],e=[];return function(i){i&&(t[0]=this.x,t[1]=this.y,e[0]=this.x+this.width,e[1]=this.y+this[mt],r(t,t,i),r(e,e,i),this.x=a(t[0],e[0]),this.y=a(t[1],e[1]),this.width=o(e[0]-t[0]),this[mt]=o(e[1]-t[1]))}}(),calculateTransform:function(t){var e=this,i=t.width/e.width,r=t[mt]/e[mt],a=n[vt]();return n.translate(a,a,[-e.x,-e.y]),n.scale(a,a,[i,r]),n.translate(a,a,[t.x,t.y]),a},intersect:function(t){var e=this,i=e.x,n=e.x+e.width,r=e.y,a=e.y+e[mt],o=t.x,s=t.x+t.width,u=t.y,c=t.y+t[mt];return!(o>n||i>s||u>a||r>c)},contain:function(t,e){var i=this;return t>=i.x&&t<=i.x+i.width&&e>=i.y&&e<=i.y+i[mt]},clone:function(){return new e(this.x,this.y,this.width,this[mt])},copy:function(t){this.x=t.x,this.y=t.y,this.width=t.width,this[mt]=t[mt]}},e}),e("zrender/contain/text",[qt,pt,"../core/BoundingRect"],function(t){function e(t,e){var i=t+":"+e;if(s[i])return s[i];for(var n=(t+"").split("\n"),r=0,a=0,o=n[Nt];o>a;a++)r=Math.max(f.measureText(n[a],e).width,r);return u>c&&(u=0,s={}),u++,s[i]=r,r}function i(t,i,n,r){var a=((t||"")+"").split("\n")[Nt],o=e(t,i),s=e("国",i),u=a*s,c=new h(0,0,o,u);switch(c.lineHeight=s,r){case dt:case"alphabetic":c.y-=s;break;case ft:c.y-=s/2}switch(n){case"end":case"right":c.x-=c.width;break;case ht:c.x-=c.width/2}return c}function n(t,e,i,n){var r=e.x,a=e.y,o=e[mt],s=e.width,u=i[mt],c=o/2-u/2,l="left";switch(t){case"left":r-=n,a+=c,l="right";break;case"right":r+=n+s,a+=c,l="left";break;case"top":r+=s/2,a-=n+u,l=ht;break;case dt:r+=s/2,a+=o+n,l=ht;break;case lt:r+=s/2,a+=c,l=ht;break;case"insideLeft":r+=n,a+=c,l="left";break;case"insideRight":r+=s-n,a+=c,l="right";break;case"insideTop":r+=s/2,a+=n,l=ht;break;case"insideBottom":r+=s/2,a+=o-u-n,l=ht;break;case"insideTopLeft":r+=n,a+=n,l="left";break;case"insideTopRight":r+=s-n,a+=n,l="right";break;case"insideBottomLeft":r+=n,a+=o-u-n;break;case"insideBottomRight":r+=s-n,a+=o-u-n,l="right"}return{x:r,y:a,textAlign:l,textBaseline:"top"}}function r(t,i,n,r){if(!n)return"";r=l[ct]({ellipsis:"...",minCharacters:3,maxIterations:3,cnCharWidth:e("国",i),ascCharWidth:e("a",i)},r,!0),n-=e(r.ellipsis);for(var o=(t+"").split("\n"),s=0,u=o[Nt];u>s;s++)o[s]=a(o[s],i,n,r);return o.join("\n")}function a(t,i,n,r){for(var a=0;;a++){var s=e(t,i);if(n>s||a>=r.maxIterations){t+=r.ellipsis;break}var u=0===a?o(t,n,r):Math.floor(t[Nt]*n/s);if(u<r.minCharacters){t="";break}t=t[ut](0,u)}return t}function o(t,e,i){for(var n=0,r=0,a=t[Nt];a>r&&e>n;r++){var o=t.charCodeAt(r);n+=o>=0&&127>=o?i.ascCharWidth:i.cnCharWidth}return r}var s={},u=0,c=5e3,l=t(pt),h=t("../core/BoundingRect"),f={getWidth:e,getBoundingRect:i,adjustTextPositionOnRect:n,ellipsis:r,measureText:function(t,e){var i=l[Rt]();return i.font=e,i.measureText(t)}};return f}),e("echarts/model/mixin/textStyle",[qt,"zrender/contain/text"],function(t){function e(t,e){return t&&t[Mt](e)}var i=t("zrender/contain/text");return{getTextColor:function(){var t=this[st];return this[Mt]("color")||t&&t.get("textStyle.color")},getFont:function(){var t=this[st],i=t&&t[ot](at);return[this[Mt]("fontStyle")||e(i,"fontStyle"),this[Mt]("fontWeight")||e(i,"fontWeight"),(this[Mt]("fontSize")||e(i,"fontSize")||12)+"px",this[Mt]("fontFamily")||e(i,"fontFamily")||"sans-serif"].join(" ")},getTextRect:function(t){var e=this.get(at)||{};return i[rt](t,this[nt](),e.align,e.baseline)},ellipsis:function(t,e,n){return i.ellipsis(t,this[nt](),e,n)}}}),e("echarts/model/mixin/itemStyle",[qt,"./makeStyleMapper"],function(t){return{getItemStyle:t("./makeStyleMapper")([["fill","color"],[bt,"borderColor"],[wt,"borderWidth"],[_t],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"]])}}),e("echarts/model/Model",[qt,Gt,it,"./mixin/lineStyle","./mixin/areaStyle","./mixin/textStyle","./mixin/itemStyle"],function(t){function e(t,e,i){this.parentModel=e||null,this[st]=i||null,this[et]=t,this.init.apply(this,arguments)}var i=t(Gt),n=t(it);e[Vt]={constructor:e,init:function(t){},mergeOption:function(t){i.merge(this[et],t,!0)},get:function(t,e){if(!t)return this[et];typeof t===Ot&&(t=t.split("."));for(var i=this[et],n=this.parentModel,r=0;r<t[Nt]&&(i=i&&"object"==typeof i?i[t[r]]:null,null!=i);r++);return null==i&&n&&!e&&(i=n.get(t)),i},getShallow:function(t,e){var i=this[et],n=i&&i[t],r=this.parentModel;return null==n&&r&&!e&&(n=r[Mt](t)),n},getModel:function(t,i){var n=this.get(t,!0),r=this.parentModel,a=new e(n,i||r&&r[ot](t),this[st]);return a},isEmpty:function(){return null==this[et]},restoreData:function(){},clone:function(){var t=this.constructor;return new t(i.clone(this[et]))},setReadOnly:function(t){n.setReadOnly(this,t)}},n[Lt](e);var r=i.mixin;return r(e,t("./mixin/lineStyle")),r(e,t("./mixin/areaStyle")),r(e,t("./mixin/textStyle")),r(e,t("./mixin/itemStyle")),e}),e("echarts/util/component",[qt,Gt,"./clazz"],function(t){var e=t(Gt),i=t("./clazz"),n=i[Tt],r=0,a={},o="_";return a.getUID=function(t){return[t||"",r++,Math.random()].join(o)},a.enableSubTypeDefaulter=function(t){var e={};return t.registerSubTypeDefaulter=function(t,i){t=n(t),e[t.main]=i},t.determineSubType=function(i,r){var a=r.type;if(!a){var o=n(i).main;t.hasSubTypes(i)&&e[o]&&(a=e[o](r))}return a},t},a.enableTopologicalTravel=function(t,i){function n(t){var n={},o=[];return e.each(t,function(s){var u=r(n,s),c=u.originalDeps=i(s),l=a(c,t);u.entryCount=l[Nt],0===u.entryCount&&o.push(s),e.each(l,function(t){e[Bt](u.predecessor,t)<0&&u.predecessor.push(t);var i=r(n,t);e[Bt](i.successor,t)<0&&i.successor.push(s)})}),{graph:n,noEntryList:o}}function r(t,e){return t[e]||(t[e]={predecessor:[],successor:[]}),t[e]}function a(t,i){var n=[];return e.each(t,function(t){e[Bt](i,t)>=0&&n.push(t)}),n}t.topologicalTravel=function(t,i,r,a){function o(t){c[t].entryCount--,0===c[t].entryCount&&l.push(t)}function s(t){h[t]=!0,o(t)}if(t[Nt]){var u=n(i),c=u.graph,l=u.noEntryList,h={};for(e.each(t,function(t){h[t]=!0});l[Nt];){var f=l.pop(),d=c[f],p=!!h[f];p&&(r.call(a,f,d.originalDeps.slice()),delete h[f]),e.each(d.successor,p?s:o)}e.each(h,function(){throw new Error("Circle dependency may exists")})}}},a}),e("echarts/util/number",[qt,Gt],function(t){function e(t){return t[tt](/^\s+/,"")[tt](/\s+$/,"")}var i=t(Gt),n={},r=1e-4;return n.linearMap=function(t,e,r,a){if(i[St](t))return i.map(t,function(t){return n.linearMap(t,e,r,a)});var o=e[1]-e[0];if(0===o)return(r[0]+r[1])/2;var s=(t-e[0])/o;return a&&(s=Math.min(Math.max(s,0),1)),s*(r[1]-r[0])+r[0]},n[J]=function(t,i){switch(t){case ht:case ft:t="50%";break;case"left":case"top":t="0%";break;case"right":case dt:t="100%"}return typeof t===Ot?e(t).match(/%$/)?parseFloat(t)/100*i:parseFloat(t):null==t?NaN:+t},n.round=function(t){return+(+t).toFixed(12)},n.asc=function(t){return t.sort(function(t,e){return t-e}),t},n.getPrecision=function(t){for(var e=1,i=0;Math.round(t*e)/e!==t;)e*=10,i++;return i},n.getPixelPrecision=function(t,e){var i=Math.log,n=Math.LN10,r=Math.floor(i(t[1]-t[0])/n),a=Math.round(i(Math.abs(e[1]-e[0]))/n);return Math.max(-r+a,0)},n.MAX_SAFE_INTEGER=9007199254740991,n.remRadian=function(t){var e=2*Math.PI;return(t%e+e)%e},n.isRadianAroundZero=function(t){return t>-r&&r>t},n.parseDate=function(t){return t instanceof Date?t:new Date(typeof t===Ot?t[tt](/-/g,"/"):t)},n}),e("echarts/util/format",[qt,Gt],function(t){function e(t){return isNaN(t)?"-":(t=(t+"").split("."),t[0][tt](/(\d{1,3})(?=(?:\d{3})+(?!\d))/g,"$1,")+(t[Nt]>1?"."+t[1]:""))}function i(t){return t[K]()[tt](/-(.)/g,function(t,e){return e.toUpperCase()})}function n(t){var e=t[Nt];return typeof t===It?[t,t,t,t]:2===e?[t[0],t[1],t[0],t[1]]:3===e?[t[0],t[1],t[2],t[1]]:t}function r(t){return String(t)[tt](/&/g,"&amp;")[tt](/</g,"&lt;")[tt](/>/g,"&gt;")[tt](/"/g,"&quot;")[tt](/'/g,"&#39;")}function a(t,e){return"{"+t+(null==e?"":e)+"}"}function o(t,e){s[St](e)||(e=[e]);var i=e[Nt];if(!i)return"";for(var n=e[0].$vars,r=0;r<n[Nt];r++){var o=u[r];t=t[tt](a(o),a(o,0))}for(var c=0;i>c;c++)for(var l=0;l<n[Nt];l++)t=t[tt](a(u[l],c),e[c][n[l]]);return t}var s=t(Gt),u=["a","b","c","d","e","f","g"];return{normalizeCssArray:n,addCommas:e,toCamelCase:i,encodeHTML:r,formatTpl:o}}),e("echarts/util/layout",[qt,Gt,"zrender/core/BoundingRect","./number","./format"],function(t){function e(t,e,i,n,r){var a=0,o=0;null==n&&(n=1/0),null==r&&(r=1/0);var s=0;e.eachChild(function(u,c){var l,h,f=u[Q],d=u[rt](),p=e.childAt(c+1),v=p&&p[rt]();"horizontal"===t?(l=a+d.width+(v?-v.x+d.x:0),l>n||u.newline?(a=0,o+=s+i,s=0):s=Math.max(s,d[mt])):(h=o+d[mt]+(v?-v.y+d.y:0),h>r||u.newline?(a+=s+i,o=0,s=0):s=Math.max(s,d.width)),u.newline||(f[0]=a,f[1]=o,"horizontal"===t?a=l+i:o=h+i)})}var i=t(Gt),n=t("zrender/core/BoundingRect"),r=t("./number"),a=t("./format"),o=r[J],s=i.each,u={};return u.box=e,u.vbox=i.curry(e,"vertical"),u.hbox=i.curry(e,"horizontal"),u.getAvailableSize=function(t,e,i){var n=e.width,r=e[mt],s=o(t.x,n),u=o(t.y,r),c=o(t.x2,n),l=o(t.y2,r);return(isNaN(s)||isNaN(parseFloat(t.x)))&&(s=0),(isNaN(c)||isNaN(parseFloat(t.x2)))&&(c=n),(isNaN(u)||isNaN(parseFloat(t.y)))&&(u=0),(isNaN(l)||isNaN(parseFloat(t.y2)))&&(l=r),i=a.normalizeCssArray(i||0),{width:Math.max(c-s-i[1]-i[3],0),height:Math.max(l-u-i[0]-i[2],0)}},u.getLayoutRect=function(t,e,i){i=a.normalizeCssArray(i||0);var r=e.width,s=e[mt],u=o(t.left,r),c=o(t.top,s),l=o(t.right,r),h=o(t[dt],s),f=o(t.width,r),d=o(t[mt],s),p=i[2]+i[0],v=i[1]+i[3],m=t.aspect;switch(isNaN(f)&&(f=r-l-v-u),isNaN(d)&&(d=s-h-p-c),isNaN(f)&&isNaN(d)&&(m>r/s?f=.8*r:d=.8*s),null!=m&&(isNaN(f)&&(f=m*d),isNaN(d)&&(d=f/m)),isNaN(u)&&(u=r-l-f-v),isNaN(c)&&(c=s-h-d-p),t.left||t.right){case ht:u=r/2-f/2-i[3];break;case"right":u=r-f-v}switch(t.top||t[dt]){case ft:case ht:c=s/2-d/2-i[0];break;case dt:c=s-d-p}var g=new n(u+i[3],c+i[0],f,d);return g.margin=i,g},u.positionGroup=function(t,e,n,r){var a=t[rt]();e=i[zt](i.clone(e),{width:a.width,height:a[mt]}),e=u.getLayoutRect(e,n,r),t[Q]=[e.x-a.x,e.y-a.y]},u.mergeLayoutParam=function(t,e,i){function n(n){var o={},u=0,c={},l=0,h=i.ignoreSize?1:2;if(s(n,function(e){c[e]=t[e]}),s(n,function(t){r(e,t)&&(o[t]=c[t]=e[t]),a(o,t)&&u++,a(c,t)&&l++}),l!==h&&u){if(h>l){var f=0;return s(n,function(t){"auto"===c[t]&&(h-l>f?f++:c[t]=null)}),c}if(u>=h)return o;for(var d=0;d<n[Nt];d++){var p=n[d];if(!r(o,p)&&r(t,p)){o[p]=t[p];break}}return o}return c}function r(t,e){return t.hasOwnProperty(e)}function a(t,e){return null!=t[e]&&"auto"!==t[e]}function o(t,e,i){s(t,function(t){e[t]=i[t]})}i=i||{};var u=["width","left","right"],c=[mt,"top",dt],l=n(u),h=n(c);o(u,t,l),o(c,t,h)},u.getLayoutParams=function(t){var e={};return t&&s(["left","right","top",dt,"width",mt],function(i){t.hasOwnProperty(i)&&(e[i]=t[i])}),e},u}),e("echarts/model/mixin/boxLayout",[qt],function(t){return{getBoxLayoutParams:function(){return{left:this.get("left"),top:this.get("top"),right:this.get("right"),bottom:this.get(dt),width:this.get("width"),height:this.get(mt)}}}}),e("echarts/model/Component",[qt,"./Model",Gt,"../util/component",it,"../util/layout","./mixin/boxLayout"],function(t){function e(t){var e=[];return n.each(u.getClassesByMainType(t),function(t){r.apply(e,t[Vt].dependencies||[])}),n.map(e,function(t){return o[Tt](t).main})}var i=t("./Model"),n=t(Gt),r=Array[Vt].push,a=t("../util/component"),o=t(it),s=t("../util/layout"),u=i[zt]({type:"component",id:"",name:"",mainType:"",subType:"",componentIndex:0,defaultOption:null,ecModel:null,dependentModels:[],uid:null,layoutMode:null,init:function(t,e,i,n){this.mergeDefaultAndTheme(this[et],this[st])},mergeDefaultAndTheme:function(t,e){var i=this.layoutMode,r=i?s.getLayoutParams(t):{},a=e.getTheme();n.merge(t,a.get(this.mainType)),n.merge(t,this.getDefaultOption()),i&&s.mergeLayoutParam(t,r,i)},mergeOption:function(t){n.merge(this[et],t,!0);var e=this.layoutMode;e&&s.mergeLayoutParam(this[et],t,e)},getDefaultOption:function(){if(!this.hasOwnProperty("__defaultOption")){for(var t=[],e=this.constructor;e;){var i=e[Vt].defaultOption;i&&t.push(i),e=e.superClass}for(var r={},a=t[Nt]-1;a>=0;a--)r=n.merge(r,t[a],!0);this.__defaultOption=r}return this.__defaultOption}});return o[Lt](u,function(t,e,i,r){n[zt](this,r),this.uid=a.getUID("componentModel"),this.setReadOnly(["type","id","uid","name","mainType","subType","dependentModels","componentIndex"])}),o[kt](u,{registerWhenExtend:!0}),a.enableSubTypeDefaulter(u),a.enableTopologicalTravel(u,e),n.mixin(u,t("./mixin/boxLayout")),u}),e("echarts/model/globalDefault",[],function(){var t="";return typeof navigator!==xt&&(t=navigator.platform||""),{color:["#c23531","#314656","#61a0a8","#dd8668","#91c7ae","#6e7074","#61a0a8","#bda29a","#44525d","#c4ccd3"],grid:{},textStyle:{fontFamily:t.match(/^Win/)?"Microsoft YaHei":"sans-serif",fontSize:12,fontStyle:"normal",fontWeight:"normal"},animation:!0,animationThreshold:2e3,animationDuration:1e3,animationDurationUpdate:300,animationEasing:"exponentialOut",animationEasingUpdate:"cubicOut"}}),e("echarts/model/Global",[qt,Gt,"./Model","./Component","./globalDefault"],function(t){function e(t,e){for(var i in e)x.hasClass(i)||("object"==typeof e[i]?t[i]=t[i]?h.merge(t[i],e[i],!1):h.clone(e[i]):t[i]=e[i])}function i(t){t=t,this[et]={},this._componentsMap={},this._seriesIndices=null,e(t,this._theme[et]),h.merge(t,_,!1),this.mergeOption(t)}function n(t,e){h[St](e)||(e=e?[e]:[]);var i={};return d(e,function(e){i[e]=(t[e]||[]).slice()}),i}function r(t,e){t=(t||[]).slice();var i=[];return d(e,function(e,n){if(y(e)&&e.id)for(var r=0,a=t[Nt];a>r;r++)if(t[r].id===e.id)return void(i[n]=t[U](r,1)[0])}),d(e,function(e,n){if(y(e)&&e.name&&!c(e))for(var r=0,a=t[Nt];a>r;r++)if(t[r].name===e.name)return void(i[n]=t[U](r,1)[0])}),d(e,function(e,n){i[n]||!t[n]||c(e)||(i[n]=t[n])}),i}function a(t,e,i){function n(n){d(e,function(e,a){if(y(e)){var o=i[a],s=r[a],u=t+"."+s.subType;n(s,e,o,u)}})}var r=[],a="\x00",s={},u={};return d(e,function(e,n){if(y(e)){var a=i[n],s=o(t,e,a),u={mainType:t,subType:s};r[n]=u}}),n(function(t,e,i,n){t.name=i?i.name:null!=e.name?e.name:a+"-",u[t.name]=0}),n(function(t,e,i,n){var r=t.name;if(t.id=i?i.id:null!=e.id?e.id:a+[n,r,u[r]++].join("|"),s[t.id])throw new Error("id duplicates: "+t.id);s[t.id]=1}),r}function o(t,e,i){var n=e.type?e.type:i?i.subType:x.determineSubType(t,e);return n}function s(t){return v(t,function(t){return t.componentIndex})||[]}function u(t,e){return e.hasOwnProperty("subType")?p(t,function(t){return t.subType===e.subType}):t}function c(t){return t.id&&0===(t.id+"")[Bt]("\x00_ec_\x00")}function l(t){if(!t._seriesIndices)throw new Error("Series is not initialized. Please depends sereis.")}var h=t(Gt),f=t("./Model"),d=h.each,p=h[Ft],v=h.map,m=h[St],g=h[Bt],y=h[$],x=t("./Component"),_=t("./globalDefault"),b=f[zt]({constructor:b,init:function(t,e,i,n){i=i||{},this[et]=null,this._theme=new f(i),this._optionManager=n},setOption:function(t,e){this._optionManager.setOption(t,e),this.resetOption()},resetOption:function(t){var e=!1,n=this._optionManager;if(!t||"recreate"===t){var r=n.mountOption();this[et]&&"recreate"!==t?(this.restoreData(),this.mergeOption(r)):i.call(this,r),e=!0}if(("timeline"===t||"media"===t)&&this.restoreData(),!t||"recreate"===t||"timeline"===t){var a=n.getTimelineOption(this);a&&(this.mergeOption(a),e=!0)}if(!t||"recreate"===t||"media"===t){var o=n.getMediaOption(this,this._api);o[Nt]&&d(o,function(t){this.mergeOption(t,e=!0)},this)}return e},mergeOption:function(t){function e(e,n){var r=t[e];r?o.call(this,e,r,n):i.call(this,e),"series"===e&&(this._seriesIndices=s(c.series))}function i(t){d(c[t],function(t){t.mergeOption({},this)},this)}function o(t,e,i){h[St](e)||(e=[e]),c[t]||(c[t]=[]);var o=r(c[t],e),s=a(t,e,o),l=n(c,i);u[t]=[],d(e,function(e,i){if(y(e)){var n=o[i],r=x[Ct](t,s[i].subType,!0);n&&n instanceof r?n.mergeOption(e,this):(n=new r(e,this,this,h[zt]({dependentModels:l,componentIndex:i},s[i])),c[t][i]=n),u[t][i]=n[et]}},this)}var u=this[et],c=this._componentsMap,l=[];d(t,function(t,e){null!=t&&(x.hasClass(e)?l.push(e):u[e]=null==u[e]?h.clone(t):h.merge(u[e],t,!0))}),x.topologicalTravel(l,x.getAllClassMainTypes(),e,this)},getTheme:function(){return this._theme},getComponent:function(t,e){var i=this._componentsMap[t];return i?i[e||0]:void 0},queryComponents:function(t){var e=t.mainType;if(!e)return[];var i=t.index,n=t.id,r=t.name,a=this._componentsMap[e];if(!a||!a[Nt])return[];var o;if(null!=i)m(i)||(i=[i]),o=p(v(i,function(t){return a[t]}),function(t){return!!t});else if(null!=n){var s=m(n);o=p(a,function(t){return s&&g(n,t.id)>=0||!s&&t.id===n})}else if(null!=r){var c=m(r);o=p(a,function(t){return c&&g(r,t.name)>=0||!c&&t.name===r})}return u(o,t)},findComponents:function(t){function e(t){var e=r+"Index",i=r+"Id",n=r+"Name";return t&&(t.hasOwnProperty(e)||t.hasOwnProperty(i)||t.hasOwnProperty(n))?{mainType:r,index:t[e],id:t[i],name:t[n]}:null}function i(e){return t[Ft]?p(e,t[Ft]):e}var n=t.query,r=t.mainType,a=e(n),o=a?this.queryComponents(a):this._componentsMap[r];return i(u(o,t))},eachComponent:function(t,e,i){var n=this._componentsMap;if(typeof t===Pt)i=e,e=t,d(n,function(t,n){d(t,function(t,r){e.call(i,n,t,r)})});else if(h[Y](t))d(n[t],e,i);else if(y(t)){var r=this.findComponents(t);d(r,e,i)}},getSeriesByName:function(t){var e=this._componentsMap.series;return p(e,function(e){return e.name===t})},getSeriesByIndex:function(t){return this._componentsMap.series[t]},getSeriesByType:function(t){var e=this._componentsMap.series;return p(e,function(e){return e.subType===t})},getSeries:function(){return this._componentsMap.series.slice()},eachSeries:function(t,e){l(this),d(this._seriesIndices,function(i){var n=this._componentsMap.series[i];t.call(e,n,i)},this)},eachRawSeries:function(t,e){d(this._componentsMap.series,t,e)},eachSeriesByType:function(t,e,i){l(this),d(this._seriesIndices,function(n){var r=this._componentsMap.series[n];r.subType===t&&e.call(i,r,n)},this)},eachRawSeriesByType:function(t,e,i){return d(this.getSeriesByType(t),e,i)},isSeriesFiltered:function(t){return l(this),h[Bt](this._seriesIndices,t.componentIndex)<0},filterSeries:function(t,e){l(this);var i=p(this._componentsMap.series,t,e);this._seriesIndices=s(i)},restoreData:function(){var t=this._componentsMap;this._seriesIndices=s(t.series);var e=[];d(t,function(t,i){e.push(i)}),x.topologicalTravel(e,x.getAllClassMainTypes(),function(e,i){d(t[e],function(t){t.restoreData()})})}});return b}),e("echarts/ExtensionAPI",[qt,Gt],function(t){function e(t){i.each(n,function(e){this[e]=i.bind(t[e],t)},this)}var i=t(Gt),n=["getDom","getZr",X,j,"dispatchAction","on","off","getDataURL","getConnectedDataURL"];return e}),e("echarts/CoordinateSystem",[qt],function(t){function e(){this._coordinateSystems={},this._coordinateSystemsList=[]}var i={};return e[Vt]={constructor:e,update:function(t,e){var n={};for(var r in i)n[r]=i[r][vt](t,e);this._coordinateSystems=n},get:function(t,e){var i=this._coordinateSystems[t];return i?i[e||0]:void 0}},e.register=function(t,e){i[t]=e},e}),e("echarts/model/OptionManager",[qt,Gt],function(t){function e(t){this._api=t,this._timelineOptions,this._mediaList,this._mediaDefault,this._currentMediaIndices=[],this._optionBackup}function i(t,e){var i,n,r=[],a=[],u=t.timeline;if((u||t.options)&&(n=t.baseOption||{},r=(t.options||[]).slice()),t.media){n=t.baseOption||{};var c=t.media;s(c,function(t){t&&t[et]&&(t.query?a.push(t):i||(i=t))})}return n||(n=t),n.timeline||(n.timeline=u),s([n][Dt](r)[Dt](o.map(a,function(t){return t[et]})),function(t){s(e,function(e){e(t)})}),{baseOption:n,timelineOptions:r,mediaDefault:i,mediaList:a}}function n(t,e,i){var n={width:e,height:i,aspectratio:e/i},a=!0;return o.each(t,function(t,e){var i=e.match(l);if(i&&i[1]&&i[2]){var o=i[1],s=i[2][K]();r(n[s],t,o)||(a=!1)}}),a}function r(t,e,i){return"min"===i?t>=e:"max"===i?e>=t:t===e}function a(t,e){return t.join(",")===e.join(",")}var o=t(Gt),s=o.each,u=o.clone,c=o.map,l=/^(min|max)?(.+)$/;return e[Vt]={constructor:e,setOption:function(t,e){t=u(t,!0),this._optionBackup=i.call(this,t,e)},mountOption:function(){var t=this._optionBackup;return this._timelineOptions=c(t.timelineOptions,u),this._mediaList=c(t.mediaList,u),this._mediaDefault=u(t.mediaDefault),this._currentMediaIndices=[],u(t.baseOption)},getTimelineOption:function(t){var e,i=this._timelineOptions;if(i[Nt]){var n=t[Z]("timeline");n&&(e=u(i[n.getCurrentIndex()],!0))}return e},getMediaOption:function(t){var e=this._api[X](),i=this._api[j](),r=this._mediaList,o=this._mediaDefault,s=[],l=[];
if(!r[Nt]&&!o)return l;for(var h=0,f=r[Nt];f>h;h++)n(r[h].query,e,i)&&s.push(h);return!s[Nt]&&o&&(s=[-1]),s[Nt]&&!a(s,this._currentMediaIndices)&&(l=c(s,function(t){return u(-1===t?o[et]:r[t][et])})),this._currentMediaIndices=s,l}},e}),e("echarts/util/model",[qt,"./format","./number",Gt,"../model/Model"],function(t){var e=t("./format"),i=t("./number"),n=t(Gt),r=t("../model/Model"),a=["x","y","z","radius","angle"],o={};return o.createNameEach=function(t,e){t=t.slice();var i=n.map(t,o.capitalFirst);e=(e||[]).slice();var r=n.map(e,o.capitalFirst);return function(a,o){n.each(t,function(t,n){for(var s={name:t,capital:i[n]},u=0;u<e[Nt];u++)s[e[u]]=t+r[u];a.call(o,s)})}},o.capitalFirst=function(t){return t?t.charAt(0).toUpperCase()+t[ut](1):t},o.eachAxisDim=o.createNameEach(a,["axisIndex","axis","index"]),o.normalizeToArray=function(t){return n[St](t)?t:null==t?[]:[t]},o.createLinkedNodesFinder=function(t,e,i){function r(t,e){return n[Bt](e.nodes,t)>=0}function a(t,r){var a=!1;return e(function(e){n.each(i(t,e)||[],function(t){r.records[e.name][t]&&(a=!0)})}),a}function o(t,r){r.nodes.push(t),e(function(e){n.each(i(t,e)||[],function(t){r.records[e.name][t]=!0})})}return function(i){function n(t){!r(t,s)&&a(t,s)&&(o(t,s),u=!0)}var s={nodes:[],records:{}};if(e(function(t){s.records[t.name]={}}),!i)return s;o(i,s);var u;do u=!1,t(n);while(u);return s}},o.defaultEmphasis=function(t,e){if(t){var i=t[W]=t[W]||{},r=t[H]=t[H]||{};n.each(e,function(t){var e=n.retrieve(i[t],r[t]);null!=e&&(i[t]=e)})}},o.createDataFormatModel=function(t,e,i){var a=new r;return n.mixin(a,o.dataFormatMixin),a[q]=t[q],a.name=t.name||"",a[V]=function(){return e},a.getRawDataArray=function(){return i},a},o.getDataItemValue=function(t){return t&&(null==t.value?t:t.value)},o.converDataValue=function(t,e){var n=e&&e.type;return n===G?t:("time"!==n||isFinite(t)||null==t||"-"===t||(t=+i.parseDate(t)),null==t||""===t?NaN:+t)},o.dataFormatMixin={getDataParams:function(t){var e=this[V](),i=this[q],n=this.name,r=this[F](t),a=e.getRawIndex(t),o=e.getName(t,!0),s=this.getRawDataArray(),u=s&&s[a];return{seriesIndex:i,seriesName:n,name:o,dataIndex:a,data:u,value:r,$vars:["seriesName","name","value"]}},getFormattedLabel:function(t,i,n){i=i||H;var r=this[V](),a=r[N](t),o=this[E](t);return n||(n=a.get(["label",i,"formatter"])),typeof n===Pt?(o.status=i,n(o)):typeof n===Ot?e.formatTpl(n,o):void 0},getRawValue:function(t){var e=this[V]()[N](t);if(e&&e[et]){var i=e[et];return n[$](i)&&!n[St](i)?i.value:i}}},o}),e("echarts/model/Series",[qt,Gt,"../util/format","../util/model","./Component"],function(t){var e=t(Gt),i=t("../util/format"),n=t("../util/model"),r=t("./Component"),a=i.encodeHTML,o=i.addCommas,s=r[zt]({type:"series",seriesIndex:0,coordinateSystem:null,defaultOption:null,legendDataProvider:null,init:function(t,e,i,n){this[q]=this.componentIndex,this.mergeDefaultAndTheme(t,i),this._dataBeforeProcessed=this.getInitialData(t,i),this._data=this._dataBeforeProcessed.cloneShallow()},mergeDefaultAndTheme:function(t,i){e.merge(t,i.getTheme().get(this.subType)),e.merge(t,this.getDefaultOption()),n.defaultEmphasis(t.label,[Q,"show",at,yt,"formatter"])},mergeOption:function(t,i){t=e.merge(this[et],t,!0);var n=this.getInitialData(t,i);n&&(this._data=n,this._dataBeforeProcessed=n.cloneShallow())},getInitialData:function(){},getData:function(){return this._data},setData:function(t){this._data=t},getRawData:function(){return this._dataBeforeProcessed},getRawDataArray:function(){return this[et].data},getDimensionsOnAxis:function(t){return[t]},formatTooltip:function(t,i){var n=this._data,r=this[F](t),s=e[St](r)?e.map(r,o).join(", "):o(r),u=n.getName(t);return i?a(this.name)+" : "+s:a(this.name)+"<br />"+(u?a(u)+" : "+s:s)},restoreData:function(){this._data=this._dataBeforeProcessed.cloneShallow()}});return e.mixin(s,n.dataFormatMixin),s}),e("zrender/core/guid",[],function(){var t=2311;return function(){return"zr_"+t++}}),e("zrender/mixin/Eventful",[qt,pt],function(t){var e=Array[Vt].slice,i=t(pt),n=i[Bt],r=function(){this._$handlers={}};return r[Vt]={constructor:r,one:function(t,e,i){var r=this._$handlers;return e&&t?(r[t]||(r[t]=[]),n(r[t],t)>=0?this:(r[t].push({h:e,one:!0,ctx:i||this}),this)):this},on:function(t,e,i){var n=this._$handlers;return e&&t?(n[t]||(n[t]=[]),n[t].push({h:e,one:!1,ctx:i||this}),this):this},isSilent:function(t){var e=this._$handlers;return e[t]&&e[t][Nt]},off:function(t,e){var i=this._$handlers;if(!t)return this._$handlers={},this;if(e){if(i[t]){for(var n=[],r=0,a=i[t][Nt];a>r;r++)i[t][r].h!=e&&n.push(i[t][r]);i[t]=n}i[t]&&0===i[t][Nt]&&delete i[t]}else delete i[t];return this},trigger:function(t){if(this._$handlers[t]){var i=arguments,n=i[Nt];n>3&&(i=e.call(i,1));for(var r=this._$handlers[t],a=r[Nt],o=0;a>o;){switch(n){case 1:r[o].h.call(r[o].ctx);break;case 2:r[o].h.call(r[o].ctx,i[1]);break;case 3:r[o].h.call(r[o].ctx,i[1],i[2]);break;default:r[o].h.apply(r[o].ctx,i)}r[o].one?(r[U](o,1),a--):o++}}return this},triggerWithContext:function(t){if(this._$handlers[t]){var i=arguments,n=i[Nt];n>4&&(i=e.call(i,1,i[Nt]-1));for(var r=i[i[Nt]-1],a=this._$handlers[t],o=a[Nt],s=0;o>s;){switch(n){case 1:a[s].h.call(r);break;case 2:a[s].h.call(r,i[1]);break;case 3:a[s].h.call(r,i[1],i[2]);break;default:a[s].h.apply(r,i)}a[s].one?(a[U](s,1),o--):s++}}return this}},r}),e("zrender/mixin/Transformable",[qt,"../core/matrix","../core/vector"],function(t){function e(t){return t>a||-a>t}var i=t("../core/matrix"),n=t("../core/vector"),r=i.identity,a=5e-5,o=function(t){t=t||{},t[Q]||(this[Q]=[0,0]),null==t[R]&&(this[R]=0),t.scale||(this.scale=[1,1]),this.origin=this.origin||null},s=o[Vt];s[B]=null,s.needLocalTransform=function(){return e(this[R])||e(this[Q][0])||e(this[Q][1])||e(this.scale[0]-1)||e(this.scale[1]-1)},s.updateTransform=function(){var t=this[O],e=t&&t[B],n=this.needLocalTransform(),a=this[B];return n||e?(a=a||i[vt](),n?this[I](a):r(a),e&&(n?i.mul(a,t[B],a):i.copy(a,t[B])),this[B]=a,this.invTransform=this.invTransform||i[vt](),void i.invert(this.invTransform,a)):void(a&&r(a))},s[I]=function(t){t=t||[],r(t);var e=this.origin,n=this.scale,a=this[R],o=this[Q];return e&&(t[4]-=e[0],t[5]-=e[1]),i.scale(t,t,n),a&&i.rotate(t,t,a),e&&(t[4]+=e[0],t[5]+=e[1]),t[4]+=o[0],t[5]+=o[1],t},s.setTransform=function(t){var e=this[B];e&&t[B](e[0],e[1],e[2],e[3],e[4],e[5])};var u=[];return s.decomposeTransform=function(){if(this[B]){var t=this[O],n=this[B];t&&t[B]&&(i.mul(u,t.invTransform,n),n=u);var r=n[0]*n[0]+n[1]*n[1],a=n[2]*n[2]+n[3]*n[3],o=this[Q],s=this.scale;e(r-1)&&(r=Math.sqrt(r)),e(a-1)&&(a=Math.sqrt(a)),n[0]<0&&(r=-r),n[3]<0&&(a=-a),o[0]=n[4],o[1]=n[5],s[0]=r,s[1]=a,this[R]=Math.atan2(-n[1]/a,n[0]/r)}},s.transformCoordToLocal=function(t,e){var i=[t,e],r=this.invTransform;return r&&n[gt](i,i,r),i},s.transformCoordToGlobal=function(t,e){var i=[t,e],r=this[B];return r&&n[gt](i,i,r),i},o}),e("zrender/animation/easing",[],function(){var t={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*(-Math.pow(2,-10*(t-1))+2)},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,i=.1,n=.4;return 0===t?0:1===t?1:(!i||1>i?(i=1,e=n/4):e=n*Math.asin(1/i)/(2*Math.PI),-(i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)))},elasticOut:function(t){var e,i=.1,n=.4;return 0===t?0:1===t?1:(!i||1>i?(i=1,e=n/4):e=n*Math.asin(1/i)/(2*Math.PI),i*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/n)+1)},elasticInOut:function(t){var e,i=.1,n=.4;return 0===t?0:1===t?1:(!i||1>i?(i=1,e=n/4):e=n*Math.asin(1/i)/(2*Math.PI),(t*=2)<1?-.5*(i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)):i*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)*.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?.5*(t*t*((e+1)*t-e)):.5*((t-=2)*t*((e+1)*t+e)+2)},bounceIn:function(e){return 1-t.bounceOut(1-e)},bounceOut:function(t){return 1/2.75>t?7.5625*t*t:2/2.75>t?7.5625*(t-=1.5/2.75)*t+.75:2.5/2.75>t?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},bounceInOut:function(e){return.5>e?.5*t.bounceIn(2*e):.5*t.bounceOut(2*e-1)+.5}};return t}),e("zrender/animation/Clip",[qt,"./easing"],function(t){function e(t){this._target=t.target,this._life=t.life||1e3,this._delay=t.delay||0,this._initialized=!1,this.loop=null==t.loop?!1:t.loop,this.gap=t.gap||0,this.easing=t.easing||"Linear",this.onframe=t.onframe,this.ondestroy=t.ondestroy,this.onrestart=t.onrestart}var i=t("./easing");return e[Vt]={constructor:e,step:function(t){this._initialized||(this._startTime=(new Date).getTime()+this._delay,this._initialized=!0);var e=(t-this._startTime)/this._life;if(!(0>e)){e=Math.min(e,1);var n=this.easing,r=typeof n==Ot?i[n]:n,a=typeof r===Pt?r(e):e;return this.fire("frame",a),1==e?this.loop?(this.restart(),"restart"):(this._needsRemove=!0,"destroy"):null}},restart:function(){var t=(new Date).getTime(),e=(t-this._startTime)%this._life;this._startTime=(new Date).getTime()-e+this.gap,this._needsRemove=!1},fire:function(t,e){t="on"+t,this[t]&&this[t](this._target,e)}},e}),e("zrender/tool/color",[qt],function(t){function e(t){return t=Math.round(t),0>t?0:t>255?255:t}function i(t){return t=Math.round(t),0>t?0:t>360?360:t}function n(t){return 0>t?0:t>1?1:t}function r(t){return e(t[Nt]&&"%"===t.charAt(t[Nt]-1)?parseFloat(t)/100*255:parseInt(t,10))}function a(t){return n(t[Nt]&&"%"===t.charAt(t[Nt]-1)?parseFloat(t)/100:parseFloat(t))}function o(t,e,i){return 0>i?i+=1:i>1&&(i-=1),1>6*i?t+(e-t)*i*6:1>2*i?e:2>3*i?t+(e-t)*(2/3-i)*6:t}function s(t,e,i){return t+(e-t)*i}function u(t){if(t){t+="";var e=t[tt](/ /g,"")[K]();if(e in x)return x[e].slice();if("#"!==e.charAt(0)){var i=e[Bt]("("),n=e[Bt](")");if(-1!==i&&n+1===e[Nt]){var o=e[ut](0,i),s=e[ut](i+1,n-(i+1)).split(","),u=1;switch(o){case"rgba":if(4!==s[Nt])return;u=a(s.pop());case"rgb":if(3!==s[Nt])return;return[r(s[0]),r(s[1]),r(s[2]),u];case"hsla":if(4!==s[Nt])return;return s[3]=a(s[3]),c(s);case"hsl":if(3!==s[Nt])return;return c(s);default:return}}}else{if(4===e[Nt]){var l=parseInt(e[ut](1),16);if(!(l>=0&&4095>=l))return;return[(3840&l)>>4|(3840&l)>>8,240&l|(240&l)>>4,15&l|(15&l)<<4,1]}if(7===e[Nt]){var l=parseInt(e[ut](1),16);if(!(l>=0&&16777215>=l))return;return[(16711680&l)>>16,(65280&l)>>8,255&l,1]}}}}function c(t){var i=(parseFloat(t[0])%360+360)%360/360,n=a(t[1]),r=a(t[2]),s=.5>=r?r*(n+1):r+n-r*n,u=2*r-s,c=[e(255*o(u,s,i+1/3)),e(255*o(u,s,i)),e(255*o(u,s,i-1/3))];return 4===t[Nt]&&(c[3]=t[3]),c}function l(t){if(t){var e,i,n=t[0]/255,r=t[1]/255,a=t[2]/255,o=Math.min(n,r,a),s=Math.max(n,r,a),u=s-o,c=(s+o)/2;if(0===u)e=0,i=0;else{i=.5>c?u/(s+o):u/(2-s-o);var l=((s-n)/6+u/2)/u,h=((s-r)/6+u/2)/u,f=((s-a)/6+u/2)/u;n===s?e=f-h:r===s?e=1/3+l-f:a===s&&(e=2/3+h-l),0>e&&(e+=1),e>1&&(e-=1)}var d=[360*e,i,c];return null!=t[3]&&d.push(t[3]),d}}function h(t,e){var i=u(t);if(i){for(var n=0;3>n;n++)0>e?i[n]=i[n]*(1-e)|0:i[n]=(255-i[n])*e+i[n]|0;return y(i,4===i[Nt]?"rgba":"rgb")}}function f(t,e){var i=u(t);return i?((1<<24)+(i[0]<<16)+(i[1]<<8)+ +i[2]).toString(16).slice(1):void 0}function d(t,i,n){if(i&&i[Nt]&&t>=0&&1>=t){n=n||[0,0,0,0];var r=t*(i[Nt]-1),a=Math.floor(r),o=Math.ceil(r),u=i[a],c=i[o],l=r-a;return n[0]=e(s(u[0],c[0],l)),n[1]=e(s(u[1],c[1],l)),n[2]=e(s(u[2],c[2],l)),n[3]=e(s(u[3],c[3],l)),n}}function p(t,i,r){if(i&&i[Nt]&&t>=0&&1>=t){var a=t*(i[Nt]-1),o=Math.floor(a),c=Math.ceil(a),l=u(i[o]),h=u(i[c]),f=a-o,d=y([e(s(l[0],h[0],f)),e(s(l[1],h[1],f)),e(s(l[2],h[2],f)),n(s(l[3],h[3],f))],"rgba");return r?{color:d,leftIndex:o,rightIndex:c,value:a}:d}}function v(t,e){if(!(2!==t[Nt]||t[1]<t[0])){for(var i=p(t[0],e,!0),n=p(t[1],e,!0),r=[{color:i.color,offset:0}],a=n.value-i.value,o=Math.max(i.value,i.rightIndex),s=Math.min(n.value,n.leftIndex),u=o;a>0&&s>=u;u++)r.push({color:e[u],offset:(u-i.value)/a});return r.push({color:n.color,offset:1}),r}}function m(t,e,n,r){return t=u(t),t?(t=l(t),null!=e&&(t[0]=i(e)),null!=n&&(t[1]=a(n)),null!=r&&(t[2]=a(r)),y(c(t),"rgba")):void 0}function g(t,e){return t=u(t),t&&null!=e?(t[3]=n(e),y(t,"rgba")):void 0}function y(t,e){return("rgb"===e||"hsv"===e||"hsl"===e)&&(t=t.slice(0,3)),e+"("+t.join(",")+")"}var x={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]};return{parse:u,lift:h,toHex:f,fastMapToColor:d,mapToColor:p,mapIntervalToColor:v,modifyHSL:m,modifyAlpha:g,stringify:y}}),e("zrender/animation/Animator",[qt,"./Clip","../tool/color",pt],function(t){function e(t,e){return t[e]}function i(t,e,i){t[e]=i}function n(t,e,i){return(e-t)*i+t}function r(t,e,i){return i>.5?e:t}function a(t,e,i,r,a){var o=t[Nt];if(1==a)for(var s=0;o>s;s++)r[s]=n(t[s],e[s],i);else for(var u=t[0][Nt],s=0;o>s;s++)for(var c=0;u>c;c++)r[s][c]=n(t[s][c],e[s][c],i)}function o(t,e,i){var n=t[Nt],r=e[Nt];if(n!==r){var a=n>r;if(a)t[Nt]=r;else for(var o=n;r>o;o++)t.push(1===i?e[o]:g.call(e[o]))}}function s(t,e,i){if(t===e)return!0;var n=t[Nt];if(n!==e[Nt])return!1;if(1===i){for(var r=0;n>r;r++)if(t[r]!==e[r])return!1}else for(var a=t[0][Nt],r=0;n>r;r++)for(var o=0;a>o;o++)if(t[r][o]!==e[r][o])return!1;return!0}function u(t,e,i,n,r,a,o,s,u){var l=t[Nt];if(1==u)for(var h=0;l>h;h++)s[h]=c(t[h],e[h],i[h],n[h],r,a,o);else for(var f=t[0][Nt],h=0;l>h;h++)for(var d=0;f>d;d++)s[h][d]=c(t[h][d],e[h][d],i[h][d],n[h][d],r,a,o)}function c(t,e,i,n,r,a,o){var s=.5*(i-t),u=.5*(n-e);return(2*(e-i)+s+u)*o+(-3*(e-i)-2*s-u)*a+s*r+e}function l(t){if(m(t)){var e=t[Nt];if(m(t[0])){for(var i=[],n=0;e>n;n++)i.push(g.call(t[n]));return i}return g.call(t)}return t}function h(t){return t[0]=Math.floor(t[0]),t[1]=Math.floor(t[1]),t[2]=Math.floor(t[2]),"rgba("+t.join(",")+")"}function f(t,e,i,l,f){var v=t._getter,g=t._setter,y="spline"===e,x=l[Nt];if(x){var _,b=l[0].value,w=m(b),M=!1,S=!1,C=w&&m(b[0])?2:1;l.sort(function(t,e){return t.time-e.time}),_=l[x-1].time;for(var k=[],A=[],z=l[0].value,L=!0,T=0;x>T;T++){k.push(l[T].time/_);var P=l[T].value;if(w&&s(P,z,C)||!w&&P===z||(L=!1),z=P,typeof P==Ot){var D=p.parse(P);D?(P=D,M=!0):S=!0}A.push(P)}if(!L){if(w){for(var I=A[x-1],T=0;x-1>T;T++)o(A[T],I,C);o(v(t._target,f),I,C)}var O,B,R,E,N,F,G=0,V=0;if(M)var q=[0,0,0,0];var H=function(t,e){var i;if(V>e){for(O=Math.min(G+1,x-1),i=O;i>=0&&!(k[i]<=e);i--);i=Math.min(i,x-2)}else{for(i=G;x>i&&!(k[i]>e);i++);i=Math.min(i-1,x-2)}G=i,V=e;var o=k[i+1]-k[i];if(0!==o)if(B=(e-k[i])/o,y)if(E=A[i],R=A[0===i?i:i-1],N=A[i>x-2?x-1:i+1],F=A[i>x-3?x-1:i+2],w)u(R,E,N,F,B,B*B,B*B*B,v(t,f),C);else{var s;if(M)s=u(R,E,N,F,B,B*B,B*B*B,q,1),s=h(q);else{if(S)return r(E,N,B);s=c(R,E,N,F,B,B*B,B*B*B)}g(t,f,s)}else if(w)a(A[i],A[i+1],B,v(t,f),C);else{var s;if(M)a(A[i],A[i+1],B,q,1),s=h(q);else{if(S)return r(A[i],A[i+1],B);s=n(A[i],A[i+1],B)}g(t,f,s)}},W=new d({target:t._target,life:_,loop:t._loop,delay:t._delay,onframe:H,ondestroy:i});return e&&"spline"!==e&&(W.easing=e),W}}}var d=t("./Clip"),p=t("../tool/color"),v=t(pt),m=v.isArrayLike,g=Array[Vt].slice,y=function(t,n,r,a){this._tracks={},this._target=t,this._loop=n||!1,this._getter=r||e,this._setter=a||i,this._clipCount=0,this._delay=0,this._doneList=[],this._onframeList=[],this._clipList=[]};return y[Vt]={when:function(t,e){var i=this._tracks;for(var n in e){if(!i[n]){i[n]=[];var r=this._getter(this._target,n);if(null==r)continue;0!==t&&i[n].push({time:0,value:l(r)})}i[n].push({time:t,value:e[n]})}return this},during:function(t){return this._onframeList.push(t),this},_doneCallback:function(){this._tracks={},this._clipList[Nt]=0;for(var t=this._doneList,e=t[Nt],i=0;e>i;i++)t[i].call(this)},start:function(t){var e,i=this,n=0,r=function(){n--,n||i._doneCallback()};for(var a in this._tracks){var o=f(this,t,r,this._tracks[a],a);o&&(this._clipList.push(o),n++,this[D]&&this[D].addClip(o),e=o)}if(e){var s=e.onframe;e.onframe=function(t,e){s(t,e);for(var n=0;n<i._onframeList[Nt];n++)i._onframeList[n](t,e)}}return n||this._doneCallback(),this},stop:function(t){for(var e=this._clipList,i=this[D],n=0;n<e[Nt];n++){var r=e[n];t&&r.onframe(this._target,1),i&&i.removeClip(r)}e[Nt]=0},delay:function(t){return this._delay=t,this},done:function(t){return t&&this._doneList.push(t),this},getClips:function(){return this._clipList}},y}),e("zrender/config",[],function(){var t=1;typeof window!==xt&&(t=Math.max(window.devicePixelRatio||1,1));var e={debugMode:0,devicePixelRatio:t};return e}),e("zrender/core/log",[qt,"../config"],function(t){var e=t("../config");return function(){if(0!==e.debugMode)if(1==e.debugMode)for(var t in arguments)throw new Error(arguments[t]);else if(e.debugMode>1)for(var t in arguments)console.log(arguments[t])}}),e("zrender/mixin/Animatable",[qt,"../animation/Animator",pt,"../core/log"],function(t){var e=t("../animation/Animator"),i=t(pt),n=i[Y],r=i.isFunction,a=i[$],o=t("../core/log"),s=function(){this.animators=[]};return s[Vt]={constructor:s,animate:function(t,n){var r,a=!1,s=this,u=this.__zr;if(t){var c=t.split("."),l=s;a="shape"===c[0];for(var h=0,f=c[Nt];f>h;h++)l&&(l=l[c[h]]);l&&(r=l)}else r=s;if(!r)return void o('Property "'+t+'" is not existed in element '+s.id);var d=s.animators,p=new e(r,n);return p.during(function(t){s.dirty(a)}).done(function(){d[U](i[Bt](d,p),1)}),d.push(p),u&&u[D].addAnimator(p),p},stopAnimation:function(t){for(var e=this.animators,i=e[Nt],n=0;i>n;n++)e[n].stop(t);return e[Nt]=0,this},animateTo:function(t,e,i,a,o){function s(){c--,c||o&&o()}n(i)?(o=a,a=i,i=0):r(a)?(o=a,a="linear",i=0):r(i)?(o=i,i=0):r(e)?(o=e,e=500):e||(e=500),this[P](),this._animateToShallow("",this,t,e,i,a,o);var u=this.animators.slice(),c=u[Nt];c||o&&o();for(var l=0;l<u[Nt];l++)u[l].done(s).start(a)},_animateToShallow:function(t,e,n,r,o){var s={},u=0;for(var c in n)if(null!=e[c])a(n[c])&&!i.isArrayLike(n[c])?this._animateToShallow(t?t+"."+c:c,e[c],n[c],r,o):(s[c]=n[c],u++);else if(null!=n[c])if(t){var l={};l[t]={},l[t][c]=n[c],this.attr(l)}else this.attr(c,n[c]);return u>0&&this.animate(t,!1).when(null==r?500:r,s).delay(o||0),this}},s}),e("zrender/Element",[qt,"./core/guid","./mixin/Eventful","./mixin/Transformable","./mixin/Animatable","./core/util"],function(t){var e=t("./core/guid"),i=t("./mixin/Eventful"),n=t("./mixin/Transformable"),r=t("./mixin/Animatable"),a=t("./core/util"),o=function(t){n.call(this,t),i.call(this,t),r.call(this,t),this.id=t.id||e()};return o[Vt]={type:"element",name:"",__zr:null,ignore:!1,clipPath:null,drift:function(t,e){switch(this.draggable){case"horizontal":e=0;break;case"vertical":t=0}var i=this[B];i||(i=this[B]=[1,0,0,1,0,0]),i[4]+=t,i[5]+=e,this.decomposeTransform(),this.dirty()},beforeUpdate:function(){},afterUpdate:function(){},update:function(){this.updateTransform()},traverse:function(t,e){},attrKV:function(t,e){if(t===Q||"scale"===t||"origin"===t){if(e){var i=this[t];i||(i=this[t]=[]),i[0]=e[0],i[1]=e[1]}}else this[t]=e},hide:function(){this[T]=!0,this.__zr&&this.__zr[L]()},show:function(){this[T]=!1,this.__zr&&this.__zr[L]()},attr:function(t,e){if(typeof t===Ot)this.attrKV(t,e);else if(a[$](t))for(var i in t)t.hasOwnProperty(i)&&this.attrKV(i,t[i]);return this.dirty(),this},setClipPath:function(t){var e=this.__zr;e&&t.addSelfToZr(e),this.clipPath&&this.clipPath!==t&&this.removeClipPath(),this.clipPath=t,t.__zr=e,t.__clipTarget=this,this.dirty()},removeClipPath:function(){var t=this.clipPath;t&&(t.__zr&&t.removeSelfFromZr(t.__zr),t.__zr=null,t.__clipTarget=null,this.clipPath=null,this.dirty())},addSelfToZr:function(t){this.__zr=t;var e=this.animators;if(e)for(var i=0;i<e[Nt];i++)t[D].addAnimator(e[i]);this.clipPath&&this.clipPath.addSelfToZr(t)},removeSelfFromZr:function(t){this.__zr=null;var e=this.animators;if(e)for(var i=0;i<e[Nt];i++)t[D].removeAnimator(e[i]);this.clipPath&&this.clipPath.removeSelfFromZr(t)}},a.mixin(o,r),a.mixin(o,n),a.mixin(o,i),o}),e("zrender/container/Group",[qt,pt,"../Element","../core/BoundingRect"],function(t){var e=t(pt),i=t("../Element"),n=t("../core/BoundingRect"),r=function(t){t=t||{},i.call(this,t);for(var e in t)this[e]=t[e];this._children=[],this.__storage=null,this[z]=!0};return r[Vt]={constructor:r,type:"group",children:function(){return this._children.slice()},childAt:function(t){return this._children[t]},childOfName:function(t){for(var e=this._children,i=0;i<e[Nt];i++)if(e[i].name===t)return e[i]},childCount:function(){return this._children[Nt]},add:function(t){return t&&t!==this&&t[O]!==this&&(this._children.push(t),this._doAdd(t)),this},addBefore:function(t,e){if(t&&t!==this&&t[O]!==this&&e&&e[O]===this){var i=this._children,n=i[Bt](e);n>=0&&(i[U](n,0,t),this._doAdd(t))}return this},_doAdd:function(t){t[O]&&t[O][A](t),t[O]=this;var e=this.__storage,i=this.__zr;e&&e!==t.__storage&&(e.addToMap(t),t instanceof r&&t.addChildrenToStorage(e)),i&&i[L]()},remove:function(t){var i=this.__zr,n=this.__storage,a=this._children,o=e[Bt](a,t);return 0>o?this:(a[U](o,1),t[O]=null,n&&(n.delFromMap(t.id),t instanceof r&&t.delChildrenFromStorage(n)),i&&i[L](),this)},removeAll:function(){var t,e,i=this._children,n=this.__storage;for(e=0;e<i[Nt];e++)t=i[e],n&&(n.delFromMap(t.id),t instanceof r&&t.delChildrenFromStorage(n)),t[O]=null;return i[Nt]=0,this},eachChild:function(t,e){for(var i=this._children,n=0;n<i[Nt];n++){var r=i[n];t.call(e,r,n)}return this},traverse:function(t,e){for(var i=0;i<this._children[Nt];i++){var n=this._children[i];t.call(e,n),"group"===n.type&&n[k](t,e)}return this},addChildrenToStorage:function(t){for(var e=0;e<this._children[Nt];e++){var i=this._children[e];t.addToMap(i),i instanceof r&&i.addChildrenToStorage(t)}},delChildrenFromStorage:function(t){for(var e=0;e<this._children[Nt];e++){var i=this._children[e];t.delFromMap(i.id),i instanceof r&&i.delChildrenFromStorage(t)}},dirty:function(){return this[z]=!0,this.__zr&&this.__zr[L](),this},getBoundingRect:function(t){for(var e=null,i=new n(0,0,0,0),r=t||this._children,a=[],o=0;o<r[Nt];o++){var s=r[o];if(!s[T]&&!s.invisible){var u=s[rt](),c=s[I](a);c?(i.copy(u),i[gt](c),e=e||i.clone(),e.union(i)):(e=e||u.clone(),e.union(u))}}return e||i}},e[At](r,i),r}),e("echarts/view/Component",[qt,"zrender/container/Group","../util/component",it],function(t){var e=t("zrender/container/Group"),i=t("../util/component"),n=t(it),r=function(){this.group=new e,this.uid=i.getUID("viewComponent")};r[Vt]={constructor:r,init:function(t,e){},render:function(t,e,i,n){},dispose:function(){}};var a=r[Vt];return a.updateView=a.updateLayout=a.updateVisual=function(t,e,i,n){},n[Lt](r),n[kt](r,{registerWhenExtend:!0}),r}),e("echarts/view/Chart",[qt,"zrender/container/Group","../util/component",it],function(t){function e(){this.group=new r,this.uid=a.getUID("viewChart")}function i(t,e){if(t&&(t[C](e),"group"===t.type))for(var n=0;n<t.childCount();n++)i(t.childAt(n),e)}function n(t,e,n){if(null!=e[S]){var r=t[M](e[S]);i(r,n)}else if(e.name){var a=t.indexOfName(e.name),r=t[M](a);i(r,n)}else t[w](function(t){i(t,n)})}var r=t("zrender/container/Group"),a=t("../util/component"),o=t(it);e[Vt]={type:"chart",init:function(t,e){},render:function(t,e,i,n){},highlight:function(t,e,i,r){n(t[V](),r,W)},downplay:function(t,e,i,r){n(t[V](),r,H)},remove:function(t,e){this.group.removeAll()},dispose:function(){}};var s=e[Vt];return s.updateView=s.updateLayout=s.updateVisual=function(t,e,i,n){this.render(t,e,i,n)},o[Lt](e),o[kt](e,{registerWhenExtend:!0}),e}),e("zrender/graphic/Style",[qt],function(t){var e=["lineCap","lineJoin","miterLimit","shadowBlur","shadowOffsetX","shadowOffsetY","shadowColor"],i=function(t){this.extendFrom(t)};i[Vt]={constructor:i,fill:"#000000",stroke:null,opacity:1,lineDash:null,lineDashOffset:0,shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,lineWidth:1,strokeNoScale:!1,text:null,textFill:"#000",textStroke:null,textPosition:"inside",textBaseline:null,textAlign:null,textDistance:5,textShadowBlur:0,textShadowOffsetX:0,textShadowOffsetY:0,bind:function(t,i){for(var n=this.fill,r=this[bt],a=0;a<e[Nt];a++){var o=e[a];null!=this[o]&&(t[o]=this[o])}if(null!=r){var s=this[wt];t[wt]=s/(this.strokeNoScale&&i&&i.getLineScale?i.getLineScale():1)}null!=n&&(t.fillStyle=n.canvasGradient?n.canvasGradient:n),null!=r&&(t.strokeStyle=r.canvasGradient?r.canvasGradient:r),null!=this[_t]&&(t.globalAlpha=this[_t])},extendFrom:function(t,e){if(t){var i=this;for(var n in t)!t.hasOwnProperty(n)||!e&&i.hasOwnProperty(n)||(i[n]=t[n])}},set:function(t,e){typeof t===Ot?this[t]=e:this.extendFrom(t,!0)},clone:function(){var t=new this.constructor;return t.extendFrom(this,!0),t}};var n,r,a=i[Vt];for(r=0;r<e[Nt];r++)n=e[r],n in a||(a[n]=null);return i}),e("zrender/graphic/mixin/RectText",[qt,"../../contain/text","../../core/BoundingRect"],function(t){function e(t,e){return typeof t===Ot?t.lastIndexOf("%")>=0?parseFloat(t)/100*e:parseFloat(t):t}function i(t,e){t[B](e[0],e[1],e[2],e[3],e[4],e[5])}var n=t("../../contain/text"),r=t("../../core/BoundingRect"),a=new r,o=function(){};return o[Vt]={constructor:o,drawRectText:function(t,r,o){var s=this.style,u=s.text;if(null!=u&&(u+=""),u){var c,l,h=s.textPosition,f=s.textDistance,d=s[b],p=s.textFont||s.font,v=s[_];o=o||n[rt](u,p,d,v);var m=this[B],g=this.invTransform;if(m&&(a.copy(r),a[gt](m),r=a,i(t,g)),h instanceof Array)c=r.x+e(h[0],r.width),l=r.y+e(h[1],r[mt]),d=d||"left",v=v||"top";else{var y=n.adjustTextPositionOnRect(h,r,o,f);c=y.x,l=y.y,d=d||y[b],v=v||y[_]}t[b]=d,t[_]=v;var x=s.textFill,w=s.textStroke;x&&(t.fillStyle=x),w&&(t.strokeStyle=w),t.font=p,t.shadowColor=s.textShadowColor,t.shadowBlur=s.textShadowBlur,t.shadowOffsetX=s.textShadowOffsetX,t.shadowOffsetY=s.textShadowOffsetY;for(var M=u.split("\n"),S=0;S<M[Nt];S++)x&&t.fillText(M[S],c,l),w&&t.strokeText(M[S],c,l),l+=o.lineHeight;m&&i(t,m)}}},o}),e("zrender/graphic/Displayable",[qt,pt,"./Style","../Element","./mixin/RectText"],function(t){function e(t){t=t||{},r.call(this,t);for(var e in t)t.hasOwnProperty(e)&&"style"!==e&&(this[e]=t[e]);this.style=new n(t.style),this._rect=null,this.__clipPaths=[]}var i=t(pt),n=t("./Style"),r=t("../Element"),a=t("./mixin/RectText");return e[Vt]={constructor:e,type:"displayable",__dirty:!0,invisible:!1,z:0,z2:0,zlevel:0,draggable:!1,dragging:!1,silent:!1,culling:!1,cursor:"pointer",rectHover:!1,beforeBrush:function(t){},afterBrush:function(t){},brush:function(t){},getBoundingRect:function(){},contain:function(t,e){return this.rectContain(t,e)},traverse:function(t,e){t.call(e,this)},rectContain:function(t,e){var i=this.transformCoordToLocal(t,e),n=this[rt]();return n[x](i[0],i[1])},dirty:function(){this[z]=!0,this._rect=null,this.__zr&&this.__zr[L]()},animateStyle:function(t){return this.animate("style",t)},attrKV:function(t,e){"style"!==t?r[Vt].attrKV.call(this,t,e):this.style.set(e)},setStyle:function(t,e){return this.style.set(t,e),this.dirty(),this}},i[At](e,r),i.mixin(e,a),e}),e("zrender/core/curve",[qt,"./vector"],function(t){function e(t){return t>-_&&_>t}function i(t){return t>_||-_>t}function n(t,e,i,n,r){var a=1-r;return a*a*(a*t+3*r*e)+r*r*(r*n+3*a*i)}function r(t,e,i,n,r){var a=1-r;return 3*(((e-t)*a+2*(i-e)*r)*a+(n-i)*r*r)}function a(t,i,n,r,a,o){var s=r+3*(i-n)-t,u=3*(n-2*i+t),c=3*(i-t),l=t-a,h=u*u-3*s*c,f=u*c-9*s*l,d=c*c-3*u*l,p=0;if(e(h)&&e(f))if(e(u))o[0]=0;else{var v=-c/u;v>=0&&1>=v&&(o[p++]=v)}else{var m=f*f-4*h*d;if(e(m)){var g=f/h,v=-u/s+g,_=-g/2;v>=0&&1>=v&&(o[p++]=v),_>=0&&1>=_&&(o[p++]=_)}else if(m>0){var M=x(m),S=h*u+1.5*s*(-f+M),C=h*u+1.5*s*(-f-M);S=0>S?-y(-S,w):y(S,w),C=0>C?-y(-C,w):y(C,w);var v=(-u-(S+C))/(3*s);v>=0&&1>=v&&(o[p++]=v)}else{
var k=(2*h*u-3*s*f)/(2*x(h*h*h)),A=Math.acos(k)/3,z=x(h),L=Math.cos(A),v=(-u-2*z*L)/(3*s),_=(-u+z*(L+b*Math.sin(A)))/(3*s),T=(-u+z*(L-b*Math.sin(A)))/(3*s);v>=0&&1>=v&&(o[p++]=v),_>=0&&1>=_&&(o[p++]=_),T>=0&&1>=T&&(o[p++]=T)}}return p}function o(t,n,r,a,o){var s=6*r-12*n+6*t,u=9*n+3*a-3*t-9*r,c=3*n-3*t,l=0;if(e(u)){if(i(s)){var h=-c/s;h>=0&&1>=h&&(o[l++]=h)}}else{var f=s*s-4*u*c;if(e(f))o[0]=-s/(2*u);else if(f>0){var d=x(f),h=(-s+d)/(2*u),p=(-s-d)/(2*u);h>=0&&1>=h&&(o[l++]=h),p>=0&&1>=p&&(o[l++]=p)}}return l}function s(t,e,i,n,r,a){var o=(e-t)*r+t,s=(i-e)*r+e,u=(n-i)*r+i,c=(s-o)*r+o,l=(u-s)*r+s,h=(l-c)*r+c;a[0]=t,a[1]=o,a[2]=c,a[3]=h,a[4]=h,a[5]=l,a[6]=u,a[7]=n}function u(t,e,i,r,a,o,s,u,c,l,h){var f,d,p,v,m,y=.005,b=1/0;M[0]=c,M[1]=l;for(var w=0;1>w;w+=.05)S[0]=n(t,i,a,s,w),S[1]=n(e,r,o,u,w),v=g(M,S),b>v&&(f=w,b=v);b=1/0;for(var k=0;32>k&&!(_>y);k++)d=f-y,p=f+y,S[0]=n(t,i,a,s,d),S[1]=n(e,r,o,u,d),v=g(S,M),d>=0&&b>v?(f=d,b=v):(C[0]=n(t,i,a,s,p),C[1]=n(e,r,o,u,p),m=g(C,M),1>=p&&b>m?(f=p,b=m):y*=.5);return h&&(h[0]=n(t,i,a,s,f),h[1]=n(e,r,o,u,f)),x(b)}function c(t,e,i,n){var r=1-n;return r*(r*t+2*n*e)+n*n*i}function l(t,e,i,n){return 2*((1-n)*(e-t)+n*(i-e))}function h(t,n,r,a,o){var s=t-2*n+r,u=2*(n-t),c=t-a,l=0;if(e(s)){if(i(u)){var h=-c/u;h>=0&&1>=h&&(o[l++]=h)}}else{var f=u*u-4*s*c;if(e(f)){var h=-u/(2*s);h>=0&&1>=h&&(o[l++]=h)}else if(f>0){var d=x(f),h=(-u+d)/(2*s),p=(-u-d)/(2*s);h>=0&&1>=h&&(o[l++]=h),p>=0&&1>=p&&(o[l++]=p)}}return l}function f(t,e,i){var n=t+i-2*e;return 0===n?.5:(t-e)/n}function d(t,e,i,n,r){var a=(e-t)*n+t,o=(i-e)*n+e,s=(o-a)*n+a;r[0]=t,r[1]=a,r[2]=s,r[3]=s,r[4]=o,r[5]=i}function p(t,e,i,n,r,a,o,s,u){var l,h=.005,f=1/0;M[0]=o,M[1]=s;for(var d=0;1>d;d+=.05){S[0]=c(t,i,r,d),S[1]=c(e,n,a,d);var p=g(M,S);f>p&&(l=d,f=p)}f=1/0;for(var v=0;32>v&&!(_>h);v++){var m=l-h,y=l+h;S[0]=c(t,i,r,m),S[1]=c(e,n,a,m);var p=g(S,M);if(m>=0&&f>p)l=m,f=p;else{C[0]=c(t,i,r,y),C[1]=c(e,n,a,y);var b=g(C,M);1>=y&&f>b?(l=y,f=b):h*=.5}}return u&&(u[0]=c(t,i,r,l),u[1]=c(e,n,a,l)),x(f)}var v=t("./vector"),m=v[vt],g=v.distSquare,y=Math.pow,x=Math.sqrt,_=1e-4,b=x(3),w=1/3,M=m(),S=m(),C=m();return{cubicAt:n,cubicDerivativeAt:r,cubicRootAt:a,cubicExtrema:o,cubicSubdivide:s,cubicProjectPoint:u,quadraticAt:c,quadraticDerivativeAt:l,quadraticRootAt:h,quadraticExtremum:f,quadraticSubdivide:d,quadraticProjectPoint:p}}),e("zrender/core/bbox",[qt,"./vector","./curve"],function(t){var e=t("./vector"),i=t("./curve"),n={},r=Math.min,a=Math.max,o=Math.sin,s=Math.cos,u=e[vt](),c=e[vt](),l=e[vt](),h=2*Math.PI;return n.fromPoints=function(t,e,i){if(0!==t[Nt]){var n,o=t[0],s=o[0],u=o[0],c=o[1],l=o[1];for(n=1;n<t[Nt];n++)o=t[n],s=r(s,o[0]),u=a(u,o[0]),c=r(c,o[1]),l=a(l,o[1]);e[0]=s,e[1]=c,i[0]=u,i[1]=l}},n.fromLine=function(t,e,i,n,o,s){o[0]=r(t,i),o[1]=r(e,n),s[0]=a(t,i),s[1]=a(e,n)},n.fromCubic=function(t,e,n,o,s,u,c,l,h,f){var d,p,v,m,g,y=[],x=[],_=i.cubicExtrema,b=i.cubicAt,w=_(t,n,s,c,y);for(g=0;w>g;g++)y[g]=b(t,n,s,c,y[g]);for(w=_(e,o,u,l,x),g=0;w>g;g++)x[g]=b(e,o,u,l,x[g]);y.push(t,c),x.push(e,l),d=r.apply(null,y),p=a.apply(null,y),v=r.apply(null,x),m=a.apply(null,x),h[0]=d,h[1]=v,f[0]=p,f[1]=m},n.fromQuadratic=function(t,e,n,o,s,u,c,l){var h=i.quadraticExtremum,f=i.quadraticAt,d=a(r(h(t,n,s),1),0),p=a(r(h(e,o,u),1),0),v=f(t,n,s,d),m=f(e,o,u,p);c[0]=r(t,s,v),c[1]=r(e,u,m),l[0]=a(t,s,v),l[1]=a(e,u,m)},n.fromArc=function(t,i,n,r,a,f,d,p,v){var m=e.min,g=e.max;if(Math.abs(a-f)%h<1e-4)return p[0]=t-n,p[1]=i-r,v[0]=t+n,void(v[1]=i+r);if(u[0]=s(a)*n+t,u[1]=o(a)*r+i,c[0]=s(f)*n+t,c[1]=o(f)*r+i,m(p,u,c),g(v,u,c),a%=h,0>a&&(a+=h),f%=h,0>f&&(f+=h),a>f&&!d?f+=h:f>a&&d&&(a+=h),d){var y=f;f=a,a=y}for(var x=0;f>x;x+=Math.PI/2)x>a&&(l[0]=s(x)*n+t,l[1]=o(x)*r+i,m(p,l,p),g(v,l,v))},n}),e("zrender/core/PathProxy",[qt,"./curve","./vector","./bbox","./BoundingRect"],function(t){var e=t("./curve"),i=t("./vector"),n=t("./bbox"),r=t("./BoundingRect"),a={M:1,L:2,C:3,Q:4,A:5,Z:6,R:7},o=[],s=[],u=[],c=[],l=Math.min,h=Math.max,f=Math.cos,d=Math.sin,x=Math.sqrt,_=typeof Float32Array!=xt,b=function(){this.data=[],this._len=0,this._ctx=null,this._xi=0,this._yi=0,this._x0=0,this._y0=0};return b[Vt]={constructor:b,_lineDash:null,_dashOffset:0,_dashIdx:0,_dashSum:0,getContext:function(){return this._ctx},beginPath:function(t){return this._ctx=t,t&&t[y](),this._len=0,this._lineDash&&(this._lineDash=null,this._dashOffset=0),this},moveTo:function(t,e){return this.addData(a.M,t,e),this._ctx&&this._ctx[g](t,e),this._x0=t,this._y0=e,this._xi=t,this._yi=e,this},lineTo:function(t,e){return this.addData(a.L,t,e),this._ctx&&(this._needsDash()?this._dashedLineTo(t,e):this._ctx[m](t,e)),this._xi=t,this._yi=e,this},bezierCurveTo:function(t,e,i,n,r,o){return this.addData(a.C,t,e,i,n,r,o),this._ctx&&(this._needsDash()?this._dashedBezierTo(t,e,i,n,r,o):this._ctx[v](t,e,i,n,r,o)),this._xi=r,this._yi=o,this},quadraticCurveTo:function(t,e,i,n){return this.addData(a.Q,t,e,i,n),this._ctx&&(this._needsDash()?this._dashedQuadraticTo(t,e,i,n):this._ctx.quadraticCurveTo(t,e,i,n)),this._xi=i,this._yi=n,this},arc:function(t,e,i,n,r,o){return this.addData(a.A,t,e,i,i,n,r-n,0,o?0:1),this._ctx&&this._ctx.arc(t,e,i,n,r,o),this._xi=f(r)*i+t,this._xi=d(r)*i+t,this},arcTo:function(t,e,i,n,r){return this._ctx&&this._ctx.arcTo(t,e,i,n,r),this},rect:function(t,e,i,n){return this._ctx&&this._ctx.rect(t,e,i,n),this.addData(a.R,t,e,i,n),this},closePath:function(){this.addData(a.Z);var t=this._ctx,e=this._x0,i=this._y0;return t&&(this._needsDash()&&this._dashedLineTo(e,i),t[p]()),this._xi=e,this._yi=i,this},fill:function(t){t&&t.fill(),this.toStatic()},stroke:function(t){t&&t[bt](),this.toStatic()},setLineDash:function(t){if(t instanceof Array){this._lineDash=t,this._dashIdx=0;for(var e=0,i=0;i<t[Nt];i++)e+=t[i];this._dashSum=e}return this},setLineDashOffset:function(t){return this._dashOffset=t,this},len:function(){return this._len},setData:function(t){var e=t[Nt];this.data&&this.data[Nt]==e||!_||(this.data=new Float32Array(e));for(var i=0;e>i;i++)this.data[i]=t[i];this._len=e},appendPath:function(t){t instanceof Array||(t=[t]);for(var e=t[Nt],i=0,n=this._len,r=0;e>r;r++)i+=t[r].len();_&&this.data instanceof Float32Array&&(this.data=new Float32Array(n+i));for(var r=0;e>r;r++)for(var a=t[r].data,o=0;o<a[Nt];o++)this.data[n++]=a[o];this._len=n},addData:function(t){var e=this.data;this._len+arguments[Nt]>e[Nt]&&(this._expandData(),e=this.data);for(var i=0;i<arguments[Nt];i++)e[this._len++]=arguments[i];this._prevCmd=t},_expandData:function(){if(!(this.data instanceof Array)){for(var t=[],e=0;e<this._len;e++)t[e]=this.data[e];this.data=t}},_needsDash:function(){return this._lineDash},_dashedLineTo:function(t,e){var i,n,r=this._dashSum,a=this._dashOffset,o=this._lineDash,s=this._ctx,u=this._xi,c=this._yi,f=t-u,d=e-c,p=x(f*f+d*d),v=u,y=c,_=o[Nt];for(f/=p,d/=p,0>a&&(a=r+a),a%=r,v-=a*f,y-=a*d;f>=0&&t>=v||0>f&&v>t;)n=this._dashIdx,i=o[n],v+=f*i,y+=d*i,this._dashIdx=(n+1)%_,f>0&&u>v||0>f&&v>u||s[n%2?g:m](f>=0?l(v,t):h(v,t),d>=0?l(y,e):h(y,e));f=v-t,d=y-e,this._dashOffset=-x(f*f+d*d)},_dashedBezierTo:function(t,i,n,r,a,o){var s,u,c,l,h,f=this._dashSum,d=this._dashOffset,p=this._lineDash,v=this._ctx,y=this._xi,_=this._yi,b=e.cubicAt,w=0,M=this._dashIdx,S=p[Nt],C=0;for(0>d&&(d=f+d),d%=f,s=0;1>s;s+=.1)u=b(y,t,n,a,s+.1)-b(y,t,n,a,s),c=b(_,i,r,o,s+.1)-b(_,i,r,o,s),w+=x(u*u+c*c);for(;S>M&&(C+=p[M],!(C>d));M++);for(s=(C-d)/w;1>=s;)l=b(y,t,n,a,s),h=b(_,i,r,o,s),M%2?v[g](l,h):v[m](l,h),s+=p[M]/w,M=(M+1)%S;M%2!==0&&v[m](a,o),u=a-l,c=o-h,this._dashOffset=-x(u*u+c*c)},_dashedQuadraticTo:function(t,e,i,n){var r=i,a=n;i=(i+2*t)/3,n=(n+2*e)/3,t=(this._xi+2*t)/3,e=(this._yi+2*e)/3,this._dashedBezierTo(t,e,i,n,r,a)},toStatic:function(){this.data[Nt]=this._len,_&&this.data instanceof Array&&(this.data=new Float32Array(this.data))},getBoundingRect:function(){o[0]=o[1]=u[0]=u[1]=Number.MAX_VALUE,s[0]=s[1]=c[0]=c[1]=-Number.MAX_VALUE;for(var t=this.data,e=0,l=0,h=0,p=0,v=0;v<t[Nt];){var m=t[v++];switch(1==v&&(e=t[v],l=t[v+1],h=e,p=l),m){case a.M:h=t[v++],p=t[v++],e=h,l=p,u[0]=h,u[1]=p,c[0]=h,c[1]=p;break;case a.L:n.fromLine(e,l,t[v],t[v+1],u,c),e=t[v++],l=t[v++];break;case a.C:n.fromCubic(e,l,t[v++],t[v++],t[v++],t[v++],t[v],t[v+1],u,c),e=t[v++],l=t[v++];break;case a.Q:n.fromQuadratic(e,l,t[v++],t[v++],t[v],t[v+1],u,c),e=t[v++],l=t[v++];break;case a.A:var g=t[v++],y=t[v++],x=t[v++],_=t[v++],b=t[v++],w=t[v++]+b,M=(t[v++],1-t[v++]);1==v&&(h=f(b)*x+g,p=d(b)*_+y),n.fromArc(g,y,x,_,b,w,M,u,c),e=f(w)*x+g,l=d(w)*_+y;break;case a.R:h=e=t[v++],p=l=t[v++];var S=t[v++],C=t[v++];n.fromLine(h,p,h+S,p+C,u,c);break;case a.Z:e=h,l=p}i.min(o,o,u),i.max(s,s,c)}return 0===v&&(o[0]=o[1]=s[0]=s[1]=0),new r(o[0],o[1],s[0]-o[0],s[1]-o[1])},rebuildPath:function(t){for(var e=this.data,i=0;i<this._len;){var n=e[i++];switch(n){case a.M:t[g](e[i++],e[i++]);break;case a.L:t[m](e[i++],e[i++]);break;case a.C:t[v](e[i++],e[i++],e[i++],e[i++],e[i++],e[i++]);break;case a.Q:t.quadraticCurveTo(e[i++],e[i++],e[i++],e[i++]);break;case a.A:var r=e[i++],o=e[i++],s=e[i++],u=e[i++],c=e[i++],l=e[i++],h=e[i++],f=e[i++],d=s>u?s:u,y=s>u?1:s/u,x=s>u?u/s:1,_=Math.abs(s-u)>.001;_?(t.translate(r,o),t.rotate(h),t.scale(y,x),t.arc(0,0,d,c,c+l,1-f),t.scale(1/y,1/x),t.rotate(-h),t.translate(-r,-o)):t.arc(r,o,d,c,c+l,1-f);break;case a.R:t.rect(e[i++],e[i++],e[i++],e[i++]);break;case a.Z:t[p]()}}}},b.CMD=a,b}),e("zrender/contain/line",[],function(){return{containStroke:function(t,e,i,n,r,a,o){if(0===r)return!1;var s=r,u=0,c=t;if(o>e+s&&o>n+s||e-s>o&&n-s>o||a>t+s&&a>i+s||t-s>a&&i-s>a)return!1;if(t===i)return Math.abs(a-t)<=s/2;u=(e-n)/(t-i),c=(t*n-i*e)/(t-i);var l=u*a-o+c,h=l*l/(u*u+1);return s/2*s/2>=h}}}),e("zrender/contain/cubic",[qt,"../core/curve"],function(t){var e=t("../core/curve");return{containStroke:function(t,i,n,r,a,o,s,u,c,l,h){if(0===c)return!1;var f=c;if(h>i+f&&h>r+f&&h>o+f&&h>u+f||i-f>h&&r-f>h&&o-f>h&&u-f>h||l>t+f&&l>n+f&&l>a+f&&l>s+f||t-f>l&&n-f>l&&a-f>l&&s-f>l)return!1;var d=e.cubicProjectPoint(t,i,n,r,a,o,s,u,l,h,null);return f/2>=d}}}),e("zrender/contain/quadratic",[qt,"../core/curve"],function(t){var e=t("../core/curve");return{containStroke:function(t,i,n,r,a,o,s,u,c){if(0===s)return!1;var l=s;if(c>i+l&&c>r+l&&c>o+l||i-l>c&&r-l>c&&o-l>c||u>t+l&&u>n+l&&u>a+l||t-l>u&&n-l>u&&a-l>u)return!1;var h=e.quadraticProjectPoint(t,i,n,r,a,o,u,c,null);return l/2>=h}}}),e("zrender/contain/util",[qt],function(t){var e=2*Math.PI;return{normalizeRadian:function(t){return t%=e,0>t&&(t+=e),t}}}),e("zrender/contain/arc",[qt,"./util"],function(t){var e=t("./util").normalizeRadian,i=2*Math.PI;return{containStroke:function(t,n,r,a,o,s,u,c,l){if(0===u)return!1;var h=u;c-=t,l-=n;var f=Math.sqrt(c*c+l*l);if(f-h>r||r>f+h)return!1;if(Math.abs(a-o)%i<1e-4)return!0;if(s){var d=a;a=e(o),o=e(d)}else a=e(a),o=e(o);a>o&&(o+=i);var p=Math.atan2(l,c);return 0>p&&(p+=i),p>=a&&o>=p||p+i>=a&&o>=p+i}}}),e("zrender/contain/windingLine",[],function(){return function(t,e,i,n,r,a){if(a>e&&a>n||e>a&&n>a)return 0;if(n===e)return 0;var o=e>n?1:-1,s=(a-e)/(n-e),u=s*(i-t)+t;return u>r?o:0}}),e("zrender/contain/path",[qt,"../core/PathProxy","./line","./cubic","./quadratic","./arc","./util","../core/curve","./windingLine"],function(t){function e(t,e){return Math.abs(t-e)<g}function i(){var t=x[0];x[0]=x[1],x[1]=t}function n(t,e,n,r,a,o,s,u,c,l){if(l>e&&l>r&&l>o&&l>u||e>l&&r>l&&o>l&&u>l)return 0;var h=d.cubicRootAt(e,r,o,u,l,y);if(0===h)return 0;for(var f,p,v=0,m=-1,g=0;h>g;g++){var _=y[g],b=d.cubicAt(t,n,a,s,_);c>b||(0>m&&(m=d.cubicExtrema(e,r,o,u,x),x[1]<x[0]&&m>1&&i(),f=d.cubicAt(e,r,o,u,x[0]),m>1&&(p=d.cubicAt(e,r,o,u,x[1]))),v+=2==m?_<x[0]?e>f?1:-1:_<x[1]?f>p?1:-1:p>u?1:-1:_<x[0]?e>f?1:-1:f>u?1:-1)}return v}function r(t,e,i,n,r,a,o,s){if(s>e&&s>n&&s>a||e>s&&n>s&&a>s)return 0;var u=d.quadraticRootAt(e,n,a,s,y);if(0===u)return 0;var c=d.quadraticExtremum(e,n,a);if(c>=0&&1>=c){for(var l=0,h=d.quadraticAt(e,n,a,c),f=0;u>f;f++){var p=d.quadraticAt(t,i,r,y[f]);p>o||(l+=y[f]<c?e>h?1:-1:h>a?1:-1)}return l}var p=d.quadraticAt(t,i,r,y[0]);return p>o?0:e>a?1:-1}function a(t,e,i,n,r,a,o,s){if(s-=e,s>i||-i>s)return 0;var u=Math.sqrt(i*i-s*s);if(y[0]=-u,y[1]=u,Math.abs(n-r)%m<1e-4){n=0,r=m;var c=a?1:-1;return o>=y[0]+t&&o<=y[1]+t?c:0}if(a){var u=n;n=f(r),r=f(u)}else n=f(n),r=f(r);n>r&&(r+=m);for(var l=0,h=0;2>h;h++){var d=y[h];if(d+t>o){var p=Math.atan2(s,d),c=a?1:-1;0>p&&(p=m+p),(p>=n&&r>=p||p+m>=n&&r>=p+m)&&(p>Math.PI/2&&p<1.5*Math.PI&&(c=-c),l+=c)}}return l}function o(t,i,o,u,f){for(var d=0,m=0,g=0,y=0,x=0,_=0;_<t[Nt];){var b=t[_++];if(b===s.M&&_>1&&(o||(d+=p(m,g,y,x,u,f)),0!==d))return!0;switch(1==_&&(m=t[_],g=t[_+1],y=m,x=g),b){case s.M:y=t[_++],x=t[_++],m=y,g=x;break;case s.L:if(o){if(v(m,g,t[_],t[_+1],i,u,f))return!0}else d+=p(m,g,t[_],t[_+1],u,f)||0;m=t[_++],g=t[_++];break;case s.C:if(o){if(c.containStroke(m,g,t[_++],t[_++],t[_++],t[_++],t[_],t[_+1],i,u,f))return!0}else d+=n(m,g,t[_++],t[_++],t[_++],t[_++],t[_],t[_+1],u,f)||0;m=t[_++],g=t[_++];break;case s.Q:if(o){if(l.containStroke(m,g,t[_++],t[_++],t[_],t[_+1],i,u,f))return!0}else d+=r(m,g,t[_++],t[_++],t[_],t[_+1],u,f)||0;m=t[_++],g=t[_++];break;case s.A:var w=t[_++],M=t[_++],S=t[_++],C=t[_++],k=t[_++],A=t[_++],z=(t[_++],1-t[_++]),L=Math.cos(k)*S+w,T=Math.sin(k)*C+M;_>1?d+=p(m,g,L,T,u,f):(y=L,x=T);var P=(u-w)*C/S+w;if(o){if(h.containStroke(w,M,C,k,k+A,z,i,P,f))return!0}else d+=a(w,M,C,k,k+A,z,P,f);m=Math.cos(k+A)*S+w,g=Math.sin(k+A)*C+M;break;case s.R:y=m=t[_++],x=g=t[_++];var D=t[_++],I=t[_++],L=y+D,T=x+I;if(o){if(v(y,x,L,x,i,u,f)||v(L,x,L,T,i,u,f)||v(L,T,y,T,i,u,f)||v(y,T,L,T,i,u,f))return!0}else d+=p(L,x,L,T,u,f),d+=p(y,T,y,x,u,f);break;case s.Z:if(o){if(v(m,g,y,x,i,u,f))return!0}else if(d+=p(m,g,y,x,u,f),0!==d)return!0;m=y,g=x}}return o||e(g,x)||(d+=p(m,g,y,x,u,f)||0),0!==d}var s=t("../core/PathProxy").CMD,u=t("./line"),c=t("./cubic"),l=t("./quadratic"),h=t("./arc"),f=t("./util").normalizeRadian,d=t("../core/curve"),p=t("./windingLine"),v=u.containStroke,m=2*Math.PI,g=1e-4,y=[-1,-1,-1],x=[-1,-1];return{contain:function(t,e,i){return o(t,0,!1,e,i)},containStroke:function(t,e,i,n){return o(t,e,!0,i,n)}}}),e("zrender/graphic/Path",[qt,"./Displayable",pt,"../core/PathProxy","../contain/path","./Gradient"],function(t){function e(t){var e=t.fill;return null!=e&&"none"!==e}function i(t){var e=t[bt];return null!=e&&"none"!==e&&t[wt]>0}function n(t){r.call(this,t),this.path=new o}var r=t("./Displayable"),a=t(pt),o=t("../core/PathProxy"),s=t("../contain/path"),u=t("./Gradient"),c=Math.abs;return n[Vt]={constructor:n,type:"path",__dirtyPath:!0,strokeContainThreshold:5,brush:function(t){t.save();var n=this.style,r=this.path,a=i(n),o=e(n);this.__dirtyPath&&(o&&n.fill instanceof u&&n.fill.updateCanvasGradient(this,t),a&&n[bt]instanceof u&&n[bt].updateCanvasGradient(this,t)),n.bind(t,this),this.setTransform(t);var s=n.lineDash,c=n.lineDashOffset,l=!!t.setLineDash;this.__dirtyPath||s&&!l&&a?(r=this.path[y](t),s&&!l&&(r.setLineDash(s),r.setLineDashOffset(c)),this[d](r,this.shape),this.__dirtyPath=!1):(t[y](),this.path.rebuildPath(t)),o&&r.fill(t),s&&l&&(t.setLineDash(s),t.lineDashOffset=c),a&&r[bt](t),null!=n.text&&this.drawRectText(t,this[rt]()),t.restore()},buildPath:function(t,e){},getBoundingRect:function(){var t=this._rect,e=this.style;if(!t){var n=this.path;this.__dirtyPath&&(n[y](),this[d](n,this.shape)),t=n[rt]()}if(i(e)&&(this[z]||!this._rect)){var r=this._rectWithStroke||(this._rectWithStroke=t.clone());r.copy(t);var a=e[wt],o=e.strokeNoScale?this.getLineScale():1;return a=Math.max(a,this.strokeContainThreshold),o>1e-10&&(r.width+=a/o,r[mt]+=a/o,r.x-=a/o/2,r.y-=a/o/2),r}return this._rect=t,t},contain:function(t,n){var r=this.transformCoordToLocal(t,n),a=this[rt](),o=this.style;if(t=r[0],n=r[1],a[x](t,n)){var u=this.path.data;if(i(o)){var c=o[wt],l=o.strokeNoScale?this.getLineScale():1;if(1e-10>l)return!1;if(c=Math.max(c,this.strokeContainThreshold),s.containStroke(u,c/l,t,n))return!0}if(e(o))return s[x](u,t,n)}return!1},dirty:function(t){0===arguments[Nt]&&(t=!0),t&&(this.__dirtyPath=t,this._rect=null),this[z]=!0,this.__zr&&this.__zr[L](),this.__clipTarget&&this.__clipTarget.dirty()},animateShape:function(t){return this.animate("shape",t)},attrKV:function(t,e){"shape"===t?this.setShape(e):r[Vt].attrKV.call(this,t,e)},setShape:function(t,e){var i=this.shape;if(i){if(a[$](t))for(var n in t)i[n]=t[n];else i[t]=e;this.dirty(!0)}return this},getLineScale:function(){var t=this[B];return t&&c(t[0]-1)>1e-10&&c(t[3]-1)>1e-10?Math.sqrt(c(t[0]*t[3]-t[2]*t[1])):1}},n[zt]=function(t){var e=function(e){n.call(this,e),t.style&&this.style.extendFrom(t.style,!1);var i=t.shape;if(i){this.shape=this.shape||{};var r=this.shape;for(var a in i)!r.hasOwnProperty(a)&&i.hasOwnProperty(a)&&(r[a]=i[a])}t.init&&t.init.call(this,e)};a[At](e,n);for(var i in t)"style"!==i&&"shape"!==i&&(e[Vt][i]=t[i]);return e},a[At](n,r),n}),e("zrender/tool/transformPath",[qt,"../core/PathProxy","../core/vector"],function(t){function e(t,e){var n,u,c,l,h,f=t.data,d=i.M,p=i.C,v=i.L,m=i.R,g=i.A,y=i.Q;for(c=0,l=0;c<f[Nt];){switch(n=f[c++],l=c,u=0,n){case d:u=1;break;case v:u=1;break;case p:u=3;break;case y:u=2;break;case g:var x=e[4],_=e[5],b=o(e[0]*e[0]+e[1]*e[1]),w=o(e[2]*e[2]+e[3]*e[3]),M=s(-e[1]/w,e[0]/b);f[c+7];f[c++]+=x,f[c++]+=_,f[c++]*=b,f[c++]*=w,f[c++]+=M,f[c++]+=M,c+=2,l=c;break;case m:S[0]=f[c++],S[1]=f[c++],r(S,S,e),f[l++]=S[0],f[l++]=S[1],S[0]+=f[c++],S[1]+=f[c++],r(S,S,e),f[l++]=S[0],f[l++]=S[1]}for(h=0;u>h;h++){var S=a[h];S[0]=f[c++],S[1]=f[c++],r(S,S,e),f[l++]=S[0],f[l++]=S[1]}}}var i=t("../core/PathProxy").CMD,n=t("../core/vector"),r=n[gt],a=[[],[],[]],o=Math.sqrt,s=Math.atan2;return e}),e("zrender/tool/path",[qt,"../graphic/Path","../core/PathProxy","./transformPath","../core/matrix"],function(t){function e(t,e,i,n,r,a,o,s,u,d,p){var g=u*(f/180),y=h(g)*(t-i)/2+l(g)*(e-n)/2,x=-1*l(g)*(t-i)/2+h(g)*(e-n)/2,_=y*y/(o*o)+x*x/(s*s);_>1&&(o*=c(_),s*=c(_));var b=(r===a?-1:1)*c((o*o*(s*s)-o*o*(x*x)-s*s*(y*y))/(o*o*(x*x)+s*s*(y*y)))||0,w=b*o*x/s,M=b*-s*y/o,S=(t+i)/2+h(g)*w-l(g)*M,C=(e+n)/2+l(g)*w+h(g)*M,k=m([1,0],[(y-w)/o,(x-M)/s]),A=[(y-w)/o,(x-M)/s],z=[(-1*y-w)/o,(-1*x-M)/s],L=m(A,z);v(A,z)<=-1&&(L=f),v(A,z)>=1&&(L=0),0===a&&L>0&&(L-=2*f),1===a&&0>L&&(L+=2*f),p.addData(d,S,C,o,s,k,L,g,a)}function i(t){if(!t)return[];var i,n=t[tt](/-/g," -")[tt](/  /g," ")[tt](/ /g,",")[tt](/,,/g,",");for(i=0;i<u[Nt];i++)n=n[tt](new RegExp(u[i],"g"),"|"+u[i]);var r,o=n.split("|"),s=0,c=0,l=new a,h=a.CMD;for(i=1;i<o[Nt];i++){var f,d=o[i],p=d.charAt(0),v=0,m=d.slice(1)[tt](/e,-/g,"e-").split(",");m[Nt]>0&&""===m[0]&&m.shift();for(var g=0;g<m[Nt];g++)m[g]=parseFloat(m[g]);for(;v<m[Nt]&&!isNaN(m[v])&&!isNaN(m[0]);){var y,x,_,b,w,M,S,C=s,k=c;switch(p){case"l":s+=m[v++],c+=m[v++],f=h.L,l.addData(f,s,c);break;case"L":s=m[v++],c=m[v++],f=h.L,l.addData(f,s,c);break;case"m":s+=m[v++],c+=m[v++],f=h.M,l.addData(f,s,c),p="l";break;case"M":s=m[v++],c=m[v++],f=h.M,l.addData(f,s,c),p="L";break;case"h":s+=m[v++],f=h.L,l.addData(f,s,c);break;case"H":s=m[v++],f=h.L,l.addData(f,s,c);break;case"v":c+=m[v++],f=h.L,l.addData(f,s,c);break;case"V":c=m[v++],f=h.L,l.addData(f,s,c);break;case"C":f=h.C,l.addData(f,m[v++],m[v++],m[v++],m[v++],m[v++],m[v++]),s=m[v-2],c=m[v-1];break;case"c":f=h.C,l.addData(f,m[v++]+s,m[v++]+c,m[v++]+s,m[v++]+c,m[v++]+s,m[v++]+c),s+=m[v-2],c+=m[v-1];break;case"S":y=s,x=c;var A=l.len(),z=l.data;r===h.C&&(y+=s-z[A-4],x+=c-z[A-3]),f=h.C,C=m[v++],k=m[v++],s=m[v++],c=m[v++],l.addData(f,y,x,C,k,s,c);break;case"s":y=s,x=c;var A=l.len(),z=l.data;r===h.C&&(y+=s-z[A-4],x+=c-z[A-3]),f=h.C,C=s+m[v++],k=c+m[v++],s+=m[v++],c+=m[v++],l.addData(f,y,x,C,k,s,c);break;case"Q":C=m[v++],k=m[v++],s=m[v++],c=m[v++],f=h.Q,l.addData(f,C,k,s,c);break;case"q":C=m[v++]+s,k=m[v++]+c,s+=m[v++],c+=m[v++],f=h.Q,l.addData(f,C,k,s,c);break;case"T":y=s,x=c;var A=l.len(),z=l.data;r===h.Q&&(y+=s-z[A-4],x+=c-z[A-3]),s=m[v++],c=m[v++],f=h.Q,l.addData(f,y,x,s,c);break;case"t":y=s,x=c;var A=l.len(),z=l.data;r===h.Q&&(y+=s-z[A-4],x+=c-z[A-3]),s+=m[v++],c+=m[v++],f=h.Q,l.addData(f,y,x,s,c);break;case"A":_=m[v++],b=m[v++],w=m[v++],M=m[v++],S=m[v++],C=s,k=c,s=m[v++],c=m[v++],f=h.A,e(C,k,s,c,M,S,_,b,w,f,l);break;case"a":_=m[v++],b=m[v++],w=m[v++],M=m[v++],S=m[v++],C=s,k=c,s+=m[v++],c+=m[v++],f=h.A,e(C,k,s,c,M,S,_,b,w,f,l)}}("z"===p||"Z"===p)&&(f=h.Z,l.addData(f)),r=f}return l.toStatic(),l}function n(t,e){var n,r=i(t);return e=e||{},e[d]=function(t){t.setData(r.data),n&&o(t,n);var e=t[Rt]();e&&t.rebuildPath(e)},e[gt]=function(t){n||(n=s[vt]()),s.mul(n,t,n)},e}var r=t("../graphic/Path"),a=t("../core/PathProxy"),o=t("./transformPath"),s=t("../core/matrix"),u=["m","M","l","L","v","V","h","H","z","Z","c","C","q","Q","t","T","s","S","a","A"],c=Math.sqrt,l=Math.sin,h=Math.cos,f=Math.PI,p=function(t){return Math.sqrt(t[0]*t[0]+t[1]*t[1])},v=function(t,e){return(t[0]*e[0]+t[1]*e[1])/(p(t)*p(e))},m=function(t,e){return(t[0]*e[1]<t[1]*e[0]?-1:1)*Math.acos(v(t,e))};return{createFromString:function(t,e){return new r(n(t,e))},extendFromString:function(t,e){return r[zt](n(t,e))},mergePath:function(t,e){var i,n,a=[],o=t[Nt];for(n=0;o>n;n++)i=t[n],i[z]&&i[d](i.path,i.shape),a.push(i.path);var s=new r(e);return s[d]=function(t){t.appendPath(a);var e=t[Rt]();e&&t.rebuildPath(e)},s}}}),e("zrender/graphic/helper/roundRect",[qt],function(t){return{buildPath:function(t,e){var i,n,r,a,o=e.x,s=e.y,u=e.width,c=e[mt],l=e.r;typeof l===It?i=n=r=a=l:l instanceof Array?1===l[Nt]?i=n=r=a=l[0]:2===l[Nt]?(i=r=l[0],n=a=l[1]):3===l[Nt]?(i=l[0],n=a=l[1],r=l[2]):(i=l[0],n=l[1],r=l[2],a=l[3]):i=n=r=a=0;var h;i+n>u&&(h=i+n,i*=u/h,n*=u/h),r+a>u&&(h=r+a,r*=u/h,a*=u/h),n+r>c&&(h=n+r,n*=c/h,r*=c/h),i+a>c&&(h=i+a,i*=c/h,a*=c/h),t[g](o+i,s),t[m](o+u-n,s),0!==n&&t.quadraticCurveTo(o+u,s,o+u,s+n),t[m](o+u,s+c-r),0!==r&&t.quadraticCurveTo(o+u,s+c,o+u-r,s+c),t[m](o+a,s+c),0!==a&&t.quadraticCurveTo(o,s+c,o,s+c-a),t[m](o,s+i),0!==i&&t.quadraticCurveTo(o,s,o+i,s)}}}),e("zrender/core/LRU",[qt],function(t){var e=function(){this.head=null,this.tail=null,this._len=0},i=e[Vt];i.insert=function(t){var e=new n(t);return this.insertEntry(e),e},i.insertEntry=function(t){this.head?(this.tail.next=t,t.prev=this.tail,this.tail=t):this.head=this.tail=t,this._len++},i[A]=function(t){var e=t.prev,i=t.next;e?e.next=i:this.head=i,i?i.prev=e:this.tail=e,t.next=t.prev=null,this._len--},i.len=function(){return this._len};var n=function(t){this.value=t,this.next,this.prev},r=function(t){this._list=new e,this._map={},this._maxSize=t||10},a=r[Vt];return a.put=function(t,e){var i=this._list,n=this._map;if(null==n[t]){var r=i.len();if(r>=this._maxSize&&r>0){var a=i.head;i[A](a),delete n[a.key]}var o=i.insert(e);o.key=t,n[t]=o}},a.get=function(t){var e=this._map[t],i=this._list;return null!=e?(e!==i.tail&&(i[A](e),i.insertEntry(e)),e.value):void 0},a.clear=function(){this._list.clear(),this._map={}},r}),e("zrender/graphic/Image",[qt,"./Displayable","../core/BoundingRect",pt,"./helper/roundRect","../core/LRU"],function(t){var e=t("./Displayable"),i=t("../core/BoundingRect"),n=t(pt),r=t("./helper/roundRect"),a=t("../core/LRU"),o=new a(50),s=function(t){e.call(this,t)};return s[Vt]={constructor:s,type:"image",brush:function(t){var e,i=this.style,n=i.image;if(e=typeof n===Ot?this._image:n,!e&&n){var a=o.get(n);if(!a)return e=new Image,e.onload=function(){e.onload=null;for(var t=0;t<a.pending[Nt];t++)a.pending[t].dirty()},a={image:e,pending:[this]},e.src=n,o.put(n,a),void(this._image=e);if(e=a.image,this._image=e,!e.width||!e[mt])return void a.pending.push(this)}if(e){var s=i.width||e.width,u=i[mt]||e[mt],c=i.x||0,l=i.y||0;if(!e.width||!e[mt])return;if(t.save(),i.bind(t),this.setTransform(t),i.r&&(t[y](),r[d](t,i),t.clip()),i.sWidth&&i.sHeight){var h=i.sx||0,f=i.sy||0;t.drawImage(e,h,f,i.sWidth,i.sHeight,c,l,s,u)}else if(i.sx&&i.sy){var h=i.sx,f=i.sy,p=s-h,v=u-f;t.drawImage(e,h,f,p,v,c,l,s,u)}else t.drawImage(e,c,l,s,u);null==i.width&&(i.width=s),null==i[mt]&&(i[mt]=u),null!=i.text&&this.drawRectText(t,this[rt]()),t.restore()}},getBoundingRect:function(){var t=this.style;return this._rect||(this._rect=new i(t.x||0,t.y||0,t.width||0,t[mt]||0)),this._rect}},n[At](s,e),s}),e("zrender/graphic/Text",[qt,"./Displayable",pt,"../contain/text"],function(t){var e=t("./Displayable"),i=t(pt),n=t("../contain/text"),r=function(t){e.call(this,t)};return r[Vt]={constructor:r,type:"text",brush:function(t){var e=this.style,i=e.x||0,r=e.y||0,a=e.text,o=e.fill,s=e[bt];if(null!=a&&(a+=""),a){t.save(),this.style.bind(t),this.setTransform(t),o&&(t.fillStyle=o),s&&(t.strokeStyle=s),t.font=e.textFont||e.font,t[b]=e[b],t[_]=e[_];for(var u=n.measureText("国",t.font).width,c=a.split("\n"),l=0;l<c[Nt];l++)o&&t.fillText(c[l],i,r),s&&t.strokeText(c[l],i,r),r+=u;t.restore()}},getBoundingRect:function(){if(!this._rect){var t=this.style,e=n[rt](t.text+"",t.textFont,t[b],t[_]);e.x+=t.x||0,e.y+=t.y||0,this._rect=e}return this._rect}},i[At](r,e),r}),e("zrender/graphic/shape/Circle",[qt,"../Path"],function(t){return t("../Path")[zt]({type:"circle",shape:{cx:0,cy:0,r:0},buildPath:function(t,e){t[g](e.cx+e.r,e.cy),t.arc(e.cx,e.cy,e.r,0,2*Math.PI,!0)}})}),e("zrender/graphic/shape/Sector",[qt,"../Path"],function(t){return t("../Path")[zt]({type:"sector",shape:{cx:0,cy:0,r0:0,r:0,startAngle:0,endAngle:2*Math.PI,clockwise:!0},buildPath:function(t,e){var i=e.cx,n=e.cy,r=e.r0||0,a=e.r,o=e.startAngle,s=e.endAngle,u=e.clockwise,c=Math.cos(o),l=Math.sin(o);t[g](c*r+i,l*r+n),t[m](c*a+i,l*a+n),t.arc(i,n,a,o,s,!u),t[m](Math.cos(s)*r+i,Math.sin(s)*r+n),0!==r&&t.arc(i,n,r,s,o,u),t[p]()}})}),e("zrender/graphic/helper/smoothSpline",[qt,"../../core/vector"],function(t){function e(t,e,i,n,r,a,o){var s=.5*(i-t),u=.5*(n-e);return(2*(e-i)+s+u)*o+(-3*(e-i)-2*s-u)*a+s*r+e}var i=t("../../core/vector");return function(t,n){for(var r=t[Nt],a=[],o=0,s=1;r>s;s++)o+=i[yt](t[s-1],t[s]);var u=o/2;u=r>u?r:u;for(var s=0;u>s;s++){var c,l,h,f=s/(u-1)*(n?r:r-1),d=Math.floor(f),p=f-d,v=t[d%r];n?(c=t[(d-1+r)%r],l=t[(d+1)%r],h=t[(d+2)%r]):(c=t[0===d?d:d-1],l=t[d>r-2?r-1:d+1],h=t[d>r-3?r-1:d+2]);var m=p*p,g=p*m;a.push([e(c[0],v[0],l[0],h[0],p,m,g),e(c[1],v[1],l[1],h[1],p,m,g)])}return a}}),e("zrender/graphic/helper/smoothBezier",[qt,"../../core/vector"],function(t){var e=t("../../core/vector"),i=e.min,n=e.max,r=e.scale,a=e[yt],o=e.add;return function(t,s,u,c){var l,h,f,d,p=[],v=[],m=[],g=[];if(c){f=[1/0,1/0],d=[-(1/0),-(1/0)];for(var y=0,x=t[Nt];x>y;y++)i(f,f,t[y]),n(d,d,t[y]);i(f,f,c[0]),n(d,d,c[1])}for(var y=0,x=t[Nt];x>y;y++){var _=t[y];if(u)l=t[y?y-1:x-1],h=t[(y+1)%x];else{if(0===y||y===x-1){p.push(e.clone(t[y]));continue}l=t[y-1],h=t[y+1]}e.sub(v,h,l),r(v,v,s);var b=a(_,l),w=a(_,h),M=b+w;0!==M&&(b/=M,w/=M),r(m,v,-b),r(g,v,w);var S=o([],_,m),C=o([],_,g);c&&(n(S,S,f),i(S,S,d),n(C,C,f),i(C,C,d)),p.push(S),p.push(C)}return u&&p.push(p.shift()),p}}),e("zrender/graphic/helper/poly",[qt,"./smoothSpline","./smoothBezier"],function(t){var e=t("./smoothSpline"),i=t("./smoothBezier");return{buildPath:function(t,n,r){var a=n.points,o=n.smooth;if(a&&a[Nt]>=2){if(o&&"spline"!==o){var s=i(a,o,r,n.smoothConstraint);t[g](a[0][0],a[0][1]);for(var u=a[Nt],c=0;(r?u:u-1)>c;c++){var l=s[2*c],h=s[2*c+1],f=a[(c+1)%u];t[v](l[0],l[1],h[0],h[1],f[0],f[1])}}else{"spline"===o&&(a=e(a,r)),t[g](a[0][0],a[0][1]);for(var c=1,d=a[Nt];d>c;c++)t[m](a[c][0],a[c][1])}r&&t[p]()}}}}),e("zrender/graphic/shape/Polygon",[qt,"../helper/poly","../Path"],function(t){var e=t("../helper/poly");return t("../Path")[zt]({type:"polygon",shape:{points:null,smooth:!1,smoothConstraint:null},buildPath:function(t,i){e[d](t,i,!0)}})}),e("zrender/graphic/shape/Polyline",[qt,"../helper/poly","../Path"],function(t){var e=t("../helper/poly");return t("../Path")[zt]({type:"polyline",shape:{points:null,smooth:!1,smoothConstraint:null},style:{stroke:"#000",fill:null},buildPath:function(t,i){e[d](t,i,!1)}})}),e("zrender/graphic/shape/Rect",[qt,"../helper/roundRect","../Path"],function(t){var e=t("../helper/roundRect");return t("../Path")[zt]({type:"rect",shape:{r:0,x:0,y:0,width:0,height:0},buildPath:function(t,i){var n=i.x,r=i.y,a=i.width,o=i[mt];i.r?e[d](t,i):t.rect(n,r,a,o),t[p]()}})}),e("zrender/graphic/shape/Line",[qt,"../Path"],function(t){return t("../Path")[zt]({type:"line",shape:{x1:0,y1:0,x2:0,y2:0,percent:1},style:{stroke:"#000",fill:null},buildPath:function(t,e){var i=e.x1,n=e.y1,r=e.x2,a=e.y2,o=e.percent;0!==o&&(t[g](i,n),1>o&&(r=i*(1-o)+r*o,a=n*(1-o)+a*o),t[m](r,a))},pointAt:function(t){var e=this.shape;return[e.x1*(1-t)+e.x2*t,e.y1*(1-t)+e.y2*t]}})}),e("zrender/graphic/shape/BezierCurve",[qt,"../../core/curve","../Path"],function(t){var e=t("../../core/curve"),i=e.quadraticSubdivide,n=e.cubicSubdivide,r=e.quadraticAt,a=e.cubicAt,o=[];return t("../Path")[zt]({type:"bezier-curve",shape:{x1:0,y1:0,x2:0,y2:0,cpx1:0,cpy1:0,percent:1},style:{stroke:"#000",fill:null},buildPath:function(t,e){var r=e.x1,a=e.y1,s=e.x2,u=e.y2,c=e.cpx1,l=e.cpy1,h=e.cpx2,f=e.cpy2,d=e.percent;0!==d&&(t[g](r,a),null==h||null==f?(1>d&&(i(r,c,s,d,o),c=o[1],s=o[2],i(a,l,u,d,o),l=o[1],u=o[2]),t.quadraticCurveTo(c,l,s,u)):(1>d&&(n(r,c,h,s,d,o),c=o[1],h=o[2],s=o[3],n(a,l,f,u,d,o),l=o[1],f=o[2],u=o[3]),t[v](c,l,h,f,s,u)))},pointAt:function(t){var e=this.shape,i=e.cpx2,n=e.cpy2;return null===i||null===n?[r(e.x1,e.cpx1,e.x2,t),r(e.y1,e.cpy1,e.y2,t)]:[a(e.x1,e.cpx1,e.cpx1,e.x2,t),a(e.y1,e.cpy1,e.cpy1,e.y2,t)]}})}),e("zrender/graphic/shape/Arc",[qt,"../Path"],function(t){return t("../Path")[zt]({type:"arc",shape:{cx:0,cy:0,r:0,startAngle:0,endAngle:2*Math.PI,clockwise:!0},style:{stroke:"#000",fill:null},buildPath:function(t,e){var i=e.cx,n=e.cy,r=e.r,a=e.startAngle,o=e.endAngle,s=e.clockwise,u=Math.cos(a),c=Math.sin(a);t[g](u*r+i,c*r+n),t.arc(i,n,r,a,o,!s)}})}),e("zrender/graphic/LinearGradient",[qt,pt,"./Gradient"],function(t){var e=t(pt),i=t("./Gradient"),n=function(t,e,n,r,a){this.x=null==t?0:t,this.y=null==e?0:e,this.x2=null==n?1:n,this.y2=null==r?0:r,i.call(this,a)};return n[Vt]={constructor:n,type:"linear",updateCanvasGradient:function(t,e){for(var i=t[rt](),n=this.x*i.width+i.x,r=this.x2*i.width+i.x,a=this.y*i[mt]+i.y,o=this.y2*i[mt]+i.y,s=e.createLinearGradient(n,a,r,o),u=this.colorStops,c=0;c<u[Nt];c++)s.addColorStop(u[c].offset,u[c].color);this.canvasGradient=s}},e[At](n,i),n}),e("zrender/graphic/RadialGradient",[qt,pt,"./Gradient"],function(t){var e=t(pt),i=t("./Gradient"),n=function(t,e,n,r){this.x=null==t?.5:t,this.y=null==e?.5:e,this.r=null==n?.5:n,i.call(this,r)};return n[Vt]={constructor:n,type:"radial",updateCanvasGradient:function(t,e){for(var i=t[rt](),n=i.width,r=i[mt],a=Math.min(n,r),o=this.x*n+i.x,s=this.y*r+i.y,u=this.r*a,c=e.createRadialGradient(o,s,0,o,s,u),l=this.colorStops,h=0;h<l[Nt];h++)c.addColorStop(l[h].offset,l[h].color);this.canvasGradient=c}},e[At](n,i),n}),e("echarts/util/graphic",[qt,Gt,"zrender/tool/path","zrender/graphic/Path","zrender/tool/color","zrender/core/matrix","zrender/core/vector","zrender/graphic/Gradient","zrender/container/Group","zrender/graphic/Image","zrender/graphic/Text","zrender/graphic/shape/Circle","zrender/graphic/shape/Sector","zrender/graphic/shape/Polygon","zrender/graphic/shape/Polyline","zrender/graphic/shape/Rect","zrender/graphic/shape/Line","zrender/graphic/shape/BezierCurve","zrender/graphic/shape/Arc","zrender/graphic/LinearGradient","zrender/graphic/RadialGradient"],function(t){function e(t){if(!t.__isHover){if(t.__hoverStlDirty){var e=t.style[bt],i=t.style.fill,n=t.__hoverStl;n.fill=n.fill||(i instanceof x?i:m.lift(i,-.1)),n[bt]=n[bt]||(e instanceof x?e:m.lift(e,-.1));var r={};for(var a in n)n.hasOwnProperty(a)&&(r[a]=t.style[a]);t.__normalStl=r,t.__hoverStlDirty=!1}t.setStyle(t.__hoverStl),t.z2+=1,t.__isHover=!0}}function i(t){if(t.__isHover){var e=t.__normalStl;e&&t.setStyle(e),t.z2-=1,t.__isHover=!1}}function n(t){"group"===t.type?t[k](function(t){"group"!==t.type&&e(t)}):e(t)}function r(t){"group"===t.type?t[k](function(t){"group"!==t.type&&i(t)}):i(t)}function a(t,e){t.__hoverStl=t.hoverStyle||e,t.__hoverStlDirty=!0}function o(){!this.__isEmphasis&&n(this)}function s(){!this.__isEmphasis&&r(this)}function u(){this.__isEmphasis=!0,n(this)}function c(){this.__isEmphasis=!1,r(this)}function l(t,e,i,n,r){var a=t?"Update":"",o=n&&n[Mt]("animationDuration"+a),s=n&&n[Mt]("animationEasing"+a);
n&&n[Mt](D)?e.animateTo(i,o,s,r):(e.attr(i),r&&r())}var h=t(Gt),d=t("zrender/tool/path"),p=Math.round,v=t("zrender/graphic/Path"),m=t("zrender/tool/color"),g=t("zrender/core/matrix"),y=t("zrender/core/vector"),x=t("zrender/graphic/Gradient"),_={};return _.Group=t("zrender/container/Group"),_.Image=t("zrender/graphic/Image"),_.Text=t("zrender/graphic/Text"),_.Circle=t("zrender/graphic/shape/Circle"),_.Sector=t("zrender/graphic/shape/Sector"),_.Polygon=t("zrender/graphic/shape/Polygon"),_.Polyline=t("zrender/graphic/shape/Polyline"),_.Rect=t("zrender/graphic/shape/Rect"),_.Line=t("zrender/graphic/shape/Line"),_.BezierCurve=t("zrender/graphic/shape/BezierCurve"),_.Arc=t("zrender/graphic/shape/Arc"),_.LinearGradient=t("zrender/graphic/LinearGradient"),_.RadialGradient=t("zrender/graphic/RadialGradient"),_.extendShape=function(t){return v[zt](t)},_.extendPath=function(t,e){return d.extendFromString(t,e)},_.makePath=function(t,e,i,n){var r=d.createFromString(t,e),a=r[rt]();if(i){var o=a.width/a[mt];if(n===ht){var s,u=i[mt]*o;u<=i.width?s=i[mt]:(u=i.width,s=u/o);var c=i.x+i.width/2,l=i.y+i[mt]/2;i.x=c-u/2,i.y=l-s/2,i.width=u,i[mt]=s}this.resizePath(r,i)}return r},_.mergePath=d.mergePath,_.resizePath=function(t,e){if(t[gt]){var i=t[rt](),n=i.calculateTransform(e);t[gt](n)}},_.subPixelOptimizeLine=function(t){var e=_.subPixelOptimize,i=t.shape,n=t.style[wt];return p(2*i.x1)===p(2*i.x2)&&(i.x1=i.x2=e(i.x1,n,!0)),p(2*i.y1)===p(2*i.y2)&&(i.y1=i.y2=e(i.y1,n,!0)),t},_.subPixelOptimizeRect=function(t){var e=_.subPixelOptimize,i=t.shape,n=t.style[wt],r=i.x,a=i.y,o=i.width,s=i[mt];return i.x=e(i.x,n,!0),i.y=e(i.y,n,!0),i.width=Math.max(e(r+o,n,!1)-i.x,0===o?0:1),i[mt]=Math.max(e(a+s,n,!1)-i.y,0===s?0:1),t},_.subPixelOptimize=function(t,e,i){var n=p(2*t);return(n+p(e))%2===0?n/2:(n+(i?1:-1))/2},_.setHoverStyle=function(t,e){e=e||{},"group"===t.type?t[k](function(t){"group"!==t.type&&a(t,e)}):a(t,e),t.on("mouseover",o).on("mouseout",s),t.on(W,u).on(H,c)},_.setText=function(t,e,i){var n=e[Mt](Q)||lt,r=n[Bt](lt)>=0?"white":i,a=e[ot](at);h[zt](t,{textDistance:e[Mt](yt)||5,textFont:a[nt](),textPosition:n,textFill:a.getTextColor()||r})},_[f]=h.curry(l,!0),_.initProps=h.curry(l,!1),_.getTransform=function(t,e){for(var i=g.identity([]);t&&t!==e;)g.mul(i,t[I](),i),t=t[O];return i},_[gt]=function(t,e,i){return i&&(e=g.invert([],e)),y[gt]([],t,e)},_.transformDirection=function(t,e,i){var n=0===e[4]||0===e[5]||0===e[0]?1:Math.abs(2*e[4]/e[0]),r=0===e[4]||0===e[5]||0===e[2]?1:Math.abs(2*e[4]/e[2]),a=["left"===t?-n:"right"===t?n:0,"top"===t?-r:t===dt?r:0];return a=_[gt](a,e,i),Math.abs(a[0])>Math.abs(a[1])?a[0]>0?"right":"left":a[1]>0?dt:"top"},_}),e("zrender/core/env",[],function(){function t(t){var e=this.os={},i=this.browser={},n=t.match(/Web[kK]it[\/]{0,1}([\d.]+)/),r=t.match(/(Android);?[\s\/]+([\d.]+)?/),a=t.match(/(iPad).*OS\s([\d_]+)/),o=t.match(/(iPod)(.*OS\s([\d_]+))?/),s=!a&&t.match(/(iPhone\sOS)\s([\d_]+)/),u=t.match(/(webOS|hpwOS)[\s\/]([\d.]+)/),c=u&&t.match(/TouchPad/),l=t.match(/Kindle\/([\d.]+)/),h=t.match(/Silk\/([\d._]+)/),f=t.match(/(BlackBerry).*Version\/([\d.]+)/),d=t.match(/(BB10).*Version\/([\d.]+)/),p=t.match(/(RIM\sTablet\sOS)\s([\d.]+)/),v=t.match(/PlayBook/),m=t.match(/Chrome\/([\d.]+)/)||t.match(/CriOS\/([\d.]+)/),g=t.match(/Firefox\/([\d.]+)/),y=t.match(/MSIE ([\d.]+)/),x=n&&t.match(/Mobile\//)&&!m,_=t.match(/(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/)&&!m,y=t.match(/MSIE\s([\d.]+)/);return(i.webkit=!!n)&&(i.version=n[1]),r&&(e.android=!0,e.version=r[2]),s&&!o&&(e.ios=e.iphone=!0,e.version=s[2][tt](/_/g,".")),a&&(e.ios=e.ipad=!0,e.version=a[2][tt](/_/g,".")),o&&(e.ios=e.ipod=!0,e.version=o[3]?o[3][tt](/_/g,"."):null),u&&(e.webos=!0,e.version=u[2]),c&&(e.touchpad=!0),f&&(e.blackberry=!0,e.version=f[2]),d&&(e.bb10=!0,e.version=d[2]),p&&(e.rimtabletos=!0,e.version=p[2]),v&&(i.playbook=!0),l&&(e.kindle=!0,e.version=l[1]),h&&(i.silk=!0,i.version=h[1]),!h&&e.android&&t.match(/Kindle Fire/)&&(i.silk=!0),m&&(i.chrome=!0,i.version=m[1]),g&&(i.firefox=!0,i.version=g[1]),y&&(i.ie=!0,i.version=y[1]),x&&(t.match(/Safari/)||e.ios)&&(i.safari=!0),_&&(i.webview=!0),y&&(i.ie=!0,i.version=y[1]),e.tablet=!!(a||v||r&&!t.match(/Mobile/)||g&&t.match(/Tablet/)||y&&!t.match(/Phone/)&&t.match(/Touch/)),e.phone=!(e.tablet||e.ipod||!(r||s||u||f||d||m&&t.match(/Android/)||m&&t.match(/CriOS\/([\d.]+)/)||g&&t.match(/Mobile/)||y&&t.match(/Touch/))),{browser:i,os:e,node:!1,canvasSupported:document.createElement(Et)[Rt]?!0:!1}}return typeof navigator===xt?{browser:{},os:{},node:!0,canvasSupported:!0}:t(navigator.userAgent)}),e("zrender/core/event",[qt,"../mixin/Eventful"],function(t){function e(t){return t.getBoundingClientRect?t.getBoundingClientRect():{left:0,top:0}}function i(t,i){if(i=i||window.event,null!=i.zrX)return i;var n=i.type,r=n&&n[Bt]("touch")>=0;if(r){var a="touchend"!=n?i.targetTouches[0]:i.changedTouches[0];if(a){var o=e(t);i.zrX=a.clientX-o.left,i.zrY=a.clientY-o.top}}else{var s=0,u=0;i.pageX||i.pageY?(s=i.pageX,u=i.pageY):(s=i.clientX+document.body.scrollLeft+document.documentElement.scrollLeft,u=i.clientY+document.body.scrollTop+document.documentElement.scrollTop);var c=e(t),l=c.top+(window.pageYOffset||t.scrollTop)-(t.clientTop||0),h=c.left+(window.pageXOffset||t.scrollLeft)-(t.clientLeft||0);i.zrX=s-h,i.zrY=u-l,i.zrDelta=i.wheelDelta?i.wheelDelta/120:-(i.detail||0)/3}return i}function n(t,e,i){o?t.addEventListener(e,i):t.attachEvent("on"+e,i)}function r(t,e,i){o?t.removeEventListener(e,i):t.detachEvent("on"+e,i)}var a=t("../mixin/Eventful"),o=typeof window!==xt&&!!window.addEventListener,s=o?function(t){t.preventDefault(),t.stopPropagation(),t.cancelBubble=!0}:function(t){t.returnValue=!1,t.cancelBubble=!0};return{normalizeEvent:i,addEventListener:n,removeEventListener:r,stop:s,Dispatcher:a}}),e("zrender/mixin/Draggable",[qt],function(t){function e(){this.on("mousedown",this._dragStart,this),this.on("mousemove",this._drag,this),this.on("mouseup",this._dragEnd,this),this.on("globalout",this._dragEnd,this)}return e[Vt]={constructor:e,_dragStart:function(t){var e=t.target;e&&e.draggable&&(this._draggingTarget=e,e.dragging=!0,this._x=t.offsetX,this._y=t.offsetY,this._dispatchProxy(e,"dragstart",t.event))},_drag:function(t){var e=this._draggingTarget;if(e){var i=t.offsetX,n=t.offsetY,r=i-this._x,a=n-this._y;this._x=i,this._y=n,e.drift(r,a,t),this._dispatchProxy(e,"drag",t.event);var o=this._findHover(i,n,e),s=this._dropTarget;this._dropTarget=o,e!==o&&(s&&o!==s&&this._dispatchProxy(s,"dragleave",t.event),o&&o!==s&&this._dispatchProxy(o,"dragenter",t.event))}},_dragEnd:function(t){var e=this._draggingTarget;e&&(e.dragging=!1),this._dispatchProxy(e,"dragend",t.event),this._dropTarget&&this._dispatchProxy(this._dropTarget,"drop",t.event),this._draggingTarget=null,this._dropTarget=null}},e}),e("zrender/core/GestureMgr",[qt],function(t){function e(t){var e=t[1][0]-t[0][0],i=t[1][1]-t[0][1];return Math.sqrt(e*e+i*i)}function i(t){return[(t[0][0]+t[1][0])/2,(t[0][1]+t[1][1])/2]}var n=function(){this._track=[]};n[Vt]={constructor:n,recognize:function(t,e){return this._doTrack(t,e),this._recognize(t)},clear:function(){return this._track[Nt]=0,this},_doTrack:function(t,e){var i=t.touches;if(i){for(var n={points:[],touches:[],target:e,event:t},r=0,a=i[Nt];a>r;r++){var o=i[r];n.points.push([o.clientX,o.clientY]),n.touches.push(o)}this._track.push(n)}},_recognize:function(t){for(var e in r)if(r.hasOwnProperty(e)){var i=r[e](this._track,t);if(i)return i}}};var r={pinch:function(t,n){var r=t[Nt];if(r){var a=(t[r-1]||{}).points,o=(t[r-2]||{}).points||a;if(o&&o[Nt]>1&&a&&a[Nt]>1){var s=e(a)/e(o);!isFinite(s)&&(s=1),n.pinchScale=s;var u=i(a);return n.pinchX=u[0],n.pinchY=u[1],{type:"pinch",target:t[0].target,event:n}}}}};return n}),e("zrender/Handler",[qt,"./core/env","./core/event","./core/util","./mixin/Draggable","./core/GestureMgr","./mixin/Eventful"],function(t){function e(t){return"_"+t+"Handler"}function i(t,e,i){return{type:t,event:i,target:e,cancelBubble:!1,offsetX:i.zrX,offsetY:i.zrY,gestureEvent:i.gestureEvent,pinchX:i.pinchX,pinchY:i.pinchY,pinchScale:i.pinchScale,wheelDelta:i.zrDelta}}function n(t,e,i){var n=t._gestureMgr;"start"===i&&n.clear();var r=n.recognize(e,t._findHover(e.zrX,e.zrY,null));if("end"===i&&n.clear(),r){var a=r.type;e.gestureEvent=a,t._dispatchProxy(r.target,a,r.event)}}function r(t){for(var i=f[Dt](d),n=i[Nt];n--;){var r=i[n];t[e(r)]=u.bind(y[r],t)}}function a(t,e,i){if(t[t.rectHover?"rectContain":x](e,i)){for(var n=t[O];n;){if(n.clipPath&&!n.clipPath[x](e,i))return!1;n=n[O]}return!0}return!1}var o=t("./core/env"),s=t("./core/event"),u=t("./core/util"),c=t("./mixin/Draggable"),l=t("./core/GestureMgr"),h=t("./mixin/Eventful"),f=["click","dblclick","mousewheel","mousemove","mouseout","mouseup","mousedown"],d=["touchstart","touchend","touchmove"],p=300,v=s.addEventListener,m=s.removeEventListener,g=s.normalizeEvent,y={mousemove:function(t){t=g(this.root,t);var e=t.zrX,i=t.zrY,n=this._findHover(e,i,null),r=this._hovered;this._hovered=n,this.root.style.cursor=n?n.cursor:this._defaultCursorStyle,r&&n!==r&&r.__zr&&this._dispatchProxy(r,"mouseout",t),this._dispatchProxy(n,"mousemove",t),n&&n!==r&&this._dispatchProxy(n,"mouseover",t)},mouseout:function(t){t=g(this.root,t);var e=t.toElement||t.relatedTarget;if(e!=this.root)for(;e&&9!=e.nodeType;){if(e===this.root)return;e=e.parentNode}this._dispatchProxy(this._hovered,"mouseout",t),this[C]("globalout",{event:t})},touchstart:function(t){t=g(this.root,t),this._lastTouchMoment=new Date,n(this,t,"start"),this._mousemoveHandler(t),this._mousedownHandler(t)},touchmove:function(t){t=g(this.root,t),n(this,t,"change"),this._mousemoveHandler(t)},touchend:function(t){t=g(this.root,t),n(this,t,"end"),this._mouseupHandler(t),+new Date-this._lastTouchMoment<p&&this._clickHandler(t)}};u.each(["click","mousedown","mouseup","mousewheel","dblclick"],function(t){y[t]=function(e){e=g(this.root,e);var i=this._findHover(e.zrX,e.zrY,null);this._dispatchProxy(i,t,e)}});var _=function(t,i,n){h.call(this),this.root=t,this.storage=i,this.painter=n,this._hovered,this._lastTouchMoment,this._lastX,this._lastY,this._defaultCursorStyle="default",this._gestureMgr=new l,r(this),o.os.tablet||o.os.phone?(u.each(d,function(i){v(t,i,this[e(i)])},this),v(t,"mouseout",this._mouseoutHandler)):(u.each(f,function(i){v(t,i,this[e(i)])},this),v(t,"DOMMouseScroll",this._mousewheelHandler)),c.call(this)};return _[Vt]={constructor:_,resize:function(t){this._hovered=null},dispatch:function(t,i){var n=this[e(t)];n&&n(i)},dispose:function(){for(var t=this.root,i=f[Dt](d),n=0;n<i[Nt];n++){var r=i[n];m(t,r,this[e(r)])}m(t,"DOMMouseScroll",this._mousewheelHandler),this.root=this.storage=this.painter=null},setDefaultCursorStyle:function(t){this._defaultCursorStyle=t},_dispatchProxy:function(t,e,n){for(var r="on"+e,a=i(e,t,n),o=t;o&&(o[r]&&(a.cancelBubble=o[r].call(o,a)),o[C](e,a),o=o[O],!a.cancelBubble););a.cancelBubble||(this[C](e,a),this.painter&&this.painter.eachOtherLayer(function(t){typeof t[r]==Pt&&t[r].call(t,a),t[C]&&t[C](e,a)}))},_findHover:function(t,e,i){for(var n=this.storage.getDisplayList(),r=n[Nt]-1;r>=0;r--)if(!n[r].silent&&n[r]!==i&&a(n[r],t,e))return n[r]}},u.mixin(_,h),u.mixin(_,c),_}),e("zrender/Storage",[qt,"./core/util","./container/Group"],function(t){function e(t,e){return t[h]===e[h]?t.z===e.z?t.z2===e.z2?t.__renderidx-e.__renderidx:t.z2-e.z2:t.z-e.z:t[h]-e[h]}var i=t("./core/util"),n=t("./container/Group"),r=function(){this._elements={},this._roots=[],this._displayList=[],this._displayListLen=0};return r[Vt]={constructor:r,getDisplayList:function(t){return t&&this.updateDisplayList(),this._displayList},updateDisplayList:function(){this._displayListLen=0;for(var t=this._roots,i=this._displayList,n=0,r=t[Nt];r>n;n++){var a=t[n];this._updateAndAddDisplayable(a)}i[Nt]=this._displayListLen;for(var n=0,r=i[Nt];r>n;n++)i[n].__renderidx=n;i.sort(e)},_updateAndAddDisplayable:function(t,e){if(!t[T]){t.beforeUpdate(),t[l](),t.afterUpdate();var i=t.clipPath;if(i&&(i[O]=t,i.updateTransform(),e?(e=e.slice(),e.push(i)):e=[i]),"group"==t.type){for(var n=t._children,r=0;r<n[Nt];r++){var a=n[r];a[z]=t[z]||a[z],this._updateAndAddDisplayable(a,e)}t[z]=!1}else t.__clipPaths=e,this._displayList[this._displayListLen++]=t}},addRoot:function(t){this._elements[t.id]||(t instanceof n&&t.addChildrenToStorage(this),this.addToMap(t),this._roots.push(t))},delRoot:function(t){if(null==t){for(var e=0;e<this._roots[Nt];e++){var r=this._roots[e];r instanceof n&&r.delChildrenFromStorage(this)}return this._elements={},this._roots=[],this._displayList=[],void(this._displayListLen=0)}if(t instanceof Array)for(var e=0,a=t[Nt];a>e;e++)this.delRoot(t[e]);else{var o;o=typeof t==Ot?this._elements[t]:t;var s=i[Bt](this._roots,o);s>=0&&(this.delFromMap(o.id),this._roots[U](s,1),o instanceof n&&o.delChildrenFromStorage(this))}},addToMap:function(t){return t instanceof n&&(t.__storage=this),t.dirty(),this._elements[t.id]=t,this},get:function(t){return this._elements[t]},delFromMap:function(t){var e=this._elements,i=e[t];return i&&(delete e[t],i instanceof n&&(i.__storage=null)),this},dispose:function(){this._elements=this._renderList=this._roots=null}},r}),e("zrender/animation/Animation",[qt,pt,"../core/event","./Animator"],function(t){var e=t(pt),i=t("../core/event").Dispatcher,n=typeof window!==xt&&(window.requestAnimationFrame||window.msRequestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame)||function(t){setTimeout(t,16)},r=t("./Animator"),a=function(t){t=t||{},this.stage=t.stage||{},this.onframe=t.onframe||function(){},this._clips=[],this._running=!1,this._time=0,i.call(this)};return a[Vt]={constructor:a,addClip:function(t){this._clips.push(t)},addAnimator:function(t){t[D]=this;for(var e=t.getClips(),i=0;i<e[Nt];i++)this.addClip(e[i])},removeClip:function(t){var i=e[Bt](this._clips,t);i>=0&&this._clips[U](i,1)},removeAnimator:function(t){for(var e=t.getClips(),i=0;i<e[Nt];i++)this.removeClip(e[i]);t[D]=null},_update:function(){for(var t=(new Date).getTime(),e=t-this._time,i=this._clips,n=i[Nt],r=[],a=[],o=0;n>o;o++){var s=i[o],u=s.step(t);u&&(r.push(u),a.push(s))}for(var o=0;n>o;)i[o]._needsRemove?(i[o]=i[n-1],i.pop(),n--):o++;n=r[Nt];for(var o=0;n>o;o++)a[o].fire(r[o]);this._time=t,this.onframe(e),this[C]("frame",e),this.stage[l]&&this.stage[l]()},start:function(){function t(){e._running&&(n(t),e._update())}var e=this;this._running=!0,this._time=(new Date).getTime(),n(t)},stop:function(){this._running=!1},clear:function(){this._clips=[]},animate:function(t,e){e=e||{};var i=new r(t,e.loop,e.getter,e.setter);return i}},e.mixin(a,i),a}),e("zrender/Layer",[qt,"./core/util","./config"],function(t){function e(){return!1}function i(t,e,i,n){var r=document.createElement(e),a=i[X](),o=i[j](),s=r.style;return s[Q]="absolute",s.left=0,s.top=0,s.width=a+"px",s[mt]=o+"px",r.width=a*n,r[mt]=o*n,r.setAttribute("data-zr-dom-id",t),r}var n=t("./core/util"),r=t("./config"),a=function(t,a,o){var s;o=o||r.devicePixelRatio,typeof t===Ot?s=i(t,Et,a,o):n[$](t)&&(s=t,t=s.id),this.id=t,this.dom=s;var u=s.style;u&&(s.onselectstart=e,u["-webkit-user-select"]="none",u["user-select"]="none",u["-webkit-touch-callout"]="none",u["-webkit-tap-highlight-color"]="rgba(0,0,0,0)"),this.domBack=null,this.ctxBack=null,this.painter=a,this.config=null,this.clearColor=0,this.motionBlur=!1,this.lastFrameAlpha=.7,this.dpr=o};return a[Vt]={constructor:a,elCount:0,__dirty:!0,initContext:function(){this.ctx=this.dom[Rt]("2d");var t=this.dpr;1!=t&&this.ctx.scale(t,t)},createBackBuffer:function(){var t=this.dpr;this.domBack=i("back-"+this.id,Et,this.painter,t),this.ctxBack=this.domBack[Rt]("2d"),1!=t&&this.ctxBack.scale(t,t)},resize:function(t,e){var i=this.dpr,n=this.dom,r=n.style,a=this.domBack;r.width=t+"px",r[mt]=e+"px",n.width=t*i,n[mt]=e*i,1!=i&&this.ctx.scale(i,i),a&&(a.width=t*i,a[mt]=e*i,1!=i&&this.ctxBack.scale(i,i))},clear:function(t){var e=this.dom,i=this.ctx,n=e.width,r=e[mt],a=this.clearColor,o=this.motionBlur&&!t,s=this.lastFrameAlpha,u=this.dpr;if(o&&(this.domBack||this.createBackBuffer(),this.ctxBack.globalCompositeOperation="copy",this.ctxBack.drawImage(e,0,0,n/u,r/u)),i.clearRect(0,0,n/u,r/u),a&&(i.save(),i.fillStyle=this.clearColor,i.fillRect(0,0,n/u,r/u),i.restore()),o){var c=this.domBack;i.save(),i.globalAlpha=s,i.drawImage(c,0,0,n/u,r/u),i.restore()}}},a}),e("zrender/Painter",[qt,"./config","./core/util","./core/log","./core/BoundingRect","./Layer","./graphic/Image"],function(t){function e(t){return parseInt(t,10)}function i(t){return t?t.isBuildin?!0:typeof t.resize!==Pt||typeof t[L]!==Pt?!1:!0:!1}function n(t){t.__unusedCount++}function r(t){t[z]=!1,1==t.__unusedCount&&t.clear()}function a(t,e,i){return v.copy(t[rt]()),t[B]&&v[gt](t[B]),m.width=e,m[mt]=i,!v.intersect(m)}function o(t,e){if(!t||!e||t[Nt]!==e[Nt])return!0;for(var i=0;i<t[Nt];i++)if(t[i]!==e[i])return!0}function s(t,e){for(var i=0;i<t[Nt];i++){var n,r=t[i];r[B]&&(n=r[B],e[B](n[0],n[1],n[2],n[3],n[4],n[5]));var a=r.path;a[y](e),r[d](a,r.shape),e.clip(),r[B]&&(n=r.invTransform,e[B](n[0],n[1],n[2],n[3],n[4],n[5]))}}var u=t("./config"),c=t("./core/util"),l=t("./core/log"),f=t("./core/BoundingRect"),p=t("./Layer"),v=new f(0,0,0,0),m=new f(0,0,0,0),g=function(t,e,i){var n=!t.nodeName||"CANVAS"===t.nodeName.toUpperCase();i=i||{},this.dpr=i.devicePixelRatio||u.devicePixelRatio,this._singleCanvas=n,this.root=t;var r=t.style;if(r&&(r["-webkit-tap-highlight-color"]="transparent",r["-webkit-user-select"]="none",r["user-select"]="none",r["-webkit-touch-callout"]="none",t.innerHTML=""),this.storage=e,n){var a=t.width,o=t[mt];this._width=a,this._height=o;var s=new p(t,this,1);s.initContext(),this._layers={0:s},this._zlevelList=[0]}else{var a=this._getWidth(),o=this._getHeight();this._width=a,this._height=o;var c=document.createElement("div");this._domRoot=c;var l=c.style;l[Q]="relative",l.overflow="hidden",l.width=this._width+"px",l[mt]=this._height+"px",t.appendChild(c),this._layers={},this._zlevelList=[]}this._layerConfig={},this.pathToImage=this._createPathToImage()};return g[Vt]={constructor:g,isSingleCanvas:function(){return this._singleCanvas},getViewportRoot:function(){return this._singleCanvas?this._layers[0].dom:this._domRoot},refresh:function(t){var e=this.storage.getDisplayList(!0),i=this._zlevelList;this._paintList(e,t);for(var n=0;n<i[Nt];n++){var r=i[n],a=this._layers[r];!a.isBuildin&&a[L]&&a[L]()}return this},_paintList:function(t,e){null==e&&(e=!1),this._updateLayerStatus(t);var i,u,c,f=this._width,d=this._height;this.eachBuildinLayer(n);for(var p=null,v=0,m=t[Nt];m>v;v++){var g=t[v],y=this._singleCanvas?0:g[h];if(u!==y&&(u=y,i=this.getLayer(u),i.isBuildin||l("ZLevel "+u+" has been used by unkown layer "+i.id),c=i.ctx,i.__unusedCount=0,(i[z]||e)&&i.clear()),(i[z]||e)&&!g.invisible&&0!==g.style[_t]&&g.scale[0]&&g.scale[1]&&(!g.culling||!a(g,f,d))){var x=g.__clipPaths;o(x,p)&&(p&&c.restore(),x&&(c.save(),s(x,c)),p=x),g.beforeBrush&&g.beforeBrush(c),g.brush(c,!1),g.afterBrush&&g.afterBrush(c)}g[z]=!1}p&&c.restore(),this.eachBuildinLayer(r)},getLayer:function(t){if(this._singleCanvas)return this._layers[0];var e=this._layers[t];return e||(e=new p("zr_"+t,this,this.dpr),e.isBuildin=!0,this._layerConfig[t]&&c.merge(e,this._layerConfig[t],!0),this.insertLayer(t,e),e.initContext()),e},insertLayer:function(t,e){var n=this._layers,r=this._zlevelList,a=r[Nt],o=null,s=-1,u=this._domRoot;if(n[t])return void l("ZLevel "+t+" has been used already");if(!i(e))return void l("Layer of zlevel "+t+" is not valid");if(a>0&&t>r[0]){for(s=0;a-1>s&&!(r[s]<t&&r[s+1]>t);s++);o=n[r[s]]}if(r[U](s+1,0,t),o){var c=o.dom;c.nextSibling?u.insertBefore(e.dom,c.nextSibling):u.appendChild(e.dom)}else u.firstChild?u.insertBefore(e.dom,u.firstChild):u.appendChild(e.dom);n[t]=e},eachLayer:function(t,e){var i,n,r=this._zlevelList;for(n=0;n<r[Nt];n++)i=r[n],t.call(e,this._layers[i],i)},eachBuildinLayer:function(t,e){var i,n,r,a=this._zlevelList;for(r=0;r<a[Nt];r++)n=a[r],i=this._layers[n],i.isBuildin&&t.call(e,i,n)},eachOtherLayer:function(t,e){var i,n,r,a=this._zlevelList;for(r=0;r<a[Nt];r++)n=a[r],i=this._layers[n],i.isBuildin||t.call(e,i,n)},getLayers:function(){return this._layers},_updateLayerStatus:function(t){var e=this._layers,i={};this.eachBuildinLayer(function(t,e){i[e]=t.elCount,t.elCount=0});for(var n=0,r=t[Nt];r>n;n++){var a=t[n],o=this._singleCanvas?0:a[h],s=e[o];if(s){if(s.elCount++,s[z])continue;s[z]=a[z]}}this.eachBuildinLayer(function(t,e){i[e]!==t.elCount&&(t[z]=!0)})},clear:function(){return this.eachBuildinLayer(this._clearLayer),this},_clearLayer:function(t){t.clear()},configLayer:function(t,e){if(e){var i=this._layerConfig;i[t]?c.merge(i[t],e,!0):i[t]=e;var n=this._layers[t];n&&c.merge(n,i[t],!0)}},delLayer:function(t){var e=this._layers,i=this._zlevelList,n=e[t];n&&(n.dom.parentNode.removeChild(n.dom),delete e[t],i[U](c[Bt](i,t),1))},resize:function(t,e){var i=this._domRoot;if(i.style.display="none",t=t||this._getWidth(),e=e||this._getHeight(),i.style.display="",this._width!=t||e!=this._height){i.style.width=t+"px",i.style[mt]=e+"px";for(var n in this._layers)this._layers[n].resize(t,e);this[L](!0)}return this._width=t,this._height=e,this},clearLayer:function(t){var e=this._layers[t];e&&e.clear()},dispose:function(){this.root.innerHTML="",this.root=this.storage=this._domRoot=this._layers=null},getRenderedCanvas:function(t){if(t=t||{},this._singleCanvas)return this._layers[0].dom;var e=new p("image",this,t.pixelRatio||this.dpr);e.initContext();var i=e.ctx;e.clearColor=t.backgroundColor,e.clear();for(var n=this.storage.getDisplayList(!0),r=0;r<n[Nt];r++){var a=n[r];a.invisible||(a.beforeBrush&&a.beforeBrush(i),a.brush(i,!1),a.afterBrush&&a.afterBrush(i))}return e.dom},getWidth:function(){return this._width},getHeight:function(){return this._height},_getWidth:function(){var t=this.root,i=document.defaultView.getComputedStyle(t);return(t.clientWidth||e(i.width)||e(t.style.width))-(e(i.paddingLeft)||0)-(e(i.paddingRight)||0)|0},_getHeight:function(){var t=this.root,i=document.defaultView.getComputedStyle(t);return(t.clientHeight||e(i[mt])||e(t.style[mt]))-(e(i.paddingTop)||0)-(e(i.paddingBottom)||0)|0},_pathToImage:function(e,i,n,r,a){var o=document.createElement(Et),s=o[Rt]("2d");o.width=n*a,o[mt]=r*a,s.clearRect(0,0,n*a,r*a);var u={position:i[Q],rotation:i[R],scale:i.scale};i[Q]=[0,0,0],i[R]=0,i.scale=[1,1],i&&i.brush(s);var c=t("./graphic/Image"),l=new c({id:e,style:{x:0,y:0,image:o}});return null!=u[Q]&&(l[Q]=i[Q]=u[Q]),null!=u[R]&&(l[R]=i[R]=u[R]),null!=u.scale&&(l.scale=i.scale=u.scale),l},_createPathToImage:function(){var t=this;return function(e,i,n,r){return t._pathToImage(e,i,n,r,t.dpr)}}},g}),e("zrender/zrender",[qt,"./core/guid","./core/env","./Handler","./Storage","./animation/Animation","./Painter"],function(t){function e(t){delete c[t]}var i=t("./core/guid"),n=t("./core/env"),r=t("./Handler"),a=t("./Storage"),o=t("./animation/Animation"),s=!n.canvasSupported,u={canvas:t("./Painter")},c={},l={};l.version="3.0.0",l.init=function(t,e){var n=new h(i(),t,e);return c[n.id]=n,n},l.dispose=function(t){if(t)t.dispose();else{for(var e in c)c[e].dispose();c={}}return l},l.getInstance=function(t){return c[t]},l.registerPainter=function(t,e){u[t]=e};var h=function(t,e,i){i=i||{},this.dom=e,this.id=t;var c=this,l=new a,h=i.renderer;if(s){if(!u.vml)throw new Error("You need to require 'zrender/vml/vml' to support IE8");h="vml"}else h&&u[h]||(h=Et);var f=new u[h](e,l,i);this.storage=l,this.painter=f,n.node||(this.handler=new r(f.getViewportRoot(),l,f)),this[D]=new o({stage:{update:function(){c._needsRefresh&&c.refreshImmediately()}}}),this[D].start(),this._needsRefresh;var d=l.delFromMap,p=l.addToMap;l.delFromMap=function(t){var e=l.get(t);d.call(l,t),e&&e.removeSelfFromZr(c)},l.addToMap=function(t){p.call(l,t),t.addSelfToZr(c)}};return h[Vt]={constructor:h,getId:function(){return this.id},add:function(t){this.storage.addRoot(t),this._needsRefresh=!0},remove:function(t){this.storage.delRoot(t),this._needsRefresh=!0},configLayer:function(t,e){this.painter.configLayer(t,e),this._needsRefresh=!0},refreshImmediately:function(){this._needsRefresh=!1,this.painter[L](),this._needsRefresh=!1},refresh:function(){this._needsRefresh=!0},resize:function(){this.painter.resize(),this.handler&&this.handler.resize()},clearAnimation:function(){this[D].clear()},getWidth:function(){return this.painter[X]()},getHeight:function(){return this.painter[j]()},toDataURL:function(t,e,i){return this.painter.toDataURL(t,e,i)},pathToImage:function(t,e,n){var r=i();return this.painter.pathToImage(r,t,e,n)},setDefaultCursorStyle:function(t){this.handler.setDefaultCursorStyle(t)},on:function(t,e,i){this.handler&&this.handler.on(t,e,i)},off:function(t,e){this.handler&&this.handler.off(t,e)},trigger:function(t,e){this.handler&&this.handler[C](t,e)},clear:function(){this.storage.delRoot(),this.painter.clear()},dispose:function(){this[D].stop(),this.clear(),this.storage.dispose(),this.painter.dispose(),this.handler&&this.handler.dispose(),this[D]=this.storage=this.painter=this.handler=null,e(this.id)}},l}),e("zrender",["zrender/zrender"],function(t){return t}),e("echarts/loading/default",[qt,"../util/graphic",Gt],function(t){var e=t("../util/graphic"),i=t(Gt),n=Math.PI;return function(t,r){r=r||{},i[ct](r,{text:"loading",color:"#c23531",textColor:"#000",maskColor:"rgba(255, 255, 255, 0.8)",zlevel:0});var a=new e.Rect({style:{fill:r.maskColor},zlevel:r[h],z:1e4}),o=new e.Arc({shape:{startAngle:-n/2,endAngle:-n/2+.1,r:10},style:{stroke:r.color,lineCap:"round",lineWidth:5},zlevel:r[h],z:10001}),s=new e.Rect({style:{fill:"none",text:r.text,textPosition:"right",textDistance:10,textFill:r.textColor},zlevel:r[h],z:10001});o.animateShape(!0).when(1e3,{endAngle:3*n/2}).start("circularInOut"),o.animateShape(!0).when(1e3,{startAngle:3*n/2}).delay(300).start("circularInOut");var u=new e.Group;return u.add(o),u.add(s),u.add(a),u.resize=function(){var e=t[X]()/2,i=t[j]()/2;o.setShape({cx:e,cy:i});var n=o.shape.r;s.setShape({x:e-n,y:i-n,width:2*n,height:2*n}),a.setShape({x:0,y:0,width:t[X](),height:t[j]()})},u.resize(),u}}),e("echarts/visual/seriesColor",[qt,"zrender/graphic/Gradient"],function(t){var e=t("zrender/graphic/Gradient");return function(t,i,n){function r(t){var r=[i,H,"color"],a=n.get("color"),o=t[V](),s=t.get(r)||a[t[q]%a[Nt]];o[c]("color",s),n.isSeriesFiltered(t)||(typeof s!==Pt||s instanceof e||o.each(function(e){o[u](e,"color",s(t[E](e)))}),o.each(function(t){var e=o[N](t),i=e.get(r,!0);null!=i&&o[u](t,"color",i)}))}t?n.eachSeriesByType(t,r):n.eachSeries(r)}}),e("echarts/preprocessor/helper/compatStyle",[qt,Gt],function(t){function e(t){var e=t&&t[s];e&&i.each(n,function(n){var r=e[H],a=e[W];r&&r[n]&&(t[n]=t[n]||{},t[n][H]?i.merge(t[n][H],r[n]):t[n][H]=r[n],r[n]=null),a&&a[n]&&(t[n]=t[n]||{},t[n][W]?i.merge(t[n][W],a[n]):t[n][W]=a[n],a[n]=null)})}var i=t(Gt),n=["areaStyle","lineStyle","nodeStyle","linkStyle","chordStyle","label","labelLine"];return function(t){e(t);var n=t.data;if(n){for(var r=0;r<n[Nt];r++)e(n[r]);var a=t.markPoint;if(a&&a.data)for(var o=a.data,r=0;r<o[Nt];r++)e(o[r]);var s=t.markLine;if(s&&s.data)for(var u=s.data,r=0;r<u[Nt];r++)i[St](u[r])?(e(u[r][0]),e(u[r][1])):e(u[r])}}}),e("echarts/preprocessor/backwardCompat",[qt,Gt,"./helper/compatStyle"],function(t){function e(t,e){e=e.split(",");for(var i=t,n=0;n<e[Nt]&&(i=i&&i[e[n]],null!=i);n++);return i}function i(t,e,i,n){e=e.split(",");for(var r,a=t,o=0;o<e[Nt]-1;o++)r=e[o],null==a[r]&&(a[r]={}),a=a[r];(n||null==a[e[o]])&&(a[e[o]]=i)}function n(t){c(o,function(e){e[0]in t&&!(e[1]in t)&&(t[e[1]]=t[e[0]])})}var r=t(Gt),a=t("./helper/compatStyle"),o=[["x","left"],["y","top"],["x2","right"],["y2",dt]],s=["grid","geo","parallel","legend","toolbox","title","visualMap","dataZoom","timeline"],u=["bar","boxplot","candlestick","chord","effectScatter","funnel","gauge","lines","graph","heatmap","line","map","parallel","pie","radar","sankey","scatter","treemap"],c=r.each;return function(t){c(t.series,function(t){if(r[$](t)){var o=t.type;if(a(t),("pie"===o||"gauge"===o)&&null!=t.clockWise&&(t.clockwise=t.clockWise),"gauge"===o){var s=e(t,"pointer.color");null!=s&&i(t,"itemStyle.normal.color",s)}for(var c=0;c<u[Nt];c++)if(u[c]===t.type){n(t);break}}}),t.dataRange&&(t.visualMap=t.dataRange),c(s,function(e){var i=t[e];i&&(r[St](i)||(i=[i]),c(i,function(t){n(t)}))})}}),e("echarts/echarts",[qt,"./model/Global","./ExtensionAPI","./CoordinateSystem","./model/OptionManager","./model/Component","./model/Series","./view/Component","./view/Chart","./util/graphic","zrender",Gt,"zrender/tool/color","zrender/core/env","zrender/mixin/Eventful","./loading/default","./visual/seriesColor","./preprocessor/backwardCompat","echarts/util/graphic","echarts/util/number","echarts/util/format"],function(t){function e(t,e,i){t=t&&t[K](),N[Vt].on.call(this,t,e,i)}function i(){N.call(this)}function n(t,e,n){n=n||{},e&&F(at,function(t){t(e)}),this.id,this.group,this._dom=t,this._zr=D.init(t,{renderer:n.renderer||Et,devicePixelRatio:n.devicePixelRatio}),typeof e===Ot&&(e=ut[e]),this._theme=I.clone(e),this._chartsViews=[],this._chartsMap={},this._componentsViews=[],this._componentsMap={},this._api=new y(this),this._coordinateSystem=new x,N.call(this),this._messageCenter=new i,this._initEvents(),this.resize=I.bind(this.resize,this)}function r(t,e){var i=this._model;i&&i.eachComponent({mainType:"series",query:e},function(n,r){var a=this._chartsMap[n.__viewId];a&&a[t](n,i,this._api,e)},this)}function a(t,e,i){var n=this._api;F(this._componentsViews,function(r){var a=r.__model;r[t](a,e,n,i),m(a,r)},this),e.eachSeries(function(r,a){var o=this._chartsMap[r.__viewId];o[t](r,e,n,i),m(r,o)},this)}function u(t,e){for(var i="component"===t,n=i?this._componentsViews:this._chartsViews,r=i?this._componentsMap:this._chartsMap,a=this._zr,o=0;o<n[Nt];o++)n[o].__keepAlive=!1;e[i?"eachComponent":"eachSeries"](function(t,o){if(i){if("series"===t)return}else o=t;var s=o.id+"_"+o.type,u=r[s];if(!u){var c=b[Tt](o.type),l=i?M[Ct](c.main,c.sub):z[Ct](c.sub);if(!l)return;u=new l,u.init(e,this._api),r[s]=u,n.push(u),a.add(u.group)}o.__viewId=s,u.__keepAlive=!0,u.__id=s,u.__model=o},this);for(var o=0;o<n[Nt];){var s=n[o];s.__keepAlive?o++:(a[A](s.group),s.dispose(this._api),n[U](o,1),delete r[s.__id])}}function c(t){F(H,function(e){F(rt[e]||[],function(e){e(t)})})}function f(t){var e={};t.eachSeries(function(t){var i=t.get("stack"),n=t[V]();if(i&&"list"===n.type){var r=e[i];r&&(n.stackedOn=r),e[i]=n}})}function d(t,e){var i=this._api;F(nt,function(n){n(t,i,e)})}function p(t,e){F(G,function(i){F(st[i]||[],function(i){i(t,e)})})}function v(t,e){var i=this._api;F(this._componentsViews,function(n){var r=n.__model;n.render(r,t,i,e),m(r,n)},this),F(this._chartsViews,function(t){t.__keepAlive=!1},this),t.eachSeries(function(n,r){var a=this._chartsMap[n.__viewId];a.__keepAlive=!0,a.render(n,t,i,e),m(n,a)},this),F(this._chartsViews,function(e){e.__keepAlive||e[A](t,i)},this)}function m(t,e){var i=t.get("z"),n=t.get(h);e.group[k](function(t){null!=i&&(t.z=i),null!=n&&(t[h]=n)})}var g=t("./model/Global"),y=t("./ExtensionAPI"),x=t("./CoordinateSystem"),_=t("./model/OptionManager"),b=t("./model/Component"),w=t("./model/Series"),M=t("./view/Component"),z=t("./view/Chart"),L=t("./util/graphic"),D=t("zrender"),I=t(Gt),O=t("zrender/tool/color"),R=t("zrender/core/env"),N=t("zrender/mixin/Eventful"),F=I.each,G=["echarts","chart","component"],H=[B,Ft,"statistic"];i[Vt].on=e,I.mixin(i,N);var W=n[Vt];W.getDom=function(){return this._dom},W.getZr=function(){return this._zr},W.setOption=function(t,e,i){(!this._model||e)&&(this._model=new g(null,null,this._theme,new _(this._api))),this._model.setOption(t,at),Z.prepareAndUpdate.call(this),!i&&this._zr.refreshImmediately()},W.setTheme=function(){console.log("ECharts#setTheme() is DEPRECATED in ECharts 3.0")},W[ot]=function(){return this._model},W[X]=function(){return this._zr[X]()},W[j]=function(){return this._zr[j]()},W.getRenderedCanvas=function(t){if(R.canvasSupported){t=t||{},
t.pixelRatio=t.pixelRatio||1,t.backgroundColor=t.backgroundColor||this._model.get("backgroundColor");var e=this._zr,i=e.storage.getDisplayList();return I.each(i,function(t){t[P](!0)}),e.painter.getRenderedCanvas(t)}},W.getDataURL=function(t){t=t||{};var e=t.excludeComponents,i=this._model,n=[],r=this;F(e,function(t){i.eachComponent({mainType:t},function(t){var e=r._componentsMap[t.__viewId];e.group[T]||(n.push(e),e.group[T]=!0)})});var a=this.getRenderedCanvas(t).toDataURL("image/"+(t&&t.type||"png"));return F(n,function(t){t.group[T]=!1}),a},W.getConnectedDataURL=function(t){if(R.canvasSupported){var e=this.group,i=Math.min,n=Math.max,r=1/0;if(ht[e]){var a=r,o=r,s=-r,u=-r,c=[],l=t&&t.pixelRatio||1;for(var h in lt){var f=lt[h];if(f.group===e){var d=f.getRenderedCanvas(I.clone(t)),p=f.getDom().getBoundingClientRect();a=i(p.left,a),o=i(p.top,o),s=n(p.right,s),u=n(p[dt],u),c.push({dom:d,left:p.left,top:p.top})}}a*=l,o*=l,s*=l,u*=l;var v=s-a,m=u-o,g=I.createCanvas();g.width=v,g[mt]=m;var y=D.init(g);return F(c,function(t){var e=new L.Image({style:{x:t.left*l-a,y:t.top*l-o,image:t.dom}});y.add(e)}),y.refreshImmediately(),g.toDataURL("image/"+(t&&t.type||"png"))}return this.getDataURL(t)}};var Z={update:function(t){var e=this._model;if(e){e.restoreData(),c.call(this,e),f.call(this,e),this._coordinateSystem[l](e,this._api),d.call(this,e,t),p.call(this,e,t),v.call(this,e,t);var i=e.get("backgroundColor");if(!R.canvasSupported){var n=O.parse(i);i=O.stringify(n,"rgb"),0===n[3]&&(i="transparent")}var r=this._zr.painter;r.isSingleCanvas&&r.isSingleCanvas()?this._zr.configLayer(0,{clearColor:i}):(i=i||"transparent",this._dom.style.backgroundColor=i)}},updateView:function(t){var e=this._model;e&&(d.call(this,e,t),p.call(this,e,t),a.call(this,"updateView",e,t))},updateVisual:function(t){var e=this._model;e&&(p.call(this,e,t),a.call(this,"updateVisual",e,t))},updateLayout:function(t){var e=this._model;e&&(d.call(this,e,t),a.call(this,"updateLayout",e,t))},highlight:function(t){r.call(this,"highlight",t)},downplay:function(t){r.call(this,"downplay",t)},prepareAndUpdate:function(t){var e=this._model;u.call(this,"component",e),u.call(this,"chart",e),Z[l].call(this,t)}};W.resize=function(){this._zr.resize();var t=this._model&&this._model.resetOption("media");Z[t?"prepareAndUpdate":l].call(this),this._loadingFX&&this._loadingFX.resize()};var Q=t("./loading/default");W.showLoading=function(t,e){I[$](t)&&(e=t,t="default");var i=Q(this._api,e),n=this._zr;this._loadingFX=i,n.painter.clear(),n.add(i)},W.hideLoading=function(){this._zr[A](this._loadingFX),this._loadingFX=null},W.makeActionFromEvent=function(t){var e=I[zt]({},t);return e.type=it[t.type],e},W.dispatchAction=function(t,e){var i=et[t.type];if(i){var n=i.actionInfo,r=n[l]||l,a=[t],o=!1;t.batch&&(o=!0,a=I.map(t.batch,function(e){return e=I[ct](I[zt]({},e),t),e.batch=null,e}));for(var s,u=[],c="highlight"===t.type||"downplay"===t.type,h=0;h<a[Nt];h++){var f=a[h];s=i.action(f,this._model),s=s||I[zt]({},f),s.type=n.event||s.type,u.push(s),c&&Z[r].call(this,f)}"none"!==r&&!c&&Z[r].call(this,t),e||(s=o?{type:u[0].type,batch:u}:u[0],this._messageCenter[C](s.type,s))}},W.on=e;var J=["click","dblclick","mouseover","mouseout","globalout"];W._initEvents=function(){var t=this._zr;F(J,function(e){t.on(e,function(t){var i=this[ot](),n=t.target;if(n&&null!=n[S]){var r=n[o]||i.getSeriesByIndex(n[q]),a=r&&r[E](n[S])||{};a.event=t,a.type=e,this[C](e,a)}},this)},this),F(it,function(t,e){this._messageCenter.on(e,function(t){this[C](e,t)},this)},this)},W.isDisposed=function(){return this._disposed},W.dispose=function(){this._disposed=!0;var t=this._api;F(this._componentsViews,function(e){e.dispose(t)}),F(this._chartsViews,function(e){e.dispose(t)}),this._zr.dispose(),lt[this.id]=null},I.mixin(n,N);var et=[],it={},nt=[],rt={},at=[],st={},ut={},lt={},ht={},ft=new Date-0,pt=new Date-0,vt="_echarts_instance_",gt={version:"3.0.0",dependencies:{zrender:"3.0.0"}};return gt.init=function(t,e,i){if(D.version[tt](".","")-0<gt.dependencies.zrender[tt](".","")-0)throw new Error("ZRender "+D.version+" is too old for ECharts "+gt.version+". Current version need ZRender "+gt.dependencies.zrender+"+");if(!t)throw new Error("Initialize failed: invalid dom.");var r=new n(t,e,i);return r.id=ft++,lt[r.id]=r,t.setAttribute&&t.setAttribute(vt,r.id),I.each(it,function(t,e){r._messageCenter.on(e,function(t){if(ht[r.group]){r.__connectedActionDispatching=!0;for(var e in lt){var i=r.makeActionFromEvent(t),n=lt[e];n!==r&&n.group===r.group&&(n.__connectedActionDispatching||n.dispatchAction(i))}r.__connectedActionDispatching=!1}})}),r},gt.connect=function(t){if(I[St](t)){var e=t;t=null,I.each(e,function(e){null!=e.group&&(t=e.group)}),t=t||pt++,I.each(e,function(e){e.group=t})}return ht[t]=!0,t},gt.disConnect=function(t){ht[t]=!1},gt.dispose=function(t){I.isDom(t)?t=gt.getInstanceByDom(t):typeof t===Ot&&(t=lt[t]),t instanceof n&&!t.isDisposed()&&t.dispose()},gt.getInstanceByDom=function(t){var e=t.getAttribute(vt);return lt[e]},gt.getInstanceById=function(t){return lt[t]},gt.registerTheme=function(t,e){ut[t]=e},gt.registerPreprocessor=function(t){at.push(t)},gt.registerProcessor=function(t,e){if(I[Bt](H,t)<0)throw new Error("stage should be one of "+H);var i=rt[t]||(rt[t]=[]);i.push(e)},gt.registerAction=function(t,e,i){typeof e===Pt&&(i=e,e="");var n=I[$](t)?t.type:[t,t={event:e}][0];t.event=(t.event||n)[K](),e=t.event,et[n]||(et[n]={action:i,actionInfo:t}),it[e]=n},gt.registerCoordinateSystem=function(t,e){x.register(t,e)},gt.registerLayout=function(t){I[Bt](nt,t)<0&&nt.push(t)},gt.registerVisualCoding=function(t,e){if(I[Bt](G,t)<0)throw new Error("stage should be one of "+G);var i=st[t]||(st[t]=[]);i.push(e)},gt.extendChartView=function(t){return z[zt](t)},gt.extendComponentModel=function(t){return b[zt](t)},gt.extendSeriesModel=function(t){return w[zt](t)},gt.extendComponentView=function(t){return M[zt](t)},gt.setCanvasCreator=function(t){I.createCanvas=t},gt.registerVisualCoding("echarts",I.curry(t("./visual/seriesColor"),"",s)),gt.registerPreprocessor(t("./preprocessor/backwardCompat")),gt.registerAction({type:"highlight",event:"highlight",update:"highlight"},I.noop),gt.registerAction({type:"downplay",event:"downplay",update:"downplay"},I.noop),gt.graphic=t("echarts/util/graphic"),gt[It]=t("echarts/util/number"),gt.format=t("echarts/util/format"),gt.util={},F(["map","each",Ft,Bt,At,"reduce",Ft,"bind","curry",St,Y,$,"isFunction",zt],function(t){gt.util[t]=I[t]}),gt}),e("echarts",["echarts/echarts"],function(t){return t}),e("echarts/data/DataDiffer",[qt],function(t){function e(t){return t}function i(t,i,n,r){this._old=t,this._new=i,this._oldKeyGetter=n||e,this._newKeyGetter=r||e}function n(t,e,i){for(var n=0;n<t[Nt];n++){var r=i(t[n]),a=e[r];null==a?e[r]=n:(a[Nt]||(e[r]=a=[a]),a.push(n))}}return i[Vt]={constructor:i,add:function(t){return this._add=t,this},update:function(t){return this._update=t,this},remove:function(t){return this._remove=t,this},execute:function(){var t,e=this._old,i=this._new,r=this._oldKeyGetter,a=this._newKeyGetter,o={},s={};for(n(e,o,r),n(i,s,a),t=0;t<e[Nt];t++){var u=r(e[t]),c=s[u];if(null!=c){var l=c[Nt];l?(1===l&&(s[u]=null),c=c.unshift()):s[u]=null,this._update&&this._update(c,t)}else this._remove&&this._remove(t)}for(var u in s)if(s.hasOwnProperty(u)){var c=s[u];if(null==c)continue;if(c[Nt])for(var t=0,l=c[Nt];l>t;t++)this._add&&this._add(c[t]);else this._add&&this._add(c)}}},i}),e("echarts/data/List",[qt,"../model/Model","./DataDiffer",Gt,"../util/model"],function(t){function e(t){return p[St](t)||(t=[t]),t}var i=xt,n=typeof window===xt?global:window,s=typeof n.Float64Array===i?Array:n.Float64Array,l=typeof n.Int32Array===i?Array:n.Int32Array,h={"float":s,"int":l,ordinal:Array,number:Array,time:Array},f=t("../model/Model"),d=t("./DataDiffer"),p=t(Gt),v=t("../util/model"),m=p[$],g=["stackedOn","_nameList","_idList","_rawData"],y=function(t,e,i){p.each(g[Dt](i||[]),function(i){e.hasOwnProperty(i)&&(t[i]=e[i])})},x=function(t,e){t=t||["x","y"];for(var i={},n=[],r=0;r<t[Nt];r++){var s,u={};typeof t[r]===Ot?(s=t[r],u={name:s,stackable:!1,type:"number"}):(u=t[r],s=u.name,u.type=u.type||It),n.push(s),i[s]=u}this[a]=n,this._dimensionInfos=i,this[o]=e,this.indices=[],this._storage={},this._nameList=[],this._idList=[],this._optionModels=[],this.stackedOn=null,this._visual={},this._itemVisuals=[],this._itemLayouts=[],this._graphicEls=[],this._rawData},_=x[Vt];_.type="list",_.getDimension=function(t){return isNaN(t)||(t=this[a][t]||t),t},_.getDimensionInfo=function(t){return this._dimensionInfos[this.getDimension(t)]},_.initData=function(t,e,i){t=t||[],this._rawData=t;var n=this._storage={},r=this.indices=[],o=this[a],s=t[Nt],u=this._dimensionInfos,c=[],l={};e=e||[];for(var f=0;f<o[Nt];f++){var d=u[o[f]],m=h[d.type];n[o[f]]=new m(s)}i=i||function(t,e,i,n){var r=v.getDataItemValue(t);return v.converDataValue(p[St](r)?r[n]:r,u[e])};for(var g=0;g<t[Nt];g++){for(var y=t[g],x=0;x<o[Nt];x++){var _=o[x],b=n[_];b[g]=i(y,_,g,x)}r.push(g)}for(var f=0;f<t[Nt];f++){var w="";e[f]||(e[f]=t[f].name,w=t[f].id);var M=e[f]||"";!w&&M&&(l[M]=l[M]||0,w=M,l[M]>0&&(w+="__ec__"+l[M]),l[M]++),w&&(c[f]=w)}this._nameList=e,this._idList=c},_.count=function(){return this.indices[Nt]},_.get=function(t,e,i){var n=this._storage,r=this.indices[e],a=n[t]&&n[t][r],o=this._dimensionInfos[t];if(i&&o&&o.stackable)for(var s=this.stackedOn;s;){var u=s.get(t,e);(a>=0&&u>0||0>=a&&0>u)&&(a+=u),s=s.stackedOn}return a},_.getValues=function(t,e,i){var n=[];p[St](t)||(i=e,e=t,t=this[a]);for(var r=0,o=t[Nt];o>r;r++)n.push(this.get(t[r],e,i));return n},_.hasValue=function(t){for(var e=this[a],i=this._dimensionInfos,n=0,r=e[Nt];r>n;n++)if(i[e[n]].type!==G&&isNaN(this.get(e[n],t)))return!1;return!0},_.getDataExtent=function(t,e){var i=this._storage[t],n=this.getDimensionInfo(t);e=n&&n.stackable&&e;var r,a=(this._extent||(this._extent={}))[t+!!e];if(a)return a;if(i){for(var o=1/0,s=-(1/0),u=0,c=this.count();c>u;u++)r=this.get(t,u,e),o>r&&(o=r),r>s&&(s=r);return this._extent[t+e]=[o,s]}return[1/0,-(1/0)]},_.getSum=function(t,e){var i=this._storage[t],n=0;if(i)for(var r=0,a=this.count();a>r;r++){var o=this.get(t,r,e);isNaN(o)||(n+=o)}return n},_[Bt]=function(t,e){var i=this._storage,n=i[t],r=this.indices;if(n)for(var a=0,o=r[Nt];o>a;a++){var s=r[a];if(n[s]===e)return a}return-1},_.indexOfName=function(t){for(var e=this.indices,i=this._nameList,n=0,r=e[Nt];r>n;n++){var a=e[n];if(i[a]===t)return n}return-1},_.indexOfNearest=function(t,e,i){p[St](t)||(t=t?[t]:[]);var n=this._storage,r=n[t];if(r){for(var a=Number.MAX_VALUE,o=-1,s=0,u=t[Nt];u>s;s++)for(var c=0,l=this.count();l>c;c++){var h=Math.abs(this.get(t[s],c,i)-e);a>=h&&(a=h,o=c)}return o}return-1},_.getRawIndex=function(t){var e=this.indices[t];return null==e?-1:e},_.getName=function(t){return this._nameList[this.indices[t]]||""},_.getId=function(t){return this._idList[this.indices[t]]||this.getRawIndex(t)+""},_.each=function(t,i,n,r){typeof t===Pt&&(r=n,n=i,i=t,t=[]),t=p.map(e(t),this.getDimension,this);var a=[],o=t[Nt],s=this.indices;r=r||this;for(var u=0;u<s[Nt];u++)if(0===o)i.call(r,u);else if(1===o)i.call(r,this.get(t[0],u,n),u);else{for(var c=0;o>c;c++)a[c]=this.get(t[c],u,n);a[c]=u,i.apply(r,a)}},_.filterSelf=function(t,i,n,r){typeof t===Pt&&(r=n,n=i,i=t,t=[]),t=p.map(e(t),this.getDimension,this);var a=[],o=[],s=t[Nt],u=this.indices;r=r||this;for(var c=0;c<u[Nt];c++){var l;if(1===s)l=i.call(r,this.get(t[0],c,n),c);else{for(var h=0;s>h;h++)o[h]=this.get(t[h],c,n);o[h]=c,l=i.apply(r,o)}l&&a.push(u[c])}return this.indices=a,this._extent={},this},_.mapArray=function(t,e,i,n){typeof t===Pt&&(n=i,i=e,e=t,t=[]);var r=[];return this.each(t,function(){r.push(e&&e.apply(this,arguments))},i,n),r},_.map=function(t,i,n,r){t=p.map(e(t),this.getDimension,this);var s=this[a],u=new x(p.map(s,this.getDimensionInfo,this),this[o]),c=u.indices=this.indices;y(u,this,this._wrappedMethods);for(var l=u._storage={},h=this._storage,f=0;f<s[Nt];f++){var d=s[f],v=h[d];p[Bt](t,d)>=0?l[d]=new v.constructor(h[d][Nt]):l[d]=h[d]}var m=[];return this.each(t,function(){var e=arguments[arguments[Nt]-1],n=i&&i.apply(this,arguments);if(null!=n){typeof n===It&&(m[0]=n,n=m);for(var r=0;r<n[Nt];r++){var a=t[r],o=l[a],s=c[e];o&&(o[s]=n[r])}}}),u};var b=new f(null);_[N]=function(t,e){var i,n=this[o];return t=this.indices[t],i=e?new f(null,n):b,i[et]=this._rawData[t],i.parentModel=n,i[st]=n[st],i},_.diff=function(t){var e=this._idList,i=t&&t._idList;return new d(t?t.indices:[],this.indices,function(t){return i[t]||t+""},function(t){return e[t]||t+""})},_.getVisual=function(t){var e=this._visual;return e&&e[t]},_[c]=function(t,e){if(m(t))for(var i in t)t.hasOwnProperty(i)&&this[c](i,t[i]);else this._visual=this._visual||{},this._visual[t]=e},_.getItemLayout=function(t){return this._itemLayouts[t]},_[r]=function(t,e,i){this._itemLayouts[t]=i?p[zt](this._itemLayouts[t]||{},e):e},_.getItemVisual=function(t,e,i){var n=this._itemVisuals[t],r=n&&n[e];return null!=r||i?r:this.getVisual(e)},_[u]=function(t,e,i){var n=this._itemVisuals[t]||{};if(this._itemVisuals[t]=n,m(e))for(var r in e)e.hasOwnProperty(r)&&(n[r]=e[r]);else n[e]=i};var C=function(t){t[q]=this[q],t[S]=this[S]};return _.setItemGraphicEl=function(t,e){var i=this[o];e&&(e[S]=t,e[q]=i&&i[q],"group"===e.type&&e[k](C,e)),this._graphicEls[t]=e},_[M]=function(t){return this._graphicEls[t]},_[w]=function(t,e){p.each(this._graphicEls,function(i,n){i&&t&&t.call(e,i,n)})},_.cloneShallow=function(){var t=p.map(this[a],this.getDimensionInfo,this),e=new x(t,this[o]);return e._storage=this._storage,y(e,this,this._wrappedMethods),e.indices=this.indices.slice(),e},_.wrapMethod=function(t,e){var i=this[t];typeof i===Pt&&(this._wrappedMethods=this._wrappedMethods||[],this._wrappedMethods.push(t),this[t]=function(){var t=i.apply(this,arguments);return e.call(this,t)})},x}),e("echarts/data/helper/completeDimensions",[qt,Gt],function(t){function e(t,e,a){var o=n(e[0]),s=r[St](o)&&o[Nt]||1;a=a||[];for(var u=0;s>u;u++)if(!t[u]){var c=a[u]||"extra"+(u-a[Nt]);t[u]=i(e,u)?{type:"ordinal",name:c}:c}return t}function i(t,e){for(var i=0,a=t[Nt];a>i;i++){var o=n(t[i]);if(!r[St](o))return!1;var o=o[e];if(null!=o&&isFinite(o))return!1;if(r[Y](o)&&"-"!==o)return!0}return!1}function n(t){return r[St](t)?t:r[$](t)?t.value:t}var r=t(Gt);return e}),e("echarts/chart/helper/createListFromArray",[qt,"../../data/List","../../data/helper/completeDimensions",Gt,"../../util/model"],function(t){function e(t){for(var e=0;e<t[Nt]&&null==t[e];)e++;return t[e]}function i(t){var i=e(t);return null!=i&&!l[St](f(i))}function r(t,e,r){t=t||[];var o=p[e.get(n)](t,e,r),c=o[a],l=o.categoryAxisModel,h=c[0].type===G?0:c[1].type===G?1:-1,v=new u(c,e),m=s(o,t),g=l&&i(t)?function(t,e,i,n){return n===h?i:d(f(t),c[n])}:function(t,e,i,n){var r=f(t);return d(r&&r[n],c[n])};return v.initData(t,m,g),v}function o(t){return"category"!==t&&"time"!==t}function s(t,e){var i=[];if(t.categoryAxisModel){var n=t.categoryAxisModel.getCategories();if(n){var r=e[Nt];if(l[St](e[0])&&e[0][Nt]>1){i=[];for(var a=0;r>a;a++)i[a]=n[e[a][0]]}else i=n.slice(0)}}return i}var u=t("../../data/List"),c=t("../../data/helper/completeDimensions"),l=t(Gt),h=t("../../util/model"),f=h.getDataItemValue,d=h.converDataValue,p={cartesian2d:function(t,e,i){var n=i[Z]("xAxis",e.get("xAxisIndex")),r=i[Z]("yAxis",e.get("yAxisIndex")),a=n.get("type"),s=r.get("type"),u="category"===s,l="category"===a,h=[{name:"x",type:l?G:"float",stackable:o(a)},{name:"y",type:u?G:"float",stackable:o(s)}];return c(h,t,["x","y","z"]),{dimensions:h,categoryAxisModel:l?n:u?r:null}},polar:function(t,e,i){var n=e.get("polarIndex")||0,r=function(t){return t.get("polarIndex")===n},a=i.findComponents({mainType:"angleAxis",filter:r})[0],s=i.findComponents({mainType:"radiusAxis",filter:r})[0],u="category"===s.get("type"),l="category"===a.get("type"),h=[{name:"radius",type:u?G:"float",stackable:o(s.get("type"))},{name:"angle",type:l?G:"float",stackable:o(a.get("type"))}];return c(h,t,["radius","angle","value"]),{dimensions:h,categoryAxisModel:l?a:u?s:null}},geo:function(t,e,i){return{dimensions:c([{name:"lng"},{name:"lat"}],t,["lng","lat","value"])}}};return r}),e("echarts/chart/line/LineSeries",[qt,"../helper/createListFromArray","../../model/Series"],function(t){var e=t("../helper/createListFromArray"),i=t("../../model/Series");return i[zt]({type:"series.line",dependencies:["grid","polar"],getInitialData:function(t,i){return e(t.data,this,i)},defaultOption:{zlevel:0,z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,hoverAnimation:!0,xAxisIndex:0,yAxisIndex:0,polarIndex:0,clipOverflow:!0,label:{normal:{position:"top"},emphasis:{position:"top"}},lineStyle:{normal:{width:2,type:"solid"}},symbol:"emptyCircle",symbolSize:4,showSymbol:!0,animationEasing:"linear"}})}),e("echarts/util/symbol",[qt,"./graphic","zrender/core/BoundingRect"],function(t){var e=t("./graphic"),i=t("zrender/core/BoundingRect"),n=e.extendShape({type:"triangle",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(t,e){var i=e.cx,n=e.cy,r=e.width/2,a=e[mt]/2;t[g](i,n-a),t[m](i+r,n+a),t[m](i-r,n+a),t[p]()}}),r=e.extendShape({type:"diamond",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(t,e){var i=e.cx,n=e.cy,r=e.width/2,a=e[mt]/2;t[g](i,n-a),t[m](i+r,n),t[m](i,n+a),t[m](i-r,n),t[p]()}}),a=e.extendShape({type:"pin",shape:{x:0,y:0,width:0,height:0},buildPath:function(t,e){var i=e.x,n=e.y,r=e.width/5*3,a=Math.max(r,e[mt]),o=r/2,s=o*o/(a-o),u=n-a+o+s,c=Math.asin(s/o),l=Math.cos(c)*o,h=Math.sin(c),f=Math.cos(c);t.arc(i,u,o,Math.PI-c,2*Math.PI+c);var d=.6*o,m=.7*o;t[v](i+l-h*d,u+s+f*d,i,n-m,i,n),t[v](i,n-m,i-l+h*d,u+s+f*d,i-l,u+s),t[p]()}}),o=e.extendShape({type:"arrow",shape:{x:0,y:0,width:0,height:0},buildPath:function(t,e){var i=e[mt],n=e.width,r=e.x,a=e.y,o=n/3*2;t[g](r,a),t[m](r+o,a+i),t[m](r,a+i/4*3),t[m](r-o,a+i),t[m](r,a),t[p]()}}),s={line:e.Line,rect:e.Rect,roundRect:e.Rect,square:e.Rect,circle:e.Circle,diamond:r,pin:a,arrow:o,triangle:n},u={line:function(t,e,i,n,r){r.x1=t,r.y1=e+n/2,r.x2=t+i,r.y2=e+n/2},rect:function(t,e,i,n,r){r.x=t,r.y=e,r.width=i,r[mt]=n},roundRect:function(t,e,i,n,r){r.x=t,r.y=e,r.width=i,r[mt]=n,r.r=Math.min(i,n)/4},square:function(t,e,i,n,r){var a=Math.min(i,n);r.x=t,r.y=e,r.width=a,r[mt]=a},circle:function(t,e,i,n,r){r.cx=t+i/2,r.cy=e+n/2,r.r=Math.min(i,n)/2},diamond:function(t,e,i,n,r){r.cx=t+i/2,r.cy=e+n/2,r.width=i,r[mt]=n},pin:function(t,e,i,n,r){r.x=t+i/2,r.y=e+n/2,r.width=i,r[mt]=n},arrow:function(t,e,i,n,r){r.x=t+i/2,r.y=e+n/2,r.width=i,r[mt]=n},triangle:function(t,e,i,n,r){r.cx=t+i/2,r.cy=e+n/2,r.width=i,r[mt]=n}},c={};for(var l in s)c[l]=new s[l];var h=e.extendShape({type:"symbol",shape:{symbolType:"",x:0,y:0,width:0,height:0},beforeBrush:function(){var t=this.style,e=this.shape;"pin"===e.symbolType&&t.textPosition===lt&&(t.textPosition=["50%","40%"],t[b]=ht,t[_]=ft)},buildPath:function(t,e){var i=e.symbolType,n=c[i];"none"!==e.symbolType&&(n||(i="rect",n=c[i]),u[i](e.x,e.y,e.width,e[mt],n.shape),n[d](t,n.shape))}}),f=function(t){if("image"!==this.type){var e=this.style,i=this.shape;i&&"line"===i.symbolType?e[bt]=t:this.__isEmptyBrush?(e[bt]=t,e.fill="#fff"):(e.fill&&(e.fill=t),e[bt]&&(e[bt]=t)),this.dirty()}},y={createSymbol:function(t,n,r,a,o,s){var u=0===t[Bt]("empty");u&&(t=t[ut](5,1)[K]()+t[ut](6));var c;return c=0===t[Bt]("image://")?new e.Image({style:{image:t.slice(8),x:n,y:r,width:a,height:o}}):0===t[Bt]("path://")?e.makePath(t.slice(7),{},new i(n,r,a,o)):new h({shape:{symbolType:t,x:n,y:r,width:a,height:o}}),c.__isEmptyBrush=u,c.setColor=f,c.setColor(s),c}};return y}),e("echarts/chart/helper/Symbol",[qt,Gt,"../../util/symbol","../../util/graphic","../../util/number"],function(t){function e(t){return r[St](t)||(t=[+t,+t]),t}function i(t,e){c.Group.call(this),this.updateData(t,e)}function n(t,e){this[O].drift(t,e)}var r=t(Gt),u=t("../../util/symbol"),c=t("../../util/graphic"),l=t("../../util/number"),d=i[Vt];d._createSymbol=function(t,i,r){this.removeAll();var a=i[o],s=i.getItemVisual(r,"color"),l=u.createSymbol(t,-.5,-.5,1,1,s);l.attr({style:{strokeNoScale:!0},z2:100,scale:[0,0]}),l.drift=n;var h=e(i.getItemVisual(r,"symbolSize"));c.initProps(l,{scale:h},a),this._symbolType=t,this.add(l)},d.stopSymbolAnimation=function(t){this.childAt(0)[P](t)},d.getScale=function(){return this.childAt(0).scale},d.highlight=function(){this.childAt(0)[C](W)},d.downplay=function(){this.childAt(0)[C](H)},d.setZ=function(t,e){var i=this.childAt(0);i[h]=t,i.z=e},d.setDraggable=function(t){var e=this.childAt(0);e.draggable=t,e.cursor=t?"move":"pointer"},d.updateData=function(t,i){var n=t.getItemVisual(i,"symbol")||"circle",r=t[o],a=e(t.getItemVisual(i,"symbolSize"));if(n!==this._symbolType)this._createSymbol(n,t,i);else{var s=this.childAt(0);c[f](s,{scale:a},r)}this._updateCommon(t,i,a),this._seriesModel=r};var p=[s,H],v=[s,W],m=["label",H],g=["label",W];return d._updateCommon=function(t,i,n){var s=this.childAt(0),u=t[o],h=t[N](i),f=h[ot](p),d=t.getItemVisual(i,"color"),y=h[ot](v).getItemStyle();s[R]=h[Mt]("symbolRotate")*Math.PI/180||0;var x=h[Mt]("symbolOffset");if(x){var _=s[Q];_[0]=l[J](x[0],n[0]),_[1]=l[J](x[1],n[1])}s.setColor(d),r[zt](s.style,f.getItemStyle(["color"]));var b=h[ot](m),w=h[ot](g),M=t[a][t[a][Nt]-1],S=u.getFormattedLabel(i,H)||t.get(M,i),C=s.style;b.get("show")?(c.setText(C,b,d),C.text=S):C.text="",w[Mt]("show")?(c.setText(y,w,d),y.text=S):y.text="",c.setHoverStyle(s,y);var k=e(t.getItemVisual(i,"symbolSize"));if(s.off("mouseover").off("mouseout").off(W).off(H),h[Mt]("hoverAnimation")){var A=function(){var t=k[1]/k[0];this.animateTo({scale:[Math.max(1.1*k[0],k[0]+3),Math.max(1.1*k[1],k[1]+3*t)]},400,"elasticOut")},z=function(){this.animateTo({scale:k},400,"elasticOut")};s.on("mouseover",A).on("mouseout",z).on(W,A).on(H,z)}},d.fadeOut=function(t){var e=this.childAt(0);e.style.text="",c[f](e,{scale:[0,0]},this._seriesModel,t)},r[At](i,c.Group),i}),e("echarts/chart/helper/SymbolDraw",[qt,"../../util/graphic","./Symbol"],function(t){function e(t){this.group=new n.Group,this._symbolCtor=t||r}function i(t,e,i){var n=t.getItemLayout(e);return n&&!isNaN(n[0])&&!isNaN(n[1])&&!(i&&i(e))&&"none"!==t.getItemVisual(e,"symbol")}var n=t("../../util/graphic"),r=t("./Symbol"),a=e[Vt];return a.updateData=function(t,e){var r=this.group,a=t[o],s=this._data,u=this._symbolCtor;t.diff(s).add(function(n){var a=t.getItemLayout(n);if(i(t,n,e)){var o=new u(t,n);o.attr(Q,a),t.setItemGraphicEl(n,o),r.add(o)}})[l](function(o,c){var l=s[M](c),h=t.getItemLayout(o);return i(t,o,e)?(l?(l.updateData(t,o),n[f](l,{position:h},a)):(l=new u(t,o),l.attr(Q,h)),r.add(l),void t.setItemGraphicEl(o,l)):void r[A](l)})[A](function(t){var e=s[M](t);e&&e.fadeOut(function(){r[A](e)})}).execute(),this._data=t},a.updateLayout=function(){var t=this._data;t&&t[w](function(e,i){e.attr(Q,t.getItemLayout(i))})},a[A]=function(t){var e=this.group,i=this._data;i&&(t?i[w](function(t){t.fadeOut(function(){e[A](t)})}):e.removeAll())},e}),e("zrender/core/arrayDiff",[qt],function(t){function e(t,e){return t===e}function i(t,e,i){var n={cmd:t,idx:e};return"="===t&&(n.idx1=i),n}function n(t,e,n,r){t.push(i(e,n,r))}function r(t,e,i,n,r,a,o,u){var c,l,h,f=i>n,d=r>a,p=s(n-i),v=s(a-r);for(l=0;p>=l;l++)for(h=0;v>=h;h++)if(0===l)u[h]=h;else if(0===h)c=u[h],u[h]=l;else{var m=t[f?i-l:l-1+i],g=e[d?r-h:h-1+r],y=c+(o(m,g)?0:2),x=u[h]+1,_=u[h-1]+1;c=u[h],u[h]=x>y?y:x,_<u[h]&&(u[h]=_)}return u}function a(t,e,i,o,s,u,c,l,h){var f,d,p=[],v=o-i,m=u-s;if(v)if(m)if(1===v){var g=t[i],y=!1;for(d=0;m>d;d++)c(g,e[d+s])&&!y?(y=!0,n(p,"=",i,d+s)):n(p,"+",d+s);y||n(p,"-",i)}else if(1===m){var x=e[s],y=!1;for(f=0;v>f;f++)c(x,t[f+i])&&!y?(y=!0,n(p,"=",f+i,s)):n(p,"-",f+i);y||n(p,"+",s)}else{var _=(v/2|0)+i;r(t,e,i,_,s,u,c,l),r(t,e,o,_+1,u,s,c,h);var b,w=1/0,M=0;for(d=0;m>=d;d++)b=l[d]+h[m-d],w>b&&(w=b,M=d);M+=s,p=a(t,e,i,_,s,M,c,l,h);var S=a(t,e,_,o,M,u,c,l,h);for(f=0;f<S[Nt];f++)p.push(S[f])}else for(f=0;v>f;f++)n(p,"-",f+i);else for(d=0;m>d;d++)n(p,"+",d+s);return p}function o(t,i,r){r=r||e;var o,s,u=t[Nt],c=i[Nt],l=Math.min(u,c),h=[];for(o=0;l>o&&r(t[o],i[o]);o++)n(h,"=",o,o);for(s=0;l>s&&r(t[u-s-1],i[c-s-1]);s++);if(u-s>=o||c-s>=o){var f=a(t,i,o,u-s,o,c-s,r,[],[]);for(o=0;o<f[Nt];o++)h.push(f[o]);for(o=0;s>o;o++)n(h,"=",u-s+o,c-s+o)}return h}var s=Math.abs;return o}),e("echarts/chart/line/lineAnimationDiff",[qt,"zrender/core/arrayDiff"],function(t){function e(t){return t>=0?1:-1}function i(t,i,n){for(var r,a=t.getBaseAxis(),o=t.getOtherAxis(a),s=a.onZero?0:o.scale.getExtent()[0],u=o.dim,c="x"===u||"radius"===u?1:0,l=i.stackedOn,h=i.get(u,n);l&&e(l.get(u,n))===e(h);){r=l;break}var f=[];return f[c]=i.get(a.dim,n),f[1-c]=r?r.get(u,n,!0):s,t.dataToPoint(f)}var n=t("zrender/core/arrayDiff");return function(t,e,r,o,s,u){for(var c=e.mapArray(e.getId),l=t.mapArray(t.getId),h=[],f=[],d=[],p=[],v=[],m=[],g=[],y=n(l,c),x=u[a],_=0;_<y[Nt];_++){var b=y[_],w=!0;switch(b.cmd){case"=":h.push(t.getItemLayout(b.idx)),f.push(e.getItemLayout(b.idx1)),d.push(r[b.idx]),p.push(o[b.idx1]),g.push(e.getRawIndex(b.idx1));break;case"+":var M=b.idx;h.push(s.dataToPoint([e.get(x[0],M,!0),e.get(x[1],M,!0)])),f.push(e.getItemLayout(M).slice()),d.push(i(s,e,M)),p.push(o[M]),g.push(e.getRawIndex(M));break;case"-":var M=b.idx,S=t.getRawIndex(M);S!==M?(h.push(t.getItemLayout(M)),f.push(u.dataToPoint([t.get(x[0],M,!0),t.get(x[1],M,!0)])),d.push(r[M]),p.push(i(u,t,M)),g.push(S)):w=!1}w&&(v.push(b),m.push(m[Nt]))}m.sort(function(t,e){return g[t]-g[e]});for(var C=[],k=[],A=[],z=[],L=[],_=0;_<m[Nt];_++){var M=m[_];C[_]=h[M],k[_]=f[M],A[_]=d[M],z[_]=p[M],L[_]=v[M]}return{current:C,next:k,stackedOnCurrent:A,stackedOnNext:z,status:L}}}),e("echarts/chart/line/poly",[qt,"zrender/graphic/Path","zrender/core/vector"],function(t){function e(t,e,i,n,p,y,x,_,b){for(var w=i,M=0;p>M;M++){var S=e[w];if(w>=n||0>w||isNaN(S[0])||isNaN(S[1]))break;if(w===i)t[y>0?g:m](S[0],S[1]),l(f,S);else if(b>0){var C=w-y,k=w+y;y>0?(C=o(C,i),k=a(k,n-1)):(k=o(k,0),C=a(C,i));var A=e[C],z=e[k];(isNaN(z[0])||isNaN(z[1]))&&(z=S),r.sub(h,z,A),c(d,S,h,-b/2),s(f,f,_),u(f,f,x),s(d,d,_),u(d,d,x),t[v](f[0],f[1],d[0],d[1],S[0],S[1]),c(f,S,h,b/2)}else t[m](S[0],S[1]);w+=y}return M}function i(t){for(var e=[1/0,1/0],i=[-(1/0),-(1/0)],n=0;n<t[Nt];n++){var r=t[n];r[0]<e[0]&&(e[0]=r[0]),r[1]<e[1]&&(e[1]=r[1]),r[0]>i[0]&&(i[0]=r[0]),r[1]>i[1]&&(i[1]=r[1])}return{min:e,max:i}}var n=t("zrender/graphic/Path"),r=t("zrender/core/vector"),a=Math.min,o=Math.max,s=r.min,u=r.max,c=r.scaleAndAdd,l=r.copy,h=[],f=[],d=[];return{Polyline:n[zt]({type:"ec-polyline",shape:{points:[],smooth:0},style:{fill:null,stroke:"#000",smooth:0},buildPath:function(t,n){for(var r=n.points,a=0,o=r[Nt],s=i(r);o>a;)a+=e(t,r,a,o,o,1,s.min,s.max,n.smooth)+1}}),Polygon:n[zt]({type:"ec-polygon",shape:{points:[],stackedOnPoints:[],smooth:0,stackedOnSmooth:0},buildPath:function(t,n){for(var r=n.points,a=n.stackedOnPoints,o=0,s=r[Nt],u=i(r),c=i(a);s>o;){var l=e(t,r,o,s,s,1,u.min,u.max,n.smooth);e(t,a,o+l-1,s,l,-1,c.min,c.max,n.stackedOnSmooth),o+=l+1,t[p]()}}})}}),e("echarts/chart/line/LineView",[qt,Gt,"../helper/SymbolDraw","../helper/Symbol","./lineAnimationDiff","../../util/graphic","./poly","../../view/Chart"],function(t){function e(t,e){if(t[Nt]===e[Nt]){for(var i=0;i<t[Nt];i++){var n=t[i],r=e[i];if(n[0]!==r[0]||n[1]!==r[1])return}return!0}}function r(t){return typeof t===It?t:t?.3:0}function a(t){var e=t.getGlobalExtent();if(t.onBand){var i=t.getBandWidth()/2-1,n=e[1]>e[0]?1:-1;e[0]+=n*i,e[1]-=n*i}return e}function s(t){return t>=0?1:-1}function u(t,e){var i=t.getBaseAxis(),n=t.getOtherAxis(i),r=i.onZero?0:n.scale.getExtent()[0],a=n.dim,o="x"===a||"radius"===a?1:0;return e.mapArray([a],function(n,u){for(var c,l=e.stackedOn;l&&s(l.get(a,u))===s(n);){c=l;break}var h=[];return h[o]=e.get(i.dim,u),h[1-o]=c?c.get(a,u,!0):r,t.dataToPoint(h)},!0)}function c(t,e){return null!=e[S]?e[S]:null!=e.name?t.indexOfName(e.name):void 0}function l(t,e,n){var r=a(t[i]("x")),o=a(t[i]("y")),s=t.getBaseAxis().isHorizontal(),u=r[0],c=o[0],l=r[1]-u,h=o[1]-c;n.get("clipOverflow")||(s?(c-=h,h*=3):(u-=l,l*=3));var f=new x.Rect({shape:{x:u,y:c,width:l,height:h}});return e&&(f.shape[s?"width":mt]=0,x.initProps(f,{shape:{width:l,height:h}},n)),f}function d(t,e,i){var n=t.getAngleAxis(),r=t.getRadiusAxis(),a=r.getExtent(),o=n.getExtent(),s=Math.PI/180,u=new x.Sector({shape:{cx:t.cx,cy:t.cy,r0:a[0],r:a[1],startAngle:-o[0]*s,endAngle:-o[1]*s,clockwise:n.inverse}});return e&&(u.shape.endAngle=-o[0]*s,x.initProps(u,{shape:{endAngle:-o[1]*s}},i)),u}function p(t,e,i){return"polar"===t.type?d(t,e,i):l(t,e,i)}var v=t(Gt),m=t("../helper/SymbolDraw"),g=t("../helper/Symbol"),y=t("./lineAnimationDiff"),x=t("../../util/graphic"),_=t("./poly"),b=t("../../view/Chart");return b[zt]({type:"line",init:function(){var t=new x.Group,e=new m;this.group.add(e.group),this.group.add(t),this._symbolDraw=e,this._lineGroup=t},render:function(t,i,a){var s=t[n],c=this.group,l=t[V](),h=t[ot]("lineStyle.normal"),f=t[ot]("areaStyle.normal"),d=l.mapArray(l.getItemLayout,!0),m="polar"===s.type,g=this._coordSys,y=this._symbolDraw,x=this._polyline,_=this._polygon,b=this._lineGroup,M=t.get(D),S=!f.isEmpty(),C=u(s,l),k=t.get("showSymbol"),z=k&&!m&&!t.get("showAllSymbol")&&this._getSymbolIgnoreFunc(l,s),L=this._data;L&&L[w](function(t,e){t.__temp&&(c[A](t),L.setItemGraphicEl(e,null))}),k||y[A](),x&&g.type===s.type?(M&&b.setClipPath(p(s,!1,t)),k&&y.updateData(l,z),l[w](function(t){t[P](!0)}),e(this._stackedOnPoints,C)&&e(this._points,d)||(M?this._updateAnimation(l,C,s,a):(x.setShape({points:d}),_&&_.setShape({points:d,stackedOnPoints:C}))),c.add(b)):(k&&y.updateData(l,z),x=this._newPolyline(c,d,s,M),S&&(_=this._newPolygon(c,d,C,s,M)),b.setClipPath(p(s,!0,t))),x.setStyle(v[ct](h.getLineStyle(),{stroke:l.getVisual("color"),lineJoin:"bevel"}));var T=t.get("smooth");if(T=r(t.get("smooth")),x.shape.smooth=T,_){var I=_.shape,O=l.stackedOn,B=0;if(_.style[_t]=.7,_.setStyle(v[ct](f.getAreaStyle(),{fill:l.getVisual("color"),lineJoin:"bevel"})),I.smooth=T,O){var R=O[o];B=r(R.get("smooth"))}I.stackedOnSmooth=B}this._data=l,this._coordSys=s,this._stackedOnPoints=C,this._points=d},highlight:function(t,e,i,n){var r=t[V](),a=c(r,n);if(null!=a&&a>=0){var o=r[M](a);if(!o){var s=r.getItemLayout(a);o=new g(r,a,i),o[Q]=s,o.setZ(t.get(h),t.get("z")),o[T]=isNaN(s[0])||isNaN(s[1]),o.__temp=!0,r.setItemGraphicEl(a,o),o.stopSymbolAnimation(!0),this.group.add(o)}o.highlight()}else b[Vt].highlight.call(this,t,e,i,n)},downplay:function(t,e,i,n){var r=t[V](),a=c(r,n);if(null!=a&&a>=0){var o=r[M](a);o&&(o.__temp?(r.setItemGraphicEl(a,null),this.group[A](o)):o.downplay())}else b[Vt].downplay.call(this,t,e,i,n)},_newPolyline:function(t,e){var i=this._polyline;return i&&t[A](i),i=new _.Polyline({shape:{points:e},silent:!0,z2:10}),this._lineGroup.add(i),this._polyline=i,i},_newPolygon:function(t,e,i){var n=this._polygon;return n&&t[A](n),n=new _.Polygon({shape:{points:e,stackedOnPoints:i},silent:!0}),this._lineGroup.add(n),this._polygon=n,n},_getSymbolIgnoreFunc:function(t,e){var i=e.getAxesByScale(G)[0];return i&&i.isLabelIgnored?v.bind(i.isLabelIgnored,i):void 0},_updateAnimation:function(t,e,i,n){var r=this._polyline,a=this._polygon,s=t[o],u=y(this._data,t,this._stackedOnPoints,e,this._coordSys,i);r.shape.points=u.current,x[f](r,{shape:{points:u.next}},s),a&&(a.setShape({points:u.current,stackedOnPoints:u.stackedOnCurrent}),x[f](a,{shape:{points:u.next,stackedOnPoints:u.stackedOnNext}},s));for(var c=[],l=u.status,h=0;h<l[Nt];h++){var d=l[h].cmd;if("="===d){var p=t[M](l[h].idx1);p&&c.push({el:p,ptIdx:h})}}r.animators&&r.animators[Nt]&&r.animators[0].during(function(){for(var t=0;t<c[Nt];t++){var e=c[t].el;e.attr(Q,r.shape.points[c[t].ptIdx])}})},remove:function(t){var e=this.group;e[A](this._lineGroup),this._symbolDraw[A](!0)}})}),e("echarts/visual/symbol",[qt],function(t){return function(t,e,i,n,r){n.eachRawSeriesByType(t,function(t){var r=t[V](),a=t.get("symbol")||e,o=t.get("symbolSize");r[c]({legendSymbol:i||a,symbol:a,symbolSize:o}),n.isSeriesFiltered(t)||(typeof o===Pt&&r.each(function(e){
var i=t[F](e),n=t[E](e);r[u](e,"symbolSize",o(i,n))}),r.each(function(t){var e=r[N](t),i=e.get("symbol",!0),n=e.get("symbolSize",!0);null!=i&&r[u](t,"symbol",i),null!=n&&r[u](t,"symbolSize",n)}))})}}),e("echarts/layout/points",[qt],function(t){return function(t,e,i){e.eachSeriesByType(t,function(t){var e=t[V](),i=t[n],o=i[a];e.each(o,function(t,n,a){var o;o=isNaN(t)||isNaN(n)?[NaN,NaN]:i.dataToPoint([t,n]),e[r](a,o)},!0)})}}),e("echarts/chart/line",[qt,Gt,"../echarts","./line/LineSeries","./line/LineView","../visual/symbol","../layout/points"],function(t){var e=t(Gt),i=t("../echarts");t("./line/LineSeries"),t("./line/LineView"),i.registerVisualCoding("chart",e.curry(t("../visual/symbol"),"line","circle","line")),i.registerLayout(e.curry(t("../layout/points"),"line"))}),e("echarts/scale/Scale",[qt,it],function(t){function e(){this._extent=[1/0,-(1/0)],this._interval=0,this.init&&this.init.apply(this,arguments)}var i=t(it),n=e[Vt];return n[x]=function(t){var e=this._extent;return t>=e[0]&&t<=e[1]},n.normalize=function(t){var e=this._extent;return e[1]===e[0]?.5:(t-e[0])/(e[1]-e[0])},n.scale=function(t){var e=this._extent;return t*(e[1]-e[0])+e[0]},n.unionExtent=function(t){var e=this._extent;t[0]<e[0]&&(e[0]=t[0]),t[1]>e[1]&&(e[1]=t[1])},n.getExtent=function(){return this._extent.slice()},n.setExtent=function(t,e){var i=this._extent;isNaN(t)||(i[0]=t),isNaN(e)||(i[1]=e)},n.getTicksLabels=function(){for(var t=[],e=this.getTicks(),i=0;i<e[Nt];i++)t.push(this.getLabel(e[i]));return t},i[Lt](e),i[kt](e,{registerWhenExtend:!0}),e}),e("echarts/scale/Ordinal",[qt,Gt,"./Scale"],function(t){var e=t(Gt),i=t("./Scale"),n=i[Vt],r=i[zt]({type:"ordinal",init:function(t,e){this._data=t,this._extent=e||[0,t[Nt]-1]},contain:function(t){return n[x].call(this,t)&&null!=this._data[t]},normalize:function(t){return typeof t===Ot&&(t=e[Bt](this._data,t)),n.normalize.call(this,t)},scale:function(t){return Math.round(n.scale.call(this,t))},getTicks:function(){for(var t=[],e=this._extent,i=e[0];i<=e[1];)t.push(i),i++;return t},getLabel:function(t){return this._data[t]},count:function(){return this._extent[1]-this._extent[0]+1},niceTicks:e.noop,niceExtent:e.noop});return r[vt]=function(){return new r},r}),e("echarts/scale/Interval",[qt,"../util/number","../util/format","./Scale"],function(t){var e=t("../util/number"),i=t("../util/format"),n=t("./Scale"),r=Math.floor,a=Math.ceil,o=n[zt]({type:"interval",_interval:0,setExtent:function(t,e){var i=this._extent;isNaN(t)||(i[0]=t),isNaN(e)||(i[1]=e)},unionExtent:function(t){var e=this._extent;t[0]<e[0]&&(e[0]=t[0]),t[1]>e[1]&&(e[1]=t[1]),o[Vt].setExtent.call(this,e[0],e[1])},getInterval:function(){return this._interval||this.niceTicks(),this._interval},setInterval:function(t){this._interval=t,this._niceExtent=this._extent.slice()},getTicks:function(){this._interval||this.niceTicks();var t=this._interval,i=this._extent,n=[],r=1e4;if(t){var a=this._niceExtent;i[0]<a[0]&&n.push(i[0]);for(var o=a[0];o<=a[1];)if(n.push(o),o=e.round(o+t),n[Nt]>r)return[];i[1]>a[1]&&n.push(i[1])}return n},getTicksLabels:function(){for(var t=[],e=this.getTicks(),i=0;i<e[Nt];i++)t.push(this.getLabel(e[i]));return t},getLabel:function(t){return i.addCommas(t)},niceTicks:function(t){t=t||10;var i=this._extent,n=i[1]-i[0];if(!(n===1/0||0>=n)){var o=Math.pow(10,Math.floor(Math.log(n/t)/Math.LN10)),s=t/n*o;.15>=s?o*=10:.3>=s?o*=5:.5>=s?o*=3:.75>=s&&(o*=2);var u=[e.round(a(i[0]/o)*o),e.round(r(i[1]/o)*o)];this._interval=o,this._niceExtent=u}},niceExtent:function(t,i,n){var o=this._extent;if(o[0]===o[1]){var s=o[0]/2||1;o[0]-=s,o[1]+=s}if(o[1]===-(1/0)&&o[0]===1/0)return o[1]=1,o[0]=-1,this._niceExtent=[-1,1],void(this._interval=.5);this.niceTicks(t,i,n);var u=this._interval;i||(o[0]=e.round(r(o[0]/u)*u)),n||(o[1]=e.round(a(o[1]/u)*u))}});return o[vt]=function(){return new o},o}),e("echarts/scale/Time",[qt,Gt,"../util/number","./Interval"],function(t){var e=t(Gt),i=t("../util/number"),n=t("./Interval"),r=n[Vt],a=Math.ceil,o=Math.floor,s=function(t,e,i,n){for(;n>i;){var r=i+n>>>1;t[r][2]<e?i=r+1:n=r}return i},u=function(t){return 10>t?"0"+t:t},c=function(t,e){("week"===t||"month"===t||"quarter"===t||"half-year"===t||"year"===t)&&(t="MM-dd\nyyyy");var n=i.parseDate(e),r=n.getFullYear(),a=n.getMonth()+1,o=n.getDate(),s=n.getHours(),c=n.getMinutes(),l=n.getSeconds();return t=t[tt]("MM",u(a))[K]()[tt]("yyyy",r)[tt]("yy",r%100)[tt]("dd",u(o))[tt]("d",o)[tt]("hh",u(s))[tt]("h",s)[tt]("mm",u(c))[tt]("m",c)[tt]("ss",u(l))[tt]("s",l)},l=n[zt]({type:"time",getLabel:function(t){var e=this._stepLvl,i=new Date(t);return c(e[0],i)},niceTicks:function(t){t=t||10;var e=this._extent,i=e[1]-e[0],n=i/t,r=h[Nt],u=s(h,n,0,r),c=h[Math.min(u,r-1)],l=c[2],f=[a(e[0]/l)*l,o(e[1]/l)*l];this._stepLvl=c,this._interval=l,this._niceExtent=f}});e.each([x,"normalize"],function(t){l[Vt][t]=function(e){return e=+i.parseDate(e),r[t].call(this,e)}});var h=[["hh:mm:ss",1,1e3],["hh:mm:ss",5,5e3],["hh:mm:ss",10,1e4],["hh:mm:ss",15,15e3],["hh:mm:ss",30,3e4],["hh:mm\nMM-dd",1,6e4],["hh:mm\nMM-dd",5,3e5],["hh:mm\nMM-dd",10,6e5],["hh:mm\nMM-dd",15,9e5],["hh:mm\nMM-dd",30,18e5],["hh:mm\nMM-dd",1,36e5],["hh:mm\nMM-dd",2,72e5],["hh:mm\nMM-dd",6,216e5],["hh:mm\nMM-dd",12,432e5],["MM-dd\nyyyy",1,864e5],["week",7,6048e5],["month",1,26784e5],["quarter",3,8208e6],["half-year",6,16416e6],["year",1,32832e6]];return l[vt]=function(){return new l},l}),e("echarts/scale/Log",[qt,Gt,"./Scale","../util/number","./Interval"],function(t){var e=t(Gt),i=t("./Scale"),n=t("../util/number"),r=t("./Interval"),a=i[Vt],o=r[Vt],s=Math.floor,u=Math.ceil,c=Math.pow,l=10,h=Math.log,f=i[zt]({type:"log",getTicks:function(){return e.map(o.getTicks.call(this),function(t){return n.round(c(l,t))})},getLabel:o.getLabel,scale:function(t){return t=a.scale.call(this,t),c(l,t)},setExtent:function(t,e){t=h(t)/h(l),e=h(e)/h(l),o.setExtent.call(this,t,e)},getExtent:function(){var t=a.getExtent.call(this);return t[0]=c(l,t[0]),t[1]=c(l,t[1]),t},unionExtent:function(t){t[0]=h(t[0])/h(l),t[1]=h(t[1])/h(l),a.unionExtent.call(this,t)},niceTicks:function(t){t=t||10;var e=this._extent,i=e[1]-e[0];if(!(i===1/0||0>=i)){var r=c(10,s(h(i/t)/Math.LN10)),a=t/i*r;.5>=a&&(r*=10);var o=[n.round(u(e[0]/r)*r),n.round(s(e[1]/r)*r)];this._interval=r,this._niceExtent=o}},niceExtent:o.niceExtent});return e.each([x,"normalize"],function(t){f[Vt][t]=function(e){return e=h(e)/h(l),a[t].call(this,e)}}),f[vt]=function(){return new f},f}),e("echarts/coord/axisHelper",[qt,"../scale/Ordinal","../scale/Interval","../scale/Time","../scale/Log","../scale/Scale","../util/number",Gt,"zrender/contain/text"],function(t){var e=t("../scale/Ordinal"),i=t("../scale/Interval");t("../scale/Time"),t("../scale/Log");var n=t("../scale/Scale"),r=t("../util/number"),a=t(Gt),o=t("zrender/contain/text"),s={};return s.niceScaleExtent=function(t,e){var i=t.scale;if(i.type!==G){var n=e.get("min"),o=e.get("max"),s=e.get("boundaryGap");a[St](s)||(s=[s||0,s||0]),s[0]=r[J](s[0],1),s[1]=r[J](s[1],1);var u=i.getExtent(),c=u[1]-u[0],l=!0,h=!0;null==n&&(n=u[0]-s[0]*c,l=!1),null==o&&(o=u[1]+s[1]*c,h=!1),"dataMin"===n&&(n=u[0]),"dataMax"===o&&(o=u[1]),i.setExtent(n,o),i.niceExtent(e.get("splitNumber"),l,h);var f=e.get("interval");null!=f&&i.setInterval&&i.setInterval(f)}},s.createScaleByModel=function(t,r){if(r=r||t.get("type"))switch(r){case"category":return new e(t.getCategories(),[1/0,-(1/0)]);case"value":return new i;default:return(n[Ct](r)||i)[vt](t)}},s.ifAxisCrossZero=function(t){var e=t.scale.getExtent(),i=e[0],n=e[1],r=t.model.get("min"),a=t.model.get("max");return isNaN(r)||(i=Math.min(r,i)),isNaN(a)||(n=Math.max(a,n)),!(i>0&&n>0||0>i&&0>n)||s.ifAxisNeedsCrossZero(t)},s.ifAxisNeedsCrossZero=function(t){return!t.model.get("scale")},s.getAxisLabelInterval=function(t,e,i,n){for(var r,a=0,s=0,u=0;u<t[Nt];u++){var c=t[u],l=o[rt](e[u],i,ht,"top");l[n?"x":"y"]+=c,l[n?"width":mt]*=1.5,r?r.intersect(l)?(s++,a=Math.max(a,s)):(r.union(l),s=0):r=l.clone()}return a},s.getFormattedLabels=function(t,e){var i=t.scale,n=i.getTicksLabels(),r=i.getTicks();return typeof e===Ot?(e=function(t){return function(e){return t[tt]("{value}",e)}}(e),a.map(n,e)):typeof e===Pt?a.map(r,function(n,r){return e("category"===t.type?i.getLabel(n):n,r)},this):n},s}),e("echarts/coord/cartesian/Cartesian",[qt,Gt],function(t){function e(t){return this._axes[t]}var i=t(Gt),n=function(t){this._axes={},this._dimList=[],this.name=t||""};return n[Vt]={constructor:n,type:"cartesian",getAxis:function(t){return this._axes[t]},getAxes:function(){return i.map(this._dimList,e,this)},getAxesByScale:function(t){return t=t[K](),i[Ft](this.getAxes(),function(e){return e.scale.type===t})},addAxis:function(t){var e=t.dim;this._axes[e]=t,this._dimList.push(e)},dataToCoord:function(t){return this._dataCoordConvert(t,"dataToCoord")},coordToData:function(t){return this._dataCoordConvert(t,"coordToData")},_dataCoordConvert:function(t,e){for(var i=this._dimList,n=t instanceof Array?[]:{},r=0;r<i[Nt];r++){var a=i[r],o=this._axes[a];n[a]=o[e](t[a])}return n}},n}),e("echarts/coord/cartesian/Cartesian2D",[qt,Gt,"./Cartesian"],function(t){function e(t){r.call(this,t),this[a]=["x","y"]}var n=t(Gt),r=t("./Cartesian");return e[Vt]={constructor:e,type:"cartesian2d",getBaseAxis:function(){return this.getAxesByScale(G)[0]||this.getAxesByScale("time")[0]||this[i]("x")},containPoint:function(t){var e=this[i]("x"),n=this[i]("y");return e[x](e.toLocalCoord(t[0]))&&n[x](n.toLocalCoord(t[1]))},containData:function(t){return this[i]("x").containData(t[0])&&this[i]("y").containData(t[1])},dataToPoints:function(t,e){return t.mapArray(["x","y"],function(t,e){return this.dataToPoint([t,e])},e,this)},dataToPoint:function(t,e){var n=this[i]("x"),r=this[i]("y");return[n.toGlobalCoord(n.dataToCoord(t[0],e)),r.toGlobalCoord(r.dataToCoord(t[1],e))]},pointToData:function(t,e){var n=this[i]("x"),r=this[i]("y");return[n.coordToData(n.toLocalCoord(t[0]),e),r.coordToData(r.toLocalCoord(t[1]),e)]},getOtherAxis:function(t){return this[i]("x"===t.dim?"y":"x")}},n[At](e,r),e}),e("echarts/coord/Axis",[qt,"../util/number",Gt],function(t){function e(t,e){var i=t[1]-t[0],n=e,r=i/n/2;t[0]+=r,t[1]-=r}var i=t("../util/number"),n=i.linearMap,r=t(Gt),a=function(t,e,i){this.dim=t,this.scale=e,this._extent=i||[0,0],this.inverse=!1,this.onBand=!1};return a[Vt]={constructor:a,contain:function(t){var e=this._extent,i=Math.min(e[0],e[1]),n=Math.max(e[0],e[1]);return t>=i&&n>=t},containData:function(t){return this[x](this.dataToCoord(t))},getExtent:function(){var t=this._extent.slice();return t},getPixelPrecision:function(t){return i.getPixelPrecision(t||this.scale.getExtent(),this._extent)},setExtent:function(t,e){var i=this._extent;i[0]=t,i[1]=e},dataToCoord:function(t,i){t=this.scale.normalize(t);var r=this.getExtent(),a=this.scale;return this.onBand&&a.type===G&&e(r,a.count()),n(t,[0,1],r,i)},coordToData:function(t,i){var r=this.getExtent();this.onBand&&e(r,this.scale.count());var a=n(t,r,[0,1],i);return this.scale.scale(a)},getTicksCoords:function(){if(this.onBand){for(var t=this.getBands(),e=[],i=0;i<t[Nt];i++)e.push(t[i][0]);return t[i-1]&&e.push(t[i-1][1]),e}return r.map(this.scale.getTicks(),this.dataToCoord,this)},getLabelsCoords:function(){if(this.onBand){for(var t,e=this.getBands(),i=[],n=0;n<e[Nt];n++)t=e[n],i.push((t[0]+t[1])/2);return i}return r.map(this.scale.getTicks(),this.dataToCoord,this)},getBands:function(){for(var t=this.getExtent(),e=[],i=this.scale.count(),n=t[0],r=t[1],a=r-n,o=0;i>o;o++)e.push([a*o/i+n,a*(o+1)/i+n]);return e},getBandWidth:function(){var t=this._extent,e=this.scale.getExtent(),i=e[1]-e[0]+(this.onBand?1:0),n=Math.abs(t[1]-t[0]);return Math.abs(n)/i}},a}),e("echarts/coord/cartesian/axisLabelInterval",[qt,Gt,"../axisHelper"],function(t){var e=t(Gt),i=t("../axisHelper");return function(t){var n=t.model,r=n[ot]("axisLabel"),a=r.get("interval");return"category"!==t.type||"auto"!==a?"auto"===a?0:a:i.getAxisLabelInterval(e.map(t.scale.getTicks(),t.dataToCoord,t),n.getFormattedLabels(),r[ot](at)[nt](),t.isHorizontal())}}),e("echarts/coord/cartesian/Axis2D",[qt,Gt,"../Axis","./axisLabelInterval"],function(t){var e=t(Gt),i=t("../Axis"),n=t("./axisLabelInterval"),r=function(t,e,n,r,a){i.call(this,t,e,n),this.type=r||"value",this[Q]=a||dt};return r[Vt]={constructor:r,index:0,onZero:!1,model:null,isHorizontal:function(){var t=this[Q];return"top"===t||t===dt},getGlobalExtent:function(){var t=this.getExtent();return t[0]=this.toGlobalCoord(t[0]),t[1]=this.toGlobalCoord(t[1]),t},getLabelInterval:function(){var t=this._labelInterval;return t||(t=this._labelInterval=n(this)),t},isLabelIgnored:function(t){if("category"===this.type){var e=this.getLabelInterval();return typeof e===Pt&&!e(t,this.scale.getLabel(t))||t%(e+1)}},toLocalCoord:null,toGlobalCoord:null},e[At](r,i),r}),e("echarts/coord/axisDefault",[qt,Gt],function(t){var e=t(Gt),i={show:!0,zlevel:0,z:0,inverse:!1,name:"",nameLocation:"end",nameTextStyle:{},nameGap:15,axisLine:{show:!0,onZero:!0,lineStyle:{color:"#333",width:1,type:"solid"}},axisTick:{show:!0,inside:!1,length:5,lineStyle:{color:"#333",width:1}},axisLabel:{show:!0,inside:!1,rotate:0,margin:8,textStyle:{color:"#333",fontSize:12}},splitLine:{show:!0,lineStyle:{color:["#ccc"],width:1,type:"solid"}},splitArea:{show:!1,areaStyle:{color:["rgba(250,250,250,0.3)","rgba(200,200,200,0.3)"]}}},n=e.merge({boundaryGap:!0,axisTick:{interval:"auto"},axisLabel:{interval:"auto"}},i),r=e[ct]({boundaryGap:[0,0],splitNumber:5},i),a=e[ct]({scale:!0,min:"dataMin",max:"dataMax"},r),o=e[ct]({},r);return o.scale=!0,{categoryAxis:n,valueAxis:r,timeAxis:a,logAxis:o}}),e("echarts/coord/axisModelCreator",[qt,"./axisDefault",Gt,"../model/Component"],function(t){var e=t("./axisDefault"),i=t(Gt),n=t("../model/Component"),r=["value","category","time","log"];return function(t,a,o,s){i.each(r,function(n){a[zt]({type:t+"Axis."+n,mergeDefaultAndTheme:function(e,r){var a=r.getTheme();i.merge(e,a.get(n+"Axis")),i.merge(e,this.getDefaultOption()),e.type=o(t,e)},defaultOption:i.mergeAll([{},e[n+"Axis"],s],!0)})}),n.registerSubTypeDefaulter(t+"Axis",i.curry(o,t))}}),e("echarts/coord/axisModelCommonMixin",[qt,Gt,"./axisHelper"],function(t){function e(t){return r[$](t)&&null!=t.value?t.value:t}function i(){return"category"===this.get("type")&&r.map(this.get("data"),e)}function n(){return a.getFormattedLabels(this.axis,this.get("axisLabel.formatter"))}var r=t(Gt),a=t("./axisHelper");return{getFormattedLabels:n,getCategories:i}}),e("echarts/coord/cartesian/AxisModel",[qt,"../../model/Component",Gt,"../axisModelCreator","../axisModelCommonMixin"],function(t){function e(t,e){return e.type||(e.data?"category":"value")}var i=t("../../model/Component"),n=t(Gt),r=t("../axisModelCreator"),a=i[zt]({type:"cartesian2dAxis",axis:null,setNeedsCrossZero:function(t){this[et].scale=!t},setMin:function(t){this[et].min=t},setMax:function(t){this[et].max=t}});n.merge(a[Vt],t("../axisModelCommonMixin"));var o={gridIndex:0};return r("x",a,e,o),r("y",a,e,o),a}),e("echarts/coord/cartesian/GridModel",[qt,"./AxisModel","../../model/Component"],function(t){t("./AxisModel");var e=t("../../model/Component");return e[zt]({type:"grid",dependencies:["xAxis","yAxis"],layoutMode:"box",coordinateSystem:null,defaultOption:{show:!1,zlevel:0,z:0,left:"10%",top:60,right:"10%",bottom:60,containLabel:!1,backgroundColor:"rgba(0,0,0,0)",borderWidth:1,borderColor:"#ccc"}})}),e("echarts/coord/cartesian/Grid",[qt,"exports","module","../../util/layout","../../coord/axisHelper",Gt,"./Cartesian2D","./Axis2D","./GridModel","../../CoordinateSystem"],function(t,e){function r(t,e,i){return i[Z]("grid",t.get("gridIndex"))===e}function a(t){for(var e,i=t.model,n=i.getFormattedLabels(),r=0;r<n[Nt];r++)if(!t.isLabelIgnored(r)){var a=i.getTextRect(n[r]);e?e.union(a):e=a}return e}function o(t,e,i){this._coordsMap={},this._coordsList=[],this._axesMap={},this._axesList=[],this._initCartesian(t,e,i)}function s(t,e){var i=t.getExtent(),n=i[0]+i[1];t.toGlobalCoord="x"===t.dim?function(t){return t+e}:function(t){return n-t+e},t.toLocalCoord="x"===t.dim?function(t){return t-e}:function(t){return n-t+e}}var u=t("../../util/layout"),c=t("../../coord/axisHelper"),l=t(Gt),h=t("./Cartesian2D"),f=t("./Axis2D"),d=l.each,p=c.ifAxisCrossZero,v=c.ifAxisNeedsCrossZero,m=c.niceScaleExtent;t("./GridModel");var g=o[Vt];return g.type="grid",g.getRect=function(){return this._rect},g.resize=function(t,e){function i(){d(r,function(t){var e=t.isHorizontal(),i=e?[0,n.width]:[0,n[mt]],r=t.inverse?1:0;t.setExtent(i[r],i[1-r]),s(t,e?n.x:n.y)})}var n=u.getLayoutRect(t.getBoxLayoutParams(),{width:e[X](),height:e[j]()});this._rect=n;var r=this._axesList;i(),t.get("containLabel")&&(d(r,function(t){if(!t.model.get("axisLabel.inside")){var e=a(t);if(e){var i=t.isHorizontal()?mt:"width",r=t.model.get("axisLabel.margin");n[i]-=e[i]+r,"top"===t[Q]?n.y+=e[mt]+r:"left"===t[Q]&&(n.x+=e.width+r)}}}),i())},g[i]=function(t,e){if(null!=e){var i=t+e;return this._axesMap[i]}for(var n=this._axesList,r=0;r<n[Nt];r++)if(n[r].dim===t)return n[r]},g.getCartesian=function(t,e){var i="x"+t+"y"+e;return this._coordsMap[i]},g._initCartesian=function(t,e,i){function n(t){var e=s[t];return e[0]&&("category"===e[0].type||!p(e[0]))||e[1]&&("category"===e[1].type||!p(e[1]))}function a(i){return function(n,a){if(r(n,t,e)){var l=n.get(Q);"x"===i?("top"!==l&&l!==dt&&(l=dt),o[l]&&(l="top"===l?dt:"top")):("left"!==l&&"right"!==l&&(l="left"),o[l]&&(l="left"===l?"right":"left")),o[l]=!0;var h=new f(i,c.createScaleByModel(n),[0,0],n.get("type"),l),d="category"===h.type;h.onBand=d&&n.get("boundaryGap"),h.inverse=n.get("inverse"),h.onZero=n.get("axisLine.onZero"),n.axis=h,h.model=n,h.index=a,this._axesList.push(h),this._axesMap[i+a]=h,s[i][a]=h,u[i]++}}}var o={left:!1,right:!1,top:!1,bottom:!1},s={x:{},y:{}},u={x:0,y:0};return e.eachComponent("xAxis",a("x"),this),e.eachComponent("yAxis",a("y"),this),u.x&&u.y?(d(s.x,function(t,e){d(s.y,function(i,n){var r="x"+e+"y"+n,a=new h(r);a.grid=this,this._coordsMap[r]=a,this._coordsList.push(a),a.addAxis(t),a.addAxis(i)},this)},this),this._updateCartesianFromSeries(e,t),d(s.x,function(t){n("y")&&(t.onZero=!1),v(t)&&t.scale.unionExtent([0,0]),m(t,t.model)},this),void d(s.y,function(t){n("x")&&(t.onZero=!1),v(t)&&t.scale.unionExtent([0,0]),m(t,t.model)},this)):(this._axesMap={},void(this._axesList=[]))},g._updateCartesianFromSeries=function(t,e){function a(t,e,i,n){d(n.getDimensionsOnAxis(i),function(i){e.scale.unionExtent(t.getDataExtent(i,e.scale.type!==G))})}t.eachSeries(function(o){if("cartesian2d"===o.get(n)){var s=o.get("xAxisIndex"),u=o.get("yAxisIndex"),c=t[Z]("xAxis",s),l=t[Z]("yAxis",u);if(!r(c,e,t)||!r(l,e,t))return;var h=this.getCartesian(s,u),f=o[V]();"list"===f.type&&(a(f,h[i]("x"),"x",o),a(f,h[i]("y"),"y",o))}},this)},o[vt]=function(t,e){var i=[];return t.eachComponent("grid",function(r,a){var s=new o(r,t,e);s.name="grid_"+a,s.resize(r,e),r[n]=s,i.push(s)}),t.eachSeries(function(e){if("cartesian2d"===e.get(n)){var r=e.get("xAxisIndex"),a=t[Z]("xAxis",r),o=i[a.get("gridIndex")];e[n]=o.getCartesian(r,e.get("yAxisIndex"))}}),i},t("../../CoordinateSystem").register("grid",o),o}),e("echarts/chart/bar/BarSeries",[qt,"../../model/Series","../helper/createListFromArray"],function(t){var e=t("../../model/Series"),i=t("../helper/createListFromArray");return e[zt]({type:"series.bar",dependencies:["grid","polar"],getInitialData:function(t,e){return i(t.data,this,e)},defaultOption:{zlevel:0,z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,xAxisIndex:0,yAxisIndex:0,barMinHeight:0,barGap:"30%",barCategoryGap:"20%",itemStyle:{normal:{barBorderColor:"#fff",barBorderWidth:0},emphasis:{barBorderColor:"#fff",barBorderWidth:0}}}})}),e("echarts/chart/bar/barItemStyle",[qt,"../../model/mixin/makeStyleMapper"],function(t){return{getBarItemStyle:t("../../model/mixin/makeStyleMapper")([["fill","color"],[bt,"barBorderColor"],[wt,"barBorderWidth"],[_t],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"]])}}),e("echarts/chart/bar/BarView",[qt,Gt,"../../util/graphic","../../model/Model","./barItemStyle","../../echarts"],function(t){function e(t,e){var i=t.width>0?1:-1,n=t[mt]>0?1:-1;t.x+=i*e/2,t.y+=n*e/2,t.width-=i*e,t[mt]-=n*e}var i=t(Gt),r=t("../../util/graphic");return i[zt](t("../../model/Model")[Vt],t("./barItemStyle")),t("../../echarts").extendChartView({type:"bar",render:function(t,e,i){var r=t.get(n);return"cartesian2d"===r&&this._renderOnCartesian(t,e,i),this.group},_renderOnCartesian:function(t,a,o){function u(n,a){var o=h.getItemLayout(n),s=h[N](n).get(y)||0;e(o,s);var u=new r.Rect({shape:i[zt]({},o)});if(g){var c=u.shape,l=m?mt:"width",d={};c[l]=0,d[l]=o[l],r[a?f:"initProps"](u,{shape:d},t)}return u}var c=this.group,h=t[V](),d=this._data,p=t[n],v=p.getBaseAxis(),m=v.isHorizontal(),g=t.get(D),y=[s,H,"barBorderWidth"];h.diff(d).add(function(t){if(h.hasValue(t)){var e=u(t);h.setItemGraphicEl(t,e),c.add(e)}})[l](function(i,n){var a=d[M](n);if(!h.hasValue(i))return void c[A](a);a||(a=u(i,!0));var o=h.getItemLayout(i),s=h[N](i).get(y)||0;e(o,s),r[f](a,{shape:o},t),h.setItemGraphicEl(i,a),c.add(a)})[A](function(e){var i=d[M](e);i&&(i.style.text="",r[f](i,{shape:{width:0}},t,function(){c[A](i)}))}).execute(),this._updateStyle(t,h,m),this._data=h},_updateStyle:function(t,e,n){function a(t,e,i,n,a){r.setText(t,e,i),t.text=n,"outside"===t.textPosition&&(t.textPosition=a)}e[w](function(o,s){var u=e[N](s),c=u[ot]("label.normal"),l=e.getItemVisual(s,"color"),h=e.getItemLayout(s),f=u[ot]("itemStyle.emphasis").getItemStyle();o.setStyle(i[ct]({fill:l},u[ot]("itemStyle.normal").getBarItemStyle()));var d=n?h[mt]>0?dt:"top":h.width>0?"left":"right",c=u[ot]("label.normal"),p=u[ot]("label.emphasis"),v=o.style;c.get("show")?a(v,c,l,t.getFormattedLabel(s,H)||t[F](s),d):v.text="",p.get("show")?a(f,p,l,t.getFormattedLabel(s,W)||t[F](s),d):f.text="",r.setHoverStyle(o,f)})},remove:function(t,e){var i=this.group;t.get(D)?this._data&&this._data[w](function(e){e.style.text="",r[f](e,{shape:{width:0}},t,function(){i[A](e)})}):i.removeAll()}})}),e("echarts/layout/barGrid",[qt,Gt,"../util/number"],function(t){function e(t){return t.get("stack")||"__ec_stack_"+t[q]}function i(t,i){var r={};o.each(t,function(t,i){var a=t[n],o=a.getBaseAxis(),s=r[o.index]||{remainedWidth:o.getBandWidth(),autoWidthCount:0,categoryGap:"20%",gap:"30%",axis:o,stacks:{}},u=s.stacks;r[o.index]=s;var c=e(t);u[c]||s.autoWidthCount++,u[c]=u[c]||{width:0,maxWidth:0};var l=t.get("barWidth"),h=t.get("barMaxWidth"),f=t.get("barGap"),d=t.get("barCategoryGap");l&&!u[c].width&&(l=Math.min(s.remainedWidth,l),u[c].width=l,s.remainedWidth-=l),h&&(u[c].maxWidth=h),null!=f&&(s.gap=f),null!=d&&(s.categoryGap=d)});var a={};return o.each(r,function(t,e){a[e]={};var i=t.stacks,n=t.axis,r=n.getBandWidth(),s=u(t.categoryGap,r),c=u(t.gap,1),l=t.remainedWidth,h=t.autoWidthCount,f=(l-s)/(h+(h-1)*c);f=Math.max(f,0),o.each(i,function(t,e){var i=t.maxWidth;!t.width&&i&&f>i&&(i=Math.min(i,l),l-=i,t.width=i,h--)}),f=(l-s)/(h+(h-1)*c),f=Math.max(f,0);var d,p=0;o.each(i,function(t,e){t.width||(t.width=f),d=t,p+=t.width*(1+c)}),d&&(p-=d.width*c);var v=-p/2;o.each(i,function(t,i){a[e][i]=a[e][i]||{offset:v,width:t.width},v+=t.width*(1+c)})}),a}function a(t,a,s){var u=i(o[Ft](a.getSeriesByType(t),function(t){return!a.isSeriesFiltered(t)&&t[n]&&"cartesian2d"===t[n].type})),c={};a.eachSeriesByType(t,function(t){var i=t[V](),a=t[n],o=a.getBaseAxis(),s=e(t),l=u[o.index][s],h=l.offset,f=l.width,d=a.getOtherAxis(o),p=t.get("barMinHeight")||0,v=o.onZero?d.toGlobalCoord(d.dataToCoord(0)):d.getGlobalExtent()[0],m=a.dataToPoints(i,!0);c[s]=c[s]||[],i.each(d.dim,function(t,e){if(!isNaN(t)){c[s][e]||(c[s][e]={p:v,n:v});var n,a,o,u,l=t>=0?"p":"n",g=m[e],y=c[s][e][l];d.isHorizontal()?(n=y,a=g[1]+h,o=g[0]-y,u=f,Math.abs(o)<p&&(o=(0>o?-1:1)*p),c[s][e][l]+=o):(n=g[0]+h,a=y,o=f,u=g[1]-y,Math.abs(u)<p&&(u=(0>=u?-1:1)*p),c[s][e][l]+=u),i[r](e,{x:n,y:a,width:o,height:u})}},!0)},this)}var o=t(Gt),s=t("../util/number"),u=s[J];return a}),e("echarts/chart/bar",[qt,Gt,"../coord/cartesian/Grid","./bar/BarSeries","./bar/BarView","../layout/barGrid","../echarts"],function(t){var e=t(Gt);t("../coord/cartesian/Grid"),t("./bar/BarSeries"),t("./bar/BarView");var i=t("../layout/barGrid"),n=t("../echarts");n.registerLayout(e.curry(i,"bar")),n.registerVisualCoding("chart",function(t){t.eachSeriesByType("bar",function(t){var e=t[V]();e[c]("legendSymbol","roundRect")})})}),e("echarts/component/axis/AxisBuilder",[qt,Gt,"../../util/graphic","../../model/Model","../../util/number"],function(t){function e(t,e,i){var n,r,a=s(e-t[R]);return u(a)?(r=i>0?"top":dt,n=ht):u(a-c)?(r=i>0?dt:"top",n=ht):(r=ft,n=a>0&&c>a?i>0?"right":"left":i>0?"left":"right"),{rotation:a,textAlign:n,textBaseline:r}}function i(t,e,i){var n,r,a=s(-t[R]),o=i[0]>i[1],l="start"===e&&!o||"start"!==e&&o;return u(a-c/2)?(r=l?dt:"top",n=ht):u(a-1.5*c)?(r=l?"top":dt,n=ht):(r=ft,n=1.5*c>a&&a>c/2?l?"left":"right":l?"right":"left"),{rotation:a,textAlign:n,textBaseline:r}}var n=t(Gt),r=t("../../util/graphic"),a=t("../../model/Model"),o=t("../../util/number"),s=o.remRadian,u=o.isRadianAroundZero,c=Math.PI,l=function(t,e){this.opt=e,this.axisModel=t,n[ct](e,{labelOffset:0,nameDirection:1,tickDirection:1,labelDirection:1,silent:!0}),this.group=new r.Group({position:e[Q].slice(),rotation:e[R]})};l[Vt]={constructor:l,hasBuilder:function(t){return!!h[t]},add:function(t){h[t].call(this)},getGroup:function(){return this.group}};var h={axisLine:function(){var t=this.opt,e=this.axisModel;if(e.get("axisLine.show")){var i=this.axisModel.axis.getExtent();this.group.add(new r.Line({shape:{x1:i[0],y1:0,x2:i[1],y2:0},style:n[zt]({lineCap:"round"},e[ot]("axisLine.lineStyle").getLineStyle()),strokeContainThreshold:t.strokeContainThreshold,silent:!!t.silent,z2:1}))}},axisTick:function(){var t=this.axisModel;if(t.get("axisTick.show")){for(var e=t.axis,i=t[ot]("axisTick"),n=this.opt,a=i[ot]("lineStyle"),o=i.get(Nt),s=d(i,n.labelInterval),u=e.getTicksCoords(),c=[],l=0;l<u[Nt];l++)if(!f(e,l,s)){var h=u[l];c.push(new r.Line(r.subPixelOptimizeLine({shape:{x1:h,y1:0,x2:h,y2:n.tickDirection*o},style:{lineWidth:a.get("width")},silent:!0})))}this.group.add(r.mergePath(c,{style:a.getLineStyle(),silent:!0}))}},axisLabel:function(){function t(t,e){var i=t&&t[rt]().clone(),n=e&&e[rt]().clone();return i&&n?(i[gt](t[I]()),n[gt](e[I]()),i.intersect(n)):void 0}var i=this.axisModel;if(i.get("axisLabel.show")){var n=this.opt,o=i.axis,s=i[ot]("axisLabel"),u=s[ot](at),l=s.get("margin"),h=o.scale.getTicks(),d=i.getFormattedLabels(),p=n.labelRotation;null==p&&(p=s.get("rotate")||0),p=p*c/180;for(var v=e(n,p,n.labelDirection),m=i.get("data"),g=[],y=0;y<h[Nt];y++)if(!f(o,y,n.labelInterval)){var x=u;m&&m[y]&&m[y][at]&&(x=new a(m[y][at],u,i[st]));var w=o.dataToCoord(h[y]),M=[w,n.labelOffset+n.labelDirection*l],S=new r.Text({style:{text:d[y],textAlign:x.get("align",!0)||v[b],textBaseline:x.get("baseline",!0)||v[_],textFont:x[nt](),fill:x.getTextColor()},position:M,rotation:v[R],silent:!0,z2:10});g.push(S),this.group.add(S)}if("category"!==o.type){if(i.get("min")){var C=g[0],k=g[1];t(C,k)&&(C[T]=!0)}if(i.get("max")){var A=g[g[Nt]-1],z=g[g[Nt]-2];t(z,A)&&(A[T]=!0)}}}},axisName:function(){var t=this.opt,n=this.axisModel,a=this.opt.axisName;if(null==a&&(a=n.get("name")),a){var o,s=n.get("nameLocation"),u=t.nameDirection,c=n[ot]("nameTextStyle"),l=n.get("nameGap")||0,h=this.axisModel.axis.getExtent(),f=h[0]>h[1]?-1:1,d=["start"===s?h[0]-f*l:"end"===s?h[1]+f*l:(h[0]+h[1])/2,s===ft?t.labelOffset+u*l:0];o=s===ft?e(t,t[R],u):i(t,s,h),this.group.add(new r.Text({style:{text:a,textFont:c[nt](),fill:c.getTextColor()||n.get("axisLine.lineStyle.color"),textAlign:o[b],textBaseline:o[_]},position:d,rotation:o[R],silent:!0,z2:1}))}}},f=l.ifIgnoreOnTick=function(t,e,i){return t.scale.type===G&&typeof i===Pt&&!i(e,t.scale.getLabel(e))||e%(i+1)},d=l.getInterval=function(t,e){var i=t.get("interval");return(null==i||"auto"==i)&&(i=e),i};return l}),e("echarts/component/axis/AxisView",[qt,Gt,"../../util/graphic","./AxisBuilder","../../echarts"],function(t){function e(t,e){function r(t,e){var n=a[i](t);return n.toGlobalCoord(n.dataToCoord(0))}var a=t[n],o=e.axis,s={},u=o[Q],c=o.onZero?"onZero":u,l=o.dim,h=a.getRect(),f=[h.x,h.x+h.width,h.y,h.y+h[mt]],d={x:{top:f[2],bottom:f[3]},y:{left:f[0],right:f[1]}};d.x.onZero=Math.max(Math.min(r("y"),d.x[dt]),d.x.top),d.y.onZero=Math.max(Math.min(r("x"),d.y.right),d.y.left),s[Q]=["y"===l?d.y[c]:f[0],"x"===l?d.x[c]:f[3]];var p={x:0,y:1};s[R]=Math.PI/2*p[l];var v={top:-1,bottom:1,left:-1,right:1};s.labelDirection=s.tickDirection=s.nameDirection=v[u],o.onZero&&(s.labelOffset=d[l][u]-d[l].onZero),e[ot]("axisTick").get(lt)&&(s.tickDirection=-s.tickDirection),e[ot]("axisLabel").get(lt)&&(s.labelDirection=-s.labelDirection);var m=e[ot]("axisLabel").get("rotate");return s.labelRotation="top"===c?-m:m,s.labelInterval=o.getLabelInterval(),s.z2=1,s}var r=t(Gt),a=t("../../util/graphic"),o=t("./AxisBuilder"),s=o.ifIgnoreOnTick,u=o.getInterval,c=["axisLine","axisLabel","axisTick","axisName"],l=["splitLine","splitArea"],h=t("../../echarts").extendComponentView({type:"axis",render:function(t,i){if(this.group.removeAll(),t.get("show")){var n=i[Z]("grid",t.get("gridIndex")),a=e(n,t),s=new o(t,a);r.each(c,s.add,s),this.group.add(s.getGroup()),r.each(l,function(e){t.get(e+".show")&&this["_"+e](t,n,a.labelInterval)},this)}},_splitLine:function(t,e,i){var r=t.axis,o=t[ot]("splitLine"),c=o[ot]("lineStyle"),l=c.get("width"),h=c.get("color"),f=u(o,i);h=h instanceof Array?h:[h];for(var d=e[n].getRect(),p=r.isHorizontal(),v=[],m=0,g=r.getTicksCoords(),y=[],x=[],_=0;_<g[Nt];_++)if(!s(r,_,f)){var b=r.toGlobalCoord(g[_]);p?(y[0]=b,y[1]=d.y,x[0]=b,x[1]=d.y+d[mt]):(y[0]=d.x,y[1]=b,x[0]=d.x+d.width,x[1]=b);var w=m++%h[Nt];v[w]=v[w]||[],v[w].push(new a.Line(a.subPixelOptimizeLine({shape:{x1:y[0],y1:y[1],x2:x[0],y2:x[1]},style:{lineWidth:l},silent:!0})))}for(var _=0;_<v[Nt];_++)this.group.add(a.mergePath(v[_],{style:{stroke:h[_%h[Nt]],lineDash:c.getLineDash(),lineWidth:l},silent:!0}))},_splitArea:function(t,e,i){var r=t.axis,o=t[ot]("splitArea"),c=o.get("areaStyle.color"),l=e[n].getRect(),h=r.getTicksCoords(),f=h[0],d=h[0],p=[],v=0,m=u(o,i);c=c instanceof Array?c:[c];for(var g=1;g<h[Nt];g++)if(!s(r,g,m)){var y,x,_,b,w=r.toGlobalCoord(h[g]);r.isHorizontal()?(y=f,x=l.y,_=w-y,b=l[mt]):(y=l.x,x=d,_=l.width,b=w-x);var M=v++%c[Nt];p[M]=p[M]||[],p[M].push(new a.Rect({shape:{x:y,y:x,width:_,height:b},silent:!0})),f=y+_,d=x+b}for(var g=0;g<p[Nt];g++)this.group.add(a.mergePath(p[g],{style:{fill:c[g%c[Nt]]},silent:!0}))}});h[zt]({type:"xAxis"}),h[zt]({type:"yAxis"})}),e("echarts/component/axis",[qt,"../coord/cartesian/AxisModel","./axis/AxisView"],function(t){t("../coord/cartesian/AxisModel"),t("./axis/AxisView")}),e("echarts/component/grid",[qt,"../util/graphic",Gt,"../coord/cartesian/Grid","./axis","../echarts"],function(t){var e=t("../util/graphic"),i=t(Gt);t("../coord/cartesian/Grid"),t("./axis"),t("../echarts").extendComponentView({type:"grid",render:function(t,r){this.group.removeAll(),t.get("show")&&this.group.add(new e.Rect({shape:t[n].getRect(),style:i[ct]({fill:t.get("backgroundColor")},t.getItemStyle()),silent:!0}))}})}),e("echarts/component/marker/MarkPointModel",[qt,"../../model/globalDefault","../../util/model","../../echarts"],function(t){var e=t("../../model/globalDefault"),i=t("../../util/model");e.markPoint={};var n=t("../../echarts").extendComponentModel({type:"markPoint",dependencies:["series","grid","polar"],init:function(t,e,i,n,r){this.mergeDefaultAndTheme(t,i),this.mergeOption(t,r,!0)},mergeOption:function(t,e,r){if(!e){var a=this[st];a.eachSeries(function(t){var e=t.get("markPoint"),o=t.markPointModel;if(!e||!e.data)return void(t.markPointModel=null);if(o)o.mergeOption(e,!0);else{r&&i.defaultEmphasis(e.label,[Q,"show",at,yt,"formatter"]);var s={seriesIndex:t[q],name:t.name};o=new n(e,this,a,s,!0)}t.markPointModel=o},this)}},defaultOption:{zlevel:0,z:5,symbol:"pin",symbolSize:50,tooltip:{trigger:"item"},label:{normal:{show:!0,position:"inside"},emphasis:{
show:!0}},itemStyle:{normal:{borderWidth:2},emphasis:{}}}});return n}),e("echarts/component/marker/markerHelper",[qt,Gt,"../../util/number"],function(t){function e(t,e,i){var n=-1;do n=Math.max(o.getPrecision(t.get(e,i)),n),t=t.stackedOn;while(t);return n}function n(t,i,n,r,a){var o=i.getDataExtent(r),s=[],u=o[0],c=o[1],l=(c-u)*t+u,h=i.indexOfNearest(r,l);s[1-a]=i.get(n,h),s[a]=i.get(r,h,!0);var f=e(i,r,h);return f>=0&&(s[a]=+s[a].toFixed(f)),s}var r=t(Gt),o=t("../../util/number"),s=r.curry,u={min:s(n,0),max:s(n,1),average:s(n,.5)},c=function(t,e,n){if((isNaN(n.x)||isNaN(n.y))&&!r[St](n.coord)&&e){var o,s,c,l;null!=n.valueIndex?(o=e[a][n.valueIndex],s=e[a][1-n.valueIndex],c=e[i](o),l=e[i](s)):(l=e.getBaseAxis(),c=e.getOtherAxis(l),s=l.dim,o=c.dim);var h=null!=n.valueIndex?n.valueIndex:"angle"===o||"x"===o?0:1;n=r[zt]({},n),n.type&&u[n.type]&&l&&c?n.coord=u[n.type](t,l.dim,o,h):n.coord=[null!=n.xAxis?n.xAxis:n.radiusAxis,null!=n.yAxis?n.yAxis:n.angleAxis]}return n},l=function(t,e){return t&&e.coord&&(null==e.x||null==e.y)?t.containData(e.coord):!0},h=function(t,e,i,n){return 2>n?t.coord&&t.coord[n]:void t.value};return{dataTransform:c,dataFilter:l,dimValueGetter:h}}),e("echarts/component/marker/MarkPointView",[qt,"../../chart/helper/SymbolDraw",Gt,"../../util/format","../../util/model","../../util/number","../../data/List","./markerHelper","../../echarts"],function(t){function e(t,e,i){var n=e[a],r=new p(s.map(n,e.getDimensionInfo,e),i);return t&&r.initData(s[Ft](s.map(i.get("data"),s.curry(v.dataTransform,e,t)),s.curry(v.dataFilter,t)),null,v.dimValueGetter),r}var i=t("../../chart/helper/SymbolDraw"),s=t(Gt),c=t("../../util/format"),l=t("../../util/model"),h=t("../../util/number"),f=c.addCommas,d=c.encodeHTML,p=t("../../data/List"),v=t("./markerHelper"),m={getRawDataArray:function(){return this[et].data},formatTooltip:function(t){var e=this[V](),i=this[F](t),n=s[St](i)?s.map(i,f).join(", "):f(i),r=e.getName(t);return this.name+"<br />"+((r?d(r)+" : ":"")+n)},getData:function(){return this._data},setData:function(t){this._data=t}};s[ct](m,l.dataFormatMixin),t("../../echarts").extendComponentView({type:"markPoint",init:function(){this._symbolDrawMap={}},render:function(t,e,i){var n=this._symbolDrawMap;for(var r in n)n[r].__keep=!1;e.eachSeries(function(t){var e=t.markPointModel;e&&this._renderSeriesMP(t,e,i)},this);for(var r in n)n[r].__keep||(n[r][A](),this.group[A](n[r].group))},_renderSeriesMP:function(t,c,l){var f=t[n],d=t.name,p=t[V](),v=this._symbolDrawMap,g=v[d];g||(g=v[d]=new i);var y=e(f,p,c),x=f&&f[a];s.mixin(c,m),c.setData(y),y.each(function(t){var e,i=y[N](t),n=i[Mt]("x"),a=i[Mt]("y");if(null!=n&&null!=a)e=[h[J](n,l[X]()),h[J](a,l[j]())];else if(f){var o=y.get(x[0],t),s=y.get(x[1],t);e=f.dataToPoint([o,s])}y[r](t,e);var d=i[Mt]("symbolSize");typeof d===Pt&&(d=d(c[F](t),c[E](t))),y[u](t,{symbolSize:d,color:i.get("itemStyle.normal.color")||p.getVisual("color"),symbol:i[Mt]("symbol")})}),g.updateData(y),this.group.add(g.group),y[w](function(t){t[k](function(t){t[o]=c})}),g.__keep=!0}})}),e("echarts/component/markPoint",[qt,"./marker/MarkPointModel","./marker/MarkPointView"],function(t){t("./marker/MarkPointModel"),t("./marker/MarkPointView")});var Ht=t("echarts");return t("echarts/chart/line"),t("echarts/chart/bar"),t("echarts/component/grid"),t("echarts/component/markPoint"),Ht});