diff --git a/internal/rpc/rpc_client.go b/internal/rpc/rpc_client.go index b36aef4b..60e92eba 100644 --- a/internal/rpc/rpc_client.go +++ b/internal/rpc/rpc_client.go @@ -396,6 +396,10 @@ func (this *RPCClient) MetricStatRPC() pb.MetricStatServiceClient { return pb.NewMetricStatServiceClient(this.pickConn()) } +func (this *RPCClient) MetricChartRPC() pb.MetricChartServiceClient { + return pb.NewMetricChartServiceClient(this.pickConn()) +} + func (this *RPCClient) NodeClusterMetricItemRPC() pb.NodeClusterMetricItemServiceClient { return pb.NewNodeClusterMetricItemServiceClient(this.pickConn()) } diff --git a/internal/web/actions/default/servers/metrics/charts.go b/internal/web/actions/default/servers/metrics/charts.go deleted file mode 100644 index 034e21e1..00000000 --- a/internal/web/actions/default/servers/metrics/charts.go +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. - -package metrics - -import "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" - -type ChartsAction struct { - actionutils.ParentAction -} - -func (this *ChartsAction) Init() { - this.Nav("", "", "chart") -} - -func (this *ChartsAction) RunGet(params struct { - ItemId int64 -}) { - _, err := InitItem(this.Parent(), params.ItemId) - if err != nil { - this.ErrorPage(err) - return - } - - this.Show() -} diff --git a/internal/web/actions/default/servers/metrics/charts/chart.go b/internal/web/actions/default/servers/metrics/charts/chart.go new file mode 100644 index 00000000..1045abf0 --- /dev/null +++ b/internal/web/actions/default/servers/metrics/charts/chart.go @@ -0,0 +1,35 @@ +// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package charts + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/metrics/charts/chartutils" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/metrics/metricutils" +) + +type ChartAction struct { + actionutils.ParentAction +} + +func (this *ChartAction) Init() { + this.Nav("", "", "chart,chartIndex") +} + +func (this *ChartAction) RunGet(params struct { + ChartId int64 +}) { + chart, err := chartutils.InitChart(this.Parent(), params.ChartId) + if err != nil { + this.ErrorPage(err) + return + } + + _, err = metricutils.InitItem(this.Parent(), chart.MetricItem.Id) + if err != nil { + this.ErrorPage(err) + return + } + + this.Show() +} diff --git a/internal/web/actions/default/servers/metrics/charts/chartutils/utils.go b/internal/web/actions/default/servers/metrics/charts/chartutils/utils.go new file mode 100644 index 00000000..c047f1d1 --- /dev/null +++ b/internal/web/actions/default/servers/metrics/charts/chartutils/utils.go @@ -0,0 +1,38 @@ +// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package chartutils + +import ( + "errors" + "github.com/TeaOSLab/EdgeAdmin/internal/rpc" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs" + "github.com/iwind/TeaGo/maps" +) + +// InitChart 初始化指标图表信息 +func InitChart(parent *actionutils.ParentAction, chartId int64) (*pb.MetricChart, error) { + client, err := rpc.SharedRPC() + if err != nil { + return nil, err + } + resp, err := client.MetricChartRPC().FindEnabledMetricChart(parent.AdminContext(), &pb.FindEnabledMetricChartRequest{MetricChartId: chartId}) + if err != nil { + return nil, err + } + var chart = resp.MetricChart + if chart == nil { + return nil, errors.New("metric chart not found") + } + parent.Data["chart"] = maps.Map{ + "id": chart.Id, + "name": chart.Name, + "isOn": chart.IsOn, + "widthDiv": chart.WidthDiv, + "maxItems": chart.MaxItems, + "type": chart.Type, + "typeName": serverconfigs.FindAllMetricChartTypeName(chart.Type), + } + return chart, nil +} diff --git a/internal/web/actions/default/servers/metrics/charts/createPopup.go b/internal/web/actions/default/servers/metrics/charts/createPopup.go new file mode 100644 index 00000000..16db88f2 --- /dev/null +++ b/internal/web/actions/default/servers/metrics/charts/createPopup.go @@ -0,0 +1,65 @@ +// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package charts + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs" + "github.com/iwind/TeaGo/actions" +) + +type CreatePopupAction struct { + actionutils.ParentAction +} + +func (this *CreatePopupAction) Init() { + this.Nav("", "", "") +} + +func (this *CreatePopupAction) RunGet(params struct { + ItemId int64 +}) { + this.Data["itemId"] = params.ItemId + this.Data["types"] = serverconfigs.FindAllMetricChartTypes() + + this.Show() +} + +func (this *CreatePopupAction) RunPost(params struct { + ItemId int64 + Name string + Type string + WidthDiv int32 + MaxItems int32 + + Must *actions.Must + CSRF *actionutils.CSRF +}) { + var chartId int64 + defer func() { + this.CreateLogInfo("创建指标图表 %d", chartId) + }() + + params.Must. + Field("name", params.Name). + Require("请输入图表名称"). + Field("type", params.Type). + Require("请选择图表类型") + + createResp, err := this.RPC().MetricChartRPC().CreateMetricChart(this.AdminContext(), &pb.CreateMetricChartRequest{ + MetricItemId: params.ItemId, + Name: params.Name, + Type: params.Type, + WidthDiv: params.WidthDiv, + MaxItems: params.MaxItems, + ParamsJSON: nil, + }) + if err != nil { + this.ErrorPage(err) + return + } + chartId = createResp.MetricChartId + + this.Success() +} diff --git a/internal/web/actions/default/servers/metrics/charts/delete.go b/internal/web/actions/default/servers/metrics/charts/delete.go new file mode 100644 index 00000000..1cca2d26 --- /dev/null +++ b/internal/web/actions/default/servers/metrics/charts/delete.go @@ -0,0 +1,26 @@ +// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package charts + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" +) + +type DeleteAction struct { + actionutils.ParentAction +} + +func (this *DeleteAction) RunPost(params struct { + ChartId int64 +}) { + defer this.CreateLogInfo("删除指标图表 %d", params.ChartId) + + _, err := this.RPC().MetricChartRPC().DeleteMetricChart(this.AdminContext(), &pb.DeleteMetricChartRequest{MetricChartId: params.ChartId}) + if err != nil { + this.ErrorPage(err) + return + } + + this.Success() +} diff --git a/internal/web/actions/default/servers/metrics/charts/index.go b/internal/web/actions/default/servers/metrics/charts/index.go new file mode 100644 index 00000000..181e2d5b --- /dev/null +++ b/internal/web/actions/default/servers/metrics/charts/index.go @@ -0,0 +1,63 @@ +// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package charts + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/metrics/metricutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs" + "github.com/iwind/TeaGo/maps" +) + +type IndexAction struct { + actionutils.ParentAction +} + +func (this *IndexAction) Init() { + this.Nav("", "", "chart") +} + +func (this *IndexAction) RunGet(params struct { + ItemId int64 +}) { + _, err := metricutils.InitItem(this.Parent(), params.ItemId) + if err != nil { + this.ErrorPage(err) + return + } + + countResp, err := this.RPC().MetricChartRPC().CountEnabledMetricCharts(this.AdminContext(), &pb.CountEnabledMetricChartsRequest{}) + if err != nil { + this.ErrorPage(err) + return + } + var count = countResp.Count + page := this.NewPage(count) + this.Data["page"] = page.AsHTML() + + chartsResp, err := this.RPC().MetricChartRPC().ListEnabledMetricCharts(this.AdminContext(), &pb.ListEnabledMetricChartsRequest{ + MetricItemId: params.ItemId, + Offset: page.Offset, + Size: page.Size, + }) + if err != nil { + this.ErrorPage(err) + return + } + var charts = chartsResp.MetricCharts + var chartMaps = []maps.Map{} + for _, chart := range charts { + chartMaps = append(chartMaps, maps.Map{ + "id": chart.Id, + "name": chart.Name, + "type": chart.Type, + "typeName": serverconfigs.FindAllMetricChartTypeName(chart.Type), + "isOn": chart.IsOn, + "widthDiv": chart.WidthDiv, + }) + } + this.Data["charts"] = chartMaps + + this.Show() +} diff --git a/internal/web/actions/default/servers/metrics/charts/init.go b/internal/web/actions/default/servers/metrics/charts/init.go new file mode 100644 index 00000000..a9e73850 --- /dev/null +++ b/internal/web/actions/default/servers/metrics/charts/init.go @@ -0,0 +1,23 @@ +package charts + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/configloaders" + "github.com/TeaOSLab/EdgeAdmin/internal/web/helpers" + "github.com/iwind/TeaGo" +) + +func init() { + TeaGo.BeforeStart(func(server *TeaGo.Server) { + server. + Helper(helpers.NewUserMustAuth(configloaders.AdminModuleCodeServer)). + Data("teaMenu", "servers"). + Data("teaSubMenu", "metric"). + Prefix("/servers/metrics/charts"). + Get("", new(IndexAction)). + GetPost("/createPopup", new(CreatePopupAction)). + GetPost("/update", new(UpdateAction)). + Post("/delete", new(DeleteAction)). + Get("/chart", new(ChartAction)). + EndAll() + }) +} diff --git a/internal/web/actions/default/servers/metrics/charts/update.go b/internal/web/actions/default/servers/metrics/charts/update.go new file mode 100644 index 00000000..39c0f14e --- /dev/null +++ b/internal/web/actions/default/servers/metrics/charts/update.go @@ -0,0 +1,76 @@ +// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package charts + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/metrics/charts/chartutils" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/metrics/metricutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs" + "github.com/iwind/TeaGo/actions" +) + +type UpdateAction struct { + actionutils.ParentAction +} + +func (this *UpdateAction) Init() { + this.Nav("", "", "chart,chartUpdate") +} + +func (this *UpdateAction) RunGet(params struct { + ChartId int64 +}) { + chart, err := chartutils.InitChart(this.Parent(), params.ChartId) + if err != nil { + this.ErrorPage(err) + return + } + + _, err = metricutils.InitItem(this.Parent(), chart.MetricItem.Id) + if err != nil { + this.ErrorPage(err) + return + } + + this.Data["types"] = serverconfigs.FindAllMetricChartTypes() + + this.Show() +} + +func (this *UpdateAction) RunPost(params struct { + ChartId int64 + Name string + Type string + WidthDiv int32 + MaxItems int32 + IsOn bool + + Must *actions.Must + CSRF *actionutils.CSRF +}) { + defer this.CreateLogInfo("修改指标图表 %d", params.ChartId) + + params.Must. + Field("name", params.Name). + Require("请输入图表名称"). + Field("type", params.Type). + Require("请选择图表类型") + + _, err := this.RPC().MetricChartRPC().UpdateMetricChart(this.AdminContext(), &pb.UpdateMetricChartRequest{ + MetricChartId: params.ChartId, + Name: params.Name, + Type: params.Type, + WidthDiv: params.WidthDiv, + MaxItems: params.MaxItems, + ParamsJSON: nil, + IsOn: params.IsOn, + }) + if err != nil { + this.ErrorPage(err) + return + } + + this.Success() +} diff --git a/internal/web/actions/default/servers/metrics/init.go b/internal/web/actions/default/servers/metrics/init.go index 899aa3e8..147a5c59 100644 --- a/internal/web/actions/default/servers/metrics/init.go +++ b/internal/web/actions/default/servers/metrics/init.go @@ -18,7 +18,6 @@ func init() { GetPost("/update", new(UpdateAction)). Post("/delete", new(DeleteAction)). Get("/item", new(ItemAction)). - Get("/charts", new(ChartsAction)). Get("/stats", new(StatsAction)). EndAll() }) diff --git a/internal/web/actions/default/servers/metrics/item.go b/internal/web/actions/default/servers/metrics/item.go index 0ce86f60..d53df2d7 100644 --- a/internal/web/actions/default/servers/metrics/item.go +++ b/internal/web/actions/default/servers/metrics/item.go @@ -2,7 +2,10 @@ package metrics -import "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/metrics/metricutils" +) type ItemAction struct { actionutils.ParentAction @@ -15,7 +18,7 @@ func (this *ItemAction) Init() { func (this *ItemAction) RunGet(params struct { ItemId int64 }) { - _, err := InitItem(this.Parent(), params.ItemId) + _, err := metricutils.InitItem(this.Parent(), params.ItemId) if err != nil { this.ErrorPage(err) return diff --git a/internal/web/actions/default/servers/metrics/utils.go b/internal/web/actions/default/servers/metrics/metricutils/utils.go similarity index 93% rename from internal/web/actions/default/servers/metrics/utils.go rename to internal/web/actions/default/servers/metrics/metricutils/utils.go index 683a6081..88ddd009 100644 --- a/internal/web/actions/default/servers/metrics/utils.go +++ b/internal/web/actions/default/servers/metrics/metricutils/utils.go @@ -1,6 +1,6 @@ // Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. -package metrics +package metricutils import ( "errors" @@ -22,7 +22,7 @@ func InitItem(parent *actionutils.ParentAction, itemId int64) (*pb.MetricItem, e } var item = resp.MetricItem if item == nil { - return nil, errors.New("not found") + return nil, errors.New("metric item not found") } parent.Data["item"] = maps.Map{ "id": item.Id, diff --git a/internal/web/actions/default/servers/metrics/stats.go b/internal/web/actions/default/servers/metrics/stats.go index b042c494..741b2095 100644 --- a/internal/web/actions/default/servers/metrics/stats.go +++ b/internal/web/actions/default/servers/metrics/stats.go @@ -5,6 +5,7 @@ package metrics import ( "fmt" "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/metrics/metricutils" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs" "github.com/iwind/TeaGo/maps" @@ -21,7 +22,7 @@ func (this *StatsAction) Init() { func (this *StatsAction) RunGet(params struct { ItemId int64 }) { - item, err := InitItem(this.Parent(), params.ItemId) + item, err := metricutils.InitItem(this.Parent(), params.ItemId) if err != nil { this.ErrorPage(err) return diff --git a/internal/web/actions/default/servers/metrics/update.go b/internal/web/actions/default/servers/metrics/update.go index fbf9d059..a474b2ab 100644 --- a/internal/web/actions/default/servers/metrics/update.go +++ b/internal/web/actions/default/servers/metrics/update.go @@ -5,6 +5,7 @@ package metrics import ( "encoding/json" "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/metrics/metricutils" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs" "github.com/iwind/TeaGo/actions" @@ -22,7 +23,7 @@ func (this *UpdateAction) Init() { func (this *UpdateAction) RunGet(params struct { ItemId int64 }) { - item, err := InitItem(this.Parent(), params.ItemId) + item, err := metricutils.InitItem(this.Parent(), params.ItemId) if err != nil { this.ErrorPage(err) return diff --git a/internal/web/import.go b/internal/web/import.go index 0e67319e..76670b6c 100644 --- a/internal/web/import.go +++ b/internal/web/import.go @@ -110,7 +110,9 @@ import ( _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/server/stat" _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/iplists" + _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/metrics" + _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/metrics/charts" // 设置相关 _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/settings" diff --git a/web/public/js/components/common/menu-item.js b/web/public/js/components/common/menu-item.js index e718ac3b..29eb7c4e 100644 --- a/web/public/js/components/common/menu-item.js +++ b/web/public/js/components/common/menu-item.js @@ -10,7 +10,13 @@ Vue.component("menu-item", { if (typeof (window.TEA.ACTION.data.firstMenuItem) != "undefined") { itemCode = window.TEA.ACTION.data.firstMenuItem } - active = (itemCode == this.code) + if (itemCode != null && itemCode.length > 0 && this.code != null && this.code.length > 0) { + if (itemCode.indexOf(",") > 0) { + active = itemCode.split(",").$contains(this.code) + } else { + active = (itemCode == this.code) + } + } } return { vHref: (this.href == null) ? "" : this.href, diff --git a/web/public/js/components/server/metric-charts.js b/web/public/js/components/server/metric-charts.js new file mode 100644 index 00000000..e06af056 --- /dev/null +++ b/web/public/js/components/server/metric-charts.js @@ -0,0 +1,283 @@ +// 指标图表 +Vue.component("metric-chart", { + props: ["v-chart", "v-stats", "v-period-unit"], + mounted: function () { + this.load() + }, + data: function () { + let stats = this.vStats + if (stats == null) { + stats = [] + } + if (stats.length > 0) { + let sum = stats.$sum(function (k, v) { + return v.value + }) + if (sum < stats[0].total) { + stats.push({ + keys: ["其他"], + value: stats[0].total - sum, + total: stats[0].total + }) + } + } + if (this.vChart.maxItems > 0) { + stats = stats.slice(0, this.vChart.maxItems) + } + + stats.$rsort(function (v1, v2) { + return v1.value - v2.value + }) + + let widthPercent = 100 + if (this.vChart.widthDiv > 0) { + widthPercent = 100 / this.vChart.widthDiv + } + + return { + chart: this.vChart, + stats: stats, + width: widthPercent + "%", + chartId: "metric-chart-" + this.vChart.id + } + }, + methods: { + load: function () { + var el = document.getElementById(this.chartId) + if (el == null || el.offsetWidth == 0 || el.offsetHeight == 0) { + setTimeout(this.load, 100) + } else { + this.render(el) + } + }, + render: function (el) { + let chart = echarts.init(el) + switch (this.chart.type) { + case "pie": + this.renderPie(chart) + break + case "bar": + this.renderBar(chart) + break + case "timeBar": + this.renderTimeBar(chart) + break + case "timeLine": + this.renderTimeLine(chart) + break + case "table": + this.renderTable(chart) + break + } + }, + renderPie: function (chart) { + let values = this.stats.map(function (v) { + return { + name: v.keys[0], + value: v.value + } + }) + let that = this + chart.setOption({ + tooltip: { + show: true, + trigger: "item", + formatter: function (data) { + let stat = that.stats[data.dataIndex] + let percent = 0 + if (stat.total > 0) { + percent = Math.round((stat.value * 100 / stat.total) * 100) / 100 + } + return stat.keys[0] + ": " + stat.value + ",占比:" + percent + "%" + } + }, + series: [ + { + name: name, + type: "pie", + data: values, + areaStyle: {} + } + ] + }) + }, + renderTimeBar: function (chart) { + this.stats.$sort(function (v1, v2) { + return (v1.time < v2.time) ? -1 : 1 + }) + let values = this.stats.map(function (v) { + return v.value + }) + let that = this + chart.setOption({ + xAxis: { + data: this.stats.map(function (v) { + return that.formatTime(v.time) + }) + }, + yAxis: {}, + tooltip: { + show: true, + trigger: "item", + formatter: function (data) { + let stat = that.stats[data.dataIndex] + return that.formatTime(stat.time) + ": " + stat.value + } + }, + grid: { + left: 50, + top: 10, + right: 20, + bottom: 20 + }, + series: [ + { + name: name, + type: "bar", + data: values, + itemStyle: { + color: "#9DD3E8" + }, + areaStyle: {}, + barWidth: "20em" + } + ] + }) + }, + renderTimeLine: function (chart) { + this.stats.$sort(function (v1, v2) { + return (v1.time < v2.time) ? -1 : 1 + }) + let values = this.stats.map(function (v) { + return v.value + }) + let that = this + chart.setOption({ + xAxis: { + data: this.stats.map(function (v) { + return that.formatTime(v.time) + }) + }, + yAxis: {}, + tooltip: { + show: true, + trigger: "item", + formatter: function (data) { + let stat = that.stats[data.dataIndex] + return that.formatTime(stat.time) + ": " + stat.value + } + }, + grid: { + left: 50, + top: 10, + right: 20, + bottom: 20 + }, + series: [ + { + name: name, + type: "line", + data: values, + itemStyle: { + color: "#9DD3E8" + }, + areaStyle: {} + } + ] + }) + }, + renderBar: function (chart) { + let values = this.stats.map(function (v) { + return v.value + }) + let that = this + chart.setOption({ + xAxis: { + data: this.stats.map(function (v) { + return v.keys[0] + }), + axisLabel: { + interval: 0 + } + }, + tooltip: { + show: true, + trigger: "item", + formatter: function (data) { + let stat = that.stats[data.dataIndex] + let percent = 0 + if (stat.total > 0) { + percent = Math.round((stat.value * 100 / stat.total) * 100) / 100 + } + return stat.keys[0] + ": " + stat.value + ",占比:" + percent + "%" + } + }, + yAxis: {}, + grid: { + left: 40, + top: 10, + right: 20, + bottom: 20 + }, + series: [ + { + name: name, + type: "bar", + data: values, + itemStyle: { + color: "#9DD3E8" + }, + areaStyle: {}, + barWidth: "20em" + } + ] + }) + }, + renderTable: function (chart) { + let table = `
| 对象 | +数值 | +占比 | +
|---|---|---|
| " + v.keys[0] + " | " + v.value + " | " + let percent = 0 + if (v.total > 0) { + percent = Math.round((v.value * 100 / v.total) * 100) / 100 + } + table += "" + percent + "% | "
+ table += "
a;a++)for(var s=0;8>s;s++)null==o[s]&&(o[s]=0),o[s]+=((a+s)%2?-1:1)*me(n,7,0===a?1:0,1<o;o++){var a=document.createElement("div"),s=a.style,l=o%2,u=(o>>1)%2;s.cssText=["position: absolute","visibility: hidden","padding: 0","margin: 0","border-width: 0","user-select: none","width:0","height:0",i[l]+":0",r[u]+":0",i[1-l]+":auto",r[1-u]+":auto",""].join("!important;"),t.appendChild(a),n.push(a)}return n}function Se(t,e,n){for(var i=n?"invTrans":"trans",r=e[i],o=e.srcCoords,a=[],s=[],l=!0,u=0;4>u;u++){var h=t[u].getBoundingClientRect(),c=2*u,p=h.left,f=h.top;a.push(p,f),l=l&&o&&p===o[c]&&f===o[c+1],s.push(t[u].offsetLeft,t[u].offsetTop)}return l&&r?r:(e.srcCoords=a,e[i]=n?_e(s,a):_e(a,s))}function Te(t){return"CANVAS"===t.nodeName.toUpperCase()}function Me(t,e,n,i){return n=n||{},i||!Ny.canvasSupported?Ce(t,e,n):Ny.browser.firefox&&null!=e.layerX&&e.layerX!==e.offsetX?(n.zrX=e.layerX,n.zrY=e.layerY):null!=e.offsetX?(n.zrX=e.offsetX,n.zrY=e.offsetY):Ce(t,e,n),n}function Ce(t,e,n){if(Ny.domSupported&&t.getBoundingClientRect){var i=e.clientX,r=e.clientY;if(Te(t)){var o=t.getBoundingClientRect();return n.zrX=i-o.left,void(n.zrY=r-o.top)}if(we(gv,t,i,r))return n.zrX=gv[0],void(n.zrY=gv[1])}n.zrX=n.zrY=0}function Ie(t){return t||window.event}function ke(t,e,n){if(e=Ie(e),null!=e.zrX)return e;var i=e.type,r=i&&i.indexOf("touch")>=0;if(r){var o="touchend"!==i?e.targetTouches[0]:e.changedTouches[0];o&&Me(t,o,e,n)}else{Me(t,e,e,n);var a=Ae(e);e.zrDelta=a?a/120:-(e.detail||0)/3}var s=e.button;return null==e.which&&void 0!==s&&dv.test(e.type)&&(e.which=1&s?1:2&s?3:4&s?2:0),e}function Ae(t){var e=t.wheelDelta;if(e)return e;var n=t.deltaX,i=t.deltaY;if(null==n||null==i)return e;var r=Math.abs(0!==i?i:n),o=i>0?-1:0>i?1:n>0?-1:1;return 3*r*o}function De(t,e,n,i){fv?t.addEventListener(e,n,i):t.attachEvent("on"+e,n)}function Pe(t,e,n,i){fv?t.removeEventListener(e,n,i):t.detachEvent("on"+e,n)}function Le(t){var e=t[1][0]-t[0][0],n=t[1][1]-t[0][1];return Math.sqrt(e*e+n*n)}function Oe(t){return[(t[0][0]+t[1][0])/2,(t[0][1]+t[1][1])/2]}function Re(t,e,n){return{type:t,event:n,target:e.target,topTarget:e.topTarget,cancelBubble:!1,offsetX:n.zrX,offsetY:n.zrY,gestureEvent:n.gestureEvent,pinchX:n.pinchX,pinchY:n.pinchY,pinchScale:n.pinchScale,wheelDelta:n.zrDelta,zrByTouch:n.zrByTouch,which:n.which,stop:Ee}}function Ee(){yv(this.event)}function Be(t,e,n){if(t[t.rectHover?"rectContain":"contain"](e,n)){for(var i=t,r=void 0,o=!1;i;){if(i.ignoreClip&&(o=!0),!o){var a=i.getClipPath();if(a&&!a.contain(e,n))return!1;i.silent&&(r=!0)}var s=i.__hostTarget;i=s?s:i.parent}return r?_v:!0}return!1}function ze(t,e,n){var i=t.painter;return 0>e||e>i.getWidth()||0>n||n>i.getHeight()}function Ne(){return[1,0,0,1,0,0]}function Fe(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t}function He(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t}function Ve(t,e,n){var i=e[0]*n[0]+e[2]*n[1],r=e[1]*n[0]+e[3]*n[1],o=e[0]*n[2]+e[2]*n[3],a=e[1]*n[2]+e[3]*n[3],s=e[0]*n[4]+e[2]*n[5]+e[4],l=e[1]*n[4]+e[3]*n[5]+e[5];return t[0]=i,t[1]=r,t[2]=o,t[3]=a,t[4]=s,t[5]=l,t}function Ge(t,e,n){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4]+n[0],t[5]=e[5]+n[1],t}function We(t,e,n){var i=e[0],r=e[2],o=e[4],a=e[1],s=e[3],l=e[5],u=Math.sin(n),h=Math.cos(n);return t[0]=i*h+a*u,t[1]=-i*u+a*h,t[2]=r*h+s*u,t[3]=-r*u+h*s,t[4]=h*o+u*l,t[5]=h*l-u*o,t}function Xe(t,e,n){var i=n[0],r=n[1];return t[0]=e[0]*i,t[1]=e[1]*r,t[2]=e[2]*i,t[3]=e[3]*r,t[4]=e[4]*i,t[5]=e[5]*r,t}function Ue(t,e){var n=e[0],i=e[2],r=e[4],o=e[1],a=e[3],s=e[5],l=n*a-o*i;return l?(l=1/l,t[0]=a*l,t[1]=-o*l,t[2]=-i*l,t[3]=n*l,t[4]=(i*s-a*r)*l,t[5]=(o*r-n*s)*l,t):null}function Ye(t){var e=Ne();return He(e,t),e}function je(t){return t>kv||-kv>t}function qe(t){return t=Math.round(t),0>t?0:t>255?255:t}function Ze(t){return t=Math.round(t),0>t?0:t>360?360:t}function Ke(t){return 0>t?0:t>1?1:t}function $e(t){var e=t;return qe(e.length&&"%"===e.charAt(e.length-1)?parseFloat(e)/100*255:parseInt(e,10))}function Qe(t){var e=t;return Ke(e.length&&"%"===e.charAt(e.length-1)?parseFloat(e)/100:parseFloat(e))}function Je(t,e,n){return 0>n?n+=1:n>1&&(n-=1),1>6*n?t+(e-t)*n*6:1>2*n?e:2>3*n?t+(e-t)*(2/3-n)*6:t}function tn(t,e,n){return t+(e-t)*n}function en(t,e,n,i,r){return t[0]=e,t[1]=n,t[2]=i,t[3]=r,t}function nn(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t}function rn(t,e){Vv&&nn(Vv,e),Vv=Hv.put(t,Vv||e.slice())}function on(t,e){if(t){e=e||[];var n=Hv.get(t);if(n)return nn(e,n);t+="";var i=t.replace(/ /g,"").toLowerCase();if(i in Fv)return nn(e,Fv[i]),rn(t,e),e;var r=i.length;if("#"!==i.charAt(0)){var o=i.indexOf("("),a=i.indexOf(")");if(-1!==o&&a+1===r){var s=i.substr(0,o),l=i.substr(o+1,a-(o+1)).split(","),u=1;switch(s){case"rgba":if(4!==l.length)return 3===l.length?en(e,+l[0],+l[1],+l[2],1):en(e,0,0,0,1);u=Qe(l.pop());case"rgb":return 3!==l.length?void en(e,0,0,0,1):(en(e,$e(l[0]),$e(l[1]),$e(l[2]),u),rn(t,e),e);case"hsla":return 4!==l.length?void en(e,0,0,0,1):(l[3]=Qe(l[3]),an(l,e),rn(t,e),e);case"hsl":return 3!==l.length?void en(e,0,0,0,1):(an(l,e),rn(t,e),e);default:return}}en(e,0,0,0,1)}else{if(4===r||5===r){var h=parseInt(i.slice(1,4),16);return h>=0&&4095>=h?(en(e,(3840&h)>>4|(3840&h)>>8,240&h|(240&h)>>4,15&h|(15&h)<<4,5===r?parseInt(i.slice(4),16)/15:1),rn(t,e),e):void en(e,0,0,0,1)}if(7===r||9===r){var h=parseInt(i.slice(1,7),16);return h>=0&&16777215>=h?(en(e,(16711680&h)>>16,(65280&h)>>8,255&h,9===r?parseInt(i.slice(7),16)/255:1),rn(t,e),e):void en(e,0,0,0,1)}}}}function an(t,e){var n=(parseFloat(t[0])%360+360)%360/360,i=Qe(t[1]),r=Qe(t[2]),o=.5>=r?r*(i+1):r+i-r*i,a=2*r-o;return e=e||[],en(e,qe(255*Je(a,o,n+1/3)),qe(255*Je(a,o,n)),qe(255*Je(a,o,n-1/3)),1),4===t.length&&(e[3]=t[3]),e}function sn(t){if(t){var e,n,i=t[0]/255,r=t[1]/255,o=t[2]/255,a=Math.min(i,r,o),s=Math.max(i,r,o),l=s-a,u=(s+a)/2;if(0===l)e=0,n=0;else{n=.5>u?l/(s+a):l/(2-s-a);var h=((s-i)/6+l/2)/l,c=((s-r)/6+l/2)/l,p=((s-o)/6+l/2)/l;i===s?e=p-c:r===s?e=1/3+h-p:o===s&&(e=2/3+c-h),0>e&&(e+=1),e>1&&(e-=1)}var f=[360*e,n,u];return null!=t[3]&&f.push(t[3]),f}}function ln(t,e){var n=on(t);if(n){for(var i=0;3>i;i++)n[i]=0>e?n[i]*(1-e)|0:(255-n[i])*e+n[i]|0,n[i]>255?n[i]=255:n[i]<0&&(n[i]=0);return dn(n,4===n.length?"rgba":"rgb")}}function un(t){var e=on(t);return e?((1<<24)+(e[0]<<16)+(e[1]<<8)+ +e[2]).toString(16).slice(1):void 0}function hn(t,e,n){if(e&&e.length&&t>=0&&1>=t){n=n||[];var i=t*(e.length-1),r=Math.floor(i),o=Math.ceil(i),a=e[r],s=e[o],l=i-r;return n[0]=qe(tn(a[0],s[0],l)),n[1]=qe(tn(a[1],s[1],l)),n[2]=qe(tn(a[2],s[2],l)),n[3]=Ke(tn(a[3],s[3],l)),n}}function cn(t,e,n){if(e&&e.length&&t>=0&&1>=t){var i=t*(e.length-1),r=Math.floor(i),o=Math.ceil(i),a=on(e[r]),s=on(e[o]),l=i-r,u=dn([qe(tn(a[0],s[0],l)),qe(tn(a[1],s[1],l)),qe(tn(a[2],s[2],l)),Ke(tn(a[3],s[3],l))],"rgba");return n?{color:u,leftIndex:r,rightIndex:o,value:i}:u}}function pn(t,e,n,i){var r=on(t);return t?(r=sn(r),null!=e&&(r[0]=Ze(e)),null!=n&&(r[1]=Qe(n)),null!=i&&(r[2]=Qe(i)),dn(an(r),"rgba")):void 0}function fn(t,e){var n=on(t);return n&&null!=e?(n[3]=Ke(e),dn(n,"rgba")):void 0}function dn(t,e){if(t&&t.length){var n=t[0]+","+t[1]+","+t[2];return("rgba"===e||"hsva"===e||"hsla"===e)&&(n+=","+t[3]),e+"("+n+")"}}function gn(t,e){var n=on(t);return n?(.299*n[0]+.587*n[1]+.114*n[2])*n[3]/255+(1-n[3])*e:0}function yn(){var t=Math.round(255*Math.random()),e=Math.round(255*Math.random()),n=Math.round(255*Math.random());return"rgb("+t+","+e+","+n+")"}function vn(t,e,n){return(e-t)*n+t}function mn(t,e,n){return n>.5?e:t}function _n(t,e,n,i){for(var r=e.length,o=0;r>o;o++)t[o]=vn(e[o],n[o],i)}function xn(t,e,n,i){for(var r=e.length,o=r&&e[0].length,a=0;r>a;a++){t[a]||(t[a]=[]);for(var s=0;o>s;s++)t[a][s]=vn(e[a][s],n[a][s],i)}}function wn(t,e,n,i){for(var r=e.length,o=0;r>o;o++)t[o]=e[o]+n[o]*i;return t}function bn(t,e,n,i){for(var r=e.length,o=r&&e[0].length,a=0;r>a;a++){t[a]||(t[a]=[]);for(var s=0;o>s;s++)t[a][s]=e[a][s]+n[a][s]*i}return t}function Sn(t,e,n){var i=t,r=e;if(i.push&&r.push){var o=i.length,a=r.length;if(o!==a){var s=o>a;if(s)i.length=a;else for(var l=o;a>l;l++)i.push(1===n?r[l]:Uv.call(r[l]))}for(var u=i[0]&&i[0].length,l=0;ln&&(e.x+=e.width,e.width=-e.width),0>i&&(e.y+=e.height,e.height=-e.height);var r=eA(e.x,t.x),o=nA(e.x+e.width,t.x+t.width),a=eA(e.y,t.y),s=nA(e.y+e.height,t.y+t.height);e.x=r,e.y=a,e.width=o-r,e.height=s-a;var l=e.width<0||e.height<0;return 0>n&&(e.x+=e.width,e.width=-e.width),0>i&&(e.y+=e.height,e.height=-e.height),l},polar:function(t,e){var n=e.r0<=e.r?1:-1;if(0>n){var i=e.r;e.r=e.r0,e.r0=i}var r=nA(e.r,t.r),o=eA(e.r0,t.r0);e.r=r,e.r0=o;var a=0>r-o;if(0>n){var i=e.r;e.r=e.r0,e.r0=i}return a}},oA={cartesian2d:function(t,e,n,i,r,o){var a=new rx({shape:h({},i),z2:1});if(a.__dataIndex=n,a.name="item",o){var s=a.shape,l=r?"height":"width";s[l]=0}return a},polar:function(t,e,n,i,r,o,a,s,l){var u=i.startAngle
",g=u.join(d);this._showOrMove(o,function(){this._updateContentNotChangedOnAxis(t)?this._updatePosition(o,c,r[0],r[1],this._tooltipContent,s):this._showTooltipContent(o,g,s,Math.random()+"",r[0],r[1],c,null,h)})},n.prototype._showSeriesItemTooltip=function(t,e,n){var i=Nc(e,function(t){return null!=rb(t).dataIndex}),r=this._ecModel,o=rb(i),a=o.seriesIndex,s=r.getSeriesByIndex(a),l=o.dataModel||s,u=o.dataIndex,h=o.dataType,c=l.getData(h),p=this._renderMode,f=Ay([c.getItemModel(u),l,s&&(s.coordinateSystem||{}).model,this._tooltipModel]),d=f.get("trigger");if(null==d||"item"===d){var g=l.getDataParams(u,h),y=new PT;g.marker=y.makeTooltipMarker("item",Ml(g.color),p);var v=Eu(l.formatTooltip(u,!1,h)),m=f.get("order"),_=v.markupFragment?Qu(v.markupFragment,y,p,m,r.get("useUTC")):v.markupText,x="item_"+l.name+"_"+u;this._showOrMove(f,function(){this._showTooltipContent(f,_,g,x,t.offsetX,t.offsetY,t.position,t.target,y)}),n({type:"showTip",dataIndexInside:u,dataIndex:c.getRawIndex(u),seriesIndex:a,from:this.uid})}},n.prototype._showComponentItemTooltip=function(t,e,n){var i=e.tooltip;if(C(i)){var r=i;i={content:r,formatter:r}}var o=new Xb(i,this._tooltipModel,this._ecModel),a=o.get("content"),s=Math.random()+"",l=new PT;this._showOrMove(o,function(){this._showTooltipContent(o,a,o.get("formatterParams")||{},s,t.offsetX,t.offsetY,t.position,e,l)}),n({type:"showTip",from:this.uid})},n.prototype._showTooltipContent=function(t,e,n,i,r,o,a,s,l){if(this._ticket="",t.get("showContent")&&t.get("show")){var u=this._tooltipContent,h=t.get("formatter");a=a||t.get("position");var c=e,p=this._getNearestPoint([r,o],n,t.get("trigger"));if(h&&C(h)){var f=t.ecModel.get("useUTC"),d=T(n)?n[0]:n,g=d&&d.axisType&&d.axisType.indexOf("time")>=0;c=h,g&&(c=$s(d.axisValue,c,f)),c=xl(c,n,!0)}else if(M(h)){var y=bD(function(e,i){e===this._ticket&&(u.setContent(i,l,t,p.color,a),this._updatePosition(t,a,r,o,u,n,s))},this);this._ticket=i,c=h(n,i,y)}u.setContent(c,l,t,p.color,a),u.show(t,p.color),this._updatePosition(t,a,r,o,u,n,s)}},n.prototype._getNearestPoint=function(t,e,n){return"axis"===n||T(e)?{color:"html"===this._renderMode?"#fff":"none"}:T(e)?void 0:{color:e.color||e.borderColor}},n.prototype._updatePosition=function(t,e,n,i,r,o,a){var s=this._api.getWidth(),l=this._api.getHeight();e=e||t.get("position");var u=r.getSize(),h=t.get("align"),c=t.get("verticalAlign"),p=a&&a.getBoundingRect().clone();if(a&&p.applyTransform(a.transform),M(e)&&(e=e([n,i],o,r.el,p,{viewSize:[s,l],contentSize:u.slice()})),T(e))n=TD(e[0],s),i=TD(e[1],l);else if(A(e)){var f=e;f.width=u[0],f.height=u[1];var d=kl(f,{width:s,height:l});n=d.x,i=d.y,h=null,c=null}else if(C(e)&&a){var g=Oy(e,p,u);n=g[0],i=g[1]}else{var g=Py(n,i,r,s,l,h?null:20,c?null:20);n=g[0],i=g[1]}if(h&&(n-=Ry(h)?u[0]/2:"right"===h?u[0]:0),c&&(i-=Ry(c)?u[1]/2:"bottom"===c?u[1]:0),_y(t)){var g=Ly(n,i,r,s,l);n=g[0],i=g[1]}r.moveTo(n,i)},n.prototype._updateContentNotChangedOnAxis=function(t){var e=this._lastDataByCoordSys,n=!!e&&e.length===t.length;return n&&SD(e,function(e,i){var r=e.dataByAxis||[],o=t[i]||{},a=o.dataByAxis||[];n=n&&r.length===a.length,n&&SD(r,function(t,e){var i=a[e]||{},r=t.seriesDataIndices||[],o=i.seriesDataIndices||[];n=n&&t.value===i.value&&t.axisType===i.axisType&&t.axisId===i.axisId&&r.length===o.length,n&&SD(r,function(t,e){var i=o[e];n=n&&t.seriesIndex===i.seriesIndex&&t.dataIndex===i.dataIndex})})}),this._lastDataByCoordSys=t,!!n},n.prototype._hide=function(t){this._lastDataByCoordSys=null,t({type:"hideTip",from:this.uid})},n.prototype.dispose=function(t,e){Ny.node||(this._tooltipContent.dispose(),iy("itemTooltip",e))},n.type="tooltip",n}(RT);RT.registerClass(CD),lp({type:"showTip",event:"showTip",update:"tooltip:manuallyShowTip"},function(){}),lp({type:"hideTip",event:"hideTip",update:"tooltip:manuallyHideTip"},function(){}),t.version=uC,t.dependencies=hC,t.PRIORITY=IC,t.init=$c,t.connect=Qc,t.disConnect=Jc,t.disconnect=bI,t.dispose=tp,t.getInstanceByDom=ep,t.getInstanceById=np,t.registerTheme=ip,t.registerPreprocessor=rp,t.registerProcessor=op,t.registerPostInit=ap,t.registerPostUpdate=sp,t.registerAction=lp,t.registerCoordinateSystem=up,t.getCoordinateSystemDimensions=hp,t.registerLayout=cp,t.registerVisual=pp,t.registerLoading=dp,t.extendComponentModel=gp,t.extendComponentView=yp,t.extendSeriesModel=vp,t.extendChartView=mp,t.setCanvasCreator=_p,t.registerMap=xp,t.getMap=wp,t.registerTransform=SI,t.dataTool=NI,t.registerLocale=Ws,t.zrender=Vw,t.throttle=Sh,t.helper=Dk,t.matrix=Cv,t.vector=av,t.color=Xv,t.parseGeoJSON=zf,t.parseGeoJson=Bk,t.number=zk,t.format=Nk,t.time=Fk,t.util=Hk,t.graphic=Gk,t.innerDrawElementOnCanvas=Dc,t.List=JI,t.Model=Xb,t.Axis=Ek,t.env=Ny});
\ No newline at end of file
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).echarts={})}(this,(function(t){"use strict";
+/*! *****************************************************************************
+ Copyright (c) Microsoft Corporation.
+
+ Permission to use, copy, modify, and/or distribute this software for any
+ purpose with or without fee is hereby granted.
+
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ PERFORMANCE OF THIS SOFTWARE.
+ ***************************************************************************** */var e=function(t,n){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])})(t,n)};function n(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}var i=function(){return(i=Object.assign||function(t){for(var e,n=1,i=arguments.length;n18);a&&(n.weChat=!0);e.canvasSupported=!!document.createElement("canvas").getContext,e.svgSupported="undefined"!=typeof SVGRect,e.touchEventsSupported="ontouchstart"in window&&!n.ie&&!n.edge,e.pointerEventsSupported="onpointerdown"in window&&(n.edge||n.ie&&+n.version>=11),e.domSupported="undefined"!=typeof document;var s=document.documentElement.style;e.transform3dSupported=(n.ie&&"transition"in s||n.edge||"WebKitCSSMatrix"in window&&"m11"in new WebKitCSSMatrix||"MozPerspective"in s)&&!("OTransition"in s),e.transformSupported=e.transform3dSupported||n.ie&&+n.version>=9}(navigator.userAgent,a);var s={"[object Function]":!0,"[object RegExp]":!0,"[object Date]":!0,"[object Error]":!0,"[object CanvasGradient]":!0,"[object CanvasPattern]":!0,"[object Image]":!0,"[object Canvas]":!0},l={"[object Int8Array]":!0,"[object Uint8Array]":!0,"[object Uint8ClampedArray]":!0,"[object Int16Array]":!0,"[object Uint16Array]":!0,"[object Int32Array]":!0,"[object Uint32Array]":!0,"[object Float32Array]":!0,"[object Float64Array]":!0},u=Object.prototype.toString,h=Array.prototype,c=h.forEach,p=h.filter,d=h.slice,f=h.map,g=function(){}.constructor,y=g?g.prototype:null,v={};function m(t,e){v[t]=e}var _=2311;function x(){return _++}function b(){for(var t=[],e=0;e0;)a=l,(l=1+(l<<1))<=0&&(l=s);l>s&&(l=s),a+=r,l+=r}else{for(s=r+1;ls&&(l=s);var u=a;a=r-l,l=r-u}for(a++;as&&(l=s);var u=a;a=r-l,l=r-u}else{for(s=i-r;l=0;)a=l,(l=1+(l<<1))<=0&&(l=s);l>s&&(l=s),a+=r,l+=r}for(a++;a=0;l--)t[d+l]=t[p+l];return void(t[c]=a[h])}var f=r;for(;;){var g=0,y=0,v=!1;do{if(e(a[h],t[u])<0){if(t[c--]=t[u--],g++,y=0,0==--i){v=!0;break}}else if(t[c--]=a[h--],y++,g=0,1==--s){v=!0;break}}while((g|y)1;){var t=o-2;if(t>=1&&i[t-1]<=i[t]+i[t+1]||t>=2&&i[t-2]<=i[t]+i[t-1])i[t-1]i[t+1])break;s(t)}},forceMergeRuns:function(){for(;o>1;){var t=o-2;t>0&&i[t-1]=32;)e|=1&t,t>>=1;return t+e}(r);do{if((o=fe(t,n,i,e))s&&(l=s),ge(t,n,n+l,n+o,e),o=l}a.pushRun(n,o),a.mergeRuns(),r-=o,n+=o}while(0!==r);a.forceMergeRuns()}}}var xe=!1;function be(){xe||(xe=!0,console.warn("z / z2 / zlevel of displayable is invalid, which may cause unexpected errors"))}function we(t,e){return t.zlevel===e.zlevel?t.z===e.z?t.z2-e.z2:t.z-e.z:t.zlevel-e.zlevel}var Se=function(){function t(){this._roots=[],this._displayList=[],this._displayListLen=0,this.displayableSortFunc=we}return t.prototype.traverse=function(t,e){for(var n=0;n