You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@echarts.apache.org by sh...@apache.org on 2021/09/10 02:49:52 UTC

[echarts-examples] branch dev updated (0ae073f -> 665dcbd)

This is an automated email from the ASF dual-hosted git repository.

shenyi pushed a change to branch dev
in repository https://gitbox.apache.org/repos/asf/echarts-examples.git.


    from 0ae073f  update animated screenshots
     add 42ac02a  fix log error
     add 0c61acb  fix: fix typo
     add c7f6e81  Merge branch 'dev' into gh-pages
     add 0f346ea  fix: remove e2e/package-lock.json
     add ab4e2c8  fix: add e2e/package-lock.json to .gitignore.
     add b1085cf  fix: some tweak for e2e test (but probably not important)
     add d96def5  optimize animation screenshots
     add 52b3add  use native ffmpeg for performance consideration
     add a6bd42f  update thumbs
     add cc00bfe  add missing thumbs
     add 2cc7638  fix typos
     add a0c5739  update examples
     add e8e8f1b  WIP: coverting js code to ts
     add 6f7dd55  optimize ts editor
     add 6ed8aab  WIP: add more ts examples
     add 1ba2276  WIP: add more ts files
     add d759480  WIP: update more examples to ts
     add 6703ff3  WIP: update examples to ts
     new 424edd8  compile ts to js files
     new 16a6683  use prettier to format code
     new 5743f81  format example code
     new a6bbe0c  add ts mode. update gl codes
     new 85dfdaf  feat: add ts and js switch. add prettier
     new 91a9f36  add language switch confirm
     new bfb64a2  fix build example
     new 8eb05c1  add ts flag
     new 4bed1e1  add js and ts tag in explore page
     new e1814a8  optimize explore page
     new 0323de6  fix example type errors
     new 99f366e  update more ts examples
     new bf9114e  fix ts tag still show on js only example
     new ecc739d  feat: add doc link in full option tab
     new 665dcbd  fix doc link lang

The 15 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .babelrc                                           |   11 +-
 .eslintrc.js                                       |   13 +
 .gitignore                                         |    2 +
 .prettierignore                                    |   27 +
 .prettierrc                                        |    7 +
 .vscode/settings.json                              |    7 +
 README.md                                          |   30 +-
 _config.yml                                        |    2 -
 build/copyResource.js                              |  134 +-
 build/server.js                                    |   24 +-
 build/webpack.config.js                            |  155 +-
 common/buildCode.js                                |  615 +-
 common/compareImage.js                             |   81 +-
 common/task.js                                     |   96 +-
 config/common.js                                   |    6 +-
 config/env.asf.js                                  |    2 +-
 config/env.dev.js                                  |    2 +-
 config/env.localsite.js                            |    2 +-
 e2e/cases/README.md                                |    2 +-
 e2e/cases/liquidfill.js                            |   14 +-
 e2e/cases/wordcloud.js                             |  230 +-
 e2e/config.js                                      |   58 +-
 e2e/main.js                                        | 1275 ++--
 e2e/package-lock.json                              | 6131 --------------------
 e2e/package.json                                   |    8 +-
 e2e/preview.html                                   |   47 +-
 e2e/report.html                                    |  353 +-
 e2e/template.html                                  |   47 +-
 e2e/tsconfig.json                                  |   18 +-
 e2e/webpack.config.js                              |   29 +-
 package-lock.json                                  |  239 +-
 package.json                                       |   20 +-
 public/data-gl/animating-contour-on-globe.js       |  179 -
 public/data-gl/bar3d-dataset.js                    |   48 -
 public/data-gl/bar3d-global-population.js          |   96 -
 public/data-gl/bar3d-mapbox-view-change.js         |  104 -
 public/data-gl/bar3d-music-visualization.js        |  156 -
 public/data-gl/bar3d-myth.js                       |  104 -
 .../bar3d-noise-modified-from-marpi-demo.js        |  210 -
 public/data-gl/bar3d-on-mapbox.js                  |   71 -
 public/data-gl/bar3d-punch-card.js                 |   75 -
 public/data-gl/bar3d-shanghai.js                   |   71 -
 public/data-gl/bar3d-simplex-noise.js              |   79 -
 public/data-gl/bar3d-voxelize-image.js             |  171 -
 public/data-gl/flowGL-noise.js                     |  106 -
 public/data-gl/geo3d-with-different-height.js      |   72 -
 public/data-gl/geo3d.js                            |   50 -
 public/data-gl/global-population-bar3d-on-globe.js |   64 -
 public/data-gl/global-wind-visualization-2.js      |  248 -
 public/data-gl/global-wind-visualization.js        |  196 -
 public/data-gl/globe-atmosphere.js                 |   30 -
 public/data-gl/globe-contour-paint.js              |  178 -
 public/data-gl/globe-country-carousel.js           |  107 -
 public/data-gl/globe-displacement.js               |   56 -
 public/data-gl/globe-echarts-gl-hello-world.js     |   35 -
 public/data-gl/globe-layers.js                     |   42 -
 public/data-gl/globe-moon.js                       |   54 -
 public/data-gl/globe-with-echarts-surface.js       |  239 -
 public/data-gl/graphgl-gpu-layout.js               |   70 -
 public/data-gl/graphgl-large-internet.js           |   64 -
 public/data-gl/graphgl-npm-dep.js                  |  104 -
 public/data-gl/image-surface-sushuang.js           |   86 -
 public/data-gl/image-to-bar3d.js                   |   89 -
 public/data-gl/iron-globe.js                       |   40 -
 public/data-gl/line3d-orthographic.js              |   50 -
 public/data-gl/lines3d-airline-on-globe.js         |   57 -
 public/data-gl/lines3d-flight-path-on-mapbox.js    |  183 -
 public/data-gl/lines3d-flights-gl.js               |   96 -
 public/data-gl/lines3d-flights-on-geo3d.js         |   77 -
 public/data-gl/lines3d-flights.js                  |  148 -
 public/data-gl/lines3d-taxi-chengdu.js             |  492 --
 public/data-gl/lines3d-taxi-routes-of-cape-town.js |  169 -
 public/data-gl/linesGL-ny.js                       |   91 -
 public/data-gl/map3d-alcohol-consumption.js        |   72 -
 public/data-gl/map3d-buildings-on-mapbox.js        |   77 -
 public/data-gl/map3d-buildings.js                  |  110 -
 public/data-gl/map3d-colorful-cities.js            |   93 -
 ...d-plastic-material-style-buildings-on-mapbox.js |   85 -
 public/data-gl/map3d-wood-city.js                  |   94 -
 public/data-gl/map3d-wood-map-on-mapbox.js         |   68 -
 public/data-gl/map3d-wood-map.js                   |   72 -
 public/data-gl/metal-bar3d.js                      |   99 -
 public/data-gl/metal-surface.js                    |  101 -
 public/data-gl/parametric-surface-rose.js          |  149 -
 public/data-gl/scatter3D-dataset.js                |   41 -
 public/data-gl/scatter3d-globe-population.js       |   89 -
 public/data-gl/scatter3d-orthographic.js           |   68 -
 public/data-gl/scatter3d-scatter.js                |  108 -
 public/data-gl/scatter3d-shanghai.js               |   50 -
 public/data-gl/scatter3d-simplex-noise.js          |   68 -
 .../data-gl/scatter3d-weibo-checkin-on-mapbox.js   |   87 -
 public/data-gl/scatter3d.js                        |  208 -
 public/data-gl/scatterGL-gps.js                    |   89 -
 public/data-gl/scattergl-weibo.js                  |  100 -
 public/data-gl/simple-surface.js                   |   53 -
 public/data-gl/sphere-parametric-surface.js        |   48 -
 public/data-gl/stacked-bar3d.js                    |   62 -
 public/data-gl/surface-breather.js                 |  119 -
 public/data-gl/surface-golden-rose.js              |  159 -
 public/data-gl/surface-leather.js                  |  137 -
 public/data-gl/surface-mollusc-shell.js            |   78 -
 public/data-gl/surface-theme-roses.js              |  154 -
 public/data-gl/surface-wave.js                     |   58 -
 public/data-gl/transparent-bar3d.js                |   76 -
 .../data/archive/custom-aggregate-scatter-bar.js   |  209 -
 .../data/archive/custom-aggregate-scatter-pie.js   |  189 -
 public/data/area-basic.js                          |   22 -
 public/data/area-pieces.js                         |   66 -
 public/data/area-rainfall.js                       |  188 -
 public/data/area-simple.js                         |   78 -
 public/data/area-stack-gradient.js                 |  174 -
 public/data/area-stack.js                          |  103 -
 public/data/area-time-axis.js                      |   67 -
 public/data/bar-animation-delay.js                 |   70 -
 public/data/bar-background.js                      |   24 -
 public/data/bar-brush.js                           |  114 -
 public/data/bar-data-color.js                      |   25 -
 public/data/bar-drilldown.js                       |   99 -
 public/data/bar-gradient.js                        |   96 -
 public/data/bar-histogram.js                       |  126 -
 public/data/bar-label-rotation.js                  |  166 -
 public/data/bar-large.js                           |   93 -
 public/data/bar-negative.js                        |   77 -
 public/data/bar-negative2.js                       |   66 -
 public/data/bar-polar-label-radial.js              |   30 -
 public/data/bar-polar-label-tangential.js          |   30 -
 public/data/bar-polar-real-estate.js               |  101 -
 public/data/bar-polar-stack-radial.js              |   49 -
 public/data/bar-polar-stack.js                     |   50 -
 public/data/bar-race-country.js                    |  142 -
 public/data/bar-race.js                            |   65 -
 public/data/bar-rich-text.js                       |  151 -
 public/data/bar-simple.js                          |   20 -
 public/data/bar-stack.js                           |  125 -
 public/data/bar-tick-align.js                      |   43 -
 public/data/bar-waterfall.js                       |   66 -
 public/data/bar-waterfall2.js                      |   91 -
 public/data/bar-y-category-stack.js                |   92 -
 public/data/bar-y-category.js                      |   48 -
 public/data/bar1.js                                |   74 -
 public/data/boxplot-light-velocity.js              |   84 -
 public/data/boxplot-light-velocity2.js             |   87 -
 public/data/boxplot-multi.js                       |  106 -
 public/data/bubble-gradient.js                     |  109 -
 public/data/calendar-charts.js                     |  193 -
 public/data/calendar-effectscatter.js              |  167 -
 public/data/calendar-graph.js                      |  126 -
 public/data/calendar-heatmap.js                    |   54 -
 public/data/calendar-horizontal.js                 |   72 -
 public/data/calendar-lunar.js                      |  468 --
 public/data/calendar-pie.js                        |  116 -
 public/data/calendar-simple.js                     |   37 -
 public/data/calendar-vertical.js                   |   78 -
 public/data/candlestick-brush.js                   |  264 -
 public/data/candlestick-large.js                   |  208 -
 public/data/candlestick-sh-2015.js                 |  134 -
 public/data/candlestick-sh.js                      |  324 --
 public/data/candlestick-simple.js                  |   22 -
 public/data/candlestick-touch.js                   |  245 -
 public/data/circle-packing-with-d3.js              |  219 -
 public/data/confidence-band.js                     |  113 -
 public/data/covid-america.js                       |  404 --
 public/data/custom-bar-trend.js                    |  115 -
 public/data/custom-calendar-icon.js                |  119 -
 public/data/custom-cartesian-polygon.js            |   66 -
 public/data/custom-error-bar.js                    |  113 -
 public/data/custom-error-scatter.js                |  143 -
 public/data/custom-gantt-flight.js                 |  533 --
 public/data/custom-gauge.js                        |  173 -
 public/data/custom-hexbin.js                       |  251 -
 public/data/custom-ohlc.js                         |  161 -
 public/data/custom-polar-heatmap.js                |   82 -
 public/data/custom-profile.js                      |  120 -
 public/data/custom-profit.js                       |   67 -
 public/data/custom-spiral-race.js                  |  255 -
 public/data/custom-wind.js                         |  111 -
 public/data/cycle-plot.js                          |  142 -
 public/data/data-transform-aggregate.js            |  128 -
 public/data/data-transform-filter.js               |   81 -
 public/data/data-transform-multiple-pie.js         |   80 -
 public/data/data-transform-sort-bar.js             |   38 -
 public/data/dataset-default.js                     |   50 -
 public/data/dataset-encode0.js                     |   49 -
 public/data/dataset-encode1.js                     |   98 -
 public/data/dataset-link.js                        |   73 -
 public/data/dataset-series-layout-by.js            |   42 -
 public/data/dataset-simple0.js                     |   29 -
 public/data/dataset-simple1.js                     |   29 -
 public/data/doc-example/dataset-encode-simple0.js  |   30 -
 public/data/doc-example/sunburst-color.js          |   44 -
 public/data/doc-example/sunburst-simple.js         |   28 -
 public/data/doc-example/timeline-dynamic-series.js |   72 -
 public/data/dynamic-data.js                        |  132 -
 public/data/dynamic-data2.js                       |   77 -
 public/data/effectScatter-bmap.js                  |  575 --
 public/data/effectScatter-map.js                   |  503 --
 public/data/funnel-align.js                        |  114 -
 public/data/funnel-customize.js                    |   88 -
 public/data/funnel-mutiple.js                      |  103 -
 public/data/funnel.js                              |   72 -
 public/data/gauge-barometer.js                     |  122 -
 public/data/gauge-car.js                           |  575 --
 public/data/gauge-clock.js                         |  230 -
 public/data/gauge-grade.js                         |   88 -
 public/data/gauge-multi-title.js                   |   85 -
 public/data/gauge-progress.js                      |   93 -
 public/data/gauge-ring.js                          |  102 -
 public/data/gauge-simple.js                        |   29 -
 public/data/gauge-speed.js                         |   55 -
 public/data/gauge-stage.js                         |   61 -
 public/data/gauge-temperature.js                   |  125 -
 public/data/gauge.js                               |   23 -
 public/data/geo-beef-cuts.js                       |   74 -
 public/data/geo-lines.js                           |  298 -
 public/data/geo-map-scatter.js                     |  349 --
 public/data/geo-organ.js                           |   79 -
 public/data/geo-seatmap-flight.js                  |   93 -
 public/data/geo-svg-lines.js                       |   84 -
 public/data/geo-svg-map.js                         |  202 -
 public/data/geo-svg-scatter-simple.js              |   54 -
 public/data/geo-svg-traffic.js                     |  167 -
 public/data/graph-circular-layout.js               |   59 -
 public/data/graph-force-dynamic.js                 |   57 -
 public/data/graph-force.js                         |   48 -
 public/data/graph-force2.js                        |   64 -
 public/data/graph-grid.js                          |   50 -
 public/data/graph-label-overlap.js                 |   49 -
 public/data/graph-life-expectancy.js               |  103 -
 public/data/graph-npm.js                           |   54 -
 public/data/graph-simple.js                        |   87 -
 public/data/graph-webkit-dep.js                    |   43 -
 public/data/graph.js                               |   61 -
 public/data/grid-multiple.js                       |  174 -
 public/data/heatmap-bmap.js                        |   45 -
 public/data/heatmap-cartesian.js                   |   65 -
 public/data/heatmap-large-piecewise.js             |  373 --
 public/data/heatmap-large.js                       |  365 --
 public/data/heatmap-map.js                         |  447 --
 public/data/line-aqi.js                            |   99 -
 public/data/line-draggable.js                      |  139 -
 public/data/line-easing.js                         |  233 -
 public/data/line-function.js                       |   72 -
 public/data/line-gradient.js                       |   74 -
 public/data/line-graphic.js                        |  125 -
 public/data/line-in-cartesian-coordinate-system.js |   15 -
 public/data/line-log.js                            |   57 -
 public/data/line-marker.js                         |   88 -
 public/data/line-markline.js                       |   78 -
 public/data/line-pen.js                            |   73 -
 public/data/line-polar.js                          |   42 -
 public/data/line-polar2.js                         |   47 -
 public/data/line-race.js                           |   90 -
 public/data/line-sections.js                       |   86 -
 public/data/line-simple.js                         |   20 -
 public/data/line-smooth.js                         |   21 -
 public/data/line-stack.js                          |   69 -
 public/data/line-step.js                           |   56 -
 public/data/line-style.js                          |   32 -
 public/data/line-tooltip-touch.js                  |  151 -
 public/data/line-y-category.js                     |   53 -
 public/data/lines-airline.js                       |   64 -
 public/data/lines-bmap-bus.js                      |  148 -
 public/data/lines-bmap-effect.js                   |  195 -
 public/data/lines-bmap.js                          |  133 -
 public/data/lines-ny.js                            |   91 -
 public/data/map-HK.js                              |   98 -
 public/data/map-bar-morph.js                       |  147 -
 public/data/map-bin.js                             |  207 -
 public/data/map-china-dataRange.js                 |  137 -
 public/data/map-china.js                           |   26 -
 public/data/map-labels.js                          |  169 -
 public/data/map-locate.js                          |   52 -
 public/data/map-polygon.js                         |  659 ---
 public/data/map-province.js                        |   95 -
 public/data/map-usa.js                             |  137 -
 public/data/map-world-dataRange.js                 |  237 -
 public/data/map-world.js                           |  213 -
 public/data/mix-line-bar.js                        |   78 -
 public/data/mix-timeline-finance.js                |  381 --
 public/data/mix-zoom-on-value.js                   |  101 -
 public/data/multiple-x-axis.js                     |   96 -
 public/data/multiple-y-axis.js                     |  111 -
 public/data/parallel-aqi.js                        |  224 -
 public/data/parallel-nutrients.js                  |  186 -
 public/data/parallel-simple.js                     |   31 -
 public/data/pictorialBar-bar-transition.js         |  144 -
 public/data/pictorialBar-body-fill.js              |  146 -
 public/data/pictorialBar-dotted.js                 |  111 -
 public/data/pictorialBar-forest.js                 |  111 -
 public/data/pictorialBar-hill.js                   |  113 -
 public/data/pictorialBar-spirit.js                 |  114 -
 public/data/pictorialBar-vehicle.js                |  113 -
 public/data/pictorialBar-velocity.js               |  100 -
 public/data/pie-alignTo.js                         |   94 -
 public/data/pie-borderRadius.js                    |   50 -
 public/data/pie-custom.js                          |   70 -
 public/data/pie-doughnut.js                        |   45 -
 public/data/pie-labelLine-adjust.js                |   95 -
 public/data/pie-legend.js                          |   81 -
 public/data/pie-nest.js                            |   87 -
 public/data/pie-parliament-transition.js           |  141 -
 public/data/pie-pattern.js                         |   63 -
 public/data/pie-rich-text.js                       |  135 -
 public/data/pie-roseType-simple.js                 |   44 -
 public/data/pie-roseType.js                        |   82 -
 public/data/pie-simple.js                          |   42 -
 public/data/polar-roundCap.js                      |   49 -
 public/data/radar-aqi.js                           |  222 -
 public/data/radar-custom.js                        |  138 -
 public/data/radar-multiple.js                      |   97 -
 public/data/radar.js                               |   40 -
 public/data/radar2.js                              |   73 -
 public/data/sankey-energy.js                       |   35 -
 public/data/sankey-itemstyle.js                    | 1281 ----
 public/data/sankey-levels.js                       |   71 -
 public/data/sankey-nodeAlign-left.js               |   37 -
 public/data/sankey-nodeAlign-right.js              |   38 -
 public/data/sankey-simple.js                       |   54 -
 public/data/sankey-vertical.js                     |   47 -
 public/data/scatter-aggregate-bar.js               |  187 -
 public/data/scatter-anscombe-quartet.js            |  145 -
 public/data/scatter-aqi-color.js                   |  261 -
 public/data/scatter-clustering-process.js          |  245 -
 public/data/scatter-clustering.js                  |  131 -
 public/data/scatter-effect.js                      |   78 -
 public/data/scatter-exponential-regression.js      |   84 -
 public/data/scatter-label-align-right.js           |   57 -
 public/data/scatter-label-align-top.js             |   51 -
 public/data/scatter-large.js                       |   74 -
 public/data/scatter-life-expectancy-timeline.js    |  169 -
 public/data/scatter-linear-regression.js           |  267 -
 public/data/scatter-logarithmic-regression.js      |  133 -
 public/data/scatter-map-brush.js                   |  652 ---
 public/data/scatter-map.js                         |  472 --
 public/data/scatter-matrix.js                      |  300 -
 public/data/scatter-nebula.js                      |   76 -
 public/data/scatter-nutrients-matrix.js            |  422 --
 public/data/scatter-nutrients.js                   |  177 -
 public/data/scatter-painter-choice.js              |   61 -
 public/data/scatter-polar-punchCard.js             |   65 -
 public/data/scatter-polynomial-regression.js       |   84 -
 public/data/scatter-punchCard.js                   |   70 -
 public/data/scatter-simple.js                      |   39 -
 public/data/scatter-single-axis.js                 |   56 -
 public/data/scatter-stream-visual.js               |   60 -
 public/data/scatter-symbol-morph.js                |   97 -
 public/data/scatter-weibo.js                       |  103 -
 public/data/scatter-weight.js                      |  264 -
 public/data/scatter-world-population.js            |  503 --
 public/data/sunburst-book.js                       |  336 --
 public/data/sunburst-borderRadius.js               |   65 -
 public/data/sunburst-drink.js                      |  723 ---
 public/data/sunburst-label-rotate.js               |   95 -
 public/data/sunburst-monochrome.js                 |  175 -
 public/data/sunburst-simple.js                     |   64 -
 public/data/sunburst-visualMap.js                  |   94 -
 public/data/themeRiver-basic.js                    |  100 -
 public/data/themeRiver-lastfm.js                   |   80 -
 public/data/thumb-dark/bar-drilldown.png           |  Bin 0 -> 11499 bytes
 public/data/thumb-dark/bar-drilldown.webp          |  Bin 0 -> 2474 bytes
 public/data/thumb-dark/bar-polar-label-radial.png  |  Bin 0 -> 53804 bytes
 public/data/thumb-dark/bar-polar-label-radial.webp |  Bin 0 -> 8408 bytes
 .../data/thumb-dark/bar-polar-label-tangential.png |  Bin 0 -> 73532 bytes
 .../thumb-dark/bar-polar-label-tangential.webp     |  Bin 0 -> 12660 bytes
 public/data/thumb-dark/bar-race-country.webp       |  Bin 9754 -> 789550 bytes
 public/data/thumb-dark/bar-race.webp               |  Bin 2760 -> 264420 bytes
 public/data/thumb-dark/gauge-clock.webp            |  Bin 5070 -> 65104 bytes
 public/data/thumb-dark/gauge-ring.webp             |  Bin 6294 -> 222920 bytes
 public/data/thumb-dark/gauge-simple.webp           |  Bin 3914 -> 45740 bytes
 public/data/thumb-dark/gauge-temperature.webp      |  Bin 8266 -> 104304 bytes
 public/data/thumb-dark/geo-svg-scatter-simple.png  |  Bin 0 -> 195652 bytes
 public/data/thumb-dark/geo-svg-scatter-simple.webp |  Bin 0 -> 20796 bytes
 public/data/thumb-dark/line-race.webp              |  Bin 18682 -> 610648 bytes
 public/data/thumb-dark/map-bar-morph.png           |  Bin 0 -> 69116 bytes
 public/data/thumb-dark/map-bar-morph.webp          |  Bin 0 -> 259692 bytes
 .../thumb-dark/pictorialBar-bar-transition.png     |  Bin 0 -> 73404 bytes
 .../thumb-dark/pictorialBar-bar-transition.webp    |  Bin 0 -> 570992 bytes
 public/data/thumb-dark/pictorialBar-forest.webp    |  Bin 8966 -> 227558 bytes
 public/data/thumb-dark/pictorialBar-hill.webp      |  Bin 20812 -> 466722 bytes
 .../data/thumb-dark/pie-parliament-transition.png  |  Bin 0 -> 33542 bytes
 .../data/thumb-dark/pie-parliament-transition.webp |  Bin 0 -> 855768 bytes
 public/data/thumb-dark/scatter-aggregate-bar.png   |  Bin 0 -> 95503 bytes
 public/data/thumb-dark/scatter-aggregate-bar.webp  |  Bin 0 -> 399840 bytes
 public/data/thumb-dark/scatter-symbol-morph.png    |  Bin 0 -> 26584 bytes
 public/data/thumb-dark/scatter-symbol-morph.webp   |  Bin 0 -> 2001348 bytes
 .../thumb-dark/treemap-sunburst-transition.png     |  Bin 0 -> 97310 bytes
 .../thumb-dark/treemap-sunburst-transition.webp    |  Bin 0 -> 213552 bytes
 public/data/thumb/bar-drilldown.png                |  Bin 0 -> 9993 bytes
 public/data/thumb/bar-drilldown.webp               |  Bin 0 -> 2112 bytes
 public/data/thumb/bar-polar-label-radial.png       |  Bin 0 -> 52497 bytes
 public/data/thumb/bar-polar-label-radial.webp      |  Bin 0 -> 8582 bytes
 public/data/thumb/bar-polar-label-tangential.png   |  Bin 0 -> 73607 bytes
 public/data/thumb/bar-polar-label-tangential.webp  |  Bin 0 -> 12994 bytes
 public/data/thumb/bar-race-country.webp            |  Bin 9738 -> 822554 bytes
 public/data/thumb/bar-race.webp                    |  Bin 2504 -> 250728 bytes
 public/data/thumb/data-transform-aggregate.png     |  Bin 53181 -> 54761 bytes
 public/data/thumb/gauge-clock.webp                 |  Bin 7788 -> 57998 bytes
 public/data/thumb/gauge-ring.webp                  |  Bin 5594 -> 151816 bytes
 public/data/thumb/gauge-simple.webp                |  Bin 3846 -> 39940 bytes
 public/data/thumb/gauge-temperature.webp           |  Bin 6464 -> 70688 bytes
 public/data/thumb/geo-svg-scatter-simple.png       |  Bin 0 -> 195360 bytes
 public/data/thumb/geo-svg-scatter-simple.webp      |  Bin 0 -> 20858 bytes
 public/data/thumb/line-race.webp                   |  Bin 16390 -> 554814 bytes
 public/data/thumb/map-bar-morph.png                |  Bin 0 -> 68614 bytes
 public/data/thumb/map-bar-morph.webp               |  Bin 0 -> 214358 bytes
 public/data/thumb/pictorialBar-bar-transition.png  |  Bin 0 -> 58849 bytes
 public/data/thumb/pictorialBar-bar-transition.webp |  Bin 0 -> 456466 bytes
 public/data/thumb/pictorialBar-forest.webp         |  Bin 9164 -> 219566 bytes
 public/data/thumb/pictorialBar-hill.webp           |  Bin 20776 -> 392340 bytes
 public/data/thumb/pie-parliament-transition.png    |  Bin 0 -> 29717 bytes
 public/data/thumb/pie-parliament-transition.webp   |  Bin 0 -> 632662 bytes
 public/data/thumb/scatter-aggregate-bar.png        |  Bin 0 -> 76586 bytes
 public/data/thumb/scatter-aggregate-bar.webp       |  Bin 0 -> 340958 bytes
 public/data/thumb/scatter-symbol-morph.png         |  Bin 0 -> 24364 bytes
 public/data/thumb/scatter-symbol-morph.webp        |  Bin 0 -> 2002988 bytes
 public/data/thumb/treemap-sunburst-transition.png  |  Bin 0 -> 101746 bytes
 public/data/thumb/treemap-sunburst-transition.webp |  Bin 0 -> 201466 bytes
 public/data/tree-basic.js                          |   58 -
 public/data/tree-legend.js                         |  260 -
 public/data/tree-orient-bottom-top.js              |   59 -
 public/data/tree-orient-right-left.js              |   64 -
 public/data/tree-polyline.js                       |  179 -
 public/data/tree-radial.js                         |   41 -
 public/data/tree-vertical.js                       |   54 -
 public/data/treemap-disk.js                        |   87 -
 public/data/treemap-drill-down.js                  |   85 -
 public/data/treemap-obama.js                       |  226 -
 public/data/treemap-show-parent.js                 |  103 -
 public/data/treemap-simple.js                      |   33 -
 public/data/treemap-sunburst-transition.js         |   56 -
 public/data/treemap-visual.js                      |  144 -
 public/data/watermark.js                           |  218 -
 public/data/wind-barb.js                           |  272 -
 public/en/editor.html                              |   53 +-
 public/en/index.html                               |   54 +-
 public/en/view.html                                |   53 +-
 public/examples/ts/README.md                       |    3 +
 .../ts/archive/custom-aggregate-scatter-bar.js     |  209 +
 .../archive/custom-aggregate-scatter-cluster.js    |    0
 .../ts/archive/custom-aggregate-scatter-pie.js     |  189 +
 .../ts}/archive/custom-combine-separate-morph.js   |    0
 .../ts}/archive/custom-one-to-one-morph.js         |    0
 .../ts}/archive/custom-story-transition.js         |    0
 public/examples/ts/area-basic.ts                   |   26 +
 public/examples/ts/area-pieces.ts                  |   65 +
 public/examples/ts/area-rainfall.ts                |  148 +
 public/examples/ts/area-simple.ts                  |   86 +
 public/examples/ts/area-stack-gradient.ts          |  191 +
 public/examples/ts/area-stack.ts                   |  105 +
 public/examples/ts/area-time-axis.ts               |   69 +
 public/examples/ts/bar-animation-delay.ts          |   72 +
 public/examples/ts/bar-background.ts               |   28 +
 public/examples/ts/bar-brush.ts                    |  114 +
 public/examples/ts/bar-data-color.ts               |   37 +
 public/examples/ts/bar-drilldown.ts                |  114 +
 public/examples/ts/bar-gradient.ts                 |   91 +
 public/examples/ts/bar-histogram.ts                |  146 +
 public/examples/ts/bar-label-rotation.ts           |  181 +
 public/examples/ts/bar-large.ts                    |   99 +
 public/examples/ts/bar-negative.ts                 |   80 +
 public/examples/ts/bar-negative2.ts                |   79 +
 public/examples/ts/bar-polar-label-radial.ts       |   40 +
 public/examples/ts/bar-polar-label-tangential.ts   |   39 +
 public/examples/ts/bar-polar-real-estate.ts        |  116 +
 public/examples/ts/bar-polar-stack-radial.ts       |   53 +
 public/examples/ts/bar-polar-stack.ts              |   54 +
 public/examples/ts/bar-race-country.ts             |  171 +
 public/examples/ts/bar-race.ts                     |   74 +
 public/examples/ts/bar-rich-text.ts                |  152 +
 public/examples/ts/bar-simple.ts                   |   24 +
 public/examples/ts/bar-stack.ts                    |  123 +
 public/examples/ts/bar-tick-align.ts               |   43 +
 public/examples/ts/bar-waterfall.ts                |   67 +
 public/examples/ts/bar-waterfall2.ts               |   90 +
 public/examples/ts/bar-y-category-stack.ts         |   93 +
 public/examples/ts/bar-y-category.ts               |   47 +
 public/examples/ts/bar1.ts                         |   77 +
 public/examples/ts/boxplot-light-velocity.ts       |   91 +
 public/examples/ts/boxplot-light-velocity2.ts      |   94 +
 public/examples/ts/boxplot-multi.ts                |  120 +
 public/examples/ts/bubble-gradient.ts              |  163 +
 public/examples/ts/calendar-charts.ts              |  183 +
 public/examples/ts/calendar-effectscatter.ts       |  170 +
 public/examples/ts/calendar-graph.ts               |  107 +
 public/examples/ts/calendar-heatmap.ts             |   56 +
 public/examples/ts/calendar-horizontal.ts          |   75 +
 public/examples/ts/calendar-lunar.ts               |  467 ++
 public/examples/ts/calendar-pie.ts                 |  126 +
 public/examples/ts/calendar-simple.ts              |   39 +
 public/examples/ts/calendar-vertical.ts            |   85 +
 public/examples/ts/candlestick-brush.ts            |  274 +
 public/examples/ts/candlestick-large.ts            |  220 +
 public/examples/ts/candlestick-sh-2015.ts          |  141 +
 public/examples/ts/candlestick-sh.ts               |  317 +
 public/examples/ts/candlestick-simple.ts           |   26 +
 public/examples/ts/candlestick-touch.ts            |  277 +
 public/examples/ts/circle-packing-with-d3.js       |  230 +
 public/examples/ts/confidence-band.ts              |  136 +
 public/examples/ts/custom-bar-trend.ts             |  126 +
 public/examples/ts/custom-calendar-icon.ts         |  142 +
 public/examples/ts/custom-cartesian-polygon.ts     |   69 +
 public/examples/ts/custom-error-bar.ts             |  126 +
 public/examples/ts/custom-error-scatter.ts         |  172 +
 public/examples/ts/custom-gantt-flight.js          |  586 ++
 public/examples/ts/custom-gauge.js                 |  180 +
 public/examples/ts/custom-hexbin.js                |  259 +
 public/examples/ts/custom-ohlc.ts                  |  173 +
 public/examples/ts/custom-polar-heatmap.ts         |   84 +
 public/examples/ts/custom-profile.js               |  123 +
 public/examples/ts/custom-profit.ts                |   82 +
 public/examples/ts/custom-spiral-race.js           |  300 +
 public/examples/ts/custom-wind.ts                  |  126 +
 public/examples/ts/cycle-plot.js                   |  145 +
 public/examples/ts/data-transform-aggregate.js     |  144 +
 public/examples/ts/data-transform-filter.ts        |   91 +
 public/examples/ts/data-transform-multiple-pie.ts  |   99 +
 public/examples/ts/data-transform-sort-bar.ts      |   43 +
 public/examples/ts/dataset-default.ts              |   57 +
 public/examples/ts/dataset-encode0.ts              |   51 +
 public/examples/ts/dataset-encode1.ts              |  123 +
 public/examples/ts/dataset-link.ts                 |   94 +
 public/examples/ts/dataset-series-layout-by.ts     |   38 +
 public/examples/ts/dataset-simple0.ts              |   27 +
 public/examples/ts/dataset-simple1.ts              |   27 +
 .../ts}/doc-example/aria-decal-newspaper.js        |    0
 .../ts}/doc-example/aria-decal-simple.js           |    0
 .../ts}/doc-example/aria-decal.js                  |    0
 .../{data => examples/ts}/doc-example/aria-pie.js  |    0
 .../ts}/doc-example/axisPointer-handle-image.js    |    0
 .../ts}/doc-example/bar-dataZoom-filterMode.js     |    0
 .../{data => examples/ts}/doc-example/bar-large.js |    0
 .../ts}/doc-example/bar-media-timeline.js          |    0
 .../ts}/doc-example/barGrid-barGap.js              |    0
 .../ts}/doc-example/candlestick-axisPointer.js     |    0
 .../ts}/doc-example/canvas-vs-svg-en.js            |    0
 .../ts}/doc-example/canvas-vs-svg.js               |    0
 .../ts}/doc-example/custom-transition-simple.js    |    0
 .../data-transform-multiple-sort-bar.js            |    0
 .../ts/doc-example/dataset-encode-simple0.js       |   30 +
 .../ts}/doc-example/geo-svg-label-basic.js         |    0
 .../ts}/doc-example/geo-svg-layout-basic.js        |    0
 .../ts}/doc-example/geo-svg-named-basic.js         |    0
 .../ts}/doc-example/getting-started.js             |    0
 .../ts}/doc-example/graphic-bounding.js            |    0
 .../ts}/doc-example/label-position.js              |    0
 .../ts}/doc-example/line-stack-tiled.js            |    0
 .../ts}/doc-example/map-example.js                 |    0
 .../doc-example/map-visualMap-continuous-text.js   |    0
 .../ts}/doc-example/map-visualMap-continuous.js    |    0
 .../ts}/doc-example/map-visualMap-pieces.js        |    0
 .../doc-example/map-visualMap-piecewise-text.js    |    0
 .../ts}/doc-example/mix-timeline-all.js            |    0
 .../ts}/doc-example/parallel-all.js                |    0
 .../ts}/doc-example/pictorialBar-clip.js           |    0
 .../ts}/doc-example/pictorialBar-graphicType.js    |    0
 .../ts}/doc-example/pictorialBar-patternSize.js    |    0
 .../ts}/doc-example/pictorialBar-position.js       |    0
 .../ts}/doc-example/pictorialBar-repeat.js         |    0
 .../doc-example/pictorialBar-repeatDirection.js    |    0
 .../ts}/doc-example/pictorialBar-repeatLayout.js   |    0
 .../pictorialBar-symbolBoundingDataArray.js        |    0
 .../ts}/doc-example/pictorialBar-symbolSize.js     |    0
 .../ts}/doc-example/pie-highlight.js               |    0
 .../ts}/doc-example/pie-label-bleedMargin.js       |    0
 .../doc-example/pie-label-distanceToLabelLine.js   |    0
 .../ts}/doc-example/pie-label-margin.js            |    0
 .../{data => examples/ts}/doc-example/pie-media.js |    0
 .../ts}/doc-example/polar-anticlockwise.js         |    0
 .../ts}/doc-example/polar-start-angle.js           |    0
 public/{data => examples/ts}/doc-example/radar.js  |    0
 .../ts}/doc-example/scatter-dataZoom-all.js        |    0
 .../ts}/doc-example/scatter-tutorial-dataZoom-1.js |    0
 .../ts}/doc-example/scatter-tutorial-dataZoom-2.js |    0
 .../ts}/doc-example/scatter-tutorial-dataZoom-3.js |    0
 .../doc-example/scatter-visualMap-categories.js    |    0
 .../ts}/doc-example/scatter-visualMap-piecewise.js |    0
 public/examples/ts/doc-example/sunburst-color.js   |   44 +
 .../ts}/doc-example/sunburst-highlight-ancestor.js |    0
 .../doc-example/sunburst-highlight-descendant.js   |    0
 .../ts}/doc-example/sunburst-label-align.js        |    0
 public/examples/ts/doc-example/sunburst-simple.js  |   28 +
 .../ts}/doc-example/text-block-fragment.js         |    0
 .../ts}/doc-example/text-fregment-align.js         |    0
 .../ts}/doc-example/text-options.js                |    0
 .../ts/doc-example/timeline-dynamic-series.js      |   72 +
 .../ts}/doc-example/title-block.js                 |    0
 .../ts}/doc-example/treemap-borderColor.js         |    0
 .../ts}/doc-example/tutorial-async.js              |    0
 .../ts}/doc-example/tutorial-dynamic-data.js       |    0
 .../ts}/doc-example/tutorial-loading.js            |    0
 .../ts}/doc-example/tutorial-styling-step0.js      |    0
 .../ts}/doc-example/tutorial-styling-step1.js      |    0
 .../ts}/doc-example/tutorial-styling-step2.js      |    0
 .../ts}/doc-example/tutorial-styling-step3.js      |    0
 .../ts}/doc-example/tutorial-styling-step4.js      |    0
 .../ts}/doc-example/tutorial-styling-step5.js      |    0
 .../ts}/doc-example/value-animation-simple.js      |    0
 public/examples/ts/dynamic-data.ts                 |  151 +
 public/examples/ts/dynamic-data2.ts                |   94 +
 public/examples/ts/effectScatter-bmap.ts           |  605 ++
 public/examples/ts/effectScatter-map.ts            |  515 ++
 public/examples/ts/funnel-align.ts                 |  108 +
 public/examples/ts/funnel-customize.ts             |   89 +
 public/examples/ts/funnel-mutiple.ts               |  104 +
 public/examples/ts/funnel.ts                       |   69 +
 public/examples/ts/gauge-barometer.ts              |  134 +
 public/examples/ts/gauge-car.ts                    |  521 ++
 public/examples/ts/gauge-clock.ts                  |  235 +
 public/examples/ts/gauge-grade.ts                  |   92 +
 public/examples/ts/gauge-multi-title.ts            |   99 +
 public/examples/ts/gauge-progress.ts               |  100 +
 public/examples/ts/gauge-ring.ts                   |  119 +
 public/examples/ts/gauge-simple.ts                 |   35 +
 public/examples/ts/gauge-speed.ts                  |   61 +
 public/examples/ts/gauge-stage.ts                  |   74 +
 public/examples/ts/gauge-temperature.ts            |  145 +
 public/examples/ts/gauge.ts                        |   29 +
 public/examples/ts/geo-beef-cuts.ts                |   75 +
 public/examples/ts/geo-lines.js                    |  305 +
 public/examples/ts/geo-map-scatter.js              |  348 ++
 public/examples/ts/geo-organ.js                    |   88 +
 public/examples/ts/geo-seatmap-flight.ts           |   92 +
 public/examples/ts/geo-svg-lines.ts                |   91 +
 public/examples/ts/geo-svg-map.ts                  |  213 +
 public/examples/ts/geo-svg-scatter-simple.ts       |   52 +
 public/examples/ts/geo-svg-traffic.ts              |  172 +
 .../examples/ts/gl/animating-contour-on-globe.js   |  182 +
 public/examples/ts/gl/bar3d-dataset.js             |   51 +
 public/examples/ts/gl/bar3d-global-population.js   |  109 +
 public/examples/ts/gl/bar3d-mapbox-view-change.js  |  118 +
 public/examples/ts/gl/bar3d-music-visualization.js |  161 +
 public/examples/ts/gl/bar3d-myth.js                |  107 +
 .../ts/gl/bar3d-noise-modified-from-marpi-demo.js  |  216 +
 public/examples/ts/gl/bar3d-on-mapbox.js           |   86 +
 public/examples/ts/gl/bar3d-punch-card.js          |   92 +
 public/examples/ts/gl/bar3d-shanghai.js            |   84 +
 public/examples/ts/gl/bar3d-simplex-noise.js       |   94 +
 public/examples/ts/gl/bar3d-voxelize-image.js      |  175 +
 public/examples/ts/gl/flowGL-noise.js              |  125 +
 .../examples/ts/gl/geo3d-with-different-height.js  |   74 +
 public/examples/ts/gl/geo3d.js                     |   49 +
 .../ts/gl/global-population-bar3d-on-globe.js      |   67 +
 .../examples/ts/gl/global-wind-visualization-2.js  |  277 +
 public/examples/ts/gl/global-wind-visualization.js |  211 +
 public/examples/ts/gl/globe-atmosphere.js          |   30 +
 public/examples/ts/gl/globe-contour-paint.js       |  177 +
 public/examples/ts/gl/globe-country-carousel.js    |  112 +
 public/examples/ts/gl/globe-displacement.js        |   57 +
 .../examples/ts/gl/globe-echarts-gl-hello-world.js |   35 +
 public/examples/ts/gl/globe-layers.js              |   45 +
 public/examples/ts/gl/globe-moon.js                |   54 +
 .../examples/ts/gl/globe-with-echarts-surface.js   |  254 +
 public/examples/ts/gl/graphgl-gpu-layout.js        |   71 +
 public/examples/ts/gl/graphgl-large-internet.js    |  101 +
 public/examples/ts/gl/graphgl-npm-dep.js           |  140 +
 public/examples/ts/gl/image-surface-sushuang.js    |   90 +
 public/examples/ts/gl/image-to-bar3d.js            |   93 +
 public/examples/ts/gl/iron-globe.js                |   39 +
 public/examples/ts/gl/line3d-orthographic.js       |   64 +
 public/examples/ts/gl/lines3d-airline-on-globe.js  |   53 +
 .../ts/gl/lines3d-flight-path-on-mapbox.js         |  190 +
 public/examples/ts/gl/lines3d-flights-gl.js        |   94 +
 public/examples/ts/gl/lines3d-flights-on-geo3d.js  |   76 +
 public/examples/ts/gl/lines3d-flights.js           |  149 +
 public/examples/ts/gl/lines3d-taxi-chengdu.js      | 1073 ++++
 .../ts/gl/lines3d-taxi-routes-of-cape-town.js      |  176 +
 public/examples/ts/gl/linesGL-ny.js                |   93 +
 public/examples/ts/gl/map3d-alcohol-consumption.js |   85 +
 public/examples/ts/gl/map3d-buildings-on-mapbox.js |   78 +
 public/examples/ts/gl/map3d-buildings.js           |  123 +
 public/examples/ts/gl/map3d-colorful-cities.js     |  108 +
 ...d-plastic-material-style-buildings-on-mapbox.js |   88 +
 public/examples/ts/gl/map3d-wood-city.js           |   95 +
 public/examples/ts/gl/map3d-wood-map-on-mapbox.js  |   73 +
 public/examples/ts/gl/map3d-wood-map.js            |   74 +
 public/examples/ts/gl/metal-bar3d.js               |  101 +
 public/examples/ts/gl/metal-surface.js             |  126 +
 public/examples/ts/gl/parametric-surface-rose.js   |  168 +
 public/examples/ts/gl/scatter3D-dataset.js         |   44 +
 .../examples/ts/gl/scatter3d-globe-population.js   |   89 +
 public/examples/ts/gl/scatter3d-orthographic.js    |   83 +
 public/examples/ts/gl/scatter3d-scatter.js         |  131 +
 public/examples/ts/gl/scatter3d-shanghai.js        |   63 +
 public/examples/ts/gl/scatter3d-simplex-noise.js   |   83 +
 .../ts/gl/scatter3d-weibo-checkin-on-mapbox.js     |   91 +
 public/examples/ts/gl/scatter3d.js                 |  225 +
 public/examples/ts/gl/scatterGL-gps.js             |   90 +
 public/examples/ts/gl/scattergl-weibo.js           |  104 +
 public/examples/ts/gl/simple-surface.js            |   67 +
 public/examples/ts/gl/sphere-parametric-surface.js |   62 +
 public/examples/ts/gl/stacked-bar3d.js             |   61 +
 public/examples/ts/gl/surface-breather.js          |  145 +
 public/examples/ts/gl/surface-golden-rose.js       |  175 +
 public/examples/ts/gl/surface-leather.js           |  140 +
 public/examples/ts/gl/surface-mollusc-shell.js     |   92 +
 public/examples/ts/gl/surface-theme-roses.js       |  170 +
 public/examples/ts/gl/surface-wave.js              |   72 +
 public/examples/ts/gl/transparent-bar3d.js         |   93 +
 public/examples/ts/graph-circular-layout.ts        |   70 +
 public/examples/ts/graph-force-dynamic.ts          |   65 +
 public/examples/ts/graph-force.ts                  |   58 +
 public/examples/ts/graph-force2.ts                 |   64 +
 public/examples/ts/graph-grid.ts                   |   52 +
 public/examples/ts/graph-label-overlap.ts          |   53 +
 public/examples/ts/graph-life-expectancy.ts        |  104 +
 public/examples/ts/graph-npm.ts                    |   78 +
 public/examples/ts/graph-simple.ts                 |  101 +
 public/examples/ts/graph-webkit-dep.ts             |   47 +
 public/examples/ts/graph.ts                        |   72 +
 public/examples/ts/grid-multiple.ts                |  184 +
 public/examples/ts/heatmap-bmap.js                 |   51 +
 public/examples/ts/heatmap-cartesian.ts            |   76 +
 public/examples/ts/heatmap-large-piecewise.js      |  449 ++
 public/examples/ts/heatmap-large.js                |  441 ++
 public/examples/ts/heatmap-map.js                  |  449 ++
 public/examples/ts/line-aqi.ts                     |  119 +
 public/examples/ts/line-draggable.ts               |  153 +
 public/examples/ts/line-easing.ts                  |  296 +
 public/examples/ts/line-function.ts                |   77 +
 public/examples/ts/line-gradient.ts                |   91 +
 public/examples/ts/line-graphic.ts                 |  122 +
 .../ts/line-in-cartesian-coordinate-system.ts      |   23 +
 public/examples/ts/line-log.ts                     |   68 +
 public/examples/ts/line-marker.ts                  |   86 +
 public/examples/ts/line-markline.ts                |   92 +
 public/examples/ts/line-pen.ts                     |   83 +
 public/examples/ts/line-polar.ts                   |   45 +
 public/examples/ts/line-polar2.ts                  |   51 +
 public/examples/ts/line-race.ts                    |  105 +
 public/examples/ts/line-sections.ts                |  105 +
 public/examples/ts/line-simple.ts                  |   24 +
 public/examples/ts/line-smooth.ts                  |   24 +
 public/examples/ts/line-stack.ts                   |   71 +
 public/examples/ts/line-step.ts                    |   58 +
 public/examples/ts/line-style.ts                   |   36 +
 public/examples/ts/line-tooltip-touch.ts           |  159 +
 public/examples/ts/line-y-category.ts              |   53 +
 public/examples/ts/lines-airline.ts                |   67 +
 public/examples/ts/lines-bmap-bus.ts               |  171 +
 public/examples/ts/lines-bmap-effect.ts            |  202 +
 public/examples/ts/lines-bmap.ts                   |  163 +
 public/examples/ts/lines-ny.ts                     |   95 +
 public/examples/ts/map-HK.ts                       |  100 +
 public/examples/ts/map-bar-morph.ts                |  151 +
 public/examples/ts/map-bin.js                      |  242 +
 public/examples/ts/map-china-dataRange.js          |  137 +
 public/examples/ts/map-china.js                    |   24 +
 public/examples/ts/map-labels.js                   |  173 +
 public/examples/ts/map-locate.js                   |   58 +
 public/examples/ts/map-polygon.js                  |  662 +++
 public/examples/ts/map-province.js                 |  105 +
 public/examples/ts/map-usa.ts                      |  156 +
 public/examples/ts/map-world-dataRange.js          |  240 +
 public/examples/ts/map-world.js                    |  213 +
 public/examples/ts/mix-line-bar.ts                 |   84 +
 public/examples/ts/mix-timeline-finance.js         |  441 ++
 public/examples/ts/mix-zoom-on-value.ts            |  103 +
 public/examples/ts/multiple-x-axis.ts              |  110 +
 public/examples/ts/multiple-y-axis.ts              |  116 +
 public/examples/ts/parallel-aqi.ts                 |  229 +
 public/examples/ts/parallel-nutrients.ts           |  183 +
 public/examples/ts/parallel-simple.ts              |   33 +
 public/examples/ts/pictorialBar-bar-transition.ts  |  165 +
 public/examples/ts/pictorialBar-body-fill.ts       |  169 +
 public/examples/ts/pictorialBar-dotted.ts          |  109 +
 public/examples/ts/pictorialBar-forest.ts          |  120 +
 public/examples/ts/pictorialBar-hill.ts            |  134 +
 public/examples/ts/pictorialBar-spirit.ts          |  121 +
 public/examples/ts/pictorialBar-vehicle.ts         |  128 +
 public/examples/ts/pictorialBar-velocity.ts        |  118 +
 public/examples/ts/pie-alignTo.ts                  |  113 +
 public/examples/ts/pie-borderRadius.ts             |   52 +
 public/examples/ts/pie-custom.ts                   |   74 +
 public/examples/ts/pie-doughnut.ts                 |   46 +
 public/examples/ts/pie-labelLine-adjust.ts         |   97 +
 public/examples/ts/pie-legend.ts                   |   80 +
 public/examples/ts/pie-nest.ts                     |  100 +
 public/examples/ts/pie-parliament-transition.ts    |  150 +
 public/examples/ts/pie-pattern.ts                  |   66 +
 public/examples/ts/pie-rich-text.ts                |  137 +
 public/examples/ts/pie-roseType-simple.ts          |   46 +
 public/examples/ts/pie-roseType.ts                 |   93 +
 public/examples/ts/pie-simple.ts                   |   44 +
 public/examples/ts/polar-roundCap.ts               |   53 +
 public/examples/ts/radar-aqi.ts                    |  214 +
 public/examples/ts/radar-custom.ts                 |  131 +
 public/examples/ts/radar-multiple.ts               |  109 +
 public/examples/ts/radar.ts                        |   43 +
 public/examples/ts/radar2.ts                       |   76 +
 public/examples/ts/sankey-energy.ts                |   39 +
 public/examples/ts/sankey-itemstyle.ts             | 1283 ++++
 public/examples/ts/sankey-levels.ts                |   79 +
 public/examples/ts/sankey-nodeAlign-left.ts        |   40 +
 public/examples/ts/sankey-nodeAlign-right.ts       |   41 +
 public/examples/ts/sankey-simple.ts                |   70 +
 public/examples/ts/sankey-vertical.ts              |   49 +
 public/examples/ts/scatter-aggregate-bar.ts        |  199 +
 public/examples/ts/scatter-anscombe-quartet.ts     |  152 +
 public/examples/ts/scatter-aqi-color.ts            |  260 +
 public/examples/ts/scatter-clustering-process.js   |  248 +
 public/examples/ts/scatter-clustering.ts           |  140 +
 public/examples/ts/scatter-effect.ts               |   84 +
 .../examples/ts/scatter-exponential-regression.ts  |   92 +
 public/examples/ts/scatter-label-align-right.ts    |   61 +
 public/examples/ts/scatter-label-align-top.ts      |   55 +
 public/examples/ts/scatter-large.ts                |   80 +
 .../ts/scatter-life-expectancy-timeline.js         |  172 +
 public/examples/ts/scatter-linear-regression.ts    |  274 +
 .../examples/ts/scatter-logarithmic-regression.ts  |  143 +
 public/examples/ts/scatter-map-brush.ts            |  840 +++
 public/examples/ts/scatter-map.js                  |  472 ++
 public/examples/ts/scatter-matrix.ts               |  322 +
 public/examples/ts/scatter-nebula.ts               |   85 +
 public/examples/ts/scatter-nutrients-matrix.ts     |  488 ++
 public/examples/ts/scatter-nutrients.ts            |  184 +
 public/examples/ts/scatter-painter-choice.ts       |   72 +
 public/examples/ts/scatter-polar-punchCard.ts      |   82 +
 .../examples/ts/scatter-polynomial-regression.ts   |   92 +
 public/examples/ts/scatter-punchCard.ts            |   87 +
 public/examples/ts/scatter-simple.ts               |   43 +
 public/examples/ts/scatter-single-axis.ts          |   70 +
 public/examples/ts/scatter-stream-visual.ts        |   64 +
 public/examples/ts/scatter-symbol-morph.ts         |  160 +
 public/examples/ts/scatter-weibo.ts                |  114 +
 public/examples/ts/scatter-weight.ts               |  280 +
 public/examples/ts/scatter-world-population.js     |  520 ++
 public/examples/ts/sunburst-book.js                |  446 ++
 public/examples/ts/sunburst-borderRadius.ts        |   86 +
 public/examples/ts/sunburst-drink.ts               |  866 +++
 public/examples/ts/sunburst-label-rotate.ts        |  128 +
 public/examples/ts/sunburst-monochrome.ts          |  246 +
 public/examples/ts/sunburst-simple.ts              |   86 +
 public/examples/ts/sunburst-visualMap.ts           |  126 +
 public/examples/ts/themeRiver-basic.ts             |  185 +
 public/examples/ts/themeRiver-lastfm.ts            |   81 +
 public/examples/ts/tree-basic.ts                   |   65 +
 public/examples/ts/tree-legend.ts                  |  258 +
 public/examples/ts/tree-orient-bottom-top.ts       |   62 +
 public/examples/ts/tree-orient-right-left.ts       |   67 +
 public/examples/ts/tree-polyline.ts                |  179 +
 public/examples/ts/tree-radial.ts                  |   45 +
 public/examples/ts/tree-vertical.ts                |   58 +
 public/examples/ts/treemap-disk.ts                 |   83 +
 public/examples/ts/treemap-drill-down.ts           |  103 +
 public/examples/ts/treemap-obama.ts                |  242 +
 public/examples/ts/treemap-show-parent.ts          |   97 +
 public/examples/ts/treemap-simple.ts               |   47 +
 public/examples/ts/treemap-sunburst-transition.ts  |   66 +
 public/examples/ts/treemap-visual.ts               |  155 +
 public/examples/ts/watermark.ts                    |  244 +
 public/examples/ts/wind-barb.ts                    |  321 +
 public/examples/tsconfig.json                      |   13 +
 public/examples/types/example.d.ts                 |   32 +
 public/types/echarts.d.ts                          | 4191 -------------
 public/zh/editor.html                              |   53 +-
 public/zh/index.html                               |   54 +-
 public/zh/view.html                                |   53 +-
 src/common/config.js                               |  227 +-
 src/common/helper.js                               |  105 +-
 src/common/i18n.js                                 |  291 +-
 src/common/route.js                                |   30 +
 src/common/store.js                                |   88 +-
 src/data/chart-list-data.js                        |  485 +-
 src/dep/showDebugDirtyRect.js                      |  152 +-
 src/editor/CodeAce.vue                             |  196 +-
 src/editor/CodeMonaco.vue                          |  338 +-
 src/editor/Editor.vue                              |  947 +--
 src/editor/FullCodePreview.vue                     |  143 +-
 src/editor/Preview.vue                             |  796 +--
 src/editor/View.vue                                |   27 +-
 src/editor/downloadExample.js                      |   22 +-
 src/editor/object-visualizer.css                   |  120 +-
 src/editor/sandbox.js                              |  376 +-
 src/editor/transformTs.js                          |   10 +-
 src/explore/ExampleCard.vue                        |  284 +-
 src/explore/Explore.vue                            |  671 ++-
 src/main.js                                        |   61 +-
 src/style/color.scss                               |   42 +-
 src/style/config.xl.scss                           | 1219 ++--
 tool/build-example.js                              |  677 ++-
 tool/compile-example.js                            |   35 +
 tool/screenshot.html                               |  320 +-
 tool/seedrandom.js                                 |  459 +-
 tool/updateFrontMatter.js                          |   43 +-
 884 files changed, 54177 insertions(+), 58979 deletions(-)
 create mode 100644 .eslintrc.js
 create mode 100644 .prettierignore
 create mode 100644 .prettierrc
 create mode 100644 .vscode/settings.json
 delete mode 100644 _config.yml
 delete mode 100644 e2e/package-lock.json
 delete mode 100644 public/data-gl/animating-contour-on-globe.js
 delete mode 100644 public/data-gl/bar3d-dataset.js
 delete mode 100644 public/data-gl/bar3d-global-population.js
 delete mode 100644 public/data-gl/bar3d-mapbox-view-change.js
 delete mode 100644 public/data-gl/bar3d-music-visualization.js
 delete mode 100644 public/data-gl/bar3d-myth.js
 delete mode 100644 public/data-gl/bar3d-noise-modified-from-marpi-demo.js
 delete mode 100644 public/data-gl/bar3d-on-mapbox.js
 delete mode 100644 public/data-gl/bar3d-punch-card.js
 delete mode 100644 public/data-gl/bar3d-shanghai.js
 delete mode 100644 public/data-gl/bar3d-simplex-noise.js
 delete mode 100644 public/data-gl/bar3d-voxelize-image.js
 delete mode 100644 public/data-gl/flowGL-noise.js
 delete mode 100644 public/data-gl/geo3d-with-different-height.js
 delete mode 100644 public/data-gl/geo3d.js
 delete mode 100644 public/data-gl/global-population-bar3d-on-globe.js
 delete mode 100644 public/data-gl/global-wind-visualization-2.js
 delete mode 100644 public/data-gl/global-wind-visualization.js
 delete mode 100644 public/data-gl/globe-atmosphere.js
 delete mode 100644 public/data-gl/globe-contour-paint.js
 delete mode 100644 public/data-gl/globe-country-carousel.js
 delete mode 100644 public/data-gl/globe-displacement.js
 delete mode 100644 public/data-gl/globe-echarts-gl-hello-world.js
 delete mode 100644 public/data-gl/globe-layers.js
 delete mode 100644 public/data-gl/globe-moon.js
 delete mode 100644 public/data-gl/globe-with-echarts-surface.js
 delete mode 100644 public/data-gl/graphgl-gpu-layout.js
 delete mode 100644 public/data-gl/graphgl-large-internet.js
 delete mode 100644 public/data-gl/graphgl-npm-dep.js
 delete mode 100644 public/data-gl/image-surface-sushuang.js
 delete mode 100644 public/data-gl/image-to-bar3d.js
 delete mode 100644 public/data-gl/iron-globe.js
 delete mode 100644 public/data-gl/line3d-orthographic.js
 delete mode 100644 public/data-gl/lines3d-airline-on-globe.js
 delete mode 100644 public/data-gl/lines3d-flight-path-on-mapbox.js
 delete mode 100644 public/data-gl/lines3d-flights-gl.js
 delete mode 100644 public/data-gl/lines3d-flights-on-geo3d.js
 delete mode 100644 public/data-gl/lines3d-flights.js
 delete mode 100644 public/data-gl/lines3d-taxi-chengdu.js
 delete mode 100644 public/data-gl/lines3d-taxi-routes-of-cape-town.js
 delete mode 100644 public/data-gl/linesGL-ny.js
 delete mode 100644 public/data-gl/map3d-alcohol-consumption.js
 delete mode 100644 public/data-gl/map3d-buildings-on-mapbox.js
 delete mode 100644 public/data-gl/map3d-buildings.js
 delete mode 100644 public/data-gl/map3d-colorful-cities.js
 delete mode 100644 public/data-gl/map3d-plastic-material-style-buildings-on-mapbox.js
 delete mode 100644 public/data-gl/map3d-wood-city.js
 delete mode 100644 public/data-gl/map3d-wood-map-on-mapbox.js
 delete mode 100644 public/data-gl/map3d-wood-map.js
 delete mode 100644 public/data-gl/metal-bar3d.js
 delete mode 100644 public/data-gl/metal-surface.js
 delete mode 100644 public/data-gl/parametric-surface-rose.js
 delete mode 100644 public/data-gl/scatter3D-dataset.js
 delete mode 100644 public/data-gl/scatter3d-globe-population.js
 delete mode 100644 public/data-gl/scatter3d-orthographic.js
 delete mode 100644 public/data-gl/scatter3d-scatter.js
 delete mode 100644 public/data-gl/scatter3d-shanghai.js
 delete mode 100644 public/data-gl/scatter3d-simplex-noise.js
 delete mode 100644 public/data-gl/scatter3d-weibo-checkin-on-mapbox.js
 delete mode 100644 public/data-gl/scatter3d.js
 delete mode 100644 public/data-gl/scatterGL-gps.js
 delete mode 100644 public/data-gl/scattergl-weibo.js
 delete mode 100644 public/data-gl/simple-surface.js
 delete mode 100644 public/data-gl/sphere-parametric-surface.js
 delete mode 100644 public/data-gl/stacked-bar3d.js
 delete mode 100644 public/data-gl/surface-breather.js
 delete mode 100644 public/data-gl/surface-golden-rose.js
 delete mode 100644 public/data-gl/surface-leather.js
 delete mode 100644 public/data-gl/surface-mollusc-shell.js
 delete mode 100644 public/data-gl/surface-theme-roses.js
 delete mode 100644 public/data-gl/surface-wave.js
 delete mode 100644 public/data-gl/transparent-bar3d.js
 delete mode 100644 public/data/archive/custom-aggregate-scatter-bar.js
 delete mode 100644 public/data/archive/custom-aggregate-scatter-pie.js
 delete mode 100644 public/data/area-basic.js
 delete mode 100644 public/data/area-pieces.js
 delete mode 100644 public/data/area-rainfall.js
 delete mode 100644 public/data/area-simple.js
 delete mode 100644 public/data/area-stack-gradient.js
 delete mode 100644 public/data/area-stack.js
 delete mode 100644 public/data/area-time-axis.js
 delete mode 100644 public/data/bar-animation-delay.js
 delete mode 100644 public/data/bar-background.js
 delete mode 100644 public/data/bar-brush.js
 delete mode 100644 public/data/bar-data-color.js
 delete mode 100644 public/data/bar-drilldown.js
 delete mode 100644 public/data/bar-gradient.js
 delete mode 100644 public/data/bar-histogram.js
 delete mode 100644 public/data/bar-label-rotation.js
 delete mode 100644 public/data/bar-large.js
 delete mode 100644 public/data/bar-negative.js
 delete mode 100644 public/data/bar-negative2.js
 delete mode 100644 public/data/bar-polar-label-radial.js
 delete mode 100644 public/data/bar-polar-label-tangential.js
 delete mode 100644 public/data/bar-polar-real-estate.js
 delete mode 100644 public/data/bar-polar-stack-radial.js
 delete mode 100644 public/data/bar-polar-stack.js
 delete mode 100644 public/data/bar-race-country.js
 delete mode 100644 public/data/bar-race.js
 delete mode 100644 public/data/bar-rich-text.js
 delete mode 100644 public/data/bar-simple.js
 delete mode 100644 public/data/bar-stack.js
 delete mode 100644 public/data/bar-tick-align.js
 delete mode 100644 public/data/bar-waterfall.js
 delete mode 100644 public/data/bar-waterfall2.js
 delete mode 100644 public/data/bar-y-category-stack.js
 delete mode 100644 public/data/bar-y-category.js
 delete mode 100644 public/data/bar1.js
 delete mode 100644 public/data/boxplot-light-velocity.js
 delete mode 100644 public/data/boxplot-light-velocity2.js
 delete mode 100644 public/data/boxplot-multi.js
 delete mode 100644 public/data/bubble-gradient.js
 delete mode 100644 public/data/calendar-charts.js
 delete mode 100644 public/data/calendar-effectscatter.js
 delete mode 100644 public/data/calendar-graph.js
 delete mode 100644 public/data/calendar-heatmap.js
 delete mode 100644 public/data/calendar-horizontal.js
 delete mode 100644 public/data/calendar-lunar.js
 delete mode 100644 public/data/calendar-pie.js
 delete mode 100644 public/data/calendar-simple.js
 delete mode 100644 public/data/calendar-vertical.js
 delete mode 100644 public/data/candlestick-brush.js
 delete mode 100644 public/data/candlestick-large.js
 delete mode 100644 public/data/candlestick-sh-2015.js
 delete mode 100644 public/data/candlestick-sh.js
 delete mode 100644 public/data/candlestick-simple.js
 delete mode 100644 public/data/candlestick-touch.js
 delete mode 100644 public/data/circle-packing-with-d3.js
 delete mode 100644 public/data/confidence-band.js
 delete mode 100644 public/data/covid-america.js
 delete mode 100644 public/data/custom-bar-trend.js
 delete mode 100644 public/data/custom-calendar-icon.js
 delete mode 100644 public/data/custom-cartesian-polygon.js
 delete mode 100644 public/data/custom-error-bar.js
 delete mode 100644 public/data/custom-error-scatter.js
 delete mode 100644 public/data/custom-gantt-flight.js
 delete mode 100644 public/data/custom-gauge.js
 delete mode 100644 public/data/custom-hexbin.js
 delete mode 100644 public/data/custom-ohlc.js
 delete mode 100644 public/data/custom-polar-heatmap.js
 delete mode 100644 public/data/custom-profile.js
 delete mode 100644 public/data/custom-profit.js
 delete mode 100644 public/data/custom-spiral-race.js
 delete mode 100644 public/data/custom-wind.js
 delete mode 100644 public/data/cycle-plot.js
 delete mode 100644 public/data/data-transform-aggregate.js
 delete mode 100644 public/data/data-transform-filter.js
 delete mode 100644 public/data/data-transform-multiple-pie.js
 delete mode 100644 public/data/data-transform-sort-bar.js
 delete mode 100644 public/data/dataset-default.js
 delete mode 100644 public/data/dataset-encode0.js
 delete mode 100644 public/data/dataset-encode1.js
 delete mode 100644 public/data/dataset-link.js
 delete mode 100644 public/data/dataset-series-layout-by.js
 delete mode 100644 public/data/dataset-simple0.js
 delete mode 100644 public/data/dataset-simple1.js
 delete mode 100644 public/data/doc-example/dataset-encode-simple0.js
 delete mode 100644 public/data/doc-example/sunburst-color.js
 delete mode 100644 public/data/doc-example/sunburst-simple.js
 delete mode 100644 public/data/doc-example/timeline-dynamic-series.js
 delete mode 100644 public/data/dynamic-data.js
 delete mode 100644 public/data/dynamic-data2.js
 delete mode 100644 public/data/effectScatter-bmap.js
 delete mode 100644 public/data/effectScatter-map.js
 delete mode 100644 public/data/funnel-align.js
 delete mode 100644 public/data/funnel-customize.js
 delete mode 100644 public/data/funnel-mutiple.js
 delete mode 100644 public/data/funnel.js
 delete mode 100644 public/data/gauge-barometer.js
 delete mode 100644 public/data/gauge-car.js
 delete mode 100644 public/data/gauge-clock.js
 delete mode 100644 public/data/gauge-grade.js
 delete mode 100644 public/data/gauge-multi-title.js
 delete mode 100644 public/data/gauge-progress.js
 delete mode 100644 public/data/gauge-ring.js
 delete mode 100644 public/data/gauge-simple.js
 delete mode 100644 public/data/gauge-speed.js
 delete mode 100644 public/data/gauge-stage.js
 delete mode 100644 public/data/gauge-temperature.js
 delete mode 100644 public/data/gauge.js
 delete mode 100644 public/data/geo-beef-cuts.js
 delete mode 100644 public/data/geo-lines.js
 delete mode 100644 public/data/geo-map-scatter.js
 delete mode 100644 public/data/geo-organ.js
 delete mode 100644 public/data/geo-seatmap-flight.js
 delete mode 100644 public/data/geo-svg-lines.js
 delete mode 100644 public/data/geo-svg-map.js
 delete mode 100644 public/data/geo-svg-scatter-simple.js
 delete mode 100644 public/data/geo-svg-traffic.js
 delete mode 100644 public/data/graph-circular-layout.js
 delete mode 100644 public/data/graph-force-dynamic.js
 delete mode 100644 public/data/graph-force.js
 delete mode 100644 public/data/graph-force2.js
 delete mode 100644 public/data/graph-grid.js
 delete mode 100644 public/data/graph-label-overlap.js
 delete mode 100644 public/data/graph-life-expectancy.js
 delete mode 100644 public/data/graph-npm.js
 delete mode 100644 public/data/graph-simple.js
 delete mode 100644 public/data/graph-webkit-dep.js
 delete mode 100644 public/data/graph.js
 delete mode 100644 public/data/grid-multiple.js
 delete mode 100644 public/data/heatmap-bmap.js
 delete mode 100644 public/data/heatmap-cartesian.js
 delete mode 100644 public/data/heatmap-large-piecewise.js
 delete mode 100644 public/data/heatmap-large.js
 delete mode 100644 public/data/heatmap-map.js
 delete mode 100644 public/data/line-aqi.js
 delete mode 100644 public/data/line-draggable.js
 delete mode 100644 public/data/line-easing.js
 delete mode 100644 public/data/line-function.js
 delete mode 100644 public/data/line-gradient.js
 delete mode 100644 public/data/line-graphic.js
 delete mode 100644 public/data/line-in-cartesian-coordinate-system.js
 delete mode 100644 public/data/line-log.js
 delete mode 100644 public/data/line-marker.js
 delete mode 100644 public/data/line-markline.js
 delete mode 100644 public/data/line-pen.js
 delete mode 100644 public/data/line-polar.js
 delete mode 100644 public/data/line-polar2.js
 delete mode 100644 public/data/line-race.js
 delete mode 100644 public/data/line-sections.js
 delete mode 100644 public/data/line-simple.js
 delete mode 100644 public/data/line-smooth.js
 delete mode 100644 public/data/line-stack.js
 delete mode 100644 public/data/line-step.js
 delete mode 100644 public/data/line-style.js
 delete mode 100644 public/data/line-tooltip-touch.js
 delete mode 100644 public/data/line-y-category.js
 delete mode 100644 public/data/lines-airline.js
 delete mode 100644 public/data/lines-bmap-bus.js
 delete mode 100644 public/data/lines-bmap-effect.js
 delete mode 100644 public/data/lines-bmap.js
 delete mode 100644 public/data/lines-ny.js
 delete mode 100644 public/data/map-HK.js
 delete mode 100644 public/data/map-bar-morph.js
 delete mode 100644 public/data/map-bin.js
 delete mode 100644 public/data/map-china-dataRange.js
 delete mode 100644 public/data/map-china.js
 delete mode 100644 public/data/map-labels.js
 delete mode 100644 public/data/map-locate.js
 delete mode 100644 public/data/map-polygon.js
 delete mode 100644 public/data/map-province.js
 delete mode 100644 public/data/map-usa.js
 delete mode 100644 public/data/map-world-dataRange.js
 delete mode 100644 public/data/map-world.js
 delete mode 100644 public/data/mix-line-bar.js
 delete mode 100644 public/data/mix-timeline-finance.js
 delete mode 100644 public/data/mix-zoom-on-value.js
 delete mode 100644 public/data/multiple-x-axis.js
 delete mode 100644 public/data/multiple-y-axis.js
 delete mode 100644 public/data/parallel-aqi.js
 delete mode 100644 public/data/parallel-nutrients.js
 delete mode 100644 public/data/parallel-simple.js
 delete mode 100644 public/data/pictorialBar-bar-transition.js
 delete mode 100644 public/data/pictorialBar-body-fill.js
 delete mode 100644 public/data/pictorialBar-dotted.js
 delete mode 100644 public/data/pictorialBar-forest.js
 delete mode 100644 public/data/pictorialBar-hill.js
 delete mode 100644 public/data/pictorialBar-spirit.js
 delete mode 100644 public/data/pictorialBar-vehicle.js
 delete mode 100644 public/data/pictorialBar-velocity.js
 delete mode 100644 public/data/pie-alignTo.js
 delete mode 100644 public/data/pie-borderRadius.js
 delete mode 100644 public/data/pie-custom.js
 delete mode 100644 public/data/pie-doughnut.js
 delete mode 100644 public/data/pie-labelLine-adjust.js
 delete mode 100644 public/data/pie-legend.js
 delete mode 100644 public/data/pie-nest.js
 delete mode 100644 public/data/pie-parliament-transition.js
 delete mode 100644 public/data/pie-pattern.js
 delete mode 100644 public/data/pie-rich-text.js
 delete mode 100644 public/data/pie-roseType-simple.js
 delete mode 100644 public/data/pie-roseType.js
 delete mode 100644 public/data/pie-simple.js
 delete mode 100644 public/data/polar-roundCap.js
 delete mode 100644 public/data/radar-aqi.js
 delete mode 100644 public/data/radar-custom.js
 delete mode 100644 public/data/radar-multiple.js
 delete mode 100644 public/data/radar.js
 delete mode 100644 public/data/radar2.js
 delete mode 100644 public/data/sankey-energy.js
 delete mode 100644 public/data/sankey-itemstyle.js
 delete mode 100644 public/data/sankey-levels.js
 delete mode 100644 public/data/sankey-nodeAlign-left.js
 delete mode 100644 public/data/sankey-nodeAlign-right.js
 delete mode 100644 public/data/sankey-simple.js
 delete mode 100644 public/data/sankey-vertical.js
 delete mode 100644 public/data/scatter-aggregate-bar.js
 delete mode 100644 public/data/scatter-anscombe-quartet.js
 delete mode 100644 public/data/scatter-aqi-color.js
 delete mode 100644 public/data/scatter-clustering-process.js
 delete mode 100644 public/data/scatter-clustering.js
 delete mode 100644 public/data/scatter-effect.js
 delete mode 100644 public/data/scatter-exponential-regression.js
 delete mode 100644 public/data/scatter-label-align-right.js
 delete mode 100644 public/data/scatter-label-align-top.js
 delete mode 100644 public/data/scatter-large.js
 delete mode 100644 public/data/scatter-life-expectancy-timeline.js
 delete mode 100644 public/data/scatter-linear-regression.js
 delete mode 100644 public/data/scatter-logarithmic-regression.js
 delete mode 100644 public/data/scatter-map-brush.js
 delete mode 100644 public/data/scatter-map.js
 delete mode 100644 public/data/scatter-matrix.js
 delete mode 100644 public/data/scatter-nebula.js
 delete mode 100644 public/data/scatter-nutrients-matrix.js
 delete mode 100644 public/data/scatter-nutrients.js
 delete mode 100644 public/data/scatter-painter-choice.js
 delete mode 100644 public/data/scatter-polar-punchCard.js
 delete mode 100644 public/data/scatter-polynomial-regression.js
 delete mode 100644 public/data/scatter-punchCard.js
 delete mode 100644 public/data/scatter-simple.js
 delete mode 100644 public/data/scatter-single-axis.js
 delete mode 100644 public/data/scatter-stream-visual.js
 delete mode 100644 public/data/scatter-symbol-morph.js
 delete mode 100644 public/data/scatter-weibo.js
 delete mode 100644 public/data/scatter-weight.js
 delete mode 100644 public/data/scatter-world-population.js
 delete mode 100644 public/data/sunburst-book.js
 delete mode 100644 public/data/sunburst-borderRadius.js
 delete mode 100644 public/data/sunburst-drink.js
 delete mode 100644 public/data/sunburst-label-rotate.js
 delete mode 100644 public/data/sunburst-monochrome.js
 delete mode 100644 public/data/sunburst-simple.js
 delete mode 100644 public/data/sunburst-visualMap.js
 delete mode 100644 public/data/themeRiver-basic.js
 delete mode 100644 public/data/themeRiver-lastfm.js
 create mode 100644 public/data/thumb-dark/bar-drilldown.png
 create mode 100644 public/data/thumb-dark/bar-drilldown.webp
 create mode 100644 public/data/thumb-dark/bar-polar-label-radial.png
 create mode 100644 public/data/thumb-dark/bar-polar-label-radial.webp
 create mode 100644 public/data/thumb-dark/bar-polar-label-tangential.png
 create mode 100644 public/data/thumb-dark/bar-polar-label-tangential.webp
 create mode 100644 public/data/thumb-dark/geo-svg-scatter-simple.png
 create mode 100644 public/data/thumb-dark/geo-svg-scatter-simple.webp
 create mode 100644 public/data/thumb-dark/map-bar-morph.png
 create mode 100644 public/data/thumb-dark/map-bar-morph.webp
 create mode 100644 public/data/thumb-dark/pictorialBar-bar-transition.png
 create mode 100644 public/data/thumb-dark/pictorialBar-bar-transition.webp
 create mode 100644 public/data/thumb-dark/pie-parliament-transition.png
 create mode 100644 public/data/thumb-dark/pie-parliament-transition.webp
 create mode 100644 public/data/thumb-dark/scatter-aggregate-bar.png
 create mode 100644 public/data/thumb-dark/scatter-aggregate-bar.webp
 create mode 100644 public/data/thumb-dark/scatter-symbol-morph.png
 create mode 100644 public/data/thumb-dark/scatter-symbol-morph.webp
 create mode 100644 public/data/thumb-dark/treemap-sunburst-transition.png
 create mode 100644 public/data/thumb-dark/treemap-sunburst-transition.webp
 create mode 100644 public/data/thumb/bar-drilldown.png
 create mode 100644 public/data/thumb/bar-drilldown.webp
 create mode 100644 public/data/thumb/bar-polar-label-radial.png
 create mode 100644 public/data/thumb/bar-polar-label-radial.webp
 create mode 100644 public/data/thumb/bar-polar-label-tangential.png
 create mode 100644 public/data/thumb/bar-polar-label-tangential.webp
 create mode 100644 public/data/thumb/geo-svg-scatter-simple.png
 create mode 100644 public/data/thumb/geo-svg-scatter-simple.webp
 create mode 100644 public/data/thumb/map-bar-morph.png
 create mode 100644 public/data/thumb/map-bar-morph.webp
 create mode 100644 public/data/thumb/pictorialBar-bar-transition.png
 create mode 100644 public/data/thumb/pictorialBar-bar-transition.webp
 create mode 100644 public/data/thumb/pie-parliament-transition.png
 create mode 100644 public/data/thumb/pie-parliament-transition.webp
 create mode 100644 public/data/thumb/scatter-aggregate-bar.png
 create mode 100644 public/data/thumb/scatter-aggregate-bar.webp
 create mode 100644 public/data/thumb/scatter-symbol-morph.png
 create mode 100644 public/data/thumb/scatter-symbol-morph.webp
 create mode 100644 public/data/thumb/treemap-sunburst-transition.png
 create mode 100644 public/data/thumb/treemap-sunburst-transition.webp
 delete mode 100644 public/data/tree-basic.js
 delete mode 100644 public/data/tree-legend.js
 delete mode 100644 public/data/tree-orient-bottom-top.js
 delete mode 100644 public/data/tree-orient-right-left.js
 delete mode 100644 public/data/tree-polyline.js
 delete mode 100644 public/data/tree-radial.js
 delete mode 100644 public/data/tree-vertical.js
 delete mode 100644 public/data/treemap-disk.js
 delete mode 100644 public/data/treemap-drill-down.js
 delete mode 100644 public/data/treemap-obama.js
 delete mode 100644 public/data/treemap-show-parent.js
 delete mode 100644 public/data/treemap-simple.js
 delete mode 100644 public/data/treemap-sunburst-transition.js
 delete mode 100644 public/data/treemap-visual.js
 delete mode 100644 public/data/watermark.js
 delete mode 100644 public/data/wind-barb.js
 create mode 100644 public/examples/ts/README.md
 create mode 100644 public/examples/ts/archive/custom-aggregate-scatter-bar.js
 rename public/{data => examples/ts}/archive/custom-aggregate-scatter-cluster.js (100%)
 create mode 100644 public/examples/ts/archive/custom-aggregate-scatter-pie.js
 rename public/{data => examples/ts}/archive/custom-combine-separate-morph.js (100%)
 rename public/{data => examples/ts}/archive/custom-one-to-one-morph.js (100%)
 rename public/{data => examples/ts}/archive/custom-story-transition.js (100%)
 create mode 100644 public/examples/ts/area-basic.ts
 create mode 100644 public/examples/ts/area-pieces.ts
 create mode 100644 public/examples/ts/area-rainfall.ts
 create mode 100644 public/examples/ts/area-simple.ts
 create mode 100644 public/examples/ts/area-stack-gradient.ts
 create mode 100644 public/examples/ts/area-stack.ts
 create mode 100644 public/examples/ts/area-time-axis.ts
 create mode 100644 public/examples/ts/bar-animation-delay.ts
 create mode 100644 public/examples/ts/bar-background.ts
 create mode 100644 public/examples/ts/bar-brush.ts
 create mode 100644 public/examples/ts/bar-data-color.ts
 create mode 100644 public/examples/ts/bar-drilldown.ts
 create mode 100644 public/examples/ts/bar-gradient.ts
 create mode 100644 public/examples/ts/bar-histogram.ts
 create mode 100644 public/examples/ts/bar-label-rotation.ts
 create mode 100644 public/examples/ts/bar-large.ts
 create mode 100644 public/examples/ts/bar-negative.ts
 create mode 100644 public/examples/ts/bar-negative2.ts
 create mode 100644 public/examples/ts/bar-polar-label-radial.ts
 create mode 100644 public/examples/ts/bar-polar-label-tangential.ts
 create mode 100644 public/examples/ts/bar-polar-real-estate.ts
 create mode 100644 public/examples/ts/bar-polar-stack-radial.ts
 create mode 100644 public/examples/ts/bar-polar-stack.ts
 create mode 100644 public/examples/ts/bar-race-country.ts
 create mode 100644 public/examples/ts/bar-race.ts
 create mode 100644 public/examples/ts/bar-rich-text.ts
 create mode 100644 public/examples/ts/bar-simple.ts
 create mode 100644 public/examples/ts/bar-stack.ts
 create mode 100644 public/examples/ts/bar-tick-align.ts
 create mode 100644 public/examples/ts/bar-waterfall.ts
 create mode 100644 public/examples/ts/bar-waterfall2.ts
 create mode 100644 public/examples/ts/bar-y-category-stack.ts
 create mode 100644 public/examples/ts/bar-y-category.ts
 create mode 100644 public/examples/ts/bar1.ts
 create mode 100644 public/examples/ts/boxplot-light-velocity.ts
 create mode 100644 public/examples/ts/boxplot-light-velocity2.ts
 create mode 100644 public/examples/ts/boxplot-multi.ts
 create mode 100644 public/examples/ts/bubble-gradient.ts
 create mode 100644 public/examples/ts/calendar-charts.ts
 create mode 100644 public/examples/ts/calendar-effectscatter.ts
 create mode 100644 public/examples/ts/calendar-graph.ts
 create mode 100644 public/examples/ts/calendar-heatmap.ts
 create mode 100644 public/examples/ts/calendar-horizontal.ts
 create mode 100644 public/examples/ts/calendar-lunar.ts
 create mode 100644 public/examples/ts/calendar-pie.ts
 create mode 100644 public/examples/ts/calendar-simple.ts
 create mode 100644 public/examples/ts/calendar-vertical.ts
 create mode 100644 public/examples/ts/candlestick-brush.ts
 create mode 100644 public/examples/ts/candlestick-large.ts
 create mode 100644 public/examples/ts/candlestick-sh-2015.ts
 create mode 100644 public/examples/ts/candlestick-sh.ts
 create mode 100644 public/examples/ts/candlestick-simple.ts
 create mode 100644 public/examples/ts/candlestick-touch.ts
 create mode 100644 public/examples/ts/circle-packing-with-d3.js
 create mode 100644 public/examples/ts/confidence-band.ts
 create mode 100644 public/examples/ts/custom-bar-trend.ts
 create mode 100644 public/examples/ts/custom-calendar-icon.ts
 create mode 100644 public/examples/ts/custom-cartesian-polygon.ts
 create mode 100644 public/examples/ts/custom-error-bar.ts
 create mode 100644 public/examples/ts/custom-error-scatter.ts
 create mode 100644 public/examples/ts/custom-gantt-flight.js
 create mode 100644 public/examples/ts/custom-gauge.js
 create mode 100644 public/examples/ts/custom-hexbin.js
 create mode 100644 public/examples/ts/custom-ohlc.ts
 create mode 100644 public/examples/ts/custom-polar-heatmap.ts
 create mode 100644 public/examples/ts/custom-profile.js
 create mode 100644 public/examples/ts/custom-profit.ts
 create mode 100644 public/examples/ts/custom-spiral-race.js
 create mode 100644 public/examples/ts/custom-wind.ts
 create mode 100644 public/examples/ts/cycle-plot.js
 create mode 100644 public/examples/ts/data-transform-aggregate.js
 create mode 100644 public/examples/ts/data-transform-filter.ts
 create mode 100644 public/examples/ts/data-transform-multiple-pie.ts
 create mode 100644 public/examples/ts/data-transform-sort-bar.ts
 create mode 100644 public/examples/ts/dataset-default.ts
 create mode 100644 public/examples/ts/dataset-encode0.ts
 create mode 100644 public/examples/ts/dataset-encode1.ts
 create mode 100644 public/examples/ts/dataset-link.ts
 create mode 100644 public/examples/ts/dataset-series-layout-by.ts
 create mode 100644 public/examples/ts/dataset-simple0.ts
 create mode 100644 public/examples/ts/dataset-simple1.ts
 rename public/{data => examples/ts}/doc-example/aria-decal-newspaper.js (100%)
 rename public/{data => examples/ts}/doc-example/aria-decal-simple.js (100%)
 rename public/{data => examples/ts}/doc-example/aria-decal.js (100%)
 rename public/{data => examples/ts}/doc-example/aria-pie.js (100%)
 rename public/{data => examples/ts}/doc-example/axisPointer-handle-image.js (100%)
 rename public/{data => examples/ts}/doc-example/bar-dataZoom-filterMode.js (100%)
 rename public/{data => examples/ts}/doc-example/bar-large.js (100%)
 rename public/{data => examples/ts}/doc-example/bar-media-timeline.js (100%)
 rename public/{data => examples/ts}/doc-example/barGrid-barGap.js (100%)
 rename public/{data => examples/ts}/doc-example/candlestick-axisPointer.js (100%)
 rename public/{data => examples/ts}/doc-example/canvas-vs-svg-en.js (100%)
 rename public/{data => examples/ts}/doc-example/canvas-vs-svg.js (100%)
 rename public/{data => examples/ts}/doc-example/custom-transition-simple.js (100%)
 rename public/{data => examples/ts}/doc-example/data-transform-multiple-sort-bar.js (100%)
 create mode 100644 public/examples/ts/doc-example/dataset-encode-simple0.js
 rename public/{data => examples/ts}/doc-example/geo-svg-label-basic.js (100%)
 rename public/{data => examples/ts}/doc-example/geo-svg-layout-basic.js (100%)
 rename public/{data => examples/ts}/doc-example/geo-svg-named-basic.js (100%)
 rename public/{data => examples/ts}/doc-example/getting-started.js (100%)
 rename public/{data => examples/ts}/doc-example/graphic-bounding.js (100%)
 rename public/{data => examples/ts}/doc-example/label-position.js (100%)
 rename public/{data => examples/ts}/doc-example/line-stack-tiled.js (100%)
 rename public/{data => examples/ts}/doc-example/map-example.js (100%)
 rename public/{data => examples/ts}/doc-example/map-visualMap-continuous-text.js (100%)
 rename public/{data => examples/ts}/doc-example/map-visualMap-continuous.js (100%)
 rename public/{data => examples/ts}/doc-example/map-visualMap-pieces.js (100%)
 rename public/{data => examples/ts}/doc-example/map-visualMap-piecewise-text.js (100%)
 rename public/{data => examples/ts}/doc-example/mix-timeline-all.js (100%)
 rename public/{data => examples/ts}/doc-example/parallel-all.js (100%)
 rename public/{data => examples/ts}/doc-example/pictorialBar-clip.js (100%)
 rename public/{data => examples/ts}/doc-example/pictorialBar-graphicType.js (100%)
 rename public/{data => examples/ts}/doc-example/pictorialBar-patternSize.js (100%)
 rename public/{data => examples/ts}/doc-example/pictorialBar-position.js (100%)
 rename public/{data => examples/ts}/doc-example/pictorialBar-repeat.js (100%)
 rename public/{data => examples/ts}/doc-example/pictorialBar-repeatDirection.js (100%)
 rename public/{data => examples/ts}/doc-example/pictorialBar-repeatLayout.js (100%)
 rename public/{data => examples/ts}/doc-example/pictorialBar-symbolBoundingDataArray.js (100%)
 rename public/{data => examples/ts}/doc-example/pictorialBar-symbolSize.js (100%)
 rename public/{data => examples/ts}/doc-example/pie-highlight.js (100%)
 rename public/{data => examples/ts}/doc-example/pie-label-bleedMargin.js (100%)
 rename public/{data => examples/ts}/doc-example/pie-label-distanceToLabelLine.js (100%)
 rename public/{data => examples/ts}/doc-example/pie-label-margin.js (100%)
 rename public/{data => examples/ts}/doc-example/pie-media.js (100%)
 rename public/{data => examples/ts}/doc-example/polar-anticlockwise.js (100%)
 rename public/{data => examples/ts}/doc-example/polar-start-angle.js (100%)
 rename public/{data => examples/ts}/doc-example/radar.js (100%)
 rename public/{data => examples/ts}/doc-example/scatter-dataZoom-all.js (100%)
 rename public/{data => examples/ts}/doc-example/scatter-tutorial-dataZoom-1.js (100%)
 rename public/{data => examples/ts}/doc-example/scatter-tutorial-dataZoom-2.js (100%)
 rename public/{data => examples/ts}/doc-example/scatter-tutorial-dataZoom-3.js (100%)
 rename public/{data => examples/ts}/doc-example/scatter-visualMap-categories.js (100%)
 rename public/{data => examples/ts}/doc-example/scatter-visualMap-piecewise.js (100%)
 create mode 100644 public/examples/ts/doc-example/sunburst-color.js
 rename public/{data => examples/ts}/doc-example/sunburst-highlight-ancestor.js (100%)
 rename public/{data => examples/ts}/doc-example/sunburst-highlight-descendant.js (100%)
 rename public/{data => examples/ts}/doc-example/sunburst-label-align.js (100%)
 create mode 100644 public/examples/ts/doc-example/sunburst-simple.js
 rename public/{data => examples/ts}/doc-example/text-block-fragment.js (100%)
 rename public/{data => examples/ts}/doc-example/text-fregment-align.js (100%)
 rename public/{data => examples/ts}/doc-example/text-options.js (100%)
 create mode 100644 public/examples/ts/doc-example/timeline-dynamic-series.js
 rename public/{data => examples/ts}/doc-example/title-block.js (100%)
 rename public/{data => examples/ts}/doc-example/treemap-borderColor.js (100%)
 rename public/{data => examples/ts}/doc-example/tutorial-async.js (100%)
 rename public/{data => examples/ts}/doc-example/tutorial-dynamic-data.js (100%)
 rename public/{data => examples/ts}/doc-example/tutorial-loading.js (100%)
 rename public/{data => examples/ts}/doc-example/tutorial-styling-step0.js (100%)
 rename public/{data => examples/ts}/doc-example/tutorial-styling-step1.js (100%)
 rename public/{data => examples/ts}/doc-example/tutorial-styling-step2.js (100%)
 rename public/{data => examples/ts}/doc-example/tutorial-styling-step3.js (100%)
 rename public/{data => examples/ts}/doc-example/tutorial-styling-step4.js (100%)
 rename public/{data => examples/ts}/doc-example/tutorial-styling-step5.js (100%)
 rename public/{data => examples/ts}/doc-example/value-animation-simple.js (100%)
 create mode 100644 public/examples/ts/dynamic-data.ts
 create mode 100644 public/examples/ts/dynamic-data2.ts
 create mode 100644 public/examples/ts/effectScatter-bmap.ts
 create mode 100644 public/examples/ts/effectScatter-map.ts
 create mode 100644 public/examples/ts/funnel-align.ts
 create mode 100644 public/examples/ts/funnel-customize.ts
 create mode 100644 public/examples/ts/funnel-mutiple.ts
 create mode 100644 public/examples/ts/funnel.ts
 create mode 100644 public/examples/ts/gauge-barometer.ts
 create mode 100644 public/examples/ts/gauge-car.ts
 create mode 100644 public/examples/ts/gauge-clock.ts
 create mode 100644 public/examples/ts/gauge-grade.ts
 create mode 100644 public/examples/ts/gauge-multi-title.ts
 create mode 100644 public/examples/ts/gauge-progress.ts
 create mode 100644 public/examples/ts/gauge-ring.ts
 create mode 100644 public/examples/ts/gauge-simple.ts
 create mode 100644 public/examples/ts/gauge-speed.ts
 create mode 100644 public/examples/ts/gauge-stage.ts
 create mode 100644 public/examples/ts/gauge-temperature.ts
 create mode 100644 public/examples/ts/gauge.ts
 create mode 100644 public/examples/ts/geo-beef-cuts.ts
 create mode 100644 public/examples/ts/geo-lines.js
 create mode 100644 public/examples/ts/geo-map-scatter.js
 create mode 100644 public/examples/ts/geo-organ.js
 create mode 100644 public/examples/ts/geo-seatmap-flight.ts
 create mode 100644 public/examples/ts/geo-svg-lines.ts
 create mode 100644 public/examples/ts/geo-svg-map.ts
 create mode 100644 public/examples/ts/geo-svg-scatter-simple.ts
 create mode 100644 public/examples/ts/geo-svg-traffic.ts
 create mode 100644 public/examples/ts/gl/animating-contour-on-globe.js
 create mode 100644 public/examples/ts/gl/bar3d-dataset.js
 create mode 100644 public/examples/ts/gl/bar3d-global-population.js
 create mode 100644 public/examples/ts/gl/bar3d-mapbox-view-change.js
 create mode 100644 public/examples/ts/gl/bar3d-music-visualization.js
 create mode 100644 public/examples/ts/gl/bar3d-myth.js
 create mode 100644 public/examples/ts/gl/bar3d-noise-modified-from-marpi-demo.js
 create mode 100644 public/examples/ts/gl/bar3d-on-mapbox.js
 create mode 100644 public/examples/ts/gl/bar3d-punch-card.js
 create mode 100644 public/examples/ts/gl/bar3d-shanghai.js
 create mode 100644 public/examples/ts/gl/bar3d-simplex-noise.js
 create mode 100644 public/examples/ts/gl/bar3d-voxelize-image.js
 create mode 100644 public/examples/ts/gl/flowGL-noise.js
 create mode 100644 public/examples/ts/gl/geo3d-with-different-height.js
 create mode 100644 public/examples/ts/gl/geo3d.js
 create mode 100644 public/examples/ts/gl/global-population-bar3d-on-globe.js
 create mode 100644 public/examples/ts/gl/global-wind-visualization-2.js
 create mode 100644 public/examples/ts/gl/global-wind-visualization.js
 create mode 100644 public/examples/ts/gl/globe-atmosphere.js
 create mode 100644 public/examples/ts/gl/globe-contour-paint.js
 create mode 100644 public/examples/ts/gl/globe-country-carousel.js
 create mode 100644 public/examples/ts/gl/globe-displacement.js
 create mode 100644 public/examples/ts/gl/globe-echarts-gl-hello-world.js
 create mode 100644 public/examples/ts/gl/globe-layers.js
 create mode 100644 public/examples/ts/gl/globe-moon.js
 create mode 100644 public/examples/ts/gl/globe-with-echarts-surface.js
 create mode 100644 public/examples/ts/gl/graphgl-gpu-layout.js
 create mode 100644 public/examples/ts/gl/graphgl-large-internet.js
 create mode 100644 public/examples/ts/gl/graphgl-npm-dep.js
 create mode 100644 public/examples/ts/gl/image-surface-sushuang.js
 create mode 100644 public/examples/ts/gl/image-to-bar3d.js
 create mode 100644 public/examples/ts/gl/iron-globe.js
 create mode 100644 public/examples/ts/gl/line3d-orthographic.js
 create mode 100644 public/examples/ts/gl/lines3d-airline-on-globe.js
 create mode 100644 public/examples/ts/gl/lines3d-flight-path-on-mapbox.js
 create mode 100644 public/examples/ts/gl/lines3d-flights-gl.js
 create mode 100644 public/examples/ts/gl/lines3d-flights-on-geo3d.js
 create mode 100644 public/examples/ts/gl/lines3d-flights.js
 create mode 100644 public/examples/ts/gl/lines3d-taxi-chengdu.js
 create mode 100644 public/examples/ts/gl/lines3d-taxi-routes-of-cape-town.js
 create mode 100644 public/examples/ts/gl/linesGL-ny.js
 create mode 100644 public/examples/ts/gl/map3d-alcohol-consumption.js
 create mode 100644 public/examples/ts/gl/map3d-buildings-on-mapbox.js
 create mode 100644 public/examples/ts/gl/map3d-buildings.js
 create mode 100644 public/examples/ts/gl/map3d-colorful-cities.js
 create mode 100644 public/examples/ts/gl/map3d-plastic-material-style-buildings-on-mapbox.js
 create mode 100644 public/examples/ts/gl/map3d-wood-city.js
 create mode 100644 public/examples/ts/gl/map3d-wood-map-on-mapbox.js
 create mode 100644 public/examples/ts/gl/map3d-wood-map.js
 create mode 100644 public/examples/ts/gl/metal-bar3d.js
 create mode 100644 public/examples/ts/gl/metal-surface.js
 create mode 100644 public/examples/ts/gl/parametric-surface-rose.js
 create mode 100644 public/examples/ts/gl/scatter3D-dataset.js
 create mode 100644 public/examples/ts/gl/scatter3d-globe-population.js
 create mode 100644 public/examples/ts/gl/scatter3d-orthographic.js
 create mode 100644 public/examples/ts/gl/scatter3d-scatter.js
 create mode 100644 public/examples/ts/gl/scatter3d-shanghai.js
 create mode 100644 public/examples/ts/gl/scatter3d-simplex-noise.js
 create mode 100644 public/examples/ts/gl/scatter3d-weibo-checkin-on-mapbox.js
 create mode 100644 public/examples/ts/gl/scatter3d.js
 create mode 100644 public/examples/ts/gl/scatterGL-gps.js
 create mode 100644 public/examples/ts/gl/scattergl-weibo.js
 create mode 100644 public/examples/ts/gl/simple-surface.js
 create mode 100644 public/examples/ts/gl/sphere-parametric-surface.js
 create mode 100644 public/examples/ts/gl/stacked-bar3d.js
 create mode 100644 public/examples/ts/gl/surface-breather.js
 create mode 100644 public/examples/ts/gl/surface-golden-rose.js
 create mode 100644 public/examples/ts/gl/surface-leather.js
 create mode 100644 public/examples/ts/gl/surface-mollusc-shell.js
 create mode 100644 public/examples/ts/gl/surface-theme-roses.js
 create mode 100644 public/examples/ts/gl/surface-wave.js
 create mode 100644 public/examples/ts/gl/transparent-bar3d.js
 create mode 100644 public/examples/ts/graph-circular-layout.ts
 create mode 100644 public/examples/ts/graph-force-dynamic.ts
 create mode 100644 public/examples/ts/graph-force.ts
 create mode 100644 public/examples/ts/graph-force2.ts
 create mode 100644 public/examples/ts/graph-grid.ts
 create mode 100644 public/examples/ts/graph-label-overlap.ts
 create mode 100644 public/examples/ts/graph-life-expectancy.ts
 create mode 100644 public/examples/ts/graph-npm.ts
 create mode 100644 public/examples/ts/graph-simple.ts
 create mode 100644 public/examples/ts/graph-webkit-dep.ts
 create mode 100644 public/examples/ts/graph.ts
 create mode 100644 public/examples/ts/grid-multiple.ts
 create mode 100644 public/examples/ts/heatmap-bmap.js
 create mode 100644 public/examples/ts/heatmap-cartesian.ts
 create mode 100644 public/examples/ts/heatmap-large-piecewise.js
 create mode 100644 public/examples/ts/heatmap-large.js
 create mode 100644 public/examples/ts/heatmap-map.js
 create mode 100644 public/examples/ts/line-aqi.ts
 create mode 100644 public/examples/ts/line-draggable.ts
 create mode 100644 public/examples/ts/line-easing.ts
 create mode 100644 public/examples/ts/line-function.ts
 create mode 100644 public/examples/ts/line-gradient.ts
 create mode 100644 public/examples/ts/line-graphic.ts
 create mode 100644 public/examples/ts/line-in-cartesian-coordinate-system.ts
 create mode 100644 public/examples/ts/line-log.ts
 create mode 100644 public/examples/ts/line-marker.ts
 create mode 100644 public/examples/ts/line-markline.ts
 create mode 100644 public/examples/ts/line-pen.ts
 create mode 100644 public/examples/ts/line-polar.ts
 create mode 100644 public/examples/ts/line-polar2.ts
 create mode 100644 public/examples/ts/line-race.ts
 create mode 100644 public/examples/ts/line-sections.ts
 create mode 100644 public/examples/ts/line-simple.ts
 create mode 100644 public/examples/ts/line-smooth.ts
 create mode 100644 public/examples/ts/line-stack.ts
 create mode 100644 public/examples/ts/line-step.ts
 create mode 100644 public/examples/ts/line-style.ts
 create mode 100644 public/examples/ts/line-tooltip-touch.ts
 create mode 100644 public/examples/ts/line-y-category.ts
 create mode 100644 public/examples/ts/lines-airline.ts
 create mode 100644 public/examples/ts/lines-bmap-bus.ts
 create mode 100644 public/examples/ts/lines-bmap-effect.ts
 create mode 100644 public/examples/ts/lines-bmap.ts
 create mode 100644 public/examples/ts/lines-ny.ts
 create mode 100644 public/examples/ts/map-HK.ts
 create mode 100644 public/examples/ts/map-bar-morph.ts
 create mode 100644 public/examples/ts/map-bin.js
 create mode 100644 public/examples/ts/map-china-dataRange.js
 create mode 100644 public/examples/ts/map-china.js
 create mode 100644 public/examples/ts/map-labels.js
 create mode 100644 public/examples/ts/map-locate.js
 create mode 100644 public/examples/ts/map-polygon.js
 create mode 100644 public/examples/ts/map-province.js
 create mode 100644 public/examples/ts/map-usa.ts
 create mode 100644 public/examples/ts/map-world-dataRange.js
 create mode 100644 public/examples/ts/map-world.js
 create mode 100644 public/examples/ts/mix-line-bar.ts
 create mode 100644 public/examples/ts/mix-timeline-finance.js
 create mode 100644 public/examples/ts/mix-zoom-on-value.ts
 create mode 100644 public/examples/ts/multiple-x-axis.ts
 create mode 100644 public/examples/ts/multiple-y-axis.ts
 create mode 100644 public/examples/ts/parallel-aqi.ts
 create mode 100644 public/examples/ts/parallel-nutrients.ts
 create mode 100644 public/examples/ts/parallel-simple.ts
 create mode 100644 public/examples/ts/pictorialBar-bar-transition.ts
 create mode 100644 public/examples/ts/pictorialBar-body-fill.ts
 create mode 100644 public/examples/ts/pictorialBar-dotted.ts
 create mode 100644 public/examples/ts/pictorialBar-forest.ts
 create mode 100644 public/examples/ts/pictorialBar-hill.ts
 create mode 100644 public/examples/ts/pictorialBar-spirit.ts
 create mode 100644 public/examples/ts/pictorialBar-vehicle.ts
 create mode 100644 public/examples/ts/pictorialBar-velocity.ts
 create mode 100644 public/examples/ts/pie-alignTo.ts
 create mode 100644 public/examples/ts/pie-borderRadius.ts
 create mode 100644 public/examples/ts/pie-custom.ts
 create mode 100644 public/examples/ts/pie-doughnut.ts
 create mode 100644 public/examples/ts/pie-labelLine-adjust.ts
 create mode 100644 public/examples/ts/pie-legend.ts
 create mode 100644 public/examples/ts/pie-nest.ts
 create mode 100644 public/examples/ts/pie-parliament-transition.ts
 create mode 100644 public/examples/ts/pie-pattern.ts
 create mode 100644 public/examples/ts/pie-rich-text.ts
 create mode 100644 public/examples/ts/pie-roseType-simple.ts
 create mode 100644 public/examples/ts/pie-roseType.ts
 create mode 100644 public/examples/ts/pie-simple.ts
 create mode 100644 public/examples/ts/polar-roundCap.ts
 create mode 100644 public/examples/ts/radar-aqi.ts
 create mode 100644 public/examples/ts/radar-custom.ts
 create mode 100644 public/examples/ts/radar-multiple.ts
 create mode 100644 public/examples/ts/radar.ts
 create mode 100644 public/examples/ts/radar2.ts
 create mode 100644 public/examples/ts/sankey-energy.ts
 create mode 100644 public/examples/ts/sankey-itemstyle.ts
 create mode 100644 public/examples/ts/sankey-levels.ts
 create mode 100644 public/examples/ts/sankey-nodeAlign-left.ts
 create mode 100644 public/examples/ts/sankey-nodeAlign-right.ts
 create mode 100644 public/examples/ts/sankey-simple.ts
 create mode 100644 public/examples/ts/sankey-vertical.ts
 create mode 100644 public/examples/ts/scatter-aggregate-bar.ts
 create mode 100644 public/examples/ts/scatter-anscombe-quartet.ts
 create mode 100644 public/examples/ts/scatter-aqi-color.ts
 create mode 100644 public/examples/ts/scatter-clustering-process.js
 create mode 100644 public/examples/ts/scatter-clustering.ts
 create mode 100644 public/examples/ts/scatter-effect.ts
 create mode 100644 public/examples/ts/scatter-exponential-regression.ts
 create mode 100644 public/examples/ts/scatter-label-align-right.ts
 create mode 100644 public/examples/ts/scatter-label-align-top.ts
 create mode 100644 public/examples/ts/scatter-large.ts
 create mode 100644 public/examples/ts/scatter-life-expectancy-timeline.js
 create mode 100644 public/examples/ts/scatter-linear-regression.ts
 create mode 100644 public/examples/ts/scatter-logarithmic-regression.ts
 create mode 100644 public/examples/ts/scatter-map-brush.ts
 create mode 100644 public/examples/ts/scatter-map.js
 create mode 100644 public/examples/ts/scatter-matrix.ts
 create mode 100644 public/examples/ts/scatter-nebula.ts
 create mode 100644 public/examples/ts/scatter-nutrients-matrix.ts
 create mode 100644 public/examples/ts/scatter-nutrients.ts
 create mode 100644 public/examples/ts/scatter-painter-choice.ts
 create mode 100644 public/examples/ts/scatter-polar-punchCard.ts
 create mode 100644 public/examples/ts/scatter-polynomial-regression.ts
 create mode 100644 public/examples/ts/scatter-punchCard.ts
 create mode 100644 public/examples/ts/scatter-simple.ts
 create mode 100644 public/examples/ts/scatter-single-axis.ts
 create mode 100644 public/examples/ts/scatter-stream-visual.ts
 create mode 100644 public/examples/ts/scatter-symbol-morph.ts
 create mode 100644 public/examples/ts/scatter-weibo.ts
 create mode 100644 public/examples/ts/scatter-weight.ts
 create mode 100644 public/examples/ts/scatter-world-population.js
 create mode 100644 public/examples/ts/sunburst-book.js
 create mode 100644 public/examples/ts/sunburst-borderRadius.ts
 create mode 100644 public/examples/ts/sunburst-drink.ts
 create mode 100644 public/examples/ts/sunburst-label-rotate.ts
 create mode 100644 public/examples/ts/sunburst-monochrome.ts
 create mode 100644 public/examples/ts/sunburst-simple.ts
 create mode 100644 public/examples/ts/sunburst-visualMap.ts
 create mode 100644 public/examples/ts/themeRiver-basic.ts
 create mode 100644 public/examples/ts/themeRiver-lastfm.ts
 create mode 100644 public/examples/ts/tree-basic.ts
 create mode 100644 public/examples/ts/tree-legend.ts
 create mode 100644 public/examples/ts/tree-orient-bottom-top.ts
 create mode 100644 public/examples/ts/tree-orient-right-left.ts
 create mode 100644 public/examples/ts/tree-polyline.ts
 create mode 100644 public/examples/ts/tree-radial.ts
 create mode 100644 public/examples/ts/tree-vertical.ts
 create mode 100644 public/examples/ts/treemap-disk.ts
 create mode 100644 public/examples/ts/treemap-drill-down.ts
 create mode 100644 public/examples/ts/treemap-obama.ts
 create mode 100644 public/examples/ts/treemap-show-parent.ts
 create mode 100644 public/examples/ts/treemap-simple.ts
 create mode 100644 public/examples/ts/treemap-sunburst-transition.ts
 create mode 100644 public/examples/ts/treemap-visual.ts
 create mode 100644 public/examples/ts/watermark.ts
 create mode 100644 public/examples/ts/wind-barb.ts
 create mode 100644 public/examples/tsconfig.json
 create mode 100644 public/examples/types/example.d.ts
 delete mode 100644 public/types/echarts.d.ts
 create mode 100644 src/common/route.js
 create mode 100644 tool/compile-example.js

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@echarts.apache.org
For additional commands, e-mail: commits-help@echarts.apache.org


[echarts-examples] 14/15: feat: add doc link in full option tab

Posted by sh...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

shenyi pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/echarts-examples.git

commit ecc739d7e8b97a797711de6e00540ba09b4148fa
Author: pissang <bm...@gmail.com>
AuthorDate: Fri Sep 10 10:35:20 2021 +0800

    feat: add doc link in full option tab
---
 package-lock.json                |  9 ++++----
 package.json                     |  2 +-
 src/common/i18n.js               |  8 +++++--
 src/editor/Editor.vue            | 47 ++++++++++++++++++++++++++++++++++++++++
 src/editor/object-visualizer.css |  2 --
 5 files changed, 58 insertions(+), 10 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 215c765..816d08d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1160,9 +1160,9 @@
       }
     },
     "@lang/object-visualizer": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/@lang/object-visualizer/-/object-visualizer-3.1.1.tgz",
-      "integrity": "sha512-1RF04RA8Y7AloIGwKau+ilIoZl0DBf8c1v8V+uG7bUpWobBdQyPTbYTFXtZoBsDVObTHXJIWA/pdURGj/N+usg=="
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/@lang/object-visualizer/-/object-visualizer-4.2.0.tgz",
+      "integrity": "sha512-3HA0K07owSIyMW+lysthxktvqdHmAcpv60yX92VdsgKWD4bSQ6FeZgGi0tLmw9Mk6bzm4XZGGwJywWXNjaVl4w=="
     },
     "@nodelib/fs.scandir": {
       "version": "2.1.3",
@@ -5520,8 +5520,7 @@
     "prettier": {
       "version": "2.3.2",
       "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.2.tgz",
-      "integrity": "sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ==",
-      "dev": true
+      "integrity": "sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ=="
     },
     "process-nextick-args": {
       "version": "2.0.1",
diff --git a/package.json b/package.json
index 90c55fe..e21ff0c 100644
--- a/package.json
+++ b/package.json
@@ -59,7 +59,7 @@
     "yargs": "^6.6.0"
   },
   "dependencies": {
-    "@lang/object-visualizer": "^3.1.1",
+    "@lang/object-visualizer": "^4.2.0",
     "lodash": "^4.17.19",
     "resize-detector": "^0.2.2",
     "scroll-into-view": "^1.14.2",
diff --git a/src/common/i18n.js b/src/common/i18n.js
index 097aa08..d99e6d6 100644
--- a/src/common/i18n.js
+++ b/src/common/i18n.js
@@ -26,7 +26,9 @@ export default {
       tooltip: {
         jsMode: 'JavaScript',
         tsMode: 'TypeScript. Provides Better Intelligent',
-        noTs: 'No Available TypeScript Code'
+        noTs: 'No Available TypeScript Code',
+
+        gotoDoc: 'Go To Documentation'
       },
 
       codeChangedConfirm:
@@ -104,7 +106,9 @@ export default {
       tooltip: {
         jsMode: 'JavaScript 代码编辑',
         tsMode: 'TypeScript 代码编辑,提供更好的代码补全和类型检查',
-        noTs: '该示例暂无 TypeScript 版本'
+        noTs: '该示例暂无 TypeScript 版本',
+
+        gotoDoc: '查看文档'
       },
 
       codeChangedConfirm: '已经修改过的代码将会丢失,是否确认继续?',
diff --git a/src/editor/Editor.vue b/src/editor/Editor.vue
index 91c3e7c..25cd2e3 100644
--- a/src/editor/Editor.vue
+++ b/src/editor/Editor.vue
@@ -280,6 +280,7 @@ export default {
       if (!option) {
         return;
       }
+      const tipTitle = this.$t('editor.tooltip.gotoDoc');
       mount(option, this.$el.querySelector('#option-outline'), {
         getKeys(object, path) {
           return Object.keys(object).filter((key) => {
@@ -289,6 +290,43 @@ export default {
             return true;
           });
         },
+        renderName(name, path) {
+          let obj = option;
+          let hash = [];
+          let isTopLevel = true;
+          for (let i = 0; i < path.length; i++) {
+            let key = path[i];
+            obj = obj[key];
+
+            if (obj == null) {
+              hash.push(key);
+              break;
+            }
+
+            if (Array.isArray(obj) && isTopLevel) {
+              // Get type of component / series.
+              const item = obj[path[i + 1]];
+              const type = item && item.type;
+              if (type) {
+                key += '-' + type;
+                i++;
+                obj = item;
+              }
+            } else if (!isNaN(key)) {
+              // Ignore data[0]
+              continue;
+            }
+            hash.push(key);
+          }
+
+          const isObjOrArray = typeof obj === 'object' && obj != null;
+          const link = `https://echarts.apache.org/zh/option.html#${hash.join(
+            '.'
+          )}`;
+          return !isObjOrArray
+            ? `<a href="${link}" target="_blank" title="${tipTitle}">${name}</a>`
+            : `${name}<a href="${link}" target="_blank" title="${tipTitle}"><i class="el-icon-document"></i></a>`;
+        },
         expandOnCreatedAndUpdated(path) {
           return (
             path.length === 0 || (path[0] === 'series' && path.length <= 1)
@@ -479,6 +517,15 @@ $handler-width: 5px;
 
   font-family: 'Source Code Pro', 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas',
     monospace;
+
+  .el-icon-document {
+    margin-left: 5px;
+    font-size: 1rem;
+
+    &:hover {
+      text-decoration: underline;
+    }
+  }
 }
 
 #full-code-generate-config {
diff --git a/src/editor/object-visualizer.css b/src/editor/object-visualizer.css
index f135039..fc394e6 100644
--- a/src/editor/object-visualizer.css
+++ b/src/editor/object-visualizer.css
@@ -18,7 +18,6 @@
 .key {
   /* color: #4078f2; */
   color: #111;
-  user-select: none;
 }
 
 .string > .value {
@@ -38,7 +37,6 @@
 .separator {
   cursor: pointer;
   font-size: 0.8em;
-  user-select: none;
   color: hsl(0, 0%, 30%);
 }
 

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@echarts.apache.org
For additional commands, e-mail: commits-help@echarts.apache.org


[echarts-examples] 03/15: format example code

Posted by sh...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

shenyi pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/echarts-examples.git

commit 5743f814891088758e986038e655e9207c4c31cf
Author: pissang <bm...@gmail.com>
AuthorDate: Mon Sep 6 14:21:30 2021 +0800

    format example code
---
 .eslintrc.yaml                                     |  194 ++
 .vscode/settings.json                              |    4 +-
 public/examples/ts/area-basic.ts                   |   30 +-
 public/examples/ts/area-pieces.ts                  |  110 +-
 public/examples/ts/area-rainfall.ts                |  304 +--
 public/examples/ts/area-simple.ts                  |  126 +-
 public/examples/ts/area-stack-gradient.ts          |  339 +--
 public/examples/ts/area-stack.ts                   |  182 +-
 public/examples/ts/area-time-axis.ts               |  100 +-
 public/examples/ts/bar-animation-delay.ts          |  110 +-
 public/examples/ts/bar-background.ts               |   34 +-
 public/examples/ts/bar-brush.ts                    |  169 +-
 public/examples/ts/bar-data-color.ts               |   44 +-
 public/examples/ts/bar-drilldown.ts                |  167 +-
 public/examples/ts/bar-gradient.ts                 |  143 +-
 public/examples/ts/bar-histogram.ts                |  247 +-
 public/examples/ts/bar-label-rotation.ts           |  296 +--
 public/examples/ts/bar-large.ts                    |  150 +-
 public/examples/ts/bar-negative.ts                 |  135 +-
 public/examples/ts/bar-negative2.ts                |  118 +-
 public/examples/ts/bar-polar-label-radial.ts       |   58 +-
 public/examples/ts/bar-polar-label-tangential.ts   |   58 +-
 public/examples/ts/bar-polar-real-estate.ts        |  184 +-
 public/examples/ts/bar-polar-stack-radial.ts       |   78 +-
 public/examples/ts/bar-polar-stack.ts              |   80 +-
 public/examples/ts/bar-race-country.ts             |  255 +-
 public/examples/ts/bar-race.ts                     |   99 +-
 public/examples/ts/bar-rich-text.ts                |  265 +-
 public/examples/ts/bar-simple.ts                   |   26 +-
 public/examples/ts/bar-stack.ts                    |  222 +-
 public/examples/ts/bar-tick-align.ts               |   68 +-
 public/examples/ts/bar-waterfall.ts                |  108 +-
 public/examples/ts/bar-waterfall2.ts               |  153 +-
 public/examples/ts/bar-y-category-stack.ts         |  161 +-
 public/examples/ts/bar-y-category.ts               |   75 +-
 public/examples/ts/bar1.ts                         |  131 +-
 public/examples/ts/boxplot-light-velocity.ts       |  151 +-
 public/examples/ts/boxplot-light-velocity2.ts      |  155 +-
 public/examples/ts/boxplot-multi.ts                |  182 +-
 public/examples/ts/bubble-gradient.ts              |  238 +-
 public/examples/ts/calendar-charts.ts              |  314 ++-
 public/examples/ts/calendar-effectscatter.ts       |  293 +--
 public/examples/ts/calendar-graph.ts               |  189 +-
 public/examples/ts/calendar-heatmap.ts             |   84 +-
 public/examples/ts/calendar-horizontal.ts          |  107 +-
 public/examples/ts/calendar-lunar.ts               |  889 ++++---
 public/examples/ts/calendar-pie.ts                 |  178 +-
 public/examples/ts/calendar-simple.ts              |   52 +-
 public/examples/ts/calendar-vertical.ts            |  123 +-
 public/examples/ts/candlestick-brush.ts            |  490 ++--
 public/examples/ts/candlestick-large.ts            |  361 +--
 public/examples/ts/candlestick-sh-2015.ts          |  228 +-
 public/examples/ts/candlestick-sh.ts               |  576 +++--
 public/examples/ts/candlestick-simple.ts           |   30 +-
 public/examples/ts/candlestick-touch.ts            |  453 ++--
 public/examples/ts/circle-packing-with-d3.ts       |  380 +--
 public/examples/ts/confidence-band.ts              |  152 +-
 public/examples/ts/custom-bar-trend.ts             |  185 +-
 public/examples/ts/custom-calendar-icon.ts         |  213 +-
 public/examples/ts/custom-cartesian-polygon.js     |   96 +-
 public/examples/ts/custom-error-bar.js             |  197 +-
 public/examples/ts/custom-error-scatter.js         |  218 +-
 public/examples/ts/custom-gantt-flight.js          |  969 ++++----
 public/examples/ts/custom-gauge.js                 |  281 +--
 public/examples/ts/custom-hexbin.js                |  450 ++--
 public/examples/ts/custom-ohlc.js                  |  292 +--
 public/examples/ts/custom-polar-heatmap.js         |  128 +-
 public/examples/ts/custom-profile.js               |  193 +-
 public/examples/ts/custom-profit.js                |  113 +-
 public/examples/ts/custom-spiral-race.js           |  403 ++--
 public/examples/ts/custom-wind.js                  |  195 +-
 public/examples/ts/cycle-plot.js                   |  203 +-
 public/examples/ts/data-transform-aggregate.js     |  232 +-
 public/examples/ts/data-transform-filter.ts        |  147 +-
 public/examples/ts/data-transform-multiple-pie.ts  |  159 +-
 public/examples/ts/data-transform-sort-bar.ts      |   60 +-
 public/examples/ts/dataset-default.ts              |   87 +-
 public/examples/ts/dataset-encode0.ts              |   80 +-
 public/examples/ts/dataset-encode1.ts              |  189 +-
 public/examples/ts/dataset-link.ts                 |  140 +-
 public/examples/ts/dataset-series-layout-by.ts     |   60 +-
 public/examples/ts/dataset-simple0.ts              |   36 +-
 public/examples/ts/dataset-simple1.ts              |   36 +-
 public/examples/ts/dynamic-data.ts                 |  246 +-
 public/examples/ts/dynamic-data2.ts                |  120 +-
 public/examples/ts/effectScatter-bmap.ts           | 1135 ++++-----
 public/examples/ts/effectScatter-map.ts            |  974 ++++----
 public/examples/ts/funnel-align.ts                 |  188 +-
 public/examples/ts/funnel-customize.ts             |  154 +-
 public/examples/ts/funnel-mutiple.ts               |  184 +-
 public/examples/ts/funnel.ts                       |  118 +-
 public/examples/ts/gauge-barometer.ts              |  233 +-
 public/examples/ts/gauge-car.ts                    | 1005 ++++----
 public/examples/ts/gauge-clock.ts                  |  414 ++--
 public/examples/ts/gauge-grade.ts                  |  159 +-
 public/examples/ts/gauge-multi-title.ts            |  125 +-
 public/examples/ts/gauge-progress.ts               |  169 +-
 public/examples/ts/gauge-ring.ts                   |  161 +-
 public/examples/ts/gauge-simple.ts                 |   42 +-
 public/examples/ts/gauge-speed.ts                  |   98 +-
 public/examples/ts/gauge-stage.ts                  |  118 +-
 public/examples/ts/gauge-temperature.ts            |  242 +-
 public/examples/ts/gauge.ts                        |   34 +-
 public/examples/ts/geo-beef-cuts.ts                |  127 +-
 public/examples/ts/geo-lines.js                    |  531 ++--
 public/examples/ts/geo-map-scatter.js              |  653 +++--
 public/examples/ts/geo-organ.js                    |  133 +-
 public/examples/ts/geo-seatmap-flight.ts           |  147 +-
 public/examples/ts/geo-svg-lines.ts                |  149 +-
 public/examples/ts/geo-svg-map.ts                  |  359 +--
 public/examples/ts/geo-svg-scatter-simple.ts       |   90 +-
 public/examples/ts/geo-svg-traffic.ts              |  307 +--
 public/examples/ts/graph-circular-layout.ts        |  100 +-
 public/examples/ts/graph-force-dynamic.ts          |   76 +-
 public/examples/ts/graph-force.ts                  |   84 +-
 public/examples/ts/graph-force2.ts                 |   86 +-
 public/examples/ts/graph-grid.ts                   |   72 +-
 public/examples/ts/graph-label-overlap.ts          |   78 +-
 public/examples/ts/graph-life-expectancy.ts        |  181 +-
 public/examples/ts/graph-npm.ts                    |   84 +-
 public/examples/ts/graph-simple.ts                 |  166 +-
 public/examples/ts/graph-webkit-dep.ts             |   58 +-
 public/examples/ts/graph.ts                        |  108 +-
 public/examples/ts/grid-multiple.ts                |  216 +-
 public/examples/ts/heatmap-bmap.js                 |   76 +-
 public/examples/ts/heatmap-cartesian.ts            |  108 +-
 public/examples/ts/heatmap-large-piecewise.js      |  418 ++--
 public/examples/ts/heatmap-large.js                |  402 ++--
 public/examples/ts/heatmap-map.js                  |  862 +++----
 public/examples/ts/line-aqi.ts                     |  194 +-
 public/examples/ts/line-draggable.ts               |  227 +-
 public/examples/ts/line-easing.ts                  |  467 ++--
 public/examples/ts/line-function.ts                |  114 +-
 public/examples/ts/line-gradient.ts                |  129 +-
 public/examples/ts/line-graphic.ts                 |  210 +-
 .../ts/line-in-cartesian-coordinate-system.ts      |   20 +-
 public/examples/ts/line-log.ts                     |  103 +-
 public/examples/ts/line-marker.ts                  |  149 +-
 public/examples/ts/line-markline.ts                |  133 +-
 public/examples/ts/line-pen.ts                     |  114 +-
 public/examples/ts/line-polar.ts                   |   59 +-
 public/examples/ts/line-polar2.ts                  |   70 +-
 public/examples/ts/line-race.ts                    |  163 +-
 public/examples/ts/line-sections.ts                |  168 +-
 public/examples/ts/line-simple.ts                  |   26 +-
 public/examples/ts/line-smooth.ts                  |   28 +-
 public/examples/ts/line-stack.ts                   |  114 +-
 public/examples/ts/line-step.ts                    |   92 +-
 public/examples/ts/line-style.ts                   |   50 +-
 public/examples/ts/line-tooltip-touch.ts           |  256 +-
 public/examples/ts/line-y-category.ts              |   88 +-
 public/examples/ts/lines-airline.ts                |  107 +-
 public/examples/ts/lines-bmap-bus.ts               |  299 +--
 public/examples/ts/lines-bmap-effect.ts            |  371 +--
 public/examples/ts/lines-bmap.ts                   |  265 +-
 public/examples/ts/lines-ny.ts                     |  148 +-
 public/examples/ts/map-HK.ts                       |  176 +-
 public/examples/ts/map-bar-morph.ts                |  260 +-
 public/examples/ts/map-bin.js                      |  395 +--
 public/examples/ts/map-china-dataRange.js          |  250 +-
 public/examples/ts/map-china.js                    |   36 +-
 public/examples/ts/map-labels.js                   |  294 +--
 public/examples/ts/map-locate.js                   |   76 +-
 public/examples/ts/map-polygon.js                  | 1265 +++++-----
 public/examples/ts/map-province.js                 |  150 +-
 public/examples/ts/map-usa.ts                      |  265 +-
 public/examples/ts/map-world-dataRange.js          |  459 ++--
 public/examples/ts/map-world.js                    |  404 ++--
 public/examples/ts/mix-line-bar.ts                 |  139 +-
 public/examples/ts/mix-timeline-finance.js         |  598 ++---
 public/examples/ts/mix-zoom-on-value.ts            |  166 +-
 public/examples/ts/multiple-x-axis.ts              |  173 +-
 public/examples/ts/multiple-y-axis.ts              |  191 +-
 public/examples/ts/parallel-aqi.ts                 |  386 +--
 public/examples/ts/parallel-nutrients.ts           |  306 ++-
 public/examples/ts/parallel-simple.ts              |   45 +-
 public/examples/ts/pictorialBar-bar-transition.ts  |  253 +-
 public/examples/ts/pictorialBar-body-fill.ts       |  270 ++-
 public/examples/ts/pictorialBar-dotted.ts          |  178 +-
 public/examples/ts/pictorialBar-forest.ts          |  170 +-
 public/examples/ts/pictorialBar-hill.ts            |  214 +-
 public/examples/ts/pictorialBar-spirit.ts          |  193 +-
 public/examples/ts/pictorialBar-vehicle.ts         |  200 +-
 public/examples/ts/pictorialBar-velocity.ts        |  186 +-
 public/examples/ts/pie-alignTo.ts                  |  160 +-
 public/examples/ts/pie-borderRadius.ts             |   82 +-
 public/examples/ts/pie-custom.ts                   |  118 +-
 public/examples/ts/pie-doughnut.ts                 |   72 +-
 public/examples/ts/pie-labelLine-adjust.ts         |  162 +-
 public/examples/ts/pie-legend.ts                   |  124 +-
 public/examples/ts/pie-nest.ts                     |  163 +-
 public/examples/ts/pie-parliament-transition.ts    |  242 +-
 public/examples/ts/pie-pattern.ts                  |   92 +-
 public/examples/ts/pie-rich-text.ts                |  240 +-
 public/examples/ts/pie-roseType-simple.ts          |   70 +-
 public/examples/ts/pie-roseType.ts                 |  153 +-
 public/examples/ts/pie-simple.ts                   |   66 +-
 public/examples/ts/polar-roundCap.ts               |   80 +-
 public/examples/ts/radar-aqi.ts                    |  371 +--
 public/examples/ts/radar-custom.ts                 |  226 +-
 public/examples/ts/radar-multiple.ts               |  168 +-
 public/examples/ts/radar.ts                        |   66 +-
 public/examples/ts/radar2.ts                       |  128 +-
 public/examples/ts/sankey-energy.ts                |   52 +-
 public/examples/ts/sankey-itemstyle.ts             | 2544 ++++++++++----------
 public/examples/ts/sankey-levels.ts                |  125 +-
 public/examples/ts/sankey-nodeAlign-left.ts        |   54 +-
 public/examples/ts/sankey-nodeAlign-right.ts       |   55 +-
 public/examples/ts/sankey-simple.ts                |  106 +-
 public/examples/ts/sankey-vertical.ts              |   80 +-
 public/examples/ts/scatter-aggregate-bar.ts        |  134 +-
 public/examples/ts/scatter-anscombe-quartet.ts     |  255 +-
 public/examples/ts/scatter-aqi-color.ts            |  458 ++--
 public/examples/ts/scatter-clustering-process.js   |  405 ++--
 public/examples/ts/scatter-clustering.ts           |  221 +-
 public/examples/ts/scatter-effect.ts               |   40 +-
 .../examples/ts/scatter-exponential-regression.ts  |  146 +-
 public/examples/ts/scatter-label-align-right.ts    |   93 +-
 public/examples/ts/scatter-label-align-top.ts      |   80 +-
 public/examples/ts/scatter-large.ts                |  114 +-
 .../ts/scatter-life-expectancy-timeline.js         |  309 +--
 public/examples/ts/scatter-linear-regression.ts    |  507 ++--
 .../examples/ts/scatter-logarithmic-regression.ts  |  244 +-
 public/examples/ts/scatter-map-brush.ts            | 1389 ++++++-----
 public/examples/ts/scatter-map.js                  |  908 +++----
 public/examples/ts/scatter-matrix.ts               |  528 ++--
 public/examples/ts/scatter-nebula.ts               |  119 +-
 public/examples/ts/scatter-nutrients-matrix.ts     |  774 +++---
 public/examples/ts/scatter-nutrients.ts            |  267 +-
 public/examples/ts/scatter-painter-choice.ts       |   77 +-
 public/examples/ts/scatter-polar-punchCard.ts      |  117 +-
 .../examples/ts/scatter-polynomial-regression.ts   |  141 +-
 public/examples/ts/scatter-punchCard.ts            |  123 +-
 public/examples/ts/scatter-simple.ts               |   65 +-
 public/examples/ts/scatter-single-axis.ts          |   86 +-
 public/examples/ts/scatter-stream-visual.ts        |   88 +-
 public/examples/ts/scatter-symbol-morph.ts         |  189 +-
 public/examples/ts/scatter-weibo.ts                |  119 +-
 public/examples/ts/scatter-weight.ts               |  511 ++--
 public/examples/ts/scatter-world-population.js     |  985 ++++----
 public/examples/ts/sunburst-book.js                |  561 +++--
 public/examples/ts/sunburst-borderRadius.ts        |   84 +-
 public/examples/ts/sunburst-drink.ts               |  729 +++---
 public/examples/ts/sunburst-label-rotate.ts        |  194 +-
 public/examples/ts/sunburst-monochrome.ts          |  250 +-
 public/examples/ts/sunburst-simple.ts              |   82 +-
 public/examples/ts/sunburst-visualMap.ts           |  127 +-
 public/examples/ts/themeRiver-basic.ts             |  259 +-
 public/examples/ts/themeRiver-lastfm.ts            |  123 +-
 public/examples/ts/tree-basic.ts                   |  100 +-
 public/examples/ts/tree-legend.ts                  |  429 ++--
 public/examples/ts/tree-orient-bottom-top.ts       |   81 +-
 public/examples/ts/tree-orient-right-left.ts       |   86 +-
 public/examples/ts/tree-polyline.ts                |  310 ++-
 public/examples/ts/tree-radial.ts                  |   50 +-
 public/examples/ts/tree-vertical.ts                |   92 +-
 public/examples/ts/treemap-disk.ts                 |  127 +-
 public/examples/ts/treemap-drill-down.ts           |  157 +-
 public/examples/ts/treemap-obama.ts                |  355 +--
 public/examples/ts/treemap-show-parent.ts          |  157 +-
 public/examples/ts/treemap-simple.ts               |   64 +-
 public/examples/ts/treemap-sunburst-transition.ts  |   80 +-
 public/examples/ts/treemap-visual.ts               |  204 +-
 public/examples/ts/watermark.ts                    |  390 +--
 public/examples/ts/wind-barb.ts                    |  510 ++--
 src/common/config.js                               |    2 +-
 src/editor/CodeMonaco.vue                          |    1 +
 267 files changed, 31570 insertions(+), 28787 deletions(-)

diff --git a/.eslintrc.yaml b/.eslintrc.yaml
new file mode 100644
index 0000000..e4a2cee
--- /dev/null
+++ b/.eslintrc.yaml
@@ -0,0 +1,194 @@
+# Note:
+# If eslint does not work in VSCode, please check:
+# (1) Whether "@typescript-eslint/eslint-plugin" and "@typescript-eslint/parser"
+# are npm installed locally. Should better in the same version.
+# (2) Whether "VSCode ESlint extension" is installed.
+# (3) If the project folder is not the root folder of your working space, please
+# config the "VSCode ESlint extension" in "settings":
+# ```json
+# "eslint.workingDirectories": [{"mode": "auto"}]
+# ```
+# Note that it should be "workingDirectories" rather than "WorkingDirectories".
+
+rules:
+    # Check the rules in: node_modules/@typescript-eslint/eslint-plugin/README.md
+    no-console:
+        - 2
+        -
+            allow:
+                - "warn"
+                - "error"
+    prefer-const: 1
+    no-constant-condition: 0
+    comma-dangle: 2
+    no-debugger: 2
+    no-dupe-keys: 2
+    no-empty-character-class: 2
+    no-ex-assign: 2
+    no-extra-boolean-cast: 0
+    no-func-assign: 2
+    no-inner-declarations: 2
+    no-invalid-regexp: 2
+    no-negated-in-lhs: 2
+    no-obj-calls: 2
+    no-sparse-arrays: 2
+    no-unreachable: 2
+    use-isnan: 2
+    valid-typeof: 2
+    block-scoped-var: 2
+    curly:
+        - 2
+        - "all"
+    eqeqeq:
+        - 2
+        - "allow-null"
+    guard-for-in: 2
+    no-else-return: 0
+    no-labels:
+        - 2
+        -
+            allowLoop: true
+    no-eval: 2
+    no-extend-native: 2
+    no-extra-bind: 0
+    no-implied-eval: 2
+    no-iterator: 2
+    no-irregular-whitespace: 2
+    no-lone-blocks: 2
+    no-loop-func: 2
+    no-multi-str: 2
+    no-native-reassign: 2
+    no-new-wrappers: 2
+    no-octal: 2
+    no-octal-escape: 2
+    no-proto: 2
+    no-redeclare: 2
+    no-self-compare: 2
+    no-unneeded-ternary: 2
+    no-with: 2
+    radix: 2
+    wrap-iife:
+        - 2
+        - "any"
+    no-delete-var: 2
+    no-dupe-args: 2
+    no-duplicate-case: 2
+    no-label-var: 2
+    no-shadow-restricted-names: 2
+    no-undef: 2
+    no-undef-init: 2
+    "no-use-before-define": 0
+    brace-style:
+        - 2
+        - "stroustrup"
+        - {}
+    comma-spacing:
+        - 2
+        -
+            before: false
+            after: true
+    comma-style:
+        - 2
+        - "last"
+    new-parens: 2
+    no-array-constructor: 2
+    no-multi-spaces:
+        - 1
+        -
+            ignoreEOLComments: true
+            exceptions:
+                Property: true
+    no-new-object: 2
+    no-trailing-spaces: 2
+    no-extra-parens:
+        - 2
+        - "functions"
+    no-mixed-spaces-and-tabs: 2
+    one-var:
+        - 2
+        - "never"
+    operator-linebreak:
+        - 2
+        - "before"
+        -
+            overrides:
+                "=": "after"
+    "quotes":
+        - 2
+        - "single"
+    "semi":
+        - 2
+        - "always"
+    semi-spacing: 2
+    keyword-spacing: 2
+    key-spacing:
+        - 2
+        -
+            beforeColon: false
+            afterColon: true
+    "space-before-function-paren":
+        - 2
+        -
+            anonymous: "always"
+            named: "never"
+    space-before-blocks:
+        - 2
+        - "always"
+    computed-property-spacing:
+        - 2
+        - "never"
+    space-in-parens:
+        - 2
+        - "never"
+    space-unary-ops: 2
+    spaced-comment: 0
+
+    max-nested-callbacks:
+        - 1
+        - 5
+    max-depth:
+        - 1
+        - 6
+    max-len:
+        - 2
+        - 120
+        - 4
+        -
+            ignoreUrls: true
+            ignoreComments: true
+    max-params:
+        - 1
+        - 15
+
+    space-infix-ops: 2
+    dot-notation:
+        - 2
+        -
+            allowKeywords: true
+            allowPattern: "^catch$"
+
+    arrow-spacing: 2
+    constructor-super: 2
+    no-confusing-arrow:
+        - 2
+        -
+            allowParens: true
+    no-class-assign: 2
+    no-const-assign: 2
+    # no-dupe-class-members: 2
+    no-this-before-super: 0
+    no-duplicate-imports: 2
+    prefer-rest-params: 0
+    unicode-bom: 2
+    max-statements-per-line: 2
+
+    no-useless-constructor: 0
+    indent: ["warn", 4]
+
+    "func-call-spacing": "error"
+
+    "no-unused-vars":
+        - 1
+        -
+            vars: "local"
+            args: "none"
\ No newline at end of file
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 1b6457c..afd540a 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -1,4 +1,6 @@
 {
   "editor.formatOnSave": true,
-  "editor.defaultFormatter": "esbenp.prettier-vscode"
+  "editor.defaultFormatter": "esbenp.prettier-vscode",
+  "editor.tabSize": 2,
+  "editor.detectIndentation": false
 }
diff --git a/public/examples/ts/area-basic.ts b/public/examples/ts/area-basic.ts
index 13cfbc5..32c848f 100644
--- a/public/examples/ts/area-basic.ts
+++ b/public/examples/ts/area-basic.ts
@@ -6,19 +6,21 @@ difficulty: 1
 */
 
 option = {
-    xAxis: {
-        type: 'category',
-        boundaryGap: false,
-        data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
-    },
-    yAxis: {
-        type: 'value'
-    },
-    series: [{
-        data: [820, 932, 901, 934, 1290, 1330, 1320],
-        type: 'line',
-        areaStyle: {}
-    }]
+  xAxis: {
+    type: 'category',
+    boundaryGap: false,
+    data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
+  },
+  yAxis: {
+    type: 'value'
+  },
+  series: [
+    {
+      data: [820, 932, 901, 934, 1290, 1330, 1320],
+      type: 'line',
+      areaStyle: {}
+    }
+  ]
 };
 
-export {}
\ No newline at end of file
+export {};
diff --git a/public/examples/ts/area-pieces.ts b/public/examples/ts/area-pieces.ts
index 70f3ea5..b621430 100644
--- a/public/examples/ts/area-pieces.ts
+++ b/public/examples/ts/area-pieces.ts
@@ -6,62 +6,60 @@ difficulty: 3
 */
 
 option = {
-    xAxis: {
-        type: 'category',
-        boundaryGap: false
-    },
-    yAxis: {
-        type: 'value',
-        boundaryGap: [0, '30%']
-    },
-    visualMap: {
-        type: 'piecewise',
-        show: false,
-        dimension: 0,
-        seriesIndex: 0,
-        pieces: [{
-            gt: 1,
-            lt: 3,
-            color: 'rgba(0, 0, 180, 0.4)'
-        }, {
-            gt: 5,
-            lt: 7,
-            color: 'rgba(0, 0, 180, 0.4)'
-        }]
-    },
-    series: [
-        {
-            type: 'line',
-            smooth: 0.6,
-            symbol: 'none',
-            lineStyle: {
-                color: '#5470C6',
-                width: 5
-            },
-            markLine: {
-                symbol: ['none', 'none'],
-                label: {show: false},
-                data: [
-                    {xAxis: 1},
-                    {xAxis: 3},
-                    {xAxis: 5},
-                    {xAxis: 7}
-                ]
-            },
-            areaStyle: {},
-            data: [
-                ['2019-10-10', 200],
-                ['2019-10-11', 560],
-                ['2019-10-12', 750],
-                ['2019-10-13', 580],
-                ['2019-10-14', 250],
-                ['2019-10-15', 300],
-                ['2019-10-16', 450],
-                ['2019-10-17', 300],
-                ['2019-10-18', 100]
-            ]
-        }
+  xAxis: {
+    type: 'category',
+    boundaryGap: false
+  },
+  yAxis: {
+    type: 'value',
+    boundaryGap: [0, '30%']
+  },
+  visualMap: {
+    type: 'piecewise',
+    show: false,
+    dimension: 0,
+    seriesIndex: 0,
+    pieces: [
+      {
+        gt: 1,
+        lt: 3,
+        color: 'rgba(0, 0, 180, 0.4)'
+      },
+      {
+        gt: 5,
+        lt: 7,
+        color: 'rgba(0, 0, 180, 0.4)'
+      }
     ]
+  },
+  series: [
+    {
+      type: 'line',
+      smooth: 0.6,
+      symbol: 'none',
+      lineStyle: {
+        color: '#5470C6',
+        width: 5
+      },
+      markLine: {
+        symbol: ['none', 'none'],
+        label: { show: false },
+        data: [{ xAxis: 1 }, { xAxis: 3 }, { xAxis: 5 }, { xAxis: 7 }]
+      },
+      areaStyle: {},
+      data: [
+        ['2019-10-10', 200],
+        ['2019-10-11', 560],
+        ['2019-10-12', 750],
+        ['2019-10-13', 580],
+        ['2019-10-14', 250],
+        ['2019-10-15', 300],
+        ['2019-10-16', 450],
+        ['2019-10-17', 300],
+        ['2019-10-18', 100]
+      ]
+    }
+  ]
 };
 
-export {}
\ No newline at end of file
+export {};
diff --git a/public/examples/ts/area-rainfall.ts b/public/examples/ts/area-rainfall.ts
index a8d833b..7dd5632 100644
--- a/public/examples/ts/area-rainfall.ts
+++ b/public/examples/ts/area-rainfall.ts
@@ -6,185 +6,143 @@ difficulty: 5
 */
 
 option = {
-    title: {
-        text: 'Rainfall and Flow Relationship',
-        left: 'center',
-        textAlign: 'right'
+  title: {
+    text: 'Rainfall and Flow Relationship',
+    left: 'center',
+    textAlign: 'right'
+  },
+  grid: {
+    bottom: 80
+  },
+  toolbox: {
+    feature: {
+      dataZoom: {
+        yAxisIndex: 'none'
+      },
+      restore: {},
+      saveAsImage: {}
+    }
+  },
+  tooltip: {
+    trigger: 'axis',
+    axisPointer: {
+      type: 'cross',
+      animation: false,
+      label: {
+        backgroundColor: '#505765'
+      }
+    }
+  },
+  legend: {
+    data: ['Flow', 'Rainfall'],
+    left: 10
+  },
+  dataZoom: [
+    {
+      show: true,
+      realtime: true,
+      start: 65,
+      end: 85
     },
-    grid: {
-        bottom: 80
+    {
+      type: 'inside',
+      realtime: true,
+      start: 65,
+      end: 85
+    }
+  ],
+  xAxis: [
+    {
+      type: 'category',
+      boundaryGap: false,
+      axisLine: { onZero: false },
+      // prettier-ignore
+      data: [
+        '2009/6/12 2:00', '2009/6/12 3:00', '2009/6/12 4:00', '2009/6/12 5:00', '2009/6/12 6:00', '2009/6/12 7:00', '2009/6/12 8:00', '2009/6/12 9:00', '2009/6/12 10:00', '2009/6/12 11:00', '2009/6/12 12:00', '2009/6/12 13:00', '2009/6/12 14:00', '2009/6/12 15:00', '2009/6/12 16:00', '2009/6/12 17:00', '2009/6/12 18:00', '2009/6/12 19:00', '2009/6/12 20:00', '2009/6/12 21:00', '2009/6/12 22:00', '2009/6/12 23:00','2009/6/13 0:00', '2009/6/13 1:00', '2009/6/13 2:00', '2009/6/13 3:00', '20 [...]
+      ].map(function (str) {
+        return str.replace(' ', '\n');
+      })
+    }
+  ],
+  yAxis: [
+    {
+      name: 'Flow(m^3/s)',
+      type: 'value',
+      max: 500
     },
-    toolbox: {
-        feature: {
-            dataZoom: {
-                yAxisIndex: 'none'
+    {
+      name: 'Rainfall(mm)',
+      nameLocation: 'start',
+      max: 5,
+      type: 'value',
+      inverse: true
+    }
+  ],
+  series: [
+    {
+      name: 'Flow',
+      type: 'line',
+      areaStyle: {},
+      lineStyle: {
+        width: 1
+      },
+      emphasis: {
+        focus: 'series'
+      },
+      markArea: {
+        silent: true,
+        itemStyle: {
+          opacity: 0.3
+        },
+        data: [
+          [
+            {
+              xAxis: '2009/9/12\n7:00'
             },
-            restore: {},
-            saveAsImage: {}
-        }
-    },
-    tooltip: {
-        trigger: 'axis',
-        axisPointer: {
-            type: 'cross',
-            animation: false,
-            label: {
-                backgroundColor: '#505765'
+            {
+              xAxis: '2009/9/22\n7:00'
             }
-        }
-    },
-    legend: {
-        data: ['Flow', 'Rainfall'],
-        left: 10
+          ]
+        ]
+      },
+      // prettier-ignore
+      data: [
+        0.97,0.96,0.96,0.95,0.95,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94 [...]
+      ]
     },
-    dataZoom: [
-        {
-            show: true,
-            realtime: true,
-            start: 65,
-            end: 85
-        },
-        {
-            type: 'inside',
-            realtime: true,
-            start: 65,
-            end: 85
-        }
-    ],
-    xAxis: [
-        {
-            type: 'category',
-            boundaryGap: false,
-            axisLine: {onZero: false},
-            data: [
-                '2009/6/12 2:00', '2009/6/12 3:00', '2009/6/12 4:00', '2009/6/12 5:00', '2009/6/12 6:00', '2009/6/12 7:00', '2009/6/12 8:00', '2009/6/12 9:00', '2009/6/12 10:00', '2009/6/12 11:00', '2009/6/12 12:00', '2009/6/12 13:00', '2009/6/12 14:00', '2009/6/12 15:00', '2009/6/12 16:00', '2009/6/12 17:00', '2009/6/12 18:00', '2009/6/12 19:00', '2009/6/12 20:00', '2009/6/12 21:00', '2009/6/12 22:00', '2009/6/12 23:00',
-                '2009/6/13 0:00', '2009/6/13 1:00', '2009/6/13 2:00', '2009/6/13 3:00', '2009/6/13 4:00', '2009/6/13 5:00', '2009/6/13 6:00', '2009/6/13 7:00', '2009/6/13 8:00', '2009/6/13 9:00', '2009/6/13 10:00', '2009/6/13 11:00', '2009/6/13 12:00', '2009/6/13 13:00', '2009/6/13 14:00', '2009/6/13 15:00', '2009/6/13 16:00', '2009/6/13 17:00', '2009/6/13 18:00', '2009/6/13 19:00', '2009/6/13 20:00', '2009/6/13 21:00', '2009/6/13 22:00', '2009/6/13 23:00',
-                '2009/6/14 0:00', '2009/6/14 1:00', '2009/6/14 2:00', '2009/6/14 3:00', '2009/6/14 4:00', '2009/6/14 5:00', '2009/6/14 6:00', '2009/6/14 7:00', '2009/6/14 8:00', '2009/6/14 9:00', '2009/6/14 10:00', '2009/6/14 11:00', '2009/6/14 12:00', '2009/6/14 13:00', '2009/6/14 14:00', '2009/6/14 15:00', '2009/6/14 16:00', '2009/6/14 17:00', '2009/6/14 18:00', '2009/6/14 19:00', '2009/6/14 20:00', '2009/6/14 21:00', '2009/6/14 22:00', '2009/6/14 23:00',
-                '2009/6/15 0:00', '2009/6/15 1:00', '2009/6/15 2:00', '2009/6/15 3:00', '2009/6/15 4:00', '2009/6/15 5:00', '2009/6/15 6:00', '2009/6/15 7:00', '2009/6/15 8:00', '2009/6/15 9:00', '2009/6/15 10:00', '2009/6/15 11:00', '2009/6/15 12:00', '2009/6/15 13:00', '2009/6/15 14:00', '2009/6/15 15:00', '2009/6/15 16:00', '2009/6/15 17:00', '2009/6/15 18:00', '2009/6/15 19:00', '2009/6/15 20:00', '2009/6/15 21:00', '2009/6/15 22:00', '2009/6/15 23:00',
-                '2009/6/15 0:00', '2009/6/16 1:00', '2009/6/16 2:00', '2009/6/16 3:00', '2009/6/16 4:00', '2009/6/16 5:00', '2009/6/16 6:00', '2009/6/16 7:00', '2009/6/16 8:00', '2009/6/16 9:00', '2009/6/16 10:00', '2009/6/16 11:00', '2009/6/16 12:00', '2009/6/16 13:00', '2009/6/16 14:00', '2009/6/16 15:00', '2009/6/16 16:00', '2009/6/16 17:00', '2009/6/16 18:00', '2009/6/16 19:00', '2009/6/16 20:00', '2009/6/16 21:00', '2009/6/16 22:00', '2009/6/16 23:00',
-                '2009/6/15 0:00', '2009/6/17 1:00', '2009/6/17 2:00', '2009/6/17 3:00', '2009/6/17 4:00', '2009/6/17 5:00', '2009/6/17 6:00', '2009/6/17 7:00', '2009/6/17 8:00', '2009/6/17 9:00', '2009/6/17 10:00', '2009/6/17 11:00', '2009/6/17 12:00', '2009/6/17 13:00', '2009/6/17 14:00', '2009/6/17 15:00', '2009/6/17 16:00', '2009/6/17 17:00', '2009/6/17 18:00', '2009/6/17 19:00', '2009/6/17 20:00', '2009/6/17 21:00', '2009/6/17 22:00', '2009/6/17 23:00',
-                '2009/6/18 0:00', '2009/6/18 1:00', '2009/6/18 2:00', '2009/6/18 3:00', '2009/6/18 4:00', '2009/6/18 5:00', '2009/6/18 6:00', '2009/6/18 7:00', '2009/6/18 8:00', '2009/6/18 9:00', '2009/6/18 10:00', '2009/6/18 11:00', '2009/6/18 12:00', '2009/6/18 13:00', '2009/6/18 14:00', '2009/6/18 15:00', '2009/6/18 16:00', '2009/6/18 17:00', '2009/6/18 18:00', '2009/6/18 19:00', '2009/6/18 20:00', '2009/6/18 21:00', '2009/6/18 22:00', '2009/6/18 23:00',
-                '2009/6/15 0:00', '2009/6/19 1:00', '2009/6/19 2:00', '2009/6/19 3:00', '2009/6/19 4:00', '2009/6/19 5:00', '2009/6/19 6:00', '2009/6/19 7:00', '2009/6/19 8:00', '2009/6/19 9:00', '2009/6/19 10:00', '2009/6/19 11:00', '2009/6/19 12:00', '2009/6/19 13:00', '2009/6/19 14:00', '2009/6/19 15:00', '2009/6/19 16:00', '2009/6/19 17:00', '2009/6/19 18:00', '2009/6/19 19:00', '2009/6/19 20:00', '2009/6/19 21:00', '2009/6/19 22:00', '2009/6/19 23:00',
-                '2009/6/20 0:00', '2009/6/20 1:00', '2009/6/20 2:00', '2009/6/20 3:00', '2009/6/20 4:00', '2009/6/20 5:00', '2009/6/20 6:00', '2009/6/20 7:00', '2009/6/20 8:00', '2009/6/20 9:00', '2009/6/20 10:00', '2009/6/20 11:00', '2009/6/20 12:00', '2009/6/20 13:00', '2009/6/20 14:00', '2009/6/20 15:00', '2009/6/20 16:00', '2009/6/20 17:00', '2009/6/20 18:00', '2009/6/20 19:00', '2009/6/20 20:00', '2009/6/20 21:00', '2009/6/20 22:00', '2009/6/20 23:00',
-                '2009/6/21 0:00', '2009/6/21 1:00', '2009/6/21 2:00', '2009/6/21 3:00', '2009/6/21 4:00', '2009/6/21 5:00', '2009/6/21 6:00', '2009/6/21 7:00', '2009/6/21 8:00', '2009/6/21 9:00', '2009/6/21 10:00', '2009/6/21 11:00', '2009/6/21 12:00', '2009/6/21 13:00', '2009/6/21 14:00', '2009/6/21 15:00', '2009/6/21 16:00', '2009/6/21 17:00', '2009/6/21 18:00', '2009/6/21 19:00', '2009/6/21 20:00', '2009/6/21 21:00', '2009/6/21 22:00', '2009/6/21 23:00',
-                '2009/6/22 0:00', '2009/6/22 1:00', '2009/6/22 2:00', '2009/6/22 3:00', '2009/6/22 4:00', '2009/6/22 5:00', '2009/6/22 6:00', '2009/6/22 7:00', '2009/6/22 8:00', '2009/6/22 9:00', '2009/6/22 10:00', '2009/6/22 11:00', '2009/6/22 12:00', '2009/6/22 13:00', '2009/6/22 14:00', '2009/6/22 15:00', '2009/6/22 16:00', '2009/6/22 17:00', '2009/6/22 18:00', '2009/6/22 19:00', '2009/6/22 20:00', '2009/6/22 21:00', '2009/6/22 22:00', '2009/6/22 23:00',
-                '2009/6/23 0:00', '2009/6/23 1:00', '2009/6/23 2:00', '2009/6/23 3:00', '2009/6/23 4:00', '2009/6/23 5:00', '2009/6/23 6:00', '2009/6/23 7:00', '2009/6/23 8:00', '2009/6/23 9:00', '2009/6/23 10:00', '2009/6/23 11:00', '2009/6/23 12:00', '2009/6/23 13:00', '2009/6/23 14:00', '2009/6/23 15:00', '2009/6/23 16:00', '2009/6/23 17:00', '2009/6/23 18:00', '2009/6/23 19:00', '2009/6/23 20:00', '2009/6/23 21:00', '2009/6/23 22:00', '2009/6/23 23:00',
-                '2009/6/24 0:00', '2009/6/24 1:00', '2009/6/24 2:00', '2009/6/24 3:00', '2009/6/24 4:00', '2009/6/24 5:00', '2009/6/24 6:00', '2009/6/24 7:00', '2009/6/24 8:00', '2009/6/24 9:00', '2009/6/24 10:00', '2009/6/24 11:00', '2009/6/24 12:00', '2009/6/24 13:00', '2009/6/24 14:00', '2009/6/24 15:00', '2009/6/24 16:00', '2009/6/24 17:00', '2009/6/24 18:00', '2009/6/24 19:00', '2009/6/24 20:00', '2009/6/24 21:00', '2009/6/24 22:00', '2009/6/24 23:00',
-                '2009/6/25 0:00', '2009/6/25 1:00', '2009/6/25 2:00', '2009/6/25 3:00', '2009/6/25 4:00', '2009/6/25 5:00', '2009/6/25 6:00', '2009/6/25 7:00', '2009/6/25 8:00', '2009/6/25 9:00', '2009/6/25 10:00', '2009/6/25 11:00', '2009/6/25 12:00', '2009/6/25 13:00', '2009/6/25 14:00', '2009/6/25 15:00', '2009/6/25 16:00', '2009/6/25 17:00', '2009/6/25 18:00', '2009/6/25 19:00', '2009/6/25 20:00', '2009/6/25 21:00', '2009/6/25 22:00', '2009/6/25 23:00',
-                '2009/6/26 0:00', '2009/6/26 1:00', '2009/6/26 2:00', '2009/6/26 3:00', '2009/6/26 4:00', '2009/6/26 5:00', '2009/6/26 6:00', '2009/6/26 7:00', '2009/6/26 8:00', '2009/6/26 9:00', '2009/6/26 10:00', '2009/6/26 11:00', '2009/6/26 12:00', '2009/6/26 13:00', '2009/6/26 14:00', '2009/6/26 15:00', '2009/6/26 16:00', '2009/6/26 17:00', '2009/6/26 18:00', '2009/6/26 19:00', '2009/6/26 20:00', '2009/6/26 21:00', '2009/6/26 22:00', '2009/6/26 23:00',
-                '2009/6/27 0:00', '2009/6/27 1:00', '2009/6/27 2:00', '2009/6/27 3:00', '2009/6/27 4:00', '2009/6/27 5:00', '2009/6/27 6:00', '2009/6/27 7:00', '2009/6/27 8:00', '2009/6/27 9:00', '2009/6/27 10:00', '2009/6/27 11:00', '2009/6/27 12:00', '2009/6/27 13:00', '2009/6/27 14:00', '2009/6/27 15:00', '2009/6/27 16:00', '2009/6/27 17:00', '2009/6/27 18:00', '2009/6/27 19:00', '2009/6/27 20:00', '2009/6/27 21:00', '2009/6/27 22:00', '2009/6/27 23:00',
-                '2009/6/28 0:00', '2009/6/28 1:00', '2009/6/28 2:00', '2009/6/28 3:00', '2009/6/28 4:00', '2009/6/28 5:00', '2009/6/28 6:00', '2009/6/28 7:00', '2009/6/28 8:00', '2009/6/28 9:00', '2009/6/28 10:00', '2009/6/28 11:00', '2009/6/28 12:00', '2009/6/28 13:00', '2009/6/28 14:00', '2009/6/28 15:00', '2009/6/28 16:00', '2009/6/28 17:00', '2009/6/28 18:00', '2009/6/28 19:00', '2009/6/28 20:00', '2009/6/28 21:00', '2009/6/28 22:00', '2009/6/28 23:00',
-                '2009/6/29 0:00', '2009/6/29 1:00', '2009/6/29 2:00', '2009/6/29 3:00', '2009/6/29 4:00', '2009/6/29 5:00', '2009/6/29 6:00', '2009/6/29 7:00', '2009/6/29 8:00', '2009/6/29 9:00', '2009/6/29 10:00', '2009/6/29 11:00', '2009/6/29 12:00', '2009/6/29 13:00', '2009/6/29 14:00', '2009/6/29 15:00', '2009/6/29 16:00', '2009/6/29 17:00', '2009/6/29 18:00', '2009/6/29 19:00', '2009/6/29 20:00', '2009/6/29 21:00', '2009/6/29 22:00', '2009/6/29 23:00',
-                '2009/6/30 0:00', '2009/6/30 1:00', '2009/6/30 2:00', '2009/6/30 3:00', '2009/6/30 4:00', '2009/6/30 5:00', '2009/6/30 6:00', '2009/6/30 7:00', '2009/6/30 8:00', '2009/6/30 9:00', '2009/6/30 10:00', '2009/6/30 11:00', '2009/6/30 12:00', '2009/6/30 13:00', '2009/6/30 14:00', '2009/6/30 15:00', '2009/6/30 16:00', '2009/6/30 17:00', '2009/6/30 18:00', '2009/6/30 19:00', '2009/6/30 20:00', '2009/6/30 21:00', '2009/6/30 22:00', '2009/6/30 23:00',
-                '2009/7/1 0:00', '2009/7/1 1:00', '2009/7/1 2:00', '2009/7/1 3:00', '2009/7/1 4:00', '2009/7/1 5:00', '2009/7/1 6:00', '2009/7/1 7:00', '2009/7/1 8:00', '2009/7/1 9:00', '2009/7/1 10:00', '2009/7/1 11:00', '2009/7/1 12:00', '2009/7/1 13:00', '2009/7/1 14:00', '2009/7/1 15:00', '2009/7/1 16:00', '2009/7/1 17:00', '2009/7/1 18:00', '2009/7/1 19:00', '2009/7/1 20:00', '2009/7/1 21:00', '2009/7/1 22:00', '2009/7/1 23:00',
-                '2009/7/2 0:00', '2009/7/2 1:00', '2009/7/2 2:00', '2009/7/2 3:00', '2009/7/2 4:00', '2009/7/2 5:00', '2009/7/2 6:00', '2009/7/2 7:00', '2009/7/2 8:00', '2009/7/2 9:00', '2009/7/2 10:00', '2009/7/2 11:00', '2009/7/2 12:00', '2009/7/2 13:00', '2009/7/2 14:00', '2009/7/2 15:00', '2009/7/2 16:00', '2009/7/2 17:00', '2009/7/2 18:00', '2009/7/2 19:00', '2009/7/2 20:00', '2009/7/2 21:00', '2009/7/2 22:00', '2009/7/2 23:00',
-                '2009/7/3 0:00', '2009/7/3 1:00', '2009/7/3 2:00', '2009/7/3 3:00', '2009/7/3 4:00', '2009/7/3 5:00', '2009/7/3 6:00', '2009/7/3 7:00', '2009/7/3 8:00', '2009/7/3 9:00', '2009/7/3 10:00', '2009/7/3 11:00', '2009/7/3 12:00', '2009/7/3 13:00', '2009/7/3 14:00', '2009/7/3 15:00', '2009/7/3 16:00', '2009/7/3 17:00', '2009/7/3 18:00', '2009/7/3 19:00', '2009/7/3 20:00', '2009/7/3 21:00', '2009/7/3 22:00', '2009/7/3 23:00',
-                '2009/7/4 0:00', '2009/7/4 1:00', '2009/7/4 2:00', '2009/7/4 3:00', '2009/7/4 4:00', '2009/7/4 5:00', '2009/7/4 6:00', '2009/7/4 7:00', '2009/7/4 8:00', '2009/7/4 9:00', '2009/7/4 10:00', '2009/7/4 11:00', '2009/7/4 12:00', '2009/7/4 13:00', '2009/7/4 14:00', '2009/7/4 15:00', '2009/7/4 16:00', '2009/7/4 17:00', '2009/7/4 18:00', '2009/7/4 19:00', '2009/7/4 20:00', '2009/7/4 21:00', '2009/7/4 22:00', '2009/7/4 23:00',
-                '2009/7/5 0:00', '2009/7/5 1:00', '2009/7/5 2:00', '2009/7/5 3:00', '2009/7/5 4:00', '2009/7/5 5:00', '2009/7/5 6:00', '2009/7/5 7:00', '2009/7/5 8:00', '2009/7/5 9:00', '2009/7/5 10:00', '2009/7/5 11:00', '2009/7/5 12:00', '2009/7/5 13:00', '2009/7/5 14:00', '2009/7/5 15:00', '2009/7/5 16:00', '2009/7/5 17:00', '2009/7/5 18:00', '2009/7/5 19:00', '2009/7/5 20:00', '2009/7/5 21:00', '2009/7/5 22:00', '2009/7/5 23:00',
-                '2009/7/6 0:00', '2009/7/6 1:00', '2009/7/6 2:00', '2009/7/6 3:00', '2009/7/6 4:00', '2009/7/6 5:00', '2009/7/6 6:00', '2009/7/6 7:00', '2009/7/6 8:00', '2009/7/6 9:00', '2009/7/6 10:00', '2009/7/6 11:00', '2009/7/6 12:00', '2009/7/6 13:00', '2009/7/6 14:00', '2009/7/6 15:00', '2009/7/6 16:00', '2009/7/6 17:00', '2009/7/6 18:00', '2009/7/6 19:00', '2009/7/6 20:00', '2009/7/6 21:00', '2009/7/6 22:00', '2009/7/6 23:00',
-                '2009/7/7 0:00', '2009/7/7 1:00', '2009/7/7 2:00', '2009/7/7 3:00', '2009/7/7 4:00', '2009/7/7 5:00', '2009/7/7 6:00', '2009/7/7 7:00', '2009/7/7 8:00', '2009/7/7 9:00', '2009/7/7 10:00', '2009/7/7 11:00', '2009/7/7 12:00', '2009/7/7 13:00', '2009/7/7 14:00', '2009/7/7 15:00', '2009/7/7 16:00', '2009/7/7 17:00', '2009/7/7 18:00', '2009/7/7 19:00', '2009/7/7 20:00', '2009/7/7 21:00', '2009/7/7 22:00', '2009/7/7 23:00',
-                '2009/7/8 0:00', '2009/7/8 1:00', '2009/7/8 2:00', '2009/7/8 3:00', '2009/7/8 4:00', '2009/7/8 5:00', '2009/7/8 6:00', '2009/7/8 7:00', '2009/7/8 8:00', '2009/7/8 9:00', '2009/7/8 10:00', '2009/7/8 11:00', '2009/7/8 12:00', '2009/7/8 13:00', '2009/7/8 14:00', '2009/7/8 15:00', '2009/7/8 16:00', '2009/7/8 17:00', '2009/7/8 18:00', '2009/7/8 19:00', '2009/7/8 20:00', '2009/7/8 21:00', '2009/7/8 22:00', '2009/7/8 23:00',
-                '2009/7/9 0:00', '2009/7/9 1:00', '2009/7/9 2:00', '2009/7/9 3:00', '2009/7/9 4:00', '2009/7/9 5:00', '2009/7/9 6:00', '2009/7/9 7:00', '2009/7/9 8:00', '2009/7/9 9:00', '2009/7/9 10:00', '2009/7/9 11:00', '2009/7/9 12:00', '2009/7/9 13:00', '2009/7/9 14:00', '2009/7/9 15:00', '2009/7/9 16:00', '2009/7/9 17:00', '2009/7/9 18:00', '2009/7/9 19:00', '2009/7/9 20:00', '2009/7/9 21:00', '2009/7/9 22:00', '2009/7/9 23:00',
-                '2009/7/10 0:00', '2009/7/10 1:00', '2009/7/10 2:00', '2009/7/10 3:00', '2009/7/10 4:00', '2009/7/10 5:00', '2009/7/10 6:00', '2009/7/10 7:00', '2009/7/10 8:00', '2009/7/10 9:00', '2009/7/10 10:00', '2009/7/10 11:00', '2009/7/10 12:00', '2009/7/10 13:00', '2009/7/10 14:00', '2009/7/10 15:00', '2009/7/10 16:00', '2009/7/10 17:00', '2009/7/10 18:00', '2009/7/10 19:00', '2009/7/10 20:00', '2009/7/10 21:00', '2009/7/10 22:00', '2009/7/10 23:00',
-                '2009/7/11 0:00', '2009/7/11 1:00', '2009/7/11 2:00', '2009/7/11 3:00', '2009/7/11 4:00', '2009/7/11 5:00', '2009/7/11 6:00', '2009/7/11 7:00', '2009/7/11 8:00', '2009/7/11 9:00', '2009/7/11 10:00', '2009/7/11 11:00', '2009/7/11 12:00', '2009/7/11 13:00', '2009/7/11 14:00', '2009/7/11 15:00', '2009/7/11 16:00', '2009/7/11 17:00', '2009/7/11 18:00', '2009/7/11 19:00', '2009/7/11 20:00', '2009/7/11 21:00', '2009/7/11 22:00', '2009/7/11 23:00',
-                '2009/7/12 0:00', '2009/7/12 1:00', '2009/7/12 2:00', '2009/7/12 3:00', '2009/7/12 4:00', '2009/7/12 5:00', '2009/7/12 6:00', '2009/7/12 7:00', '2009/7/12 8:00', '2009/7/12 9:00', '2009/7/12 10:00', '2009/7/12 11:00', '2009/7/12 12:00', '2009/7/12 13:00', '2009/7/12 14:00', '2009/7/12 15:00', '2009/7/12 16:00', '2009/7/12 17:00', '2009/7/12 18:00', '2009/7/12 19:00', '2009/7/12 20:00', '2009/7/12 21:00', '2009/7/12 22:00', '2009/7/12 23:00',
-                '2009/7/13 0:00', '2009/7/13 1:00', '2009/7/13 2:00', '2009/7/13 3:00', '2009/7/13 4:00', '2009/7/13 5:00', '2009/7/13 6:00', '2009/7/13 7:00', '2009/7/13 8:00', '2009/7/13 9:00', '2009/7/13 10:00', '2009/7/13 11:00', '2009/7/13 12:00', '2009/7/13 13:00', '2009/7/13 14:00', '2009/7/13 15:00', '2009/7/13 16:00', '2009/7/13 17:00', '2009/7/13 18:00', '2009/7/13 19:00', '2009/7/13 20:00', '2009/7/13 21:00', '2009/7/13 22:00', '2009/7/13 23:00',
-                '2009/7/14 0:00', '2009/7/14 1:00', '2009/7/14 2:00', '2009/7/14 3:00', '2009/7/14 4:00', '2009/7/14 5:00', '2009/7/14 6:00', '2009/7/14 7:00', '2009/7/14 8:00', '2009/7/14 9:00', '2009/7/14 10:00', '2009/7/14 11:00', '2009/7/14 12:00', '2009/7/14 13:00', '2009/7/14 14:00', '2009/7/14 15:00', '2009/7/14 16:00', '2009/7/14 17:00', '2009/7/14 18:00', '2009/7/14 19:00', '2009/7/14 20:00', '2009/7/14 21:00', '2009/7/14 22:00', '2009/7/14 23:00',
-                '2009/7/15 0:00', '2009/7/15 1:00', '2009/7/15 2:00', '2009/7/15 3:00', '2009/7/15 4:00', '2009/7/15 5:00', '2009/7/15 6:00', '2009/7/15 7:00', '2009/7/15 8:00', '2009/7/15 9:00', '2009/7/15 10:00', '2009/7/15 11:00', '2009/7/15 12:00', '2009/7/15 13:00', '2009/7/15 14:00', '2009/7/15 15:00', '2009/7/15 16:00', '2009/7/15 17:00', '2009/7/15 18:00', '2009/7/15 19:00', '2009/7/15 20:00', '2009/7/15 21:00', '2009/7/15 22:00', '2009/7/15 23:00',
-                '2009/7/16 0:00', '2009/7/16 1:00', '2009/7/16 2:00', '2009/7/16 3:00', '2009/7/16 4:00', '2009/7/16 5:00', '2009/7/16 6:00', '2009/7/16 7:00', '2009/7/16 8:00', '2009/7/16 9:00', '2009/7/16 10:00', '2009/7/16 11:00', '2009/7/16 12:00', '2009/7/16 13:00', '2009/7/16 14:00', '2009/7/16 15:00', '2009/7/16 16:00', '2009/7/16 17:00', '2009/7/16 18:00', '2009/7/16 19:00', '2009/7/16 20:00', '2009/7/16 21:00', '2009/7/16 22:00', '2009/7/16 23:00',
-                '2009/7/17 0:00', '2009/7/17 1:00', '2009/7/17 2:00', '2009/7/17 3:00', '2009/7/17 4:00', '2009/7/17 5:00', '2009/7/17 6:00', '2009/7/17 7:00', '2009/7/17 8:00', '2009/7/17 9:00', '2009/7/17 10:00', '2009/7/17 11:00', '2009/7/17 12:00', '2009/7/17 13:00', '2009/7/17 14:00', '2009/7/17 15:00', '2009/7/17 16:00', '2009/7/17 17:00', '2009/7/17 18:00', '2009/7/17 19:00', '2009/7/17 20:00', '2009/7/17 21:00', '2009/7/17 22:00', '2009/7/17 23:00',
-                '2009/7/18 0:00', '2009/7/18 1:00', '2009/7/18 2:00', '2009/7/18 3:00', '2009/7/18 4:00', '2009/7/18 5:00', '2009/7/18 6:00', '2009/7/18 7:00', '2009/7/18 8:00', '2009/7/18 9:00', '2009/7/18 10:00', '2009/7/18 11:00', '2009/7/18 12:00', '2009/7/18 13:00', '2009/7/18 14:00', '2009/7/18 15:00', '2009/7/18 16:00', '2009/7/18 17:00', '2009/7/18 18:00', '2009/7/18 19:00', '2009/7/18 20:00', '2009/7/18 21:00', '2009/7/18 22:00', '2009/7/18 23:00',
-                '2009/7/19 0:00', '2009/7/19 1:00', '2009/7/19 2:00', '2009/7/19 3:00', '2009/7/19 4:00', '2009/7/19 5:00', '2009/7/19 6:00', '2009/7/19 7:00', '2009/7/19 8:00', '2009/7/19 9:00', '2009/7/19 10:00', '2009/7/19 11:00', '2009/7/19 12:00', '2009/7/19 13:00', '2009/7/19 14:00', '2009/7/19 15:00', '2009/7/19 16:00', '2009/7/19 17:00', '2009/7/19 18:00', '2009/7/19 19:00', '2009/7/19 20:00', '2009/7/19 21:00', '2009/7/19 22:00', '2009/7/19 23:00',
-                '2009/7/20 0:00', '2009/7/20 1:00', '2009/7/20 2:00', '2009/7/20 3:00', '2009/7/20 4:00', '2009/7/20 5:00', '2009/7/20 6:00', '2009/7/20 7:00', '2009/7/20 8:00', '2009/7/20 9:00', '2009/7/20 10:00', '2009/7/20 11:00', '2009/7/20 12:00', '2009/7/20 13:00', '2009/7/20 14:00', '2009/7/20 15:00', '2009/7/20 16:00', '2009/7/20 17:00', '2009/7/20 18:00', '2009/7/20 19:00', '2009/7/20 20:00', '2009/7/20 21:00', '2009/7/20 22:00', '2009/7/20 23:00',
-                '2009/7/21 0:00', '2009/7/21 1:00', '2009/7/21 2:00', '2009/7/21 3:00', '2009/7/21 4:00', '2009/7/21 5:00', '2009/7/21 6:00', '2009/7/21 7:00', '2009/7/21 8:00', '2009/7/21 9:00', '2009/7/21 10:00', '2009/7/21 11:00', '2009/7/21 12:00', '2009/7/21 13:00', '2009/7/21 14:00', '2009/7/21 15:00', '2009/7/21 16:00', '2009/7/21 17:00', '2009/7/21 18:00', '2009/7/21 19:00', '2009/7/21 20:00', '2009/7/21 21:00', '2009/7/21 22:00', '2009/7/21 23:00',
-                '2009/7/22 0:00', '2009/7/22 1:00', '2009/7/22 2:00', '2009/7/22 3:00', '2009/7/22 4:00', '2009/7/22 5:00', '2009/7/22 6:00', '2009/7/22 7:00', '2009/7/22 8:00', '2009/7/22 9:00', '2009/7/22 10:00', '2009/7/22 11:00', '2009/7/22 12:00', '2009/7/22 13:00', '2009/7/22 14:00', '2009/7/22 15:00', '2009/7/22 16:00', '2009/7/22 17:00', '2009/7/22 18:00', '2009/7/22 19:00', '2009/7/22 20:00', '2009/7/22 21:00', '2009/7/22 22:00', '2009/7/22 23:00',
-                '2009/7/23 0:00', '2009/7/23 1:00', '2009/7/23 2:00', '2009/7/23 3:00', '2009/7/23 4:00', '2009/7/23 5:00', '2009/7/23 6:00', '2009/7/23 7:00', '2009/7/23 8:00', '2009/7/23 9:00', '2009/7/23 10:00', '2009/7/23 11:00', '2009/7/23 12:00', '2009/7/23 13:00', '2009/7/23 14:00', '2009/7/23 15:00', '2009/7/23 16:00', '2009/7/23 17:00', '2009/7/23 18:00', '2009/7/23 19:00', '2009/7/23 20:00', '2009/7/23 21:00', '2009/7/23 22:00', '2009/7/23 23:00',
-                '2009/7/24 0:00', '2009/7/24 1:00', '2009/7/24 2:00', '2009/7/24 3:00', '2009/7/24 4:00', '2009/7/24 5:00', '2009/7/24 6:00', '2009/7/24 7:00', '2009/7/24 8:00', '2009/7/24 9:00', '2009/7/24 10:00', '2009/7/24 11:00', '2009/7/24 12:00', '2009/7/24 13:00', '2009/7/24 14:00', '2009/7/24 15:00', '2009/7/24 16:00', '2009/7/24 17:00', '2009/7/24 18:00', '2009/7/24 19:00', '2009/7/24 20:00', '2009/7/24 21:00', '2009/7/24 22:00', '2009/7/24 23:00',
-                '2009/7/25 0:00', '2009/7/25 1:00', '2009/7/25 2:00', '2009/7/25 3:00', '2009/7/25 4:00', '2009/7/25 5:00', '2009/7/25 6:00', '2009/7/25 7:00', '2009/7/25 8:00', '2009/7/25 9:00', '2009/7/25 10:00', '2009/7/25 11:00', '2009/7/25 12:00', '2009/7/25 13:00', '2009/7/25 14:00', '2009/7/25 15:00', '2009/7/25 16:00', '2009/7/25 17:00', '2009/7/25 18:00', '2009/7/25 19:00', '2009/7/25 20:00', '2009/7/25 21:00', '2009/7/25 22:00', '2009/7/25 23:00',
-                '2009/7/26 0:00', '2009/7/26 1:00', '2009/7/26 2:00', '2009/7/26 3:00', '2009/7/26 4:00', '2009/7/26 5:00', '2009/7/26 6:00', '2009/7/26 7:00', '2009/7/26 8:00', '2009/7/26 9:00', '2009/7/26 10:00', '2009/7/26 11:00', '2009/7/26 12:00', '2009/7/26 13:00', '2009/7/26 14:00', '2009/7/26 15:00', '2009/7/26 16:00', '2009/7/26 17:00', '2009/7/26 18:00', '2009/7/26 19:00', '2009/7/26 20:00', '2009/7/26 21:00', '2009/7/26 22:00', '2009/7/26 23:00',
-                '2009/7/27 0:00', '2009/7/27 1:00', '2009/7/27 2:00', '2009/7/27 3:00', '2009/7/27 4:00', '2009/7/27 5:00', '2009/7/27 6:00', '2009/7/27 7:00', '2009/7/27 8:00', '2009/7/27 9:00', '2009/7/27 10:00', '2009/7/27 11:00', '2009/7/27 12:00', '2009/7/27 13:00', '2009/7/27 14:00', '2009/7/27 15:00', '2009/7/27 16:00', '2009/7/27 17:00', '2009/7/27 18:00', '2009/7/27 19:00', '2009/7/27 20:00', '2009/7/27 21:00', '2009/7/27 22:00', '2009/7/27 23:00',
-                '2009/7/28 0:00', '2009/7/28 1:00', '2009/7/28 2:00', '2009/7/28 3:00', '2009/7/28 4:00', '2009/7/28 5:00', '2009/7/28 6:00', '2009/7/28 7:00', '2009/7/28 8:00', '2009/7/28 9:00', '2009/7/28 10:00', '2009/7/28 11:00', '2009/7/28 12:00', '2009/7/28 13:00', '2009/7/28 14:00', '2009/7/28 15:00', '2009/7/28 16:00', '2009/7/28 17:00', '2009/7/28 18:00', '2009/7/28 19:00', '2009/7/28 20:00', '2009/7/28 21:00', '2009/7/28 22:00', '2009/7/28 23:00',
-                '2009/7/29 0:00', '2009/7/29 1:00', '2009/7/29 2:00', '2009/7/29 3:00', '2009/7/29 4:00', '2009/7/29 5:00', '2009/7/29 6:00', '2009/7/29 7:00', '2009/7/29 8:00', '2009/7/29 9:00', '2009/7/29 10:00', '2009/7/29 11:00', '2009/7/29 12:00', '2009/7/29 13:00', '2009/7/29 14:00', '2009/7/29 15:00', '2009/7/29 16:00', '2009/7/29 17:00', '2009/7/29 18:00', '2009/7/29 19:00', '2009/7/29 20:00', '2009/7/29 21:00', '2009/7/29 22:00', '2009/7/29 23:00',
-                '2009/7/30 0:00', '2009/7/30 1:00', '2009/7/30 2:00', '2009/7/30 3:00', '2009/7/30 4:00', '2009/7/30 5:00', '2009/7/30 6:00', '2009/7/30 7:00', '2009/7/30 8:00', '2009/7/30 9:00', '2009/7/30 10:00', '2009/7/30 11:00', '2009/7/30 12:00', '2009/7/30 13:00', '2009/7/30 14:00', '2009/7/30 15:00', '2009/7/30 16:00', '2009/7/30 17:00', '2009/7/30 18:00', '2009/7/30 19:00', '2009/7/30 20:00', '2009/7/30 21:00', '2009/7/30 22:00', '2009/7/30 23:00',
-                '2009/7/31 0:00', '2009/7/31 1:00', '2009/7/31 2:00', '2009/7/31 3:00', '2009/7/31 4:00', '2009/7/31 5:00', '2009/7/31 6:00', '2009/7/31 7:00', '2009/7/31 8:00', '2009/7/31 9:00', '2009/7/31 10:00', '2009/7/31 11:00', '2009/7/31 12:00', '2009/7/31 13:00', '2009/7/31 14:00', '2009/7/31 15:00', '2009/7/31 16:00', '2009/7/31 17:00', '2009/7/31 18:00', '2009/7/31 19:00', '2009/7/31 20:00', '2009/7/31 21:00', '2009/7/31 22:00', '2009/7/31 23:00',
-                '2009/8/1 0:00', '2009/8/1 1:00', '2009/8/1 2:00', '2009/8/1 3:00', '2009/8/1 4:00', '2009/8/1 5:00', '2009/8/1 6:00', '2009/8/1 7:00', '2009/8/1 8:00', '2009/8/1 9:00', '2009/8/1 10:00', '2009/8/1 11:00', '2009/8/1 12:00', '2009/8/1 13:00', '2009/8/1 14:00', '2009/8/1 15:00', '2009/8/1 16:00', '2009/8/1 17:00', '2009/8/1 18:00', '2009/8/1 19:00', '2009/8/1 20:00', '2009/8/1 21:00', '2009/8/1 22:00', '2009/8/1 23:00', '2009/8/2 0:00', '2009/8/2 1:00', '2009/8/2 2:00', '20 [...]
-                '2009/9/1 0:00', '2009/9/1 1:00', '2009/9/1 2:00', '2009/9/1 3:00', '2009/9/1 4:00', '2009/9/1 5:00', '2009/9/1 6:00', '2009/9/1 7:00', '2009/9/1 8:00', '2009/9/1 9:00', '2009/9/1 10:00', '2009/9/1 11:00', '2009/9/1 12:00', '2009/9/1 13:00', '2009/9/1 14:00', '2009/9/1 15:00', '2009/9/1 16:00', '2009/9/1 17:00', '2009/9/1 18:00', '2009/9/1 19:00', '2009/9/1 20:00', '2009/9/1 21:00', '2009/9/1 22:00', '2009/9/1 23:00', '2009/9/2 0:00', '2009/9/2 1:00', '2009/9/2 2:00', '20 [...]
-                '2009/10/1 0:00', '2009/10/1 1:00', '2009/10/1 2:00', '2009/10/1 3:00', '2009/10/1 4:00', '2009/10/1 5:00', '2009/10/1 6:00', '2009/10/1 7:00', '2009/10/1 8:00', '2009/10/1 9:00', '2009/10/1 10:00', '2009/10/1 11:00', '2009/10/1 12:00', '2009/10/1 13:00', '2009/10/1 14:00', '2009/10/1 15:00', '2009/10/1 16:00', '2009/10/1 17:00', '2009/10/1 18:00', '2009/10/1 19:00', '2009/10/1 20:00', '2009/10/1 21:00', '2009/10/1 22:00', '2009/10/1 23:00', '2009/10/2 0:00', '2009/10/2 1 [...]
-            ].map(function (str) {
-                return str.replace(' ', '\n');
-            })
-        }
-    ],
-    yAxis: [
-        {
-            name: 'Flow(m^3/s)',
-            type: 'value',
-            max: 500
-        },
-        {
-            name: 'Rainfall(mm)',
-            nameLocation: 'start',
-            max: 5,
-            type: 'value',
-            inverse: true
-        }
-    ],
-    series: [
-        {
-            name: 'Flow',
-            type: 'line',
-            areaStyle: {},
-            lineStyle: {
-                width: 1
-            },
-            emphasis: {
-                focus: 'series'
-            },
-            markArea: {
-                silent: true,
-                itemStyle: {
-                    opacity: 0.3
-                },
-                data: [[{
-                    xAxis: '2009/9/12\n7:00'
-                }, {
-                    xAxis: '2009/9/22\n7:00'
-                }]]
-            },
-            data: [
-                0.97,0.96,0.96,0.95,0.95,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0 [...]
-            ]
+    {
+      name: 'Rainfall',
+      type: 'line',
+      yAxisIndex: 1,
+      areaStyle: {},
+      lineStyle: {
+        width: 1
+      },
+      emphasis: {
+        focus: 'series'
+      },
+      markArea: {
+        silent: true,
+        itemStyle: {
+          opacity: 0.3
         },
-        {
-            name: 'Rainfall',
-            type: 'line',
-            yAxisIndex: 1,
-            areaStyle: {},
-            lineStyle: {
-                width: 1
-            },
-            emphasis: {
-                focus: 'series'
+        data: [
+          [
+            {
+              xAxis: '2009/9/10\n7:00'
             },
-            markArea: {
-                silent: true,
-                itemStyle: {
-                    opacity: 0.3
-                },
-                data: [
-                    [{
-                        xAxis: '2009/9/10\n7:00'
-                    }, {
-                        xAxis: '2009/9/20\n7:00'
-                    }]
-                ]
-            },
-            data: [
-                0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.005,0.017,0.017,0.017,0.017,0.011,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.021,0.026,0.03,0.036,0.036,0.195,0.221,0.019,0.013,0.017,0.03,0.03,0.03,0.046,0.045,0.038,0.084,0.045,0.045,0.037,0.034,0.035,0.036,0.044,0.052,0.048,0.109,0.033,0.029,0.04,0.042,0.042,0.042,0.073,0.076,0.062,0.066,0.066,0.075,0.096,0.128 [...]
-            ]
-        }
-    ]
+            {
+              xAxis: '2009/9/20\n7:00'
+            }
+          ]
+        ]
+      },
+      // prettier-ignore
+      data: [
+        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.005,0.017,0.017,0.017,0.017,0.011,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.021,0.026,0.03,0.036,0.036,0.195,0.221,0.019,0.013,0.017,0.03,0.03,0.03,0.046,0.045,0.038,0.084,0.045,0.045,0.037,0.034,0.035,0.036,0.044,0.052,0.048,0.109,0.033,0.029,0.04,0.042,0.042,0.042,0.073,0.076,0.062,0.066,0.066,0.075,0.096,0.128,0.121,0 [...]
+      ]
+    }
+  ]
 };
 
-
-export {}
\ No newline at end of file
+export {};
diff --git a/public/examples/ts/area-simple.ts b/public/examples/ts/area-simple.ts
index 8ab9c88..892fc05 100644
--- a/public/examples/ts/area-simple.ts
+++ b/public/examples/ts/area-simple.ts
@@ -12,69 +12,75 @@ let date = [];
 let data = [Math.random() * 300];
 
 for (let i = 1; i < 20000; i++) {
-    var now = new Date(base += oneDay);
-    date.push([now.getFullYear(), now.getMonth() + 1, now.getDate()].join('/'));
-    data.push(Math.round((Math.random() - 0.5) * 20 + data[i - 1]));
+  var now = new Date((base += oneDay));
+  date.push([now.getFullYear(), now.getMonth() + 1, now.getDate()].join('/'));
+  data.push(Math.round((Math.random() - 0.5) * 20 + data[i - 1]));
 }
 
 option = {
-    tooltip: {
-        trigger: 'axis',
-        position: function (pt) {
-            return [pt[0], '10%'];
-        }
+  tooltip: {
+    trigger: 'axis',
+    position: function (pt) {
+      return [pt[0], '10%'];
+    }
+  },
+  title: {
+    left: 'center',
+    text: 'Large Area Chart'
+  },
+  toolbox: {
+    feature: {
+      dataZoom: {
+        yAxisIndex: 'none'
+      },
+      restore: {},
+      saveAsImage: {}
+    }
+  },
+  xAxis: {
+    type: 'category',
+    boundaryGap: false,
+    data: date
+  },
+  yAxis: {
+    type: 'value',
+    boundaryGap: [0, '100%']
+  },
+  dataZoom: [
+    {
+      type: 'inside',
+      start: 0,
+      end: 10
     },
-    title: {
-        left: 'center',
-        text: 'Large Area Chart',
-    },
-    toolbox: {
-        feature: {
-            dataZoom: {
-                yAxisIndex: 'none'
-            },
-            restore: {},
-            saveAsImage: {}
-        }
-    },
-    xAxis: {
-        type: 'category',
-        boundaryGap: false,
-        data: date
-    },
-    yAxis: {
-        type: 'value',
-        boundaryGap: [0, '100%']
-    },
-    dataZoom: [{
-        type: 'inside',
-        start: 0,
-        end: 10
-    }, {
-        start: 0,
-        end: 10
-    }],
-    series: [
-        {
-            name: 'Fake Data',
-            type: 'line',
-            symbol: 'none',
-            sampling: 'lttb',
-            itemStyle: {
-                color: 'rgb(255, 70, 131)'
-            },
-            areaStyle: {
-                color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
-                    offset: 0,
-                    color: 'rgb(255, 158, 68)'
-                }, {
-                    offset: 1,
-                    color: 'rgb(255, 70, 131)'
-                }])
-            },
-            data: data
-        }
-    ]
+    {
+      start: 0,
+      end: 10
+    }
+  ],
+  series: [
+    {
+      name: 'Fake Data',
+      type: 'line',
+      symbol: 'none',
+      sampling: 'lttb',
+      itemStyle: {
+        color: 'rgb(255, 70, 131)'
+      },
+      areaStyle: {
+        color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+          {
+            offset: 0,
+            color: 'rgb(255, 158, 68)'
+          },
+          {
+            offset: 1,
+            color: 'rgb(255, 70, 131)'
+          }
+        ])
+      },
+      data: data
+    }
+  ]
 };
 
-export {}
\ No newline at end of file
+export {};
diff --git a/public/examples/ts/area-stack-gradient.ts b/public/examples/ts/area-stack-gradient.ts
index 8ab69ca..16ac77a 100644
--- a/public/examples/ts/area-stack-gradient.ts
+++ b/public/examples/ts/area-stack-gradient.ts
@@ -6,171 +6,186 @@ difficulty: 2
 */
 
 option = {
-    color: ['#80FFA5', '#00DDFF', '#37A2FF', '#FF0087', '#FFBF00'],
-    title: {
-        text: 'Gradient Stacked Area Chart'
+  color: ['#80FFA5', '#00DDFF', '#37A2FF', '#FF0087', '#FFBF00'],
+  title: {
+    text: 'Gradient Stacked Area Chart'
+  },
+  tooltip: {
+    trigger: 'axis',
+    axisPointer: {
+      type: 'cross',
+      label: {
+        backgroundColor: '#6a7985'
+      }
+    }
+  },
+  legend: {
+    data: ['Line 1', 'Line 2', 'Line 3', 'Line 4', 'Line 5']
+  },
+  toolbox: {
+    feature: {
+      saveAsImage: {}
+    }
+  },
+  grid: {
+    left: '3%',
+    right: '4%',
+    bottom: '3%',
+    containLabel: true
+  },
+  xAxis: [
+    {
+      type: 'category',
+      boundaryGap: false,
+      data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
+    }
+  ],
+  yAxis: [
+    {
+      type: 'value'
+    }
+  ],
+  series: [
+    {
+      name: 'Line 1',
+      type: 'line',
+      stack: 'Total',
+      smooth: true,
+      lineStyle: {
+        width: 0
+      },
+      showSymbol: false,
+      areaStyle: {
+        opacity: 0.8,
+        color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+          {
+            offset: 0,
+            color: 'rgba(128, 255, 165)'
+          },
+          {
+            offset: 1,
+            color: 'rgba(1, 191, 236)'
+          }
+        ])
+      },
+      emphasis: {
+        focus: 'series'
+      },
+      data: [140, 232, 101, 264, 90, 340, 250]
     },
-    tooltip: {
-        trigger: 'axis',
-        axisPointer: {
-            type: 'cross',
-            label: {
-                backgroundColor: '#6a7985'
-            }
-        }
+    {
+      name: 'Line 2',
+      type: 'line',
+      stack: 'Total',
+      smooth: true,
+      lineStyle: {
+        width: 0
+      },
+      showSymbol: false,
+      areaStyle: {
+        opacity: 0.8,
+        color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+          {
+            offset: 0,
+            color: 'rgba(0, 221, 255)'
+          },
+          {
+            offset: 1,
+            color: 'rgba(77, 119, 255)'
+          }
+        ])
+      },
+      emphasis: {
+        focus: 'series'
+      },
+      data: [120, 282, 111, 234, 220, 340, 310]
     },
-    legend: {
-        data: ['Line 1', 'Line 2', 'Line 3', 'Line 4', 'Line 5']
+    {
+      name: 'Line 3',
+      type: 'line',
+      stack: 'Total',
+      smooth: true,
+      lineStyle: {
+        width: 0
+      },
+      showSymbol: false,
+      areaStyle: {
+        opacity: 0.8,
+        color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+          {
+            offset: 0,
+            color: 'rgba(55, 162, 255)'
+          },
+          {
+            offset: 1,
+            color: 'rgba(116, 21, 219)'
+          }
+        ])
+      },
+      emphasis: {
+        focus: 'series'
+      },
+      data: [320, 132, 201, 334, 190, 130, 220]
     },
-    toolbox: {
-        feature: {
-            saveAsImage: {}
-        }
+    {
+      name: 'Line 4',
+      type: 'line',
+      stack: 'Total',
+      smooth: true,
+      lineStyle: {
+        width: 0
+      },
+      showSymbol: false,
+      areaStyle: {
+        opacity: 0.8,
+        color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+          {
+            offset: 0,
+            color: 'rgba(255, 0, 135)'
+          },
+          {
+            offset: 1,
+            color: 'rgba(135, 0, 157)'
+          }
+        ])
+      },
+      emphasis: {
+        focus: 'series'
+      },
+      data: [220, 402, 231, 134, 190, 230, 120]
     },
-    grid: {
-        left: '3%',
-        right: '4%',
-        bottom: '3%',
-        containLabel: true
-    },
-    xAxis: [
-        {
-            type: 'category',
-            boundaryGap: false,
-            data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
-        }
-    ],
-    yAxis: [
-        {
-            type: 'value'
-        }
-    ],
-    series: [
-        {
-            name: 'Line 1',
-            type: 'line',
-            stack: 'Total',
-            smooth: true,
-            lineStyle: {
-                width: 0
-            },
-            showSymbol: false,
-            areaStyle: {
-                opacity: 0.8,
-                color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
-                    offset: 0,
-                    color: 'rgba(128, 255, 165)'
-                }, {
-                    offset: 1,
-                    color: 'rgba(1, 191, 236)'
-                }])
-            },
-            emphasis: {
-                focus: 'series'
-            },
-            data: [140, 232, 101, 264, 90, 340, 250]
-        },
-        {
-            name: 'Line 2',
-            type: 'line',
-            stack: 'Total',
-            smooth: true,
-            lineStyle: {
-                width: 0
-            },
-            showSymbol: false,
-            areaStyle: {
-                opacity: 0.8,
-                color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
-                    offset: 0,
-                    color: 'rgba(0, 221, 255)'
-                }, {
-                    offset: 1,
-                    color: 'rgba(77, 119, 255)'
-                }])
-            },
-            emphasis: {
-                focus: 'series'
-            },
-            data: [120, 282, 111, 234, 220, 340, 310]
-        },
-        {
-            name: 'Line 3',
-            type: 'line',
-            stack: 'Total',
-            smooth: true,
-            lineStyle: {
-                width: 0
-            },
-            showSymbol: false,
-            areaStyle: {
-                opacity: 0.8,
-                color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
-                    offset: 0,
-                    color: 'rgba(55, 162, 255)'
-                }, {
-                    offset: 1,
-                    color: 'rgba(116, 21, 219)'
-                }])
-            },
-            emphasis: {
-                focus: 'series'
-            },
-            data: [320, 132, 201, 334, 190, 130, 220]
-        },
-        {
-            name: 'Line 4',
-            type: 'line',
-            stack: 'Total',
-            smooth: true,
-            lineStyle: {
-                width: 0
-            },
-            showSymbol: false,
-            areaStyle: {
-                opacity: 0.8,
-                color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
-                    offset: 0,
-                    color: 'rgba(255, 0, 135)'
-                }, {
-                    offset: 1,
-                    color: 'rgba(135, 0, 157)'
-                }])
-            },
-            emphasis: {
-                focus: 'series'
-            },
-            data: [220, 402, 231, 134, 190, 230, 120]
-        },
-        {
-            name: 'Line 5',
-            type: 'line',
-            stack: 'Total',
-            smooth: true,
-            lineStyle: {
-                width: 0
-            },
-            showSymbol: false,
-            label: {
-                show: true,
-                position: 'top'
-            },
-            areaStyle: {
-                opacity: 0.8,
-                color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
-                    offset: 0,
-                    color: 'rgba(255, 191, 0)'
-                }, {
-                    offset: 1,
-                    color: 'rgba(224, 62, 76)'
-                }])
-            },
-            emphasis: {
-                focus: 'series'
-            },
-            data: [220, 302, 181, 234, 210, 290, 150]
-        }
-    ]
+    {
+      name: 'Line 5',
+      type: 'line',
+      stack: 'Total',
+      smooth: true,
+      lineStyle: {
+        width: 0
+      },
+      showSymbol: false,
+      label: {
+        show: true,
+        position: 'top'
+      },
+      areaStyle: {
+        opacity: 0.8,
+        color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+          {
+            offset: 0,
+            color: 'rgba(255, 191, 0)'
+          },
+          {
+            offset: 1,
+            color: 'rgba(224, 62, 76)'
+          }
+        ])
+      },
+      emphasis: {
+        focus: 'series'
+      },
+      data: [220, 302, 181, 234, 210, 290, 150]
+    }
+  ]
 };
 
-export {}
\ No newline at end of file
+export {};
diff --git a/public/examples/ts/area-stack.ts b/public/examples/ts/area-stack.ts
index 3b0683c..3cb38b2 100644
--- a/public/examples/ts/area-stack.ts
+++ b/public/examples/ts/area-stack.ts
@@ -6,100 +6,100 @@ difficulty: 2
 */
 
 option = {
-    title: {
-        text: 'Stacked Area Chart'
+  title: {
+    text: 'Stacked Area Chart'
+  },
+  tooltip: {
+    trigger: 'axis',
+    axisPointer: {
+      type: 'cross',
+      label: {
+        backgroundColor: '#6a7985'
+      }
+    }
+  },
+  legend: {
+    data: ['Email', 'Union Ads', 'Video Ads', 'Direct', 'Search Engine']
+  },
+  toolbox: {
+    feature: {
+      saveAsImage: {}
+    }
+  },
+  grid: {
+    left: '3%',
+    right: '4%',
+    bottom: '3%',
+    containLabel: true
+  },
+  xAxis: [
+    {
+      type: 'category',
+      boundaryGap: false,
+      data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
+    }
+  ],
+  yAxis: [
+    {
+      type: 'value'
+    }
+  ],
+  series: [
+    {
+      name: 'Email',
+      type: 'line',
+      stack: 'Total',
+      areaStyle: {},
+      emphasis: {
+        focus: 'series'
+      },
+      data: [120, 132, 101, 134, 90, 230, 210]
     },
-    tooltip: {
-        trigger: 'axis',
-        axisPointer: {
-            type: 'cross',
-            label: {
-                backgroundColor: '#6a7985'
-            }
-        }
+    {
+      name: 'Union Ads',
+      type: 'line',
+      stack: 'Total',
+      areaStyle: {},
+      emphasis: {
+        focus: 'series'
+      },
+      data: [220, 182, 191, 234, 290, 330, 310]
     },
-    legend: {
-        data: ['Email', 'Union Ads', 'Video Ads', 'Direct', 'Search Engine']
+    {
+      name: 'Video Ads',
+      type: 'line',
+      stack: 'Total',
+      areaStyle: {},
+      emphasis: {
+        focus: 'series'
+      },
+      data: [150, 232, 201, 154, 190, 330, 410]
     },
-    toolbox: {
-        feature: {
-            saveAsImage: {}
-        }
+    {
+      name: 'Direct',
+      type: 'line',
+      stack: 'Total',
+      areaStyle: {},
+      emphasis: {
+        focus: 'series'
+      },
+      data: [320, 332, 301, 334, 390, 330, 320]
     },
-    grid: {
-        left: '3%',
-        right: '4%',
-        bottom: '3%',
-        containLabel: true
-    },
-    xAxis: [
-        {
-            type: 'category',
-            boundaryGap: false,
-            data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
-        }
-    ],
-    yAxis: [
-        {
-            type: 'value'
-        }
-    ],
-    series: [
-        {
-            name: 'Email',
-            type: 'line',
-            stack: 'Total',
-            areaStyle: {},
-            emphasis: {
-                focus: 'series'
-            },
-            data: [120, 132, 101, 134, 90, 230, 210]
-        },
-        {
-            name: 'Union Ads',
-            type: 'line',
-            stack: 'Total',
-            areaStyle: {},
-            emphasis: {
-                focus: 'series'
-            },
-            data: [220, 182, 191, 234, 290, 330, 310]
-        },
-        {
-            name: 'Video Ads',
-            type: 'line',
-            stack: 'Total',
-            areaStyle: {},
-            emphasis: {
-                focus: 'series'
-            },
-            data: [150, 232, 201, 154, 190, 330, 410]
-        },
-        {
-            name: 'Direct',
-            type: 'line',
-            stack: 'Total',
-            areaStyle: {},
-            emphasis: {
-                focus: 'series'
-            },
-            data: [320, 332, 301, 334, 390, 330, 320]
-        },
-        {
-            name: 'Search Engine',
-            type: 'line',
-            stack: 'Total',
-            label: {
-                show: true,
-                position: 'top'
-            },
-            areaStyle: {},
-            emphasis: {
-                focus: 'series'
-            },
-            data: [820, 932, 901, 934, 1290, 1330, 1320]
-        }
-    ]
+    {
+      name: 'Search Engine',
+      type: 'line',
+      stack: 'Total',
+      label: {
+        show: true,
+        position: 'top'
+      },
+      areaStyle: {},
+      emphasis: {
+        focus: 'series'
+      },
+      data: [820, 932, 901, 934, 1290, 1330, 1320]
+    }
+  ]
 };
 
-export {}
\ No newline at end of file
+export {};
diff --git a/public/examples/ts/area-time-axis.ts b/public/examples/ts/area-time-axis.ts
index 17f2a6e..5d12fd1 100644
--- a/public/examples/ts/area-time-axis.ts
+++ b/public/examples/ts/area-time-axis.ts
@@ -11,59 +11,59 @@ let oneDay = 24 * 3600 * 1000;
 let data = [[base, Math.random() * 300]];
 
 for (let i = 1; i < 20000; i++) {
-    let now = new Date(base += oneDay);
-    data.push([
-        +now,
-        Math.round((Math.random() - 0.5) * 20 + data[i - 1][1])
-    ]);
+  let now = new Date((base += oneDay));
+  data.push([+now, Math.round((Math.random() - 0.5) * 20 + data[i - 1][1])]);
 }
 
 option = {
-    tooltip: {
-        trigger: 'axis',
-        position: function (pt) {
-            return [pt[0], '10%'];
-        }
+  tooltip: {
+    trigger: 'axis',
+    position: function (pt) {
+      return [pt[0], '10%'];
+    }
+  },
+  title: {
+    left: 'center',
+    text: 'Large Ara Chart'
+  },
+  toolbox: {
+    feature: {
+      dataZoom: {
+        yAxisIndex: 'none'
+      },
+      restore: {},
+      saveAsImage: {}
+    }
+  },
+  xAxis: {
+    type: 'time',
+    boundaryGap: false
+  },
+  yAxis: {
+    type: 'value',
+    boundaryGap: [0, '100%']
+  },
+  dataZoom: [
+    {
+      type: 'inside',
+      start: 0,
+      end: 20
     },
-    title: {
-        left: 'center',
-        text: 'Large Ara Chart',
-    },
-    toolbox: {
-        feature: {
-            dataZoom: {
-                yAxisIndex: 'none'
-            },
-            restore: {},
-            saveAsImage: {}
-        }
-    },
-    xAxis: {
-        type: 'time',
-        boundaryGap: false
-    },
-    yAxis: {
-        type: 'value',
-        boundaryGap: [0, '100%']
-    },
-    dataZoom: [{
-        type: 'inside',
-        start: 0,
-        end: 20
-    }, {
-        start: 0,
-        end: 20
-    }],
-    series: [
-        {
-            name: 'Fake Data',
-            type: 'line',
-            smooth: true,
-            symbol: 'none',
-            areaStyle: {},
-            data: data
-        }
-    ]
+    {
+      start: 0,
+      end: 20
+    }
+  ],
+  series: [
+    {
+      name: 'Fake Data',
+      type: 'line',
+      smooth: true,
+      symbol: 'none',
+      areaStyle: {},
+      data: data
+    }
+  ]
 };
 
-export {}
\ No newline at end of file
+export {};
diff --git a/public/examples/ts/bar-animation-delay.ts b/public/examples/ts/bar-animation-delay.ts
index 3002c03..50f1f01 100644
--- a/public/examples/ts/bar-animation-delay.ts
+++ b/public/examples/ts/bar-animation-delay.ts
@@ -9,62 +9,64 @@ var xAxisData = [];
 var data1 = [];
 var data2 = [];
 for (var i = 0; i < 100; i++) {
-    xAxisData.push('类目' + i);
-    data1.push((Math.sin(i / 5) * (i / 5 -10) + i / 6) * 5);
-    data2.push((Math.cos(i / 5) * (i / 5 -10) + i / 6) * 5);
+  xAxisData.push('A' + i);
+  data1.push((Math.sin(i / 5) * (i / 5 - 10) + i / 6) * 5);
+  data2.push((Math.cos(i / 5) * (i / 5 - 10) + i / 6) * 5);
 }
 
 option = {
-    title: {
-        text: 'Bar Animation Delay'
-    },
-    legend: {
-        data: ['bar', 'bar2']
-    },
-    toolbox: {
-        // y: 'bottom',
-        feature: {
-            magicType: {
-                type: ['stack']
-            },
-            dataView: {},
-            saveAsImage: {
-                pixelRatio: 2
-            }
-        }
-    },
-    tooltip: {},
-    xAxis: {
-        data: xAxisData,
-        splitLine: {
-            show: false
-        }
-    },
-    yAxis: {
+  title: {
+    text: 'Bar Animation Delay'
+  },
+  legend: {
+    data: ['bar', 'bar2']
+  },
+  toolbox: {
+    // y: 'bottom',
+    feature: {
+      magicType: {
+        type: ['stack']
+      },
+      dataView: {},
+      saveAsImage: {
+        pixelRatio: 2
+      }
+    }
+  },
+  tooltip: {},
+  xAxis: {
+    data: xAxisData,
+    splitLine: {
+      show: false
+    }
+  },
+  yAxis: {},
+  series: [
+    {
+      name: 'bar',
+      type: 'bar',
+      data: data1,
+      emphasis: {
+        focus: 'series'
+      },
+      animationDelay: function (idx) {
+        return idx * 10;
+      }
     },
-    series: [{
-        name: 'bar',
-        type: 'bar',
-        data: data1,
-        emphasis: {
-            focus: 'series'
-        },
-        animationDelay: function (idx) {
-            return idx * 10;
-        }
-    }, {
-        name: 'bar2',
-        type: 'bar',
-        data: data2,
-        emphasis: {
-            focus: 'series'
-        },
-        animationDelay: function (idx) {
-            return idx * 10 + 100;
-        }
-    }],
-    animationEasing: 'elasticOut',
-    animationDelayUpdate: function (idx) {
-        return idx * 5;
+    {
+      name: 'bar2',
+      type: 'bar',
+      data: data2,
+      emphasis: {
+        focus: 'series'
+      },
+      animationDelay: function (idx) {
+        return idx * 10 + 100;
+      }
     }
-};
\ No newline at end of file
+  ],
+  animationEasing: 'elasticOut',
+  animationDelayUpdate: function (idx) {
+    return idx * 5;
+  }
+};
diff --git a/public/examples/ts/bar-background.ts b/public/examples/ts/bar-background.ts
index 3c89094..d9a9efb 100644
--- a/public/examples/ts/bar-background.ts
+++ b/public/examples/ts/bar-background.ts
@@ -6,21 +6,23 @@ difficulty: 0
 */
 
 option = {
-    xAxis: {
-        type: 'category',
-        data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
-    },
-    yAxis: {
-        type: 'value'
-    },
-    series: [{
-        data: [120, 200, 150, 80, 70, 110, 130],
-        type: 'bar',
-        showBackground: true,
-        backgroundStyle: {
-            color: 'rgba(180, 180, 180, 0.2)'
-        }
-    }]
+  xAxis: {
+    type: 'category',
+    data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
+  },
+  yAxis: {
+    type: 'value'
+  },
+  series: [
+    {
+      data: [120, 200, 150, 80, 70, 110, 130],
+      type: 'bar',
+      showBackground: true,
+      backgroundStyle: {
+        color: 'rgba(180, 180, 180, 0.2)'
+      }
+    }
+  ]
 };
 
-export {}
+export {};
diff --git a/public/examples/ts/bar-brush.ts b/public/examples/ts/bar-brush.ts
index abb4cbd..f09b9dd 100644
--- a/public/examples/ts/bar-brush.ts
+++ b/public/examples/ts/bar-brush.ts
@@ -12,104 +12,103 @@ let data3: number[] = [];
 let data4: number[] = [];
 
 for (let i = 0; i < 10; i++) {
-    xAxisData.push('Class' + i);
-    data1.push(+(Math.random() * 2).toFixed(2));
-    data2.push(+(Math.random() * 5).toFixed(2));
-    data3.push(+(Math.random() + 0.3).toFixed(2));
-    data4.push(+Math.random().toFixed(2));
+  xAxisData.push('Class' + i);
+  data1.push(+(Math.random() * 2).toFixed(2));
+  data2.push(+(Math.random() * 5).toFixed(2));
+  data3.push(+(Math.random() + 0.3).toFixed(2));
+  data4.push(+Math.random().toFixed(2));
 }
 
 var emphasisStyle = {
-    itemStyle: {
-        shadowBlur: 10,
-        shadowColor: 'rgba(0,0,0,0.3)'
-    }
+  itemStyle: {
+    shadowBlur: 10,
+    shadowColor: 'rgba(0,0,0,0.3)'
+  }
 };
 
 option = {
-    legend: {
-        data: ['bar', 'bar2', 'bar3', 'bar4'],
-        left: '10%'
-    },
-    brush: {
-        toolbox: ['rect', 'polygon', 'lineX', 'lineY', 'keep', 'clear'],
-        xAxisIndex: 0
-    },
-    toolbox: {
-        feature: {
-            magicType: {
-                type: ['stack']
-            },
-            dataView: {}
-        }
+  legend: {
+    data: ['bar', 'bar2', 'bar3', 'bar4'],
+    left: '10%'
+  },
+  brush: {
+    toolbox: ['rect', 'polygon', 'lineX', 'lineY', 'keep', 'clear'],
+    xAxisIndex: 0
+  },
+  toolbox: {
+    feature: {
+      magicType: {
+        type: ['stack']
+      },
+      dataView: {}
+    }
+  },
+  tooltip: {},
+  xAxis: {
+    data: xAxisData,
+    name: 'X Axis',
+    axisLine: { onZero: true },
+    splitLine: { show: false },
+    splitArea: { show: false }
+  },
+  yAxis: {},
+  grid: {
+    bottom: 100
+  },
+  series: [
+    {
+      name: 'bar',
+      type: 'bar',
+      stack: 'one',
+      emphasis: emphasisStyle,
+      data: data1
     },
-    tooltip: {},
-    xAxis: {
-        data: xAxisData,
-        name: 'X Axis',
-        axisLine: {onZero: true},
-        splitLine: {show: false},
-        splitArea: {show: false}
+    {
+      name: 'bar2',
+      type: 'bar',
+      stack: 'one',
+      emphasis: emphasisStyle,
+      data: data2
     },
-    yAxis: {},
-    grid: {
-        bottom: 100
+    {
+      name: 'bar3',
+      type: 'bar',
+      stack: 'two',
+      emphasis: emphasisStyle,
+      data: data3
     },
-    series: [
-        {
-            name: 'bar',
-            type: 'bar',
-            stack: 'one',
-            emphasis: emphasisStyle,
-            data: data1
-        },
-        {
-            name: 'bar2',
-            type: 'bar',
-            stack: 'one',
-            emphasis: emphasisStyle,
-            data: data2
-        },
-        {
-            name: 'bar3',
-            type: 'bar',
-            stack: 'two',
-            emphasis: emphasisStyle,
-            data: data3
-        },
-        {
-            name: 'bar4',
-            type: 'bar',
-            stack: 'two',
-            emphasis: emphasisStyle,
-            data: data4
-        }
-    ]
+    {
+      name: 'bar4',
+      type: 'bar',
+      stack: 'two',
+      emphasis: emphasisStyle,
+      data: data4
+    }
+  ]
 };
 
 myChart.on('brushSelected', function (params: any) {
-    var brushed = [];
-    var brushComponent = params.batch[0];
+  var brushed = [];
+  var brushComponent = params.batch[0];
 
-    for (var sIdx = 0; sIdx < brushComponent.selected.length; sIdx++) {
-        var rawIndices = brushComponent.selected[sIdx].dataIndex;
-        brushed.push('[Series ' + sIdx + '] ' + rawIndices.join(', '));
-    }
+  for (var sIdx = 0; sIdx < brushComponent.selected.length; sIdx++) {
+    var rawIndices = brushComponent.selected[sIdx].dataIndex;
+    brushed.push('[Series ' + sIdx + '] ' + rawIndices.join(', '));
+  }
 
-    myChart.setOption<echarts.EChartsOption>({
-        title: {
-            backgroundColor: '#333',
-            text: 'SELECTED DATA INDICES: \n' + brushed.join('\n'),
-            bottom: 0,
-            right:'10%',
-            width: 100,
-            textStyle: {
-                fontSize: 12,
-                color: '#fff'
-            }
-        }
-    });
+  myChart.setOption<echarts.EChartsOption>({
+    title: {
+      backgroundColor: '#333',
+      text: 'SELECTED DATA INDICES: \n' + brushed.join('\n'),
+      bottom: 0,
+      right: '10%',
+      width: 100,
+      textStyle: {
+        fontSize: 12,
+        color: '#fff'
+      }
+    }
+  });
 });
 
-
-export {}
\ No newline at end of file
+export {};
diff --git a/public/examples/ts/bar-data-color.ts b/public/examples/ts/bar-data-color.ts
index b5eccae..6f3f224 100644
--- a/public/examples/ts/bar-data-color.ts
+++ b/public/examples/ts/bar-data-color.ts
@@ -6,22 +6,32 @@ difficulty: 1
 */
 
 option = {
-    xAxis: {
-        type: 'category',
-        data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
-    },
-    yAxis: {
-        type: 'value'
-    },
-    series: [{
-        data: [120, {
-            value: 200,
-            itemStyle: {
-                color: '#a90000'
-            }
-        }, 150, 80, 70, 110, 130],
-        type: 'bar'
-    }]
+  xAxis: {
+    type: 'category',
+    data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
+  },
+  yAxis: {
+    type: 'value'
+  },
+  series: [
+    {
+      data: [
+        120,
+        {
+          value: 200,
+          itemStyle: {
+            color: '#a90000'
+          }
+        },
+        150,
+        80,
+        70,
+        110,
+        130
+      ],
+      type: 'bar'
+    }
+  ]
 };
 
-export {}
\ No newline at end of file
+export {};
diff --git a/public/examples/ts/bar-drilldown.ts b/public/examples/ts/bar-drilldown.ts
index 864766c..d050e33 100644
--- a/public/examples/ts/bar-drilldown.ts
+++ b/public/examples/ts/bar-drilldown.ts
@@ -5,101 +5,110 @@ titleCN: 柱状图下钻动画
 difficulty: 5
 */
 
-
 interface DataItem {
-    value: number
-    groupId: string
+  value: number;
+  groupId: string;
 }
 option = {
-    xAxis: {
-        data: ['Animals', 'Fruits', 'Cars']
-    },
-    yAxis: {},
-    dataGroupId: '',
-    animationDurationUpdate: 500,
-    series: {
-        type: 'bar',
-        id: 'sales',
-        data: [{
-            value: 5,
-            groupId: 'animals'
-        }, {
-            value: 2,
-            groupId: 'fruits'
-        }, {
-            value: 4,
-            groupId: 'cars'
-        }] as DataItem[],
-        universalTransition: {
-            enabled: true,
-            divideShape: 'clone'
-        }
+  xAxis: {
+    data: ['Animals', 'Fruits', 'Cars']
+  },
+  yAxis: {},
+  dataGroupId: '',
+  animationDurationUpdate: 500,
+  series: {
+    type: 'bar',
+    id: 'sales',
+    data: [
+      {
+        value: 5,
+        groupId: 'animals'
+      },
+      {
+        value: 2,
+        groupId: 'fruits'
+      },
+      {
+        value: 4,
+        groupId: 'cars'
+      }
+    ] as DataItem[],
+    universalTransition: {
+      enabled: true,
+      divideShape: 'clone'
     }
+  }
 };
 
-const drilldownData = [{
+const drilldownData = [
+  {
     dataGroupId: 'animals',
     data: [
-        ['Cats', 4],
-        ['Dogs', 2],
-        ['Cows', 1],
-        ['Sheep', 2],
-        ['Pigs', 1]
+      ['Cats', 4],
+      ['Dogs', 2],
+      ['Cows', 1],
+      ['Sheep', 2],
+      ['Pigs', 1]
     ]
-}, {
+  },
+  {
     dataGroupId: 'fruits',
     data: [
-        ['Apples', 4],
-        ['Oranges', 2]
+      ['Apples', 4],
+      ['Oranges', 2]
     ]
-}, {
+  },
+  {
     dataGroupId: 'cars',
     data: [
-        ['Toyota', 4],
-        ['Opel', 2],
-        ['Volkswagen', 2]
+      ['Toyota', 4],
+      ['Opel', 2],
+      ['Volkswagen', 2]
     ]
-}];
+  }
+];
 
 myChart.on('click', function (event) {
-    if (event.data) {
-        var subData = drilldownData.find(function (data) {
-            return data.dataGroupId === (event.data as DataItem).groupId;
-        });
-        if (!subData) {
-            return;
-        }
-        myChart.setOption<echarts.EChartsOption>({
-            xAxis: {
-                data: subData.data.map(function (item) {
-                    return item[0];
-                })
-            },
-            series: {
-                type: 'bar',
-                id: 'sales',
-                dataGroupId: subData.dataGroupId,
-                data: subData.data.map(function (item) {
-                    return item[1];
-                }),
-                universalTransition: {
-                    enabled: true,
-                    divideShape: 'clone'
-                }
-            },
-            graphic: [{
-                type: 'text',
-                left: 50,
-                top: 20,
-                style: {
-                    text: 'Back',
-                    fontSize: 18
-                },
-                onclick: function () {
-                    myChart.setOption<echarts.EChartsOption>(option);
-                }
-            }]
-        });
+  if (event.data) {
+    var subData = drilldownData.find(function (data) {
+      return data.dataGroupId === (event.data as DataItem).groupId;
+    });
+    if (!subData) {
+      return;
     }
+    myChart.setOption<echarts.EChartsOption>({
+      xAxis: {
+        data: subData.data.map(function (item) {
+          return item[0];
+        })
+      },
+      series: {
+        type: 'bar',
+        id: 'sales',
+        dataGroupId: subData.dataGroupId,
+        data: subData.data.map(function (item) {
+          return item[1];
+        }),
+        universalTransition: {
+          enabled: true,
+          divideShape: 'clone'
+        }
+      },
+      graphic: [
+        {
+          type: 'text',
+          left: 50,
+          top: 20,
+          style: {
+            text: 'Back',
+            fontSize: 18
+          },
+          onclick: function () {
+            myChart.setOption<echarts.EChartsOption>(option);
+          }
+        }
+      ]
+    });
+  }
 });
-export {}
\ No newline at end of file
+export {};
diff --git a/public/examples/ts/bar-gradient.ts b/public/examples/ts/bar-gradient.ts
index a22168d..c620388 100644
--- a/public/examples/ts/bar-gradient.ts
+++ b/public/examples/ts/bar-gradient.ts
@@ -5,90 +5,87 @@ category: bar
 difficulty: 3
 */
 
-var dataAxis = ['点', '击', '柱', '子', '或', '者', '两', '指', '在', '触', '屏', '上', '滑', '动', '能', '够', '自', '动', '缩', '放'];
-var data = [220, 182, 191, 234, 290, 330, 310, 123, 442, 321, 90, 149, 210, 122, 133, 334, 198, 123, 125, 220];
-var yMax = 500;
-var dataShadow = [];
+// prettier-ignore
+let dataAxis = ['点', '击', '柱', '子', '或', '者', '两', '指', '在', '触', '屏', '上', '滑', '动', '能', '够', '自', '动', '缩', '放'];
+// prettier-ignore
+let data = [220, 182, 191, 234, 290, 330, 310, 123, 442, 321, 90, 149, 210, 122, 133, 334, 198, 123, 125, 220];
+let yMax = 500;
+let dataShadow = [];
 
-for (var i = 0; i < data.length; i++) {
-    dataShadow.push(yMax);
+for (let i = 0; i < data.length; i++) {
+  dataShadow.push(yMax);
 }
 
 option = {
-    title: {
-        text: '特性示例:渐变色 阴影 点击缩放',
-        subtext: 'Feature Sample: Gradient Color, Shadow, Click Zoom'
+  title: {
+    text: '特性示例:渐变色 阴影 点击缩放',
+    subtext: 'Feature Sample: Gradient Color, Shadow, Click Zoom'
+  },
+  xAxis: {
+    data: dataAxis,
+    axisLabel: {
+      inside: true,
+      color: '#fff'
     },
-    xAxis: {
-        data: dataAxis,
-        axisLabel: {
-            inside: true,
-            color: '#fff'
-        },
-        axisTick: {
-            show: false
-        },
-        axisLine: {
-            show: false
-        },
-        z: 10
+    axisTick: {
+      show: false
     },
-    yAxis: {
-        axisLine: {
-            show: false
-        },
-        axisTick: {
-            show: false
-        },
-        axisLabel: {
-            color: '#999'
-        }
+    axisLine: {
+      show: false
     },
-    dataZoom: [
-        {
-            type: 'inside'
-        }
-    ],
-    series: [
-        {
-            type: 'bar',
-            showBackground: true,
-            itemStyle: {
-                color: new echarts.graphic.LinearGradient(
-                    0, 0, 0, 1,
-                    [
-                        {offset: 0, color: '#83bff6'},
-                        {offset: 0.5, color: '#188df0'},
-                        {offset: 1, color: '#188df0'}
-                    ]
-                )
-            },
-            emphasis: {
-                itemStyle: {
-                    color: new echarts.graphic.LinearGradient(
-                        0, 0, 0, 1,
-                        [
-                            {offset: 0, color: '#2378f7'},
-                            {offset: 0.7, color: '#2378f7'},
-                            {offset: 1, color: '#83bff6'}
-                        ]
-                    )
-                }
-            },
-            data: data
+    z: 10
+  },
+  yAxis: {
+    axisLine: {
+      show: false
+    },
+    axisTick: {
+      show: false
+    },
+    axisLabel: {
+      color: '#999'
+    }
+  },
+  dataZoom: [
+    {
+      type: 'inside'
+    }
+  ],
+  series: [
+    {
+      type: 'bar',
+      showBackground: true,
+      itemStyle: {
+        color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+          { offset: 0, color: '#83bff6' },
+          { offset: 0.5, color: '#188df0' },
+          { offset: 1, color: '#188df0' }
+        ])
+      },
+      emphasis: {
+        itemStyle: {
+          color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+            { offset: 0, color: '#2378f7' },
+            { offset: 0.7, color: '#2378f7' },
+            { offset: 1, color: '#83bff6' }
+          ])
         }
-    ]
+      },
+      data: data
+    }
+  ]
 };
 
 // Enable data zoom when user click bar.
-var zoomSize = 6;
+const zoomSize = 6;
 myChart.on('click', function (params) {
-    console.log(dataAxis[Math.max(params.dataIndex - zoomSize / 2, 0)]);
-    myChart.dispatchAction({
-        type: 'dataZoom',
-        startValue: dataAxis[Math.max(params.dataIndex - zoomSize / 2, 0)],
-        endValue: dataAxis[Math.min(params.dataIndex + zoomSize / 2, data.length - 1)]
-    });
+  console.log(dataAxis[Math.max(params.dataIndex - zoomSize / 2, 0)]);
+  myChart.dispatchAction({
+    type: 'dataZoom',
+    startValue: dataAxis[Math.max(params.dataIndex - zoomSize / 2, 0)],
+    endValue:
+      dataAxis[Math.min(params.dataIndex + zoomSize / 2, data.length - 1)]
+  });
 });
 
-export {}
\ No newline at end of file
+export {};
diff --git a/public/examples/ts/bar-histogram.ts b/public/examples/ts/bar-histogram.ts
index 424db37..b4536ec 100644
--- a/public/examples/ts/bar-histogram.ts
+++ b/public/examples/ts/bar-histogram.ts
@@ -9,119 +9,138 @@ difficulty: 0
 echarts.registerTransform(ecStat.transform.histogram);
 
 option = {
-    dataset: [{
-        source: [
-            [8.3, 143],
-            [8.6, 214],
-            [8.8, 251],
-            [10.5, 26],
-            [10.7, 86],
-            [10.8, 93],
-            [11.0, 176],
-            [11.0, 39],
-            [11.1, 221],
-            [11.2, 188],
-            [11.3, 57],
-            [11.4, 91],
-            [11.4, 191],
-            [11.7, 8],
-            [12.0, 196],
-            [12.9, 177],
-            [12.9, 153],
-            [13.3, 201],
-            [13.7, 199],
-            [13.8, 47],
-            [14.0, 81],
-            [14.2, 98],
-            [14.5, 121],
-            [16.0, 37],
-            [16.3, 12],
-            [17.3, 105],
-            [17.5, 168],
-            [17.9, 84],
-            [18.0, 197],
-            [18.0, 155],
-            [20.6, 125]
-        ]
-    }, {
-        transform: {
-            type: 'ecStat:histogram',
-            config: {}
-        }
-    }, {
-        transform: {
-            type: 'ecStat:histogram',
-            // print: true,
-            config: { dimensions: [1] }
-        }
-    }],
-    tooltip: {
+  dataset: [
+    {
+      source: [
+        [8.3, 143],
+        [8.6, 214],
+        [8.8, 251],
+        [10.5, 26],
+        [10.7, 86],
+        [10.8, 93],
+        [11.0, 176],
+        [11.0, 39],
+        [11.1, 221],
+        [11.2, 188],
+        [11.3, 57],
+        [11.4, 91],
+        [11.4, 191],
+        [11.7, 8],
+        [12.0, 196],
+        [12.9, 177],
+        [12.9, 153],
+        [13.3, 201],
+        [13.7, 199],
+        [13.8, 47],
+        [14.0, 81],
+        [14.2, 98],
+        [14.5, 121],
+        [16.0, 37],
+        [16.3, 12],
+        [17.3, 105],
+        [17.5, 168],
+        [17.9, 84],
+        [18.0, 197],
+        [18.0, 155],
+        [20.6, 125]
+      ]
     },
-    grid: [{
-        top: '50%',
-        right: '50%'
-    }, {
-        bottom: '52%',
-        right: '50%',
-    }, {
-        top: '50%',
-        left: '52%'
-    }],
-    xAxis: [{
-        scale: true,
-        gridIndex: 0
-    }, {
-        type: 'category',
-        scale: true,
-        axisTick: { show: false },
-        axisLabel: { show: false },
-        axisLine: { show: false },
-        gridIndex: 1
-    }, {
-        scale: true,
-        gridIndex: 2
-    }],
-    yAxis: [{
-        gridIndex: 0
-    }, {
-        gridIndex: 1
-    }, {
-        type: 'category',
-        axisTick: { show: false },
-        axisLabel: { show: false },
-        axisLine: { show: false },
-        gridIndex: 2
-    }],
-    series: [{
-        name: 'origianl scatter',
-        type: 'scatter',
-        xAxisIndex: 0,
-        yAxisIndex: 0,
-        encode: { tooltip: [0, 1] },
-        datasetIndex: 0
-    }, {
-        name: 'histogram',
-        type: 'bar',
-        xAxisIndex: 1,
-        yAxisIndex: 1,
-        barWidth: '99.3%',
-        label: {
-            show: true,
-            position: 'top'
-        },
-        encode: { x: 0, y: 1, itemName: 4 },
-        datasetIndex: 1
-    }, {
-        name: 'histogram',
-        type: 'bar',
-        xAxisIndex: 2,
-        yAxisIndex: 2,
-        barWidth: '99.3%',
-        label: {
-            show: true,
-            position: 'right'
-        },
-        encode: { x: 1, y: 0, itemName: 4 },
-        datasetIndex: 2
-    }]
+    {
+      transform: {
+        type: 'ecStat:histogram',
+        config: {}
+      }
+    },
+    {
+      transform: {
+        type: 'ecStat:histogram',
+        // print: true,
+        config: { dimensions: [1] }
+      }
+    }
+  ],
+  tooltip: {},
+  grid: [
+    {
+      top: '50%',
+      right: '50%'
+    },
+    {
+      bottom: '52%',
+      right: '50%'
+    },
+    {
+      top: '50%',
+      left: '52%'
+    }
+  ],
+  xAxis: [
+    {
+      scale: true,
+      gridIndex: 0
+    },
+    {
+      type: 'category',
+      scale: true,
+      axisTick: { show: false },
+      axisLabel: { show: false },
+      axisLine: { show: false },
+      gridIndex: 1
+    },
+    {
+      scale: true,
+      gridIndex: 2
+    }
+  ],
+  yAxis: [
+    {
+      gridIndex: 0
+    },
+    {
+      gridIndex: 1
+    },
+    {
+      type: 'category',
+      axisTick: { show: false },
+      axisLabel: { show: false },
+      axisLine: { show: false },
+      gridIndex: 2
+    }
+  ],
+  series: [
+    {
+      name: 'origianl scatter',
+      type: 'scatter',
+      xAxisIndex: 0,
+      yAxisIndex: 0,
+      encode: { tooltip: [0, 1] },
+      datasetIndex: 0
+    },
+    {
+      name: 'histogram',
+      type: 'bar',
+      xAxisIndex: 1,
+      yAxisIndex: 1,
+      barWidth: '99.3%',
+      label: {
+        show: true,
+        position: 'top'
+      },
+      encode: { x: 0, y: 1, itemName: 4 },
+      datasetIndex: 1
+    },
+    {
+      name: 'histogram',
+      type: 'bar',
+      xAxisIndex: 2,
+      yAxisIndex: 2,
+      barWidth: '99.3%',
+      label: {
+        show: true,
+        position: 'right'
+      },
+      encode: { x: 1, y: 0, itemName: 4 },
+      datasetIndex: 2
+    }
+  ]
 };
diff --git a/public/examples/ts/bar-label-rotation.ts b/public/examples/ts/bar-label-rotation.ts
index 9218f49..97bd265 100644
--- a/public/examples/ts/bar-label-rotation.ts
+++ b/public/examples/ts/bar-label-rotation.ts
@@ -6,161 +6,175 @@ difficulty: 3
 */
 
 const posList = [
-    'left', 'right', 'top', 'bottom',
-    'inside',
-    'insideTop', 'insideLeft', 'insideRight', 'insideBottom',
-    'insideTopLeft', 'insideTopRight', 'insideBottomLeft', 'insideBottomRight'
+  'left',
+  'right',
+  'top',
+  'bottom',
+  'inside',
+  'insideTop',
+  'insideLeft',
+  'insideRight',
+  'insideBottom',
+  'insideTopLeft',
+  'insideTopRight',
+  'insideBottomLeft',
+  'insideBottomRight'
 ] as const;
 
 app.configParameters = {
-    rotate: {
-        min: -90,
-        max: 90
-    },
-    align: {
-        options: {
-            left: 'left',
-            center: 'center',
-            right: 'right'
-        }
-    },
-    verticalAlign: {
-        options: {
-            top: 'top',
-            middle: 'middle',
-            bottom: 'bottom'
-        }
-    },
-    position: {
-        options: posList.reduce(function (map, pos) {
-            map[pos] = pos;
-            return map;
-        }, {} as Record<string, string>)
-    },
-    distance: {
-        min: 0,
-        max: 100
+  rotate: {
+    min: -90,
+    max: 90
+  },
+  align: {
+    options: {
+      left: 'left',
+      center: 'center',
+      right: 'right'
+    }
+  },
+  verticalAlign: {
+    options: {
+      top: 'top',
+      middle: 'middle',
+      bottom: 'bottom'
     }
+  },
+  position: {
+    options: posList.reduce(function (map, pos) {
+      map[pos] = pos;
+      return map;
+    }, {} as Record<string, string>)
+  },
+  distance: {
+    min: 0,
+    max: 100
+  }
 };
 
 app.config = {
-    rotate: 90,
-    align: 'left',
-    verticalAlign: 'middle',
-    position: 'insideBottom',
-    distance: 15,
-    onChange: function () {
-        var labelOption = {
-            normal: {
-                rotate: app.config.rotate,
-                align: app.config.align,
-                verticalAlign: app.config.verticalAlign,
-                position: app.config.position,
-                distance: app.config.distance
-            }
-        };
-        myChart.setOption<echarts.EChartsOption>({
-            series: [{
-                label: labelOption
-            }, {
-                label: labelOption
-            }, {
-                label: labelOption
-            }, {
-                label: labelOption
-            }]
-        });
-    }
+  rotate: 90,
+  align: 'left',
+  verticalAlign: 'middle',
+  position: 'insideBottom',
+  distance: 15,
+  onChange: function () {
+    var labelOption = {
+      normal: {
+        rotate: app.config.rotate,
+        align: app.config.align,
+        verticalAlign: app.config.verticalAlign,
+        position: app.config.position,
+        distance: app.config.distance
+      }
+    };
+    myChart.setOption<echarts.EChartsOption>({
+      series: [
+        {
+          label: labelOption
+        },
+        {
+          label: labelOption
+        },
+        {
+          label: labelOption
+        },
+        {
+          label: labelOption
+        }
+      ]
+    });
+  }
 };
 
-type BarLabelOption = NonNullable<echarts.BarSeriesOption['label']>
+type BarLabelOption = NonNullable<echarts.BarSeriesOption['label']>;
 
 const labelOption = {
-    show: true,
-    position: app.config.position as BarLabelOption['position'],
-    distance: app.config.distance as BarLabelOption['distance'],
-    align: app.config.align as BarLabelOption['align'],
-    verticalAlign: app.config.verticalAlign as BarLabelOption['verticalAlign'],
-    rotate: app.config.rotate as BarLabelOption['rotate'],
-    formatter: '{c}  {name|{a}}',
-    fontSize: 16,
-    rich: {
-        name: {}
-    }
+  show: true,
+  position: app.config.position as BarLabelOption['position'],
+  distance: app.config.distance as BarLabelOption['distance'],
+  align: app.config.align as BarLabelOption['align'],
+  verticalAlign: app.config.verticalAlign as BarLabelOption['verticalAlign'],
+  rotate: app.config.rotate as BarLabelOption['rotate'],
+  formatter: '{c}  {name|{a}}',
+  fontSize: 16,
+  rich: {
+    name: {}
+  }
 };
 
 option = {
-    tooltip: {
-        trigger: 'axis',
-        axisPointer: {
-            type: 'shadow'
-        }
+  tooltip: {
+    trigger: 'axis',
+    axisPointer: {
+      type: 'shadow'
+    }
+  },
+  legend: {
+    data: ['Forest', 'Steppe', 'Desert', 'Wetland']
+  },
+  toolbox: {
+    show: true,
+    orient: 'vertical',
+    left: 'right',
+    top: 'center',
+    feature: {
+      mark: { show: true },
+      dataView: { show: true, readOnly: false },
+      magicType: { show: true, type: ['line', 'bar', 'stack'] },
+      restore: { show: true },
+      saveAsImage: { show: true }
+    }
+  },
+  xAxis: [
+    {
+      type: 'category',
+      axisTick: { show: false },
+      data: ['2012', '2013', '2014', '2015', '2016']
+    }
+  ],
+  yAxis: [
+    {
+      type: 'value'
+    }
+  ],
+  series: [
+    {
+      name: 'Forest',
+      type: 'bar',
+      barGap: 0,
+      label: labelOption,
+      emphasis: {
+        focus: 'series'
+      },
+      data: [320, 332, 301, 334, 390]
     },
-    legend: {
-        data: ['Forest', 'Steppe', 'Desert', 'Wetland']
+    {
+      name: 'Steppe',
+      type: 'bar',
+      label: labelOption,
+      emphasis: {
+        focus: 'series'
+      },
+      data: [220, 182, 191, 234, 290]
     },
-    toolbox: {
-        show: true,
-        orient: 'vertical',
-        left: 'right',
-        top: 'center',
-        feature: {
-            mark: {show: true},
-            dataView: {show: true, readOnly: false},
-            magicType: {show: true, type: ['line', 'bar', 'stack']},
-            restore: {show: true},
-            saveAsImage: {show: true}
-        }
+    {
+      name: 'Desert',
+      type: 'bar',
+      label: labelOption,
+      emphasis: {
+        focus: 'series'
+      },
+      data: [150, 232, 201, 154, 190]
     },
-    xAxis: [
-        {
-            type: 'category',
-            axisTick: {show: false},
-            data: ['2012', '2013', '2014', '2015', '2016']
-        }
-    ],
-    yAxis: [
-        {
-            type: 'value'
-        }
-    ],
-    series: [
-        {
-            name: 'Forest',
-            type: 'bar',
-            barGap: 0,
-            label: labelOption,
-            emphasis: {
-                focus: 'series'
-            },
-            data: [320, 332, 301, 334, 390]
-        },
-        {
-            name: 'Steppe',
-            type: 'bar',
-            label: labelOption,
-            emphasis: {
-                focus: 'series'
-            },
-            data: [220, 182, 191, 234, 290]
-        },
-        {
-            name: 'Desert',
-            type: 'bar',
-            label: labelOption,
-            emphasis: {
-                focus: 'series'
-            },
-            data: [150, 232, 201, 154, 190]
-        },
-        {
-            name: 'Wetland',
-            type: 'bar',
-            label: labelOption,
-            emphasis: {
-                focus: 'series'
-            },
-            data: [98, 77, 101, 99, 40]
-        }
-    ]
-};
\ No newline at end of file
+    {
+      name: 'Wetland',
+      type: 'bar',
+      label: labelOption,
+      emphasis: {
+        focus: 'series'
+      },
+      data: [98, 77, 101, 99, 40]
+    }
+  ]
+};
diff --git a/public/examples/ts/bar-large.ts b/public/examples/ts/bar-large.ts
index 03be19a..0a05fe3 100644
--- a/public/examples/ts/bar-large.ts
+++ b/public/examples/ts/bar-large.ts
@@ -5,91 +5,95 @@ titleCN: 大数据量柱图
 difficulty: 5
 */
 
-
 const dataCount = 5e5;
 const data = generateData(dataCount);
 
 option = {
-    title: {
-        text: echarts.format.addCommas(dataCount) + ' Data',
-        left: 10
-    },
-    toolbox: {
-        feature: {
-            dataZoom: {
-                yAxisIndex: false
-            },
-            saveAsImage: {
-                pixelRatio: 2
-            }
-        }
-    },
-    tooltip: {
-        trigger: 'axis',
-        axisPointer: {
-            type: 'shadow'
-        }
-    },
-    grid: {
-        bottom: 90
-    },
-    dataZoom: [{
-        type: 'inside'
-    }, {
-        type: 'slider'
-    }],
-    xAxis: {
-        data: data.categoryData,
-        silent: false,
-        splitLine: {
-            show: false
-        },
-        splitArea: {
-            show: false
-        }
+  title: {
+    text: echarts.format.addCommas(dataCount) + ' Data',
+    left: 10
+  },
+  toolbox: {
+    feature: {
+      dataZoom: {
+        yAxisIndex: false
+      },
+      saveAsImage: {
+        pixelRatio: 2
+      }
+    }
+  },
+  tooltip: {
+    trigger: 'axis',
+    axisPointer: {
+      type: 'shadow'
+    }
+  },
+  grid: {
+    bottom: 90
+  },
+  dataZoom: [
+    {
+      type: 'inside'
     },
-    yAxis: {
-        splitArea: {
-            show: false
-        }
+    {
+      type: 'slider'
+    }
+  ],
+  xAxis: {
+    data: data.categoryData,
+    silent: false,
+    splitLine: {
+      show: false
     },
-    series: [{
-        type: 'bar',
-        data: data.valueData,
-        // Set `large` for large data amount
-        large: true
-    }]
+    splitArea: {
+      show: false
+    }
+  },
+  yAxis: {
+    splitArea: {
+      show: false
+    }
+  },
+  series: [
+    {
+      type: 'bar',
+      data: data.valueData,
+      // Set `large` for large data amount
+      large: true
+    }
+  ]
 };
 
 function generateData(count: number) {
-    let baseValue = Math.random() * 1000;
-    let time = +new Date(2011, 0, 1);
-    let smallBaseValue: number;
+  let baseValue = Math.random() * 1000;
+  let time = +new Date(2011, 0, 1);
+  let smallBaseValue: number;
 
-    function next(idx: number) {
-        smallBaseValue = idx % 30 === 0
-            ? Math.random() * 700
-            : (smallBaseValue + Math.random() * 500 - 250);
-        baseValue += Math.random() * 20 - 10;
-        return Math.max(
-            0,
-            Math.round(baseValue + smallBaseValue) + 3000
-        );
-    }
+  function next(idx: number) {
+    smallBaseValue =
+      idx % 30 === 0
+        ? Math.random() * 700
+        : smallBaseValue + Math.random() * 500 - 250;
+    baseValue += Math.random() * 20 - 10;
+    return Math.max(0, Math.round(baseValue + smallBaseValue) + 3000);
+  }
 
-    const categoryData = [];
-    const valueData = [];
+  const categoryData = [];
+  const valueData = [];
 
-    for (let i = 0; i < count; i++) {
-        categoryData.push(echarts.format.formatTime('yyyy-MM-dd\nhh:mm:ss', time, false));
-        valueData.push(next(i).toFixed(2));
-        time += 1000;
-    }
+  for (let i = 0; i < count; i++) {
+    categoryData.push(
+      echarts.format.formatTime('yyyy-MM-dd\nhh:mm:ss', time, false)
+    );
+    valueData.push(next(i).toFixed(2));
+    time += 1000;
+  }
 
-    return {
-        categoryData: categoryData,
-        valueData: valueData
-    };
+  return {
+    categoryData: categoryData,
+    valueData: valueData
+  };
 }
 
-export {}
\ No newline at end of file
+export {};
diff --git a/public/examples/ts/bar-negative.ts b/public/examples/ts/bar-negative.ts
index a1c5aa2..57c3dde 100644
--- a/public/examples/ts/bar-negative.ts
+++ b/public/examples/ts/bar-negative.ts
@@ -6,74 +6,75 @@ difficulty: 4
 */
 
 option = {
-    tooltip: {
-        trigger: 'axis',
-        axisPointer: {            // 坐标轴指示器,坐标轴触发有效
-            type: 'shadow'        // 默认为直线,可选为:'line' | 'shadow'
-        }
+  tooltip: {
+    trigger: 'axis',
+    axisPointer: {
+      // 坐标轴指示器,坐标轴触发有效
+      type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
+    }
+  },
+  legend: {
+    data: ['利润', '支出', '收入']
+  },
+  grid: {
+    left: '3%',
+    right: '4%',
+    bottom: '3%',
+    containLabel: true
+  },
+  xAxis: [
+    {
+      type: 'value'
+    }
+  ],
+  yAxis: [
+    {
+      type: 'category',
+      axisTick: {
+        show: false
+      },
+      data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
+    }
+  ],
+  series: [
+    {
+      name: '利润',
+      type: 'bar',
+      label: {
+        show: true,
+        position: 'inside'
+      },
+      emphasis: {
+        focus: 'series'
+      },
+      data: [200, 170, 240, 244, 200, 220, 210]
     },
-    legend: {
-        data: ['利润', '支出', '收入']
+    {
+      name: '收入',
+      type: 'bar',
+      stack: 'Total',
+      label: {
+        show: true
+      },
+      emphasis: {
+        focus: 'series'
+      },
+      data: [320, 302, 341, 374, 390, 450, 420]
     },
-    grid: {
-        left: '3%',
-        right: '4%',
-        bottom: '3%',
-        containLabel: true
-    },
-    xAxis: [
-        {
-            type: 'value'
-        }
-    ],
-    yAxis: [
-        {
-            type: 'category',
-            axisTick: {
-                show: false
-            },
-            data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
-        }
-    ],
-    series: [
-        {
-            name: '利润',
-            type: 'bar',
-            label: {
-                show: true,
-                position: 'inside'
-            },
-            emphasis: {
-                focus: 'series'
-            },
-            data: [200, 170, 240, 244, 200, 220, 210]
-        },
-        {
-            name: '收入',
-            type: 'bar',
-            stack: 'Total',
-            label: {
-                show: true
-            },
-            emphasis: {
-                focus: 'series'
-            },
-            data: [320, 302, 341, 374, 390, 450, 420]
-        },
-        {
-            name: '支出',
-            type: 'bar',
-            stack: 'Total',
-            label: {
-                show: true,
-                position: 'left'
-            },
-            emphasis: {
-                focus: 'series'
-            },
-            data: [-120, -132, -101, -134, -190, -230, -210]
-        }
-    ]
+    {
+      name: '支出',
+      type: 'bar',
+      stack: 'Total',
+      label: {
+        show: true,
+        position: 'left'
+      },
+      emphasis: {
+        focus: 'series'
+      },
+      data: [-120, -132, -101, -134, -190, -230, -210]
+    }
+  ]
 };
 
-export {}
\ No newline at end of file
+export {};
diff --git a/public/examples/ts/bar-negative2.ts b/public/examples/ts/bar-negative2.ts
index 2d4884d..faf21e0 100644
--- a/public/examples/ts/bar-negative2.ts
+++ b/public/examples/ts/bar-negative2.ts
@@ -6,62 +6,74 @@ difficulty: 2
 */
 
 const labelRight = {
-    position: 'right'
+  position: 'right'
 } as const;
 
 option = {
-    title: {
-        text: 'Bar Chart with Negative Value'
-    },
-    tooltip: {
-        trigger: 'axis',
-        axisPointer: {
-            type: 'shadow'
-        }
-    },
-    grid: {
-        top: 80,
-        bottom: 30
-    },
-    xAxis: {
-        type: 'value',
-        position: 'top',
-        splitLine: {
-            lineStyle: {
-                type: 'dashed'
-            }
-        }
-    },
-    yAxis: {
-        type: 'category',
-        axisLine: {show: false},
-        axisLabel: {show: false},
-        axisTick: {show: false},
-        splitLine: {show: false},
-        data: ['ten', 'nine', 'eight', 'seven', 'six', 'five', 'four', 'three', 'two', 'one']
-    },
-    series: [
-        {
-            name: 'Cost',
-            type: 'bar',
-            stack: 'Total',
-            label: {
-                show: true,
-                formatter: '{b}'
-            },
-            data: [
-                {value: -0.07, label: labelRight},
-                {value: -0.09, label: labelRight},
-                0.2, 0.44,
-                {value: -0.23, label: labelRight},
-                0.08,
-                {value: -0.17, label: labelRight},
-                0.47,
-                {value: -0.36, label: labelRight},
-                0.18
-            ]
-        }
+  title: {
+    text: 'Bar Chart with Negative Value'
+  },
+  tooltip: {
+    trigger: 'axis',
+    axisPointer: {
+      type: 'shadow'
+    }
+  },
+  grid: {
+    top: 80,
+    bottom: 30
+  },
+  xAxis: {
+    type: 'value',
+    position: 'top',
+    splitLine: {
+      lineStyle: {
+        type: 'dashed'
+      }
+    }
+  },
+  yAxis: {
+    type: 'category',
+    axisLine: { show: false },
+    axisLabel: { show: false },
+    axisTick: { show: false },
+    splitLine: { show: false },
+    data: [
+      'ten',
+      'nine',
+      'eight',
+      'seven',
+      'six',
+      'five',
+      'four',
+      'three',
+      'two',
+      'one'
     ]
+  },
+  series: [
+    {
+      name: 'Cost',
+      type: 'bar',
+      stack: 'Total',
+      label: {
+        show: true,
+        formatter: '{b}'
+      },
+      data: [
+        { value: -0.07, label: labelRight },
+        { value: -0.09, label: labelRight },
+        0.2,
+        0.44,
+        { value: -0.23, label: labelRight },
+        0.08,
+        { value: -0.17, label: labelRight },
+        0.47,
+        { value: -0.36, label: labelRight },
+        0.18
+      ]
+    }
+  ]
 };
 
-export {}
\ No newline at end of file
+export {};
diff --git a/public/examples/ts/bar-polar-label-radial.ts b/public/examples/ts/bar-polar-label-radial.ts
index 9ab4b01..c42a96e 100644
--- a/public/examples/ts/bar-polar-label-radial.ts
+++ b/public/examples/ts/bar-polar-label-radial.ts
@@ -6,33 +6,35 @@ difficulty: 2
 */
 
 option = {
-    title: [{
-        text: 'Radial Polar Bar Label Position (middle)'
-    }],
-    polar: {
-        radius: [30, '80%']
-    },
-    radiusAxis: {
-        max: 4
-    },
-    angleAxis: {
-        type: 'category',
-        data: ['a', 'b', 'c', 'd'],
-        startAngle: 75
-    },
-    tooltip: {},
-    series: {
-        type: 'bar',
-        data: [2, 1.2, 2.4, 3.6],
-        coordinateSystem: 'polar',
-        label: {
-            show: true,
-            position: 'middle', // or 'start', 'insideStart', 'end', 'insideEnd'
-            formatter: '{b}: {c}',
-        }
-    },
-    backgroundColor: '#fff',
-    animation: false
+  title: [
+    {
+      text: 'Radial Polar Bar Label Position (middle)'
+    }
+  ],
+  polar: {
+    radius: [30, '80%']
+  },
+  radiusAxis: {
+    max: 4
+  },
+  angleAxis: {
+    type: 'category',
+    data: ['a', 'b', 'c', 'd'],
+    startAngle: 75
+  },
+  tooltip: {},
+  series: {
+    type: 'bar',
+    data: [2, 1.2, 2.4, 3.6],
+    coordinateSystem: 'polar',
+    label: {
+      show: true,
+      position: 'middle', // or 'start', 'insideStart', 'end', 'insideEnd'
+      formatter: '{b}: {c}'
+    }
+  },
+  backgroundColor: '#fff',
+  animation: false
 };
 
-export {}
\ No newline at end of file
+export {};
diff --git a/public/examples/ts/bar-polar-label-tangential.ts b/public/examples/ts/bar-polar-label-tangential.ts
index 9fcd728..aa69c37 100644
--- a/public/examples/ts/bar-polar-label-tangential.ts
+++ b/public/examples/ts/bar-polar-label-tangential.ts
@@ -5,33 +5,35 @@ category: bar
 difficulty: 2
 */
 option = {
-    title: [{
-        text: 'Tangential Polar Bar Label Position (middle)'
-    }],
-    polar: {
-        radius: [30, '80%']
-    },
-    angleAxis: {
-        max: 4,
-        startAngle: 75
-    },
-    radiusAxis: {
-        type: 'category',
-        data: ['a', 'b', 'c', 'd']
-    },
-    tooltip: {},
-    series: {
-        type: 'bar',
-        data: [2, 1.2, 2.4, 3.6],
-        coordinateSystem: 'polar',
-        label: {
-            show: true,
-            position: 'middle', // or 'start', 'insideStart', 'end', 'insideEnd'
-            formatter: '{b}: {c}',
-        }
-    },
-    backgroundColor: '#fff',
-    animation: false
+  title: [
+    {
+      text: 'Tangential Polar Bar Label Position (middle)'
+    }
+  ],
+  polar: {
+    radius: [30, '80%']
+  },
+  angleAxis: {
+    max: 4,
+    startAngle: 75
+  },
+  radiusAxis: {
+    type: 'category',
+    data: ['a', 'b', 'c', 'd']
+  },
+  tooltip: {},
+  series: {
+    type: 'bar',
+    data: [2, 1.2, 2.4, 3.6],
+    coordinateSystem: 'polar',
+    label: {
+      show: true,
+      position: 'middle', // or 'start', 'insideStart', 'end', 'insideEnd'
+      formatter: '{b}: {c}'
+    }
+  },
+  backgroundColor: '#fff',
+  animation: false
 };
 
-export {}
\ No newline at end of file
+export {};
diff --git a/public/examples/ts/bar-polar-real-estate.ts b/public/examples/ts/bar-polar-real-estate.ts
index 42d60b2..87ea60d 100644
--- a/public/examples/ts/bar-polar-real-estate.ts
+++ b/public/examples/ts/bar-polar-real-estate.ts
@@ -6,99 +6,111 @@ shotWidth: 800
 */
 
 const data = [
-    [5000, 10000, 6785.71],
-    [4000, 10000, 6825],
-    [3000, 6500, 4463.33],
-    [2500, 5600, 3793.83],
-    [2000, 4000, 3060],
-    [2000, 4000, 3222.33],
-    [2500, 4000, 3133.33],
-    [1800, 4000, 3100],
-    [2000, 3500, 2750],
-    [2000, 3000, 2500],
-    [1800, 3000, 2433.33],
-    [2000, 2700, 2375],
-    [1500, 2800, 2150],
-    [1500, 2300, 2100],
-    [1600, 3500, 2057.14],
-    [1500, 2600, 2037.5],
-    [1500, 2417.54, 1905.85],
-    [1500, 2000, 1775],
-    [1500, 1800, 1650]
+  [5000, 10000, 6785.71],
+  [4000, 10000, 6825],
+  [3000, 6500, 4463.33],
+  [2500, 5600, 3793.83],
+  [2000, 4000, 3060],
+  [2000, 4000, 3222.33],
+  [2500, 4000, 3133.33],
+  [1800, 4000, 3100],
+  [2000, 3500, 2750],
+  [2000, 3000, 2500],
+  [1800, 3000, 2433.33],
+  [2000, 2700, 2375],
+  [1500, 2800, 2150],
+  [1500, 2300, 2100],
+  [1600, 3500, 2057.14],
+  [1500, 2600, 2037.5],
+  [1500, 2417.54, 1905.85],
+  [1500, 2000, 1775],
+  [1500, 1800, 1650]
 ];
+// prettier-ignore
 const cities = ['北京', '上海', '深圳', '广州', '苏州', '杭州', '南京', '福州', '青岛', '济南', '长春', '大连', '温州', '郑州', '武汉', '成都', '东莞', '沈阳', '烟台'];
 const barHeight = 50;
 
 option = {
-    title: {
-        text: 'How expensive is it to rent an apartment in China?',
-        subtext: 'Data from https://www.numbeo.com'
+  title: {
+    text: 'How expensive is it to rent an apartment in China?',
+    subtext: 'Data from https://www.numbeo.com'
+  },
+  legend: {
+    show: true,
+    top: 'bottom',
+    data: ['Range', 'Average']
+  },
+  grid: {
+    top: 100
+  },
+  angleAxis: {
+    type: 'category',
+    data: cities
+  },
+  tooltip: {
+    show: true,
+    formatter: function (params: any) {
+      const id = params.dataIndex;
+      return (
+        cities[id] +
+        '<br>Lowest:' +
+        data[id][0] +
+        '<br>Highest:' +
+        data[id][1] +
+        '<br>Average:' +
+        data[id][2]
+      );
+    }
+  },
+  radiusAxis: {},
+  polar: {},
+  series: [
+    {
+      type: 'bar',
+      itemStyle: {
+        color: 'transparent'
+      },
+      data: data.map(function (d) {
+        return d[0];
+      }),
+      coordinateSystem: 'polar',
+      stack: 'Min Max',
+      silent: true
     },
-    legend: {
-        show: true,
-        top: 'bottom',
-        data: ['Range', 'Average']
+    {
+      type: 'bar',
+      data: data.map(function (d) {
+        return d[1] - d[0];
+      }),
+      coordinateSystem: 'polar',
+      name: 'Range',
+      stack: 'Min Max'
     },
-    grid: {
-        top: 100
+    {
+      type: 'bar',
+      itemStyle: {
+        color: 'transparent'
+      },
+      data: data.map(function (d) {
+        return d[2] - barHeight;
+      }),
+      coordinateSystem: 'polar',
+      stack: 'Average',
+      silent: true,
+      z: 10
     },
-    angleAxis: {
-        type: 'category',
-        data: cities
-    },
-    tooltip: {
-        show: true,
-        formatter: function (params: any) {
-            const id = params.dataIndex;
-            return cities[id] + '<br>Lowest:' + data[id][0] + '<br>Highest:' + data[id][1] + '<br>Average:' + data[id][2];
-        }
-    },
-    radiusAxis: {
-    },
-    polar: {
-    },
-    series: [{
-        type: 'bar',
-        itemStyle: {
-            color: 'transparent'
-        },
-        data: data.map(function (d) {
-            return d[0];
-        }),
-        coordinateSystem: 'polar',
-        stack: 'Min Max',
-        silent: true
-    }, {
-        type: 'bar',
-        data: data.map(function (d) {
-            return d[1] - d[0];
-        }),
-        coordinateSystem: 'polar',
-        name: 'Range',
-        stack: 'Min Max'
-    }, {
-        type: 'bar',
-        itemStyle: {
-            color: 'transparent'
-        },
-        data: data.map(function (d) {
-            return d[2] - barHeight;
-        }),
-        coordinateSystem: 'polar',
-        stack: 'Average',
-        silent: true,
-        z: 10
-    }, {
-        type: 'bar',
-        data: data.map(function (d) {
-            return barHeight * 2;
-        }),
-        coordinateSystem: 'polar',
-        name: 'Average',
-        stack: 'Average',
-        barGap: '-100%',
-        z: 10
-    }]
+    {
+      type: 'bar',
+      data: data.map(function (d) {
+        return barHeight * 2;
+      }),
+      coordinateSystem: 'polar',
+      name: 'Average',
+      stack: 'Average',
+      barGap: '-100%',
+      z: 10
+    }
+  ]
 };
 
-export {}
\ No newline at end of file
+export {};
diff --git a/public/examples/ts/bar-polar-stack-radial.ts b/public/examples/ts/bar-polar-stack-radial.ts
index 34a01e4..08519cf 100644
--- a/public/examples/ts/bar-polar-stack-radial.ts
+++ b/public/examples/ts/bar-polar-stack-radial.ts
@@ -6,46 +6,48 @@ difficulty: 7
 */
 
 option = {
-    angleAxis: {
-        type: 'category',
-        data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
+  angleAxis: {
+    type: 'category',
+    data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
+  },
+  radiusAxis: {},
+  polar: {},
+  series: [
+    {
+      type: 'bar',
+      data: [1, 2, 3, 4, 3, 5, 1],
+      coordinateSystem: 'polar',
+      name: 'A',
+      stack: 'a',
+      emphasis: {
+        focus: 'series'
+      }
     },
-    radiusAxis: {
+    {
+      type: 'bar',
+      data: [2, 4, 6, 1, 3, 2, 1],
+      coordinateSystem: 'polar',
+      name: 'B',
+      stack: 'a',
+      emphasis: {
+        focus: 'series'
+      }
     },
-    polar: {
-    },
-    series: [{
-        type: 'bar',
-        data: [1, 2, 3, 4, 3, 5, 1],
-        coordinateSystem: 'polar',
-        name: 'A',
-        stack: 'a',
-        emphasis: {
-            focus: 'series'
-        }
-    }, {
-        type: 'bar',
-        data: [2, 4, 6, 1, 3, 2, 1],
-        coordinateSystem: 'polar',
-        name: 'B',
-        stack: 'a',
-        emphasis: {
-            focus: 'series'
-        }
-    }, {
-        type: 'bar',
-        data: [1, 2, 3, 4, 1, 2, 5],
-        coordinateSystem: 'polar',
-        name: 'C',
-        stack: 'a',
-        emphasis: {
-            focus: 'series'
-        }
-    }],
-    legend: {
-        show: true,
-        data: ['A', 'B', 'C']
+    {
+      type: 'bar',
+      data: [1, 2, 3, 4, 1, 2, 5],
+      coordinateSystem: 'polar',
+      name: 'C',
+      stack: 'a',
+      emphasis: {
+        focus: 'series'
+      }
     }
+  ],
+  legend: {
+    show: true,
+    data: ['A', 'B', 'C']
+  }
 };
 
-export {}
\ No newline at end of file
+export {};
diff --git a/public/examples/ts/bar-polar-stack.ts b/public/examples/ts/bar-polar-stack.ts
index b81466b..14f4bc4 100644
--- a/public/examples/ts/bar-polar-stack.ts
+++ b/public/examples/ts/bar-polar-stack.ts
@@ -6,47 +6,49 @@ difficulty: 7
 */
 
 option = {
-    angleAxis: {
+  angleAxis: {},
+  radiusAxis: {
+    type: 'category',
+    data: ['Mon', 'Tue', 'Wed', 'Thu'],
+    z: 10
+  },
+  polar: {},
+  series: [
+    {
+      type: 'bar',
+      data: [1, 2, 3, 4],
+      coordinateSystem: 'polar',
+      name: 'A',
+      stack: 'a',
+      emphasis: {
+        focus: 'series'
+      }
     },
-    radiusAxis: {
-        type: 'category',
-        data: ['Mon', 'Tue', 'Wed', 'Thu'],
-        z: 10
+    {
+      type: 'bar',
+      data: [2, 4, 6, 8],
+      coordinateSystem: 'polar',
+      name: 'B',
+      stack: 'a',
+      emphasis: {
+        focus: 'series'
+      }
     },
-    polar: {
-    },
-    series: [{
-        type: 'bar',
-        data: [1, 2, 3, 4],
-        coordinateSystem: 'polar',
-        name: 'A',
-        stack: 'a',
-        emphasis: {
-            focus: 'series'
-        }
-    }, {
-        type: 'bar',
-        data: [2, 4, 6, 8],
-        coordinateSystem: 'polar',
-        name: 'B',
-        stack: 'a',
-        emphasis: {
-            focus: 'series'
-        }
-    }, {
-        type: 'bar',
-        data: [1, 2, 3, 4],
-        coordinateSystem: 'polar',
-        name: 'C',
-        stack: 'a',
-        emphasis: {
-            focus: 'series'
-        }
-    }],
-    legend: {
-        show: true,
-        data: ['A', 'B', 'C']
+    {
+      type: 'bar',
+      data: [1, 2, 3, 4],
+      coordinateSystem: 'polar',
+      name: 'C',
+      stack: 'a',
+      emphasis: {
+        focus: 'series'
+      }
     }
+  ],
+  legend: {
+    show: true,
+    data: ['A', 'B', 'C']
+  }
 };
 
-export {}
\ No newline at end of file
+export {};
diff --git a/public/examples/ts/bar-race-country.ts b/public/examples/ts/bar-race-country.ts
index ee402de..15d623d 100644
--- a/public/examples/ts/bar-race-country.ts
+++ b/public/examples/ts/bar-race-country.ts
@@ -7,136 +7,161 @@ videoStart: 1000
 videoEnd: 6000
 */
 
-
 const updateFrequency = 2000;
 const dimension = 0;
 
-const countryColors: Record<string, string> = {"Australia":"#00008b","Canada":"#f00","China":"#ffde00","Cuba":"#002a8f","Finland":"#003580","France":"#ed2939","Germany":"#000","Iceland":"#003897","India":"#f93","Japan":"#bc002d","North Korea":"#024fa2","South Korea":"#000","New Zealand":"#00247d","Norway":"#ef2b2d","Poland":"#dc143c","Russia":"#d52b1e","Turkey":"#e30a17","United Kingdom":"#00247d","United States":"#b22234"};
+const countryColors: Record<string, string> = {
+  Australia: '#00008b',
+  Canada: '#f00',
+  China: '#ffde00',
+  Cuba: '#002a8f',
+  Finland: '#003580',
+  France: '#ed2939',
+  Germany: '#000',
+  Iceland: '#003897',
+  India: '#f93',
+  Japan: '#bc002d',
+  'North Korea': '#024fa2',
+  'South Korea': '#000',
+  'New Zealand': '#00247d',
+  Norway: '#ef2b2d',
+  Poland: '#dc143c',
+  Russia: '#d52b1e',
+  Turkey: '#e30a17',
+  'United Kingdom': '#00247d',
+  'United States': '#b22234'
+};
 
 $.when(
-    $.getJSON('https://cdn.jsdelivr.net/npm/emoji-flags@1.3.0/data.json'),
-    $.getJSON(ROOT_PATH + '/data/asset/data/life-expectancy-table.json')
+  $.getJSON('https://cdn.jsdelivr.net/npm/emoji-flags@1.3.0/data.json'),
+  $.getJSON(ROOT_PATH + '/data/asset/data/life-expectancy-table.json')
 ).done(function (res0, res1) {
-    const flags = res0[0];
-    const data = res1[0];
-    const years: string[] = [];
-    for (var i = 0; i < data.length; ++i) {
-        if (years.length === 0 || years[years.length - 1] !== data[i][4]) {
-            years.push(data[i][4]);
-        }
+  const flags = res0[0];
+  const data = res1[0];
+  const years: string[] = [];
+  for (let i = 0; i < data.length; ++i) {
+    if (years.length === 0 || years[years.length - 1] !== data[i][4]) {
+      years.push(data[i][4]);
     }
+  }
 
-    function getFlag(countryName: string) {
-        if (!countryName) {
-            return '';
-        }
-        return (flags.find(function (item) {
-            return item.name === countryName;
-        }) || {}).emoji;
+  function getFlag(countryName: string) {
+    if (!countryName) {
+      return '';
     }
-    var startIndex = 10;
-    var startYear = years[startIndex];
+    return (
+      flags.find(function (item) {
+        return item.name === countryName;
+      }) || {}
+    ).emoji;
+  }
+  let startIndex = 10;
+  let startYear = years[startIndex];
 
-    option = {
-        grid: {
-            top: 10,
-            bottom: 30,
-            left: 150,
-            right: 80
-        },
-        xAxis: {
-            max: 'dataMax',
-            axisLabel: {
-                formatter: function (n: number) {
-                    return Math.round(n) + '';
-                }
-            }
+  option = {
+    grid: {
+      top: 10,
+      bottom: 30,
+      left: 150,
+      right: 80
+    },
+    xAxis: {
+      max: 'dataMax',
+      axisLabel: {
+        formatter: function (n: number) {
+          return Math.round(n) + '';
+        }
+      }
+    },
+    dataset: {
+      source: data.slice(1).filter(function (d) {
+        return d[4] === startYear;
+      })
+    },
+    yAxis: {
+      type: 'category',
+      inverse: true,
+      max: 10,
+      axisLabel: {
+        show: true,
+        fontSize: 14,
+        formatter: function (value: string) {
+          return value + '{flag|' + getFlag(value) + '}';
         },
-        dataset: {
-            source: data.slice(1).filter(function (d) {
-                return d[4] === startYear;
-            })
+        rich: {
+          flag: {
+            fontSize: 25,
+            padding: 5
+          }
+        }
+      },
+      animationDuration: 300,
+      animationDurationUpdate: 300
+    },
+    series: [
+      {
+        realtimeSort: true,
+        seriesLayoutBy: 'column',
+        type: 'bar',
+        itemStyle: {
+          color: function (param: any) {
+            return countryColors[param.value[3]] || '#5470c6';
+          }
         },
-        yAxis: {
-            type: 'category',
-            inverse: true,
-            max: 10,
-            axisLabel: {
-                show: true,
-                fontSize: 14,
-                formatter: function (value: string) {
-                    return value + '{flag|' + getFlag(value) + '}';
-                },
-                rich: {
-                    flag: {
-                        fontSize: 25,
-                        padding: 5
-                    }
-                }
-            },
-            animationDuration: 300,
-            animationDurationUpdate: 300
+        encode: {
+          x: dimension,
+          y: 3
         },
-        series: [{
-            realtimeSort: true,
-            seriesLayoutBy: 'column',
-            type: 'bar',
-            itemStyle: {
-                color: function (param: any) {
-                    return countryColors[param.value[3]] || '#5470c6';
-                }
-            },
-            encode: {
-                x: dimension,
-                y: 3
-            },
-            label: {
-                show: true,
-                precision: 1,
-                position: 'right',
-                valueAnimation: true,
-                fontFamily: 'monospace'
-            }
-        }],
-        // Disable init animation.
-        animationDuration: 0,
-        animationDurationUpdate: updateFrequency,
-        animationEasing: 'linear',
-        animationEasingUpdate: 'linear',
-        graphic: {
-            elements: [{
-                type: 'text',
-                right: 160,
-                bottom: 60,
-                style: {
-                    text: startYear,
-                    font: 'bolder 80px monospace',
-                    fill: 'rgba(100, 100, 100, 0.25)'
-                },
-                z: 100
-            }]
+        label: {
+          show: true,
+          precision: 1,
+          position: 'right',
+          valueAnimation: true,
+          fontFamily: 'monospace'
         }
-    };
+      }
+    ],
+    // Disable init animation.
+    animationDuration: 0,
+    animationDurationUpdate: updateFrequency,
+    animationEasing: 'linear',
+    animationEasingUpdate: 'linear',
+    graphic: {
+      elements: [
+        {
+          type: 'text',
+          right: 160,
+          bottom: 60,
+          style: {
+            text: startYear,
+            font: 'bolder 80px monospace',
+            fill: 'rgba(100, 100, 100, 0.25)'
+          },
+          z: 100
+        }
+      ]
+    }
+  };
 
-    // console.log(option);
-    myChart.setOption<echarts.EChartsOption>(option);
+  // console.log(option);
+  myChart.setOption<echarts.EChartsOption>(option);
 
-    for (var i = startIndex; i < years.length - 1; ++i) {
-        (function (i) {
-            setTimeout(function () {
-                updateYear(years[i + 1]);
-            }, (i - startIndex) * updateFrequency);
-        })(i);
-    }
+  for (let i = startIndex; i < years.length - 1; ++i) {
+    (function (i) {
+      setTimeout(function () {
+        updateYear(years[i + 1]);
+      }, (i - startIndex) * updateFrequency);
+    })(i);
+  }
 
-    function updateYear(year: string) {
-        var source = data.slice(1).filter(function (d) {
-            return d[4] === year;
-        });
-        option.series[0].data = source;
-        option.graphic.elements[0].style.text = year;
-        myChart.setOption<echarts.EChartsOption>(option);
-    }
-})
+  function updateYear(year: string) {
+    let source = data.slice(1).filter(function (d) {
+      return d[4] === year;
+    });
+    option.series[0].data = source;
+    option.graphic.elements[0].style.text = year;
+    myChart.setOption<echarts.EChartsOption>(option);
+  }
+});
 
-export {}
\ No newline at end of file
+export {};
diff --git a/public/examples/ts/bar-race.ts b/public/examples/ts/bar-race.ts
index bc4de3d..a9ff049 100644
--- a/public/examples/ts/bar-race.ts
+++ b/public/examples/ts/bar-race.ts
@@ -9,63 +9,66 @@ videoEnd: 6000
 
 const data: number[] = [];
 for (let i = 0; i < 5; ++i) {
-    data.push(Math.round(Math.random() * 200));
+  data.push(Math.round(Math.random() * 200));
 }
 
 option = {
-    xAxis: {
-        max: 'dataMax',
-    },
-    yAxis: {
-        type: 'category',
-        data: ['A', 'B', 'C', 'D', 'E'],
-        inverse: true,
-        animationDuration: 300,
-        animationDurationUpdate: 300,
-        max: 2 // only the largest 3 bars will be displayed
-    },
-    series: [{
-        realtimeSort: true,
-        name: 'X',
-        type: 'bar',
-        data: data,
-        label: {
-            show: true,
-            position: 'right',
-            valueAnimation: true
-        }
-    }],
-    legend: {
-        show: true
-    },
-    animationDuration: 0,
-    animationDurationUpdate: 3000,
-    animationEasing: 'linear',
-    animationEasingUpdate: 'linear'
+  xAxis: {
+    max: 'dataMax'
+  },
+  yAxis: {
+    type: 'category',
+    data: ['A', 'B', 'C', 'D', 'E'],
+    inverse: true,
+    animationDuration: 300,
+    animationDurationUpdate: 300,
+    max: 2 // only the largest 3 bars will be displayed
+  },
+  series: [
+    {
+      realtimeSort: true,
+      name: 'X',
+      type: 'bar',
+      data: data,
+      label: {
+        show: true,
+        position: 'right',
+        valueAnimation: true
+      }
+    }
+  ],
+  legend: {
+    show: true
+  },
+  animationDuration: 0,
+  animationDurationUpdate: 3000,
+  animationEasing: 'linear',
+  animationEasingUpdate: 'linear'
 };
 
-function run () {
-    for (var i = 0; i < data.length; ++i) {
-        if (Math.random() > 0.9) {
-            data[i] += Math.round(Math.random() * 2000);
-        }
-        else {
-            data[i] += Math.round(Math.random() * 200);
-        }
+function run() {
+  for (var i = 0; i < data.length; ++i) {
+    if (Math.random() > 0.9) {
+      data[i] += Math.round(Math.random() * 2000);
+    } else {
+      data[i] += Math.round(Math.random() * 200);
     }
-    myChart.setOption<echarts.EChartsOption>({
-        series: [{
-            type: 'bar',
-            data
-        }]
-    });
+  }
+  myChart.setOption<echarts.EChartsOption>({
+    series: [
+      {
+        type: 'bar',
+        data
+      }
+    ]
+  });
 }
 
-setTimeout(function() {
-    run();
+setTimeout(function () {
+  run();
 }, 0);
 setInterval(function () {
-    run();
+  run();
 }, 3000);
 
-export {}
\ No newline at end of file
+export {};
diff --git a/public/examples/ts/bar-rich-text.ts b/public/examples/ts/bar-rich-text.ts
index a4545d3..76fc0e7 100644
--- a/public/examples/ts/bar-rich-text.ts
+++ b/public/examples/ts/bar-rich-text.ts
@@ -5,149 +5,148 @@ titleCN: 天气统计(富文本)
 difficulty: 6
 */
 
-
 const weatherIcons = {
-    'Sunny': ROOT_PATH + '/data/asset/img/weather/sunny_128.png',
-    'Cloudy': ROOT_PATH + '/data/asset/img/weather/cloudy_128.png',
-    'Showers': ROOT_PATH + '/data/asset/img/weather/showers_128.png'
+  Sunny: ROOT_PATH + '/data/asset/img/weather/sunny_128.png',
+  Cloudy: ROOT_PATH + '/data/asset/img/weather/cloudy_128.png',
+  Showers: ROOT_PATH + '/data/asset/img/weather/showers_128.png'
 } as const;
 
 const seriesLabel = {
-    show: true
+  show: true
 } as const;
 
 option = {
-    title: {
-        text: 'Weather Statistics'
-    },
-    tooltip: {
-        trigger: 'axis',
-        axisPointer: {
-            type: 'shadow'
-        }
-    },
-    legend: {
-        data: ['City Alpha', 'City Beta', 'City Gamma']
-    },
-    grid: {
-        left: 100
-    },
-    toolbox: {
-        show: true,
-        feature: {
-            saveAsImage: {}
-        }
-    },
-    xAxis: {
-        type: 'value',
-        name: 'Days',
-        axisLabel: {
-            formatter: '{value}'
+  title: {
+    text: 'Weather Statistics'
+  },
+  tooltip: {
+    trigger: 'axis',
+    axisPointer: {
+      type: 'shadow'
+    }
+  },
+  legend: {
+    data: ['City Alpha', 'City Beta', 'City Gamma']
+  },
+  grid: {
+    left: 100
+  },
+  toolbox: {
+    show: true,
+    feature: {
+      saveAsImage: {}
+    }
+  },
+  xAxis: {
+    type: 'value',
+    name: 'Days',
+    axisLabel: {
+      formatter: '{value}'
+    }
+  },
+  yAxis: {
+    type: 'category',
+    inverse: true,
+    data: ['Sunny', 'Cloudy', 'Showers'],
+    axisLabel: {
+      formatter: function (value) {
+        return '{' + value + '| }\n{value|' + value + '}';
+      },
+      margin: 20,
+      rich: {
+        value: {
+          lineHeight: 30,
+          align: 'center'
+        },
+        Sunny: {
+          height: 40,
+          align: 'center',
+          backgroundColor: {
+            image: weatherIcons.Sunny
+          }
+        },
+        Cloudy: {
+          height: 40,
+          align: 'center',
+          backgroundColor: {
+            image: weatherIcons.Cloudy
+          }
+        },
+        Showers: {
+          height: 40,
+          align: 'center',
+          backgroundColor: {
+            image: weatherIcons.Showers
+          }
         }
-    },
-    yAxis: {
-        type: 'category',
-        inverse: true,
-        data: ['Sunny', 'Cloudy', 'Showers'],
-        axisLabel: {
-            formatter: function (value) {
-                return '{' + value + '| }\n{value|' + value + '}';
+      }
+    }
+  },
+  series: [
+    {
+      name: 'City Alpha',
+      type: 'bar',
+      data: [165, 170, 30],
+      label: seriesLabel,
+      markPoint: {
+        symbolSize: 1,
+        symbolOffset: [0, '50%'],
+        label: {
+          formatter: '{a|{a}\n}{b|{b} }{c|{c}}',
+          backgroundColor: 'rgb(242,242,242)',
+          borderColor: '#aaa',
+          borderWidth: 1,
+          borderRadius: 4,
+          padding: [4, 10],
+          lineHeight: 26,
+          // shadowBlur: 5,
+          // shadowColor: '#000',
+          // shadowOffsetX: 0,
+          // shadowOffsetY: 1,
+          position: 'right',
+          distance: 20,
+          rich: {
+            a: {
+              align: 'center',
+              color: '#fff',
+              fontSize: 18,
+              textShadowBlur: 2,
+              textShadowColor: '#000',
+              textShadowOffsetX: 0,
+              textShadowOffsetY: 1,
+              textBorderColor: '#333',
+              textBorderWidth: 2
             },
-            margin: 20,
-            rich: {
-                value: {
-                    lineHeight: 30,
-                    align: 'center'
-                },
-                Sunny: {
-                    height: 40,
-                    align: 'center',
-                    backgroundColor: {
-                        image: weatherIcons.Sunny
-                    }
-                },
-                Cloudy: {
-                    height: 40,
-                    align: 'center',
-                    backgroundColor: {
-                        image: weatherIcons.Cloudy
-                    }
-                },
-                Showers: {
-                    height: 40,
-                    align: 'center',
-                    backgroundColor: {
-                        image: weatherIcons.Showers
-                    }
-                }
-            }
-        }
-    },
-    series: [
-        {
-            name: 'City Alpha',
-            type: 'bar',
-            data: [165, 170, 30],
-            label: seriesLabel,
-            markPoint: {
-                symbolSize: 1,
-                symbolOffset: [0, '50%'],
-                label: {
-                    formatter: '{a|{a}\n}{b|{b} }{c|{c}}',
-                    backgroundColor: 'rgb(242,242,242)',
-                    borderColor: '#aaa',
-                    borderWidth: 1,
-                    borderRadius: 4,
-                    padding: [4, 10],
-                    lineHeight: 26,
-                    // shadowBlur: 5,
-                    // shadowColor: '#000',
-                    // shadowOffsetX: 0,
-                    // shadowOffsetY: 1,
-                    position: 'right',
-                    distance: 20,
-                    rich: {
-                        a: {
-                            align: 'center',
-                            color: '#fff',
-                            fontSize: 18,
-                            textShadowBlur: 2,
-                            textShadowColor: '#000',
-                            textShadowOffsetX: 0,
-                            textShadowOffsetY: 1,
-                            textBorderColor: '#333',
-                            textBorderWidth: 2
-                        },
-                        b: {
-                            color: '#333'
-                        },
-                        c: {
-                            color: '#ff8811',
-                            textBorderColor: '#000',
-                            textBorderWidth: 1,
-                            fontSize: 22
-                        }
-                    }
-                },
-                data: [
-                    {type: 'max', name: 'max days: '},
-                    {type: 'min', name: 'min days: '}
-                ]
+            b: {
+              color: '#333'
+            },
+            c: {
+              color: '#ff8811',
+              textBorderColor: '#000',
+              textBorderWidth: 1,
+              fontSize: 22
             }
+          }
         },
-        {
-            name: 'City Beta',
-            type: 'bar',
-            label: seriesLabel,
-            data: [150, 105, 110]
-        },
-        {
-            name: 'City Gamma',
-            type: 'bar',
-            label: seriesLabel,
-            data: [220, 82, 63]
-        }
-    ]
+        data: [
+          { type: 'max', name: 'max days: ' },
+          { type: 'min', name: 'min days: ' }
+        ]
+      }
+    },
+    {
+      name: 'City Beta',
+      type: 'bar',
+      label: seriesLabel,
+      data: [150, 105, 110]
+    },
+    {
+      name: 'City Gamma',
+      type: 'bar',
+      label: seriesLabel,
+      data: [220, 82, 63]
+    }
+  ]
 };
 
-export {}
\ No newline at end of file
+export {};
diff --git a/public/examples/ts/bar-simple.ts b/public/examples/ts/bar-simple.ts
index f1221bb..85dd6a5 100644
--- a/public/examples/ts/bar-simple.ts
+++ b/public/examples/ts/bar-simple.ts
@@ -6,17 +6,19 @@ difficulty: 0
 */
 
 option = {
-    xAxis: {
-        type: 'category',
-        data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
-    },
-    yAxis: {
-        type: 'value'
-    },
-    series: [{
-        data: [120, 200, 150, 80, 70, 110, 130],
-        type: 'bar'
-    }]
+  xAxis: {
+    type: 'category',
+    data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
+  },
+  yAxis: {
+    type: 'value'
+  },
+  series: [
+    {
+      data: [120, 200, 150, 80, 70, 110, 130],
+      type: 'bar'
+    }
+  ]
 };
 
-export {}
\ No newline at end of file
+export {};
diff --git a/public/examples/ts/bar-stack.ts b/public/examples/ts/bar-stack.ts
index eeb8721..f93d9ca 100644
--- a/public/examples/ts/bar-stack.ts
+++ b/public/examples/ts/bar-stack.ts
@@ -6,122 +6,118 @@ difficulty: 3
 */
 
 option = {
-    tooltip: {
-        trigger: 'axis',
-        axisPointer: {
-            type: 'shadow'
-        }
+  tooltip: {
+    trigger: 'axis',
+    axisPointer: {
+      type: 'shadow'
+    }
+  },
+  legend: {},
+  grid: {
+    left: '3%',
+    right: '4%',
+    bottom: '3%',
+    containLabel: true
+  },
+  xAxis: [
+    {
+      type: 'category',
+      data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
+    }
+  ],
+  yAxis: [
+    {
+      type: 'value'
+    }
+  ],
+  series: [
+    {
+      name: 'Direct',
+      type: 'bar',
+      emphasis: {
+        focus: 'series'
+      },
+      data: [320, 332, 301, 334, 390, 330, 320]
     },
-    legend: {
-        data: ['Direct', 'Email', 'Union Ads', 'Video Ads', 'Search Engine', '百度', '谷歌', '必应', '其他']
+    {
+      name: 'Email',
+      type: 'bar',
+      stack: 'Ad',
+      emphasis: {
+        focus: 'series'
+      },
+      data: [120, 132, 101, 134, 90, 230, 210]
     },
-    grid: {
-        left: '3%',
-        right: '4%',
-        bottom: '3%',
-        containLabel: true
+    {
+      name: 'Union Ads',
+      type: 'bar',
+      stack: 'Ad',
+      emphasis: {
+        focus: 'series'
+      },
+      data: [220, 182, 191, 234, 290, 330, 310]
     },
-    xAxis: [
-        {
-            type: 'category',
-            data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
-        }
-    ],
-    yAxis: [
-        {
-            type: 'value'
-        }
-    ],
-    series: [
-        {
-            name: 'Direct',
-            type: 'bar',
-            emphasis: {
-                focus: 'series'
-            },
-            data: [320, 332, 301, 334, 390, 330, 320]
-        },
-        {
-            name: 'Email',
-            type: 'bar',
-            stack: 'Ad',
-            emphasis: {
-                focus: 'series'
-            },
-            data: [120, 132, 101, 134, 90, 230, 210]
-        },
-        {
-            name: 'Union Ads',
-            type: 'bar',
-            stack: 'Ad',
-            emphasis: {
-                focus: 'series'
-            },
-            data: [220, 182, 191, 234, 290, 330, 310]
-        },
-        {
-            name: 'Video Ads',
-            type: 'bar',
-            stack: 'Ad',
-            emphasis: {
-                focus: 'series'
-            },
-            data: [150, 232, 201, 154, 190, 330, 410]
-        },
-        {
-            name: 'Search Engine',
-            type: 'bar',
-            data: [862, 1018, 964, 1026, 1679, 1600, 1570],
-            emphasis: {
-                focus: 'series'
-            },
-            markLine: {
-                lineStyle: {
-                    type: 'dashed'
-                },
-                data: [
-                    [{type: 'min'}, {type: 'max'}]
-                ]
-            }
-        },
-        {
-            name: 'Baidu',
-            type: 'bar',
-            barWidth: 5,
-            stack: 'Search Engine',
-            emphasis: {
-                focus: 'series'
-            },
-            data: [620, 732, 701, 734, 1090, 1130, 1120]
-        },
-        {
-            name: 'Google',
-            type: 'bar',
-            stack: 'Search Engine',
-            emphasis: {
-                focus: 'series'
-            },
-            data: [120, 132, 101, 134, 290, 230, 220]
-        },
-        {
-            name: 'Bing',
-            type: 'bar',
-            stack: 'Search Engine',
-            emphasis: {
-                focus: 'series'
-            },
-            data: [60, 72, 71, 74, 190, 130, 110]
+    {
+      name: 'Video Ads',
+      type: 'bar',
+      stack: 'Ad',
+      emphasis: {
+        focus: 'series'
+      },
+      data: [150, 232, 201, 154, 190, 330, 410]
+    },
+    {
+      name: 'Search Engine',
+      type: 'bar',
+      data: [862, 1018, 964, 1026, 1679, 1600, 1570],
+      emphasis: {
+        focus: 'series'
+      },
+      markLine: {
+        lineStyle: {
+          type: 'dashed'
         },
-        {
-            name: 'Others',
-            type: 'bar',
-            stack: 'Search Engine',
-            emphasis: {
-                focus: 'series'
-            },
-            data: [62, 82, 91, 84, 109, 110, 120]
-        }
-    ]
+        data: [[{ type: 'min' }, { type: 'max' }]]
+      }
+    },
+    {
+      name: 'Baidu',
+      type: 'bar',
+      barWidth: 5,
+      stack: 'Search Engine',
+      emphasis: {
+        focus: 'series'
+      },
+      data: [620, 732, 701, 734, 1090, 1130, 1120]
+    },
+    {
+      name: 'Google',
+      type: 'bar',
+      stack: 'Search Engine',
+      emphasis: {
+        focus: 'series'
+      },
+      data: [120, 132, 101, 134, 290, 230, 220]
+    },
+    {
+      name: 'Bing',
+      type: 'bar',
+      stack: 'Search Engine',
+      emphasis: {
+        focus: 'series'
+      },
+      data: [60, 72, 71, 74, 190, 130, 110]
+    },
+    {
+      name: 'Others',
+      type: 'bar',
+      stack: 'Search Engine',
+      emphasis: {
+        focus: 'series'
+      },
+      data: [62, 82, 91, 84, 109, 110, 120]
+    }
+  ]
 };
 
-export {}
\ No newline at end of file
+export {};
diff --git a/public/examples/ts/bar-tick-align.ts b/public/examples/ts/bar-tick-align.ts
index 2c96c16..43ca58c 100644
--- a/public/examples/ts/bar-tick-align.ts
+++ b/public/examples/ts/bar-tick-align.ts
@@ -6,38 +6,38 @@ difficulty: 0
 */
 
 option = {
-    tooltip: {
-        trigger: 'axis',
-        axisPointer: {
-            type: 'shadow'
-        }
-    },
-    grid: {
-        left: '3%',
-        right: '4%',
-        bottom: '3%',
-        containLabel: true
-    },
-    xAxis: [
-        {
-            type: 'category',
-            data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
-            axisTick: {
-                alignWithLabel: true
-            }
-        }
-    ],
-    yAxis: [
-        {
-            type: 'value'
-        }
-    ],
-    series: [
-        {
-            name: 'Direct',
-            type: 'bar',
-            barWidth: '60%',
-            data: [10, 52, 200, 334, 390, 330, 220]
-        }
-    ]
+  tooltip: {
+    trigger: 'axis',
+    axisPointer: {
+      type: 'shadow'
+    }
+  },
+  grid: {
+    left: '3%',
+    right: '4%',
+    bottom: '3%',
+    containLabel: true
+  },
+  xAxis: [
+    {
+      type: 'category',
+      data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
+      axisTick: {
+        alignWithLabel: true
+      }
+    }
+  ],
+  yAxis: [
+    {
+      type: 'value'
+    }
+  ],
+  series: [
+    {
+      name: 'Direct',
+      type: 'bar',
+      barWidth: '60%',
+      data: [10, 52, 200, 334, 390, 330, 220]
+    }
+  ]
 };
diff --git a/public/examples/ts/bar-waterfall.ts b/public/examples/ts/bar-waterfall.ts
index ba0daef..e45c676 100644
--- a/public/examples/ts/bar-waterfall.ts
+++ b/public/examples/ts/bar-waterfall.ts
@@ -6,62 +6,62 @@ difficulty: 1
 */
 
 option = {
-    title: {
-        text: 'Waterfall Chart',
-        subtext: 'Living Expenses in Shenzhen'
+  title: {
+    text: 'Waterfall Chart',
+    subtext: 'Living Expenses in Shenzhen'
+  },
+  tooltip: {
+    trigger: 'axis',
+    axisPointer: {
+      type: 'shadow'
     },
-    tooltip: {
-        trigger: 'axis',
-        axisPointer: {
-            type: 'shadow'
-        },
-        formatter: function (params) {
-            var tar = params[1];
-            return tar.name + '<br/>' + tar.seriesName + ' : ' + tar.value;
+    formatter: function (params: any) {
+      var tar = params[1];
+      return tar.name + '<br/>' + tar.seriesName + ' : ' + tar.value;
+    }
+  },
+  grid: {
+    left: '3%',
+    right: '4%',
+    bottom: '3%',
+    containLabel: true
+  },
+  xAxis: {
+    type: 'category',
+    splitLine: { show: false },
+    data: ['Total', 'Rent', 'Utilities', 'Transportation', 'Meals', 'Other']
+  },
+  yAxis: {
+    type: 'value'
+  },
+  series: [
+    {
+      name: 'Placeholder',
+      type: 'bar',
+      stack: 'Total',
+      itemStyle: {
+        borderColor: 'transparent',
+        color: 'transparent'
+      },
+      emphasis: {
+        itemStyle: {
+          borderColor: 'transparent',
+          color: 'transparent'
         }
+      },
+      data: [0, 1700, 1400, 1200, 300, 0]
     },
-    grid: {
-        left: '3%',
-        right: '4%',
-        bottom: '3%',
-        containLabel: true
-    },
-    xAxis: {
-        type: 'category',
-        splitLine: {show: false},
-        data: ['Total', 'Rent', 'Utilities', 'Transportation', 'Meals', 'Other']
-    },
-    yAxis: {
-        type: 'value'
-    },
-    series: [
-        {
-            name: 'Placeholder',
-            type: 'bar',
-            stack: 'Total',
-            itemStyle: {
-                borderColor: 'transparent',
-                color: 'transparent'
-            },
-            emphasis: {
-                itemStyle: {
-                    borderColor: 'transparent',
-                    color: 'transparent'
-                }
-            },
-            data: [0, 1700, 1400, 1200, 300, 0]
-        },
-        {
-            name: 'Life Cost',
-            type: 'bar',
-            stack: 'Total',
-            label: {
-                show: true,
-                position: 'inside'
-            },
-            data: [2900, 1200, 300, 200, 900, 300]
-        }
-    ]
+    {
+      name: 'Life Cost',
+      type: 'bar',
+      stack: 'Total',
+      label: {
+        show: true,
+        position: 'inside'
+      },
+      data: [2900, 1200, 300, 200, 900, 300]
+    }
+  ]
 };
 
-export {}
\ No newline at end of file
+export {};
diff --git a/public/examples/ts/bar-waterfall2.ts b/public/examples/ts/bar-waterfall2.ts
index ea1465e..ff61a99 100644
--- a/public/examples/ts/bar-waterfall2.ts
+++ b/public/examples/ts/bar-waterfall2.ts
@@ -6,86 +6,85 @@ difficulty: 3
 */
 
 option = {
-    title: {
-        text: 'Accumulated Waterfall Chart'
+  title: {
+    text: 'Accumulated Waterfall Chart'
+  },
+  tooltip: {
+    trigger: 'axis',
+    axisPointer: {
+      type: 'shadow'
     },
-    tooltip: {
-        trigger: 'axis',
-        axisPointer: {
-            type: 'shadow'
-        },
-        formatter: function (params) {
-            let tar;
-            if (params[1].value !== '-') {
-                tar = params[1];
-            }
-            else {
-                tar = params[0];
-            }
-            return tar.name + '<br/>' + tar.seriesName + ' : ' + tar.value;
+    formatter: function (params: any) {
+      let tar;
+      if (params[1].value !== '-') {
+        tar = params[1];
+      } else {
+        tar = params[0];
+      }
+      return tar.name + '<br/>' + tar.seriesName + ' : ' + tar.value;
+    }
+  },
+  legend: {
+    data: ['支出', '收入']
+  },
+  grid: {
+    left: '3%',
+    right: '4%',
+    bottom: '3%',
+    containLabel: true
+  },
+  xAxis: {
+    type: 'category',
+    splitLine: { show: false },
+    data: (function () {
+      var list = [];
+      for (var i = 1; i <= 11; i++) {
+        list.push('11月' + i + '日');
+      }
+      return list;
+    })()
+  },
+  yAxis: {
+    type: 'value'
+  },
+  series: [
+    {
+      name: '辅助',
+      type: 'bar',
+      stack: 'Total',
+      itemStyle: {
+        borderColor: 'transparent',
+        color: 'transparent'
+      },
+      emphasis: {
+        itemStyle: {
+          borderColor: 'transparent',
+          color: 'transparent'
         }
+      },
+      data: [0, 900, 1245, 1530, 1376, 1376, 1511, 1689, 1856, 1495, 1292]
     },
-    legend: {
-        data: ['支出', '收入']
+    {
+      name: '收入',
+      type: 'bar',
+      stack: 'Total',
+      label: {
+        show: true,
+        position: 'top'
+      },
+      data: [900, 345, 393, '-', '-', 135, 178, 286, '-', '-', '-']
     },
-    grid: {
-        left: '3%',
-        right: '4%',
-        bottom: '3%',
-        containLabel: true
-    },
-    xAxis: {
-        type: 'category',
-        splitLine: {show: false},
-        data: function () {
-            var list = [];
-            for (var i = 1; i <= 11; i++) {
-                list.push('11月' + i + '日');
-            }
-            return list;
-        }()
-    },
-    yAxis: {
-        type: 'value'
-    },
-    series: [
-        {
-            name: '辅助',
-            type: 'bar',
-            stack: 'Total',
-            itemStyle: {
-                borderColor: 'transparent',
-                color: 'transparent'
-            },
-            emphasis: {
-                itemStyle: {
-                    borderColor: 'transparent',
-                    color: 'transparent'
-                }
-            },
-            data: [0, 900, 1245, 1530, 1376, 1376, 1511, 1689, 1856, 1495, 1292]
-        },
-        {
-            name: '收入',
-            type: 'bar',
-            stack: 'Total',
-            label: {
-                show: true,
-                position: 'top'
-            },
-            data: [900, 345, 393, '-', '-', 135, 178, 286, '-', '-', '-']
-        },
-        {
-            name: '支出',
-            type: 'bar',
-            stack: 'Total',
-            label: {
-                show: true,
-                position: 'bottom'
-            },
-            data: ['-', '-', '-', 108, 154, '-', '-', '-', 119, 361, 203]
-        }
-    ]
+    {
+      name: '支出',
+      type: 'bar',
+      stack: 'Total',
+      label: {
+        show: true,
+        position: 'bottom'
+      },
+      data: ['-', '-', '-', 108, 154, '-', '-', '-', 119, 361, 203]
+    }
+  ]
 };
 
-export {}
\ No newline at end of file
+export {};
diff --git a/public/examples/ts/bar-y-category-stack.ts b/public/examples/ts/bar-y-category-stack.ts
index fa2c1b3..3d85803 100644
--- a/public/examples/ts/bar-y-category-stack.ts
+++ b/public/examples/ts/bar-y-category-stack.ts
@@ -5,90 +5,89 @@ category: bar
 difficulty: 3
 */
 option = {
-    tooltip: {
-        trigger: 'axis',
-        axisPointer: {            // Use axis to trigger tooltip
-            type: 'shadow'        // 'shadow' as default; can also be 'line' or 'shadow'
-        }
+  tooltip: {
+    trigger: 'axis',
+    axisPointer: {
+      // Use axis to trigger tooltip
+      type: 'shadow' // 'shadow' as default; can also be 'line' or 'shadow'
+    }
+  },
+  legend: {},
+  grid: {
+    left: '3%',
+    right: '4%',
+    bottom: '3%',
+    containLabel: true
+  },
+  xAxis: {
+    type: 'value'
+  },
+  yAxis: {
+    type: 'category',
+    data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
+  },
+  series: [
+    {
+      name: 'Direct',
+      type: 'bar',
+      stack: 'total',
+      label: {
+        show: true
+      },
+      emphasis: {
+        focus: 'series'
+      },
+      data: [320, 302, 301, 334, 390, 330, 320]
     },
-    legend: {
-        data: ['Direct', 'Mail Ad', 'Affiliate Ad', 'Video Ad', 'Search Engine']
+    {
+      name: 'Mail Ad',
+      type: 'bar',
+      stack: 'total',
+      label: {
+        show: true
+      },
+      emphasis: {
+        focus: 'series'
+      },
+      data: [120, 132, 101, 134, 90, 230, 210]
     },
-    grid: {
-        left: '3%',
-        right: '4%',
-        bottom: '3%',
-        containLabel: true
+    {
+      name: 'Affiliate Ad',
+      type: 'bar',
+      stack: 'total',
+      label: {
+        show: true
+      },
+      emphasis: {
+        focus: 'series'
+      },
+      data: [220, 182, 191, 234, 290, 330, 310]
     },
-    xAxis: {
-        type: 'value'
+    {
+      name: 'Video Ad',
+      type: 'bar',
+      stack: 'total',
+      label: {
+        show: true
+      },
+      emphasis: {
+        focus: 'series'
+      },
+      data: [150, 212, 201, 154, 190, 330, 410]
     },
-    yAxis: {
-        type: 'category',
-        data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
-    },
-    series: [
-        {
-            name: 'Direct',
-            type: 'bar',
-            stack: 'total',
-            label: {
-                show: true
-            },
-            emphasis: {
-                focus: 'series'
-            },
-            data: [320, 302, 301, 334, 390, 330, 320]
-        },
-        {
-            name: 'Mail Ad',
-            type: 'bar',
-            stack: 'total',
-            label: {
-                show: true
-            },
-            emphasis: {
-                focus: 'series'
-            },
-            data: [120, 132, 101, 134, 90, 230, 210]
-        },
-        {
-            name: 'Affiliate Ad',
-            type: 'bar',
-            stack: 'total',
-            label: {
-                show: true
-            },
-            emphasis: {
-                focus: 'series'
-            },
-            data: [220, 182, 191, 234, 290, 330, 310]
-        },
-        {
-            name: 'Video Ad',
-            type: 'bar',
-            stack: 'total',
-            label: {
-                show: true
-            },
-            emphasis: {
-                focus: 'series'
-            },
-            data: [150, 212, 201, 154, 190, 330, 410]
-        },
-        {
-            name: 'Search Engine',
-            type: 'bar',
-            stack: 'total',
-            label: {
-                show: true
-            },
-            emphasis: {
-                focus: 'series'
-            },
-            data: [820, 832, 901, 934, 1290, 1330, 1320]
-        }
-    ]
+    {
+      name: 'Search Engine',
+      type: 'bar',
+      stack: 'total',
+      label: {
+        show: true
+      },
+      emphasis: {
+        focus: 'series'
+      },
+      data: [820, 832, 901, 934, 1290, 1330, 1320]
+    }
+  ]
 };
 
-export {};
\ No newline at end of file
+export {};
diff --git a/public/examples/ts/bar-y-category.ts b/public/examples/ts/bar-y-category.ts
index 36d8272..dd81014 100644
--- a/public/examples/ts/bar-y-category.ts
+++ b/public/examples/ts/bar-y-category.ts
@@ -6,45 +6,42 @@ difficulty: 2
 */
 
 option = {
-    title: {
-        text: 'World Population'
+  title: {
+    text: 'World Population'
+  },
+  tooltip: {
+    trigger: 'axis',
+    axisPointer: {
+      type: 'shadow'
+    }
+  },
+  legend: {},
+  grid: {
+    left: '3%',
+    right: '4%',
+    bottom: '3%',
+    containLabel: true
+  },
+  xAxis: {
+    type: 'value',
+    boundaryGap: [0, 0.01]
+  },
+  yAxis: {
+    type: 'category',
+    data: ['Brazil', 'Indonesia', 'USA', 'India', 'China', 'World']
+  },
+  series: [
+    {
+      name: '2011',
+      type: 'bar',
+      data: [18203, 23489, 29034, 104970, 131744, 630230]
     },
-    tooltip: {
-        trigger: 'axis',
-        axisPointer: {
-            type: 'shadow'
-        }
-    },
-    legend: {
-        data: ['2011', '2012']
-    },
-    grid: {
-        left: '3%',
-        right: '4%',
-        bottom: '3%',
-        containLabel: true
-    },
-    xAxis: {
-        type: 'value',
-        boundaryGap: [0, 0.01]
-    },
-    yAxis: {
-        type: 'category',
-        data: ['Brazil', 'Indonesia', 'USA', 'India', 'China', 'World']
-    },
-    series: [
-        {
-            name: '2011',
-            type: 'bar',
-            data: [18203, 23489, 29034, 104970, 131744, 630230]
-        },
-        {
-            name: '2012',
-            type: 'bar',
-            data: [19325, 23438, 31000, 121594, 134141, 681807]
-        }
-    ]
+    {
+      name: '2012',
+      type: 'bar',
+      data: [19325, 23438, 31000, 121594, 134141, 681807]
+    }
+  ]
 };
 
-
-export {}
\ No newline at end of file
+export {};
diff --git a/public/examples/ts/bar1.ts b/public/examples/ts/bar1.ts
index e37585b..6ff1d14 100644
--- a/public/examples/ts/bar1.ts
+++ b/public/examples/ts/bar1.ts
@@ -6,71 +6,72 @@ difficulty: 4
 */
 
 option = {
-    title: {
-        text: 'Rainfall and Evaporation',
-        subtext: 'Fake Data'
+  title: {
+    text: 'Rainfall vs Evaporation',
+    subtext: 'Fake Data'
+  },
+  tooltip: {
+    trigger: 'axis'
+  },
+  legend: {
+    data: ['Rainfall', 'Evaporation']
+  },
+  toolbox: {
+    show: true,
+    feature: {
+      dataView: { show: true, readOnly: false },
+      magicType: { show: true, type: ['line', 'bar'] },
+      restore: { show: true },
+      saveAsImage: { show: true }
+    }
+  },
+  calculable: true,
+  xAxis: [
+    {
+      type: 'category',
+      // prettier-ignore
+      data: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
+    }
+  ],
+  yAxis: [
+    {
+      type: 'value'
+    }
+  ],
+  series: [
+    {
+      name: 'Rainfall',
+      type: 'bar',
+      data: [
+        2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3
+      ],
+      markPoint: {
+        data: [
+          { type: 'max', name: 'Max' },
+          { type: 'min', name: 'Min' }
+        ]
+      },
+      markLine: {
+        data: [{ type: 'average', name: 'Avg' }]
+      }
     },
-    tooltip: {
-        trigger: 'axis'
-    },
-    legend: {
-        data: ['Rainfall', 'Evaporation']
-    },
-    toolbox: {
-        show: true,
-        feature: {
-            dataView: {show: true, readOnly: false},
-            magicType: {show: true, type: ['line', 'bar']},
-            restore: {show: true},
-            saveAsImage: {show: true}
-        }
-    },
-    calculable: true,
-    xAxis: [
-        {
-            type: 'category',
-            data: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
-        }
-    ],
-    yAxis: [
-        {
-            type: 'value'
-        }
-    ],
-    series: [
-        {
-            name: 'Rainfall',
-            type: 'bar',
-            data: [2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3],
-            markPoint: {
-                data: [
-                    {type: 'max', name: 'Max'},
-                    {type: 'min', name: 'Min'}
-                ]
-            },
-            markLine: {
-                data: [
-                    {type: 'average', name: 'Avg'}
-                ]
-            }
-        },
-        {
-            name: 'Evaporation',
-            type: 'bar',
-            data: [2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3],
-            markPoint: {
-                data: [
-                    {name: '年最高', value: 182.2, xAxis: 7, yAxis: 183},
-                    {name: '年最低', value: 2.3, xAxis: 11, yAxis: 3}
-                ]
-            },
-            markLine: {
-                data: [
-                    {type: 'average', name: 'Avg'}
-                ]
-            }
-        }
-    ]
+    {
+      name: 'Evaporation',
+      type: 'bar',
+      data: [
+        2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3
+      ],
+      markPoint: {
+        data: [
+          { name: 'Max', value: 182.2, xAxis: 7, yAxis: 183 },
+          { name: 'Min', value: 2.3, xAxis: 11, yAxis: 3 }
+        ]
+      },
+      markLine: {
+        data: [{ type: 'average', name: 'Avg' }]
+      }
+    }
+  ]
 };
 
-export {}
\ No newline at end of file
+export {};
diff --git a/public/examples/ts/boxplot-light-velocity.ts b/public/examples/ts/boxplot-light-velocity.ts
index 5e6f8b9..3d73509 100644
--- a/public/examples/ts/boxplot-light-velocity.ts
+++ b/public/examples/ts/boxplot-light-velocity.ts
@@ -5,82 +5,87 @@ titleCN: 基础盒须图
 */
 
 option = {
-    title: [
-        {
-            text: 'Michelson-Morley Experiment',
-            left: 'center'
-        },
-        {
-            text: 'upper: Q3 + 1.5 * IQR \nlower: Q1 - 1.5 * IQR',
-            borderColor: '#999',
-            borderWidth: 1,
-            textStyle: {
-                fontWeight: 'normal',
-                fontSize: 14,
-                lineHeight: 20
-            },
-            left: '10%',
-            top: '90%'
-        }
-    ],
-    dataset: [{
-        source: [
-            [850, 740, 900, 1070, 930, 850, 950, 980, 980, 880, 1000, 980, 930, 650, 760, 810, 1000, 1000, 960, 960],
-            [960, 940, 960, 940, 880, 800, 850, 880, 900, 840, 830, 790, 810, 880, 880, 830, 800, 790, 760, 800],
-            [880, 880, 880, 860, 720, 720, 620, 860, 970, 950, 880, 910, 850, 870, 840, 840, 850, 840, 840, 840],
-            [890, 810, 810, 820, 800, 770, 760, 740, 750, 760, 910, 920, 890, 860, 880, 720, 840, 850, 850, 780],
-            [890, 840, 780, 810, 760, 810, 790, 810, 820, 850, 870, 870, 810, 740, 810, 940, 950, 800, 810, 870]
-        ]
-    }, {
-        transform: {
-            type: 'boxplot',
-            config: { itemNameFormatter: 'expr {value}' }
-        }
-    }, {
-        fromDatasetIndex: 1,
-        fromTransformResult: 1
-    }],
-    tooltip: {
-        trigger: 'item',
-        axisPointer: {
-            type: 'shadow'
-        }
+  title: [
+    {
+      text: 'Michelson-Morley Experiment',
+      left: 'center'
     },
-    grid: {
-        left: '10%',
-        right: '10%',
-        bottom: '15%'
+    {
+      text: 'upper: Q3 + 1.5 * IQR \nlower: Q1 - 1.5 * IQR',
+      borderColor: '#999',
+      borderWidth: 1,
+      textStyle: {
+        fontWeight: 'normal',
+        fontSize: 14,
+        lineHeight: 20
+      },
+      left: '10%',
+      top: '90%'
+    }
+  ],
+  dataset: [
+    {
+      // prettier-ignore
+      source: [
+        [850, 740, 900, 1070, 930, 850, 950, 980, 980, 880, 1000, 980, 930, 650, 760, 810, 1000, 1000, 960, 960],
+        [960, 940, 960, 940, 880, 800, 850, 880, 900, 840, 830, 790, 810, 880, 880, 830, 800, 790, 760, 800],
+        [880, 880, 880, 860, 720, 720, 620, 860, 970, 950, 880, 910, 850, 870, 840, 840, 850, 840, 840, 840],
+        [890, 810, 810, 820, 800, 770, 760, 740, 750, 760, 910, 920, 890, 860, 880, 720, 840, 850, 850, 780],
+        [890, 840, 780, 810, 760, 810, 790, 810, 820, 850, 870, 870, 810, 740, 810, 940, 950, 800, 810, 870]
+      ]
     },
-    xAxis: {
-        type: 'category',
-        boundaryGap: true,
-        nameGap: 30,
-        splitArea: {
-            show: false
-        },
-        splitLine: {
-            show: false
-        }
+    {
+      transform: {
+        type: 'boxplot',
+        config: { itemNameFormatter: 'expr {value}' }
+      }
     },
-    yAxis: {
-        type: 'value',
-        name: 'km/s minus 299,000',
-        splitArea: {
-            show: true
-        }
+    {
+      fromDatasetIndex: 1,
+      fromTransformResult: 1
+    }
+  ],
+  tooltip: {
+    trigger: 'item',
+    axisPointer: {
+      type: 'shadow'
+    }
+  },
+  grid: {
+    left: '10%',
+    right: '10%',
+    bottom: '15%'
+  },
+  xAxis: {
+    type: 'category',
+    boundaryGap: true,
+    nameGap: 30,
+    splitArea: {
+      show: false
     },
-    series: [
-        {
-            name: 'boxplot',
-            type: 'boxplot',
-            datasetIndex: 1
-        },
-        {
-            name: 'outlier',
-            type: 'scatter',
-            datasetIndex: 2
-        }
-    ]
+    splitLine: {
+      show: false
+    }
+  },
+  yAxis: {
+    type: 'value',
+    name: 'km/s minus 299,000',
+    splitArea: {
+      show: true
+    }
+  },
+  series: [
+    {
+      name: 'boxplot',
+      type: 'boxplot',
+      datasetIndex: 1
+    },
+    {
+      name: 'outlier',
+      type: 'scatter',
+      datasetIndex: 2
+    }
+  ]
 };
 
-export {}
\ No newline at end of file
+export {};
diff --git a/public/examples/ts/boxplot-light-velocity2.ts b/public/examples/ts/boxplot-light-velocity2.ts
index 14452ec..91e44af 100644
--- a/public/examples/ts/boxplot-light-velocity2.ts
+++ b/public/examples/ts/boxplot-light-velocity2.ts
@@ -5,85 +5,90 @@ titleCN: 垂直方向盒须图
 */
 
 option = {
-    title: [
-        {
-            text: 'Michelson-Morley Experiment',
-            left: 'center'
-        },
-        {
-            text: 'upper: Q3 + 1.5 * IRQ \nlower: Q1 - 1.5 * IRQ',
-            borderColor: '#999',
-            borderWidth: 1,
-            textStyle: {
-                fontSize: 14
-            },
-            left: '10%',
-            top: '90%'
-        }
-    ],
-    dataset: [{
-        source: [
-            [850, 740, 900, 1070, 930, 850, 950, 980, 980, 880, 1000, 980, 930, 650, 760, 810, 1000, 1000, 960, 960],
-            [960, 940, 960, 940, 880, 800, 850, 880, 900, 840, 830, 790, 810, 880, 880, 830, 800, 790, 760, 800],
-            [880, 880, 880, 860, 720, 720, 620, 860, 970, 950, 880, 910, 850, 870, 840, 840, 850, 840, 840, 840],
-            [890, 810, 810, 820, 800, 770, 760, 740, 750, 760, 910, 920, 890, 860, 880, 720, 840, 850, 850, 780],
-            [890, 840, 780, 810, 760, 810, 790, 810, 820, 850, 870, 870, 810, 740, 810, 940, 950, 800, 810, 870]
-        ]
-    }, {
-        transform: {
-            type: 'boxplot',
-            config: {
-                itemNameFormatter: function (params: any) {
-                    return 'expr ' + params.value;
-                }
-            }
-        }
-    }, {
-        fromDatasetIndex: 1,
-        fromTransformResult: 1
-    }],
-    tooltip: {
-        trigger: 'item',
-        axisPointer: {
-            type: 'shadow'
-        }
+  title: [
+    {
+      text: 'Michelson-Morley Experiment',
+      left: 'center'
     },
-    grid: {
-        left: '10%',
-        right: '10%',
-        bottom: '15%'
+    {
+      text: 'upper: Q3 + 1.5 * IRQ \nlower: Q1 - 1.5 * IRQ',
+      borderColor: '#999',
+      borderWidth: 1,
+      textStyle: {
+        fontSize: 14
+      },
+      left: '10%',
+      top: '90%'
+    }
+  ],
+  dataset: [
+    {
+      // prettier-ignore
+      source: [
+        [850, 740, 900, 1070, 930, 850, 950, 980, 980, 880, 1000, 980, 930, 650, 760, 810, 1000, 1000, 960, 960],
+        [960, 940, 960, 940, 880, 800, 850, 880, 900, 840, 830, 790, 810, 880, 880, 830, 800, 790, 760, 800],
+        [880, 880, 880, 860, 720, 720, 620, 860, 970, 950, 880, 910, 850, 870, 840, 840, 850, 840, 840, 840],
+        [890, 810, 810, 820, 800, 770, 760, 740, 750, 760, 910, 920, 890, 860, 880, 720, 840, 850, 850, 780],
+        [890, 840, 780, 810, 760, 810, 790, 810, 820, 850, 870, 870, 810, 740, 810, 940, 950, 800, 810, 870]
+      ]
     },
-    yAxis: {
-        type: 'category',
-        boundaryGap: true,
-        nameGap: 30,
-        splitArea: {
-            show: false
-        },
-        splitLine: {
-            show: false
+    {
+      transform: {
+        type: 'boxplot',
+        config: {
+          itemNameFormatter: function (params: any) {
+            return 'expr ' + params.value;
+          }
         }
+      }
     },
-    xAxis: {
-        type: 'value',
-        name: 'km/s minus 299,000',
-        splitArea: {
-            show: true
-        }
+    {
+      fromDatasetIndex: 1,
+      fromTransformResult: 1
+    }
+  ],
+  tooltip: {
+    trigger: 'item',
+    axisPointer: {
+      type: 'shadow'
+    }
+  },
+  grid: {
+    left: '10%',
+    right: '10%',
+    bottom: '15%'
+  },
+  yAxis: {
+    type: 'category',
+    boundaryGap: true,
+    nameGap: 30,
+    splitArea: {
+      show: false
     },
-    series: [
-        {
-            name: 'boxplot',
-            type: 'boxplot',
-            datasetIndex: 1
-        },
-        {
-            name: 'outlier',
-            type: 'scatter',
-            encode: { x: 1, y: 0 },
-            datasetIndex: 2
-        }
-    ]
+    splitLine: {
+      show: false
+    }
+  },
+  xAxis: {
+    type: 'value',
+    name: 'km/s minus 299,000',
+    splitArea: {
+      show: true
+    }
+  },
+  series: [
+    {
+      name: 'boxplot',
+      type: 'boxplot',
+      datasetIndex: 1
+    },
+    {
+      name: 'outlier',
+      type: 'scatter',
+      encode: { x: 1, y: 0 },
+      datasetIndex: 2
+    }
+  ]
 };
 
-export {};
\ No newline at end of file
+export {};
diff --git a/public/examples/ts/boxplot-multi.ts b/public/examples/ts/boxplot-multi.ts
index f877282..9c7e31c 100644
--- a/public/examples/ts/boxplot-multi.ts
+++ b/public/examples/ts/boxplot-multi.ts
@@ -4,105 +4,117 @@ category: boxplot
 titleCN: 多系列盒须图
 */
 
-
 // Generate data.
 function makeData() {
-    let data = [];
-    for (let i = 0; i < 18; i++) {
-        let cate = [];
-        for (let j = 0; j < 100; j++) {
-            cate.push(Math.random() * 200);
-        }
-        data.push(cate);
+  let data = [];
+  for (let i = 0; i < 18; i++) {
+    let cate = [];
+    for (let j = 0; j < 100; j++) {
+      cate.push(Math.random() * 200);
     }
-    return data;
+    data.push(cate);
+  }
+  return data;
 }
 const data0 = makeData();
 const data1 = makeData();
 const data2 = makeData();
 
-
 option = {
-    title: {
-        text: 'Multiple Categories',
-        left: 'center'
+  title: {
+    text: 'Multiple Categories',
+    left: 'center'
+  },
+  dataset: [
+    {
+      source: data0
     },
-    dataset: [{
-        source: data0
-    }, {
-        source: data1
-    }, {
-        source: data2
-    }, {
-        fromDatasetIndex: 0,
-        transform: { type: 'boxplot' }
-    }, {
-        fromDatasetIndex: 1,
-        transform: { type: 'boxplot' }
-    }, {
-        fromDatasetIndex: 2,
-        transform: { type: 'boxplot' }
-    }],
-    legend: {
-        top: '10%'
+    {
+      source: data1
     },
-    tooltip: {
-        trigger: 'item',
-        axisPointer: {
-            type: 'shadow'
-        }
+    {
+      source: data2
     },
-    grid: {
-        left: '10%',
-        top: '20%',
-        right: '10%',
-        bottom: '15%'
+    {
+      fromDatasetIndex: 0,
+      transform: { type: 'boxplot' }
     },
-    xAxis: {
-        type: 'category',
-        boundaryGap: true,
-        nameGap: 30,
-        splitArea: {
-            show: true
-        },
-        splitLine: {
-            show: false
-        }
+    {
+      fromDatasetIndex: 1,
+      transform: { type: 'boxplot' }
     },
-    yAxis: {
-        type: 'value',
-        name: 'Value',
-        min: -400,
-        max: 600,
-        splitArea: {
-            show: false
-        }
+    {
+      fromDatasetIndex: 2,
+      transform: { type: 'boxplot' }
+    }
+  ],
+  legend: {
+    top: '10%'
+  },
+  tooltip: {
+    trigger: 'item',
+    axisPointer: {
+      type: 'shadow'
+    }
+  },
+  grid: {
+    left: '10%',
+    top: '20%',
+    right: '10%',
+    bottom: '15%'
+  },
+  xAxis: {
+    type: 'category',
+    boundaryGap: true,
+    nameGap: 30,
+    splitArea: {
+      show: true
     },
-    dataZoom: [{
-        type: 'inside',
-        start: 0,
-        end: 20
-    }, {
-        show: true,
-        type: 'slider',
-        top: '90%',
-        xAxisIndex: [0],
-        start: 0,
-        end: 20
-    }],
-    series: [{
-        name: 'category0',
-        type: 'boxplot',
-        datasetIndex: 3
-    }, {
-        name: 'category1',
-        type: 'boxplot',
-        datasetIndex: 4
-    }, {
-        name: 'category2',
-        type: 'boxplot',
-        datasetIndex: 5
-    }]
+    splitLine: {
+      show: false
+    }
+  },
+  yAxis: {
+    type: 'value',
+    name: 'Value',
+    min: -400,
+    max: 600,
+    splitArea: {
+      show: false
+    }
+  },
+  dataZoom: [
+    {
+      type: 'inside',
+      start: 0,
+      end: 20
+    },
+    {
+      show: true,
+      type: 'slider',
+      top: '90%',
+      xAxisIndex: [0],
+      start: 0,
+      end: 20
+    }
+  ],
+  series: [
+    {
+      name: 'category0',
+      type: 'boxplot',
+      datasetIndex: 3
+    },
+    {
+      name: 'category1',
+      type: 'boxplot',
+      datasetIndex: 4
+    },
+    {
+      name: 'category2',
+      type: 'boxplot',
+      datasetIndex: 5
+    }
+  ]
 };
 
-export {}
\ No newline at end of file
+export {};
diff --git a/public/examples/ts/bubble-gradient.ts b/public/examples/ts/bubble-gradient.ts
index 42ec11d..fe3294f 100644
--- a/public/examples/ts/bubble-gradient.ts
+++ b/public/examples/ts/bubble-gradient.ts
@@ -6,106 +6,158 @@ difficulty: 6
 */
 
 const data = [
-    [[28604,77,17096869,'Australia',1990],[31163,77.4,27662440,'Canada',1990],[1516,68,1154605773,'China',1990],[13670,74.7,10582082,'Cuba',1990],[28599,75,4986705,'Finland',1990],[29476,77.1,56943299,'France',1990],[31476,75.4,78958237,'Germany',1990],[28666,78.1,254830,'Iceland',1990],[1777,57.7,870601776,'India',1990],[29550,79.1,122249285,'Japan',1990],[2076,67.9,20194354,'North Korea',1990],[12087,72,42972254,'South Korea',1990],[24021,75.4,3397534,'New Zealand',1990],[43296,76.8,42 [...]
-    [[44056,81.8,23968973,'Australia',2015],[43294,81.7,35939927,'Canada',2015],[13334,76.9,1376048943,'China',2015],[21291,78.5,11389562,'Cuba',2015],[38923,80.8,5503457,'Finland',2015],[37599,81.9,64395345,'France',2015],[44053,81.1,80688545,'Germany',2015],[42182,82.8,329425,'Iceland',2015],[5903,66.8,1311050527,'India',2015],[36162,83.5,126573481,'Japan',2015],[1390,71.4,25155317,'North Korea',2015],[34644,80.7,50293439,'South Korea',2015],[34186,80.6,4528526,'New Zealand',2015],[643 [...]
+  [
+    [28604, 77, 17096869, 'Australia', 1990],
+    [31163, 77.4, 27662440, 'Canada', 1990],
+    [1516, 68, 1154605773, 'China', 1990],
+    [13670, 74.7, 10582082, 'Cuba', 1990],
+    [28599, 75, 4986705, 'Finland', 1990],
+    [29476, 77.1, 56943299, 'France', 1990],
+    [31476, 75.4, 78958237, 'Germany', 1990],
+    [28666, 78.1, 254830, 'Iceland', 1990],
+    [1777, 57.7, 870601776, 'India', 1990],
+    [29550, 79.1, 122249285, 'Japan', 1990],
+    [2076, 67.9, 20194354, 'North Korea', 1990],
+    [12087, 72, 42972254, 'South Korea', 1990],
+    [24021, 75.4, 3397534, 'New Zealand', 1990],
+    [43296, 76.8, 4240375, 'Norway', 1990],
+    [10088, 70.8, 38195258, 'Poland', 1990],
+    [19349, 69.6, 147568552, 'Russia', 1990],
+    [10670, 67.3, 53994605, 'Turkey', 1990],
+    [26424, 75.7, 57110117, 'United Kingdom', 1990],
+    [37062, 75.4, 252847810, 'United States', 1990]
+  ],
+  [
+    [44056, 81.8, 23968973, 'Australia', 2015],
+    [43294, 81.7, 35939927, 'Canada', 2015],
+    [13334, 76.9, 1376048943, 'China', 2015],
+    [21291, 78.5, 11389562, 'Cuba', 2015],
+    [38923, 80.8, 5503457, 'Finland', 2015],
+    [37599, 81.9, 64395345, 'France', 2015],
+    [44053, 81.1, 80688545, 'Germany', 2015],
+    [42182, 82.8, 329425, 'Iceland', 2015],
+    [5903, 66.8, 1311050527, 'India', 2015],
+    [36162, 83.5, 126573481, 'Japan', 2015],
+    [1390, 71.4, 25155317, 'North Korea', 2015],
+    [34644, 80.7, 50293439, 'South Korea', 2015],
+    [34186, 80.6, 4528526, 'New Zealand', 2015],
+    [64304, 81.6, 5210967, 'Norway', 2015],
+    [24787, 77.3, 38611794, 'Poland', 2015],
+    [23038, 73.13, 143456918, 'Russia', 2015],
+    [19360, 76.5, 78665830, 'Turkey', 2015],
+    [38225, 81.4, 64715810, 'United Kingdom', 2015],
+    [53354, 79.1, 321773631, 'United States', 2015]
+  ]
 ];
 
 option = {
-    backgroundColor: new echarts.graphic.RadialGradient(0.3, 0.3, 0.8, [{
-        offset: 0,
-        color: '#f7f8fa'
-    }, {
-        offset: 1,
-        color: '#cdd0d5'
-    }]),
-    title: {
-        text: 'Life Expectancy and GDP by Country' ,
-        left: '5%',
-        top: '3%'
+  backgroundColor: new echarts.graphic.RadialGradient(0.3, 0.3, 0.8, [
+    {
+      offset: 0,
+      color: '#f7f8fa'
     },
-    legend: {
-        right: '10%',
-        top: '3%',
-        data: ['1990', '2015']
+    {
+      offset: 1,
+      color: '#cdd0d5'
+    }
+  ]),
+  title: {
+    text: 'Life Expectancy and GDP by Country',
+    left: '5%',
+    top: '3%'
+  },
+  legend: {
+    right: '10%',
+    top: '3%',
+    data: ['1990', '2015']
+  },
+  grid: {
+    left: '8%',
+    top: '10%'
+  },
+  xAxis: {
+    splitLine: {
+      lineStyle: {
+        type: 'dashed'
+      }
+    }
+  },
+  yAxis: {
+    splitLine: {
+      lineStyle: {
+        type: 'dashed'
+      }
     },
-    grid: {
-        left: '8%',
-        top: '10%'
-    },
-    xAxis: {
-        splitLine: {
-            lineStyle: {
-                type: 'dashed'
-            }
+    scale: true
+  },
+  series: [
+    {
+      name: '1990',
+      data: data[0],
+      type: 'scatter',
+      symbolSize: function (data) {
+        return Math.sqrt(data[2]) / 5e2;
+      },
+      emphasis: {
+        focus: 'series',
+        label: {
+          show: true,
+          formatter: function (param: any) {
+            return param.data[3];
+          },
+          position: 'top'
         }
+      },
+      itemStyle: {
+        shadowBlur: 10,
+        shadowColor: 'rgba(120, 36, 50, 0.5)',
+        shadowOffsetY: 5,
+        color: new echarts.graphic.RadialGradient(0.4, 0.3, 1, [
+          {
+            offset: 0,
+            color: 'rgb(251, 118, 123)'
+          },
+          {
+            offset: 1,
+            color: 'rgb(204, 46, 72)'
+          }
+        ])
+      }
     },
-    yAxis: {
-        splitLine: {
-            lineStyle: {
-                type: 'dashed'
-            }
-        },
-        scale: true
-    },
-    series: [{
-        name: '1990',
-        data: data[0],
-        type: 'scatter',
-        symbolSize: function (data) {
-            return Math.sqrt(data[2]) / 5e2;
-        },
-        emphasis: {
-            focus: 'series',
-            label: {
-                show: true,
-                formatter: function (param) {
-                    return param.data[3];
-                },
-                position: 'top'
-            }
-        },
-        itemStyle: {
-            shadowBlur: 10,
-            shadowColor: 'rgba(120, 36, 50, 0.5)',
-            shadowOffsetY: 5,
-            color: new echarts.graphic.RadialGradient(0.4, 0.3, 1, [{
-                offset: 0,
-                color: 'rgb(251, 118, 123)'
-            }, {
-                offset: 1,
-                color: 'rgb(204, 46, 72)'
-            }])
-        }
-    }, {
-        name: '2015',
-        data: data[1],
-        type: 'scatter',
-        symbolSize: function (data) {
-            return Math.sqrt(data[2]) / 5e2;
-        },
-        emphasis: {
-            focus: 'series',
-            label: {
-                show: true,
-                formatter: function (param) {
-                    return param.data[3];
-                },
-                position: 'top'
-            }
-        },
-        itemStyle: {
-            shadowBlur: 10,
-            shadowColor: 'rgba(25, 100, 150, 0.5)',
-            shadowOffsetY: 5,
-            color: new echarts.graphic.RadialGradient(0.4, 0.3, 1, [{
-                offset: 0,
-                color: 'rgb(129, 227, 238)'
-            }, {
-                offset: 1,
-                color: 'rgb(25, 183, 207)'
-            }])
+    {
+      name: '2015',
+      data: data[1],
+      type: 'scatter',
+      symbolSize: function (data) {
+        return Math.sqrt(data[2]) / 5e2;
+      },
+      emphasis: {
+        focus: 'series',
+        label: {
+          show: true,
+          formatter: function (param) {
+            return param.data[3];
+          },
+          position: 'top'
         }
-    }]
+      },
+      itemStyle: {
+        shadowBlur: 10,
+        shadowColor: 'rgba(25, 100, 150, 0.5)',
+        shadowOffsetY: 5,
+        color: new echarts.graphic.RadialGradient(0.4, 0.3, 1, [
+          {
+            offset: 0,
+            color: 'rgb(129, 227, 238)'
+          },
+          {
+            offset: 1,
+            color: 'rgb(25, 183, 207)'
+          }
+        ])
+      }
+    }
+  ]
 };
 
-export {}
\ No newline at end of file
+export {};
diff --git a/public/examples/ts/calendar-charts.ts b/public/examples/ts/calendar-charts.ts
index 5418331..508ac34 100644
--- a/public/examples/ts/calendar-charts.ts
+++ b/public/examples/ts/calendar-charts.ts
@@ -7,189 +7,177 @@ difficulty: 11
 */
 
 function getVirtulData(year: string) {
-    year = year || '2017';
-    let date = +echarts.number.parseDate(year + '-01-01');
-    let end = +echarts.number.parseDate((+year + 1) + '-01-01');
-    let dayTime = 3600 * 24 * 1000;
-    let data = [];
-    for (let time = date; time < end; time += dayTime) {
-        data.push([
-            echarts.format.formatTime('yyyy-MM-dd', time),
-            Math.floor(Math.random() * 1000)
-        ]);
-    }
-    console.log(data[data.length - 1]);
-    return data;
+  year = year || '2017';
+  let date = +echarts.number.parseDate(year + '-01-01');
+  let end = +echarts.number.parseDate(+year + 1 + '-01-01');
+  let dayTime = 3600 * 24 * 1000;
+  let data = [];
+  for (let time = date; time < end; time += dayTime) {
+    data.push([
+      echarts.format.formatTime('yyyy-MM-dd', time),
+      Math.floor(Math.random() * 1000)
+    ]);
+  }
+  console.log(data[data.length - 1]);
+  return data;
 }
 
-
-
 const graphData = [
-    [
-       '2017-02-01',
-        260
-    ],
-    [
-        '2017-02-04',
-        200
-    ],
-    [
-        '2017-02-09',
-        279
-    ],
-    [
-        '2017-02-13',
-        847
-    ],
-    [
-        '2017-02-18',
-        241
-    ],
-    [
-        '2017-02-23',
-        411
-    ],
-    [
-        '2017-02-27',
-        985
-    ]
+  ['2017-02-01', 260],
+  ['2017-02-04', 200],
+  ['2017-02-09', 279],
+  ['2017-02-13', 847],
+  ['2017-02-18', 241],
+  ['2017-02-23', 411],
+  ['2017-02-27', 985]
 ];
 
 const links = graphData.map(function (item, idx) {
-    return {
-        source: idx,
-        target: idx + 1
-    };
+  return {
+    source: idx,
+    target: idx + 1
+  };
 });
 links.pop();
 
 option = {
-    tooltip: {
-        position: 'top'
-    },
+  tooltip: {
+    position: 'top'
+  },
 
-    visualMap: [{
-        min: 0,
-        max: 1000,
-        calculable: true,
-        seriesIndex: [2, 3, 4],
-        orient: 'horizontal',
-        left: '55%',
-        bottom: 20
-    }, {
-        min: 0,
-        max: 1000,
+  visualMap: [
+    {
+      min: 0,
+      max: 1000,
+      calculable: true,
+      seriesIndex: [2, 3, 4],
+      orient: 'horizontal',
+      left: '55%',
+      bottom: 20
+    },
+    {
+      min: 0,
+      max: 1000,
+      inRange: {
+        color: ['grey'],
+        opacity: [0, 0.3]
+      },
+      controller: {
         inRange: {
-            color: ['grey'],
-            opacity: [0, 0.3]
+          opacity: [0.3, 0.6]
         },
-        controller: {
-            inRange: {
-                opacity: [0.3, 0.6]
-            },
-            outOfRange: {
-                color: '#ccc'
-            }
-        },
-        seriesIndex: [1],
-        orient: 'horizontal',
-        left: '10%',
-        bottom: 20
-    }],
+        outOfRange: {
+          color: '#ccc'
+        }
+      },
+      seriesIndex: [1],
+      orient: 'horizontal',
+      left: '10%',
+      bottom: 20
+    }
+  ],
 
-    calendar: [{
-        orient: 'vertical',
-        yearLabel: {
-            margin: 40
-        },
-        monthLabel: {
-            nameMap: 'cn',
-            margin: 20
-        },
-        dayLabel: {
-            firstDay: 1,
-            nameMap: 'cn'
-        },
-        cellSize: 40,
-        range: '2017-02'
+  calendar: [
+    {
+      orient: 'vertical',
+      yearLabel: {
+        margin: 40
+      },
+      monthLabel: {
+        nameMap: 'cn',
+        margin: 20
+      },
+      dayLabel: {
+        firstDay: 1,
+        nameMap: 'cn'
+      },
+      cellSize: 40,
+      range: '2017-02'
     },
     {
-        orient: 'vertical',
-        yearLabel: {
-            margin: 40
-        },
-        monthLabel: {
-            margin: 20
-        },
-        cellSize: 40,
-        left: 460,
-        range: '2017-01'
+      orient: 'vertical',
+      yearLabel: {
+        margin: 40
+      },
+      monthLabel: {
+        margin: 20
+      },
+      cellSize: 40,
+      left: 460,
+      range: '2017-01'
     },
     {
-        orient: 'vertical',
-        yearLabel: {
-            margin: 40
-        },
-        monthLabel: {
-            margin: 20
-        },
-        cellSize: 40,
-        top: 350,
-        range: '2017-03'
+      orient: 'vertical',
+      yearLabel: {
+        margin: 40
+      },
+      monthLabel: {
+        margin: 20
+      },
+      cellSize: 40,
+      top: 350,
+      range: '2017-03'
     },
     {
-        orient: 'vertical',
-        yearLabel: {
-            margin: 40
-        },
-        dayLabel: {
-            firstDay: 1,
-            nameMap: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']
-        },
-        monthLabel: {
-            nameMap: 'cn',
-            margin: 20
-        },
-        cellSize: 40,
-        top: 350,
-        left: 460,
-        range: '2017-04'
-    }],
+      orient: 'vertical',
+      yearLabel: {
+        margin: 40
+      },
+      dayLabel: {
+        firstDay: 1,
+        nameMap: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']
+      },
+      monthLabel: {
+        nameMap: 'cn',
+        margin: 20
+      },
+      cellSize: 40,
+      top: 350,
+      left: 460,
+      range: '2017-04'
+    }
+  ],
 
-    series: [{
-        type: 'graph',
-        edgeSymbol: ['none', 'arrow'],
-        coordinateSystem: 'calendar',
-        links: links,
-        symbolSize: 10,
-        calendarIndex: 0,
-        data: graphData
-    }, {
-        type: 'heatmap',
-        coordinateSystem: 'calendar',
-        data: getVirtulData('2017')
-    }, {
-        type: 'effectScatter',
-        coordinateSystem: 'calendar',
-        calendarIndex: 1,
-        symbolSize: function (val) {
-            return val[1] / 40;
-        },
-        data: getVirtulData('2017')
-    }, {
-        type: 'scatter',
-        coordinateSystem: 'calendar',
-        calendarIndex: 2,
-        symbolSize: function (val) {
-            return val[1] / 60;
-        },
-        data: getVirtulData('2017')
-    }, {
-        type: 'heatmap',
-        coordinateSystem: 'calendar',
-        calendarIndex: 3,
-        data: getVirtulData('2017')
-    }]
+  series: [
+    {
+      type: 'graph',
+      edgeSymbol: ['none', 'arrow'],
+      coordinateSystem: 'calendar',
+      links: links,
+      symbolSize: 10,
+      calendarIndex: 0,
+      data: graphData
+    },
+    {
+      type: 'heatmap',
+      coordinateSystem: 'calendar',
+      data: getVirtulData('2017')
+    },
+    {
+      type: 'effectScatter',
+      coordinateSystem: 'calendar',
+      calendarIndex: 1,
+      symbolSize: function (val) {
+        return val[1] / 40;
+      },
+      data: getVirtulData('2017')
+    },
+    {
+      type: 'scatter',
+      coordinateSystem: 'calendar',
+      calendarIndex: 2,
+      symbolSize: function (val) {
+        return val[1] / 60;
+      },
+      data: getVirtulData('2017')
+    },
+    {
+      type: 'heatmap',
+      coordinateSystem: 'calendar',
+      calendarIndex: 3,
+      data: getVirtulData('2017')
+    }
+  ]
 };
 
-export {}
\ No newline at end of file
+export {};
diff --git a/public/examples/ts/calendar-effectscatter.ts b/public/examples/ts/calendar-effectscatter.ts
index 131d57c..32f4b5c 100644
--- a/public/examples/ts/calendar-effectscatter.ts
+++ b/public/examples/ts/calendar-effectscatter.ts
@@ -6,158 +6,165 @@ difficulty:3
 */
 
 function getVirtulData(year: string) {
-    year = year || '2017';
-    let date = +echarts.number.parseDate(year + '-01-01');
-    let end = +echarts.number.parseDate((+year + 1) + '-01-01');
-    let dayTime = 3600 * 24 * 1000;
-    let data: [string, number][] = [];
-    for (let time = date; time < end; time += dayTime) {
-        data.push([
-            echarts.format.formatTime('yyyy-MM-dd', time),
-            Math.floor(Math.random() * 10000)
-        ]);
-    }
-    return data;
+  year = year || '2017';
+  let date = +echarts.number.parseDate(year + '-01-01');
+  let end = +echarts.number.parseDate(+year + 1 + '-01-01');
+  let dayTime = 3600 * 24 * 1000;
+  let data: [string, number][] = [];
+  for (let time = date; time < end; time += dayTime) {
+    data.push([
+      echarts.format.formatTime('yyyy-MM-dd', time),
+      Math.floor(Math.random() * 10000)
+    ]);
+  }
+  return data;
 }
 
 const data = getVirtulData('2016');
 
 option = {
-    backgroundColor: '#404a59',
+  backgroundColor: '#404a59',
 
-    title: {
-        top: 30,
-        text: 'Daily Step Count in 2016',
-        subtext: 'Fake Data',
-        left: 'center',
-        textStyle: {
-            color: '#fff'
+  title: {
+    top: 30,
+    text: 'Daily Step Count in 2016',
+    subtext: 'Fake Data',
+    left: 'center',
+    textStyle: {
+      color: '#fff'
+    }
+  },
+  tooltip: {
+    trigger: 'item'
+  },
+  legend: {
+    top: '30',
+    left: '100',
+    data: ['Steps', 'Top 12'],
+    textStyle: {
+      color: '#fff'
+    }
+  },
+  calendar: [
+    {
+      top: 100,
+      left: 'center',
+      range: ['2016-01-01', '2016-06-30'],
+      splitLine: {
+        show: true,
+        lineStyle: {
+          color: '#000',
+          width: 4,
+          type: 'solid'
         }
+      },
+      yearLabel: {
+        formatter: '{start}  1st',
+        color: '#fff'
+      },
+      itemStyle: {
+        color: '#323c48',
+        borderWidth: 1,
+        borderColor: '#111'
+      }
     },
-    tooltip: {
-        trigger: 'item'
-    },
-    legend: {
-        top: '30',
-        left: '100',
-        data: ['Steps', 'Top 12'],
-        textStyle: {
-            color: '#fff'
+    {
+      top: 340,
+      left: 'center',
+      range: ['2016-07-01', '2016-12-31'],
+      splitLine: {
+        show: true,
+        lineStyle: {
+          color: '#000',
+          width: 4,
+          type: 'solid'
         }
+      },
+      yearLabel: {
+        formatter: '{start}  2nd',
+        color: '#fff'
+      },
+      itemStyle: {
+        color: '#323c48',
+        borderWidth: 1,
+        borderColor: '#111'
+      }
+    }
+  ],
+  series: [
+    {
+      name: 'Steps',
+      type: 'scatter',
+      coordinateSystem: 'calendar',
+      data: data,
+      symbolSize: function (val) {
+        return val[1] / 500;
+      },
+      itemStyle: {
+        color: '#ddb926'
+      }
     },
-    calendar: [{
-        top: 100,
-        left: 'center',
-        range: ['2016-01-01', '2016-06-30'],
-        splitLine: {
-            show: true,
-            lineStyle: {
-                color: '#000',
-                width: 4,
-                type: 'solid'
-            }
-        },
-        yearLabel: {
-            formatter: '{start}  1st',
-            color: '#fff'
-        },
-        itemStyle: {
-            color: '#323c48',
-            borderWidth: 1,
-            borderColor: '#111'
-        }
-    }, {
-        top: 340,
-        left: 'center',
-        range: ['2016-07-01', '2016-12-31'],
-        splitLine: {
-            show: true,
-            lineStyle: {
-                color: '#000',
-                width: 4,
-                type: 'solid'
-            }
-        },
-        yearLabel: {
-            formatter: '{start}  2nd',
-            color: '#fff'
-        },
-        itemStyle: {
-            color: '#323c48',
-            borderWidth: 1,
-            borderColor: '#111'
-        }
-    }],
-    series: [
-        {
-            name: 'Steps',
-            type: 'scatter',
-            coordinateSystem: 'calendar',
-            data: data,
-            symbolSize: function (val) {
-                return val[1] / 500;
-            },
-            itemStyle: {
-                color: '#ddb926'
-            }
-        },
-        {
-            name: 'Steps',
-            type: 'scatter',
-            coordinateSystem: 'calendar',
-            calendarIndex: 1,
-            data: data,
-            symbolSize: function (val) {
-                return val[1] / 500;
-            },
-            itemStyle: {
-                color: '#ddb926'
-            }
-        },
-        {
-            name: 'Top 12',
-            type: 'effectScatter',
-            coordinateSystem: 'calendar',
-            calendarIndex: 1,
-            data: data.sort(function (a, b) {
-                return b[1] - a[1];
-            }).slice(0, 12),
-            symbolSize: function (val) {
-                return val[1] / 500;
-            },
-            showEffectOn: 'render',
-            rippleEffect: {
-                brushType: 'stroke'
-            },
-            itemStyle: {
-                color: '#f4e925',
-                shadowBlur: 10,
-                shadowColor: '#333'
-            },
-            zlevel: 1
-        },
-        {
-            name: 'Top 12',
-            type: 'effectScatter',
-            coordinateSystem: 'calendar',
-            data: data.sort(function (a, b) {
-                return b[1] - a[1];
-            }).slice(0, 12),
-            symbolSize: function (val) {
-                return val[1] / 500;
-            },
-            showEffectOn: 'render',
-            rippleEffect: {
-                brushType: 'stroke'
-            },
-            itemStyle: {
-                color: '#f4e925',
-                shadowBlur: 10,
-                shadowColor: '#333'
-            },
-            zlevel: 1
-        }
-    ]
+    {
+      name: 'Steps',
+      type: 'scatter',
+      coordinateSystem: 'calendar',
+      calendarIndex: 1,
+      data: data,
+      symbolSize: function (val) {
+        return val[1] / 500;
+      },
+      itemStyle: {
+        color: '#ddb926'
+      }
+    },
+    {
+      name: 'Top 12',
+      type: 'effectScatter',
+      coordinateSystem: 'calendar',
+      calendarIndex: 1,
+      data: data
+        .sort(function (a, b) {
+          return b[1] - a[1];
+        })
+        .slice(0, 12),
+      symbolSize: function (val) {
+        return val[1] / 500;
+      },
+      showEffectOn: 'render',
+      rippleEffect: {
+        brushType: 'stroke'
+      },
+      itemStyle: {
+        color: '#f4e925',
+        shadowBlur: 10,
+        shadowColor: '#333'
+      },
+      zlevel: 1
+    },
+    {
+      name: 'Top 12',
+      type: 'effectScatter',
+      coordinateSystem: 'calendar',
+      data: data
+        .sort(function (a, b) {
+          return b[1] - a[1];
+        })
+        .slice(0, 12),
+      symbolSize: function (val) {
+        return val[1] / 500;
+      },
+      showEffectOn: 'render',
+      rippleEffect: {
+        brushType: 'stroke'
+      },
+      itemStyle: {
+        color: '#f4e925',
+        shadowBlur: 10,
+        shadowColor: '#333'
+      },
+      zlevel: 1
+    }
+  ]
 };
 
-export {}
\ No newline at end of file
+export {};
diff --git a/public/examples/ts/calendar-graph.ts b/public/examples/ts/calendar-graph.ts
index 63c6251..152222d 100644
--- a/public/examples/ts/calendar-graph.ts
+++ b/public/examples/ts/calendar-graph.ts
@@ -6,121 +6,102 @@ difficulty: 4
 */
 
 const graphData: [string, number][] = [
-    [
-       '2017-02-01',
-        260
-    ],
-    [
-        '2017-02-04',
-        200
-    ],
-    [
-        '2017-02-09',
-        279
-    ],
-    [
-        '2017-02-13',
-        847
-    ],
-    [
-        '2017-02-18',
-        241
-    ],
-    [
-        '2017-02-23',
-        411
-    ],
-    [
-        '2017-03-14',
-        985
-    ]
+  ['2017-02-01', 260],
+  ['2017-02-04', 200],
+  ['2017-02-09', 279],
+  ['2017-02-13', 847],
+  ['2017-02-18', 241],
+  ['2017-02-23', 411],
+  ['2017-03-14', 985]
 ];
 
 const links = graphData.map(function (item, idx) {
-    return {
-        source: idx,
-        target: idx + 1
-    };
+  return {
+    source: idx,
+    target: idx + 1
+  };
 });
 links.pop();
 
 function getVirtulData(year: string) {
-    year = year || '2017';
-    var date = +echarts.number.parseDate(year + '-01-01');
-    var end = +echarts.number.parseDate((+year + 1) + '-01-01');
-    var dayTime = 3600 * 24 * 1000;
-    var data = [];
-    for (var time = date; time < end; time += dayTime) {
-        data.push([
-            echarts.format.formatTime('yyyy-MM-dd', time),
-            Math.floor(Math.random() * 1000)
-        ]);
-    }
-    return data;
+  year = year || '2017';
+  var date = +echarts.number.parseDate(year + '-01-01');
+  var end = +echarts.number.parseDate(+year + 1 + '-01-01');
+  var dayTime = 3600 * 24 * 1000;
+  var data = [];
+  for (var time = date; time < end; time += dayTime) {
+    data.push([
+      echarts.format.formatTime('yyyy-MM-dd', time),
+      Math.floor(Math.random() * 1000)
+    ]);
+  }
+  return data;
 }
 
-
 option = {
-    tooltip: {},
-    calendar: {
-        top: 'middle',
-        left: 'center',
-        orient: 'vertical',
-        cellSize: 40,
-        yearLabel: {
-            margin: 50,
-            fontSize: 30
-        },
-        dayLabel: {
-            firstDay: 1,
-            nameMap: 'cn'
-        },
-        monthLabel: {
-            nameMap: 'cn',
-            margin: 15,
-            fontSize: 20,
-            color: '#999'
-        },
-        range: ['2017-02', '2017-03-31']
+  tooltip: {},
+  calendar: {
+    top: 'middle',
+    left: 'center',
+    orient: 'vertical',
+    cellSize: 40,
+    yearLabel: {
+      margin: 50,
+      fontSize: 30
+    },
+    dayLabel: {
+      firstDay: 1,
+      nameMap: 'cn'
     },
-    visualMap: {
-        min: 0,
-        max: 1000,
-        type: 'piecewise',
-        left: 'center',
-        bottom: 20,
-        inRange: {
-            color: ['#5291FF', '#C7DBFF']
-        },
-        seriesIndex: [1],
-        orient: 'horizontal'
+    monthLabel: {
+      nameMap: 'cn',
+      margin: 15,
+      fontSize: 20,
+      color: '#999'
     },
-    series: [{
-        type: 'graph',
-        edgeSymbol: ['none', 'arrow'],
-        coordinateSystem: 'calendar',
-        links: links,
-        symbolSize: 15,
-        calendarIndex: 0,
-        itemStyle: {
-            color: 'yellow',
-            shadowBlur: 9,
-            shadowOffsetX: 1.5,
-            shadowOffsetY: 3,
-            shadowColor: '#555'
-        },
-        lineStyle: {
-            color: '#D10E00',
-            width: 1,
-            opacity: 1
-        },
-        data: graphData,
-        z: 20
-    }, {
-        type: 'heatmap',
-        coordinateSystem: 'calendar',
-        data: getVirtulData('2017')
-    }]
+    range: ['2017-02', '2017-03-31']
+  },
+  visualMap: {
+    min: 0,
+    max: 1000,
+    type: 'piecewise',
+    left: 'center',
+    bottom: 20,
+    inRange: {
+      color: ['#5291FF', '#C7DBFF']
+    },
+    seriesIndex: [1],
+    orient: 'horizontal'
+  },
+  series: [
+    {
+      type: 'graph',
+      edgeSymbol: ['none', 'arrow'],
+      coordinateSystem: 'calendar',
+      links: links,
+      symbolSize: 15,
+      calendarIndex: 0,
+      itemStyle: {
+        color: 'yellow',
+        shadowBlur: 9,
+        shadowOffsetX: 1.5,
+        shadowOffsetY: 3,
+        shadowColor: '#555'
+      },
+      lineStyle: {
+        color: '#D10E00',
+        width: 1,
+        opacity: 1
+      },
+      data: graphData,
+      z: 20
+    },
+    {
+      type: 'heatmap',
+      coordinateSystem: 'calendar',
+      data: getVirtulData('2017')
+    }
+  ]
 };
 
-export {}
\ No newline at end of file
+export {};
diff --git a/public/examples/ts/calendar-heatmap.ts b/public/examples/ts/calendar-heatmap.ts
index 389c667..c4ee50f 100644
--- a/public/examples/ts/calendar-heatmap.ts
+++ b/public/examples/ts/calendar-heatmap.ts
@@ -6,51 +6,51 @@ difficulty: 1
 */
 
 function getVirtulData(year: string) {
-    year = year || '2017';
-    var date = +echarts.number.parseDate(year + '-01-01');
-    var end = +echarts.number.parseDate((+year + 1) + '-01-01');
-    var dayTime = 3600 * 24 * 1000;
-    var data: [string, number][] = [];
-    for (var time = date; time < end; time += dayTime) {
-        data.push([
-            echarts.format.formatTime('yyyy-MM-dd', time),
-            Math.floor(Math.random() * 10000)
-        ]);
-    }
-    return data;
+  year = year || '2017';
+  var date = +echarts.number.parseDate(year + '-01-01');
+  var end = +echarts.number.parseDate(+year + 1 + '-01-01');
+  var dayTime = 3600 * 24 * 1000;
+  var data: [string, number][] = [];
+  for (var time = date; time < end; time += dayTime) {
+    data.push([
+      echarts.format.formatTime('yyyy-MM-dd', time),
+      Math.floor(Math.random() * 10000)
+    ]);
+  }
+  return data;
 }
 
 option = {
-    title: {
-        top: 30,
-        left: 'center',
-        text: 'Daily Step Count'
+  title: {
+    top: 30,
+    left: 'center',
+    text: 'Daily Step Count'
+  },
+  tooltip: {},
+  visualMap: {
+    min: 0,
+    max: 10000,
+    type: 'piecewise',
+    orient: 'horizontal',
+    left: 'center',
+    top: 65
+  },
+  calendar: {
+    top: 120,
+    left: 30,
+    right: 30,
+    cellSize: ['auto', 13],
+    range: '2016',
+    itemStyle: {
+      borderWidth: 0.5
     },
-    tooltip: {},
-    visualMap: {
-        min: 0,
-        max: 10000,
-        type: 'piecewise',
-        orient: 'horizontal',
-        left: 'center',
-        top: 65
-    },
-    calendar: {
-        top: 120,
-        left: 30,
-        right: 30,
-        cellSize: ['auto', 13],
-        range: '2016',
-        itemStyle: {
-            borderWidth: 0.5
-        },
-        yearLabel: {show: false}
-    },
-    series: {
-        type: 'heatmap',
-        coordinateSystem: 'calendar',
-        data: getVirtulData('2016')
-    }
+    yearLabel: { show: false }
+  },
+  series: {
+    type: 'heatmap',
+    coordinateSystem: 'calendar',
+    data: getVirtulData('2016')
+  }
 };
 
-export {}
\ No newline at end of file
+export {};
diff --git a/public/examples/ts/calendar-horizontal.ts b/public/examples/ts/calendar-horizontal.ts
index c764b97..c0c8f13 100644
--- a/public/examples/ts/calendar-horizontal.ts
+++ b/public/examples/ts/calendar-horizontal.ts
@@ -7,66 +7,69 @@ difficulty: 2
 */
 
 function getVirtulData(year: string) {
-    year = year || '2017';
-    let date = +echarts.number.parseDate(year + '-01-01');
-    let end = +echarts.number.parseDate((+year + 1) + '-01-01');
-    let dayTime = 3600 * 24 * 1000;
-    let data: [string, number][] = [];
-    for (let time = date; time < end; time += dayTime) {
-        data.push([
-            echarts.format.formatTime('yyyy-MM-dd', time),
-            Math.floor(Math.random() * 1000)
-        ]);
-    }
-    return data;
+  year = year || '2017';
+  let date = +echarts.number.parseDate(year + '-01-01');
+  let end = +echarts.number.parseDate(+year + 1 + '-01-01');
+  let dayTime = 3600 * 24 * 1000;
+  let data: [string, number][] = [];
+  for (let time = date; time < end; time += dayTime) {
+    data.push([
+      echarts.format.formatTime('yyyy-MM-dd', time),
+      Math.floor(Math.random() * 1000)
+    ]);
+  }
+  return data;
 }
 
-
-
 option = {
-    tooltip: {
-        position: 'top'
+  tooltip: {
+    position: 'top'
+  },
+  visualMap: {
+    min: 0,
+    max: 1000,
+    calculable: true,
+    orient: 'horizontal',
+    left: 'center',
+    top: 'top'
+  },
+
+  calendar: [
+    {
+      range: '2017',
+      cellSize: ['auto', 20]
     },
-    visualMap: {
-        min: 0,
-        max: 1000,
-        calculable: true,
-        orient: 'horizontal',
-        left: 'center',
-        top: 'top'
+    {
+      top: 260,
+      range: '2016',
+      cellSize: ['auto', 20]
     },
+    {
+      top: 450,
+      range: '2015',
+      cellSize: ['auto', 20],
+      right: 5
+    }
+  ],
 
-    calendar: [{
-        range: '2017',
-        cellSize: ['auto', 20]
+  series: [
+    {
+      type: 'heatmap',
+      coordinateSystem: 'calendar',
+      calendarIndex: 0,
+      data: getVirtulData('2017')
     },
     {
-        top: 260,
-        range: '2016',
-        cellSize: ['auto', 20]
+      type: 'heatmap',
+      coordinateSystem: 'calendar',
+      calendarIndex: 1,
+      data: getVirtulData('2016')
     },
     {
-        top: 450,
-        range: '2015',
-        cellSize: ['auto', 20],
-        right: 5
-    }],
-
-    series: [{
-        type: 'heatmap',
-        coordinateSystem: 'calendar',
-        calendarIndex: 0,
-        data: getVirtulData(2017)
-    }, {
-        type: 'heatmap',
-        coordinateSystem: 'calendar',
-        calendarIndex: 1,
-        data: getVirtulData(2016)
-    }, {
-        type: 'heatmap',
-        coordinateSystem: 'calendar',
-        calendarIndex: 2,
-        data: getVirtulData(2015)
-    }]
-
+      type: 'heatmap',
+      coordinateSystem: 'calendar',
+      calendarIndex: 2,
+      data: getVirtulData('2015')
+    }
+  ]
 };
diff --git a/public/examples/ts/calendar-lunar.ts b/public/examples/ts/calendar-lunar.ts
index ea41f54..7db582a 100644
--- a/public/examples/ts/calendar-lunar.ts
+++ b/public/examples/ts/calendar-lunar.ts
@@ -6,465 +6,462 @@ difficulty: 4
 */
 
 const dateList = [
-    ['2017-1-1', '初四'],
-    ['2017-1-2', '初五'],
-    ['2017-1-3', '初六'],
-    ['2017-1-4', '初七'],
-    ['2017-1-5', '初八', '小寒'],
-    ['2017-1-6', '初九'],
-    ['2017-1-7', '初十'],
-    ['2017-1-8', '十一'],
-    ['2017-1-9', '十二'],
-    ['2017-1-10', '十三'],
-    ['2017-1-11', '十四'],
-    ['2017-1-12', '十五'],
-    ['2017-1-13', '十六'],
-    ['2017-1-14', '十七'],
-    ['2017-1-15', '十八'],
-    ['2017-1-16', '十九'],
-    ['2017-1-17', '二十'],
-    ['2017-1-18', '廿一'],
-    ['2017-1-19', '廿二'],
-    ['2017-1-20', '廿三', '大寒'],
-    ['2017-1-21', '廿四'],
-    ['2017-1-22', '廿五'],
-    ['2017-1-23', '廿六'],
-    ['2017-1-24', '廿七'],
-    ['2017-1-25', '廿八'],
-    ['2017-1-26', '廿九'],
-    ['2017-1-27', '三十'],
-    ['2017-1-28', '正月'],
-    ['2017-1-29', '初二'],
-    ['2017-1-30', '初三'],
-    ['2017-1-31', '初四'],
-    ['2017-2-1', '初五'],
-    ['2017-2-2', '初六'],
-    ['2017-2-3', '初七', '立春'],
-    ['2017-2-4', '初八'],
-    ['2017-2-5', '初九'],
-    ['2017-2-6', '初十'],
-    ['2017-2-7', '十一'],
-    ['2017-2-8', '十二'],
-    ['2017-2-9', '十三'],
-    ['2017-2-10', '十四'],
-    ['2017-2-11', '十五'],
-    ['2017-2-12', '十六'],
-    ['2017-2-13', '十七'],
-    ['2017-2-14', '十八'],
-    ['2017-2-15', '十九'],
-    ['2017-2-16', '二十'],
-    ['2017-2-17', '廿一'],
-    ['2017-2-18', '廿二', '雨水'],
-    ['2017-2-19', '廿三'],
-    ['2017-2-20', '廿四'],
-    ['2017-2-21', '廿五'],
-    ['2017-2-22', '廿六'],
-    ['2017-2-23', '廿七'],
-    ['2017-2-24', '廿八'],
-    ['2017-2-25', '廿九'],
-    ['2017-2-26', '二月'],
-    ['2017-2-27', '初二'],
-    ['2017-2-28', '初三'],
-    ['2017-3-1', '初四'],
-    ['2017-3-2', '初五'],
-    ['2017-3-3', '初六'],
-    ['2017-3-4', '初七'],
-    ['2017-3-5', '初八', '驚蟄'],
-    ['2017-3-6', '初九'],
-    ['2017-3-7', '初十'],
-    ['2017-3-8', '十一'],
-    ['2017-3-9', '十二'],
-    ['2017-3-10', '十三'],
-    ['2017-3-11', '十四'],
-    ['2017-3-12', '十五'],
-    ['2017-3-13', '十六'],
-    ['2017-3-14', '十七'],
-    ['2017-3-15', '十八'],
-    ['2017-3-16', '十九'],
-    ['2017-3-17', '二十'],
-    ['2017-3-18', '廿一'],
-    ['2017-3-19', '廿二'],
-    ['2017-3-20', '廿三', '春分'],
-    ['2017-3-21', '廿四'],
-    ['2017-3-22', '廿五'],
-    ['2017-3-23', '廿六'],
-    ['2017-3-24', '廿七'],
-    ['2017-3-25', '廿八'],
-    ['2017-3-26', '廿九'],
-    ['2017-3-27', '三十'],
-    ['2017-3-28', '三月'],
-    ['2017-3-29', '初二'],
-    ['2017-3-30', '初三'],
-    ['2017-3-31', '初四'],
-    ['2017-4-1', '初五'],
-    ['2017-4-2', '初六'],
-    ['2017-4-3', '初七'],
-    ['2017-4-4', '初八', '清明'],
-    ['2017-4-5', '初九'],
-    ['2017-4-6', '初十'],
-    ['2017-4-7', '十一'],
-    ['2017-4-8', '十二'],
-    ['2017-4-9', '十三'],
-    ['2017-4-10', '十四'],
-    ['2017-4-11', '十五'],
-    ['2017-4-12', '十六'],
-    ['2017-4-13', '十七'],
-    ['2017-4-14', '十八'],
-    ['2017-4-15', '十九'],
-    ['2017-4-16', '二十'],
-    ['2017-4-17', '廿一'],
-    ['2017-4-18', '廿二'],
-    ['2017-4-19', '廿三'],
-    ['2017-4-20', '廿四', '穀雨'],
-    ['2017-4-21', '廿五'],
-    ['2017-4-22', '廿六'],
-    ['2017-4-23', '廿七'],
-    ['2017-4-24', '廿八'],
-    ['2017-4-25', '廿九'],
-    ['2017-4-26', '四月'],
-    ['2017-4-27', '初二'],
-    ['2017-4-28', '初三'],
-    ['2017-4-29', '初四'],
-    ['2017-4-30', '初五'],
-    ['2017-5-1', '初六'],
-    ['2017-5-2', '初七'],
-    ['2017-5-3', '初八'],
-    ['2017-5-4', '初九'],
-    ['2017-5-5', '初十', '立夏'],
-    ['2017-5-6', '十一'],
-    ['2017-5-7', '十二'],
-    ['2017-5-8', '十三'],
-    ['2017-5-9', '十四'],
-    ['2017-5-10', '十五'],
-    ['2017-5-11', '十六'],
-    ['2017-5-12', '十七'],
-    ['2017-5-13', '十八'],
-    ['2017-5-14', '十九'],
-    ['2017-5-15', '二十'],
-    ['2017-5-16', '廿一'],
-    ['2017-5-17', '廿二'],
-    ['2017-5-18', '廿三'],
-    ['2017-5-19', '廿四'],
-    ['2017-5-20', '廿五'],
-    ['2017-5-21', '廿六', '小滿'],
-    ['2017-5-22', '廿七'],
-    ['2017-5-23', '廿八'],
-    ['2017-5-24', '廿九'],
-    ['2017-5-25', '三十'],
-    ['2017-5-26', '五月'],
-    ['2017-5-27', '初二'],
-    ['2017-5-28', '初三'],
-    ['2017-5-29', '初四'],
-    ['2017-5-30', '初五'],
-    ['2017-5-31', '初六'],
-    ['2017-6-1', '初七'],
-    ['2017-6-2', '初八'],
-    ['2017-6-3', '初九'],
-    ['2017-6-4', '初十'],
-    ['2017-6-5', '十一', '芒種'],
-    ['2017-6-6', '十二'],
-    ['2017-6-7', '十三'],
-    ['2017-6-8', '十四'],
-    ['2017-6-9', '十五'],
-    ['2017-6-10', '十六'],
-    ['2017-6-11', '十七'],
-    ['2017-6-12', '十八'],
-    ['2017-6-13', '十九'],
-    ['2017-6-14', '二十'],
-    ['2017-6-15', '廿一'],
-    ['2017-6-16', '廿二'],
-    ['2017-6-17', '廿三'],
-    ['2017-6-18', '廿四'],
-    ['2017-6-19', '廿五'],
-    ['2017-6-20', '廿六'],
-    ['2017-6-21', '廿七', '夏至'],
-    ['2017-6-22', '廿八'],
-    ['2017-6-23', '廿九'],
-    ['2017-6-24', '六月'],
-    ['2017-6-25', '初二'],
-    ['2017-6-26', '初三'],
-    ['2017-6-27', '初四'],
-    ['2017-6-28', '初五'],
-    ['2017-6-29', '初六'],
-    ['2017-6-30', '初七'],
-    ['2017-7-1', '初八'],
-    ['2017-7-2', '初九'],
-    ['2017-7-3', '初十'],
-    ['2017-7-4', '十一'],
-    ['2017-7-5', '十二'],
-    ['2017-7-6', '十三'],
-    ['2017-7-7', '十四', '小暑'],
-    ['2017-7-8', '十五'],
-    ['2017-7-9', '十六'],
-    ['2017-7-10', '十七'],
-    ['2017-7-11', '十八'],
-    ['2017-7-12', '十九'],
-    ['2017-7-13', '二十'],
-    ['2017-7-14', '廿一'],
-    ['2017-7-15', '廿二'],
-    ['2017-7-16', '廿三'],
-    ['2017-7-17', '廿四'],
-    ['2017-7-18', '廿五'],
-    ['2017-7-19', '廿六'],
-    ['2017-7-20', '廿七'],
-    ['2017-7-21', '廿八'],
-    ['2017-7-22', '廿九', '大暑'],
-    ['2017-7-23', '閏六',],
-    ['2017-7-24', '初二'],
-    ['2017-7-25', '初三'],
-    ['2017-7-26', '初四'],
-    ['2017-7-27', '初五'],
-    ['2017-7-28', '初六'],
-    ['2017-7-29', '初七'],
-    ['2017-7-30', '初八'],
-    ['2017-7-31', '初九'],
-    ['2017-8-1', '初十'],
-    ['2017-8-2', '十一'],
-    ['2017-8-3', '十二'],
-    ['2017-8-4', '十三'],
-    ['2017-8-5', '十四'],
-    ['2017-8-6', '十五'],
-    ['2017-8-7', '十六', '立秋'],
-    ['2017-8-8', '十七'],
-    ['2017-8-9', '十八'],
-    ['2017-8-10', '十九'],
-    ['2017-8-11', '二十'],
-    ['2017-8-12', '廿一'],
-    ['2017-8-13', '廿二'],
-    ['2017-8-14', '廿三'],
-    ['2017-8-15', '廿四'],
-    ['2017-8-16', '廿五'],
-    ['2017-8-17', '廿六'],
-    ['2017-8-18', '廿七'],
-    ['2017-8-19', '廿八'],
-    ['2017-8-20', '廿九'],
-    ['2017-8-21', '三十'],
-    ['2017-8-22', '七月'],
-    ['2017-8-23', '初二', '處暑'],
-    ['2017-8-24', '初三'],
-    ['2017-8-25', '初四'],
-    ['2017-8-26', '初五'],
-    ['2017-8-27', '初六'],
-    ['2017-8-28', '初七'],
-    ['2017-8-29', '初八'],
-    ['2017-8-30', '初九'],
-    ['2017-8-31', '初十'],
-    ['2017-9-1', '十一'],
-    ['2017-9-2', '十二'],
-    ['2017-9-3', '十三'],
-    ['2017-9-4', '十四'],
-    ['2017-9-5', '十五'],
-    ['2017-9-6', '十六'],
-    ['2017-9-7', '十七', '白露'],
-    ['2017-9-8', '十八'],
-    ['2017-9-9', '十九'],
-    ['2017-9-10', '二十'],
-    ['2017-9-11', '廿一'],
-    ['2017-9-12', '廿二'],
-    ['2017-9-13', '廿三'],
-    ['2017-9-14', '廿四'],
-    ['2017-9-15', '廿五'],
-    ['2017-9-16', '廿六'],
-    ['2017-9-17', '廿七'],
-    ['2017-9-18', '廿八'],
-    ['2017-9-19', '廿九'],
-    ['2017-9-20', '八月'],
-    ['2017-9-21', '初二'],
-    ['2017-9-22', '初三'],
-    ['2017-9-23', '初四', '秋分'],
-    ['2017-9-24', '初五'],
-    ['2017-9-25', '初六'],
-    ['2017-9-26', '初七'],
-    ['2017-9-27', '初八'],
-    ['2017-9-28', '初九'],
-    ['2017-9-29', '初十'],
-    ['2017-9-30', '十一'],
-    ['2017-10-1', '十二'],
-    ['2017-10-2', '十三'],
-    ['2017-10-3', '十四'],
-    ['2017-10-4', '十五'],
-    ['2017-10-5', '十六'],
-    ['2017-10-6', '十七'],
-    ['2017-10-7', '十八'],
-    ['2017-10-8', '十九', '寒露'],
-    ['2017-10-9', '二十'],
-    ['2017-10-10', '廿一'],
-    ['2017-10-11', '廿二'],
-    ['2017-10-12', '廿三'],
-    ['2017-10-13', '廿四'],
-    ['2017-10-14', '廿五'],
-    ['2017-10-15', '廿六'],
-    ['2017-10-16', '廿七'],
-    ['2017-10-17', '廿八'],
-    ['2017-10-18', '廿九'],
-    ['2017-10-19', '三十'],
-    ['2017-10-20', '九月'],
-    ['2017-10-21', '初二'],
-    ['2017-10-22', '初三'],
-    ['2017-10-23', '初四', '霜降'],
-    ['2017-10-24', '初五'],
-    ['2017-10-25', '初六'],
-    ['2017-10-26', '初七'],
-    ['2017-10-27', '初八'],
-    ['2017-10-28', '初九'],
-    ['2017-10-29', '初十'],
-    ['2017-10-30', '十一'],
-    ['2017-10-31', '十二'],
-    ['2017-11-1', '十三'],
-    ['2017-11-2', '十四'],
-    ['2017-11-3', '十五'],
-    ['2017-11-4', '十六'],
-    ['2017-11-5', '十七'],
-    ['2017-11-6', '十八'],
-    ['2017-11-7', '十九', '立冬'],
-    ['2017-11-8', '二十'],
-    ['2017-11-9', '廿一'],
-    ['2017-11-10', '廿二'],
-    ['2017-11-11', '廿三'],
-    ['2017-11-12', '廿四'],
-    ['2017-11-13', '廿五'],
-    ['2017-11-14', '廿六'],
-    ['2017-11-15', '廿七'],
-    ['2017-11-16', '廿八'],
-    ['2017-11-17', '廿九'],
-    ['2017-11-18', '十月'],
-    ['2017-11-19', '初二'],
-    ['2017-11-20', '初三'],
-    ['2017-11-21', '初四'],
-    ['2017-11-22', '初五', '小雪'],
-    ['2017-11-23', '初六'],
-    ['2017-11-24', '初七'],
-    ['2017-11-25', '初八'],
-    ['2017-11-26', '初九'],
-    ['2017-11-27', '初十'],
-    ['2017-11-28', '十一'],
-    ['2017-11-29', '十二'],
-    ['2017-11-30', '十三'],
-    ['2017-12-1', '十四'],
-    ['2017-12-2', '十五'],
-    ['2017-12-3', '十六'],
-    ['2017-12-4', '十七'],
-    ['2017-12-5', '十八'],
-    ['2017-12-6', '十九'],
-    ['2017-12-7', '二十', '大雪'],
-    ['2017-12-8', '廿一'],
-    ['2017-12-9', '廿二'],
-    ['2017-12-10', '廿三'],
-    ['2017-12-11', '廿四'],
-    ['2017-12-12', '廿五'],
-    ['2017-12-13', '廿六'],
-    ['2017-12-14', '廿七'],
-    ['2017-12-15', '廿八'],
-    ['2017-12-16', '廿九'],
-    ['2017-12-17', '三十'],
-    ['2017-12-18', '十一月'],
-    ['2017-12-19', '初二'],
-    ['2017-12-20', '初三'],
-    ['2017-12-21', '初四'],
-    ['2017-12-22', '初五', '冬至'],
-    ['2017-12-23', '初六'],
-    ['2017-12-24', '初七'],
-    ['2017-12-25', '初八'],
-    ['2017-12-26', '初九'],
-    ['2017-12-27', '初十'],
-    ['2017-12-28', '十一'],
-    ['2017-12-29', '十二'],
-    ['2017-12-30', '十三'],
-    ['2017-12-31', '十四']
+  ['2017-1-1', '初四'],
+  ['2017-1-2', '初五'],
+  ['2017-1-3', '初六'],
+  ['2017-1-4', '初七'],
+  ['2017-1-5', '初八', '小寒'],
+  ['2017-1-6', '初九'],
+  ['2017-1-7', '初十'],
+  ['2017-1-8', '十一'],
+  ['2017-1-9', '十二'],
+  ['2017-1-10', '十三'],
+  ['2017-1-11', '十四'],
+  ['2017-1-12', '十五'],
+  ['2017-1-13', '十六'],
+  ['2017-1-14', '十七'],
+  ['2017-1-15', '十八'],
+  ['2017-1-16', '十九'],
+  ['2017-1-17', '二十'],
+  ['2017-1-18', '廿一'],
+  ['2017-1-19', '廿二'],
+  ['2017-1-20', '廿三', '大寒'],
+  ['2017-1-21', '廿四'],
+  ['2017-1-22', '廿五'],
+  ['2017-1-23', '廿六'],
+  ['2017-1-24', '廿七'],
+  ['2017-1-25', '廿八'],
+  ['2017-1-26', '廿九'],
+  ['2017-1-27', '三十'],
+  ['2017-1-28', '正月'],
+  ['2017-1-29', '初二'],
+  ['2017-1-30', '初三'],
+  ['2017-1-31', '初四'],
+  ['2017-2-1', '初五'],
+  ['2017-2-2', '初六'],
+  ['2017-2-3', '初七', '立春'],
+  ['2017-2-4', '初八'],
+  ['2017-2-5', '初九'],
+  ['2017-2-6', '初十'],
+  ['2017-2-7', '十一'],
+  ['2017-2-8', '十二'],
+  ['2017-2-9', '十三'],
+  ['2017-2-10', '十四'],
+  ['2017-2-11', '十五'],
+  ['2017-2-12', '十六'],
+  ['2017-2-13', '十七'],
+  ['2017-2-14', '十八'],
+  ['2017-2-15', '十九'],
+  ['2017-2-16', '二十'],
+  ['2017-2-17', '廿一'],
+  ['2017-2-18', '廿二', '雨水'],
+  ['2017-2-19', '廿三'],
+  ['2017-2-20', '廿四'],
+  ['2017-2-21', '廿五'],
+  ['2017-2-22', '廿六'],
+  ['2017-2-23', '廿七'],
+  ['2017-2-24', '廿八'],
+  ['2017-2-25', '廿九'],
+  ['2017-2-26', '二月'],
+  ['2017-2-27', '初二'],
+  ['2017-2-28', '初三'],
+  ['2017-3-1', '初四'],
+  ['2017-3-2', '初五'],
+  ['2017-3-3', '初六'],
+  ['2017-3-4', '初七'],
+  ['2017-3-5', '初八', '驚蟄'],
+  ['2017-3-6', '初九'],
+  ['2017-3-7', '初十'],
+  ['2017-3-8', '十一'],
+  ['2017-3-9', '十二'],
+  ['2017-3-10', '十三'],
+  ['2017-3-11', '十四'],
+  ['2017-3-12', '十五'],
+  ['2017-3-13', '十六'],
+  ['2017-3-14', '十七'],
+  ['2017-3-15', '十八'],
+  ['2017-3-16', '十九'],
+  ['2017-3-17', '二十'],
+  ['2017-3-18', '廿一'],
+  ['2017-3-19', '廿二'],
+  ['2017-3-20', '廿三', '春分'],
+  ['2017-3-21', '廿四'],
+  ['2017-3-22', '廿五'],
+  ['2017-3-23', '廿六'],
+  ['2017-3-24', '廿七'],
+  ['2017-3-25', '廿八'],
+  ['2017-3-26', '廿九'],
+  ['2017-3-27', '三十'],
+  ['2017-3-28', '三月'],
+  ['2017-3-29', '初二'],
+  ['2017-3-30', '初三'],
+  ['2017-3-31', '初四'],
+  ['2017-4-1', '初五'],
+  ['2017-4-2', '初六'],
+  ['2017-4-3', '初七'],
+  ['2017-4-4', '初八', '清明'],
+  ['2017-4-5', '初九'],
+  ['2017-4-6', '初十'],
+  ['2017-4-7', '十一'],
+  ['2017-4-8', '十二'],
+  ['2017-4-9', '十三'],
+  ['2017-4-10', '十四'],
+  ['2017-4-11', '十五'],
+  ['2017-4-12', '十六'],
+  ['2017-4-13', '十七'],
+  ['2017-4-14', '十八'],
+  ['2017-4-15', '十九'],
+  ['2017-4-16', '二十'],
+  ['2017-4-17', '廿一'],
+  ['2017-4-18', '廿二'],
+  ['2017-4-19', '廿三'],
+  ['2017-4-20', '廿四', '穀雨'],
+  ['2017-4-21', '廿五'],
+  ['2017-4-22', '廿六'],
+  ['2017-4-23', '廿七'],
+  ['2017-4-24', '廿八'],
+  ['2017-4-25', '廿九'],
+  ['2017-4-26', '四月'],
+  ['2017-4-27', '初二'],
+  ['2017-4-28', '初三'],
+  ['2017-4-29', '初四'],
+  ['2017-4-30', '初五'],
+  ['2017-5-1', '初六'],
+  ['2017-5-2', '初七'],
+  ['2017-5-3', '初八'],
+  ['2017-5-4', '初九'],
+  ['2017-5-5', '初十', '立夏'],
+  ['2017-5-6', '十一'],
+  ['2017-5-7', '十二'],
+  ['2017-5-8', '十三'],
+  ['2017-5-9', '十四'],
+  ['2017-5-10', '十五'],
+  ['2017-5-11', '十六'],
+  ['2017-5-12', '十七'],
+  ['2017-5-13', '十八'],
+  ['2017-5-14', '十九'],
+  ['2017-5-15', '二十'],
+  ['2017-5-16', '廿一'],
+  ['2017-5-17', '廿二'],
+  ['2017-5-18', '廿三'],
+  ['2017-5-19', '廿四'],
+  ['2017-5-20', '廿五'],
+  ['2017-5-21', '廿六', '小滿'],
+  ['2017-5-22', '廿七'],
+  ['2017-5-23', '廿八'],
+  ['2017-5-24', '廿九'],
+  ['2017-5-25', '三十'],
+  ['2017-5-26', '五月'],
+  ['2017-5-27', '初二'],
+  ['2017-5-28', '初三'],
+  ['2017-5-29', '初四'],
+  ['2017-5-30', '初五'],
+  ['2017-5-31', '初六'],
+  ['2017-6-1', '初七'],
+  ['2017-6-2', '初八'],
+  ['2017-6-3', '初九'],
+  ['2017-6-4', '初十'],
+  ['2017-6-5', '十一', '芒種'],
+  ['2017-6-6', '十二'],
+  ['2017-6-7', '十三'],
+  ['2017-6-8', '十四'],
+  ['2017-6-9', '十五'],
+  ['2017-6-10', '十六'],
+  ['2017-6-11', '十七'],
+  ['2017-6-12', '十八'],
+  ['2017-6-13', '十九'],
+  ['2017-6-14', '二十'],
+  ['2017-6-15', '廿一'],
+  ['2017-6-16', '廿二'],
+  ['2017-6-17', '廿三'],
+  ['2017-6-18', '廿四'],
+  ['2017-6-19', '廿五'],
+  ['2017-6-20', '廿六'],
+  ['2017-6-21', '廿七', '夏至'],
+  ['2017-6-22', '廿八'],
+  ['2017-6-23', '廿九'],
+  ['2017-6-24', '六月'],
+  ['2017-6-25', '初二'],
+  ['2017-6-26', '初三'],
+  ['2017-6-27', '初四'],
+  ['2017-6-28', '初五'],
+  ['2017-6-29', '初六'],
+  ['2017-6-30', '初七'],
+  ['2017-7-1', '初八'],
+  ['2017-7-2', '初九'],
+  ['2017-7-3', '初十'],
+  ['2017-7-4', '十一'],
+  ['2017-7-5', '十二'],
+  ['2017-7-6', '十三'],
+  ['2017-7-7', '十四', '小暑'],
+  ['2017-7-8', '十五'],
+  ['2017-7-9', '十六'],
+  ['2017-7-10', '十七'],
+  ['2017-7-11', '十八'],
+  ['2017-7-12', '十九'],
+  ['2017-7-13', '二十'],
+  ['2017-7-14', '廿一'],
+  ['2017-7-15', '廿二'],
+  ['2017-7-16', '廿三'],
+  ['2017-7-17', '廿四'],
+  ['2017-7-18', '廿五'],
+  ['2017-7-19', '廿六'],
+  ['2017-7-20', '廿七'],
+  ['2017-7-21', '廿八'],
+  ['2017-7-22', '廿九', '大暑'],
+  ['2017-7-23', '閏六'],
+  ['2017-7-24', '初二'],
+  ['2017-7-25', '初三'],
+  ['2017-7-26', '初四'],
+  ['2017-7-27', '初五'],
+  ['2017-7-28', '初六'],
+  ['2017-7-29', '初七'],
+  ['2017-7-30', '初八'],
+  ['2017-7-31', '初九'],
+  ['2017-8-1', '初十'],
+  ['2017-8-2', '十一'],
+  ['2017-8-3', '十二'],
+  ['2017-8-4', '十三'],
+  ['2017-8-5', '十四'],
+  ['2017-8-6', '十五'],
+  ['2017-8-7', '十六', '立秋'],
+  ['2017-8-8', '十七'],
+  ['2017-8-9', '十八'],
+  ['2017-8-10', '十九'],
+  ['2017-8-11', '二十'],
+  ['2017-8-12', '廿一'],
+  ['2017-8-13', '廿二'],
+  ['2017-8-14', '廿三'],
+  ['2017-8-15', '廿四'],
+  ['2017-8-16', '廿五'],
+  ['2017-8-17', '廿六'],
+  ['2017-8-18', '廿七'],
+  ['2017-8-19', '廿八'],
+  ['2017-8-20', '廿九'],
+  ['2017-8-21', '三十'],
+  ['2017-8-22', '七月'],
+  ['2017-8-23', '初二', '處暑'],
+  ['2017-8-24', '初三'],
+  ['2017-8-25', '初四'],
+  ['2017-8-26', '初五'],
+  ['2017-8-27', '初六'],
+  ['2017-8-28', '初七'],
+  ['2017-8-29', '初八'],
+  ['2017-8-30', '初九'],
+  ['2017-8-31', '初十'],
+  ['2017-9-1', '十一'],
+  ['2017-9-2', '十二'],
+  ['2017-9-3', '十三'],
+  ['2017-9-4', '十四'],
+  ['2017-9-5', '十五'],
+  ['2017-9-6', '十六'],
+  ['2017-9-7', '十七', '白露'],
+  ['2017-9-8', '十八'],
+  ['2017-9-9', '十九'],
+  ['2017-9-10', '二十'],
+  ['2017-9-11', '廿一'],
+  ['2017-9-12', '廿二'],
+  ['2017-9-13', '廿三'],
+  ['2017-9-14', '廿四'],
+  ['2017-9-15', '廿五'],
+  ['2017-9-16', '廿六'],
+  ['2017-9-17', '廿七'],
+  ['2017-9-18', '廿八'],
+  ['2017-9-19', '廿九'],
+  ['2017-9-20', '八月'],
+  ['2017-9-21', '初二'],
+  ['2017-9-22', '初三'],
+  ['2017-9-23', '初四', '秋分'],
+  ['2017-9-24', '初五'],
+  ['2017-9-25', '初六'],
+  ['2017-9-26', '初七'],
+  ['2017-9-27', '初八'],
+  ['2017-9-28', '初九'],
+  ['2017-9-29', '初十'],
+  ['2017-9-30', '十一'],
+  ['2017-10-1', '十二'],
+  ['2017-10-2', '十三'],
+  ['2017-10-3', '十四'],
+  ['2017-10-4', '十五'],
+  ['2017-10-5', '十六'],
+  ['2017-10-6', '十七'],
+  ['2017-10-7', '十八'],
+  ['2017-10-8', '十九', '寒露'],
+  ['2017-10-9', '二十'],
+  ['2017-10-10', '廿一'],
+  ['2017-10-11', '廿二'],
+  ['2017-10-12', '廿三'],
+  ['2017-10-13', '廿四'],
+  ['2017-10-14', '廿五'],
+  ['2017-10-15', '廿六'],
+  ['2017-10-16', '廿七'],
+  ['2017-10-17', '廿八'],
+  ['2017-10-18', '廿九'],
+  ['2017-10-19', '三十'],
+  ['2017-10-20', '九月'],
+  ['2017-10-21', '初二'],
+  ['2017-10-22', '初三'],
+  ['2017-10-23', '初四', '霜降'],
+  ['2017-10-24', '初五'],
+  ['2017-10-25', '初六'],
+  ['2017-10-26', '初七'],
+  ['2017-10-27', '初八'],
+  ['2017-10-28', '初九'],
+  ['2017-10-29', '初十'],
+  ['2017-10-30', '十一'],
+  ['2017-10-31', '十二'],
+  ['2017-11-1', '十三'],
+  ['2017-11-2', '十四'],
+  ['2017-11-3', '十五'],
+  ['2017-11-4', '十六'],
+  ['2017-11-5', '十七'],
+  ['2017-11-6', '十八'],
+  ['2017-11-7', '十九', '立冬'],
+  ['2017-11-8', '二十'],
+  ['2017-11-9', '廿一'],
+  ['2017-11-10', '廿二'],
+  ['2017-11-11', '廿三'],
+  ['2017-11-12', '廿四'],
+  ['2017-11-13', '廿五'],
+  ['2017-11-14', '廿六'],
+  ['2017-11-15', '廿七'],
+  ['2017-11-16', '廿八'],
+  ['2017-11-17', '廿九'],
+  ['2017-11-18', '十月'],
+  ['2017-11-19', '初二'],
+  ['2017-11-20', '初三'],
+  ['2017-11-21', '初四'],
+  ['2017-11-22', '初五', '小雪'],
+  ['2017-11-23', '初六'],
+  ['2017-11-24', '初七'],
+  ['2017-11-25', '初八'],
+  ['2017-11-26', '初九'],
+  ['2017-11-27', '初十'],
+  ['2017-11-28', '十一'],
+  ['2017-11-29', '十二'],
+  ['2017-11-30', '十三'],
+  ['2017-12-1', '十四'],
+  ['2017-12-2', '十五'],
+  ['2017-12-3', '十六'],
+  ['2017-12-4', '十七'],
+  ['2017-12-5', '十八'],
+  ['2017-12-6', '十九'],
+  ['2017-12-7', '二十', '大雪'],
+  ['2017-12-8', '廿一'],
+  ['2017-12-9', '廿二'],
+  ['2017-12-10', '廿三'],
+  ['2017-12-11', '廿四'],
+  ['2017-12-12', '廿五'],
+  ['2017-12-13', '廿六'],
+  ['2017-12-14', '廿七'],
+  ['2017-12-15', '廿八'],
+  ['2017-12-16', '廿九'],
+  ['2017-12-17', '三十'],
+  ['2017-12-18', '十一月'],
+  ['2017-12-19', '初二'],
+  ['2017-12-20', '初三'],
+  ['2017-12-21', '初四'],
+  ['2017-12-22', '初五', '冬至'],
+  ['2017-12-23', '初六'],
+  ['2017-12-24', '初七'],
+  ['2017-12-25', '初八'],
+  ['2017-12-26', '初九'],
+  ['2017-12-27', '初十'],
+  ['2017-12-28', '十一'],
+  ['2017-12-29', '十二'],
+  ['2017-12-30', '十三'],
+  ['2017-12-31', '十四']
 ];
 
 let heatmapData = [];
 let lunarData = [];
 for (let i = 0; i < dateList.length; i++) {
-    heatmapData.push([
-        dateList[i][0],
-        Math.random() * 300
-    ]);
-    lunarData.push([
-        dateList[i][0],
-        1,
-        dateList[i][1],
-        dateList[i][2]
-    ]);
+  heatmapData.push([dateList[i][0], Math.random() * 300]);
+  lunarData.push([dateList[i][0], 1, dateList[i][1], dateList[i][2]]);
 }
 
-
 option = {
-    tooltip: {
-        formatter: function (params) {
-            return '降雨量: ' + params.value[1].toFixed(2);
-        }
-    },
+  tooltip: {
+    formatter: function (params: any) {
+      return '降雨量: ' + params.value[1].toFixed(2);
+    }
+  },
 
-    visualMap: {
-        show: false,
-        min: 0,
-        max: 300,
-        calculable: true,
-        seriesIndex: [2],
-        orient: 'horizontal',
-        left: 'center',
-        bottom: 20,
-        inRange: {
-            color: ['#e0ffff', '#006edd'],
-            opacity: 0.3
-        },
-        controller: {
-            inRange: {
-                opacity: 0.5
-            }
-        }
+  visualMap: {
+    show: false,
+    min: 0,
+    max: 300,
+    calculable: true,
+    seriesIndex: [2],
+    orient: 'horizontal',
+    left: 'center',
+    bottom: 20,
+    inRange: {
+      color: ['#e0ffff', '#006edd'],
+      opacity: 0.3
     },
+    controller: {
+      inRange: {
+        opacity: 0.5
+      }
+    }
+  },
 
-    calendar: [{
-        left: 'center',
-        top: 'middle',
-        cellSize: [70, 70],
-        yearLabel: {show: false},
-        orient: 'vertical',
-        dayLabel: {
-            firstDay: 1,
-            nameMap: 'cn'
-        },
-        monthLabel: {
-            show: false
-        },
-        range: '2017-03'
-    }],
+  calendar: [
+    {
+      left: 'center',
+      top: 'middle',
+      cellSize: [70, 70],
+      yearLabel: { show: false },
+      orient: 'vertical',
+      dayLabel: {
+        firstDay: 1,
+        nameMap: 'cn'
+      },
+      monthLabel: {
+        show: false
+      },
+      range: '2017-03'
+    }
+  ],
 
-    series: [{
-        type: 'scatter',
-        coordinateSystem: 'calendar',
-        symbolSize: 1,
-        label: {
-            show: true,
-            formatter: function (params) {
-                var d = echarts.number.parseDate(params.value[0]);
-                return d.getDate() + '\n\n' + params.value[2] + '\n\n';
-            },
-            color: '#000'
+  series: [
+    {
+      type: 'scatter',
+      coordinateSystem: 'calendar',
+      symbolSize: 1,
+      label: {
+        show: true,
+        formatter: function (params: any) {
+          var d = echarts.number.parseDate(params.value[0]);
+          return d.getDate() + '\n\n' + params.value[2] + '\n\n';
         },
-        data: lunarData
-    }, {
-        type: 'scatter',
-        coordinateSystem: 'calendar',
-        symbolSize: 1,
-        label: {
-            show: true,
-            formatter: function (params) {
-                return '\n\n\n' + (params.value[3] || '');
-            },
-            fontSize: 14,
-            fontWeight: 700,
-            color: '#a00'
+        color: '#000'
+      },
+      data: lunarData
+    },
+    {
+      type: 'scatter',
+      coordinateSystem: 'calendar',
+      symbolSize: 1,
+      label: {
+        show: true,
+        formatter: function (params: any) {
+          return '\n\n\n' + (params.value[3] || '');
         },
-        data: lunarData
-    }, {
-        name: '降雨量',
-        type: 'heatmap',
-        coordinateSystem: 'calendar',
-        data: heatmapData
-    }]
+        fontSize: 14,
+        fontWeight: 700,
+        color: '#a00'
+      },
+      data: lunarData
+    },
+    {
+      name: '降雨量',
+      type: 'heatmap',
+      coordinateSystem: 'calendar',
+      data: heatmapData
+    }
+  ]
 };
 
-export {}
\ No newline at end of file
+export {};
diff --git a/public/examples/ts/calendar-pie.ts b/public/examples/ts/calendar-pie.ts
index fef76b3..02458bb 100644
--- a/public/examples/ts/calendar-pie.ts
+++ b/public/examples/ts/calendar-pie.ts
@@ -11,110 +11,116 @@ const pieRadius = 30;
 type DataItem = [string, number];
 
 function getVirtulData() {
-    let date = +echarts.number.parseDate('2017-02-01');
-    let end = +echarts.number.parseDate('2017-03-01');
-    let dayTime = 3600 * 24 * 1000;
-    let data: DataItem[] = [];
-    for (let time = date; time < end; time += dayTime) {
-        data.push([
-            echarts.format.formatTime('yyyy-MM-dd', time),
-            Math.floor(Math.random() * 10000)
-        ]);
-    }
-    return data;
+  let date = +echarts.number.parseDate('2017-02-01');
+  let end = +echarts.number.parseDate('2017-03-01');
+  let dayTime = 3600 * 24 * 1000;
+  let data: DataItem[] = [];
+  for (let time = date; time < end; time += dayTime) {
+    data.push([
+      echarts.format.formatTime('yyyy-MM-dd', time),
+      Math.floor(Math.random() * 10000)
+    ]);
+  }
+  return data;
 }
 
-function getPieSeries(scatterData: DataItem[], chart: echarts.ECharts) {
-    return scatterData.map(function (item, index) {
-        var center = chart.convertToPixel('calendar', item);
-        return {
-            id: index + 'pie',
-            type: 'pie',
-            center: center,
-            label: {
-                normal: {
-                    formatter: '{c}',
-                    position: 'inside'
-                }
-            },
-            radius: pieRadius,
-            data: [
-                {name: '工作', value: Math.round(Math.random() * 24)},
-                {name: '娱乐', value: Math.round(Math.random() * 24)},
-                {name: '睡觉', value: Math.round(Math.random() * 24)}
-            ]
-        };
-    });
+function getPieSeries(
+  scatterData: DataItem[],
+  chart: echarts.ECharts
+): echarts.PieSeriesOption[] {
+  return scatterData.map(function (item, index) {
+    var center = chart.convertToPixel('calendar', item);
+    return {
+      id: index + 'pie',
+      type: 'pie',
+      center: center,
+      label: {
+        formatter: '{c}',
+        position: 'inside'
+      },
+      radius: pieRadius,
+      data: [
+        { name: '工作', value: Math.round(Math.random() * 24) },
+        { name: '娱乐', value: Math.round(Math.random() * 24) },
+        { name: '睡觉', value: Math.round(Math.random() * 24) }
+      ]
+    };
+  });
 }
 
-function getPieSeriesUpdate(scatterData: DataItem[], chart: echarts.ECharts) {
-    return scatterData.map(function (item, index) {
-        var center = chart.convertToPixel('calendar', item);
-        return {
-            id: index + 'pie',
-            center: center
-        };
-    });
+function getPieSeriesUpdate(
+  scatterData: DataItem[],
+  chart: echarts.ECharts
+): echarts.PieSeriesOption[] {
+  return scatterData.map(function (item, index) {
+    var center = chart.convertToPixel('calendar', item);
+    return {
+      id: index + 'pie',
+      center: center
+    };
+  });
 }
 
 var scatterData = getVirtulData();
 
 option = {
-    tooltip : {},
-    legend: {
-        data: ['Work', 'Entertainment', 'Sleep'],
-        bottom: 20
+  tooltip: {},
+  legend: {
+    data: ['Work', 'Entertainment', 'Sleep'],
+    bottom: 20
+  },
+  calendar: {
+    top: 'middle',
+    left: 'center',
+    orient: 'vertical',
+    cellSize: cellSize,
+    yearLabel: {
+      show: false,
+      fontSize: 30
     },
-    calendar: {
-        top: 'middle',
-        left: 'center',
-        orient: 'vertical',
-        cellSize: cellSize,
-        yearLabel: {
-            show: false,
-            fontSize: 30
-        },
-        dayLabel: {
-            margin: 20,
-            firstDay: 1,
-            nameMap: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
-        },
-        monthLabel: {
-            show: false
-        },
-        range: ['2017-02']
+    dayLabel: {
+      margin: 20,
+      firstDay: 1,
+      nameMap: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
+    },
+    monthLabel: {
+      show: false
     },
-    series: [{
-        id: 'label',
-        type: 'scatter',
-        coordinateSystem: 'calendar',
-        symbolSize: 1,
-        label: {
-            show: true,
-            formatter: function (params) {
-                return echarts.format.formatTime('dd', params.value[0]);
-            },
-            offset: [-cellSize[0] / 2 + 10, -cellSize[1] / 2 + 10],
-            fontSize: 14
+    range: ['2017-02']
+  },
+  series: [
+    {
+      id: 'label',
+      type: 'scatter',
+      coordinateSystem: 'calendar',
+      symbolSize: 1,
+      label: {
+        show: true,
+        formatter: function (params: any) {
+          return echarts.format.formatTime('dd', params.value[0]);
         },
-        data: scatterData
-    }]
+        offset: [-cellSize[0] / 2 + 10, -cellSize[1] / 2 + 10],
+        fontSize: 14
+      },
+      data: scatterData
+    }
+  ]
 };
 
 let pieInitialized: boolean;
 setTimeout(function () {
-    pieInitialized = true;
-    myChart.setOption<echarts.EChartsOption>({
-        series: getPieSeries(scatterData, myChart)
-    });
+  pieInitialized = true;
+  myChart.setOption<echarts.EChartsOption>({
+    series: getPieSeries(scatterData, myChart)
+  });
 }, 10);
 
 app.onresize = function () {
-    if (pieInitialized) {
-        myChart.setOption<echarts.EChartsOption>({
-            series: getPieSeriesUpdate(scatterData, myChart)
-        });
-    }
+  if (pieInitialized) {
+    myChart.setOption<echarts.EChartsOption>({
+      series: getPieSeriesUpdate(scatterData, myChart)
+    });
+  }
 };
 
-export {}
\ No newline at end of file
+export {};
diff --git a/public/examples/ts/calendar-simple.ts b/public/examples/ts/calendar-simple.ts
index 607da8c..d2ae4aa 100644
--- a/public/examples/ts/calendar-simple.ts
+++ b/public/examples/ts/calendar-simple.ts
@@ -6,34 +6,34 @@ difficulty: 0
 */
 
 function getVirtulData(year: string) {
-    year = year || '2017';
-    var date = +echarts.number.parseDate(year + '-01-01');
-    var end = +echarts.number.parseDate(year + '-12-31');
-    var dayTime = 3600 * 24 * 1000;
-    var data = [];
-    for (var time = date; time <= end; time += dayTime) {
-        data.push([
-            echarts.format.formatTime('yyyy-MM-dd', time),
-            Math.floor(Math.random() * 10000)
-        ]);
-    }
-    return data;
+  year = year || '2017';
+  var date = +echarts.number.parseDate(year + '-01-01');
+  var end = +echarts.number.parseDate(year + '-12-31');
+  var dayTime = 3600 * 24 * 1000;
+  var data = [];
+  for (var time = date; time <= end; time += dayTime) {
+    data.push([
+      echarts.format.formatTime('yyyy-MM-dd', time),
+      Math.floor(Math.random() * 10000)
+    ]);
+  }
+  return data;
 }
 
 option = {
-    visualMap: {
-        show: false,
-        min: 0,
-        max: 10000
-    },
-    calendar: {
-        range: '2017'
-    },
-    series: {
-        type: 'heatmap',
-        coordinateSystem: 'calendar',
-        data: getVirtulData('2017')
-    }
+  visualMap: {
+    show: false,
+    min: 0,
+    max: 10000
+  },
+  calendar: {
+    range: '2017'
+  },
+  series: {
+    type: 'heatmap',
+    coordinateSystem: 'calendar',
+    data: getVirtulData('2017')
+  }
 };
 
-export {}
\ No newline at end of file
+export {};
diff --git a/public/examples/ts/calendar-vertical.ts b/public/examples/ts/calendar-vertical.ts
index 212c3d0..39c0cb2 100644
--- a/public/examples/ts/calendar-vertical.ts
+++ b/public/examples/ts/calendar-vertical.ts
@@ -7,74 +7,79 @@ difficulty: 1
 */
 
 function getVirtulData(year: string) {
-    year = year || '2017';
-    var date = +echarts.number.parseDate(year + '-01-01');
-    var end = +echarts.number.parseDate((+year + 1) + '-01-01');
-    var dayTime = 3600 * 24 * 1000;
-    var data = [];
-    for (var time = date; time < end; time += dayTime) {
-        data.push([
-            echarts.format.formatTime('yyyy-MM-dd', time),
-            Math.floor(Math.random() * 1000)
-        ]);
-    }
-    return data;
+  year = year || '2017';
+  var date = +echarts.number.parseDate(year + '-01-01');
+  var end = +echarts.number.parseDate(+year + 1 + '-01-01');
+  var dayTime = 3600 * 24 * 1000;
+  var data = [];
+  for (var time = date; time < end; time += dayTime) {
+    data.push([
+      echarts.format.formatTime('yyyy-MM-dd', time),
+      Math.floor(Math.random() * 1000)
+    ]);
+  }
+  return data;
 }
 
-
 option = {
-    tooltip: {
-        position: 'top',
-        formatter: function (p) {
-            var format = echarts.format.formatTime('yyyy-MM-dd', p.data[0]);
-            return format + ': ' + p.data[1];
-        }
+  tooltip: {
+    position: 'top',
+    formatter: function (p: any) {
+      var format = echarts.format.formatTime('yyyy-MM-dd', p.data[0]);
+      return format + ': ' + p.data[1];
+    }
+  },
+  visualMap: {
+    min: 0,
+    max: 1000,
+    calculable: true,
+    orient: 'vertical',
+    left: '670',
+    top: 'center'
+  },
+
+  calendar: [
+    {
+      orient: 'vertical',
+      range: '2015'
     },
-    visualMap: {
-        min: 0,
-        max: 1000,
-        calculable: true,
-        orient: 'vertical',
-        left: '670',
-        top: 'center'
+    {
+      left: 300,
+      orient: 'vertical',
+      range: '2016'
     },
+    {
+      left: 520,
+      cellSize: [20, 'auto'],
+      bottom: 10,
+      orient: 'vertical',
+      range: '2017',
+      dayLabel: {
+        margin: 5
+      }
+    }
+  ],
 
-    calendar: [{
-        orient: 'vertical',
-        range: '2015'
+  series: [
+    {
+      type: 'heatmap',
+      coordinateSystem: 'calendar',
+      calendarIndex: 0,
+      data: getVirtulData('2015')
     },
     {
-        left: 300,
-        orient: 'vertical',
-        range: '2016'
+      type: 'heatmap',
+      coordinateSystem: 'calendar',
+      calendarIndex: 1,
+      data: getVirtulData('2016')
     },
     {
-        left: 520,
-        cellSize: [20, 'auto'],
-        bottom: 10,
-        orient: 'vertical',
-        range: '2017',
-        dayLabel: {
-            margin: 5
-        }
-    }],
-
-    series: [{
-        type: 'heatmap',
-        coordinateSystem: 'calendar',
-        calendarIndex: 0,
-        data: getVirtulData('2015')
-    }, {
-        type: 'heatmap',
-        coordinateSystem: 'calendar',
-        calendarIndex: 1,
-        data: getVirtulData('2016')
-    }, {
-        type: 'heatmap',
-        coordinateSystem: 'calendar',
-        calendarIndex: 2,
-        data: getVirtulData('2017')
-    }]
+      type: 'heatmap',
+      coordinateSystem: 'calendar',
+      calendarIndex: 2,
+      data: getVirtulData('2017')
+    }
+  ]
 };
 
-export {}
\ No newline at end of file
+export {};
diff --git a/public/examples/ts/candlestick-brush.ts b/public/examples/ts/candlestick-brush.ts
index d5ce863..ce07c41 100644
--- a/public/examples/ts/candlestick-brush.ts
+++ b/public/examples/ts/candlestick-brush.ts
@@ -7,264 +7,270 @@ titleCN: K 线图刷选
 const upColor = '#00da3c';
 const downColor = '#ec0000';
 
-
 function splitData(rawData: number[][]) {
-    let categoryData = [];
-    let values = [];
-    let volumes = [];
-    for (let i = 0; i < rawData.length; i++) {
-        categoryData.push(rawData[i].splice(0, 1)[0]);
-        values.push(rawData[i]);
-        volumes.push([i, rawData[i][4], rawData[i][0] > rawData[i][1] ? 1 : -1]);
-    }
+  let categoryData = [];
+  let values = [];
+  let volumes = [];
+  for (let i = 0; i < rawData.length; i++) {
+    categoryData.push(rawData[i].splice(0, 1)[0]);
+    values.push(rawData[i]);
+    volumes.push([i, rawData[i][4], rawData[i][0] > rawData[i][1] ? 1 : -1]);
+  }
 
-    return {
-        categoryData: categoryData,
-        values: values,
-        volumes: volumes
-    };
+  return {
+    categoryData: categoryData,
+    values: values,
+    volumes: volumes
+  };
 }
 
-function calculateMA(dayCount: number, data: { values: number[][]}) {
-    var result = [];
-    for (var i = 0, len = data.values.length; i < len; i++) {
-        if (i < dayCount) {
-            result.push('-');
-            continue;
-        }
-        var sum = 0;
-        for (var j = 0; j < dayCount; j++) {
-            sum += data.values[i - j][1];
-        }
-        result.push(+(sum / dayCount).toFixed(3));
+function calculateMA(dayCount: number, data: { values: number[][] }) {
+  var result = [];
+  for (var i = 0, len = data.values.length; i < len; i++) {
+    if (i < dayCount) {
+      result.push('-');
+      continue;
+    }
+    var sum = 0;
+    for (var j = 0; j < dayCount; j++) {
+      sum += data.values[i - j][1];
     }
-    return result;
+    result.push(+(sum / dayCount).toFixed(3));
+  }
+  return result;
 }
 
 $.get(ROOT_PATH + '/data/asset/data/stock-DJI.json', function (rawData) {
+  var data = splitData(rawData);
 
-    var data = splitData(rawData);
-
-    myChart.setOption<echarts.EChartsOption>(option = {
-        animation: false,
-        legend: {
-            bottom: 10,
-            left: 'center',
-            data: ['Dow-Jones index', 'MA5', 'MA10', 'MA20', 'MA30']
+  myChart.setOption<echarts.EChartsOption>(
+    (option = {
+      animation: false,
+      legend: {
+        bottom: 10,
+        left: 'center',
+        data: ['Dow-Jones index', 'MA5', 'MA10', 'MA20', 'MA30']
+      },
+      tooltip: {
+        trigger: 'axis',
+        axisPointer: {
+          type: 'cross'
         },
-        tooltip: {
-            trigger: 'axis',
-            axisPointer: {
-                type: 'cross'
-            },
-            borderWidth: 1,
-            borderColor: '#ccc',
-            padding: 10,
-            textStyle: {
-                color: '#000'
-            },
-            position: function (pos, params, el, elRect, size) {
-                const obj: Record<string, number> = {
-                    top: 10
-                };
-                obj[['left', 'right'][+(pos[0] < size.viewSize[0] / 2)]] = 30;
-                return obj;
-            }
-            // extraCssText: 'width: 170px'
+        borderWidth: 1,
+        borderColor: '#ccc',
+        padding: 10,
+        textStyle: {
+          color: '#000'
         },
-        axisPointer: {
-            link: [{
-                xAxisIndex: 'all'
-            }],
-            label: {
-                backgroundColor: '#777'
-            }
+        position: function (pos, params, el, elRect, size) {
+          const obj: Record<string, number> = {
+            top: 10
+          };
+          obj[['left', 'right'][+(pos[0] < size.viewSize[0] / 2)]] = 30;
+          return obj;
+        }
+        // extraCssText: 'width: 170px'
+      },
+      axisPointer: {
+        link: [
+          {
+            xAxisIndex: 'all'
+          }
+        ],
+        label: {
+          backgroundColor: '#777'
+        }
+      },
+      toolbox: {
+        feature: {
+          dataZoom: {
+            yAxisIndex: false
+          },
+          brush: {
+            type: ['lineX', 'clear']
+          }
+        }
+      },
+      brush: {
+        xAxisIndex: 'all',
+        brushLink: 'all',
+        outOfBrush: {
+          colorAlpha: 0.1
+        }
+      },
+      visualMap: {
+        show: false,
+        seriesIndex: 5,
+        dimension: 2,
+        pieces: [
+          {
+            value: 1,
+            color: downColor
+          },
+          {
+            value: -1,
+            color: upColor
+          }
+        ]
+      },
+      grid: [
+        {
+          left: '10%',
+          right: '8%',
+          height: '50%'
         },
-        toolbox: {
-            feature: {
-                dataZoom: {
-                    yAxisIndex: false
-                },
-                brush: {
-                    type: ['lineX', 'clear']
-                }
-            }
+        {
+          left: '10%',
+          right: '8%',
+          top: '63%',
+          height: '16%'
+        }
+      ],
+      xAxis: [
+        {
+          type: 'category',
+          data: data.categoryData,
+          scale: true,
+          boundaryGap: false,
+          axisLine: { onZero: false },
+          splitLine: { show: false },
+          splitNumber: 20,
+          min: 'dataMin',
+          max: 'dataMax',
+          axisPointer: {
+            z: 100
+          }
         },
-        brush: {
-            xAxisIndex: 'all',
-            brushLink: 'all',
-            outOfBrush: {
-                colorAlpha: 0.1
-            }
+        {
+          type: 'category',
+          gridIndex: 1,
+          data: data.categoryData,
+          scale: true,
+          boundaryGap: false,
+          axisLine: { onZero: false },
+          axisTick: { show: false },
+          splitLine: { show: false },
+          axisLabel: { show: false },
+          splitNumber: 20,
+          min: 'dataMin',
+          max: 'dataMax'
+        }
+      ],
+      yAxis: [
+        {
+          scale: true,
+          splitArea: {
+            show: true
+          }
         },
-        visualMap: {
-            show: false,
-            seriesIndex: 5,
-            dimension: 2,
-            pieces: [{
-                value: 1,
-                color: downColor
-            }, {
-                value: -1,
-                color: upColor
-            }]
+        {
+          scale: true,
+          gridIndex: 1,
+          splitNumber: 2,
+          axisLabel: { show: false },
+          axisLine: { show: false },
+          axisTick: { show: false },
+          splitLine: { show: false }
+        }
+      ],
+      dataZoom: [
+        {
+          type: 'inside',
+          xAxisIndex: [0, 1],
+          start: 98,
+          end: 100
         },
-        grid: [
-            {
-                left: '10%',
-                right: '8%',
-                height: '50%'
-            },
-            {
-                left: '10%',
-                right: '8%',
-                top: '63%',
-                height: '16%'
-            }
-        ],
-        xAxis: [
-            {
-                type: 'category',
-                data: data.categoryData,
-                scale: true,
-                boundaryGap: false,
-                axisLine: {onZero: false},
-                splitLine: {show: false},
-                splitNumber: 20,
-                min: 'dataMin',
-                max: 'dataMax',
-                axisPointer: {
-                    z: 100
-                }
-            },
-            {
-                type: 'category',
-                gridIndex: 1,
-                data: data.categoryData,
-                scale: true,
-                boundaryGap: false,
-                axisLine: {onZero: false},
-                axisTick: {show: false},
-                splitLine: {show: false},
-                axisLabel: {show: false},
-                splitNumber: 20,
-                min: 'dataMin',
-                max: 'dataMax'
-            }
-        ],
-        yAxis: [
-            {
-                scale: true,
-                splitArea: {
-                    show: true
-                }
-            },
-            {
-                scale: true,
-                gridIndex: 1,
-                splitNumber: 2,
-                axisLabel: {show: false},
-                axisLine: {show: false},
-                axisTick: {show: false},
-                splitLine: {show: false}
-            }
-        ],
-        dataZoom: [
-            {
-                type: 'inside',
-                xAxisIndex: [0, 1],
-                start: 98,
-                end: 100
-            },
-            {
-                show: true,
-                xAxisIndex: [0, 1],
-                type: 'slider',
-                top: '85%',
-                start: 98,
-                end: 100
-            }
-        ],
-        series: [
-            {
-                name: 'Dow-Jones index',
-                type: 'candlestick',
-                data: data.values,
-                itemStyle: {
-                    color: upColor,
-                    color0: downColor,
-                    borderColor: undefined,
-                    borderColor0: undefined
-                },
-                tooltip: {
-                    formatter: function (param) {
-                        param = param[0];
-                        return [
-                            'Date: ' + param.name + '<hr size=1 style="margin: 3px 0">',
-                            'Open: ' + param.data[0] + '<br/>',
-                            'Close: ' + param.data[1] + '<br/>',
-                            'Lowest: ' + param.data[2] + '<br/>',
-                            'Highest: ' + param.data[3] + '<br/>'
-                        ].join('');
-                    }
-                }
-            },
-            {
-                name: 'MA5',
-                type: 'line',
-                data: calculateMA(5, data),
-                smooth: true,
-                lineStyle: {
-                    opacity: 0.5
-                }
-            },
-            {
-                name: 'MA10',
-                type: 'line',
-                data: calculateMA(10, data),
-                smooth: true,
-                lineStyle: {
-                    opacity: 0.5
-                }
-            },
-            {
-                name: 'MA20',
-                type: 'line',
-                data: calculateMA(20, data),
-                smooth: true,
-                lineStyle: {
-                    opacity: 0.5
-                }
-            },
-            {
-                name: 'MA30',
-                type: 'line',
-                data: calculateMA(30, data),
-                smooth: true,
-                lineStyle: {
-                    opacity: 0.5
-                }
-            },
-            {
-                name: 'Volume',
-                type: 'bar',
-                xAxisIndex: 1,
-                yAxisIndex: 1,
-                data: data.volumes
+        {
+          show: true,
+          xAxisIndex: [0, 1],
+          type: 'slider',
+          top: '85%',
+          start: 98,
+          end: 100
+        }
+      ],
+      series: [
+        {
+          name: 'Dow-Jones index',
+          type: 'candlestick',
+          data: data.values,
+          itemStyle: {
+            color: upColor,
+            color0: downColor,
+            borderColor: undefined,
+            borderColor0: undefined
+          },
+          tooltip: {
+            formatter: function (param: any) {
+              param = param[0];
+              return [
+                'Date: ' + param.name + '<hr size=1 style="margin: 3px 0">',
+                'Open: ' + param.data[0] + '<br/>',
+                'Close: ' + param.data[1] + '<br/>',
+                'Lowest: ' + param.data[2] + '<br/>',
+                'Highest: ' + param.data[3] + '<br/>'
+              ].join('');
             }
-        ]
-    }, true);
+          }
+        },
+        {
+          name: 'MA5',
+          type: 'line',
+          data: calculateMA(5, data),
+          smooth: true,
+          lineStyle: {
+            opacity: 0.5
+          }
+        },
+        {
+          name: 'MA10',
+          type: 'line',
+          data: calculateMA(10, data),
+          smooth: true,
+          lineStyle: {
+            opacity: 0.5
+          }
+        },
+        {
+          name: 'MA20',
+          type: 'line',
+          data: calculateMA(20, data),
+          smooth: true,
+          lineStyle: {
+            opacity: 0.5
+          }
+        },
+        {
+          name: 'MA30',
+          type: 'line',
+          data: calculateMA(30, data),
+          smooth: true,
+          lineStyle: {
+            opacity: 0.5
+          }
+        },
+        {
+          name: 'Volume',
+          type: 'bar',
+          xAxisIndex: 1,
+          yAxisIndex: 1,
+          data: data.volumes
+        }
+      ]
+    }),
+    true
+  );
 
-    myChart.dispatchAction({
-        type: 'brush',
-        areas: [
-            {
-                brushType: 'lineX',
-                coordRange: ['2016-06-02', '2016-06-20'],
-                xAxisIndex: 0
-            }
-        ]
-    });
+  myChart.dispatchAction({
+    type: 'brush',
+    areas: [
+      {
+        brushType: 'lineX',
+        coordRange: ['2016-06-02', '2016-06-20'],
+        xAxisIndex: 0
+      }
+    ]
+  });
 });
 
-export {}
\ No newline at end of file
+export {};
diff --git a/public/examples/ts/candlestick-large.ts b/public/examples/ts/candlestick-large.ts
index b86038e..c36bd0f 100644
--- a/public/examples/ts/candlestick-large.ts
+++ b/public/examples/ts/candlestick-large.ts
@@ -14,200 +14,209 @@ const dataCount = 2e5;
 const data = generateOHLC(dataCount);
 
 option = {
-    dataset: {
-        source: data
-    },
-    title: {
-        text: 'Data Amount: ' + echarts.format.addCommas(dataCount)
+  dataset: {
+    source: data
+  },
+  title: {
+    text: 'Data Amount: ' + echarts.format.addCommas(dataCount)
+  },
+  tooltip: {
+    trigger: 'axis',
+    axisPointer: {
+      type: 'line'
+    }
+  },
+  toolbox: {
+    feature: {
+      dataZoom: {
+        yAxisIndex: false
+      }
+    }
+  },
+  grid: [
+    {
+      left: '10%',
+      right: '10%',
+      bottom: 200
     },
-    tooltip: {
-        trigger: 'axis',
-        axisPointer: {
-            type: 'line'
-        }
+    {
+      left: '10%',
+      right: '10%',
+      height: 80,
+      bottom: 80
+    }
+  ],
+  xAxis: [
+    {
+      type: 'category',
+      scale: true,
+      boundaryGap: false,
+      // inverse: true,
+      axisLine: { onZero: false },
+      splitLine: { show: false },
+      splitNumber: 20,
+      min: 'dataMin',
+      max: 'dataMax'
     },
-    toolbox: {
-        feature: {
-            dataZoom: {
-                yAxisIndex: false
-            },
-        }
+    {
+      type: 'category',
+      gridIndex: 1,
+      scale: true,
+      boundaryGap: false,
+      axisLine: { onZero: false },
+      axisTick: { show: false },
+      splitLine: { show: false },
+      axisLabel: { show: false },
+      splitNumber: 20,
+      min: 'dataMin',
+      max: 'dataMax'
+    }
+  ],
+  yAxis: [
+    {
+      scale: true,
+      splitArea: {
+        show: true
+      }
     },
-    grid: [
-        {
-            left: '10%',
-            right: '10%',
-            bottom: 200
-        },
-        {
-            left: '10%',
-            right: '10%',
-            height: 80,
-            bottom: 80
-        }
-    ],
-    xAxis: [
-        {
-            type: 'category',
-            scale: true,
-            boundaryGap: false,
-            // inverse: true,
-            axisLine: {onZero: false},
-            splitLine: {show: false},
-            splitNumber: 20,
-            min: 'dataMin',
-            max: 'dataMax'
-        },
-        {
-            type: 'category',
-            gridIndex: 1,
-            scale: true,
-            boundaryGap: false,
-            axisLine: {onZero: false},
-            axisTick: {show: false},
-            splitLine: {show: false},
-            axisLabel: {show: false},
-            splitNumber: 20,
-            min: 'dataMin',
-            max: 'dataMax'
-        }
-    ],
-    yAxis: [
-        {
-            scale: true,
-            splitArea: {
-                show: true
-            }
-        },
-        {
-            scale: true,
-            gridIndex: 1,
-            splitNumber: 2,
-            axisLabel: {show: false},
-            axisLine: {show: false},
-            axisTick: {show: false},
-            splitLine: {show: false}
-        }
-    ],
-    dataZoom: [
-        {
-            type: 'inside',
-            xAxisIndex: [0, 1],
-            start: 10,
-            end: 100
-        },
-        {
-            show: true,
-            xAxisIndex: [0, 1],
-            type: 'slider',
-            bottom: 10,
-            start: 10,
-            end: 100
-        }
-    ],
-    visualMap: {
-        show: false,
-        seriesIndex: 1,
-        dimension: 6,
-        pieces: [{
-            value: 1,
-            color: upColor
-        }, {
-            value: -1,
-            color: downColor
-        }]
+    {
+      scale: true,
+      gridIndex: 1,
+      splitNumber: 2,
+      axisLabel: { show: false },
+      axisLine: { show: false },
+      axisTick: { show: false },
+      splitLine: { show: false }
+    }
+  ],
+  dataZoom: [
+    {
+      type: 'inside',
+      xAxisIndex: [0, 1],
+      start: 10,
+      end: 100
     },
-    series: [
-        {
-            type: 'candlestick',
-            itemStyle: {
-                color: upColor,
-                color0: downColor,
-                borderColor: upBorderColor,
-                borderColor0: downBorderColor
-            },
-            encode: {
-                x: 0,
-                y: [1, 4, 3, 2]
-            }
-        },
-        {
-            name: 'Volumn',
-            type: 'bar',
-            xAxisIndex: 1,
-            yAxisIndex: 1,
-            itemStyle: {
-                color: '#7fbe9e'
-            },
-            large: true,
-            encode: {
-                x: 0,
-                y: 5
-            }
-        }
+    {
+      show: true,
+      xAxisIndex: [0, 1],
+      type: 'slider',
+      bottom: 10,
+      start: 10,
+      end: 100
+    }
+  ],
+  visualMap: {
+    show: false,
+    seriesIndex: 1,
+    dimension: 6,
+    pieces: [
+      {
+        value: 1,
+        color: upColor
+      },
+      {
+        value: -1,
+        color: downColor
+      }
     ]
+  },
+  series: [
+    {
+      type: 'candlestick',
+      itemStyle: {
+        color: upColor,
+        color0: downColor,
+        borderColor: upBorderColor,
+        borderColor0: downBorderColor
+      },
+      encode: {
+        x: 0,
+        y: [1, 4, 3, 2]
+      }
+    },
+    {
+      name: 'Volumn',
+      type: 'bar',
+      xAxisIndex: 1,
+      yAxisIndex: 1,
+      itemStyle: {
+        color: '#7fbe9e'
+      },
+      large: true,
+      encode: {
+        x: 0,
+        y: 5
+      }
+    }
+  ]
 };
 
 type DataItem = [string, number, number, number, number, number, number];
 
 function generateOHLC(count: number) {
-    let data: DataItem[]= [];
-
-    let xValue = +new Date(2011, 0, 1);
-    let minute = 60 * 1000;
-    let baseValue = Math.random() * 12000;
-    let boxVals = new Array(4);
-    let dayRange = 12;
+  let data: DataItem[] = [];
 
-    for (let i = 0; i < count; i++) {
-        baseValue = baseValue + Math.random() * 20 - 10;
+  let xValue = +new Date(2011, 0, 1);
+  let minute = 60 * 1000;
+  let baseValue = Math.random() * 12000;
+  let boxVals = new Array(4);
+  let dayRange = 12;
 
-        for (let j = 0; j < 4; j++) {
-            boxVals[j] = (Math.random() - 0.5) * dayRange + baseValue;
-        }
-        boxVals.sort();
+  for (let i = 0; i < count; i++) {
+    baseValue = baseValue + Math.random() * 20 - 10;
 
-        let openIdx = Math.round(Math.random() * 3);
-        let closeIdx = Math.round(Math.random() * 2);
-        if (closeIdx === openIdx) {
-            closeIdx++;
-        }
-        let volumn = boxVals[3] * (1000 + Math.random() * 500);
+    for (let j = 0; j < 4; j++) {
+      boxVals[j] = (Math.random() - 0.5) * dayRange + baseValue;
+    }
+    boxVals.sort();
 
-        // ['open', 'close', 'lowest', 'highest', 'volumn']
-        // [1, 4, 3, 2]
-        data[i] = [
-            echarts.format.formatTime('yyyy-MM-dd\nhh:mm:ss', xValue += minute),
-            +boxVals[openIdx].toFixed(2), // open
-            +boxVals[3].toFixed(2), // highest
-            +boxVals[0].toFixed(2), // lowest
-            +boxVals[closeIdx].toFixed(2),  // close
-            +volumn.toFixed(0),
-            getSign(data, i, +boxVals[openIdx], +boxVals[closeIdx], 4) // sign
-        ];
+    let openIdx = Math.round(Math.random() * 3);
+    let closeIdx = Math.round(Math.random() * 2);
+    if (closeIdx === openIdx) {
+      closeIdx++;
     }
+    let volumn = boxVals[3] * (1000 + Math.random() * 500);
 
-    return data;
+    // ['open', 'close', 'lowest', 'highest', 'volumn']
+    // [1, 4, 3, 2]
+    data[i] = [
+      echarts.format.formatTime('yyyy-MM-dd\nhh:mm:ss', (xValue += minute)),
+      +boxVals[openIdx].toFixed(2), // open
+      +boxVals[3].toFixed(2), // highest
+      +boxVals[0].toFixed(2), // lowest
+      +boxVals[closeIdx].toFixed(2), // close
+      +volumn.toFixed(0),
+      getSign(data, i, +boxVals[openIdx], +boxVals[closeIdx], 4) // sign
+    ];
+  }
 
-    function getSign(data: DataItem[], dataIndex: number, openVal: number, closeVal: number, closeDimIdx: number) {
-        var sign;
-        if (openVal > closeVal) {
-            sign = -1;
-        }
-        else if (openVal < closeVal) {
-            sign = 1;
-        }
-        else {
-            sign = dataIndex > 0
-                // If close === open, compare with close of last record
-                ? (data[dataIndex - 1][closeDimIdx] <= closeVal ? 1 : -1)
-                // No record of previous, set to be positive
-                : 1;
-        }
+  return data;
 
-        return sign;
+  function getSign(
+    data: DataItem[],
+    dataIndex: number,
+    openVal: number,
+    closeVal: number,
+    closeDimIdx: number
+  ) {
+    var sign;
+    if (openVal > closeVal) {
+      sign = -1;
+    } else if (openVal < closeVal) {
+      sign = 1;
+    } else {
+      sign =
+        dataIndex > 0
+          ? // If close === open, compare with close of last record
+            data[dataIndex - 1][closeDimIdx] <= closeVal
+            ? 1
+            : -1
+          : // No record of previous, set to be positive
+            1;
     }
-}
 
+    return sign;
+  }
+}
 
-export {}
\ No newline at end of file
+export {};
diff --git a/public/examples/ts/candlestick-sh-2015.ts b/public/examples/ts/candlestick-sh-2015.ts
index 7d24525..fc5a5e0 100644
--- a/public/examples/ts/candlestick-sh-2015.ts
+++ b/public/examples/ts/candlestick-sh-2015.ts
@@ -4,134 +4,138 @@ category: candlestick
... 57066 lines suppressed ...

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@echarts.apache.org
For additional commands, e-mail: commits-help@echarts.apache.org


[echarts-examples] 11/15: fix example type errors

Posted by sh...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

shenyi pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/echarts-examples.git

commit 0323de64f2b06fcfad05d5c30b858833c7bf5e3f
Author: pissang <bm...@gmail.com>
AuthorDate: Thu Sep 9 11:17:40 2021 +0800

    fix example type errors
---
 .vscode/settings.json                              |  3 +-
 public/examples/ts/bar-label-rotation.ts           | 19 ++++-----
 public/examples/ts/bar-race-country.ts             | 20 ++++++----
 public/examples/ts/bar-rich-text.ts                |  2 +-
 public/examples/ts/bubble-gradient.ts              |  2 +-
 public/examples/ts/candlestick-brush.ts            |  4 +-
 public/examples/ts/candlestick-large.ts            |  2 -
 public/examples/ts/candlestick-sh.ts               |  1 -
 public/examples/ts/candlestick-touch.ts            |  3 +-
 ...acking-with-d3.ts => circle-packing-with-d3.js} | 46 ++++++++--------------
 public/examples/ts/confidence-band.ts              |  2 +-
 public/examples/ts/gauge-car.ts                    | 19 ++++-----
 public/examples/ts/geo-seatmap-flight.ts           |  2 +-
 public/examples/ts/geo-svg-lines.ts                |  2 +-
 public/examples/ts/graph-label-overlap.ts          |  2 +-
 public/examples/ts/line-pen.ts                     |  6 +--
 public/examples/ts/lines-ny.ts                     |  2 +-
 public/examples/ts/pictorialBar-bar-transition.ts  |  8 ++--
 public/examples/ts/sunburst-book.js                | 13 +++++-
 public/examples/ts/sunburst-drink.ts               |  2 +-
 public/examples/ts/tree-basic.ts                   |  5 ++-
 public/examples/ts/tree-orient-right-left.ts       |  5 ++-
 public/examples/types/example.d.ts                 |  1 +
 src/editor/CodeMonaco.vue                          |  1 +
 src/explore/ExampleCard.vue                        |  4 +-
 25 files changed, 87 insertions(+), 89 deletions(-)

diff --git a/.vscode/settings.json b/.vscode/settings.json
index afd540a..41f8b3e 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -2,5 +2,6 @@
   "editor.formatOnSave": true,
   "editor.defaultFormatter": "esbenp.prettier-vscode",
   "editor.tabSize": 2,
-  "editor.detectIndentation": false
+  "editor.detectIndentation": false,
+  "typescript.tsdk": "node_modules/typescript/lib"
 }
diff --git a/public/examples/ts/bar-label-rotation.ts b/public/examples/ts/bar-label-rotation.ts
index 97bd265..e236fca 100644
--- a/public/examples/ts/bar-label-rotation.ts
+++ b/public/examples/ts/bar-label-rotation.ts
@@ -59,14 +59,13 @@ app.config = {
   position: 'insideBottom',
   distance: 15,
   onChange: function () {
-    var labelOption = {
-      normal: {
-        rotate: app.config.rotate,
-        align: app.config.align,
-        verticalAlign: app.config.verticalAlign,
-        position: app.config.position,
-        distance: app.config.distance
-      }
+    const labelOption: BarLabelOption = {
+      rotate: app.config.rotate as BarLabelOption['rotate'],
+      align: app.config.align as BarLabelOption['align'],
+      verticalAlign: app.config
+        .verticalAlign as BarLabelOption['verticalAlign'],
+      position: app.config.position as BarLabelOption['position'],
+      distance: app.config.distance as BarLabelOption['distance']
     };
     myChart.setOption<echarts.EChartsOption>({
       series: [
@@ -89,7 +88,7 @@ app.config = {
 
 type BarLabelOption = NonNullable<echarts.BarSeriesOption['label']>;
 
-const labelOption = {
+const labelOption: BarLabelOption = {
   show: true,
   position: app.config.position as BarLabelOption['position'],
   distance: app.config.distance as BarLabelOption['distance'],
@@ -178,3 +177,5 @@ option = {
     }
   ]
 };
+
+export {};
diff --git a/public/examples/ts/bar-race-country.ts b/public/examples/ts/bar-race-country.ts
index 15d623d..bd9781a 100644
--- a/public/examples/ts/bar-race-country.ts
+++ b/public/examples/ts/bar-race-country.ts
@@ -36,7 +36,11 @@ $.when(
   $.getJSON('https://cdn.jsdelivr.net/npm/emoji-flags@1.3.0/data.json'),
   $.getJSON(ROOT_PATH + '/data/asset/data/life-expectancy-table.json')
 ).done(function (res0, res1) {
-  const flags = res0[0];
+  interface Flag {
+    name: string;
+    emoji: string;
+  }
+  const flags: Flag[] = res0[0];
   const data = res1[0];
   const years: string[] = [];
   for (let i = 0; i < data.length; ++i) {
@@ -74,7 +78,7 @@ $.when(
       }
     },
     dataset: {
-      source: data.slice(1).filter(function (d) {
+      source: data.slice(1).filter(function (d: string[]) {
         return d[4] === startYear;
       })
     },
@@ -85,7 +89,7 @@ $.when(
       axisLabel: {
         show: true,
         fontSize: 14,
-        formatter: function (value: string) {
+        formatter: function (value: any) {
           return value + '{flag|' + getFlag(value) + '}';
         },
         rich: {
@@ -104,8 +108,8 @@ $.when(
         seriesLayoutBy: 'column',
         type: 'bar',
         itemStyle: {
-          color: function (param: any) {
-            return countryColors[param.value[3]] || '#5470c6';
+          color: function (param) {
+            return countryColors[(param.value as number[])[3]] || '#5470c6';
           }
         },
         encode: {
@@ -155,11 +159,11 @@ $.when(
   }
 
   function updateYear(year: string) {
-    let source = data.slice(1).filter(function (d) {
+    let source = data.slice(1).filter(function (d: string[]) {
       return d[4] === year;
     });
-    option.series[0].data = source;
-    option.graphic.elements[0].style.text = year;
+    (option as any).series[0].data = source;
+    (option as any).graphic.elements[0].style.text = year;
     myChart.setOption<echarts.EChartsOption>(option);
   }
 });
diff --git a/public/examples/ts/bar-rich-text.ts b/public/examples/ts/bar-rich-text.ts
index 76fc0e7..5510dab 100644
--- a/public/examples/ts/bar-rich-text.ts
+++ b/public/examples/ts/bar-rich-text.ts
@@ -49,7 +49,7 @@ option = {
     inverse: true,
     data: ['Sunny', 'Cloudy', 'Showers'],
     axisLabel: {
-      formatter: function (value) {
+      formatter: function (value: string) {
         return '{' + value + '| }\n{value|' + value + '}';
       },
       margin: 20,
diff --git a/public/examples/ts/bubble-gradient.ts b/public/examples/ts/bubble-gradient.ts
index fe3294f..704ba51 100644
--- a/public/examples/ts/bubble-gradient.ts
+++ b/public/examples/ts/bubble-gradient.ts
@@ -135,7 +135,7 @@ option = {
         focus: 'series',
         label: {
           show: true,
-          formatter: function (param) {
+          formatter: function (param: any) {
             return param.data[3];
           },
           position: 'top'
diff --git a/public/examples/ts/candlestick-brush.ts b/public/examples/ts/candlestick-brush.ts
index ce07c41..1c5bf64 100644
--- a/public/examples/ts/candlestick-brush.ts
+++ b/public/examples/ts/candlestick-brush.ts
@@ -43,7 +43,7 @@ function calculateMA(dayCount: number, data: { values: number[][] }) {
 $.get(ROOT_PATH + '/data/asset/data/stock-DJI.json', function (rawData) {
   var data = splitData(rawData);
 
-  myChart.setOption<echarts.EChartsOption>(
+  myChart.setOption(
     (option = {
       animation: false,
       legend: {
@@ -134,7 +134,6 @@ $.get(ROOT_PATH + '/data/asset/data/stock-DJI.json', function (rawData) {
           boundaryGap: false,
           axisLine: { onZero: false },
           splitLine: { show: false },
-          splitNumber: 20,
           min: 'dataMin',
           max: 'dataMax',
           axisPointer: {
@@ -151,7 +150,6 @@ $.get(ROOT_PATH + '/data/asset/data/stock-DJI.json', function (rawData) {
           axisTick: { show: false },
           splitLine: { show: false },
           axisLabel: { show: false },
-          splitNumber: 20,
           min: 'dataMin',
           max: 'dataMax'
         }
diff --git a/public/examples/ts/candlestick-large.ts b/public/examples/ts/candlestick-large.ts
index c36bd0f..97b2800 100644
--- a/public/examples/ts/candlestick-large.ts
+++ b/public/examples/ts/candlestick-large.ts
@@ -54,7 +54,6 @@ option = {
       // inverse: true,
       axisLine: { onZero: false },
       splitLine: { show: false },
-      splitNumber: 20,
       min: 'dataMin',
       max: 'dataMax'
     },
@@ -67,7 +66,6 @@ option = {
       axisTick: { show: false },
       splitLine: { show: false },
       axisLabel: { show: false },
-      splitNumber: 20,
       min: 'dataMin',
       max: 'dataMax'
     }
diff --git a/public/examples/ts/candlestick-sh.ts b/public/examples/ts/candlestick-sh.ts
index 70ca635..09589c5 100644
--- a/public/examples/ts/candlestick-sh.ts
+++ b/public/examples/ts/candlestick-sh.ts
@@ -157,7 +157,6 @@ option = {
     boundaryGap: false,
     axisLine: { onZero: false },
     splitLine: { show: false },
-    splitNumber: 20,
     min: 'dataMin',
     max: 'dataMax'
   },
diff --git a/public/examples/ts/candlestick-touch.ts b/public/examples/ts/candlestick-touch.ts
index fc374d5..d718039 100644
--- a/public/examples/ts/candlestick-touch.ts
+++ b/public/examples/ts/candlestick-touch.ts
@@ -107,7 +107,7 @@ option = {
       boundaryGap: false,
       axisLine: { lineStyle: { color: '#777' } },
       axisLabel: {
-        formatter: function (value) {
+        formatter: function (value: any) {
           return echarts.format.formatTime('MM-dd', value);
         }
       },
@@ -127,7 +127,6 @@ option = {
       axisLabel: { show: false },
       axisTick: { show: false },
       axisLine: { lineStyle: { color: '#777' } },
-      splitNumber: 20,
       min: 'dataMin',
       max: 'dataMax',
       axisPointer: {
diff --git a/public/examples/ts/circle-packing-with-d3.ts b/public/examples/ts/circle-packing-with-d3.js
similarity index 85%
rename from public/examples/ts/circle-packing-with-d3.ts
rename to public/examples/ts/circle-packing-with-d3.js
index 2233550..145d582 100644
--- a/public/examples/ts/circle-packing-with-d3.ts
+++ b/public/examples/ts/circle-packing-with-d3.js
@@ -14,29 +14,16 @@ $.when(
   run(res[0]);
 });
 
-function run(rawData: RawDataNode) {
+function run(rawData) {
   const dataWrap = prepareData(rawData);
   initChart(dataWrap.seriesData, dataWrap.maxDepth);
 }
 
-interface DataItem {
-  id: string;
-  value: number;
-  depth: number;
-  index: number;
-}
-
-type RawDataNode = {
-  [key: string]: RawDataNode;
-} & {
-  $count: number;
-};
-
-function prepareData(rawData: RawDataNode) {
-  const seriesData: DataItem[] = [];
+function prepareData(rawData) {
+  const seriesData = [];
   let maxDepth = 0;
 
-  function convert(source: RawDataNode, basePath: string, depth: number) {
+  function convert(source, basePath, depth) {
     if (source == null) {
       return;
     }
@@ -68,7 +55,7 @@ function prepareData(rawData: RawDataNode) {
   };
 }
 
-function initChart(seriesData: DataItem[], maxDepth: number) {
+function initChart(seriesData, maxDepth) {
   var displayRoot = stratify();
 
   function stratify() {
@@ -98,10 +85,7 @@ function initChart(seriesData: DataItem[], maxDepth: number) {
     });
   }
 
-  const renderItem: echarts.CustomSeriesOption['renderItem'] = function (
-    params,
-    api
-  ) {
+  function renderItem(params, api) {
     var context = params.context;
 
     // Only do that layout once in each time `setOption` called.
@@ -179,7 +163,7 @@ function initChart(seriesData: DataItem[], maxDepth: number) {
         }
       }
     };
-  };
+  }
 
   option = {
     dataset: {
@@ -210,13 +194,13 @@ function initChart(seriesData: DataItem[], maxDepth: number) {
     }
   };
 
-  myChart.setOption<echarts.EChartsOption>(option);
+  myChart.setOption < echarts.EChartsOption > option;
 
   myChart.on('click', { seriesIndex: 0 }, function (params) {
     drillDown(params.data.id);
   });
 
-  function drillDown(targetNodeId?: string) {
+  function drillDown(targetNodeId) {
     displayRoot = stratify();
     if (targetNodeId != null) {
       displayRoot = displayRoot.descendants().find(function (node) {
@@ -226,11 +210,13 @@ function initChart(seriesData: DataItem[], maxDepth: number) {
     // A trick to prevent d3-hierarchy from visiting parents in this algorithm.
     displayRoot.parent = null;
 
-    myChart.setOption<echarts.EChartsOption>({
-      dataset: {
-        source: seriesData
-      }
-    });
+    myChart.setOption <
+      echarts.EChartsOption >
+      {
+        dataset: {
+          source: seriesData
+        }
+      };
   }
 
   // Reset: click on the blank area.
diff --git a/public/examples/ts/confidence-band.ts b/public/examples/ts/confidence-band.ts
index a4bfdbe..0a90b15 100644
--- a/public/examples/ts/confidence-band.ts
+++ b/public/examples/ts/confidence-band.ts
@@ -65,7 +65,7 @@ $.get(
             return item.date;
           }),
           axisLabel: {
-            formatter: function (value, idx) {
+            formatter: function (value: any, idx: number) {
               var date = new Date(value);
               return idx === 0
                 ? value
diff --git a/public/examples/ts/gauge-car.ts b/public/examples/ts/gauge-car.ts
index caf5320..52bbe61 100644
--- a/public/examples/ts/gauge-car.ts
+++ b/public/examples/ts/gauge-car.ts
@@ -110,8 +110,7 @@ option = {
       },
       anchor: {},
       pointer: {
-        icon:
-          'path://M-36.5,23.9L-41,4.4c-0.1-0.4-0.4-0.7-0.7-0.7c-0.5-0.1-1.1,0.2-1.2,0.7l-4.5,19.5c0,0.1,0,0.1,0,0.2v92.3c0,0.6,0.4,1,1,1h9c0.6,0,1-0.4,1-1V24.1C-36.5,24-36.5,23.9-36.5,23.9z M-39.5,114.6h-5v-85h5V114.6z',
+        icon: 'path://M-36.5,23.9L-41,4.4c-0.1-0.4-0.4-0.7-0.7-0.7c-0.5-0.1-1.1,0.2-1.2,0.7l-4.5,19.5c0,0.1,0,0.1,0,0.2v92.3c0,0.6,0.4,1,1,1h9c0.6,0,1-0.4,1-1V24.1C-36.5,24-36.5,23.9-36.5,23.9z M-39.5,114.6h-5v-85h5V114.6z',
         width: 5,
         length: '40%',
         offsetCenter: [0, '-58%'],
@@ -192,8 +191,7 @@ option = {
       },
       anchor: {},
       pointer: {
-        icon:
-          'path://M-36.5,23.9L-41,4.4c-0.1-0.4-0.4-0.7-0.7-0.7c-0.5-0.1-1.1,0.2-1.2,0.7l-4.5,19.5c0,0.1,0,0.1,0,0.2v92.3c0,0.6,0.4,1,1,1h9c0.6,0,1-0.4,1-1V24.1C-36.5,24-36.5,23.9-36.5,23.9z M-39.5,114.6h-5v-85h5V114.6z',
+        icon: 'path://M-36.5,23.9L-41,4.4c-0.1-0.4-0.4-0.7-0.7-0.7c-0.5-0.1-1.1,0.2-1.2,0.7l-4.5,19.5c0,0.1,0,0.1,0,0.2v92.3c0,0.6,0.4,1,1,1h9c0.6,0,1-0.4,1-1V24.1C-36.5,24-36.5,23.9-36.5,23.9z M-39.5,114.6h-5v-85h5V114.6z',
         width: 10,
         offsetCenter: [0, '-10%'],
         length: '75%',
@@ -399,7 +397,7 @@ option = {
           if (value === 1) {
             return '4/4';
           }
-          return value;
+          return value + '';
         }
       },
       progress: {
@@ -414,8 +412,7 @@ option = {
         itemStyle: {},
         offsetCenter: ['-22%', '-57%'],
         size: 18,
-        icon:
-          'path://M1.11979167,1.11111112 C1.11979167,0.497461393 1.61725306,0 2.23090279,0 L12.2309028,0 C12.8445525,1.43824153e-08 13.3420139,0.497461403 13.3420139,1.11111112 L13.3420139,10 L15.5642361,10 C16.7915356,10 17.7864583,10.9949228 17.7864583,12.2222222 L17.7864583,16.6666667 C17.7865523,17.28025 18.2839861,17.7776077 18.8975694,17.7776077 C19.5111527,17.7776077 20.0085866,17.28025 20.0086805,16.6666667 L20.0086805,8.88888888 L17.7864583,8.88888888 C17.1728086,8.88888888 16.6 [...]
+        icon: 'path://M1.11979167,1.11111112 C1.11979167,0.497461393 1.61725306,0 2.23090279,0 L12.2309028,0 C12.8445525,1.43824153e-08 13.3420139,0.497461403 13.3420139,1.11111112 L13.3420139,10 L15.5642361,10 C16.7915356,10 17.7864583,10.9949228 17.7864583,12.2222222 L17.7864583,16.6666667 C17.7865523,17.28025 18.2839861,17.7776077 18.8975694,17.7776077 C19.5111527,17.7776077 20.0085866,17.28025 20.0086805,16.6666667 L20.0086805,8.88888888 L17.7864583,8.88888888 C17.1728086,8.88888888  [...]
       },
       pointer: {
         show: false
@@ -488,7 +485,7 @@ option = {
         fontFamily: 'Arial',
         color: '#fff',
         formatter: function (value) {
-          return -value;
+          return -value + '';
         }
       },
       anchor: {
@@ -496,12 +493,10 @@ option = {
         itemStyle: {},
         offsetCenter: [0, '55%'],
         size: 20,
-        icon:
-          'path://M-34.1-1.1L-34.1-1.1c0-0.3-0.3-0.6-0.6-0.6h-3.6v-1.5c0-0.5-0.2-0.9-0.6-1.1s-0.9-0.2-1.3,0c-0.4,0.2-0.6,0.7-0.6,1.1V7.9c0,0,0,0.1,0,0.1c-0.8,0.5-1.2,1.5-0.9,2.5c0.3,0.9,1.1,1.6,2.1,1.6c1,0,1.8-0.6,2.1-1.5c0.3-0.9,0-1.9-0.8-2.5V6.3h3.5c0.4,0,0.7-0.3,0.7-0.7l0,0c0-0.4-0.3-0.7-0.7-0.7h-3.5V2.9h3.5c0.4,0,0.7-0.3,0.7-0.7l0,0c0-0.4-0.3-0.7-0.7-0.7h-3.5v-2.1h3.6C-34.4-0.5-34.1-0.8-34.1-1.1z M-44.9,11.6c-0.7,0-1.4-0.2-2-0.6c-0.4-0.3-0.9-0.4-1.4-0.4c-0.4,0-0.9,0.2-1.2,0.4c-0.4,0. [...]
+        icon: 'path://M-34.1-1.1L-34.1-1.1c0-0.3-0.3-0.6-0.6-0.6h-3.6v-1.5c0-0.5-0.2-0.9-0.6-1.1s-0.9-0.2-1.3,0c-0.4,0.2-0.6,0.7-0.6,1.1V7.9c0,0,0,0.1,0,0.1c-0.8,0.5-1.2,1.5-0.9,2.5c0.3,0.9,1.1,1.6,2.1,1.6c1,0,1.8-0.6,2.1-1.5c0.3-0.9,0-1.9-0.8-2.5V6.3h3.5c0.4,0,0.7-0.3,0.7-0.7l0,0c0-0.4-0.3-0.7-0.7-0.7h-3.5V2.9h3.5c0.4,0,0.7-0.3,0.7-0.7l0,0c0-0.4-0.3-0.7-0.7-0.7h-3.5v-2.1h3.6C-34.4-0.5-34.1-0.8-34.1-1.1z M-44.9,11.6c-0.7,0-1.4-0.2-2-0.6c-0.4-0.3-0.9-0.4-1.4-0.4c-0.4,0-0.9,0.2-1.2,0.4c-0. [...]
       },
       pointer: {
-        icon:
-          'path://M2.9,0.7L2.9,0.7c1.4,0,2.6,1.2,2.6,2.6v115c0,1.4-1.2,2.6-2.6,2.6l0,0c-1.4,0-2.6-1.2-2.6-2.6V3.3C0.3,1.9,1.4,0.7,2.9,0.7z',
+        icon: 'path://M2.9,0.7L2.9,0.7c1.4,0,2.6,1.2,2.6,2.6v115c0,1.4-1.2,2.6-2.6,2.6l0,0c-1.4,0-2.6-1.2-2.6-2.6V3.3C0.3,1.9,1.4,0.7,2.9,0.7z',
         width: 15,
         length: '4',
         offsetCenter: [0, '-90%'],
diff --git a/public/examples/ts/geo-seatmap-flight.ts b/public/examples/ts/geo-seatmap-flight.ts
index ace9be3..681279e 100644
--- a/public/examples/ts/geo-seatmap-flight.ts
+++ b/public/examples/ts/geo-seatmap-flight.ts
@@ -25,7 +25,7 @@ $.get(ROOT_PATH + '/data/asset/geo/flight-seats.svg', function (svg) {
       },
       emphasis: {
         itemStyle: {
-          color: null,
+          color: undefined,
           borderColor: 'green',
           borderWidth: 2
         },
diff --git a/public/examples/ts/geo-svg-lines.ts b/public/examples/ts/geo-svg-lines.ts
index 3b4d8fa..5fbe7b0 100644
--- a/public/examples/ts/geo-svg-lines.ts
+++ b/public/examples/ts/geo-svg-lines.ts
@@ -21,7 +21,7 @@ $.get(
         roam: true,
         emphasis: {
           itemStyle: {
-            color: null
+            color: undefined
           },
           label: {
             show: false
diff --git a/public/examples/ts/graph-label-overlap.ts b/public/examples/ts/graph-label-overlap.ts
index 594238b..5ea835c 100644
--- a/public/examples/ts/graph-label-overlap.ts
+++ b/public/examples/ts/graph-label-overlap.ts
@@ -13,7 +13,7 @@ $.getJSON(ROOT_PATH + '/data/asset/data/les-miserables.json', function (graph) {
     tooltip: {},
     legend: [
       {
-        data: graph.categories.map(function (a) {
+        data: graph.categories.map(function (a: { name: string }) {
           return a.name;
         })
       }
diff --git a/public/examples/ts/line-pen.ts b/public/examples/ts/line-pen.ts
index 5c13995..8c7cb51 100644
--- a/public/examples/ts/line-pen.ts
+++ b/public/examples/ts/line-pen.ts
@@ -19,7 +19,7 @@ option = {
     text: 'Click to Add Points'
   },
   tooltip: {
-    formatter: function (params) {
+    formatter: function (params: any) {
       var data = params.data || [0, 0];
       return data[0].toFixed(2) + ', ' + data[1].toFixed(2);
     }
@@ -55,7 +55,7 @@ option = {
 
 var zr = myChart.getZr();
 
-zr.on('click', function (params) {
+zr.on('click', function (params: any) {
   var pointInPixel = [params.offsetX, params.offsetY];
   var pointInGrid = myChart.convertFromPixel('grid', pointInPixel);
 
@@ -73,7 +73,7 @@ zr.on('click', function (params) {
   }
 });
 
-zr.on('mousemove', function (params) {
+zr.on('mousemove', function (params: any) {
   var pointInPixel = [params.offsetX, params.offsetY];
   zr.setCursorStyle(
     myChart.containPixel('grid', pointInPixel) ? 'copy' : 'default'
diff --git a/public/examples/ts/lines-ny.ts b/public/examples/ts/lines-ny.ts
index 501767c..06a9d39 100644
--- a/public/examples/ts/lines-ny.ts
+++ b/public/examples/ts/lines-ny.ts
@@ -9,7 +9,7 @@ var CHUNK_COUNT = 32;
 
 var dataCount = 0;
 
-function fetchData(idx) {
+function fetchData(idx: number) {
   if (idx >= CHUNK_COUNT) {
     return;
   }
diff --git a/public/examples/ts/pictorialBar-bar-transition.ts b/public/examples/ts/pictorialBar-bar-transition.ts
index b56d2e6..6c36f11 100644
--- a/public/examples/ts/pictorialBar-bar-transition.ts
+++ b/public/examples/ts/pictorialBar-bar-transition.ts
@@ -18,7 +18,7 @@ const pathSymbols = {
   car: 'path://M49.592,40.883c-0.053,0.354-0.139,0.697-0.268,0.963c-0.232,0.475-0.455,0.519-1.334,0.475 c-1.135-0.053-2.764,0-4.484,0.068c0,0.476,0.018,0.697,0.018,0.697c0.111,1.299,0.697,1.342,0.931,1.342h3.7 c0.326,0,0.628,0,0.861-0.154c0.301-0.196,0.43-0.772,0.543-1.78c0.017-0.146,0.025-0.336,0.033-0.56v-0.01 c0-0.068,0.008-0.154,0.008-0.25V41.58l0,0C49.6,41.348,49.6,41.09,49.592,40.883L49.592,40.883z M6.057,40.883 c0.053,0.354,0.137,0.697,0.268,0.963c0.23,0.475,0.455,0.519,1.334,0.47 [...]
 };
 
-const labelSetting: echarts.BarSeriesOption['label'] = {
+const labelSetting: echarts.PictorialBarSeriesOption['label'] = {
   show: true,
   position: 'right',
   offset: [10, 0],
@@ -73,14 +73,14 @@ function makeOption(
       {
         name: '2015',
         id: 'bar1',
-        type: type,
+        type: type as 'pictorialBar',
         label: labelSetting,
         symbolRepeat: true,
         symbolSize: ['80%', '60%'],
         barCategoryGap: '40%',
         universalTransition: {
           enabled: true,
-          delay: function (idx, total) {
+          delay: function (idx: number, total: number) {
             return (idx / total) * 1000;
           }
         },
@@ -110,7 +110,7 @@ function makeOption(
       {
         name: '2016',
         id: 'bar2',
-        type: type,
+        type: type as 'pictorialBar',
         barGap: '10%',
         label: labelSetting,
         symbolRepeat: true,
diff --git a/public/examples/ts/sunburst-book.js b/public/examples/ts/sunburst-book.js
index f66a4e1..ecb24d5 100644
--- a/public/examples/ts/sunburst-book.js
+++ b/public/examples/ts/sunburst-book.js
@@ -396,12 +396,19 @@ option = {
       levels: [
         {},
         {
+          r0: 0,
+          r: 40,
           label: {
             rotate: 0
           }
         },
-        {},
         {
+          r0: 40,
+          r: 105
+        },
+        {
+          r0: 115,
+          r: 140,
           itemStyle: {
             shadowBlur: 2,
             shadowColor: colors[2],
@@ -414,6 +421,8 @@ option = {
           }
         },
         {
+          r0: 140,
+          r: 145,
           itemStyle: {
             shadowBlur: 80,
             shadowColor: colors[0]
@@ -423,7 +432,7 @@ option = {
             textShadowBlur: 5,
             textShadowColor: '#333'
           },
-          blur: {
+          downplay: {
             label: {
               opacity: 0.5
             }
diff --git a/public/examples/ts/sunburst-drink.ts b/public/examples/ts/sunburst-drink.ts
index 75e44c9..c92676a 100644
--- a/public/examples/ts/sunburst-drink.ts
+++ b/public/examples/ts/sunburst-drink.ts
@@ -822,7 +822,7 @@ option = {
 
     data: data,
     radius: [0, '95%'],
-    sort: null,
+    sort: undefined,
 
     emphasis: {
       focus: 'ancestor'
diff --git a/public/examples/ts/tree-basic.ts b/public/examples/ts/tree-basic.ts
index bbc3b03..3843067 100644
--- a/public/examples/ts/tree-basic.ts
+++ b/public/examples/ts/tree-basic.ts
@@ -8,7 +8,10 @@ myChart.showLoading();
 $.get(ROOT_PATH + '/data/asset/data/flare.json', function (data) {
   myChart.hideLoading();
 
-  data.children.forEach(function (datum, index) {
+  data.children.forEach(function (
+    datum: { collapsed: boolean },
+    index: number
+  ) {
     index % 2 === 0 && (datum.collapsed = true);
   });
 
diff --git a/public/examples/ts/tree-orient-right-left.ts b/public/examples/ts/tree-orient-right-left.ts
index 1bfe37e..2ab6eb4 100644
--- a/public/examples/ts/tree-orient-right-left.ts
+++ b/public/examples/ts/tree-orient-right-left.ts
@@ -8,7 +8,10 @@ myChart.showLoading();
 $.get(ROOT_PATH + '/data/asset/data/flare.json', function (data) {
   myChart.hideLoading();
 
-  data.children.forEach(function (datum, index) {
+  data.children.forEach(function (
+    datum: { collapsed: boolean },
+    index: number
+  ) {
     index % 2 === 0 && (datum.collapsed = true);
   });
 
diff --git a/public/examples/types/example.d.ts b/public/examples/types/example.d.ts
index d08ff9a..efd4109 100644
--- a/public/examples/types/example.d.ts
+++ b/public/examples/types/example.d.ts
@@ -23,6 +23,7 @@ declare global {
   };
 
   const ecStat: any;
+  const d3: any;
 
   const myChart: echarts.ECharts;
   let option: echarts.EChartsOption;
diff --git a/src/editor/CodeMonaco.vue b/src/editor/CodeMonaco.vue
index 85224a7..7b5a003 100644
--- a/src/editor/CodeMonaco.vue
+++ b/src/editor/CodeMonaco.vue
@@ -73,6 +73,7 @@ declare global {
     };
 
     const ecStat: any;
+    const d3: any;
     const myChart: echarts.ECharts
     let option: echarts.EChartsOption
 
diff --git a/src/explore/ExampleCard.vue b/src/explore/ExampleCard.vue
index 254adc4..ba6de53 100644
--- a/src/explore/ExampleCard.vue
+++ b/src/explore/ExampleCard.vue
@@ -8,7 +8,7 @@
       />
     </a>
     <div>
-      <div class="example-tags">
+      <div class="example-langs">
         <a class="js" :href="exampleLink" target="_blank">JS</a>
         <a class="ts" :href="exampleLink + '&lang=ts'" target="_blank">TS</a>
       </div>
@@ -133,7 +133,7 @@ export default {
     padding-left: 10px;
   }
 
-  .example-tags {
+  .example-langs {
     margin-top: 10px;
     float: right;
 

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@echarts.apache.org
For additional commands, e-mail: commits-help@echarts.apache.org


[echarts-examples] 10/15: optimize explore page

Posted by sh...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

shenyi pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/echarts-examples.git

commit e1814a8918e2a5f3b2c21bf7f3bd53f3590740e7
Author: pissang <bm...@gmail.com>
AuthorDate: Tue Sep 7 20:31:57 2021 +0800

    optimize explore page
---
 src/explore/ExampleCard.vue | 45 ++++++++++++++++++++++++---------------------
 1 file changed, 24 insertions(+), 21 deletions(-)

diff --git a/src/explore/ExampleCard.vue b/src/explore/ExampleCard.vue
index bc9f352..254adc4 100644
--- a/src/explore/ExampleCard.vue
+++ b/src/explore/ExampleCard.vue
@@ -7,19 +7,15 @@
         :data-src="screenshotURL"
       />
     </a>
-    <div class="example-title">{{ title }}</div>
-    <div class="example-subtitle" v-if="showSubtitle">{{ subtitle }}</div>
-    <div class="example-tags">
-      <el-tooltip :content="$t('editor.tooltip.jsMode')" placement="bottom">
+    <div>
+      <div class="example-tags">
         <a class="js" :href="exampleLink" target="_blank">JS</a>
-      </el-tooltip>
-      <el-tooltip
-        :content="$t('editor.tooltip.tsMode')"
-        placement="bottom"
-        v-if="example.ts"
-      >
         <a class="ts" :href="exampleLink + '&lang=ts'" target="_blank">TS</a>
-      </el-tooltip>
+      </div>
+      <div>
+        <div class="example-title">{{ title }}</div>
+        <div class="example-subtitle" v-if="showSubtitle">{{ subtitle }}</div>
+      </div>
     </div>
   </div>
 </template>
@@ -90,17 +86,25 @@ export default {
   width: 100%;
   max-width: 350px;
   margin-bottom: 30px;
-
-  border-radius: 2px;
   position: relative;
 
+  .example-link {
+    margin-top: 10px;
+    border-radius: 5px;
+    box-shadow: 0 0 20px rgba(0, 0, 0, 0.05);
+    overflow: hidden;
+    display: block;
+  }
+
   .chart-area {
     width: 100%;
     height: 100%;
-    border-radius: 5px;
-    box-shadow: 0 0 20px rgba(0, 0, 0, 0.05);
-    margin-top: 10px;
     cursor: pointer;
+    transition: 0.3s ease-in-out;
+
+    &:hover {
+      transform: scale(1.2);
+    }
   }
 
   .example-title {
@@ -130,9 +134,8 @@ export default {
   }
 
   .example-tags {
-    position: absolute;
-    right: 10px;
-    bottom: 20px;
+    margin-top: 10px;
+    float: right;
 
     & > * {
       display: inline-block;
@@ -140,8 +143,8 @@ export default {
       margin-left: 5px;
       vertical-align: middle;
       border-radius: 3px;
-      font-size: 12px;
-      font-weight: bold;
+      font-size: 10px;
+      // font-weight: bold;
       opacity: 0.8;
 
       &:hover {

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@echarts.apache.org
For additional commands, e-mail: commits-help@echarts.apache.org


[echarts-examples] 09/15: add js and ts tag in explore page

Posted by sh...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

shenyi pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/echarts-examples.git

commit 4bed1e1a908b1dafd4cfc8ba2769ea47cf9bf583
Author: pissang <bm...@gmail.com>
AuthorDate: Tue Sep 7 16:51:28 2021 +0800

    add js and ts tag in explore page
---
 src/common/store.js         |   4 +-
 src/explore/ExampleCard.vue | 103 +++++++++++++++++++++++++++++++-------------
 src/explore/Explore.vue     |   1 -
 3 files changed, 75 insertions(+), 33 deletions(-)

diff --git a/src/common/store.js b/src/common/store.js
index 6dbb3ee..a73ec0d 100644
--- a/src/common/store.js
+++ b/src/common/store.js
@@ -13,7 +13,9 @@ export const store = {
   renderer: URL_PARAMS.renderer || 'canvas',
 
   typeCheck:
-    getExampleConfig().ts && (URL_PARAMS.lang || '').toLowerCase() === 'ts',
+    getExampleConfig() &&
+    getExampleConfig().ts &&
+    (URL_PARAMS.lang || '').toLowerCase() === 'ts',
   useDirtyRect: 'useDirtyRect' in URL_PARAMS,
 
   runCode: '',
diff --git a/src/explore/ExampleCard.vue b/src/explore/ExampleCard.vue
index 17d6959..bc9f352 100644
--- a/src/explore/ExampleCard.vue
+++ b/src/explore/ExampleCard.vue
@@ -6,9 +6,21 @@
         src="../asset/placeholder.jpg"
         :data-src="screenshotURL"
       />
-      <h4 class="example-title">{{ title }}</h4>
-      <h5 class="example-subtitle" v-if="showSubtitle">{{ subtitle }}</h5>
     </a>
+    <div class="example-title">{{ title }}</div>
+    <div class="example-subtitle" v-if="showSubtitle">{{ subtitle }}</div>
+    <div class="example-tags">
+      <el-tooltip :content="$t('editor.tooltip.jsMode')" placement="bottom">
+        <a class="js" :href="exampleLink" target="_blank">JS</a>
+      </el-tooltip>
+      <el-tooltip
+        :content="$t('editor.tooltip.tsMode')"
+        placement="bottom"
+        v-if="example.ts"
+      >
+        <a class="ts" :href="exampleLink + '&lang=ts'" target="_blank">TS</a>
+      </el-tooltip>
+    </div>
   </div>
 </template>
 
@@ -80,42 +92,71 @@ export default {
   margin-bottom: 30px;
 
   border-radius: 2px;
+  position: relative;
+
+  .chart-area {
+    width: 100%;
+    height: 100%;
+    border-radius: 5px;
+    box-shadow: 0 0 20px rgba(0, 0, 0, 0.05);
+    margin-top: 10px;
+    cursor: pointer;
+  }
+
+  .example-title {
+    color: $clr-primary;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+
+    padding: 10px 10px 2px 10px;
+    margin: 0;
+    display: block;
+    font-size: 14px;
+    text-align: left;
+  }
 
-  .example-link {
-    position: relative;
+  .example-subtitle {
+    font-size: 12px;
+    text-align: left;
+    color: #aaa;
     display: block;
+    // font-weight: 200;
+    overflow: hidden;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    margin: 3px 0 0 0;
+    padding-left: 10px;
+  }
+
+  .example-tags {
+    position: absolute;
+    right: 10px;
+    bottom: 20px;
+
+    & > * {
+      display: inline-block;
+      padding: 1px 6px;
+      margin-left: 5px;
+      vertical-align: middle;
+      border-radius: 3px;
+      font-size: 12px;
+      font-weight: bold;
+      opacity: 0.8;
 
-    .chart-area {
-      width: 100%;
-      height: 100%;
-      border-radius: 5px;
-      box-shadow: 0 0 20px rgba(0, 0, 0, 0.05);
-      margin-top: 10px;
+      &:hover {
+        opacity: 1;
+      }
     }
 
-    .example-title {
-      color: $clr-primary;
-      overflow: hidden;
-      text-overflow: ellipsis;
-      white-space: nowrap;
-
-      padding: 10px 10px 2px 10px;
-      margin: 0;
-      font-weight: normal;
-      font-size: 14px;
-      text-align: center;
+    .js {
+      background: #f7df1e;
+      color: #444;
     }
 
-    .example-subtitle {
-      font-size: 12px;
-      text-align: center;
-      color: #aaa;
-      font-weight: normal;
-      // font-weight: 200;
-      overflow: hidden;
-      white-space: nowrap;
-      text-overflow: ellipsis;
-      margin: 3px 0 0 0;
+    .ts {
+      background: #3178c6;
+      color: #eee;
     }
   }
 
diff --git a/src/explore/Explore.vue b/src/explore/Explore.vue
index cd81d4c..945c60d 100644
--- a/src/explore/Explore.vue
+++ b/src/explore/Explore.vue
@@ -375,7 +375,6 @@ $pd-lg: 20px;
 
   li {
     // transition: background-color 0.5s;
-    cursor: pointer;
 
     a {
       height: 45px;

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@echarts.apache.org
For additional commands, e-mail: commits-help@echarts.apache.org


[echarts-examples] 12/15: update more ts examples

Posted by sh...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

shenyi pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/echarts-examples.git

commit 99f366e1df407228cde20900a3e05a5df33674ae
Author: pissang <bm...@gmail.com>
AuthorDate: Thu Sep 9 13:31:39 2021 +0800

    update more ts examples
---
 public/examples/ts/custom-calendar-icon.ts         |  12 +-
 public/examples/ts/custom-cartesian-polygon.js     |  70 -----------
 public/examples/ts/custom-cartesian-polygon.ts     |  69 +++++++++++
 public/examples/ts/custom-error-bar.js             | 128 ---------------------
 public/examples/ts/custom-error-bar.ts             | 126 ++++++++++++++++++++
 ...om-error-scatter.js => custom-error-scatter.ts} |  55 +++++----
 .../examples/ts/{custom-ohlc.js => custom-ohlc.ts} |  22 ++--
 public/examples/ts/custom-polar-heatmap.js         |  84 --------------
 public/examples/ts/custom-polar-heatmap.ts         |  84 ++++++++++++++
 .../ts/{custom-profit.js => custom-profit.ts}      |  60 +++++-----
 .../examples/ts/{custom-wind.js => custom-wind.ts} |  16 +--
 public/examples/ts/geo-svg-map.ts                  |   2 +-
 public/examples/ts/wind-barb.ts                    |  10 +-
 src/data/chart-list-data.js                        |  16 +--
 14 files changed, 385 insertions(+), 369 deletions(-)

diff --git a/public/examples/ts/custom-calendar-icon.ts b/public/examples/ts/custom-calendar-icon.ts
index 1dec260..a69fd16 100644
--- a/public/examples/ts/custom-calendar-icon.ts
+++ b/public/examples/ts/custom-calendar-icon.ts
@@ -73,8 +73,8 @@ option = {
       coordinateSystem: 'calendar',
       renderItem: function (params, api) {
         const cellPoint = api.coord(api.value(0));
-        const cellWidth = params.coordSys.cellWidth;
-        const cellHeight = params.coordSys.cellHeight;
+        const cellWidth: number = (params.coordSys as any).cellWidth;
+        const cellHeight: number = (params.coordSys as any).cellHeight;
 
         const value = api.value(1) as string;
         const events = value && value.split('|');
@@ -83,7 +83,7 @@ option = {
           return;
         }
 
-        const group = {
+        const group: echarts.CustomSeriesRenderItemReturn = {
           type: 'group',
           children:
             (layouts[events.length - 1] || []).map(function (
@@ -93,7 +93,7 @@ option = {
               return {
                 type: 'path',
                 shape: {
-                  pathData: pathes[events[index]],
+                  pathData: pathes[+events[index]],
                   x: -8,
                   y: -8,
                   width: 16,
@@ -114,7 +114,7 @@ option = {
                     )
                 ],
                 style: api.style({
-                  fill: colors[events[index]]
+                  fill: colors[+events[index]]
                 })
               };
             }) || []
@@ -133,7 +133,7 @@ option = {
 
         return group;
       },
-      dimensions: [null, { type: 'ordinal' }],
+      dimensions: [undefined, { type: 'ordinal' }],
       data: getVirtulData('2017')
     }
   ]
diff --git a/public/examples/ts/custom-cartesian-polygon.js b/public/examples/ts/custom-cartesian-polygon.js
deleted file mode 100644
index 72180d3..0000000
--- a/public/examples/ts/custom-cartesian-polygon.js
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
-title: Custom Cartesian Polygon
-titleCN: 自定义多边形图
-category: custom
-difficulty: 3
-*/
-
-var data = [];
-var dataCount = 7;
-for (var i = 0; i < dataCount; i++) {
-  var val = Math.random() * 1000;
-  data.push([
-    echarts.number.round(Math.random() * 100),
-    echarts.number.round(Math.random() * 400)
-  ]);
-}
-
-function renderItem(params, api) {
-  if (params.context.rendered) {
-    return;
-  }
-  params.context.rendered = true;
-
-  var points = [];
-  for (var i = 0; i < data.length; i++) {
-    points.push(api.coord(data[i]));
-  }
-  var color = api.visual('color');
-
-  return {
-    type: 'polygon',
-    transition: ['shape'],
-    shape: {
-      points: points
-    },
-    style: api.style({
-      fill: color,
-      stroke: echarts.color.lift(color)
-    })
-  };
-}
-
-option = {
-  tooltip: {
-    trigger: 'axis'
-  },
-  legend: {
-    data: ['bar', 'error']
-  },
-  dataZoom: [
-    {
-      type: 'slider',
-      filterMode: 'none'
-    },
-    {
-      type: 'inside',
-      filterMode: 'none'
-    }
-  ],
-  xAxis: {},
-  yAxis: {},
-  series: [
-    {
-      type: 'custom',
-      renderItem: renderItem,
-      clip: true,
-      data: data
-    }
-  ]
-};
diff --git a/public/examples/ts/custom-cartesian-polygon.ts b/public/examples/ts/custom-cartesian-polygon.ts
new file mode 100644
index 0000000..4f5a468
--- /dev/null
+++ b/public/examples/ts/custom-cartesian-polygon.ts
@@ -0,0 +1,69 @@
+/*
+title: Custom Cartesian Polygon
+titleCN: 自定义多边形图
+category: custom
+difficulty: 3
+*/
+
+const data: number[][] = [];
+const dataCount = 7;
+for (let i = 0; i < dataCount; i++) {
+  data.push([
+    echarts.number.round(Math.random() * 100),
+    echarts.number.round(Math.random() * 400)
+  ]);
+}
+
+option = {
+  tooltip: {
+    trigger: 'axis'
+  },
+  legend: {
+    data: ['bar', 'error']
+  },
+  dataZoom: [
+    {
+      type: 'slider',
+      filterMode: 'none'
+    },
+    {
+      type: 'inside',
+      filterMode: 'none'
+    }
+  ],
+  xAxis: {},
+  yAxis: {},
+  series: [
+    {
+      type: 'custom',
+      renderItem: function (params, api) {
+        if (params.context.rendered) {
+          return;
+        }
+        params.context.rendered = true;
+
+        let points: number[][] = [];
+        for (let i = 0; i < data.length; i++) {
+          points.push(api.coord(data[i]));
+        }
+        let color = api.visual('color') as string;
+
+        return {
+          type: 'polygon',
+          transition: ['shape'],
+          shape: {
+            points: points
+          },
+          style: api.style({
+            fill: color,
+            stroke: echarts.color.lift(color, 0.1)
+          })
+        };
+      },
+      clip: true,
+      data: data
+    }
+  ]
+};
+
+export {};
diff --git a/public/examples/ts/custom-error-bar.js b/public/examples/ts/custom-error-bar.js
deleted file mode 100644
index 16f706c..0000000
--- a/public/examples/ts/custom-error-bar.js
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
-title: Error Bar on Catesian
-category: custom
-titleCN: 使用自定系列给柱状图添加误差范围
-difficulty: 3
-*/
-
-var categoryData = [];
-var errorData = [];
-var barData = [];
-var dataCount = 100;
-for (var i = 0; i < dataCount; i++) {
-  var val = Math.random() * 1000;
-  categoryData.push('category' + i);
-  errorData.push([
-    i,
-    echarts.number.round(Math.max(0, val - Math.random() * 100)),
-    echarts.number.round(val + Math.random() * 80)
-  ]);
-  barData.push(echarts.number.round(val, 2));
-}
-
-function renderItem(params, api) {
-  var xValue = api.value(0);
-  var highPoint = api.coord([xValue, api.value(1)]);
-  var lowPoint = api.coord([xValue, api.value(2)]);
-  var halfWidth = api.size([1, 0])[0] * 0.1;
-  var style = api.style({
-    stroke: api.visual('color'),
-    fill: null
-  });
-
-  return {
-    type: 'group',
-    children: [
-      {
-        type: 'line',
-        transition: ['shape'],
-        shape: {
-          x1: highPoint[0] - halfWidth,
-          y1: highPoint[1],
-          x2: highPoint[0] + halfWidth,
-          y2: highPoint[1]
-        },
-        style: style
-      },
-      {
-        type: 'line',
-        transition: ['shape'],
-        shape: {
-          x1: highPoint[0],
-          y1: highPoint[1],
-          x2: lowPoint[0],
-          y2: lowPoint[1]
-        },
-        style: style
-      },
-      {
-        type: 'line',
-        transition: ['shape'],
-        shape: {
-          x1: lowPoint[0] - halfWidth,
-          y1: lowPoint[1],
-          x2: lowPoint[0] + halfWidth,
-          y2: lowPoint[1]
-        },
-        style: style
-      }
-    ]
-  };
-}
-
-option = {
-  tooltip: {
-    trigger: 'axis',
-    axisPointer: {
-      type: 'shadow'
-    }
-  },
-  title: {
-    text: 'Error bar chart'
-  },
-  legend: {
-    data: ['bar', 'error']
-  },
-  dataZoom: [
-    {
-      type: 'slider',
-      start: 50,
-      end: 70
-    },
-    {
-      type: 'inside',
-      start: 50,
-      end: 70
-    }
-  ],
-  xAxis: {
-    data: categoryData
-  },
-  yAxis: {},
-  series: [
-    {
-      type: 'bar',
-      name: 'bar',
-      data: barData,
-      itemStyle: {
-        color: '#77bef7'
-      }
-    },
-    {
-      type: 'custom',
-      name: 'error',
-      itemStyle: {
-        normal: {
-          borderWidth: 1.5
-        }
-      },
-      renderItem: renderItem,
-      encode: {
-        x: 0,
-        y: [1, 2]
-      },
-      data: errorData,
-      z: 100
-    }
-  ]
-};
diff --git a/public/examples/ts/custom-error-bar.ts b/public/examples/ts/custom-error-bar.ts
new file mode 100644
index 0000000..78acb07
--- /dev/null
+++ b/public/examples/ts/custom-error-bar.ts
@@ -0,0 +1,126 @@
+/*
+title: Error Bar on Catesian
+category: custom
+titleCN: 使用自定系列给柱状图添加误差范围
+difficulty: 3
+*/
+
+var categoryData = [];
+var errorData = [];
+var barData = [];
+var dataCount = 100;
+for (var i = 0; i < dataCount; i++) {
+  var val = Math.random() * 1000;
+  categoryData.push('category' + i);
+  errorData.push([
+    i,
+    echarts.number.round(Math.max(0, val - Math.random() * 100)),
+    echarts.number.round(val + Math.random() * 80)
+  ]);
+  barData.push(echarts.number.round(val, 2));
+}
+
+option = {
+  tooltip: {
+    trigger: 'axis',
+    axisPointer: {
+      type: 'shadow'
+    }
+  },
+  title: {
+    text: 'Error bar chart'
+  },
+  legend: {
+    data: ['bar', 'error']
+  },
+  dataZoom: [
+    {
+      type: 'slider',
+      start: 50,
+      end: 70
+    },
+    {
+      type: 'inside',
+      start: 50,
+      end: 70
+    }
+  ],
+  xAxis: {
+    data: categoryData
+  },
+  yAxis: {},
+  series: [
+    {
+      type: 'bar',
+      name: 'bar',
+      data: barData,
+      itemStyle: {
+        color: '#77bef7'
+      }
+    },
+    {
+      type: 'custom',
+      name: 'error',
+      itemStyle: {
+        borderWidth: 1.5
+      },
+      renderItem: function (params, api) {
+        var xValue = api.value(0);
+        var highPoint = api.coord([xValue, api.value(1)]);
+        var lowPoint = api.coord([xValue, api.value(2)]);
+        var halfWidth = (api.size!([1, 0]) as number[])[0] * 0.1;
+        var style = api.style({
+          stroke: api.visual('color') as string,
+          fill: undefined
+        });
+
+        return {
+          type: 'group',
+          children: [
+            {
+              type: 'line',
+              transition: ['shape'],
+              shape: {
+                x1: highPoint[0] - halfWidth,
+                y1: highPoint[1],
+                x2: highPoint[0] + halfWidth,
+                y2: highPoint[1]
+              },
+              style: style
+            },
+            {
+              type: 'line',
+              transition: ['shape'],
+              shape: {
+                x1: highPoint[0],
+                y1: highPoint[1],
+                x2: lowPoint[0],
+                y2: lowPoint[1]
+              },
+              style: style
+            },
+            {
+              type: 'line',
+              transition: ['shape'],
+              shape: {
+                x1: lowPoint[0] - halfWidth,
+                y1: lowPoint[1],
+                x2: lowPoint[0] + halfWidth,
+                y2: lowPoint[1]
+              },
+              style: style
+            }
+          ]
+        };
+      },
+      encode: {
+        x: 0,
+        y: [1, 2]
+      },
+      data: errorData,
+      z: 100
+    }
+  ]
+};
+
+export {};
diff --git a/public/examples/ts/custom-error-scatter.js b/public/examples/ts/custom-error-scatter.ts
similarity index 81%
rename from public/examples/ts/custom-error-scatter.js
rename to public/examples/ts/custom-error-scatter.ts
index c74cf16..79bea15 100644
--- a/public/examples/ts/custom-error-scatter.js
+++ b/public/examples/ts/custom-error-scatter.ts
@@ -9,11 +9,11 @@ difficulty: 2
 // Data from https://playground.anychart.com/gallery/7.12.0/Error_Charts/Marker_Chart
 
 // prettier-ignore
-var dimensions = [
+const dimensions = [
     'name', 'Price', 'Prime cost', 'Prime cost min', 'Prime cost max', 'Price min', 'Price max'
 ];
 // prettier-ignore
-var data = [
+const data = [
     ['Blouse "Blue Viola"', 101.88, 99.75, 76.75, 116.75, 69.88, 119.88],
     ['Dress "Daisy"', 155.8, 144.03, 126.03, 156.03, 129.8, 188.8],
     ['Trousers "Cutesy Classic"', 203.25, 173.56, 151.56, 187.56, 183.25, 249.25],
@@ -33,28 +33,34 @@ var data = [
     ['Sweater "Fluffy Comfort"', 790.34, 678.34, 660.34, 690.34, 762.34, 824.34]
 ];
 
-function renderItem(params, api) {
-  var children = [];
-  var coordDims = ['x', 'y'];
+function renderItem(
+  params: echarts.CustomSeriesRenderItemParams,
+  api: echarts.CustomSeriesRenderItemAPI
+): echarts.CustomSeriesRenderItemReturn {
+  const group: echarts.CustomSeriesRenderItemReturn = {
+    type: 'group',
+    children: []
+  };
+  let coordDims = ['x', 'y'];
 
-  for (var baseDimIdx = 0; baseDimIdx < 2; baseDimIdx++) {
-    var otherDimIdx = 1 - baseDimIdx;
-    var encode = params.encode;
-    var baseValue = api.value(encode[coordDims[baseDimIdx]][0]);
-    var param = [];
+  for (let baseDimIdx = 0; baseDimIdx < 2; baseDimIdx++) {
+    let otherDimIdx = 1 - baseDimIdx;
+    let encode = params.encode;
+    let baseValue = api.value(encode[coordDims[baseDimIdx]][0]);
+    let param = [];
     param[baseDimIdx] = baseValue;
     param[otherDimIdx] = api.value(encode[coordDims[otherDimIdx]][1]);
-    var highPoint = api.coord(param);
+    let highPoint = api.coord(param);
     param[otherDimIdx] = api.value(encode[coordDims[otherDimIdx]][2]);
-    var lowPoint = api.coord(param);
-    var halfWidth = 5;
+    let lowPoint = api.coord(param);
+    let halfWidth = 5;
 
     var style = api.style({
-      stroke: api.visual('color'),
-      fill: null
+      stroke: api.visual('color') as string,
+      fill: undefined
     });
 
-    children.push(
+    group.children.push(
       {
         type: 'line',
         transition: ['shape'],
@@ -94,8 +100,14 @@ function renderItem(params, api) {
     );
   }
 
-  function makeShape(baseDimIdx, base1, value1, base2, value2) {
-    var shape = {};
+  function makeShape(
+    baseDimIdx: number,
+    base1: number,
+    value1: number,
+    base2: number,
+    value2: number
+  ) {
+    var shape: Record<string, number> = {};
     shape[coordDims[baseDimIdx] + '1'] = base1;
     shape[coordDims[1 - baseDimIdx] + '1'] = value1;
     shape[coordDims[baseDimIdx] + '2'] = base2;
@@ -103,10 +115,7 @@ function renderItem(params, api) {
     return shape;
   }
 
-  return {
-    type: 'group',
-    children: children
-  };
+  return group;
 }
 
 option = {
@@ -159,3 +168,5 @@ option = {
     }
   ]
 };
+
+export {};
diff --git a/public/examples/ts/custom-ohlc.js b/public/examples/ts/custom-ohlc.ts
similarity index 87%
rename from public/examples/ts/custom-ohlc.js
rename to public/examples/ts/custom-ohlc.ts
index f1e4e6f..d1eea1e 100644
--- a/public/examples/ts/custom-ohlc.js
+++ b/public/examples/ts/custom-ohlc.ts
@@ -5,9 +5,9 @@ titleCN: OHLC 图(使用自定义系列)
 difficulty: 1
 */
 
-function splitData(rawData) {
-  var categoryData = [];
-  var values = [];
+function splitData(rawData: number[][]) {
+  const categoryData = [];
+  const values = [];
   for (var i = 0; i < rawData.length; i++) {
     categoryData.push(rawData[i][0]);
     rawData[i][0] = i;
@@ -19,13 +19,16 @@ function splitData(rawData) {
   };
 }
 
-function renderItem(params, api) {
+function renderItem(
+  params: echarts.CustomSeriesRenderItemParams,
+  api: echarts.CustomSeriesRenderItemAPI
+): echarts.CustomSeriesRenderItemReturn {
   var xValue = api.value(0);
   var openPoint = api.coord([xValue, api.value(1)]);
   var closePoint = api.coord([xValue, api.value(2)]);
   var lowPoint = api.coord([xValue, api.value(3)]);
   var highPoint = api.coord([xValue, api.value(4)]);
-  var halfWidth = api.size([1, 0])[0] * 0.35;
+  var halfWidth = (api.size!([1, 0]) as number[])[0] * 0.35;
   var style = api.style({
     stroke: api.visual('color')
   });
@@ -84,13 +87,13 @@ $.get(ROOT_PATH + '/data/asset/data/stock-DJI.json', function (rawData) {
           type: 'cross'
         },
         position: function (pos, params, el, elRect, size) {
-          var obj = { top: 10 };
+          var obj: Record<string, number> = { top: 10 };
           obj[['left', 'right'][+(pos[0] < size.viewSize[0] / 2)]] = 30;
           return obj;
         }
       },
       axisPointer: {
-        link: { xAxisIndex: 'all' }
+        link: [{ xAxisIndex: 'all' }]
       },
       toolbox: {
         feature: {
@@ -117,7 +120,6 @@ $.get(ROOT_PATH + '/data/asset/data/stock-DJI.json', function (rawData) {
           boundaryGap: false,
           axisLine: { onZero: false },
           splitLine: { show: false },
-          splitNumber: 20,
           min: 'dataMin',
           max: 'dataMax',
           axisPointer: {
@@ -154,7 +156,7 @@ $.get(ROOT_PATH + '/data/asset/data/stock-DJI.json', function (rawData) {
           name: 'Dow-Jones index',
           type: 'custom',
           renderItem: renderItem,
-          dimensions: [null, 'open', 'close', 'lowest', 'highest'],
+          dimensions: ['-', 'open', 'close', 'lowest', 'highest'],
           encode: {
             x: 0,
             y: [1, 2, 3, 4],
@@ -167,3 +169,5 @@ $.get(ROOT_PATH + '/data/asset/data/stock-DJI.json', function (rawData) {
     true
   );
 });
+
+export {};
diff --git a/public/examples/ts/custom-polar-heatmap.js b/public/examples/ts/custom-polar-heatmap.js
deleted file mode 100644
index 624c5d9..0000000
--- a/public/examples/ts/custom-polar-heatmap.js
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
-title: Polar Heatmap
-category: custom
-titleCN: 极坐标热力图(自定义系列)
-difficulty: 4
-*/
-
-function renderItem(params, api) {
-  var values = [api.value(0), api.value(1)];
-  var coord = api.coord(values);
-  var size = api.size([1, 1], values);
-  return {
-    type: 'sector',
-    shape: {
-      cx: params.coordSys.cx,
-      cy: params.coordSys.cy,
-      r0: coord[2] - size[0] / 2,
-      r: coord[2] + size[0] / 2,
-      startAngle: -(coord[3] + size[1] / 2),
-      endAngle: -(coord[3] - size[1] / 2)
-    },
-    style: api.style({
-      fill: api.visual('color')
-    })
-  };
-}
-
-// prettier-ignore
-var hours = ['12a', '1a', '2a', '3a', '4a', '5a', '6a', '7a', '8a', '9a', '10a', '11a', '12p', '1p', '2p', '3p', '4p', '5p', '6p', '7p', '8p', '9p', '10p', '11p'];
-// prettier-ignore
-var days = ['Saturday', 'Friday', 'Thursday', 'Wednesday', 'Tuesday', 'Monday', 'Sunday'];
-// prettier-ignore
-var data = [[0,0,5],[0,1,1],[0,2,0],[0,3,0],[0,4,0],[0,5,0],[0,6,0],[0,7,0],[0,8,0],[0,9,0],[0,10,0],[0,11,2],[0,12,4],[0,13,1],[0,14,1],[0,15,3],[0,16,4],[0,17,6],[0,18,4],[0,19,4],[0,20,3],[0,21,3],[0,22,2],[0,23,5],[1,0,7],[1,1,0],[1,2,0],[1,3,0],[1,4,0],[1,5,0],[1,6,0],[1,7,0],[1,8,0],[1,9,0],[1,10,5],[1,11,2],[1,12,2],[1,13,6],[1,14,9],[1,15,11],[1,16,6],[1,17,7],[1,18,8],[1,19,12],[1,20,5],[1,21,5],[1,22,7],[1,23,2],[2,0,1],[2,1,1],[2,2,0],[2,3,0],[2,4,0],[2,5,0],[2,6,0],[2,7,0],[2 [...]
-var maxValue = data.reduce(function (max, item) {
-  return Math.max(max, item[2]);
-}, -Infinity);
-
-option = {
-  legend: {
-    data: ['Punch Card']
-  },
-  polar: {},
-  tooltip: {},
-  visualMap: {
-    type: 'continuous',
-    min: 0,
-    max: maxValue,
-    top: 'middle',
-    dimension: 2,
-    calculable: true
-  },
-  angleAxis: {
-    type: 'category',
-    data: hours,
-    boundaryGap: false,
-    splitLine: {
-      show: true,
-      lineStyle: {
-        color: '#ddd',
-        type: 'dashed'
-      }
-    },
-    axisLine: {
-      show: false
-    }
-  },
-  radiusAxis: {
-    type: 'category',
-    data: days,
-    z: 100
-  },
-  series: [
-    {
-      name: 'Punch Card',
-      type: 'custom',
-      coordinateSystem: 'polar',
-      itemStyle: {
-        color: '#d14a61'
-      },
-      renderItem: renderItem,
-      data: data
-    }
-  ]
-};
diff --git a/public/examples/ts/custom-polar-heatmap.ts b/public/examples/ts/custom-polar-heatmap.ts
new file mode 100644
index 0000000..5f665ce
--- /dev/null
+++ b/public/examples/ts/custom-polar-heatmap.ts
@@ -0,0 +1,84 @@
+/*
+title: Polar Heatmap
+category: custom
+titleCN: 极坐标热力图(自定义系列)
+difficulty: 4
+*/
+
+// prettier-ignore
+const hours = ['12a', '1a', '2a', '3a', '4a', '5a', '6a', '7a', '8a', '9a', '10a', '11a', '12p', '1p', '2p', '3p', '4p', '5p', '6p', '7p', '8p', '9p', '10p', '11p'];
+// prettier-ignore
+const days = ['Saturday', 'Friday', 'Thursday', 'Wednesday', 'Tuesday', 'Monday', 'Sunday'];
+// prettier-ignore
+const data = [[0,0,5],[0,1,1],[0,2,0],[0,3,0],[0,4,0],[0,5,0],[0,6,0],[0,7,0],[0,8,0],[0,9,0],[0,10,0],[0,11,2],[0,12,4],[0,13,1],[0,14,1],[0,15,3],[0,16,4],[0,17,6],[0,18,4],[0,19,4],[0,20,3],[0,21,3],[0,22,2],[0,23,5],[1,0,7],[1,1,0],[1,2,0],[1,3,0],[1,4,0],[1,5,0],[1,6,0],[1,7,0],[1,8,0],[1,9,0],[1,10,5],[1,11,2],[1,12,2],[1,13,6],[1,14,9],[1,15,11],[1,16,6],[1,17,7],[1,18,8],[1,19,12],[1,20,5],[1,21,5],[1,22,7],[1,23,2],[2,0,1],[2,1,1],[2,2,0],[2,3,0],[2,4,0],[2,5,0],[2,6,0],[2,7,0], [...]
+const maxValue = data.reduce(function (max, item) {
+  return Math.max(max, item[2]);
+}, -Infinity);
+
+option = {
+  legend: {
+    data: ['Punch Card']
+  },
+  polar: {},
+  tooltip: {},
+  visualMap: {
+    type: 'continuous',
+    min: 0,
+    max: maxValue,
+    top: 'middle',
+    dimension: 2,
+    calculable: true
+  },
+  angleAxis: {
+    type: 'category',
+    data: hours,
+    boundaryGap: false,
+    splitLine: {
+      show: true,
+      lineStyle: {
+        color: '#ddd',
+        type: 'dashed'
+      }
+    },
+    axisLine: {
+      show: false
+    }
+  },
+  radiusAxis: {
+    type: 'category',
+    data: days,
+    z: 100
+  },
+  series: [
+    {
+      name: 'Punch Card',
+      type: 'custom',
+      coordinateSystem: 'polar',
+      itemStyle: {
+        color: '#d14a61'
+      },
+      renderItem: function (params, api) {
+        var values = [api.value(0), api.value(1)];
+        var coord = api.coord(values);
+        var size = api.size!([1, 1], values) as number[];
+        return {
+          type: 'sector',
+          shape: {
+            cx: (params.coordSys as any).cx,
+            cy: (params.coordSys as any).cy,
+            r0: coord[2] - size[0] / 2,
+            r: coord[2] + size[0] / 2,
+            startAngle: -(coord[3] + size[1] / 2),
+            endAngle: -(coord[3] - size[1] / 2)
+          },
+          style: api.style({
+            fill: api.visual('color')
+          })
+        };
+      },
+      data: data
+    }
+  ]
+};
+
+export {};
diff --git a/public/examples/ts/custom-profit.js b/public/examples/ts/custom-profit.ts
similarity index 56%
rename from public/examples/ts/custom-profit.js
rename to public/examples/ts/custom-profit.ts
index 0e100ab..93f9ca2 100644
--- a/public/examples/ts/custom-profit.js
+++ b/public/examples/ts/custom-profit.ts
@@ -5,15 +5,7 @@ titleCN: 利润分布直方图
 difficulty: 1
 */
 
-var data = [
-  [10, 16, 3, 'A'],
-  [16, 18, 15, 'B'],
-  [18, 26, 12, 'C'],
-  [26, 32, 22, 'D'],
-  [32, 56, 7, 'E'],
-  [56, 62, 17, 'F']
-];
-var colorList = [
+const colorList = [
   '#4f81bd',
   '#c0504d',
   '#9bbb59',
@@ -22,7 +14,14 @@ var colorList = [
   '#e46c0b'
 ];
 
-data = data.map(function (item, index) {
+const data = [
+  [10, 16, 3, 'A'],
+  [16, 18, 15, 'B'],
+  [18, 26, 12, 'C'],
+  [26, 32, 22, 'D'],
+  [32, 56, 7, 'E'],
+  [56, 62, 17, 'F']
+].map(function (item, index) {
   return {
     value: item,
     itemStyle: {
@@ -31,24 +30,6 @@ data = data.map(function (item, index) {
   };
 });
 
-function renderItem(params, api) {
-  var yValue = api.value(2);
-  var start = api.coord([api.value(0), yValue]);
-  var size = api.size([api.value(1) - api.value(0), yValue]);
-  var style = api.style();
-
-  return {
-    type: 'rect',
-    shape: {
-      x: start[0],
-      y: start[1],
-      width: size[0],
-      height: size[1]
-    },
-    style: style
-  };
-}
-
 option = {
   title: {
     text: 'Profit',
@@ -62,7 +43,26 @@ option = {
   series: [
     {
       type: 'custom',
-      renderItem: renderItem,
+      renderItem: function (params, api) {
+        var yValue = api.value(2);
+        var start = api.coord([api.value(0), yValue]);
+        var size = api.size!([
+          (api.value(1) as number) - (api.value(0) as number),
+          yValue
+        ]) as number[];
+        var style = api.style();
+
+        return {
+          type: 'rect',
+          shape: {
+            x: start[0],
+            y: start[1],
+            width: size[0],
+            height: size[1]
+          },
+          style: style
+        };
+      },
       label: {
         show: true,
         position: 'top'
@@ -78,3 +78,5 @@ option = {
     }
   ]
 };
+
+export {};
diff --git a/public/examples/ts/custom-wind.js b/public/examples/ts/custom-wind.ts
similarity index 90%
rename from public/examples/ts/custom-wind.js
rename to public/examples/ts/custom-wind.ts
index b01eff9..a0f3d62 100644
--- a/public/examples/ts/custom-wind.js
+++ b/public/examples/ts/custom-wind.ts
@@ -5,7 +5,7 @@ category: custom
 difficulty: 7
 */
 
-function shuffle(array) {
+function shuffle(array: any[]) {
   // https://stackoverflow.com/questions/2450954/how-to-randomize-shuffle-a-javascript-array
   var currentIndex = array.length;
   var temporaryValue;
@@ -91,15 +91,15 @@ $.getJSON(ROOT_PATH + '/data-gl/asset/data/winds.json', function (windData) {
           y: 0
         },
         renderItem: function (params, api) {
-          var x = api.value(0),
-            y = api.value(1),
-            dx = api.value(2),
-            dy = api.value(3);
-          var start = api.coord([
+          const x = api.value(0) as number;
+          const y = api.value(1) as number;
+          const dx = api.value(2) as number;
+          const dy = api.value(3) as number;
+          const start = api.coord([
             Math.max(x - dx / 5, -180),
             Math.max(y - dy / 5, -90)
           ]);
-          var end = api.coord([
+          const end = api.coord([
             Math.min(x + dx / 5, 180),
             Math.min(y + dy / 5, 90)
           ]);
@@ -122,3 +122,5 @@ $.getJSON(ROOT_PATH + '/data-gl/asset/data/winds.json', function (windData) {
     })
   );
 });
+
+export {};
diff --git a/public/examples/ts/geo-svg-map.ts b/public/examples/ts/geo-svg-map.ts
index 6dbf4df..55f8f11 100644
--- a/public/examples/ts/geo-svg-map.ts
+++ b/public/examples/ts/geo-svg-map.ts
@@ -31,7 +31,7 @@ $.get(
           tooltip: {
             show: true,
             confine: true,
-            formatter: function (params) {
+            formatter: function (params: any) {
               return [
                 'This is the introduction:',
                 'xxxxxxxxxxxxxxxxxxxxx',
diff --git a/public/examples/ts/wind-barb.ts b/public/examples/ts/wind-barb.ts
index d409fab..ecabef0 100644
--- a/public/examples/ts/wind-barb.ts
+++ b/public/examples/ts/wind-barb.ts
@@ -75,9 +75,9 @@ $.getJSON(
       };
     };
 
-    const renderWeather: echarts.CustomSeriesOption['renderItem'] = function (
-      param,
-      api
+    const renderWeather = function (
+      param: echarts.CustomSeriesRenderItemParams,
+      api: echarts.CustomSeriesRenderItemAPI
     ) {
       const point = api.coord([
         (api.value(dims.time) as number) + (3600 * 24 * 1000) / 2,
@@ -90,7 +90,7 @@ $.getJSON(
           {
             type: 'image',
             style: {
-              image: api.value(dims.weatherIcon),
+              image: api.value(dims.weatherIcon) as string,
               x: -weatherIconSize / 2,
               y: -weatherIconSize / 2,
               width: weatherIconSize,
@@ -110,7 +110,7 @@ $.getJSON(
             position: [point[0], 80]
           }
         ]
-      };
+      } as echarts.CustomSeriesRenderItemReturn;
     };
 
     option = {
diff --git a/src/data/chart-list-data.js b/src/data/chart-list-data.js
index 3581bc4..0bcbda6 100644
--- a/src/data/chart-list-data.js
+++ b/src/data/chart-list-data.js
@@ -220,7 +220,7 @@ export default [
       "candlestick"
     ],
     "id": "custom-ohlc",
-    "ts": false,
+    "ts": true,
     "tags": [],
     "title": "OHLC Chart",
     "titleCN": "OHLC 图(使用自定义系列)",
@@ -231,7 +231,7 @@ export default [
       "custom"
     ],
     "id": "custom-profit",
-    "ts": false,
+    "ts": true,
     "tags": [],
     "title": "Profit",
     "titleCN": "利润分布直方图",
@@ -497,7 +497,7 @@ export default [
       "dataZoom"
     ],
     "id": "custom-error-scatter",
-    "ts": false,
+    "ts": true,
     "tags": [],
     "title": "Error Scatter on Catesian",
     "titleCN": "使用自定系列给散点图添加误差范围",
@@ -817,7 +817,7 @@ export default [
       "custom"
     ],
     "id": "custom-cartesian-polygon",
-    "ts": false,
+    "ts": true,
     "tags": [],
     "title": "Custom Cartesian Polygon",
     "titleCN": "自定义多边形图",
@@ -828,7 +828,7 @@ export default [
       "custom"
     ],
     "id": "custom-error-bar",
-    "ts": false,
+    "ts": true,
     "tags": [],
     "title": "Error Bar on Catesian",
     "titleCN": "使用自定系列给柱状图添加误差范围",
@@ -1211,7 +1211,7 @@ export default [
       "custom"
     ],
     "id": "custom-polar-heatmap",
-    "ts": false,
+    "ts": true,
     "tags": [],
     "title": "Polar Heatmap",
     "titleCN": "极坐标热力图(自定义系列)",
@@ -1884,7 +1884,7 @@ export default [
       "custom"
     ],
     "id": "custom-wind",
-    "ts": false,
+    "ts": true,
     "tags": [],
     "title": "Use custom series to draw wind vectors",
     "titleCN": "使用自定义系列绘制风场",
@@ -2916,7 +2916,7 @@ export default [
       "custom"
     ],
     "id": "circle-packing-with-d3",
-    "ts": true,
+    "ts": false,
     "tags": [],
     "title": "Circle Packing with d3",
     "titleCN": "Circle Packing with d3",

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@echarts.apache.org
For additional commands, e-mail: commits-help@echarts.apache.org


[echarts-examples] 04/15: add ts mode. update gl codes

Posted by sh...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

shenyi pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/echarts-examples.git

commit a6bbe0c6a6fc66b4015bd4201d397a44d3094f51
Author: pissang <bm...@gmail.com>
AuthorDate: Mon Sep 6 20:05:39 2021 +0800

    add ts mode. update gl codes
---
 .prettierignore                                    |    1 -
 common/buildCode.js                                |    6 +-
 package.json                                       |    2 +-
 public/data-gl/animating-contour-on-globe.js       |  179 ----
 public/data-gl/bar3d-dataset.js                    |   48 -
 public/data-gl/bar3d-global-population.js          |   96 --
 public/data-gl/bar3d-mapbox-view-change.js         |  104 --
 public/data-gl/bar3d-music-visualization.js        |  156 ---
 public/data-gl/bar3d-myth.js                       |  104 --
 .../bar3d-noise-modified-from-marpi-demo.js        |  210 ----
 public/data-gl/bar3d-on-mapbox.js                  |   71 --
 public/data-gl/bar3d-shanghai.js                   |   71 --
 public/data-gl/bar3d-simplex-noise.js              |   79 --
 public/data-gl/bar3d-voxelize-image.js             |  171 ----
 public/data-gl/flowGL-noise.js                     |  106 --
 public/data-gl/geo3d-with-different-height.js      |   72 --
 public/data-gl/geo3d.js                            |   50 -
 public/data-gl/global-population-bar3d-on-globe.js |   64 --
 public/data-gl/global-wind-visualization-2.js      |  248 -----
 public/data-gl/global-wind-visualization.js        |  196 ----
 public/data-gl/globe-atmosphere.js                 |   30 -
 public/data-gl/globe-contour-paint.js              |  178 ----
 public/data-gl/globe-country-carousel.js           |  107 --
 public/data-gl/globe-displacement.js               |   56 -
 public/data-gl/globe-echarts-gl-hello-world.js     |   35 -
 public/data-gl/globe-layers.js                     |   42 -
 public/data-gl/globe-moon.js                       |   54 -
 public/data-gl/globe-with-echarts-surface.js       |  239 -----
 public/data-gl/graphgl-gpu-layout.js               |   70 --
 public/data-gl/graphgl-large-internet.js           |   64 --
 public/data-gl/graphgl-npm-dep.js                  |  104 --
 public/data-gl/image-surface-sushuang.js           |   86 --
 public/data-gl/image-to-bar3d.js                   |   89 --
 public/data-gl/iron-globe.js                       |   40 -
 public/data-gl/line3d-orthographic.js              |   50 -
 public/data-gl/lines3d-airline-on-globe.js         |   57 --
 public/data-gl/lines3d-flight-path-on-mapbox.js    |  183 ----
 public/data-gl/lines3d-flights-gl.js               |   96 --
 public/data-gl/lines3d-flights-on-geo3d.js         |   77 --
 public/data-gl/lines3d-flights.js                  |  148 ---
 public/data-gl/lines3d-taxi-chengdu.js             |  492 ---------
 public/data-gl/lines3d-taxi-routes-of-cape-town.js |  169 ---
 public/data-gl/linesGL-ny.js                       |   91 --
 public/data-gl/map3d-alcohol-consumption.js        |   72 --
 public/data-gl/map3d-buildings-on-mapbox.js        |   77 --
 public/data-gl/map3d-buildings.js                  |  110 --
 public/data-gl/map3d-colorful-cities.js            |   93 --
 ...d-plastic-material-style-buildings-on-mapbox.js |   85 --
 public/data-gl/map3d-wood-city.js                  |   94 --
 public/data-gl/map3d-wood-map-on-mapbox.js         |   68 --
 public/data-gl/map3d-wood-map.js                   |   72 --
 public/data-gl/metal-bar3d.js                      |   99 --
 public/data-gl/metal-surface.js                    |  101 --
 public/data-gl/parametric-surface-rose.js          |  149 ---
 public/data-gl/scatter3D-dataset.js                |   41 -
 public/data-gl/scatter3d-globe-population.js       |   89 --
 public/data-gl/scatter3d-orthographic.js           |   68 --
 public/data-gl/scatter3d-scatter.js                |  108 --
 public/data-gl/scatter3d-shanghai.js               |   50 -
 public/data-gl/scatter3d-simplex-noise.js          |   68 --
 .../data-gl/scatter3d-weibo-checkin-on-mapbox.js   |   87 --
 public/data-gl/scatter3d.js                        |  208 ----
 public/data-gl/scatterGL-gps.js                    |   89 --
 public/data-gl/scattergl-weibo.js                  |  100 --
 public/data-gl/simple-surface.js                   |   53 -
 public/data-gl/sphere-parametric-surface.js        |   48 -
 public/data-gl/stacked-bar3d.js                    |   62 --
 public/data-gl/surface-breather.js                 |  119 ---
 public/data-gl/surface-golden-rose.js              |  159 ---
 public/data-gl/surface-leather.js                  |  137 ---
 public/data-gl/surface-mollusc-shell.js            |   78 --
 public/data-gl/surface-theme-roses.js              |  154 ---
 public/data-gl/surface-wave.js                     |   58 --
 .../examples/ts/gl/animating-contour-on-globe.js   |  182 ++++
 public/examples/ts/gl/bar3d-dataset.js             |   51 +
 public/examples/ts/gl/bar3d-global-population.js   |  109 ++
 public/examples/ts/gl/bar3d-mapbox-view-change.js  |  118 +++
 public/examples/ts/gl/bar3d-music-visualization.js |  161 +++
 public/examples/ts/gl/bar3d-myth.js                |  107 ++
 .../ts/gl/bar3d-noise-modified-from-marpi-demo.js  |  216 ++++
 public/examples/ts/gl/bar3d-on-mapbox.js           |   86 ++
 .../ts/gl}/bar3d-punch-card.js                     |  127 ++-
 public/examples/ts/gl/bar3d-shanghai.js            |   84 ++
 public/examples/ts/gl/bar3d-simplex-noise.js       |   94 ++
 public/examples/ts/gl/bar3d-voxelize-image.js      |  175 ++++
 public/examples/ts/gl/flowGL-noise.js              |  125 +++
 .../examples/ts/gl/geo3d-with-different-height.js  |   74 ++
 public/examples/ts/gl/geo3d.js                     |   49 +
 .../ts/gl/global-population-bar3d-on-globe.js      |   67 ++
 .../examples/ts/gl/global-wind-visualization-2.js  |  277 +++++
 public/examples/ts/gl/global-wind-visualization.js |  211 ++++
 public/examples/ts/gl/globe-atmosphere.js          |   30 +
 public/examples/ts/gl/globe-contour-paint.js       |  177 ++++
 public/examples/ts/gl/globe-country-carousel.js    |  112 ++
 public/examples/ts/gl/globe-displacement.js        |   57 ++
 .../examples/ts/gl/globe-echarts-gl-hello-world.js |   35 +
 public/examples/ts/gl/globe-layers.js              |   45 +
 public/examples/ts/gl/globe-moon.js                |   54 +
 .../examples/ts/gl/globe-with-echarts-surface.js   |  254 +++++
 public/examples/ts/gl/graphgl-gpu-layout.js        |   71 ++
 public/examples/ts/gl/graphgl-large-internet.js    |  101 ++
 public/examples/ts/gl/graphgl-npm-dep.js           |  140 +++
 public/examples/ts/gl/image-surface-sushuang.js    |   90 ++
 public/examples/ts/gl/image-to-bar3d.js            |   93 ++
 public/examples/ts/gl/iron-globe.js                |   39 +
 public/examples/ts/gl/line3d-orthographic.js       |   64 ++
 public/examples/ts/gl/lines3d-airline-on-globe.js  |   53 +
 .../ts/gl/lines3d-flight-path-on-mapbox.js         |  190 ++++
 public/examples/ts/gl/lines3d-flights-gl.js        |   94 ++
 public/examples/ts/gl/lines3d-flights-on-geo3d.js  |   76 ++
 public/examples/ts/gl/lines3d-flights.js           |  149 +++
 public/examples/ts/gl/lines3d-taxi-chengdu.js      | 1073 ++++++++++++++++++++
 .../ts/gl/lines3d-taxi-routes-of-cape-town.js      |  176 ++++
 public/examples/ts/gl/linesGL-ny.js                |   93 ++
 public/examples/ts/gl/map3d-alcohol-consumption.js |   85 ++
 public/examples/ts/gl/map3d-buildings-on-mapbox.js |   78 ++
 public/examples/ts/gl/map3d-buildings.js           |  123 +++
 public/examples/ts/gl/map3d-colorful-cities.js     |  108 ++
 ...d-plastic-material-style-buildings-on-mapbox.js |   88 ++
 public/examples/ts/gl/map3d-wood-city.js           |   95 ++
 public/examples/ts/gl/map3d-wood-map-on-mapbox.js  |   73 ++
 public/examples/ts/gl/map3d-wood-map.js            |   74 ++
 public/examples/ts/gl/metal-bar3d.js               |  101 ++
 public/examples/ts/gl/metal-surface.js             |  126 +++
 public/examples/ts/gl/parametric-surface-rose.js   |  168 +++
 public/examples/ts/gl/scatter3D-dataset.js         |   44 +
 .../examples/ts/gl/scatter3d-globe-population.js   |   89 ++
 public/examples/ts/gl/scatter3d-orthographic.js    |   83 ++
 public/examples/ts/gl/scatter3d-scatter.js         |  131 +++
 public/examples/ts/gl/scatter3d-shanghai.js        |   63 ++
 public/examples/ts/gl/scatter3d-simplex-noise.js   |   83 ++
 .../ts/gl/scatter3d-weibo-checkin-on-mapbox.js     |   91 ++
 public/examples/ts/gl/scatter3d.js                 |  225 ++++
 public/examples/ts/gl/scatterGL-gps.js             |   90 ++
 public/examples/ts/gl/scattergl-weibo.js           |  104 ++
 public/examples/ts/gl/simple-surface.js            |   67 ++
 public/examples/ts/gl/sphere-parametric-surface.js |   62 ++
 public/examples/ts/gl/stacked-bar3d.js             |   61 ++
 public/examples/ts/gl/surface-breather.js          |  145 +++
 public/examples/ts/gl/surface-golden-rose.js       |  175 ++++
 public/examples/ts/gl/surface-leather.js           |  140 +++
 public/examples/ts/gl/surface-mollusc-shell.js     |   92 ++
 public/examples/ts/gl/surface-theme-roses.js       |  170 ++++
 public/examples/ts/gl/surface-wave.js              |   72 ++
 .../ts/gl}/transparent-bar3d.js                    |  129 ++-
 src/common/store.js                                |    9 +-
 src/editor/CodeAce.vue                             |    1 +
 src/editor/Editor.vue                              |   53 +-
 src/editor/FullCodePreview.vue                     |    6 +-
 src/editor/Preview.vue                             |   47 +-
 150 files changed, 8766 insertions(+), 7551 deletions(-)

diff --git a/.prettierignore b/.prettierignore
index 84fc23f..a51b10a 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -22,7 +22,6 @@ public/vendors/echarts/map/raw
 /public/asset
 /public/data/option
 /public/data-gl/option
-/public/examples/js
 /e2e/package-lock.json
 
 tmp
\ No newline at end of file
diff --git a/common/buildCode.js b/common/buildCode.js
index 64e4204..88db799 100644
--- a/common/buildCode.js
+++ b/common/buildCode.js
@@ -230,7 +230,7 @@ function buildMinimalBundleCode(deps, includeType) {
   ];
 
   const ECOptionTypeCode = `
-type ECOption = echarts.ComposeOption<
+type EChartsOption = echarts.ComposeOption<
     ${allImports.filter((a) => a.endsWith('Option')).join(' | ')}
 >`;
   const importsCodes = [
@@ -383,7 +383,7 @@ ${
   const ENV_CODE = [
     usedRootPath ? `var ROOT_PATH = '${ROOT_PATH}';` : '',
     usedApp ? `var app${ts ? ': any' : ''} = {};` : '',
-    ts && !minimal ? 'type ECOption = echarts.EChartsOption' : ''
+    ts && !minimal ? 'type EChartsOption = echarts.EChartsOption' : ''
   ]
     .filter((a) => !!a)
     .join('\n');
@@ -396,7 +396,7 @@ ${
 
 var chartDom = document.getElementById('main')${ts ? '!' : ''};
 var myChart = echarts.init(chartDom${theme ? `, '${theme}'` : ''});
-var option${ts ? ': ECOption' : ''};
+var option${ts ? ': EChartsOption' : ''};
 
 ${jsCode.trim()}
 
diff --git a/package.json b/package.json
index 8fe1fee..26fe6df 100644
--- a/package.json
+++ b/package.json
@@ -9,7 +9,7 @@
     "release": "npm run build && node build/copyResource.js --env asf",
     "dev": "npx concurrently --kill-others \"npm:watch\" \"npm:server\"",
     "build:example": "node tool/build-example.js && node tool/build-example.js --source data-gl",
-    "compile:example": "tsc --project public/examples/tsconfig.json",
+    "compile:example": "tsc --project public/examples/tsconfig.json || prettier --write public/examples/js",
     "test:e2e": "node e2e/main.js --bundler webpack -m",
     "test:e2e:local": "node e2e/main.js --bundler webpack -m --local",
     "test:e2e:esbuild": "node e2e/main.js --bundler esbuild -m",
diff --git a/public/data-gl/animating-contour-on-globe.js b/public/data-gl/animating-contour-on-globe.js
deleted file mode 100644
index aa2202f..0000000
--- a/public/data-gl/animating-contour-on-globe.js
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
-title: Animating Contour on Globe
-category: globe
-titleCN: Animating Contour on Globe
-videoStart: 2000
-videoEnd: 6000
-*/
-
-
-var config = {
-    color: '#c0101a',
-    levels: 1,
-    intensity: 4,
-    threshold: 0.01
-}
-
-var canvas = document.createElement('canvas');
-canvas.width = 4096;
-canvas.height = 2048;
-context = canvas.getContext("2d");
-
-context.lineWidth = 0.5;
-context.strokeStyle = config.color;
-context.fillStyle = config.color;
-context.shadowColor = config.color;
-
-$.when(
-    $.getScript('https://cdn.jsdelivr.net/npm/d3-array@2.8.0/dist/d3-array.js'),
-    $.getScript('https://cdn.jsdelivr.net/npm/d3-contour@2.0.0/dist/d3-contour.js'),
-    $.getScript('https://cdn.jsdelivr.net/npm/d3-geo@2.0.1/dist/d3-geo.js'),
-    $.getScript('https://cdn.jsdelivr.net/npm/d3-timer@2.0.0/dist/d3-timer.js')
-).done(function () {
-
-    image(ROOT_PATH + '/data-gl/asset/bathymetry_bw_composite_4k.jpg').then(function(image) {
-        var m = image.height,
-            n = image.width,
-            values = new Array(n * m),
-            contours = d3.contours().size([n, m]).smooth(true),
-            projection = d3.geoIdentity().scale(canvas.width / n),
-            path = d3.geoPath(projection, context);
-
-        //   StackBlur.R(image, 5);
-
-        for (var j = 0, k = 0; j < m; ++j) {
-            for (var i = 0; i < n; ++i, ++k) {
-                values[k] = image.data[(k << 2)] / 255;
-            }
-        }
-
-        var opt = {
-            image: canvas
-        };
-
-        var results = [];
-        function update(threshold, levels) {
-            context.clearRect(0, 0, canvas.width, canvas.height);
-            var thresholds = [];
-            for (var i = 0; i < levels; i++) {
-                thresholds.push((threshold + 1 / levels * i) % 1);
-            }
-            results = contours.thresholds(thresholds)(values);
-            redraw();
-        }
-
-        function redraw() {
-            results.forEach(function (d, idx) {
-                context.beginPath();
-                path(d);
-                context.globalAlpha = 1;
-                context.stroke();
-                if (idx > config.levels / 5 * 3) {
-                    context.globalAlpha = 0.01;
-                    context.fill();
-                }
-            });
-            opt.onupdate();
-        }
-        d3.timer(function(t) {
-            var threshold = (t % 10000) / 10000;
-            update(threshold, 1);
-        });
-
-        initCharts(opt);
-
-        update(config.threshold, config.levels);
-
-    });
-
-    function image(url) {
-        return new Promise(function(resolve) {
-            var image = new Image();
-            image.src = url;
-            image.crossOrigin = 'Anonymous';
-            image.onload = function() {
-                var canvas = document.createElement('canvas');
-                canvas.width = image.width / 8;
-                canvas.height = image.height / 8;
-                var context = canvas.getContext('2d');
-                context.drawImage(image, 0, 0, canvas.width, canvas.height);
-                resolve(context.getImageData(0, 0, canvas.width, canvas.height));
-            };
-        });
-    }
-
-    function initCharts(opt) {
-        var contourChart = echarts.init(document.createElement('canvas'), null, {
-            width: 4096,
-            height: 2048
-        });
-
-        var img = new echarts.graphic.Image({
-            style: {
-                image: opt.image,
-                x: -1,
-                y: -1,
-                width: opt.image.width + 2,
-                height: opt.image.height + 2
-            }
-        });
-        contourChart.getZr().add(img);
-
-        opt.onupdate = function () {
-            img.dirty();
-        };
-
-        myChart.setOption({
-            backgroundColor: '#000',
-            globe: {
-
-                environment: ROOT_PATH + '/data-gl/asset/starfield.jpg',
-
-                heightTexture: ROOT_PATH + '/data-gl/asset/bathymetry_bw_composite_4k.jpg',
-
-                displacementScale: 0.05,
-                displacementQuality: 'high',
-
-                baseColor: '#000',
-
-                shading: 'realistic',
-                realisticMaterial: {
-                    roughness: 0.2,
-                    metalness: 0
-                },
-
-                postEffect: {
-                    enable: true,
-                    depthOfField: {
-                        // enable: true
-                    }
-                },
-                light: {
-                    ambient: {
-                        intensity: 0
-                    },
-                    main: {
-                        intensity: 0.1,
-                        shadow: false
-                    },
-                    ambientCubemap: {
-                        texture: ROOT_PATH + '/data-gl/asset/lake.hdr',
-                        exposure: 1,
-                        diffuseIntensity: 0.5,
-                        specularIntensity: 2
-                    }
-                },
-                viewControl: {
-                    autoRotate: false
-                },
-
-                layers: [{
-                    type: 'blend',
-                    blendTo: 'emission',
-                    texture: contourChart,
-                    intensity: config.intensity
-                }]
-            }
-        });
-    }
-});
diff --git a/public/data-gl/bar3d-dataset.js b/public/data-gl/bar3d-dataset.js
deleted file mode 100644
index e37a4a3..0000000
--- a/public/data-gl/bar3d-dataset.js
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
-title: 3D Bar with Dataset
-category: bar3D
-titleCN: 使用 dataset 为三维柱状图设置数据
-*/
-
-$.get(ROOT_PATH + '/data/asset/data/life-expectancy-table.json', function (data) {
-    option = {
-        grid3D: {},
-        tooltip: {},
-        xAxis3D: {
-            type: 'category'
-        },
-        yAxis3D: {
-            type: 'category'
-        },
-        zAxis3D: {},
-        visualMap: {
-            max: 1e8,
-            dimension: 'Population'
-        },
-        dataset: {
-            dimensions: [
-                'Income',
-                'Life Expectancy',
-                'Population',
-                'Country',
-                {name: 'Year', type: 'ordinal'}
-            ],
-            source: data
-        },
-        series: [
-            {
-                type: 'bar3D',
-                // symbolSize: symbolSize,
-                shading: 'lambert',
-                encode: {
-                    x: 'Year',
-                    y: 'Country',
-                    z: 'Life Expectancy',
-                    tooltip: [0, 1, 2, 3, 4]
-                }
-            }
-        ]
-    };
-
-    myChart.setOption(option);
-});
\ No newline at end of file
diff --git a/public/data-gl/bar3d-global-population.js b/public/data-gl/bar3d-global-population.js
deleted file mode 100644
index 2411ead..0000000
--- a/public/data-gl/bar3d-global-population.js
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
-title: Bar3D - Global Population
-category: bar3D
-titleCN: Bar3D - Global Population
-*/
-
-
-$.getJSON(ROOT_PATH + '/data-gl/asset/data/population.json', function (data) {
-
-    data = data.filter(function (dataItem) {
-        return dataItem[2] > 0;
-    }).map(function (dataItem) {
-        return [dataItem[0], dataItem[1], Math.sqrt(dataItem[2])];
-    });
-
-    myChart.setOption({
-        backgroundColor: '#cdcfd5',
-        geo3D: {
-            map: 'world',
-            shading: 'lambert',
-            light: {
-                main: {
-                    intensity: 5,
-                    shadow: true,
-                    shadowQuality: 'high',
-                    alpha: 30
-                },
-                ambient: {
-                    intensity: 0
-                },
-                ambientCubemap: {
-                    texture: 'data-gl/asset/canyon.hdr',
-                    exposure: 1,
-                    diffuseIntensity: 0.5
-                }
-            },
-            viewControl: {
-                distance: 50,
-                panMouseButton: 'left',
-                rotateMouseButton: 'right'
-            },
-            groundPlane: {
-                show: true,
-                color: '#999'
-            },
-            postEffect: {
-                enable: true,
-                bloom: {
-                    enable: false
-                },
-                SSAO: {
-                    radius: 1,
-                    intensity: 1,
-                    enable: true
-                },
-                depthOfField: {
-                    enable: false,
-                    focalRange: 10,
-                    blurRadius: 10,
-                    fstop: 1
-                }
-            },
-            temporalSuperSampling: {
-                enable: true
-            },
-            itemStyle: {
-            },
-
-            regionHeight: 2
-        },
-        visualMap: {
-            max: 40,
-            calculable: true,
-            realtime: false,
-            inRange: {
-                color: ['#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf', '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026']
-            },
-            outOfRange: {
-                colorAlpha: 0
-            }
-        },
-        series: [{
-            type: 'bar3D',
-            coordinateSystem: 'geo3D',
-            shading: 'lambert',
-            data: data,
-            barSize: 0.1,
-            minHeight: 0.2,
-            silent: true,
-            itemStyle: {
-                color: 'orange'
-                // opacity: 0.8
-            }
-        }]
-    });
-});
\ No newline at end of file
diff --git a/public/data-gl/bar3d-mapbox-view-change.js b/public/data-gl/bar3d-mapbox-view-change.js
deleted file mode 100644
index e64dd8f..0000000
--- a/public/data-gl/bar3d-mapbox-view-change.js
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
-title: Mapbox 视角切换
-category: bar3D
-titleCN: Mapbox 视角切换
-*/
-
-mapboxgl.accessToken = mapboxglToken;
-
-
-$.getJSON(ROOT_PATH + '/data-gl/asset/data/population.json', function (data) {
-
-    data = data.filter(function (dataItem) {
-        return dataItem[2] > 0;
-    }).map(function (dataItem) {
-        return [dataItem[0], dataItem[1], dataItem[2]];
-    });
-
-    myChart.setOption({
-        title: {
-            text: '空格键切换视角',
-            left: 'center'
-        },
-        visualMap: {
-            show: false,
-            max: 1000,
-            calculable: true,
-            realtime: false,
-            inRange: {
-                color: ['#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf', '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026']
-            },
-            outOfRange: {
-                colorAlpha: 0
-            }
-        },
-        mapbox: {
-            center: [104.114129, 37.550339],
-            zoom: 3,
-            pitch: 50,
-            bearing: -10,
-            style: 'mapbox://styles/mapbox/light-v9',
-            boxHeight: 20,
-            // altitudeScale: 3e2,
-            postEffect: {
-                enable: true,
-                SSAO: {
-                    enable: true,
-                    radius: 2
-                }
-            },
-            light: {
-                main: {
-                    intensity: 2,
-                    shadow: true,
-                    shadowQuality: 'high'
-                },
-                ambient: {
-                    intensity: 0.
-                },
-                ambientCubemap: {
-                    texture: ROOT_PATH + '/data-gl/asset/canyon.hdr',
-                    exposure: 2,
-                    diffuseIntensity: 0.5
-                }
-            }
-        },
-        series: [{
-            type: 'bar3D',
-            coordinateSystem: 'mapbox',
-            shading: 'lambert',
-            minHeight: 0.1,
-            barSize: 0.3,
-            data: data,
-            silent: true
-        }]
-    });
-
-    function top() {
-        myChart.setOption({
-            mapbox: {
-                pitch: 0,
-                bearing: 0,
-                boxHeight: 0
-            }
-        });
-    }
-
-    function perspective() {
-        myChart.setOption({
-            mapbox: {
-                pitch: 50,
-                bearing: -10,
-                boxHeight: 20,
-            }
-        });
-    }
-
-    var isPerspective = true;
-    window.addEventListener('keydown', function (e) {
-        if (e.keyCode === 32) {
-            isPerspective ? top() : perspective();
-            isPerspective = !isPerspective;
-        }
-    })
-});
\ No newline at end of file
diff --git a/public/data-gl/bar3d-music-visualization.js b/public/data-gl/bar3d-music-visualization.js
deleted file mode 100644
index 17c1548..0000000
--- a/public/data-gl/bar3d-music-visualization.js
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
-title: Music Visualization
-category: bar3D
-titleCN: Music Visualization
-*/
-
-var UPDATE_DURATION = 100;
-
-window.AudioContext = window.AudioContext || window.webkitAudioContext;
-
-var audioContext = new AudioContext();
-
-var oReq = new XMLHttpRequest();
-oReq.open('GET', ROOT_PATH + '/data/asset/sound/roll-it-up.mp3', true);
-oReq.responseType = 'arraybuffer';
-
-oReq.onload = function(e) {
-    audioContext.decodeAudioData(oReq.response, initVisualizer);
-};
-oReq.send();
-
-function initVisualizer(audioBuffer) {
-    inited = true;
-
-    var source = audioContext.createBufferSource();
-    source.buffer = audioBuffer;
-
-    // Must invoked right after click event
-    if (source.noteOn) {
-        source.noteOn(0);
-    }
-    else {
-        source.start(0);
-    }
-
-    var analyzer = audioContext.createAnalyser();
-    var gainNode = audioContext.createGain();
-    analyzer.fftSize = 4096;
-
-    gainNode.gain.value = 1;
-    source.connect(gainNode);
-    gainNode.connect(analyzer);
-    analyzer.connect(audioContext.destination);
-
-    var frequencyBinCount = analyzer.frequencyBinCount;
-    var dataArray = new Uint8Array(frequencyBinCount);
-
-
-    var beta = 0;
-    function update() {
-        analyzer.getByteFrequencyData(dataArray);
-
-        var item = [];
-        var size = 50;
-        var dataProvider = [];
-
-        for (var i = 0; i < size * size; i++) {
-            var x = i % size;
-            var y = Math.floor(i / size);
-            var dx = x - size / 2;
-            var dy = y - size / 2;
-
-            var angle = Math.atan2(dy, dx);
-            if (angle < 0) {
-                angle = Math.PI * 2 + angle;
-            }
-            var dist = Math.sqrt(dx * dx + dy * dy);
-            var idx = Math.min(
-                frequencyBinCount - 1, Math.round(angle / Math.PI / 2 * 60 + dist * 60) + 100
-            );
-
-            var val = Math.pow(dataArray[idx] / 100, 3);
-            dataProvider.push([x, y, Math.max(val, 0.1)]);
-        }
-
-        myChart.setOption({
-            grid3D: {
-                viewControl: {
-                    beta: beta,
-                    alpha: Math.sin(beta / 10 + 40) * (beta % 10 + 5) / 15 * 30 + 30,
-                    distance: Math.cos(beta / 50 + 20) * (beta % 10 + 5) / 15 * 50 + 80,
-                    animationDurationUpdate: UPDATE_DURATION,
-                    animationEasingUpdate: 'linear'
-                }
-            },
-            series: [{
-                data: dataProvider
-            }]
-        });
-        beta += 2;
-
-        setTimeout(update, UPDATE_DURATION);
-    };
-
-    update();
-}
-
-option = {
-    tooltip: {},
-    visualMap: {
-        show: false,
-        min: 0.1,
-        max: 4,
-        inRange: {
-            color: ['#010103', '#2f490c', '#b0b70f', '#fdff44', '#fff']
-        }
-    },
-    xAxis3D: {
-        type: 'value'
-    },
-    yAxis3D: {
-        type: 'value'
-    },
-    zAxis3D: {
-        type: 'value',
-        min: -6,
-        max: 6
-    },
-    grid3D: {
-        show: false,
-        environment: '#000',
-        viewControl: {
-            distance: 100
-        },
-        postEffect: {
-            enable: true,
-            FXAA: {
-                enable: true
-            }
-        },
-        light: {
-            main: {
-                shadow: true,
-                intensity: 10,
-                quality: 'high'
-            },
-            ambientCubemap: {
-                texture: ROOT_PATH + '/data-gl/asset/canyon.hdr',
-                exposure: 0,
-                diffuseIntensity: 0.2
-            }
-        }
-    },
-    series: [{
-        type: 'bar3D',
-        silent: true,
-        shading: 'lambert',
-        data: [],
-        barSize: 1,
-        lineStyle: {
-            width: 4
-        },
-        // animation: false,
-        animationDurationUpdate: UPDATE_DURATION
-    }]
-}
\ No newline at end of file
diff --git a/public/data-gl/bar3d-myth.js b/public/data-gl/bar3d-myth.js
deleted file mode 100644
index c143078..0000000
--- a/public/data-gl/bar3d-myth.js
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
-title: 星云
-category: bar3D
-titleCN: 星云
-*/
-
-var img = new Image();
-var canvas = document.createElement('canvas');
-var ctx = canvas.getContext('2d');
-
-img.onload = function () {
-    var width = canvas.width = img.width;
-    var height = canvas.height = img.height;
-    ctx.drawImage(img, 0, 0, width, height);
-    var imgData = ctx.getImageData(0, 0, width, height);
-
-    var data = new Float32Array(imgData.data.length / 4 * 3);
-    var off = 0;
-    for (var i = 0; i < imgData.data.length / 4; i++) {
-        var r = imgData.data[i * 4];
-        var g = imgData.data[i * 4 + 1];
-        var b = imgData.data[i * 4 + 2];
-
-        var lum = (0.2125 * r + 0.7154 * g + 0.0721 * b);
-        lum = (lum - 125) / 4 + 50;
-
-        data[off++] = i % width;
-        data[off++] = height - Math.floor(i / width);
-        data[off++] = lum;
-    }
-
-
-    myChart.setOption(option = {
-        tooltip: {},
-        backgroundColor: '#fff',
-        xAxis3D: {
-            type: 'value'
-        },
-        yAxis3D: {
-            type: 'value'
-        },
-        zAxis3D: {
-            type: 'value',
-            min: 0,
-            max: 100
-        },
-        grid3D: {
-            show: false,
-            viewControl: {
-                alpha: 70,
-                beta: 0
-            },
-            postEffect: {
-                enable: true,
-                depthOfField: {
-                    enable: true,
-                    blurRadius: 4,
-                    fstop: 10
-                }
-                // SSAO: {
-                //     enable: true
-                // }
-            },
-            boxDepth: 100,
-            boxHeight: 20,
-            environment: ROOT_PATH + '/data-gl/asset/starfield.jpg',
-            light: {
-                main: {
-                    shadow: true,
-                    intensity: 2
-                },
-                ambientCubemap: {
-                    texture: ROOT_PATH + '/data-gl/asset/canyon.hdr',
-                    exposure: 2,
-                    diffuseIntensity: 0.2
-                }
-            }
-        },
-        series: [{
-            type: 'bar3D',
-            shading: 'lambert',
-            barSize: 0.8,
-            silent: true,
-            dimensions: ['x', 'y', 'z'],
-            itemStyle: {
-                color: function (params) {
-                    var i = params.dataIndex;
-                    var r = imgData.data[i * 4] / 255;
-                    var g = imgData.data[i * 4 + 1] / 255;
-                    var b = imgData.data[i * 4 + 2] / 255;
-                    var lum = (0.2125 * r + 0.7154 * g + 0.0721 * b);
-                    r *= lum * 2;
-                    g *= lum * 2;
-                    b *= lum * 2;
-                    return [r, g, b, 1];
-                }
-            },
-            data: data
-        }]
-    });
-}
-
-img.src = ROOT_PATH + '/data-gl/asset/sample.jpg';
-img.crossOrigin = 'Anonymous';
diff --git a/public/data-gl/bar3d-noise-modified-from-marpi-demo.js b/public/data-gl/bar3d-noise-modified-from-marpi-demo.js
deleted file mode 100644
index be0a4d5..0000000
--- a/public/data-gl/bar3d-noise-modified-from-marpi-demo.js
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
-title: Noise modified from marpi's demo
-category: bar3D
-titleCN: Noise modified from marpi's demo
-*/
-
-$.getScript('https://cdn.jsdelivr.net/npm/simplex-noise@2.4.0/simplex-noise.js').done(function () {
-
-
-var simplex = new SimplexNoise();
-
-window.onresize = myChart.resize;
-
-var UPDATE_DURATION = 1000;
-
-function initVisualizer() {
-
-    var config = {
-        numWaves: 2,
-        randomize: randomize,
-        color1: '#000',
-        color2: "#300",
-        color3: "#fff",
-        size: 150,
-        roughness: 0.5,
-        metalness: 0.
-    };
-
-    //gui.add(config, "numWaves", 1, 3).name("Waves number").onChange(update).listen();
-    for (var i = 0; i < 2; i++) {
-        config["wave" + i + "axis" + "x"] = Math.random();
-        config["wave" + i + "axis" + "y"] = Math.random();
-        config["wave" + i + "rounding"] = Math.random();
-        config["wave" + i + "square"] = Math.random();
-    }
-
-    function randomize() {
-        //config.numWaves = Math.floor(Math.random() * 3) + 1;
-        for (var i = 0; i < 2; i++) {
-            config["wave" + i + "axis" + "x"] = Math.random();
-            config["wave" + i + "axis" + "y"] = Math.random();
-            config["wave" + i + "rounding"] = Math.random();
-            config["wave" + i + "square"] = Math.random();
-        }
-
-        // Iterate over all controllers
-        for (var i in gui.__controllers) {
-            gui.__controllers[i].updateDisplay();
-        }
-        update();
-    }
-
-    function update() {
-        var item = [];
-        var dataProvider = [];
-
-        var mod = .1
-
-        //config.numWaves = Math.round(config.numWaves)
-
-        //var occurenceR = Math.random() * .02
-        //var r = 0//Math.random()
-        for (var s = 0; s < config.size * config.size; s++) {
-            var x = s % config.size;
-            var y = Math.floor(s / config.size);
-
-            //if (Math.random() < occurenceR)
-            //    r = Math.random()
-
-            var output = 0;
-            for (var i = 0; i < config.numWaves; i++) {
-                var n = simplex.noise2D(i * 213 + (-50 + x) * mod * (1 - config["wave" + i + "axis" + "x"]) * .5, i * 3124 + (-50 + y) * mod * (1 - config["wave" + i + "axis" + "y"]) * .5)
-                n = Math.pow(n, 1.95 - 1.9 * config["wave" + i + "rounding"])
-                var square = Math.floor((1.1 - config["wave" + i + "square"]) * 100)
-                n = Math.round(n * square) / square;
-                    //output*=n
-                if (output < n)
-                    output = n;
-            }
-            dataProvider.push([x, y, (output + 0.1) * 2]);
-        }
-
-
-        myChart.setOption({
-            visualMap: {
-                inRange: {
-                    barSize: 100 / config.size,
-                    color: [config.color1, config.color2, config.color3],
-                }
-            },
-            series: [{
-                data: dataProvider,
-                realisticMaterial: {
-                    roughness: config.roughness,
-                    metalness: config.metalness
-                }
-            }]
-        });
-        //setTimeout(update, UPDATE_DURATION);
-    }
-
-    update();
-}
-var focalRange = 40
-var blurRadius = 4
-
-myChart.setOption(option = {
-    toolbox: {
-        left: 20,
-        iconStyle: {
-            normal: {
-                borderColor: '#fff'
-            }
-        }
-    },
-    tooltip: {},
-    visualMap: {
-        show: false,
-        min: 0.1,
-        max: 2.5,
-        inRange: {
-            color: ['#000', '#300', '#fff']
-        }
-    },
-    xAxis3D: {
-        type: 'value'
-    },
-    yAxis3D: {
-        type: 'value'
-    },
-    zAxis3D: {
-        type: 'value',
-        min: -6,
-        max: 6
-    },
-    grid3D: {
-        show: false,
-        environment: '#000',
-        viewControl: {
-            distance: 100,
-            maxDistance: 150,
-            minDistance: 50,
-            alpha: 38,
-            beta: 220,
-            minAlpha: 10,
-            //maxBeta: 360,
-        },
-        postEffect: {
-            enable: true,
-            SSAO: {
-                enable: true,
-                intensity: 1.3,
-                radius: 5
-            },
-            screenSpaceReflection: {
-                enable: false
-            },
-            depthOfField: {
-                enable: true,
-                blurRadius: blurRadius,
-                focalRange: focalRange,
-                focalDistance: 70
-            }
-        },
-        light: {
-            main: {
-                intensity: 1,
-                shadow: true,
-                shadowQuality: 'high',
-                alpha: 30
-            },
-            ambient: {
-                intensity: 0
-            },
-            ambientCubemap: {
-                texture: ROOT_PATH + '/data-gl/asset/pisa.hdr',
-                exposure: 2,
-                diffuseIntensity: 1,
-                specularIntensity: 1
-            }
-        }
-    },
-    series: [{
-        type: 'bar3D',
-        silent: true,
-        shading: 'realistic',
-        realisticMaterial: {
-            roughness: 0.5,
-            metalness: 0
-        },
-        instancing: true,
-        barSize: 0.6,
-        data: [],
-        lineStyle: {
-            width: 4
-        },
-        itemStyle: {
-            color: "#fff"
-        },
-        animation: false,
-        animationDurationUpdate: UPDATE_DURATION
-    }]
-});
-
-setTimeout(function() {
-    initVisualizer();
-});
-
-
-});
\ No newline at end of file
diff --git a/public/data-gl/bar3d-on-mapbox.js b/public/data-gl/bar3d-on-mapbox.js
deleted file mode 100644
index 00dc294..0000000
--- a/public/data-gl/bar3d-on-mapbox.js
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
-title: Bar3D on Mapbox
-category: bar3D
-titleCN: Bar3D on Mapbox
-*/
-
-mapboxgl.accessToken = 'pk.eyJ1IjoicGlzc2FuZyIsImEiOiJjaXBnaGYxcW8wMDFodWNtNDc4NzdqMWR2In0.4XUWeduDltiCbsIiS-U8Lg';
-
-
-$.getJSON(ROOT_PATH + '/data-gl/asset/data/population.json', function (data) {
-
-    data = data.filter(function (dataItem) {
-        return dataItem[2] > 0;
-    }).map(function (dataItem) {
-        return [dataItem[0], dataItem[1], dataItem[2]];
-    });
-
-    myChart.setOption({
-        visualMap: {
-            show: false,
-            max: 1000,
-            calculable: true,
-            realtime: false,
-            inRange: {
-                color: ['#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf', '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026']
-            },
-            outOfRange: {
-                colorAlpha: 0
-            }
-        },
-        mapbox: {
-            center: [104.114129, 37.550339],
-            zoom: 3,
-            pitch: 50,
-            bearing: -10,
-            style: 'mapbox://styles/mapbox/light-v9',
-            altitudeScale: 3e2,
-            postEffect: {
-                enable: true,
-                SSAO: {
-                    enable: true,
-                    radius: 2
-                }
-            },
-            light: {
-                main: {
-                    intensity: 2,
-                    shadow: true,
-                    shadowQuality: 'high'
-                },
-                ambient: {
-                    intensity: 0.
-                },
-                ambientCubemap: {
-                    texture: ROOT_PATH + '/asset/canyon.hdr',
-                    exposure: 2,
-                    diffuseIntensity: 0.5
-                }
-            }
-        },
-        series: [{
-            type: 'bar3D',
-            coordinateSystem: 'mapbox',
-            shading: 'lambert',
-            minHeight: 0.1,
-            barSize: 0.3,
-            data: data,
-            silent: true
-        }]
-    });
-});
\ No newline at end of file
diff --git a/public/data-gl/bar3d-shanghai.js b/public/data-gl/bar3d-shanghai.js
deleted file mode 100644
index c1603eb..0000000
--- a/public/data-gl/bar3d-shanghai.js
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
-title: 上海房价可视化 GL 版
-category: bar3D
-titleCN: 上海房价可视化 GL 版
-*/
-
-var uploadedDataURL = ROOT_PATH + '/asset/get/s/data-1495284690309-Bk9Ro3Te-.json';
-mapboxgl.accessToken = mapboxglToken;
-
-myChart.showLoading();
-
-$.getJSON(uploadedDataURL, function(linedata) {
-
-    myChart.hideLoading();
-
-    myChart.setOption({
-
-        visualMap: {
-            show: false,
-            calculable: true,
-            realtime: false,
-            inRange: {
-                color: ['#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf', '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026']
-            },
-            outOfRange: {
-                colorAlpha: 0
-            },
-            max: linedata[1]
-        },
-        mapbox: {
-            center: [121.4693, 31.123070],
-            zoom: 10,
-            pitch: 50,
-            bearing: -10,
-            style: 'mapbox://styles/mapbox/light-v9',
-            boxHeight: 50,
-            // altitudeScale: 3e2,
-            postEffect: {
-                enable: true,
-                SSAO: {
-                    enable: true,
-                    radius: 2,
-                    intensity: 1.5
-                }
-            },
-            light: {
-                main: {
-                    intensity: 1,
-                    shadow: true,
-                    shadowQuality: 'high'
-                },
-                ambient: {
-                    intensity: 0.
-                },
-                ambientCubemap: {
-                    texture: ROOT_PATH + '/data-gl/asset/canyon.hdr',
-                    exposure: 1,
-                    diffuseIntensity: 0.5
-                }
-            }
-        },
-        series: [{
-            type: 'bar3D',
-            shading: 'realistic',
-            coordinateSystem: 'mapbox',
-            barSize: 0.2,
-            silent: true,
-            data: linedata[0]
-        }]
-    });
-});
\ No newline at end of file
diff --git a/public/data-gl/bar3d-simplex-noise.js b/public/data-gl/bar3d-simplex-noise.js
deleted file mode 100644
index 2c32c9f..0000000
--- a/public/data-gl/bar3d-simplex-noise.js
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
-title: Bar3D - Simplex Noise
-category: bar3D
-titleCN: Bar3D - Simplex Noise
-theme: dark
-*/
-
-$.getScript('https://cdn.jsdelivr.net/npm/simplex-noise@2.4.0/simplex-noise.js').done(function () {
-
-
-var noise = new SimplexNoise(Math.random);
-function generateData(theta, min, max) {
-    var data = [];
-    for (var i = 0; i <= 50; i++) {
-        for (var j = 0; j <= 50; j++) {
-            var value = noise.noise2D(i / 20, j / 20);
-            valMax = Math.max(valMax, value);
-            valMin = Math.min(valMin, value);
-            data.push([i, j, value * 2 + 4]);
-        }
-    }
-    return data;
-}
-var valMin = Infinity;
-var valMax = -Infinity;
-var data = generateData(2, -5, 5);
-console.log(valMin, valMax);
-
-myChart.setOption(option = {
-    visualMap: {
-        show: false,
-        min: 2,
-        max: 6,
-        inRange: {
-            color: ['#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf', '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026']
-        }
-    },
-    xAxis3D: {
-        type: 'value'
-    },
-    yAxis3D: {
-        type: 'value'
-    },
-    zAxis3D: {
-        type: 'value',
-        max: 10,
-        min: 0
-    },
-    grid3D: {
-        axisLine: {
-            lineStyle: { color: '#fff' }
-        },
-        axisPointer: {
-            lineStyle: { color: '#fff' }
-        },
-        viewControl: {
-            // autoRotate: true
-        },
-        light: {
-            main: {
-                shadow: true,
-                quality: 'ultra',
-                intensity: 1.5
-            }
-        }
-    },
-    series: [{
-        type: 'bar3D',
-        data: data,
-        shading: 'lambert',
-        label: {
-            formatter: function (param) {
-                return param.value[2].toFixed(1);
-            }
-        }
-    }]
-});
-
-});
\ No newline at end of file
diff --git a/public/data-gl/bar3d-voxelize-image.js b/public/data-gl/bar3d-voxelize-image.js
deleted file mode 100644
index 611425d..0000000
--- a/public/data-gl/bar3d-voxelize-image.js
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
-title: Voxelize image
-category: bar3D
-titleCN: Voxelize image
-*/
-
-var canvas = document.createElement('canvas');
-var ctx = canvas.getContext('2d');
-
-var imgData;
-var currentImg;
-
-// Configurations
-var config = {
-    scale: 0.3,
-    roughness: 0,
-    metalness: 1,
-    projection: 'orthographic',
-    depthOfField: 4,
-    lockY: false,
-    move: true,
-    sameColor: false,
-    color: '#777',
-    colorContrast: 1.2,
-    lightIntensity: 1,
-    lightColor: '#fff',
-    lightRotate: 30,
-    lightPitch: 40,
-    AO: 1.5,
-    showEnvironment: false,
-
-    barNumber: 80,
-    barBevel: 0.18,
-    barSize: 1.2
-};
-
-option = {
-    tooltip: {},
-    backgroundColor: '#000',
-    xAxis3D: {
-        type: 'value'
-    },
-    yAxis3D: {
-        type: 'value'
-    },
-    zAxis3D: {
-        type: 'value',
-        min: 0,
-        max: 100
-    },
-    grid3D: {
-        show: false,
-        viewControl: {
-            projection: 'perspective',
-            alpha: 45,
-            beta: -45,
-            panSensitivity: config.move ? 1 : 0,
-            rotateSensitivity: config.lockY ? [1, 0] : 1,
-            damping: 0.9,
-            distance: 60
-        },
-        postEffect: {
-            enable: true,
-            bloom: {
-                intensity: 0.2
-            },
-            screenSpaceAmbientOcclusion: {
-                enable: true,
-                intensity: 1.5,
-                radius: 5,
-                quality: 'high'
-            },
-            screenSpaceReflection: {
-                enable: true
-            },
-            depthOfField: {
-                enable: true,
-                blurRadius: config.depthOfField,
-                fstop: 10,
-                focalDistance: 55
-            }
-        },
-        boxDepth: 100,
-        boxHeight: 20,
-        environment: 'none',
-        light: {
-            main: {
-                shadow: true,
-                intensity: 2
-            },
-            ambientCubemap: {
-                texture: ROOT_PATH + '/data-gl/asset/pisa.hdr',
-                exposure: 2,
-                diffuseIntensity: 0.2,
-                specularIntensity: 1.5
-            }
-        }
-    }
-};
-
-function updateData(pixelData, width, height) {
-    console.time('update');
-    var data = new Float32Array(pixelData.length / 4 * 3);
-    var off = 0;
-    for (var i = 0; i < pixelData.length / 4; i++) {
-        var r = pixelData[i * 4];
-        var g = pixelData[i * 4 + 1];
-        var b = pixelData[i * 4 + 2];
-
-        var lum = 0.2125 * r + 0.7154 * g + 0.0721 * b;
-        lum = (lum - 125) * config.scale + 50;
-        data[off++] = i % width;
-        data[off++] = height - Math.floor(i / width);
-        data[off++] = lum;
-    };
-
-    myChart.setOption({
-        grid3D: {
-            boxWidth: 100 / height * width
-        },
-        series: [{
-            animation: false,
-            type: 'bar3D',
-            shading: 'realistic',
-            realisticMaterial: {
-                roughness: config.roughness,
-                metalness: config.metalness
-            },
-            barSize: config.barSize,
-            bevelSize: config.barBevel,
-            silent: true,
-            dimensions: ['x', 'y', 'z'],
-            itemStyle: {
-                color: config.sameColor ? config.color : function (params) {
-                    var i = params.dataIndex;
-                    var r = pixelData[i * 4] / 255;
-                    var g = pixelData[i * 4 + 1] / 255;
-                    var b = pixelData[i * 4 + 2] / 255;
-                    var lum = 0.2125 * r + 0.7154 * g + 0.0721 * b;
-                    r *= lum * config.colorContrast;
-                    g *= lum * config.colorContrast;
-                    b *= lum * config.colorContrast;
-                    return [r, g, b, 1];
-                }
-            },
-            data: data
-        }]
-    });
-
-    console.timeEnd('update');
-}
-
-function loadImage(img) {
-    var height = (canvas.height = Math.min(config.barNumber, img.height));
-    var aspect = img.width / img.height;
-    var width = (canvas.width = Math.round(height * aspect));
-
-    ctx.drawImage(img, 0, 0, width, height);
-
-    imgData = ctx.getImageData(0, 0, width, height);
-
-    updateData(imgData.data, width, height);
-}
-
-// Default
-var img = new Image();
-img.onload = function() {
-    loadImage(img);
-    currentImg = img;
-};
-img.src = ROOT_PATH + '/data-gl/asset/bitcoin.png';
\ No newline at end of file
diff --git a/public/data-gl/flowGL-noise.js b/public/data-gl/flowGL-noise.js
deleted file mode 100644
index 2d57e64..0000000
--- a/public/data-gl/flowGL-noise.js
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
-title: Flow on the cartesian
-category: flowGL
-titleCN: 直角坐标系上的向量场
-theme: dark
-videoStart: 2000
-videoEnd: 10000
-*/
-
-$.getScript('https://cdn.jsdelivr.net/npm/simplex-noise@2.4.0/simplex-noise.js').done(function () {
-
-var noise = new SimplexNoise(Math.random);
-var noise2 = new SimplexNoise(Math.random);
-function generateData() {
-    var data = [];
-    for (var i = 0; i <= 50; i++) {
-        for (var j = 0; j <= 50; j++) {
-            var dx = noise.noise2D(i / 30, j / 30);
-            var dy = noise2.noise2D(i / 30, j / 30);
-            var mag = Math.sqrt(dx * dx + dy * dy);
-            valMax = Math.max(valMax, mag);
-            valMin = Math.min(valMin, mag);
-            data.push([i, j, dx, dy, mag]);
-        }
-    }
-    return data;
-}
-var valMin = Infinity;
-var valMax = -Infinity;
-var data = generateData();
-
-
-myChart.setOption({
-    visualMap: {
-        show: false,
-        min: valMin,
-        max: valMax,
-        dimension: 4,
-        inRange: {
-            color: ['#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf', '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026']
-        }
-    },
-    xAxis: {
-        type: 'value',
-        axisLine: {
-            lineStyle: {
-                color: '#fff'
-            }
-        },
-        splitLine: {
-            show: false,
-            lineStyle: {
-                color: 'rgba(255,255,255,0.2)'
-            }
-        }
-    },
-    yAxis: {
-        type: 'value',
-        axisLine: {
-            lineStyle: {
-                color: '#fff'
-            }
-        },
-        splitLine: {
-            show: false,
-            lineStyle: {
-                color: 'rgba(255,255,255,0.2)'
-            }
-        }
-    },
-    series: [{
-        type: 'flowGL',
-        data: data,
-        particleDensity: 64,
-        particleSize: 5,
-        itemStyle: {
-            opacity: 0.5
-        }
-    }, {
-        type: 'custom',
-        data: data,
-        encode: {
-            x: 0,
-            y: 0
-        },
-        renderItem: function (params, api) {
-            var x = api.value(0), y = api.value(1), dx = api.value(2), dy = api.value(3);
-            var start = api.coord([x - dx / 2, y - dy / 2]);
-            var end = api.coord([x + dx / 2, y + dy / 2]);
-            return {
-                type: 'line',
-                shape: {
-                    x1: start[0], y1: start[1],
-                    x2: end[0], y2: end[1]
-                },
-                style: {
-                    lineWidth: 2,
-                    stroke:'#fff',
-                    opacity: 0.2
-                }
-            }
-        }
-    }]
-});
-
-});
\ No newline at end of file
diff --git a/public/data-gl/geo3d-with-different-height.js b/public/data-gl/geo3d-with-different-height.js
deleted file mode 100644
index 3ab2a29..0000000
--- a/public/data-gl/geo3d-with-different-height.js
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
-title: Geo3D with Different Height
-category: geo3D
-titleCN: Geo3D with Different Height
-*/
-
-
-$.getJSON(ROOT_PATH + '/data-gl/asset/data/world-population.json', function (populationData) {
-
-    var max = -Infinity;
-    var min = Infinity;
-    populationData.forEach(function (item) {
-        max = Math.max(Math.log(item.value), max);
-        min = Math.min(Math.log(item.value), min);
-    });
-
-    var regions = populationData.map(function (item) {
-        return {
-            name: item.name,
-            height: (Math.log(item.value) - min) / (max - min) * 3
-        };
-    })
-
-    myChart.setOption(option = {
-        backgroundColor: '#cdcfd5',
-        geo3D: {
-            map: 'world',
-            shading: 'lambert',
-
-            lambertMaterial: {
-                detailTexture: ROOT_PATH + '/data-gl/asset/woods.jpg',
-                textureTiling: 20
-            },
-
-            postEffect: {
-                enable: true,
-                SSAO: {
-                    enable: true,
-                    radius: 3,
-                    quality: 'high'
-                }
-            },
-            groundPlane: {
-                show: true
-            },
-            light: {
-                main: {
-                    intensity: 1,
-                    shadow: true,
-                    shadowQuality: 'high',
-                    alpha: 30
-                },
-                ambient: {
-                    intensity: 0
-                },
-                ambientCubemap: {
-                    texture: ROOT_PATH + '/data-gl/asset/canyon.hdr',
-                    exposure: 2,
-                    diffuseIntensity: 0.3
-                }
-            },
-            viewControl: {
-                distance: 50
-            },
-
-            regionHeight: 0.5,
-
-            regions: regions
-        }
-    });
-
-});
\ No newline at end of file
diff --git a/public/data-gl/geo3d.js b/public/data-gl/geo3d.js
deleted file mode 100644
index 6a9eea2..0000000
--- a/public/data-gl/geo3d.js
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
-title: Geo3D
-category: geo3D
-titleCN: Geo3D
-*/
-
-option = {
-    geo3D: {
-        map: 'world',
-        lambertMaterial: {
-            baseTexture: ROOT_PATH + '/data-gl/asset/woods.jpg',
-            textureTiling: 10
-        },
-
-        postEffect: {
-            enable: true,
-            SSAO: {
-                enable: true,
-                radius: 1
-            }
-        },
-        groundPlane: {
-            show: true
-        },
-        light: {
-            main: {
-                intensity: 1,
-                shadow: true
-            },
-            ambientCubemap: {
-                texture: ROOT_PATH + '/data-gl/asset/canyon.hdr'
-            }
-        },
-        viewControl: {
-            distance: 50
-        },
-
-        itemStyle: {
-            borderColor: '#000',
-            borderWidth: 0.5
-        },
-
-
-        boxHeight: 1.0
-    }
-}
-
-myChart.on('click', function () {
-    alert('click')
-});
\ No newline at end of file
diff --git a/public/data-gl/global-population-bar3d-on-globe.js b/public/data-gl/global-population-bar3d-on-globe.js
deleted file mode 100644
index 305a94f..0000000
--- a/public/data-gl/global-population-bar3d-on-globe.js
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
-title: Global Population - Bar3D on Globe
-category: bar3D
-titleCN: Global Population - Bar3D on Globe
-*/
-
-$.getJSON(ROOT_PATH + "/data-gl/asset/data/population.json", function (data) {
-
-    data = data.filter(function (dataItem) {
-        return dataItem[2] > 0;
-    }).map(function (dataItem) {
-        return [dataItem[0], dataItem[1], Math.sqrt(dataItem[2])];
-    });
-
-    option = {
-        backgroundColor: '#000',
-        globe: {
-            baseTexture: ROOT_PATH + "/data-gl/asset/world.topo.bathy.200401.jpg",
-            heightTexture: ROOT_PATH + "/data-gl/asset/world.topo.bathy.200401.jpg",
-            shading: 'lambert',
-            environment: ROOT_PATH + '/data-gl/asset/starfield.jpg',
-            light: {
-                main: {
-                    intensity: 2
-                }
-            },
-            viewControl: {
-                autoRotate: false
-            }
-        },
-        visualMap: {
-            max: 40,
-            calculable: true,
-            realtime: false,
-            inRange: {
-                colorLightness: [0.2, 0.9]
-            },
-            textStyle: {
-                color: '#fff'
-            },
-            controller: {
-                inRange: {
-                    color: 'orange'
-                }
-            },
-            outOfRange: {
-                colorAlpha: 0
-            }
-        },
-        series: [{
-            type: 'bar3D',
-            coordinateSystem: 'globe',
-            data: data,
-            barSize: 0.6,
-            minHeight: 0.2,
-            silent: true,
-            itemStyle: {
-                color: 'orange'
-            }
-        }]
-    };
-
-    myChart.setOption(option);
-})
\ No newline at end of file
diff --git a/public/data-gl/global-wind-visualization-2.js b/public/data-gl/global-wind-visualization-2.js
deleted file mode 100644
index 89e2e3a..0000000
--- a/public/data-gl/global-wind-visualization-2.js
+++ /dev/null
@@ -1,248 +0,0 @@
-/*
-title: Global Wind Visualization 2
-category: flowGL
-tags: bmap
-titleCN: Global Wind Visualization 2
-videoStart: 2000
-videoEnd: 10000
-*/
-
-$.getJSON(ROOT_PATH + '/data-gl/asset/data/gfs.json', function(windData) {
-    buildGrid(windData, function(header, grid) {
-        var data = [];
-        var p = 0;
-        var maxMag = 0;
-        var minMag = Infinity;
-        for (var j = 0; j < header.ny; j++) {
-            for (var i = 0; i < header.nx; i++) {
-                var vx = grid[j][i][0];
-                var vy = grid[j][i][1];
-                var mag = Math.sqrt(vx * vx + vy * vy);
-                var lng = i / header.nx * 360;
-                if (lng >= 180) {
-                    lng = 180 - lng;
-                }
-                // 数据是一个一维数组
-                // [ [经度, 维度,向量经度方向的值,向量维度方向的值] ]
-                data.push([
-                    lng,
-                    90 - j / header.ny * 180,
-                    vx,
-                    vy,
-                    mag
-                ]);
-                maxMag = Math.max(mag, maxMag);
-                minMag = Math.min(mag, minMag);
-            }
-        }
-        myChart.setOption({
-            backgroundColor: '#001122',
-            visualMap: {
-                left: 'right',
-                min: minMag,
-                max: maxMag,
-                dimension: 4,
-                inRange: {
-                    // color: ['green', 'yellow', 'red']
-                    color: ['#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf', '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026']
-                },
-                realtime: false,
-                calculable: true,
-                textStyle: {
-                    color: '#fff'
-                }
-            },
-            bmap: {
-                center: [0, 0],
-                zoom: 1,
-                roam: true,
-                mapStyle: {
-                    'styleJson': [{
-                        'featureType': 'water',
-                        'elementType': 'all',
-                        'stylers': {
-                            'color': '#031628'
-                        }
-                    }, {
-                        'featureType': 'land',
-                        'elementType': 'geometry',
-                        'stylers': {
-                            'color': '#000102'
-                        }
-                    }, {
-                        'featureType': 'highway',
-                        'elementType': 'all',
-                        'stylers': {
-                            'visibility': 'off'
-                        }
-                    }, {
-                        'featureType': 'arterial',
-                        'elementType': 'geometry.fill',
-                        'stylers': {
-                            'color': '#000000'
-                        }
-                    }, {
-                        'featureType': 'arterial',
-                        'elementType': 'geometry.stroke',
-                        'stylers': {
-                            'color': '#0b3d51'
-                        }
-                    }, {
-                        'featureType': 'local',
-                        'elementType': 'geometry',
-                        'stylers': {
-                            'color': '#000000'
-                        }
-                    }, {
-                        'featureType': 'railway',
-                        'elementType': 'geometry.fill',
-                        'stylers': {
-                            'color': '#000000'
-                        }
-                    }, {
-                        'featureType': 'railway',
-                        'elementType': 'geometry.stroke',
-                        'stylers': {
-                            'color': '#08304b'
-                        }
-                    }, {
-                        'featureType': 'subway',
-                        'elementType': 'geometry',
-                        'stylers': {
-                            'lightness': -70
-                        }
-                    }, {
-                        'featureType': 'building',
-                        'elementType': 'geometry.fill',
-                        'stylers': {
-                            'color': '#000000'
-                        }
-                    }, {
-                        'featureType': 'all',
-                        'elementType': 'labels.text.fill',
-                        'stylers': {
-                            'color': '#857f7f'
-                        }
-                    }, {
-                        'featureType': 'all',
-                        'elementType': 'labels.text.stroke',
-                        'stylers': {
-                            'color': '#000000'
-                        }
-                    }, {
-                        'featureType': 'building',
-                        'elementType': 'geometry',
-                        'stylers': {
-                            'color': '#022338'
-                        }
-                    }, {
-                        'featureType': 'green',
-                        'elementType': 'geometry',
-                        'stylers': {
-                            'color': '#062032'
-                        }
-                    }, {
-                        'featureType': 'boundary',
-                        'elementType': 'all',
-                        'stylers': {
-                            'color': '#465b6c'
-                        }
-                    }, {
-                        'featureType': 'manmade',
-                        'elementType': 'all',
-                        'stylers': {
-                            'color': '#022338'
-                        }
-                    }, {
-                        'featureType': 'label',
-                        'elementType': 'all',
-                        'stylers': {
-                            'visibility': 'off'
-                        }
-                    }]
-                }
-            },
-            series: [{
-                type: 'flowGL',
-                coordinateSystem: 'bmap',
-                data: data,
-                supersampling: 4,
-                particleType: 'line',
-                particleDensity: 128,
-                particleSpeed: 1,
-                // gridWidth: windData.nx,
-                // gridHeight: windData.ny,
-                itemStyle: {
-                    opacity: 0.7
-                }
-            }]
-        });
-    });
-});
-
-
-// https://github.com/Esri/wind-js/blob/master/windy.js#L41
-var createWindBuilder = function(uComp, vComp) {
-    var uData = uComp.data,
-        vData = vComp.data;
-    return {
-        header: uComp.header,
-        //recipe: recipeFor("wind-" + uComp.header.surface1Value),
-        data: function(i) {
-            return [uData[i], vData[i]];
-        }
-    }
-};
-
-var createBuilder = function(data) {
-    var uComp = null,
-        vComp = null,
-        scalar = null;
-
-    data.forEach(function(record) {
-        switch (record.header.parameterCategory + "," + record.header.parameterNumber) {
-            case "2,2":
-                uComp = record;
-                break;
-            case "2,3":
-                vComp = record;
-                break;
-            default:
-                scalar = record;
-        }
-    });
-
-    return createWindBuilder(uComp, vComp);
-};
-
-var buildGrid = function(data, callback) {
-    var builder = createBuilder(data);
-
-    var header = builder.header;
-    var λ0 = header.lo1,
-        φ0 = header.la1; // the grid's origin (e.g., 0.0E, 90.0N)
-    var Δλ = header.dx,
-        Δφ = header.dy; // distance between grid points (e.g., 2.5 deg lon, 2.5 deg lat)
-    var ni = header.nx,
-        nj = header.ny; // number of grid points W-E and N-S (e.g., 144 x 73)
-    var date = new Date(header.refTime);
-    date.setHours(date.getHours() + header.forecastTime);
-
-    // Scan mode 0 assumed. Longitude increases from λ0, and latitude decreases from φ0.
-    // http://www.nco.ncep.noaa.gov/pmb/docs/grib2/grib2_table3-4.shtml
-    var grid = [],
-        p = 0;
-    var isContinuous = Math.floor(ni * Δλ) >= 360;
-    for (var j = 0; j < nj; j++) {
-        var row = [];
-        for (var i = 0; i < ni; i++, p++) {
-            row[i] = builder.data(p);
-        }
-        if (isContinuous) {
-            // For wrapped grids, duplicate first column as last column to simplify interpolation logic
-            row.push(row[0]);
-        }
-        grid[j] = row;
-    }
-    callback(header, grid);
-};
\ No newline at end of file
diff --git a/public/data-gl/global-wind-visualization.js b/public/data-gl/global-wind-visualization.js
deleted file mode 100644
index 9494961..0000000
--- a/public/data-gl/global-wind-visualization.js
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
-title: Global wind visualization
-category: flowGL
-tags: bmap
-titleCN: Global wind visualization
-videoStart: 2000
-videoEnd: 10000
-*/
-
-$.getJSON(ROOT_PATH + '/data-gl/asset/data/winds.json', function (windData) {
-
-    var data = [];
-    var p = 0;
-    var maxMag = 0;
-    var minMag = Infinity;
-    for (var j = 0; j < windData.ny; j++) {
-        for (var i = 0; i <= windData.nx; i++) {
-            // Continuous data.
-            var p = (i % windData.nx) + j * windData.nx;
-            var vx = windData.data[p][0];
-            var vy = windData.data[p][1];
-            var mag = Math.sqrt(vx * vx + vy * vy);
-            // 数据是一个一维数组
-            // [ [经度, 维度,向量经度方向的值,向量维度方向的值] ]
-            data.push([
-                i / windData.nx * 360 - 180,
-                j / windData.ny * 180 - 90,
-                vx,
-                vy,
-                mag
-            ]);
-            maxMag = Math.max(mag, maxMag);
-            minMag = Math.min(mag, minMag);
-        }
-    }
-    myChart.setOption(option = {
-        backgroundColor: '#001122',
-        visualMap: {
-            left: 'right',
-            min: minMag,
-            max: maxMag,
-            dimension: 4,
-            inRange: {
-                // color: ['green', 'yellow', 'red']
-                color: ['#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf', '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026']
-            },
-            realtime: false,
-            calculable: true,
-            textStyle: {
-                color: '#fff'
-            }
-        },
-        bmap: {
-            center: [0, 0],
-            zoom: 1,
-            roam: true,
-            mapStyle: {
-            'styleJson': [
-                {
-                'featureType': 'water',
-                'elementType': 'all',
-                'stylers': {
-                    'color': '#031628'
-                }
-                },
-                {
-                'featureType': 'land',
-                'elementType': 'geometry',
-                'stylers': {
-                    'color': '#000102'
-                }
-                },
-                {
-                'featureType': 'highway',
-                'elementType': 'all',
-                'stylers': {
-                    'visibility': 'off'
-                }
-                },
-                {
-                'featureType': 'arterial',
-                'elementType': 'geometry.fill',
-                'stylers': {
-                    'color': '#000000'
-                }
-                },
-                {
-                'featureType': 'arterial',
-                'elementType': 'geometry.stroke',
-                'stylers': {
-                    'color': '#0b3d51'
-                }
-                },
-                {
-                'featureType': 'local',
-                'elementType': 'geometry',
-                'stylers': {
-                    'color': '#000000'
-                }
-                },
-                {
-                'featureType': 'railway',
-                'elementType': 'geometry.fill',
-                'stylers': {
-                    'color': '#000000'
-                }
-                },
-                {
-                'featureType': 'railway',
-                'elementType': 'geometry.stroke',
-                'stylers': {
-                    'color': '#08304b'
-                }
-                },
-                {
-                'featureType': 'subway',
-                'elementType': 'geometry',
-                'stylers': {
-                    'lightness': -70
-                }
-                },
-                {
-                'featureType': 'building',
-                'elementType': 'geometry.fill',
-                'stylers': {
-                    'color': '#000000'
-                }
-                },
-                {
-                'featureType': 'all',
-                'elementType': 'labels.text.fill',
-                'stylers': {
-                    'color': '#857f7f'
-                }
-                },
-                {
-                'featureType': 'all',
-                'elementType': 'labels.text.stroke',
-                'stylers': {
-                    'color': '#000000'
-                }
-                },
-                {
-                'featureType': 'building',
-                'elementType': 'geometry',
-                'stylers': {
-                    'color': '#022338'
-                }
-                },
-                {
-                'featureType': 'green',
-                'elementType': 'geometry',
-                'stylers': {
-                    'color': '#062032'
-                }
-                },
-                {
-                'featureType': 'boundary',
-                'elementType': 'all',
-                'stylers': {
-                    'color': '#465b6c'
-                }
-                },
-                {
-                'featureType': 'manmade',
-                'elementType': 'all',
-                'stylers': {
-                    'color': '#022338'
-                }
-                },
-                {
-                'featureType': 'label',
-                'elementType': 'all',
-                'stylers': {
-                    'visibility': 'off'
-                }
-                }
-            ]
-            }
-        },
-        series: [{
-            type: 'flowGL',
-            coordinateSystem: 'bmap',
-            data: data,
-            supersampling: 4,
-            particleType: 'line',
-            particleDensity: 128,
-            particleSpeed: 1,
-            // gridWidth: windData.nx,
-            // gridHeight: windData.ny,
-            itemStyle: {
-                opacity: 0.7
-            }
-        }]
-    });
-});
\ No newline at end of file
diff --git a/public/data-gl/globe-atmosphere.js b/public/data-gl/globe-atmosphere.js
deleted file mode 100644
index e3499f5..0000000
--- a/public/data-gl/globe-atmosphere.js
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
-title: Globe with Atmosphere
-category: globe
-titleCN: 大气层显示
-*/
-
-option = {
-    backgroundColor: '#000',
-    globe: {
-        baseTexture: ROOT_PATH + '/data-gl/asset/earth.jpg',
-
-        shading: 'lambert',
-
-        environment: ROOT_PATH + '/data-gl/asset/starfield.jpg',
-
-        atmosphere: {
-            show: true
-        },
-
-        light: {
-            ambient: {
-                intensity: 0.1
-            },
-            main: {
-                intensity: 1.5
-            }
-        }
-    },
-    series: []
-};
\ No newline at end of file
diff --git a/public/data-gl/globe-contour-paint.js b/public/data-gl/globe-contour-paint.js
deleted file mode 100644
index 22d2d63..0000000
--- a/public/data-gl/globe-contour-paint.js
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
-title: Contour Paint
-category: globe
-titleCN: Contour Paint
-*/
-
-
-var config = {
-    color: '#c0101a',
-    levels: 50,
-    intensity: 100,
-    threshold: 0.01
-}
-
-var canvas = document.createElement('canvas');
-canvas.width = 4096;
-canvas.height = 2048;
-context = canvas.getContext("2d");
-
-context.lineWidth = 0.4;
-context.strokeStyle = config.color;
-context.fillStyle = config.color;
-context.shadowColor = config.color;
-
-$.when(
-    $.getScript('https://cdn.jsdelivr.net/npm/d3-array@2.8.0/dist/d3-array.js'),
-    $.getScript('https://cdn.jsdelivr.net/npm/d3-contour@2.0.0/dist/d3-contour.js'),
-    $.getScript('https://cdn.jsdelivr.net/npm/d3-geo@2.0.1/dist/d3-geo.js'),
-    $.getScript('https://cdn.jsdelivr.net/npm/d3-timer@2.0.0/dist/d3-timer.js')
-).done(function () {
-
-image(ROOT_PATH + '/data-gl/asset/bathymetry_bw_composite_4k.jpg').then(function(image) {
-    var m = image.height,
-        n = image.width,
-        values = new Array(n * m),
-        contours = d3.contours().size([n, m]).smooth(true),
-        projection = d3.geoIdentity().scale(canvas.width / n),
-        path = d3.geoPath(projection, context);
-
-    //   StackBlur.R(image, 5);
-
-    for (var j = 0, k = 0; j < m; ++j) {
-        for (var i = 0; i < n; ++i, ++k) {
-        values[k] = image.data[(k << 2)] / 255;
-        }
-    }
-
-    var opt = {
-        image: canvas
-    }
-
-    var results = [];
-    function update(threshold, levels) {
-        context.clearRect(0, 0, canvas.width, canvas.height);
-        var thresholds = [];
-        for (var i = 0; i < levels; i++) {
-            thresholds.push((threshold + 1 / levels * i) % 1);
-        }
-        results = contours.thresholds(thresholds)(values);
-        redraw();
-    }
-
-    function redraw() {
-        results.forEach(function (d, idx) {
-            context.beginPath();
-            path(d);
-            context.globalAlpha = 1;
-            context.stroke();
-            if (idx > config.levels / 5 * 3) {
-                context.globalAlpha = 0.01;
-                context.fill();
-            }
-        });
-        onupdate();
-    }
-
-
-    update(config.threshold, config.levels);
-
-    initCharts(opt);
-
-});
-
-function image(url) {
-    return new Promise(function(resolve) {
-        var image = new Image();
-        image.src = url;
-        image.crossOrigin = 'Anonymous';
-        image.onload = function() {
-            var canvas = document.createElement("canvas");
-            canvas.width = image.width / 4;
-            canvas.height = image.height / 4;
-            var context = canvas.getContext("2d");
-            context.drawImage(image, 0, 0, canvas.width, canvas.height);
-            resolve(context.getImageData(0, 0, canvas.width, canvas.height));
-        };
-    });
-}
-
-var contourChart = echarts.init(document.createElement('canvas'), null, {
-    width: 4096,
-    height: 2048
-});
-
-var img = new echarts.graphic.Image({
-    style: {
-        x: -1,
-        y: -1
-    }
-});
-
-onupdate = function () {
-    img.dirty();
-}
-
-function initCharts(opt) {
-    img.style.width = opt.image.width + 2;
-    img.style.height = opt.image.height + 2;
-    img.style.image = opt.image;
-    contourChart.getZr().add(img);
-
-
-    myChart.setOption({
-        backgroundColor: '#000',
-        globe: {
-
-            environment: ROOT_PATH + '/data-gl/asset/starfield.jpg',
-
-            heightTexture: ROOT_PATH + '/data-gl/asset/bathymetry_bw_composite_4k.jpg',
-
-            displacementScale: 0.05,
-            displacementQuality: 'high',
-
-            baseColor: '#111',
-
-            shading: 'realistic',
-            realisticMaterial: {
-                roughness: 0.2,
-                metalness: 0
-            },
-
-            postEffect: {
-                enable: true,
-                depthOfField: {
-                    // enable: true
-                }
-            },
-            light: {
-                ambient: {
-                    intensity: 0
-                },
-                main: {
-                    intensity: 0.1,
-                    shadow: false
-                },
-                ambientCubemap: {
-                    texture: ROOT_PATH + '/data-gl/asset/lake.hdr',
-                    exposure: 1,
-                    diffuseIntensity: 0.5,
-                    specularIntensity: 2
-                }
-            },
-            viewControl: {
-                autoRotate: false
-            },
-
-            layers: [{
-                type: 'blend',
-                blendTo: 'albedo',
-                texture: contourChart,
-                intensity: 50
-            }]
-        }
-    });
-}
-
-
-});
diff --git a/public/data-gl/globe-country-carousel.js b/public/data-gl/globe-country-carousel.js
deleted file mode 100644
index 1c94c78..0000000
--- a/public/data-gl/globe-country-carousel.js
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
-title: Country Carousel
-category: globe
-titleCN: Country Carousel
-*/
-
-var canvas = document.createElement('canvas');
-var mapChart = echarts.init(canvas, null, {
-    width: 2048,
-    height: 1024
-});
-
-mapChart.setOption({
-    backgroundColor: '#999',
-    geo: {
-        type: 'map',
-        map: 'world',
-        top: 0,
-        left: 0,
-        right: 0,
-        bottom: 0,
-        boundingCoords: [[-180, 90], [180, -90]],
-        silent: true,
-        itemStyle: {
-            borderColor: '#000'
-        },
-        label: {
-            color: '#fff',
-            fontSize: 40
-        }
-    }
-});
-option = {
-    globe: {
-        baseTexture: mapChart,
-        heightTexture: ROOT_PATH + '/data-gl/asset/bathymetry_bw_composite_4k.jpg',
-
-        displacementScale: 0.1,
-
-        shading: 'realistic',
-        realisticMaterial: {
-            roughness: 0.8,
-            metalness: 0
-        },
-
-        postEffect: {
-            enable: true
-        },
-        temporalSuperSampling: {
-            enable: true
-        },
-        light: {
-            ambient: {
-                intensity: 0
-            },
-            main: {
-                intensity: 2,
-                shadow: true
-            },
-            ambientCubemap: {
-                texture: ROOT_PATH + '/data-gl/asset/lake.hdr',
-                exposure: 1,
-                diffuseIntensity: 0.2
-            }
-        },
-        viewControl: {
-            animationDurationUpdate: 1000,
-            animationEasingUpdate: 'cubicInOut',
-            targetCoord: [116.46, 39.92],
-            autoRotate: false
-        }
-    },
-    series: []
-};
-
-var regions = mapChart.getModel().getComponent('geo').coordinateSystem.regions;
-
-setInterval(function () {
-    var region = regions[Math.round(Math.random() * (regions.length - 1))];
-    myChart.setOption({
-        title: {
-            left: 'center',
-            top: 'center',
-            text: region.name,
-            textStyle: {
-                fontSize: 40
-            }
-        },
-        globe: {
-            viewControl: {
-                targetCoord: region.center
-            }
-        }
-    });
-    mapChart.setOption({
-        geo: {
-            regions: [{
-                name: region.name,
-                itemStyle: {
-                    normal: {
-                        areaColor: '#444'
-                    }
-                }
-            }]
-        }
-    })
-}, 2000);
\ No newline at end of file
diff --git a/public/data-gl/globe-displacement.js b/public/data-gl/globe-displacement.js
deleted file mode 100644
index 06b2125..0000000
--- a/public/data-gl/globe-displacement.js
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
-title: Globe Displacement
-category: globe
-titleCN: Globe Displacement
-*/
-
-option = {
-    globe: {
-        displacementTexture: ROOT_PATH + '/data-gl/asset/bathymetry_bw_composite_4k.jpg',
-
-        displacementScale: 0.1,
-        displacementQuality: 'ultra',
-
-        shading: 'realistic',
-        realisticMaterial: {
-            roughness: 0.8,
-            metalness: 0
-        },
-
-        postEffect: {
-            enable: true,
-            SSAO: {
-                enable: true,
-                radius: 2,
-                intensity: 1.5,
-                quality: 'high'
-            }
-        },
-        temporalSuperSampling: {
-            enable: true
-        },
-        light: {
-            ambient: {
-                intensity: 0
-            },
-            main: {
-                intensity: 1,
-                shadow: true
-            },
-            ambientCubemap: {
-                texture: ROOT_PATH + '/data-gl/asset/pisa.hdr',
-                exposure: 1,
-                diffuseIntensity: 0.2
-            }
-        },
-        viewControl: {
-            autoRotate: false
-        },
-        debug: {
-            wireframe: {
-                show: true
-            }
-        }
-    },
-    series: []
-};
\ No newline at end of file
diff --git a/public/data-gl/globe-echarts-gl-hello-world.js b/public/data-gl/globe-echarts-gl-hello-world.js
deleted file mode 100644
index 6ef4cb5..0000000
--- a/public/data-gl/globe-echarts-gl-hello-world.js
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
-title: ECharts-GL Hello World
-category: globe
-titleCN: ECharts-GL Hello World
-scripts: 'https://cdn.jsdelivr.net/gh/ecomfe/echarts-gl/dist/echarts-gl.min.js'
-videoStart: 2000
-videoEnd: 6000
-*/
-
-option = {
-    backgroundColor: '#000',
-    globe: {
-        baseTexture: ROOT_PATH + "/data-gl/asset/world.topo.bathy.200401.jpg",
-        heightTexture: ROOT_PATH + "/data-gl/asset/world.topo.bathy.200401.jpg",
-        displacementScale: 0.04,
-        shading: 'realistic',
-        environment: ROOT_PATH + '/data-gl/asset/starfield.jpg',
-        realisticMaterial: {
-            roughness: 0.9
-        },
-        postEffect: {
-            enable: true
-        },
-        light: {
-            main: {
-                intensity: 5,
-                shadow: true
-            },
-            ambientCubemap: {
-                texture: ROOT_PATH + '/data-gl/asset/pisa.hdr',
-                diffuseIntensity: 0.2
-            }
-        }
-    }
-};
\ No newline at end of file
diff --git a/public/data-gl/globe-layers.js b/public/data-gl/globe-layers.js
deleted file mode 100644
index ef3d0e5..0000000
--- a/public/data-gl/globe-layers.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
-title: Globe Layers
-category: globe
-titleCN: Globe Layers
-videoStart: 2000
-videoEnd: 6000
-*/
-
-option = {
-    backgroundColor: '#000',
-    globe: {
-        baseTexture: ROOT_PATH + '/data-gl/asset/earth.jpg',
-        heightTexture: ROOT_PATH + '/data-gl/asset/bathymetry_bw_composite_4k.jpg',
-
-        displacementScale: 0.1,
-
-        shading: 'lambert',
-
-        environment: ROOT_PATH + '/data-gl/asset/starfield.jpg',
-
-        light: {
-            ambient: {
-                intensity: 0.1
-            },
-            main: {
-                intensity: 1.5
-            }
-        },
-
-        layers: [{
-            type: 'blend',
-            blendTo: 'emission',
-            texture: ROOT_PATH + '/data-gl/asset/night.jpg'
-        }, {
-            type: 'overlay',
-            texture: ROOT_PATH + '/data-gl/asset/clouds.png',
-            shading: 'lambert',
-            distance: 5
-        }]
-    },
-    series: []
-}
\ No newline at end of file
diff --git a/public/data-gl/globe-moon.js b/public/data-gl/globe-moon.js
deleted file mode 100644
index 5fa9158..0000000
--- a/public/data-gl/globe-moon.js
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
-title: Moon
-category: globe
-titleCN: Moon
-*/
-
-option = {
-    globe: {
-        baseTexture: ROOT_PATH + '/data-gl/asset/moon-base.jpg',
-        heightTexture: ROOT_PATH + '/data-gl/asset/moon-bump.jpg',
-
-        displacementScale: 0.05,
-        displacementQuality: 'medium',
-
-        environment: ROOT_PATH + '/data-gl/asset/starfield.jpg',
-
-        shading: 'realistic',
-        realisticMaterial: {
-            roughness: 0.8,
-            metalness: 0
-        },
-
-        postEffect: {
-            enable: true,
-            SSAO: {
-                enable: true,
-                radius: 2,
-                intensity: 1,
-                quality: 'high'
-            }
-        },
-        temporalSuperSampling: {
-            enable: true
-        },
-        light: {
-            ambient: {
-                intensity: 0
-            },
-            main: {
-                intensity: 2,
-                shadow: true
-            },
-            ambientCubemap: {
-                texture: ROOT_PATH + '/data-gl/asset/pisa.hdr',
-                exposure: 0,
-                diffuseIntensity: 0.02
-            }
-        },
-        viewControl: {
-            autoRotate: false
-        }
-    },
-    series: []
-};
\ No newline at end of file
diff --git a/public/data-gl/globe-with-echarts-surface.js b/public/data-gl/globe-with-echarts-surface.js
deleted file mode 100644
index 8794802..0000000
--- a/public/data-gl/globe-with-echarts-surface.js
+++ /dev/null
@@ -1,239 +0,0 @@
-/*
-title: Globe with ECharts Surface
-category: globe
-titleCN: Globe with ECharts Surface
-*/
-
-var canvas = document.createElement('canvas');
-var mapChart = echarts.init(canvas, null, {
-    width: 4096,
-    height: 2048
-});
-
-mapChart.setOption({
-    backgroundColor: '#fff',
-    visualMap: {
-        show: false,
-        min: 0,
-        max: 500000,
-        inRange: {
-            color: ['#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf', '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026']
-        }
-    },
-    series : [
-        {
-            type: 'map',
-            map: 'world',
-            top: 0,
-            left: 0,
-            right: 0,
-            bottom: 0,
-            boundingCoords: [[-180, 90], [180, -90]],
-            data:[
-                {name : 'Afghanistan', value : 28397.812},
-                {name : 'Angola', value : 19549.124},
-                {name : 'Albania', value : 3150.143},
-                {name : 'United Arab Emirates', value : 8441.537},
-                {name : 'Argentina', value : 40374.224},
-                {name : 'Armenia', value : 2963.496},
-                {name : 'French Southern and Antarctic Lands', value : 268.065},
-                {name : 'Australia', value : 22404.488},
-                {name : 'Austria', value : 8401.924},
-                {name : 'Azerbaijan', value : 9094.718},
-                {name : 'Burundi', value : 9232.753},
-                {name : 'Belgium', value : 10941.288},
-                {name : 'Benin', value : 9509.798},
-                {name : 'Burkina Faso', value : 15540.284},
-                {name : 'Bangladesh', value : 151125.475},
-                {name : 'Bulgaria', value : 7389.175},
-                {name : 'The Bahamas', value : 66402.316},
-                {name : 'Bosnia and Herzegovina', value : 3845.929},
-                {name : 'Belarus', value : 9491.07},
-                {name : 'Belize', value : 308.595},
-                {name : 'Bermuda', value : 64.951},
-                {name : 'Bolivia', value : 716.939},
-                {name : 'Brazil', value : 195210.154},
-                {name : 'Brunei', value : 27.223},
-                {name : 'Bhutan', value : 716.939},
-                {name : 'Botswana', value : 1969.341},
-                {name : 'Central African Republic', value : 4349.921},
-                {name : 'Canada', value : 34126.24},
-                {name : 'Switzerland', value : 7830.534},
-                {name : 'Chile', value : 17150.76},
-                {name : 'China', value : 1359821.465},
-                {name : 'Ivory Coast', value : 60508.978},
-                {name : 'Cameroon', value : 20624.343},
-                {name : 'Democratic Republic of the Congo', value : 62191.161},
-                {name : 'Republic of the Congo', value : 3573.024},
-                {name : 'Colombia', value : 46444.798},
-                {name : 'Costa Rica', value : 4669.685},
-                {name : 'Cuba', value : 11281.768},
-                {name : 'Northern Cyprus', value : 1.468},
-                {name : 'Cyprus', value : 1103.685},
-                {name : 'Czech Republic', value : 10553.701},
-                {name : 'Germany', value : 83017.404},
-                {name : 'Djibouti', value : 834.036},
-                {name : 'Denmark', value : 5550.959},
-                {name : 'Dominican Republic', value : 10016.797},
-                {name : 'Algeria', value : 37062.82},
-                {name : 'Ecuador', value : 15001.072},
-                {name : 'Egypt', value : 78075.705},
-                {name : 'Eritrea', value : 5741.159},
-                {name : 'Spain', value : 46182.038},
-                {name : 'Estonia', value : 1298.533},
-                {name : 'Ethiopia', value : 87095.281},
-                {name : 'Finland', value : 5367.693},
-                {name : 'Fiji', value : 860.559},
-                {name : 'Falkland Islands', value : 49.581},
-                {name : 'France', value : 63230.866},
-                {name : 'Gabon', value : 1556.222},
-                {name : 'United Kingdom', value : 62066.35},
-                {name : 'Georgia', value : 4388.674},
-                {name : 'Ghana', value : 24262.901},
-                {name : 'Guinea', value : 10876.033},
-                {name : 'Gambia', value : 1680.64},
-                {name : 'Guinea Bissau', value : 10876.033},
-                {name : 'Equatorial Guinea', value : 696.167},
-                {name : 'Greece', value : 11109.999},
-                {name : 'Greenland', value : 56.546},
-                {name : 'Guatemala', value : 14341.576},
-                {name : 'French Guiana', value : 231.169},
-                {name : 'Guyana', value : 786.126},
-                {name : 'Honduras', value : 7621.204},
-                {name : 'Croatia', value : 4338.027},
-                {name : 'Haiti', value : 9896.4},
-                {name : 'Hungary', value : 10014.633},
-                {name : 'Indonesia', value : 240676.485},
-                {name : 'India', value : 1205624.648},
-                {name : 'Ireland', value : 4467.561},
-                {name : 'Iran', value : 240676.485},
-                {name : 'Iraq', value : 30962.38},
-                {name : 'Iceland', value : 318.042},
-                {name : 'Israel', value : 7420.368},
-                {name : 'Italy', value : 60508.978},
-                {name : 'Jamaica', value : 2741.485},
-                {name : 'Jordan', value : 6454.554},
-                {name : 'Japan', value : 127352.833},
-                {name : 'Kazakhstan', value : 15921.127},
-                {name : 'Kenya', value : 40909.194},
-                {name : 'Kyrgyzstan', value : 5334.223},
-                {name : 'Cambodia', value : 14364.931},
-                {name : 'South Korea', value : 51452.352},
-                {name : 'Kosovo', value : 97.743},
-                {name : 'Kuwait', value : 2991.58},
-                {name : 'Laos', value : 6395.713},
-                {name : 'Lebanon', value : 4341.092},
-                {name : 'Liberia', value : 3957.99},
-                {name : 'Libya', value : 6040.612},
-                {name : 'Sri Lanka', value : 20758.779},
-                {name : 'Lesotho', value : 2008.921},
-                {name : 'Lithuania', value : 3068.457},
-                {name : 'Luxembourg', value : 507.885},
-                {name : 'Latvia', value : 2090.519},
-                {name : 'Morocco', value : 31642.36},
-                {name : 'Moldova', value : 103.619},
-                {name : 'Madagascar', value : 21079.532},
-                {name : 'Mexico', value : 117886.404},
-                {name : 'Macedonia', value : 507.885},
-                {name : 'Mali', value : 13985.961},
-                {name : 'Myanmar', value : 51931.231},
-                {name : 'Montenegro', value : 620.078},
-                {name : 'Mongolia', value : 2712.738},
-                {name : 'Mozambique', value : 23967.265},
-                {name : 'Mauritania', value : 3609.42},
-                {name : 'Malawi', value : 15013.694},
-                {name : 'Malaysia', value : 28275.835},
-                {name : 'Namibia', value : 2178.967},
-                {name : 'New Caledonia', value : 246.379},
-                {name : 'Niger', value : 15893.746},
-                {name : 'Nigeria', value : 159707.78},
-                {name : 'Nicaragua', value : 5822.209},
-                {name : 'Netherlands', value : 16615.243},
-                {name : 'Norway', value : 4891.251},
-                {name : 'Nepal', value : 26846.016},
-                {name : 'New Zealand', value : 4368.136},
-                {name : 'Oman', value : 2802.768},
-                {name : 'Pakistan', value : 173149.306},
-                {name : 'Panama', value : 3678.128},
-                {name : 'Peru', value : 29262.83},
-                {name : 'Philippines', value : 93444.322},
-                {name : 'Papua New Guinea', value : 6858.945},
-                {name : 'Poland', value : 38198.754},
-                {name : 'Puerto Rico', value : 3709.671},
-                {name : 'North Korea', value : 1.468},
-                {name : 'Portugal', value : 10589.792},
-                {name : 'Paraguay', value : 6459.721},
-                {name : 'Qatar', value : 1749.713},
-                {name : 'Romania', value : 21861.476},
-                {name : 'Russia', value : 21861.476},
-                {name : 'Rwanda', value : 10836.732},
-                {name : 'Western Sahara', value : 514.648},
-                {name : 'Saudi Arabia', value : 27258.387},
-                {name : 'Sudan', value : 35652.002},
-                {name : 'South Sudan', value : 9940.929},
-                {name : 'Senegal', value : 12950.564},
-                {name : 'Solomon Islands', value : 526.447},
-                {name : 'Sierra Leone', value : 5751.976},
-                {name : 'El Salvador', value : 6218.195},
-                {name : 'Somaliland', value : 9636.173},
-                {name : 'Somalia', value : 9636.173},
-                {name : 'Republic of Serbia', value : 3573.024},
-                {name : 'Suriname', value : 524.96},
-                {name : 'Slovakia', value : 5433.437},
-                {name : 'Slovenia', value : 2054.232},
-                {name : 'Sweden', value : 9382.297},
-                {name : 'Swaziland', value : 1193.148},
-                {name : 'Syria', value : 7830.534},
-                {name : 'Chad', value : 11720.781},
-                {name : 'Togo', value : 6306.014},
-                {name : 'Thailand', value : 66402.316},
-                {name : 'Tajikistan', value : 7627.326},
-                {name : 'Turkmenistan', value : 5041.995},
-                {name : 'East Timor', value : 10016.797},
-                {name : 'Trinidad and Tobago', value : 1328.095},
-                {name : 'Tunisia', value : 10631.83},
-                {name : 'Turkey', value : 72137.546},
-                {name : 'United Republic of Tanzania', value : 44973.33},
-                {name : 'Uganda', value : 33987.213},
-                {name : 'Ukraine', value : 46050.22},
-                {name : 'Uruguay', value : 3371.982},
-                {name : 'United States of America', value : 312247.116},
-                {name : 'Uzbekistan', value : 27769.27},
-                {name : 'Venezuela', value : 236.299},
-                {name : 'Vietnam', value : 89047.397},
-                {name : 'Vanuatu', value : 236.299},
-                {name : 'West Bank', value : 13.565},
-                {name : 'Yemen', value : 22763.008},
-                {name : 'South Africa', value : 51452.352},
-                {name : 'Zambia', value : 13216.985},
-                {name : 'Zimbabwe', value : 13076.978}
-            ]
-        }
-    ]
-});
-
-// http://visibleearth.nasa.gov/view_cat.php?categoryID=1484
-option = {
-    globe: {
-        baseTexture: mapChart,
-        heightTexture: ROOT_PATH + "/data-gl/asset/bathymetry_bw_composite_4k.jpg",
-
-        displacementScale: 0.1,
-
-        shading: 'lambert',
-
-        light: {
-            ambient: {
-                intensity: 0.5
-            },
-            main: {
-                intensity: 0.6
-            }
-        },
-
-        viewControl: {
-            autoRotate: false
-        }
-    },
-    series: []
-};
\ No newline at end of file
diff --git a/public/data-gl/graphgl-gpu-layout.js b/public/data-gl/graphgl-gpu-layout.js
deleted file mode 100644
index e27ebbf..0000000
--- a/public/data-gl/graphgl-gpu-layout.js
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
-title: GraphGL GPU Layout
-category: graphGL
-theme: dark
-titleCN: GraphGL GPU Layout
-videoStart: 0
-videoEnd: 10000
-shotWidth: 1280
-*/
-
-
-function createNodes(widthCount, heightCount) {
-    var nodes = [];
-    for (var i = 0; i < widthCount; i++) {
-        for (var j = 0; j < heightCount; j++) {
-            nodes.push({
-                x: Math.random() * window.innerWidth,
-                y: Math.random() * window.innerHeight,
-                value: 1
-            });
-        }
-    }
-    return nodes;
-}
-
-function createEdges(widthCount, heightCount) {
-    var edges = [];
-    for (var i = 0; i < widthCount; i++) {
-        for (var j = 0; j < heightCount; j++) {
-            if (i < widthCount - 1) {
-                edges.push({
-                    source: i + j * widthCount,
-                    target: i + 1 + j * widthCount,
-                    value: 1
-                });
-            }
-            if (j < heightCount - 1) {
-                edges.push({
-                    source: i + j * widthCount,
-                    target: i + (j + 1) * widthCount,
-                    value: 1
-                });
-            }
-        }
-    }
-    return edges;
-}
-
-var nodes = createNodes(50, 50);
-var edges = createEdges(50, 50);
-
-option = {
-    series: [{
-        type: 'graphGL',
-        nodes: nodes,
-        edges: edges,
-        itemStyle: {
-            color: 'rgba(255,255,255,0.8)'
-        },
-        lineStyle: {
-            color: 'rgba(255,255,255,0.8)',
-            width: 3
-        },
-        forceAtlas2: {
-            steps: 5,
-            jitterTolerence: 10,
-            edgeWeightInfluence: 4
-        }
-    }]
-};
\ No newline at end of file
diff --git a/public/data-gl/graphgl-large-internet.js b/public/data-gl/graphgl-large-internet.js
deleted file mode 100644
index b880d51..0000000
--- a/public/data-gl/graphgl-large-internet.js
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
-title: GraphGL - Large Internet
-category: graphGL
-theme: dark
-titleCN: GraphGL - Large Internet
-shotDelay: 10000
-shotWidth: 1920
-*/
-
-
-$.getJSON(ROOT_PATH + '/data-gl/asset/data/internet.graph.json', function (graph) {
-    var edges = graph.edges.map(function (edge) {
-        return {
-            source: edge[0],
-            target: edge[1],
-            value: 2
-        }
-    });
-    var categories = [];
-    var categoriesMap = {};
-    var nodes = graph.nodes.map(function (node) {
-        if (!categoriesMap[node[3]]) {
-            categories.push({
-                name: node[3]
-            });
-            categoriesMap[node[3]] = true;
-        }
-        return {
-            x: Math.random() * window.innerWidth,
-            y: Math.random() * window.innerHeight,
-            // x: node[0],
-            // y: node[1],
-            symbolSize: node[2],
-            category: node[3],
-            value: 1
-        }
-    });
-
-
-    myChart.setOption({
-        color: ["rgb(203,239,15)", "rgb(73,15,239)","rgb(239,231,15)","rgb(15,217,239)","rgb(30,15,239)","rgb(15,174,239)","rgb(116,239,15)","rgb(239,15,58)","rgb(15,239,174)","rgb(239,102,15)","rgb(239,15,15)","rgb(15,44,239)","rgb(239,145,15)","rgb(30,239,15)","rgb(239,188,15)","rgb(159,239,15)","rgb(159,15,239)","rgb(15,239,44)","rgb(15,239,87)","rgb(15,239,217)","rgb(203,15,239)","rgb(239,15,188)","rgb(239,15,102)","rgb(239,58,15)","rgb(239,15,145)","rgb(116,15,239)","rgb(15,131,239) [...]
-        series: [{
-            type: 'graphGL',
-            nodes: nodes,
-            edges: edges,
-            categories: categories.sort(function (a, b) { return a.name - b.name; }),
-            lineStyle: {
-                color: 'rgba(255,255,255,0.2)'
-            },
-            itemStyle: {
-                opacity: 1
-            },
-            forceAtlas2: {
-                steps: 1,
-                stopThreshold: 1,
-                jitterTolerence: 10,
-                edgeWeight: [0.2, 1],
-                gravity: 0,
-                edgeWeightInfluence: 1,
-                scaling: 0.2
-            }
-        }]
-    });
-});
\ No newline at end of file
diff --git a/public/data-gl/graphgl-npm-dep.js b/public/data-gl/graphgl-npm-dep.js
deleted file mode 100644
index a9c32ce..0000000
--- a/public/data-gl/graphgl-npm-dep.js
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
-title: NPM Dependencies with graphGL
-category: graphGL
-theme: dark
-titleCN: 1w 节点 2w7 边的NPM 依赖图
-shotDelay: 5000
-shotWidth: 1920
-*/
-
-function loadScript(scriptUrl, cb) {
-    var scriptTag = document.createElement('script');
-    scriptTag.onload = cb;
-    scriptTag.src = scriptUrl;
-    document.body.appendChild(scriptTag);
-}
-
-loadScript('https://cdn.jsdelivr.net/npm/echarts-graph-modularity@2.0.0/dist/echarts-graph-modularity.min.js', function () {
-    // Reinit chart again
-    // TODO: visual encoding registerion must been done before echarts.init.
-    var dom = myChart.getDom();
-    myChart.dispose();
-    myChart = echarts.init(dom);
-    $.getJSON(ROOT_PATH + '/data-gl/asset/data/npmdep.json', function (data) {
-        var nodes = data.nodes.map(function (nodeName, idx) {
-            return {
-                name: nodeName,
-                value: data.dependentsCount[idx]
-            }
-        });
-        var edges = [];
-        for (var i = 0; i < data.edges.length;) {
-            var s = data.edges[i++];
-            var t = data.edges[i++];
-            edges.push({
-                source: s,
-                target: t
-            });
-        }
-
-        nodes.forEach(function (node) {
-            // if (node.value > 100) {
-                node.emphasis = {
-                    label: {
-                        show: true
-                    }
-                }
-            // }
-            if (node.value > 5000) {
-                node.label = {
-                    show: true
-                }
-            }
-        });
-
-        myChart.setOption({
-            backgroundColor: '#000',
-            series: [{
-                color: ['rgb(203,239,15)', 'rgb(73,15,239)','rgb(15,217,239)','rgb(30,15,239)','rgb(15,174,239)','rgb(116,239,15)','rgb(239,15,58)','rgb(15,239,174)','rgb(239,102,15)','rgb(239,15,15)','rgb(15,44,239)','rgb(239,145,15)','rgb(30,239,15)','rgb(239,188,15)','rgb(159,239,15)','rgb(159,15,239)','rgb(15,239,44)','rgb(15,239,87)','rgb(15,239,217)','rgb(203,15,239)','rgb(239,15,188)','rgb(239,15,102)','rgb(239,58,15)','rgb(239,15,145)','rgb(116,15,239)','rgb(15,131,239)','rgb(73, [...]
-                type: 'graphGL',
-                nodes: nodes,
-                edges: edges,
-                modularity: {
-                    resolution: 2,
-                    sort: true
-                },
-                lineStyle: {
-                    color: 'rgba(255,255,255,1)',
-                    opacity: 0.05
-                },
-                itemStyle: {
-                    opacity: 1
-                    // borderColor: '#fff',
-                    // borderWidth: 1
-                },
-                focusNodeAdjacency: false,
-                focusNodeAdjacencyOn: 'click',
-                symbolSize: function (value) {
-                    return Math.sqrt(value / 10);
-                },
-                label: {
-                    color: '#fff'
-                },
-                emphasis: {
-                    label: {
-                        show: false
-                    },
-                    lineStyle: {
-                        opacity: 0.5,
-                        width: 4
-                    }
-                },
-                forceAtlas2: {
-                    steps: 5,
-                    stopThreshold: 20,
-                    jitterTolerence: 10,
-                    edgeWeight: [0.2, 1],
-                    gravity: 5,
-                    edgeWeightInfluence: 0
-                    // preventOverlap: true
-                }
-            }]
-        });
-    });
-});
diff --git a/public/data-gl/image-surface-sushuang.js b/public/data-gl/image-surface-sushuang.js
deleted file mode 100644
index 4faf6ad..0000000
--- a/public/data-gl/image-surface-sushuang.js
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
-title: Image Surface Sushuang
-category: surface
-titleCN: Image Surface Sushuang
-*/
-
-var img = new Image();
-var canvas = document.createElement('canvas');
-var ctx = canvas.getContext('2d');
-
-img.onload = function () {
-    var width = canvas.width = img.width;
-    var height = canvas.height = img.height;
-    ctx.drawImage(img, 0, 0, width, height);
-    var imgData = ctx.getImageData(0, 0, width, height);
-
-    var data = [];
-    for (var i = 0; i < imgData.data.length / 4; i++) {
-        var r = imgData.data[i * 4];
-        var g = imgData.data[i * 4 + 1];
-        var b = imgData.data[i * 4 + 2];
-
-        var lum = 255 - (0.2125 * r + 0.7154 * g + 0.0721 * b);
-        lum = (lum - 125) / 10 + 50;
-        data.push([i % width, height - Math.floor(i / width), lum]);
-    }
-
-
-    myChart.setOption(option = {
-        tooltip: {},
-        backgroundColor: '#fff',
-        xAxis3D: {
-            type: 'value'
-        },
-        yAxis3D: {
-            type: 'value'
-        },
-        zAxis3D: {
-            type: 'value',
-            min: 0,
-            max: 100
-        },
-        grid3D: {
-            axisPointer: {
-                show: false
-            },
-            viewControl: {
-                distance: 100
-            },
-            postEffect: {
-                enable: true
-            },
-            light: {
-                main: {
-                    shadow: true,
-                    intensity: 2
-                },
-                ambientCubemap: {
-                    texture: ROOT_PATH + '/data-gl/asset/canyon.hdr',
-                    exposure: 2,
-                    diffuseIntensity: 0.2,
-                    specularIntensity: 1
-                }
-            }
-        },
-        series: [{
-            type: 'surface',
-            silent: true,
-            wireframe: {
-                show: false
-            },
-            itemStyle: {
-                color: function (params) {
-                    var i = params.dataIndex;
-                    var r = imgData.data[i * 4];
-                    var g = imgData.data[i * 4 + 1];
-                    var b = imgData.data[i * 4 + 2];
-                    return 'rgb(' + [r, g, b].join(',') + ')';
-                }
-            },
-            data: data
-        }]
-    });
-}
-
-img.src = 'data:image/jpeg;charset=utf-8;base64,/9j/4AAQSkZJRgABAQABXgFeAAD/4QFURXhpZgAATU0AKgAAAAgACAEGAAMAAAABAAIAAAESAAMAAAABAAEAAAEaAAUAAAABAAAAbgEbAAUAAAABAAAAdgEoAAMAAAABAAIAAAExAAIAAAAgAAAAfgEyAAIAAAAUAAAAnodpAAQAAAABAAAAsgAAAAAAAAFeAAAAAQAAAV4AAAABQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKQAyMDE3OjA0OjExIDIyOjAxOjUwAAAJkAAABwAAAAQwMjIxkAMAAgAAABQAAAEkkAQAAgAAABQAAAE4kQEABwAAAAQBAgMAoAAABwAAAAQwMTAwoAEAAwAAAAEAAQAAoAIABAAAAAEAAAEAoAMABAAAAAEAAAFJpAYAAwAAAAEAAAAAAAAAADIwMTc6MDM6MTUg [...]
diff --git a/public/data-gl/image-to-bar3d.js b/public/data-gl/image-to-bar3d.js
deleted file mode 100644
index 8db304e..0000000
--- a/public/data-gl/image-to-bar3d.js
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
-title: Image to Bar3D
-category: bar3D
-titleCN: Image to Bar3D
-*/
-
-var img = new Image();
-var canvas = document.createElement('canvas');
-var ctx = canvas.getContext('2d');
-
-img.onload = function () {
-    var width = canvas.width = img.width / 2;
-    var height = canvas.height = img.height / 2;
-    ctx.drawImage(img, 0, 0, width, height);
-    var imgData = ctx.getImageData(0, 0, width, height);
-
-    var data = [];
-    for (var i = 0; i < imgData.data.length / 4; i++) {
-        var r = imgData.data[i * 4];
-        var g = imgData.data[i * 4 + 1];
-        var b = imgData.data[i * 4 + 2];
-
-        var lum = 255 - (0.2125 * r + 0.7154 * g + 0.0721 * b);
-        lum = (lum - 125) / 20 + 50;
-        data.push([i % width, height - Math.floor(i / width), lum]);
-    }
-
-
-    myChart.setOption(option = {
-        tooltip: {},
-        backgroundColor: '#fff',
-        xAxis3D: {
-            type: 'value'
-        },
-        yAxis3D: {
-            type: 'value'
-        },
-        zAxis3D: {
-            type: 'value',
-            min: 0,
-            max: 100
-        },
-        grid3D: {
-            viewControl: {
-                alpha: 20,
-                beta: -30
-            },
-            postEffect: {
-                enable: true,
-                SSAO: {
-                    enable: true
-                }
-            },
-            boxDepth: 120,
-            light: {
-                main: {
-                    shadow: true,
-                    intensity: 2
-                },
-                ambientCubemap: {
-                    texture: ROOT_PATH + '/data-gl/asset/canyon.hdr',
-                    exposure: 2,
-                    diffuseIntensity: 0.2,
-                    specularIntensity: 1
-                }
-            }
-        },
-        series: [{
-            type: 'bar3D',
-            shading: 'realistic',
-            barSize: 1,
-            wireframe: {
-                show: false
-            },
-            itemStyle: {
-                color: function (params) {
-                    var i = params.dataIndex;
-                    var r = imgData.data[i * 4];
-                    var g = imgData.data[i * 4 + 1];
-                    var b = imgData.data[i * 4 + 2];
-                    return 'rgb(' + [r, g, b].join(',') + ')';
-                }
-            },
-            data: data
-        }]
-    });
-}
-
-img.src = 'data:image/jpeg;charset=utf-8;base64,/9j/4RtXRXhpZgAATU0AKgAAAAgADQEAAAMAAAABBmAAAAEBAAMAAAABCZAAAAECAAMAAAADAAAAqgEGAAMAAAABAAIAAAESAAMAAAABAAEAAAEVAAMAAAABAAMAAAEaAAUAAAABAAAAsAEbAAUAAAABAAAAuAEoAAMAAAABAAIAAAExAAIAAAAgAAAAwAEyAAIAAAAUAAAA4AITAAMAAAABAAEAAIdpAAQAAAABAAAA9AAAAZwACAAIAAgANWfgAAAnEAA1Z+AAACcQQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKQAyMDE3OjA0OjExIDIyOjI4OjQxAAAJkAAABwAAAAQwMjIxkAMAAgAAABoAAAFmkAQAAgAAABoAAAGAkQEABwAAAAQBAgMAoAAABwAAAAQwMTAwoAEAAwAAAAEAAQAAoAIA [...]
diff --git a/public/data-gl/iron-globe.js b/public/data-gl/iron-globe.js
deleted file mode 100644
index 9764e57..0000000
--- a/public/data-gl/iron-globe.js
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
-title: Iron globe
-category: globe
-titleCN: Iron globe
-*/
-
-
-option = {
-    backgroundColor: '#000',
-    globe: {
-        baseTexture: ROOT_PATH + "/data-gl/asset/world.topo.bathy.200401.jpg",
-        heightTexture: ROOT_PATH + "/data-gl/asset/bathymetry_bw_composite_4k.jpg",
-        displacementScale: 0.2,
-        shading: 'realistic',
-        environment: ROOT_PATH + '/data-gl/asset/starfield.jpg',
-        realisticMaterial: {
-            roughness: ROOT_PATH + '/asset/get/s/data-1497599804873-H1SHkG-mZ.jpg',
-            metalness: ROOT_PATH + '/asset/get/s/data-1497599800643-BJbHyGWQW.jpg',
-            textureTiling: [8, 4]
-        },
-        postEffect: {
-            enable: true
-        },
-        viewControl: {
-            autoRotate: false
-        },
-        light: {
-            main: {
-                intensity: 2,
-                shadow: true
-            },
-            ambientCubemap: {
-                texture: ROOT_PATH + '/data-gl/asset/pisa.hdr',
-                exposure: 2,
-                diffuseIntensity: 2,
-                specularIntensity: 2
-            }
-        }
-    }
-};
\ No newline at end of file
diff --git a/public/data-gl/line3d-orthographic.js b/public/data-gl/line3d-orthographic.js
deleted file mode 100644
index b70b68b..0000000
--- a/public/data-gl/line3d-orthographic.js
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
-title: 三维折线图正交投影
-category: line3D
-titleCN: 三维折线图正交投影
-*/
-
-var data = [];
-// Parametric curve
-for (var t = 0; t < 25; t += 0.001) {
-    var x = (1 + 0.25 * Math.cos(75 * t)) * Math.cos(t);
-    var y = (1 + 0.25 * Math.cos(75 * t)) * Math.sin(t);
-    var z = t + 2.0 * Math.sin(75 * t);
-    data.push([x, y, z]);
-}
-console.log(data.length);
-
-option = {
-    tooltip: {},
-    backgroundColor: '#fff',
-    visualMap: {
-        show: false,
-        dimension: 2,
-        min: 0,
-        max: 30,
-        inRange: {
-            color: ['#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf', '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026']
-        }
-    },
-    xAxis3D: {
-        type: 'value'
-    },
-    yAxis3D: {
-        type: 'value'
-    },
-    zAxis3D: {
-        type: 'value'
-    },
-    grid3D: {
-        viewControl: {
-            projection: 'orthographic'
-        }
-    },
-    series: [{
-        type: 'line3D',
-        data: data,
-        lineStyle: {
-            width: 4
-        }
-    }]
-};
diff --git a/public/data-gl/lines3d-airline-on-globe.js b/public/data-gl/lines3d-airline-on-globe.js
deleted file mode 100644
index ef04a53..0000000
--- a/public/data-gl/lines3d-airline-on-globe.js
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
-title: Airline on Globe
-category: lines3D
-titleCN: Airline on Globe
-*/
-
-$.getJSON(ROOT_PATH + '/data-gl/asset/data/flights.json', function(data) {
-
-    function getAirportCoord(idx) {
-        return [data.airports[idx][3], data.airports[idx][4]];
-    }
-    var routes = data.routes.map(function(airline) {
-        return [
-            getAirportCoord(airline[1]),
-            getAirportCoord(airline[2])
-        ];
-    });
-
-    myChart.setOption({
-        backgroundColor: '#000',
-        globe: {
-            baseTexture: ROOT_PATH + '/data-gl/asset/world.topo.bathy.200401.jpg',
-            heightTexture: ROOT_PATH + '/data-gl/asset/bathymetry_bw_composite_4k.jpg',
-
-            shading: 'lambert',
-
-            light: {
-                ambient: {
-                    intensity: 0.4
-                },
-                main: {
-                    intensity: 0.4
-                }
-            },
-
-            viewControl: {
-                autoRotate: false
-            }
-        },
-        series: {
-
-            type: 'lines3D',
-
-            coordinateSystem: 'globe',
-
-            blendMode: 'lighter',
-
-            lineStyle: {
-                width: 1,
-                color: 'rgb(50, 50, 150)',
-                opacity: 0.1
-            },
-
-            data: routes
-        }
-    });
-});
\ No newline at end of file
diff --git a/public/data-gl/lines3d-flight-path-on-mapbox.js b/public/data-gl/lines3d-flight-path-on-mapbox.js
deleted file mode 100644
index 4ce72c7..0000000
--- a/public/data-gl/lines3d-flight-path-on-mapbox.js
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
-title: Flight path on Mapbox
-category: lines3D
-titleCN: Flight path on Mapbox
-*/
-
-// 数据来自 https://uber.github.io/deck.gl/#/examples/core-layers/line-layer
-
-mapboxgl.accessToken = 'pk.eyJ1IjoicGlzc2FuZyIsImEiOiJjaXBnaGYxcW8wMDFodWNtNDc4NzdqMWR2In0.4XUWeduDltiCbsIiS-U8Lg';
-
-
-$.get(ROOT_PATH + '/asset/get/s/data-1497886591658-rJOKkdH7W.txt', function (text) {
-
-    var data = decodeFlightPathData(text);
-
-    var dataAll = [];
-    for (var i = 0; i < 4; i++) {
-        dataAll = dataAll.concat(data.map(function (item) {
-            return {
-                name: item.name,
-                coords: item.coords.map(function (coord) {
-                    return coord.slice();
-                })
-            };
-        }));
-    }
-
-    myChart.setOption({
-        mapbox: {
-            center: [0, 51.5],
-            zoom: 8,
-            pitch: 60,
-            altitudeScale: 5,
-            style: 'mapbox://styles/mapbox/dark-v9',
-            postEffect: {
-                enable: true,
-                bloom: {
-                    intensity: 0.4
-                }
-            }
-        },
-        series: [{
-            type: 'lines3D',
-
-            coordinateSystem: 'mapbox',
-
-            effect: {
-                show: true,
-                constantSpeed: 40,
-                trailWidth: 2,
-                trailLength: 0.15,
-                trailOpacity: 1
-            },
-
-            blendMode: 'lighter',
-
-            polyline: true,
-
-            lineStyle: {
-                width: 1,
-                color: 'rgb(50, 60, 170)',
-                opacity: 0.1
-            },
-
-            data: dataAll
-        }]
-    });
-
-    window.addEventListener('keydown', function () {
-        myChart.dispatchAction({
-            type: 'lines3DToggleEffect',
-            seriesIndex: 0
-        });
-    });
-});
-
-
-/**
- * https://github.com/mapbox/polyline
- *
- * Decodes to a [longitude, latitude] coordinates array.
- *
- * This is adapted from the implementation in Project-OSRM.
- *
- * @param {String} str
- * @param {Number} precision
- * @returns {Array}
- *
- * @see https://github.com/Project-OSRM/osrm-frontend/blob/master/WebContent/routing/OSRM.RoutingGeometry.js
- */
-function decodePolyline(str, precision) {
-    var index = 0;
-    var lat = 0;
-    var lng = 0;
-    var coordinates = [];
-    var shift = 0;
-    var result = 0;
-    var byte = null;
-    var latitude_change;
-    var longitude_change;
-    var factor = Math.pow(10, precision || 5);
-
-        // Coordinates have variable length when encoded, so just keep
-        // track of whether we've hit the end of the string. In each
-        // loop iteration, a single coordinate is decoded.
-    while (index < str.length) {
-
-        // Reset shift, result, and byte
-        byte = null;
-        shift = 0;
-        result = 0;
-
-        do {
-            byte = str.charCodeAt(index++) - 63;
-            result |= (byte & 0x1f) << shift;
-            shift += 5;
-        } while (byte >= 0x20);
-
-        latitude_change = ((result & 1) ? ~(result >> 1) : (result >> 1));
-
-        shift = result = 0;
-
-        do {
-            byte = str.charCodeAt(index++) - 63;
-            result |= (byte & 0x1f) << shift;
-            shift += 5;
-        } while (byte >= 0x20);
-
-        longitude_change = ((result & 1) ? ~(result >> 1) : (result >> 1));
-
-        lat += latitude_change;
-        lng += longitude_change;
-
-        coordinates.push([lng / factor, lat / factor]);
-    }
-
-    return coordinates;
-}
-
-function decodeFlightPathData(text) {
-    var lines = text.split('\n');
-
-    var result = [];
-
-    lines.forEach(function(line) {
-
-        if (!line) {
-            return;
-        }
-
-        var parts = line.split('\t');
-        var coords0 = parts[2].split('\x01').map(function(str) { return decodePolyline(str, 5) });
-        var coords1 = parts[3].split('\x01').map(function(str) { return decodePolyline(str, 1) });
-
-        var coords = [];
-        coords0.forEach(function(lineStr, i) {
-            for (var j = 1; j < lineStr.length; j++) {
-                var prevPt0 = coords0[i][j - 1],
-                    prevPt1 = coords1[i][j - 1],
-                    currPt0 = coords0[i][j],
-                    currPt1 = coords1[i][j];
-
-                coords.push(
-                    [prevPt0[0], prevPt0[1], prevPt1[0]],
-                    [currPt0[0], currPt0[1], currPt1[0]]
-                );
-            // result.push({
-            //     name: parts[0],
-            //     country: parts[1],
-            //     start: [prevPt0[0], prevPt0[1], prevPt1[0]],
-            //     end: [currPt0[0], currPt0[1], currPt1[0]]
-            // });
-            }
-        });
-
-        result.push({
-            name: parts[0],
-            country: parts[1],
-            coords: coords
-        });
-    });
-    return result;
-}
\ No newline at end of file
diff --git a/public/data-gl/lines3d-flights-gl.js b/public/data-gl/lines3d-flights-gl.js
deleted file mode 100644
index 95644fb..0000000
--- a/public/data-gl/lines3d-flights-gl.js
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
-title: Flights GL
-category: lines3D
-titleCN: Flights GL
-videoStart: 2000
-videoEnd: 8000
-*/
-
-var uploadedDataURL = ROOT_PATH + "/data-gl/asset/data/flights.json";
-
-myChart.showLoading();
-
-$.getJSON(uploadedDataURL, function(data) {
-
-    myChart.hideLoading();
-
-    function getAirportCoord(idx) {
-        return [data.airports[idx][3], data.airports[idx][4]];
-    }
-    var routes = data.routes.map(function (airline) {
-        return [
-            getAirportCoord(airline[1]),
-            getAirportCoord(airline[2])
-        ];
-    });
-
-    myChart.setOption({
-        geo3D: {
-            map: 'world',
-            shading: 'realistic',
-            silent: true,
-            environment: '#333',
-            realisticMaterial: {
-                roughness: 0.8,
-                metalness: 0
-            },
-            postEffect: {
-                enable: true
-            },
-            groundPlane: {
-                show: false
-            },
-            light: {
-                main: {
-                    intensity: 1,
-                    alpha: 30
-                },
-                ambient: {
-                    intensity: 0
-                }
-            },
-            viewControl: {
-                distance: 70,
-                alpha: 89,
-
-                panMouseButton: 'left',
-                rotateMouseButton: 'right'
-            },
-
-            itemStyle: {
-                color: '#000'
-            },
-
-            regionHeight: 0.5
-        },
-        series: [{
-            type: 'lines3D',
-
-            coordinateSystem: 'geo3D',
-
-            effect: {
-                show: true,
-                trailWidth: 1,
-                trailOpacity: 0.5,
-                trailLength: 0.2,
-                constantSpeed: 5
-            },
-
-            blendMode: 'lighter',
-
-            lineStyle: {
-                width: 0.2,
-                opacity: 0.05
-            },
-
-            data: routes
-        }]
-    });
-
-    window.addEventListener('keydown', function () {
-        myChart.dispatchAction({
-            type: 'lines3DToggleEffect',
-            seriesIndex: 0
-        });
-    });
-});
\ No newline at end of file
diff --git a/public/data-gl/lines3d-flights-on-geo3d.js b/public/data-gl/lines3d-flights-on-geo3d.js
deleted file mode 100644
index c29cf30..0000000
--- a/public/data-gl/lines3d-flights-on-geo3d.js
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
-title: Flights on Geo3D
-category: lines3D
-titleCN: Flights on Geo3D
-*/
-
-$.getJSON(ROOT_PATH + '/data-gl/asset/data/flights.json', function(data) {
-    function getAirportCoord(idx) {
-        return [data.airports[idx][3], data.airports[idx][4]];
-    }
-    var routes = data.routes.map(function(airline) {
-        return [
-            getAirportCoord(airline[1]),
-            getAirportCoord(airline[2])
-        ];
-    });
-
-    myChart.setOption({
-        geo3D: {
-            map: 'world',
-            shading: 'color',
-
-            environment: ROOT_PATH + '/data-gl/asset/starfield.jpg',
-
-            silent: true,
-
-            groundPlane: {
-                show: false
-            },
-            light: {
-                main: {
-                    intensity: 0
-                },
-                ambient: {
-                    intensity: 0
-                }
-            },
-            viewControl: {
-                distance: 50
-            },
-
-            itemStyle: {
-                color: '#111'
-            },
-
-            boxHeight: 0.5
-        },
-        series: [{
-            type: 'lines3D',
-
-            coordinateSystem: 'geo3D',
-
-            effect: {
-                show: true,
-                trailWidth: 2,
-                trailLength: 0.2
-            },
-
-            blendMode: 'lighter',
-
-            lineStyle: {
-                width: 0,
-                color: 'rgb(50, 50, 150)',
-                opacity: 0.2
-            },
-
-            data: routes
-        }]
-    });
-});
-
-window.addEventListener('keydown', function () {
-    myChart.dispatchAction({
-        type: 'lines3DToggleEffect',
-        seriesIndex: 0
-    });
-});
\ No newline at end of file
diff --git a/public/data-gl/lines3d-flights.js b/public/data-gl/lines3d-flights.js
deleted file mode 100644
index e6eb33f..0000000
--- a/public/data-gl/lines3d-flights.js
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
-title: Flights
-category: lines3D
-titleCN: Flights
-*/
-
-
-$.getJSON(ROOT_PATH + '/data-gl/asset/data/flights.json', function (data) {
-    var airports = data.airports.map(function (item) {
-        return {
-            coord: [item[3], item[4]]
-        }
-    });
-    function getAirportCoord(idx) {
-        return [data.airports[idx][3], data.airports[idx][4]];
-    }
-
-    // Route: [airlineIndex, sourceAirportIndex, destinationAirportIndex]
-    var routesGroupByAirline = {};
-    data.routes.forEach(function (route) {
-        var airline = data.airlines[route[0]];
-        var airlineName = airline[0];
-        if (!routesGroupByAirline[airlineName]) {
-            routesGroupByAirline[airlineName] = [];
-        }
-        routesGroupByAirline[airlineName].push(route);
-    });
-
-    var pointsData = [];
-    data.routes.forEach(function (airline) {
-        pointsData.push(getAirportCoord(airline[1]));
-        pointsData.push(getAirportCoord(airline[2]));
-    });
-
-    var series = data.airlines.map(function (airline) {
-        var airlineName = airline[0];
-        var routes = routesGroupByAirline[airlineName];
-
-        if (!routes) {
-            return null;
-        }
-        return {
-            type: 'lines3D',
-            name: airlineName,
-
-            effect: {
-                show: true,
-                trailWidth: 2,
-                trailLength: 0.15,
-                trailOpacity: 1,
-                trailColor: 'rgb(30, 30, 60)'
-            },
-
-            lineStyle: {
-                width: 1,
-                color: 'rgb(50, 50, 150)',
-                // color: 'rgb(118, 233, 241)',
-                opacity: 0.1
-            },
-            blendMode: 'lighter',
-
-            data: routes.map(function (item) {
-                return [airports[item[1]].coord, airports[item[2]].coord];
-            })
-        };
-    }).filter(function (series) {
-        return !!series;
-    });
-    series.push({
-        type: 'scatter3D',
-        coordinateSystem: 'globe',
-        blendMode: 'lighter',
-        symbolSize: 2,
-        itemStyle: {
-            color: 'rgb(50, 50, 150)',
-            opacity: 0.2
-        },
-        data: pointsData
-    });
-
-    myChart.setOption({
-        legend: {
-            selectedMode: 'single',
-            left: 'left',
-            data: Object.keys(routesGroupByAirline),
-            orient: 'vertical',
-            textStyle: {
-                color: '#fff'
-            }
-        },
-        globe: {
-
-            environment: ROOT_PATH + '/data-gl/asset/starfield.jpg',
-
-            heightTexture: ROOT_PATH + '/data-gl/asset/bathymetry_bw_composite_4k.jpg',
-
-            displacementScale: 0.1,
-            displacementQuality: 'high',
-
-            baseColor: '#000',
-
-            shading: 'realistic',
-            realisticMaterial: {
-                roughness: 0.2,
-                metalness: 0
-            },
-
-            postEffect: {
-                enable: true,
-                depthOfField: {
-                    enable: false,
-                    focalDistance: 150
-                }
-            },
-            temporalSuperSampling: {
-                enable: true
-            },
-            light: {
-                ambient: {
-                    intensity: 0
-                },
-                main: {
-                    intensity: 0.1,
-                    shadow: false
-                },
-                ambientCubemap: {
-                    texture: ROOT_PATH + '/data-gl/asset/lake.hdr',
-                    exposure: 1,
-                    diffuseIntensity: 0.5,
-                    specularIntensity: 2
-                }
-            },
-            viewControl: {
-                autoRotate: false
-            },
-            silent: true
-        },
-        series: series
-    });
-    window.addEventListener('keydown', function () {
-        series.forEach(function (series, idx) {
-            myChart.dispatchAction({
-                type: 'lines3DToggleEffect',
-                seriesIndex: idx
-            });
-        })
-    });
-});
diff --git a/public/data-gl/lines3d-taxi-chengdu.js b/public/data-gl/lines3d-taxi-chengdu.js
deleted file mode 100644
index 7cf6d24..0000000
--- a/public/data-gl/lines3d-taxi-chengdu.js
+++ /dev/null
@@ -1,492 +0,0 @@
-/*
-title: 成都市出租车运行轨迹图 - GL 版
-category: lines3D
-titleCN: 成都市出租车运行轨迹图 - GL 版
-*/
-
-mapboxgl.accessToken = 'pk.eyJ1IjoicGlzc2FuZyIsImEiOiJjaXBnaGYxcW8wMDFodWNtNDc4NzdqMWR2In0.4XUWeduDltiCbsIiS-U8Lg';
-var szRoad = {
-    success: true,
-    errorCode: 0,
-    errorMsg: "成功",
-    data: [
-
-{ROAD_LINE: "104.096113,30.615077;104.098278,30.615873;104.098292,30.615875;104.098818,30.615953;104.098848,30.616028;104.098870,30.616195;104.098732,30.617522;104.098509,30.620377;104.098505,30.620469;104.097949,30.622939;104.097576,30.623194;104.097317,30.623492;104.094637,30.625320;104.094115,30.625740;104.094119,30.625785;104.094477,30.627981;104.094801,30.629104;104.094954,30.629733;104.094943,30.630138;104.094949,30.630221;104.094774,30.630891;104.094425,30.631573;104.093507,30.633 [...]
-
-{ROAD_LINE: "104.096219,30.615181;104.097324,30.615673;104.098197,30.615909;104.098201,30.615910;104.098289,30.615912;104.098302,30.615907;104.098307,30.615907;104.098307,30.615906;104.098308,30.615905;104.098319,30.615906;104.098621,30.615942;104.098830,30.616259;104.098763,30.617050;104.098741,30.617316;104.098741,30.617319;104.098699,30.617706;104.098633,30.618562;104.098556,30.619514;104.098473,30.620439;104.098404,30.621110;104.098411,30.621215;104.098430,30.621279;104.098448,30.621 [...]
-
-{ROAD_LINE: "104.095916,30.615057;104.097259,30.615660;104.098067,30.615920;104.098547,30.615971;104.098547,30.615973;104.098547,30.615976;104.098546,30.615978;104.098540,30.615976;104.098538,30.615973;104.098827,30.616248;104.098768,30.617144;104.098729,30.617525;104.098724,30.617528;104.098718,30.617526;104.098702,30.617807;104.098615,30.618703;104.098557,30.619229;104.098546,30.619252;104.098551,30.619250;104.098554,30.619251;104.098552,30.619258;104.098538,30.619387;104.098476,30.619 [...]
-
-{ROAD_LINE: "104.096648,30.615392;104.095222,30.614775;104.094691,30.614512;104.093729,30.614167;104.093155,30.614814;104.092864,30.615778;104.092812,30.616637;104.092777,30.617633;104.092826,30.618801;104.092877,30.619481;104.092923,30.620045;104.092945,30.620394;104.093001,30.620975;104.092875,30.622014;104.092884,30.622786;104.093192,30.623403;104.093420,30.623948;104.093615,30.624474;104.093810,30.625141;104.094017,30.625381;104.094012,30.625466;104.093992,30.625524;104.093988,30.625 [...]
-
-{ROAD_LINE: "104.099107,30.613973;104.098809,30.616726;104.098316,30.622058;104.097600,30.623242;104.097625,30.623352;104.097426,30.623377;104.093764,30.620923;104.092242,30.620972;104.086071,30.620724;104.079613,30.620518;104.071359,30.620333;104.070254,30.620315;104.067066,30.623630;104.066969,30.624583;104.066858,30.630659;104.066834,30.631848;104.066754,30.633316;104.066531,30.637764;104.066348,30.643100;104.066269,30.646687;104.066003,30.651595;104.064131,30.652732;104.064131,30.652732"},
-
-{ROAD_LINE: "104.099059,30.614035;104.098677,30.618054;104.098599,30.618925;104.098615,30.618923;104.098638,30.618900;104.098643,30.618901;104.098649,30.618922;104.098633,30.619163;104.098335,30.622029;104.098095,30.622801;104.097759,30.623094;104.097741,30.623117;104.097744,30.623126;104.097748,30.623134;104.097749,30.623139;104.097747,30.623139;104.097734,30.623136;104.097732,30.623131;104.097732,30.623130;104.097736,30.623131;104.097740,30.623130;104.097741,30.623132;104.097726,30.623 [...]
-
-{ROAD_LINE: "104.099087,30.614000;104.099052,30.614288;104.098658,30.618130;104.098477,30.620154;104.098477,30.620217;104.098349,30.621734;104.098297,30.621969;104.098300,30.622019;104.098303,30.622066;104.098298,30.622114;104.098118,30.622767;104.097912,30.623029;104.096402,30.624432;104.094679,30.625357;104.094144,30.626001;104.094150,30.626077;104.094166,30.626252;104.094180,30.626347;104.094854,30.629252;104.094853,30.629252;104.094979,30.629886;104.093416,30.634287;104.093341,30.634 [...]
-
-{ROAD_LINE: "104.099098,30.613831;104.099015,30.614813;104.098927,30.615707;104.098928,30.615714;104.098927,30.615716;104.098925,30.615717;104.098923,30.615720;104.098921,30.615729;104.098855,30.616334;104.098744,30.617568;104.098674,30.618676;104.098555,30.619785;104.098452,30.620924;104.098395,30.621689;104.098347,30.621935;104.098319,30.622294;104.098223,30.622679;104.098013,30.622906;104.097876,30.623032;104.097886,30.623046;104.097900,30.623065;104.097902,30.623058;104.097902,30.623 [...]
-
-{ROAD_LINE: "104.099041,30.614039;104.099050,30.614077;104.099043,30.614102;104.099024,30.614257;104.098917,30.615269;104.098777,30.616777;104.098663,30.617975;104.098556,30.619109;104.098516,30.619554;104.098490,30.620143;104.098409,30.620741;104.098382,30.621239;104.098349,30.621589;104.098289,30.621621;104.098311,30.621628;104.098380,30.621631;104.098466,30.621617;104.098467,30.621775;104.098423,30.622191;104.098333,30.622505;104.098246,30.622643;104.098230,30.622678;104.098225,30.622 [...]
-
-{ROAD_LINE: "104.099099,30.613622;104.098992,30.614420;104.098897,30.615722;104.098756,30.617263;104.098628,30.618596;104.098506,30.619900;104.098390,30.620976;104.098373,30.621508;104.098379,30.621513;104.098390,30.621515;104.098393,30.621596;104.098174,30.622700;104.098001,30.622928;104.097961,30.622990;104.097766,30.623225;104.097282,30.623646;104.096572,30.624313;104.096225,30.624608;104.095482,30.624983;104.094696,30.625351;104.094241,30.625635;104.094177,30.625900;104.094186,30.626 [...]
-
-{ROAD_LINE: "104.099150,30.613626;104.099143,30.613777;104.099120,30.613967;104.099130,30.614095;104.098868,30.616979;104.098702,30.618805;104.098733,30.619048;104.098718,30.619055;104.098765,30.619120;104.098595,30.619954;104.098590,30.620098;104.098389,30.621421;104.098387,30.621466;104.097874,30.623084;104.097034,30.623787;104.096579,30.624231;104.096406,30.624435;104.096239,30.624591;104.095394,30.625060;104.094137,30.625776;104.094137,30.625803;104.094129,30.625840;104.094126,30.625 [...]
-
-{ROAD_LINE: "104.099148,30.613443;104.098961,30.614887;104.098893,30.615583;104.098828,30.616313;104.098773,30.616963;104.098751,30.617171;104.098746,30.617170;104.098744,30.617170;104.098745,30.617171;104.098746,30.617176;104.098737,30.617319;104.098691,30.617826;104.098604,30.618687;104.098571,30.619411;104.098536,30.619713;104.098528,30.619802;104.098515,30.619977;104.098515,30.620001;104.098503,30.620110;104.098498,30.620163;104.098497,30.620165;104.098494,30.620167;104.098496,30.620 [...]
-
-{ROAD_LINE: "104.099168,30.613443;104.099112,30.613901;104.099105,30.613911;104.099094,30.613927;104.099090,30.613930;104.099044,30.614140;104.098975,30.615069;104.098908,30.615901;104.098768,30.617076;104.098640,30.618711;104.098518,30.619939;104.098448,30.620934;104.098411,30.621674;104.098392,30.621696;104.098429,30.621729;104.098365,30.622026;104.098203,30.622531;104.097883,30.622901;104.097916,30.622989;104.097902,30.623061;104.097877,30.623103;104.097556,30.623380;104.096987,30.623 [...]
-
-{ROAD_LINE: "104.099214,30.613645;104.099015,30.615723;104.098852,30.617349;104.098847,30.617362;104.098817,30.617735;104.098660,30.619070;104.098655,30.619489;104.098615,30.619943;104.098502,30.620444;104.098524,30.620692;104.098524,30.620691;104.098524,30.620936;104.098490,30.621081;104.098450,30.621219;104.098450,30.621247;104.098427,30.621678;104.098381,30.622292;104.098398,30.622377;104.098331,30.622484;104.097791,30.623154;104.097745,30.623197;104.097499,30.623419;104.096335,30.624 [...]
-
-{ROAD_LINE: "104.099124,30.615977;104.098938,30.616545;104.098747,30.617802;104.098687,30.618874;104.098670,30.619448;104.098677,30.619487;104.098679,30.619491;104.098672,30.619496;104.098667,30.619511;104.098629,30.619818;104.098507,30.620883;104.098432,30.621156;104.098426,30.621188;104.098404,30.621208;104.098359,30.621556;104.098299,30.621725;104.098233,30.621790;104.098182,30.621897;104.098186,30.621897;104.098285,30.621985;104.098308,30.622318;104.098236,30.622587;104.098106,30.622 [...]
-
-{ROAD_LINE: "104.098893,30.615461;104.098635,30.617774;104.098568,30.618529;104.098500,30.619192;104.098470,30.619477;104.098474,30.619478;104.098449,30.619637;104.098387,30.620245;104.098317,30.620873;104.098225,30.621742;104.098198,30.622235;104.098192,30.622316;104.098193,30.622390;104.098188,30.622462;104.098159,30.622545;104.098151,30.622551;104.098039,30.622736;104.097908,30.622864;104.097904,30.622871;104.097721,30.623056;104.097423,30.623366;104.097127,30.623649;104.096827,30.623 [...]
-
-{ROAD_LINE: "104.099062,30.616017;104.098922,30.616208;104.098740,30.617410;104.098601,30.618920;104.098362,30.621759;104.097911,30.622979;104.096779,30.623994;104.094971,30.625188;104.094139,30.625733;104.094177,30.625938;104.094569,30.628333;104.094778,30.629046;104.094769,30.628999;104.094829,30.629188;104.094956,30.629834;104.093679,30.633321;104.092800,30.636178;104.091409,30.638451;104.089902,30.640174;104.089044,30.641077;104.088654,30.641433;104.085402,30.642586;104.083922,30.643 [...]
-
-{ROAD_LINE: "104.099504,30.616079;104.099263,30.616078;104.099242,30.616088;104.099118,30.616101;104.099009,30.616129;104.098902,30.616479;104.098830,30.617242;104.098804,30.617478;104.098796,30.617472;104.098788,30.617467;104.098787,30.617467;104.098776,30.617466;104.098787,30.617474;104.098742,30.617938;104.098672,30.618689;104.098638,30.619058;104.098614,30.619093;104.098630,30.619102;104.098604,30.619279;104.098574,30.619890;104.098524,30.620609;104.098388,30.621432;104.098309,30.621 [...]
-
-{ROAD_LINE: "104.099022,30.616073;104.098824,30.616555;104.098708,30.617463;104.098631,30.618304;104.098532,30.619451;104.098455,30.620186;104.098352,30.621169;104.098257,30.622240;104.097990,30.622869;104.097708,30.623205;104.097540,30.623323;104.097492,30.623315;104.097477,30.623318;104.097474,30.623320;104.097472,30.623321;104.097472,30.623322;104.097471,30.623323;104.097468,30.623320;104.097463,30.623317;104.097464,30.623314;104.097468,30.623313;104.097471,30.623314;104.097357,30.623 [...]
-
-{ROAD_LINE: "104.098918,30.616051;104.098716,30.617818;104.098618,30.618922;104.098516,30.620211;104.098429,30.621311;104.098310,30.622225;104.097760,30.623011;104.097083,30.623688;104.096168,30.624584;104.094989,30.625152;104.094163,30.625736;104.094268,30.626824;104.094335,30.627503;104.086381,30.642278;104.085300,30.642680;104.084835,30.642843;104.083718,30.643179;104.082846,30.643480;104.082505,30.643637;104.082296,30.643777;104.081871,30.644028;104.081421,30.644243;104.081373,30.644 [...]
-
-{ROAD_LINE: "104.099068,30.616011;104.099018,30.616023;104.098915,30.616138;104.098781,30.617138;104.098608,30.618864;104.098339,30.621433;104.098297,30.621973;104.098301,30.622031;104.098303,30.622069;104.097827,30.623074;104.097337,30.623549;104.096291,30.624497;104.095271,30.625078;104.094157,30.625643;104.094080,30.625850;104.094072,30.626040;104.094227,30.627015;104.094441,30.628059;104.094713,30.629004;104.094826,30.629328;104.094833,30.629363;104.094918,30.629817;104.094921,30.629 [...]
-
-{ROAD_LINE: "104.098576,30.615925;104.098571,30.615930;104.098563,30.615937;104.098564,30.615943;104.098794,30.615999;104.098792,30.616581;104.098710,30.617290;104.098683,30.617336;104.098676,30.617353;104.098668,30.617372;104.098624,30.617800;104.098545,30.618682;104.098505,30.619253;104.098453,30.619840;104.098381,30.620607;104.098346,30.620830;104.098161,30.622106;104.098184,30.622428;104.098114,30.622603;104.097973,30.622811;104.097828,30.623028;104.097099,30.623687;104.096556,30.624 [...]
-
-{ROAD_LINE: "104.098938,30.616078;104.098840,30.616706;104.098774,30.617258;104.098740,30.617645;104.098635,30.618454;104.098565,30.619134;104.098557,30.619205;104.098558,30.619208;104.098528,30.619407;104.098517,30.619831;104.098458,30.620688;104.098378,30.621380;104.098341,30.621681;104.098326,30.621718;104.098300,30.621711;104.098294,30.621713;104.098289,30.621756;104.098214,30.622324;104.097856,30.622932;104.097830,30.623029;104.097855,30.623033;104.097787,30.623148;104.097233,30.623 [...]
-
-{ROAD_LINE: "104.098874,30.615593;104.098855,30.615641;104.098816,30.615959;104.098777,30.616846;104.098658,30.618098;104.098548,30.619329;104.098517,30.620217;104.098401,30.621124;104.098285,30.621992;104.098226,30.622468;104.098197,30.622457;104.098192,30.622454;104.098185,30.622455;104.098167,30.622502;104.098076,30.622685;104.097810,30.623035;104.097500,30.623308;104.097497,30.623320;104.097507,30.623321;104.097514,30.623320;104.097504,30.623317;104.097499,30.623322;104.097498,30.623 [...]
-
-{ROAD_LINE: "104.098235,30.615902;104.098422,30.615905;104.098725,30.616025;104.098810,30.616318;104.098753,30.617157;104.098732,30.617277;104.098718,30.617479;104.098717,30.617602;104.098720,30.617699;104.098510,30.620108;104.098330,30.621887;104.098324,30.622040;104.098185,30.622644;104.098168,30.622667;104.097309,30.623587;104.095494,30.624950;104.094129,30.625627;104.094102,30.625720;104.094109,30.625762;104.094343,30.627561;104.094514,30.628169;104.094678,30.628709;104.094948,30.629 [...]
-
-{ROAD_LINE: "104.099166,30.616033;104.098709,30.617716;104.098603,30.618739;104.098582,30.618936;104.098576,30.618933;104.098577,30.618934;104.098582,30.618931;104.098570,30.619037;104.098552,30.619297;104.098503,30.619775;104.098451,30.620463;104.098420,30.621207;104.098326,30.621771;104.098226,30.622515;104.098175,30.622613;104.098045,30.622785;104.097534,30.623282;104.096698,30.624049;104.096259,30.624491;104.096224,30.624536;104.096142,30.624600;104.095929,30.624727;104.095440,30.624 [...]
-
-{ROAD_LINE: "104.099047,30.616018;104.098871,30.616730;104.098743,30.617965;104.098665,30.618964;104.098597,30.619259;104.098610,30.619246;104.098621,30.619240;104.098642,30.619231;104.098699,30.619209;104.098718,30.619207;104.098736,30.619206;104.098703,30.619328;104.098621,30.619958;104.098565,30.620822;104.098434,30.621738;104.098170,30.622749;104.097688,30.623163;104.097565,30.623239;104.097534,30.623247;104.097522,30.623255;104.097510,30.623265;104.097492,30.623273;104.097470,30.623 [...]
-
-{ROAD_LINE: "104.100633,30.616137;104.098711,30.615940;104.095028,30.614633;104.093764,30.614140;104.093349,30.614460;104.092794,30.616509;104.092798,30.616591;104.092779,30.618287;104.092881,30.620487;104.092884,30.620555;104.092882,30.620692;104.092822,30.621987;104.093444,30.623916;104.094067,30.625476;104.094197,30.627010;104.094262,30.627370;104.094578,30.628516;104.094598,30.628583;104.094798,30.629254;104.094884,30.629976;104.093920,30.632411;104.093848,30.632643;104.093307,30.634 [...]
-
-{ROAD_LINE: "104.099764,30.616048;104.099097,30.615955;104.098804,30.616567;104.098709,30.617659;104.098618,30.618788;104.098526,30.619784;104.098433,30.620719;104.098380,30.621428;104.098392,30.621506;104.098397,30.621659;104.098386,30.621701;104.098379,30.621707;104.098390,30.621809;104.098376,30.622263;104.098052,30.622834;104.097523,30.623335;104.096801,30.624042;104.095797,30.624808;104.094524,30.625372;104.094147,30.626086;104.094246,30.627088;104.094442,30.628002;104.094772,30.629 [...]
-
-{ROAD_LINE: "104.100567,30.616076;104.100533,30.616055;104.100683,30.616082;104.100807,30.616090;104.101464,30.616090;104.102142,30.616134;104.102277,30.616381;104.102315,30.616860;104.102198,30.617377;104.102147,30.617796;104.102193,30.617874;104.102203,30.618027;104.102238,30.618309;104.102167,30.618701;104.102138,30.618920;104.102133,30.619316;104.102483,30.620074;104.103245,30.621110;104.103930,30.621903;104.104514,30.622563;104.104654,30.622742;104.104791,30.623016;104.104173,30.623 [...]
-
-{ROAD_LINE: "104.100268,30.616109;104.099070,30.616014;104.098811,30.617190;104.098801,30.617355;104.098755,30.617613;104.098670,30.618410;104.098571,30.619298;104.098566,30.619444;104.098570,30.619449;104.098566,30.619442;104.098557,30.619535;104.098494,30.620373;104.098380,30.621446;104.098273,30.622436;104.097646,30.623216;104.096979,30.623834;104.096849,30.623905;104.096849,30.623904;104.096857,30.623907;104.096746,30.624027;104.096635,30.624097;104.096502,30.624254;104.096331,30.624 [...]
-
-{ROAD_LINE: "104.100046,30.616038;104.099474,30.615970;104.099439,30.615968;104.099414,30.615962;104.099259,30.615958;104.098931,30.616202;104.098782,30.617164;104.098738,30.617457;104.098728,30.617462;104.098718,30.617500;104.098645,30.618244;104.098533,30.619537;104.098448,30.620375;104.098338,30.621467;104.098278,30.621867;104.098204,30.622425;104.097949,30.622863;104.097931,30.622920;104.097951,30.622931;104.097968,30.622930;104.097975,30.622935;104.098013,30.622929;104.097862,30.623 [...]
-
-{ROAD_LINE: "104.100680,30.616119;104.099704,30.616079;104.098930,30.616098;104.098786,30.617018;104.098658,30.618036;104.098516,30.619312;104.098466,30.620382;104.098359,30.621569;104.098269,30.622471;104.098130,30.622751;104.097861,30.622978;104.096234,30.624515;104.095546,30.624899;104.094738,30.625259;104.094149,30.625901;104.094286,30.627018;104.094553,30.628237;104.094762,30.628948;104.094931,30.629635;104.094906,30.630242;104.094743,30.630971;104.094489,30.631493;104.094312,30.631 [...]
-
-{ROAD_LINE: "104.099706,30.616097;104.098982,30.616061;104.098811,30.616728;104.098749,30.617300;104.098743,30.617358;104.098742,30.617361;104.098724,30.617615;104.098666,30.618405;104.098506,30.619629;104.098331,30.620753;104.098263,30.621617;104.098108,30.621788;104.098087,30.622217;104.097857,30.622825;104.097686,30.623062;104.097698,30.623104;104.097705,30.623133;104.097514,30.623358;104.097148,30.623755;104.096587,30.624261;104.096236,30.624558;104.095435,30.624970;104.094740,30.625 [...]
-
-{ROAD_LINE: "104.098882,30.616281;104.098762,30.618025;104.098755,30.618134;104.098686,30.618940;104.098685,30.619030;104.098629,30.619526;104.098617,30.619536;104.098622,30.619591;104.098619,30.619632;104.098261,30.622542;104.098141,30.622817;104.097191,30.623835;104.096231,30.624675;104.095294,30.625101;104.094209,30.626173;104.094209,30.626240;104.094242,30.626943;104.094244,30.626988;104.094811,30.629104;104.094809,30.629106;104.094808,30.629108;104.094806,30.629108;104.094927,30.630 [...]
-
-{ROAD_LINE: "104.098860,30.616336;104.098763,30.617106;104.098697,30.617756;104.098648,30.618222;104.098610,30.618795;104.098607,30.618934;104.098605,30.618925;104.098589,30.619147;104.098551,30.619515;104.098494,30.620151;104.098430,30.620864;104.098366,30.621313;104.098363,30.621454;104.098367,30.621457;104.098358,30.621605;104.098361,30.621744;104.098361,30.621835;104.098367,30.621971;104.098346,30.622072;104.098334,30.622084;104.098321,30.622092;104.098299,30.622102;104.098280,30.622 [...]
-
-{ROAD_LINE: "104.098769,30.617277;104.098648,30.618328;104.098568,30.619270;104.098476,30.620431;104.098389,30.621577;104.098342,30.621931;104.098418,30.621947;104.098401,30.621965;104.098560,30.621977;104.098571,30.621996;104.098456,30.622353;104.098239,30.622737;104.098146,30.622813;104.098130,30.622842;104.098098,30.622836;104.097923,30.622990;104.097702,30.623210;104.097210,30.623639;104.096549,30.624242;104.096362,30.624437;104.096210,30.624556;104.095820,30.624791;104.095415,30.624 [...]
-
-{ROAD_LINE: "104.098767,30.617440;104.098625,30.619348;104.098599,30.619391;104.098618,30.619409;104.098632,30.619421;104.098626,30.619433;104.098621,30.619438;104.098606,30.619546;104.098529,30.620026;104.098432,30.620716;104.098339,30.621576;104.098292,30.621836;104.098282,30.622061;104.098072,30.622733;104.097829,30.623056;104.097886,30.623070;104.097906,30.623067;104.097927,30.623069;104.097929,30.623060;104.097726,30.623209;104.097514,30.623377;104.097514,30.623393;104.097511,30.623 [...]
-
-{ROAD_LINE: "104.098767,30.617403;104.098601,30.619125;104.098602,30.619557;104.098201,30.622529;104.095896,30.624803;104.094126,30.625790;104.094136,30.625880;104.094891,30.629391;104.094971,30.629952;104.093834,30.632876;104.092790,30.636041;104.091086,30.638766;104.088931,30.641189;104.088849,30.641267;104.086408,30.642264;104.085575,30.642546;104.082740,30.643559;104.081613,30.644150;104.081194,30.644334;104.081157,30.644293;104.081017,30.643968;104.080980,30.644034;104.077964,30.645 [...]
-
-{ROAD_LINE: "104.098865,30.616709;104.098758,30.617398;104.098692,30.618068;104.098597,30.619232;104.098503,30.620219;104.098420,30.621211;104.098354,30.621839;104.098320,30.621868;104.098322,30.621866;104.098298,30.621865;104.098299,30.622016;104.098220,30.622556;104.097786,30.623057;104.097810,30.623064;104.097826,30.623069;104.097834,30.623076;104.097843,30.623088;104.097858,30.623103;104.097583,30.623346;104.097313,30.623599;104.096802,30.624034;104.096363,30.624494;104.095612,30.624 [...]
-
-{ROAD_LINE: "104.098908,30.616359;104.098843,30.616911;104.098779,30.617068;104.098689,30.617640;104.098612,30.618793;104.098519,30.619550;104.098439,30.620533;104.098315,30.621764;104.098066,30.622760;104.097227,30.623564;104.096502,30.624297;104.096151,30.624614;104.095731,30.624853;104.095076,30.625151;104.094608,30.625395;104.094303,30.625562;104.094163,30.626116;104.094214,30.626735;104.094258,30.627256;104.094336,30.627666;104.094374,30.627707;104.094374,30.627710;104.094367,30.627 [...]
-
-{ROAD_LINE: "104.098843,30.617027;104.098836,30.617453;104.098740,30.617946;104.098636,30.618689;104.098560,30.619806;104.098458,30.620927;104.098395,30.621602;104.098388,30.621722;104.098388,30.621719;104.098368,30.621711;104.098357,30.621705;104.098354,30.621701;104.098334,30.621845;104.098306,30.622338;104.098273,30.622497;104.098268,30.622537;104.098283,30.622541;104.098288,30.622543;104.098241,30.622651;104.098132,30.622820;104.097710,30.623214;104.097076,30.623800;104.096420,30.624 [...]
-
-{ROAD_LINE: "104.098779,30.617438;104.098687,30.618256;104.098601,30.619222;104.098520,30.619885;104.098440,30.620605;104.098354,30.621446;104.098272,30.622270;104.098277,30.622490;104.098230,30.622681;104.098072,30.622910;104.097868,30.623114;104.097817,30.623135;104.097785,30.623169;104.097753,30.623221;104.097711,30.623224;104.097712,30.623242;104.097691,30.623237;104.097607,30.623194;104.097596,30.623190;104.097592,30.623208;104.097560,30.623206;104.097531,30.623201;104.097554,30.623 [...]
-
-{ROAD_LINE: "104.098934,30.616318;104.098784,30.617462;104.098685,30.618473;104.098562,30.619674;104.098454,30.620618;104.098465,30.621381;104.098419,30.621803;104.098332,30.622436;104.098124,30.622824;104.098002,30.623014;104.097559,30.623401;104.096829,30.624011;104.096126,30.624624;104.095328,30.625025;104.094608,30.625371;104.094218,30.625678;104.094231,30.626173;104.094303,30.626963;104.094443,30.627831;104.094708,30.628750;104.094787,30.628993;104.094805,30.629001;104.094815,30.629 [...]
-
-{ROAD_LINE: "104.098873,30.616889;104.098765,30.617130;104.098772,30.617163;104.098776,30.617193;104.098770,30.617237;104.098753,30.617430;104.098750,30.617493;104.098750,30.617524;104.098765,30.617710;104.098702,30.618095;104.098707,30.618222;104.098670,30.618385;104.098663,30.618469;104.098655,30.618612;104.098660,30.618907;104.098660,30.619060;104.098622,30.619187;104.098623,30.619343;104.098627,30.619403;104.098503,30.619713;104.098397,30.619711;104.098288,30.619606;104.098292,30.619 [...]
-
-{ROAD_LINE: "104.098930,30.616165;104.098622,30.619003;104.098246,30.622552;104.097764,30.623272;104.097754,30.623269;104.097747,30.623267;104.097739,30.623266;104.097477,30.623426;104.095794,30.624825;104.094127,30.625925;104.094137,30.625965;104.094656,30.628511;104.094669,30.628547;104.094951,30.630053;104.093732,30.633113;104.092826,30.636048;104.091334,30.638562;104.090264,30.639810;104.089333,30.640792;104.087317,30.641963;104.086030,30.642409;104.083390,30.643271;104.083388,30.643 [...]
-
-{ROAD_LINE: "104.098804,30.616907;104.098791,30.617410;104.098711,30.617865;104.098662,30.618510;104.098630,30.618770;104.098636,30.618792;104.098640,30.618797;104.098645,30.618805;104.098638,30.618807;104.098636,30.618803;104.098639,30.618799;104.098554,30.619686;104.098532,30.620013;104.098503,30.620209;104.098491,30.620276;104.098474,30.620404;104.098473,30.620403;104.098475,30.620406;104.098481,30.620416;104.098490,30.620425;104.098489,30.620473;104.098474,30.620532;104.098433,30.620 [...]
-
-{ROAD_LINE: "104.098832,30.617278;104.098625,30.618948;104.098493,30.620092;104.098379,30.621299;104.098287,30.621980;104.098321,30.622327;104.098167,30.622725;104.097844,30.623013;104.097798,30.623047;104.097767,30.623091;104.097608,30.623256;104.097573,30.623284;104.097558,30.623288;104.097522,30.623291;104.097508,30.623297;104.097513,30.623300;104.097501,30.623306;104.097480,30.623306;104.097481,30.623304;104.097490,30.623304;104.097492,30.623307;104.097374,30.623428;104.096709,30.624 [...]
-
-{ROAD_LINE: "104.098807,30.617168;104.098757,30.617704;104.098644,30.618387;104.098542,30.619468;104.098492,30.620391;104.098406,30.621277;104.098306,30.621856;104.098289,30.621911;104.098276,30.621934;104.098262,30.621959;104.098243,30.621962;104.098220,30.621998;104.098242,30.622030;104.098249,30.622121;104.098035,30.622780;104.097583,30.623178;104.097550,30.623213;104.097551,30.623215;104.096934,30.623842;104.096491,30.624290;104.096305,30.624462;104.096312,30.624463;104.096276,30.624 [...]
-
-{ROAD_LINE: "104.098693,30.617410;104.098680,30.617697;104.098449,30.620321;104.098180,30.622471;104.097681,30.622906;104.097694,30.623089;104.095221,30.625041;104.093987,30.626068;104.094789,30.629068;104.094831,30.629176;104.094961,30.629802;104.093715,30.633012;104.092733,30.636340;104.090611,30.639424;104.088654,30.641398;104.084788,30.642824;104.081897,30.643909;104.081694,30.644028;104.081501,30.644122;104.078839,30.645668;104.074611,30.646359;104.070246,30.646551;104.069818,30.646 [...]
-
-{ROAD_LINE: "104.098885,30.616310;104.098520,30.620028;104.098432,30.621263;104.098430,30.621349;104.098435,30.621484;104.098427,30.621543;104.098357,30.621801;104.098330,30.621926;104.098313,30.621995;104.098311,30.622042;104.097951,30.622981;104.094127,30.626098;104.094738,30.628768;104.094948,30.629378;104.094984,30.629817;104.093787,30.632993;104.092242,30.637312;104.090447,30.639674;104.087895,30.641825;104.084592,30.643028;104.082600,30.643651;104.081332,30.644311;104.081179,30.644 [...]
-
-{ROAD_LINE: "104.098855,30.616242;104.098657,30.617952;104.098577,30.618760;104.098510,30.619406;104.098507,30.619410;104.098538,30.619421;104.098549,30.619497;104.098475,30.620301;104.098365,30.621416;104.098326,30.621823;104.098275,30.622315;104.098107,30.622724;104.097918,30.623016;104.097744,30.623117;104.097258,30.623563;104.096415,30.624381;104.095625,30.624910;104.094714,30.625370;104.094228,30.625914;104.094287,30.626702;104.094439,30.627865;104.094724,30.628867;104.094740,30.628 [...]
-
-{ROAD_LINE: "104.098823,30.616400;104.098825,30.616514;104.098495,30.619341;104.098527,30.619448;104.098530,30.619557;104.098468,30.620183;104.098470,30.620296;104.098214,30.621841;104.098260,30.621928;104.097756,30.623139;104.095314,30.625011;104.094161,30.625935;104.094156,30.626115;104.094157,30.626210;104.094836,30.629119;104.094908,30.629318;104.094979,30.629824;104.093686,30.633200;104.092964,30.635723;104.092127,30.637436;104.090236,30.639750;104.088652,30.641455;104.085313,30.642 [...]
-
-{ROAD_LINE: "104.098778,30.616908;104.098694,30.617881;104.098625,30.618912;104.098592,30.619708;104.098504,30.620608;104.098386,30.621511;104.098295,30.621699;104.098221,30.621746;104.098215,30.621863;104.098257,30.622231;104.098121,30.622773;104.097781,30.623105;104.096945,30.623866;104.095902,30.624744;104.094770,30.625266;104.094141,30.625749;104.094173,30.626372;104.094253,30.627183;104.094512,30.628316;104.094635,30.628732;104.094628,30.628746;104.094630,30.628748;104.094631,30.628 [...]
-
-{ROAD_LINE: "104.098817,30.617141;104.098713,30.618123;104.098576,30.619312;104.098468,30.620319;104.098373,30.621362;104.098288,30.622152;104.098069,30.622838;104.097544,30.623332;104.097525,30.623368;104.097501,30.623364;104.097495,30.623359;104.097495,30.623348;104.097498,30.623333;104.097237,30.623587;104.096444,30.624392;104.095281,30.625035;104.094225,30.625622;104.094212,30.626522;104.094355,30.627651;104.094680,30.628806;104.094811,30.629291;104.094805,30.629312;104.094794,30.629 [...]
-
-{ROAD_LINE: "104.098796,30.617291;104.098783,30.617425;104.098788,30.617424;104.098791,30.617426;104.098790,30.617425;104.098790,30.617422;104.098742,30.617811;104.098649,30.618858;104.098518,30.620162;104.098387,30.621590;104.098158,30.622694;104.097344,30.623515;104.096360,30.624423;104.094910,30.625212;104.094255,30.625630;104.094206,30.626301;104.094325,30.627311;104.094691,30.628588;104.094842,30.629101;104.094843,30.629110;104.094847,30.629112;104.094844,30.629112;104.094981,30.629 [...]
-
-{ROAD_LINE: "104.098732,30.617425;104.098627,30.618628;104.098509,30.619820;104.098450,30.620734;104.098343,30.621661;104.098330,30.622369;104.097957,30.623010;104.097142,30.623703;104.096066,30.624661;104.095001,30.625176;104.094156,30.625641;104.094172,30.626353;104.094258,30.627283;104.094562,30.628429;104.094773,30.629129;104.094917,30.629638;104.094772,30.630826;104.094205,30.631954;104.093683,30.633191;104.093311,30.634523;104.093051,30.635380;104.093025,30.635576;104.092987,30.635 [...]
-
-{ROAD_LINE: "104.098878,30.616546;104.098880,30.616598;104.098880,30.616608;104.098882,30.616608;104.098862,30.616695;104.098732,30.617299;104.098665,30.617768;104.098631,30.618374;104.098612,30.618775;104.098604,30.618840;104.098601,30.618853;104.098591,30.618867;104.098575,30.619078;104.098537,30.619594;104.098485,30.620166;104.098382,30.620818;104.098362,30.621409;104.098310,30.621890;104.098130,30.622638;104.097790,30.623029;104.097689,30.623159;104.097684,30.623155;104.097605,30.623 [...]
-
-{ROAD_LINE: "104.098807,30.616781;104.098725,30.617751;104.098589,30.618846;104.098554,30.619237;104.098518,30.619269;104.098502,30.619283;104.098507,30.619281;104.098511,30.619270;104.098505,30.619273;104.098510,30.619271;104.098510,30.619274;104.098489,30.619430;104.098487,30.619495;104.098477,30.619502;104.098466,30.619743;104.098388,30.620620;104.098329,30.621199;104.098278,30.621635;104.098197,30.622399;104.098060,30.622776;104.097982,30.622917;104.097770,30.623113;104.097737,30.623 [...]
-
-{ROAD_LINE: "104.098820,30.616854;104.098757,30.617423;104.098761,30.617425;104.098730,30.617743;104.098632,30.618850;104.098485,30.620226;104.098355,30.621585;104.098028,30.622815;104.097527,30.623257;104.097536,30.623291;104.097539,30.623307;104.097538,30.623325;104.097536,30.623337;104.097534,30.623350;104.097529,30.623368;104.097524,30.623389;104.097519,30.623392;104.097516,30.623389;104.097512,30.623382;104.097050,30.623794;104.096475,30.624337;104.095811,30.624813;104.094964,30.625 [...]
-
-{ROAD_LINE: "104.098810,30.617087;104.098713,30.617855;104.098660,30.618538;104.098659,30.618941;104.098659,30.619079;104.098655,30.619161;104.098639,30.619165;104.098619,30.619154;104.098634,30.619177;104.098563,30.619575;104.098464,30.620212;104.098361,30.620969;104.098296,30.621720;104.098117,30.622692;104.097890,30.622944;104.097894,30.622957;104.097791,30.623055;104.097217,30.623570;104.096527,30.624223;104.096020,30.624631;104.095445,30.624930;104.094558,30.625344;104.094158,30.625 [...]
-
-{ROAD_LINE: "104.098800,30.617481;104.098794,30.617487;104.098792,30.617488;104.098792,30.617489;104.098793,30.617484;104.098792,30.617493;104.098754,30.617880;104.098667,30.618621;104.098633,30.619295;104.098636,30.619328;104.098576,30.619781;104.098501,30.620522;104.098434,30.621286;104.098361,30.621778;104.098284,30.622030;104.098240,30.622533;104.098166,30.622709;104.098133,30.622771;104.097788,30.623038;104.097237,30.623571;104.096766,30.624042;104.096341,30.624465;104.095690,30.624 [...]
-
-{ROAD_LINE: "104.098810,30.617182;104.098813,30.617334;104.098873,30.617425;104.098862,30.617555;104.098838,30.617790;104.098837,30.618217;104.098413,30.621011;104.098382,30.621349;104.098385,30.621566;104.096605,30.624281;104.095657,30.624963;104.094150,30.626045;104.094170,30.626136;104.094811,30.629276;104.094823,30.629269;104.094979,30.629179;104.094994,30.629876;104.093286,30.634908;104.092731,30.636405;104.090384,30.639871;104.088699,30.641460;104.083730,30.643204;104.081620,30.644 [...]
-
-{ROAD_LINE: "104.098802,30.617013;104.098758,30.617391;104.098751,30.617402;104.098745,30.617397;104.098696,30.617586;104.098621,30.618315;104.098530,30.619429;104.098440,30.620426;104.098360,30.621477;104.098320,30.621903;104.098328,30.621904;104.098335,30.621904;104.098330,30.622001;104.098308,30.622256;104.098300,30.622263;104.098303,30.622266;104.098306,30.622269;104.098309,30.622271;104.098309,30.622273;104.098298,30.622277;104.098268,30.622411;104.098227,30.622537;104.098150,30.622 [...]
-
-{ROAD_LINE: "104.098856,30.616167;104.098781,30.617289;104.098780,30.617464;104.098805,30.617473;104.098816,30.617480;104.098825,30.617480;104.098820,30.617474;104.098825,30.617534;104.098746,30.618344;104.098633,30.619561;104.098519,30.620748;104.098409,30.621899;104.098262,30.622522;104.097881,30.623005;104.097885,30.623012;104.097891,30.623022;104.097885,30.623032;104.097752,30.623158;104.096988,30.623865;104.096066,30.624688;104.095311,30.625037;104.094248,30.625533;104.094101,30.625 [...]
-
-{ROAD_LINE: "104.098860,30.616155;104.098657,30.618607;104.098638,30.618880;104.098638,30.618879;104.098627,30.619120;104.098612,30.619369;104.098435,30.620908;104.098144,30.622691;104.097527,30.623322;104.097521,30.623324;104.097521,30.623326;104.097006,30.623809;104.095164,30.625082;104.094544,30.625385;104.094132,30.625900;104.094499,30.628116;104.094871,30.629274;104.094893,30.629378;104.094938,30.629684;104.093737,30.633081;104.093079,30.635418;104.092322,30.637132;104.090823,30.639 [...]
-
-{ROAD_LINE: "104.098777,30.616168;104.098788,30.617024;104.098811,30.617318;104.098765,30.617453;104.098765,30.617487;104.098763,30.617583;104.098763,30.617643;104.098390,30.620898;104.098307,30.621827;104.098010,30.622864;104.097661,30.623169;104.096932,30.623884;104.096196,30.624594;104.094237,30.625608;104.094124,30.626100;104.094252,30.626838;104.094257,30.626908;104.094257,30.626975;104.094252,30.627100;104.094692,30.628561;104.094799,30.628928;104.094991,30.629701;104.094969,30.630 [...]
-
-{ROAD_LINE: "104.098789,30.616836;104.098719,30.617453;104.098707,30.617460;104.098698,30.617470;104.098689,30.617481;104.098680,30.617510;104.098611,30.618127;104.098518,30.619155;104.098477,30.619420;104.098478,30.619417;104.098479,30.619412;104.098475,30.619405;104.098475,30.619404;104.098473,30.619410;104.098476,30.619418;104.098479,30.619423;104.098481,30.619424;104.098445,30.619749;104.098390,30.620485;104.098309,30.621292;104.098279,30.621622;104.098244,30.621637;104.098202,30.621 [...]
-
-{ROAD_LINE: "104.098797,30.617084;104.098356,30.620889;104.098339,30.621616;104.098423,30.622290;104.098358,30.622612;104.098209,30.622752;104.097865,30.623080;104.097285,30.623596;104.096671,30.624092;104.096385,30.624350;104.096180,30.624541;104.095733,30.624788;104.095370,30.624777;104.094527,30.625239;104.094336,30.625865;104.094396,30.626658;104.094364,30.627464;104.094495,30.628049;104.094489,30.628124;104.094483,30.628137;104.094542,30.628344;104.094685,30.628799;104.094796,30.629 [...]
-
-{ROAD_LINE: "104.098716,30.617335;104.098569,30.618942;104.098478,30.619840;104.098449,30.620481;104.098355,30.621410;104.098283,30.622268;104.097979,30.622901;104.097734,30.623125;104.097741,30.623125;104.097746,30.623129;104.097763,30.623138;104.097766,30.623140;104.097764,30.623140;104.097767,30.623143;104.097784,30.623168;104.097809,30.623193;104.097816,30.623204;104.097818,30.623206;104.097649,30.623344;104.097018,30.623895;104.096507,30.624392;104.095825,30.624821;104.094936,30.625 [...]
-
-{ROAD_LINE: "104.098783,30.617401;104.098704,30.618261;104.098624,30.619191;104.098540,30.620274;104.098431,30.621388;104.098262,30.622487;104.097690,30.623154;104.097523,30.623316;104.097520,30.623331;104.097525,30.623356;104.097534,30.623372;104.097537,30.623371;104.097541,30.623367;104.097544,30.623364;104.097540,30.623367;104.097539,30.623375;104.097540,30.623379;104.097542,30.623381;104.097528,30.623393;104.097186,30.623685;104.096459,30.624371;104.095660,30.624869;104.094616,30.625 [...]
-
-{ROAD_LINE: "104.100564,30.616182;104.100079,30.616221;104.099485,30.616172;104.098987,30.616298;104.098889,30.617014;104.098831,30.617341;104.098801,30.617317;104.098793,30.617309;104.098797,30.617315;104.098767,30.617639;104.098695,30.618311;104.098611,30.619116;104.098591,30.619198;104.098590,30.619206;104.098586,30.619209;104.098579,30.619217;104.098555,30.619431;104.098473,30.620178;104.098377,30.621215;104.098309,30.622262;104.098082,30.622876;104.097764,30.623233;104.097694,30.623 [...]
-
-{ROAD_LINE: "104.098668,30.618815;104.098614,30.619459;104.098607,30.619623;104.098283,30.622439;104.097589,30.623239;104.097527,30.623309;104.094981,30.625193;104.094177,30.625833;104.094189,30.626005;104.094798,30.628982;104.094926,30.629428;104.094991,30.629979;104.093721,30.633227;104.092936,30.635799;104.091143,30.638816;104.088804,30.641298;104.085115,30.642734;104.083323,30.643321;104.080677,30.644654;104.078582,30.645818;104.078000,30.646127;104.078499,30.647307;104.078307,30.647 [...]
-
-{ROAD_LINE: "104.098814,30.617594;104.098690,30.618787;104.098591,30.619636;104.098505,30.620488;104.098452,30.621065;104.098404,30.621424;104.098396,30.621570;104.098376,30.621850;104.098353,30.622093;104.098304,30.622504;104.098152,30.622741;104.097633,30.623191;104.096746,30.624066;104.096019,30.624684;104.095244,30.625064;104.094447,30.625444;104.094169,30.625735;104.094175,30.626125;104.094175,30.626185;104.094179,30.626293;104.094189,30.626411;104.094212,30.626562;104.094224,30.626 [...]
-
-{ROAD_LINE: "104.098787,30.617607;104.098733,30.618160;104.098702,30.618645;104.098677,30.618728;104.098651,30.618737;104.098638,30.618735;104.098607,30.618770;104.098595,30.619056;104.098587,30.619590;104.098553,30.619938;104.098478,30.620646;104.098408,30.621277;104.098355,30.621728;104.098354,30.622212;104.098311,30.622437;104.098320,30.622452;104.098271,30.622597;104.098162,30.622776;104.097675,30.623245;104.097079,30.623785;104.096386,30.624510;104.096017,30.624745;104.095525,30.624 [...]
-
-{ROAD_LINE: "104.098662,30.618384;104.098667,30.618507;104.098662,30.618772;104.098665,30.618814;104.098653,30.618972;104.098650,30.619024;104.098634,30.619289;104.098634,30.619321;104.098472,30.621249;104.098503,30.621309;104.098497,30.621403;104.098490,30.621441;104.098166,30.622739;104.097907,30.623034;104.096639,30.624164;104.095366,30.625067;104.094249,30.625595;104.094177,30.625825;104.094176,30.625910;104.094152,30.626001;104.094205,30.626465;104.094226,30.626555;104.094284,30.626 [...]
-
-{ROAD_LINE: "104.098677,30.618851;104.098688,30.619318;104.098663,30.619555;104.098574,30.620165;104.098409,30.621535;104.098156,30.622685;104.097674,30.623250;104.097345,30.623568;104.096735,30.624115;104.096400,30.624438;104.096058,30.624673;104.095166,30.625090;104.094588,30.625374;104.094203,30.625642;104.094193,30.626190;104.094258,30.626906;104.094380,30.627733;104.094777,30.628971;104.094873,30.629268;104.094938,30.629668;104.094865,30.630554;104.094435,30.631594;104.093856,30.632 [...]
-
-{ROAD_LINE: "104.098862,30.617620;104.098623,30.619374;104.098634,30.619391;104.098640,30.619418;104.098622,30.619483;104.098292,30.621871;104.097964,30.622894;104.097719,30.623244;104.095499,30.624978;104.094120,30.625775;104.094115,30.625848;104.094119,30.626015;104.094126,30.626100;104.094129,30.626181;104.094131,30.626352;104.094309,30.627584;104.094801,30.629186;104.094941,30.629882;104.094087,30.632184;104.093854,30.632741;104.092982,30.635613;104.092886,30.635846;104.092471,30.636 [...]
-
-{ROAD_LINE: "104.099263,30.617697;104.098739,30.618478;104.098607,30.619221;104.098522,30.620066;104.098376,30.621082;104.098337,30.621883;104.098310,30.622374;104.098198,30.622714;104.097996,30.622930;104.097777,30.623113;104.097518,30.623345;104.097622,30.623835;104.098137,30.624402;104.098563,30.625018;104.098922,30.625548;104.099065,30.625875;104.099384,30.626363;104.099024,30.626827;104.098028,30.627516;104.097070,30.628173;104.096271,30.628700;104.095367,30.629331;104.094824,30.630 [...]
-
-{ROAD_LINE: "104.098797,30.617650;104.098614,30.619328;104.098609,30.619334;104.098542,30.619901;104.098419,30.621409;104.098427,30.621721;104.098315,30.622012;104.098289,30.622111;104.097777,30.623127;104.097591,30.623279;104.095541,30.624930;104.094167,30.625882;104.094159,30.626040;104.094219,30.626785;104.094219,30.626893;104.094806,30.629027;104.094969,30.629693;104.093848,30.632794;104.093367,30.634606;104.093197,30.635225;104.093019,30.635588;104.092067,30.637601;104.090541,30.639 [...]
-
-{ROAD_LINE: "104.098658,30.618687;104.098613,30.619195;104.098605,30.619253;104.098590,30.619464;104.098588,30.619504;104.098582,30.619583;104.098327,30.621958;104.098326,30.621997;104.098324,30.622067;104.098403,30.622207;104.099808,30.622859;104.099206,30.623814;104.099096,30.623929;104.098061,30.624412;104.098065,30.624444;104.098745,30.625371;104.098850,30.625575;104.098849,30.625602;104.098865,30.625635;104.099002,30.625853;104.099350,30.626495;104.097369,30.628009;104.094978,30.629 [...]
-
-{ROAD_LINE: "104.098668,30.618652;104.098570,30.619408;104.098471,30.620416;104.098381,30.621322;104.098312,30.621959;104.098224,30.622519;104.098142,30.622732;104.097943,30.622951;104.097579,30.623205;104.097165,30.623625;104.096790,30.623948;104.096448,30.624332;104.095834,30.624780;104.094896,30.625220;104.094215,30.625649;104.094205,30.626343;104.094257,30.627051;104.094288,30.627417;104.094055,30.627314;104.093652,30.626853;104.092861,30.626196;104.092239,30.626089;104.091243,30.626 [...]
-
-{ROAD_LINE: "104.098664,30.618681;104.098378,30.621212;104.098307,30.621947;104.097847,30.623029;104.097463,30.623375;104.095972,30.624705;104.094167,30.625624;104.094218,30.626566;104.094667,30.628633;104.094743,30.628881;104.094723,30.628880;104.094740,30.628915;104.094621,30.631147;104.093400,30.634331;104.092846,30.636033;104.092233,30.637280;104.090619,30.639433;104.088511,30.641525;104.085516,30.642586;104.082466,30.643656;104.081716,30.644006;104.079450,30.645301;104.077259,30.646 [...]
-
-{ROAD_LINE: "104.098784,30.617876;104.098735,30.618658;104.098698,30.619026;104.098669,30.619063;104.098685,30.619077;104.098677,30.619079;104.098675,30.619077;104.098651,30.619267;104.098620,30.619623;104.098544,30.620303;104.098464,30.620930;104.098383,30.621336;104.098285,30.621924;104.098243,30.622545;104.097903,30.623120;104.097618,30.623499;104.097689,30.624049;104.098529,30.625170;104.099286,30.626095;104.099431,30.626510;104.098959,30.627054;104.097992,30.627836;104.096944,30.628 [...]
-
-{ROAD_LINE: "104.098721,30.617970;104.098425,30.620811;104.098315,30.621518;104.098201,30.622531;104.097841,30.622942;104.097807,30.622959;104.097474,30.623207;104.096937,30.623334;104.096850,30.623187;104.093959,30.620892;104.093930,30.620895;104.092927,30.621112;104.092916,30.621327;104.092811,30.622115;104.092831,30.622359;104.093777,30.624556;104.094119,30.625728;104.094120,30.625858;104.094551,30.628384;104.094701,30.628808;104.094703,30.628806;104.094919,30.630191;104.093715,30.632 [...]
-
-{ROAD_LINE: "104.098942,30.617594;104.098788,30.617727;104.098580,30.618977;104.098562,30.619138;104.098560,30.619281;104.098560,30.619418;104.098337,30.621514;104.098276,30.622174;104.098281,30.622271;104.097587,30.623267;104.097586,30.623267;104.097579,30.623266;104.097576,30.623266;104.097577,30.623262;104.096244,30.624546;104.096161,30.624607;104.094117,30.625892;104.094131,30.626073;104.094374,30.627931;104.094579,30.628529;104.094913,30.630087;104.093954,30.632454;104.093952,30.632 [...]
-
-{ROAD_LINE: "104.099193,30.617625;104.098793,30.617574;104.098718,30.617670;104.098695,30.617977;104.098698,30.618070;104.098637,30.619089;104.098637,30.619195;104.098607,30.619341;104.098482,30.620098;104.098449,30.620364;104.098450,30.620461;104.098362,30.621191;104.098384,30.621547;104.098378,30.621689;104.098380,30.621736;104.098340,30.621851;104.098221,30.622252;104.098226,30.622321;104.097729,30.623166;104.096042,30.624726;104.094076,30.625698;104.094002,30.625985;104.094002,30.626 [...]
-
-{ROAD_LINE: "104.099244,30.617611;104.098869,30.617728;104.098695,30.618351;104.098551,30.619447;104.098481,30.620436;104.098398,30.621460;104.098344,30.621959;104.098229,30.622525;104.097819,30.623026;104.097635,30.623177;104.097648,30.623208;104.097661,30.623238;104.097468,30.623399;104.096997,30.623780;104.096363,30.624473;104.095607,30.624920;104.094707,30.625314;104.094158,30.625691;104.094161,30.626118;104.094204,30.626436;104.094266,30.626896;104.094288,30.627201;104.094378,30.627 [...]
-
-{ROAD_LINE: "104.098692,30.617781;104.098535,30.619181;104.098450,30.620148;104.098347,30.621105;104.098236,30.621925;104.098037,30.622720;104.097524,30.623237;104.097523,30.623319;104.097555,30.623382;104.097550,30.623384;104.097543,30.623380;104.097554,30.623383;104.097561,30.623375;104.097552,30.623372;104.097542,30.623379;104.097543,30.623384;104.097546,30.623387;104.097548,30.623388;104.097543,30.623389;104.097381,30.623504;104.096897,30.623942;104.095958,30.624755;104.094723,30.625 [...]
-
-{ROAD_LINE: "104.098785,30.617891;104.098473,30.620604;104.098461,30.621273;104.098508,30.621515;104.098424,30.621644;104.098341,30.621667;104.098326,30.621696;104.098283,30.622310;104.098156,30.622745;104.097994,30.622989;104.097964,30.623059;104.097989,30.623089;104.097642,30.623322;104.097212,30.623645;104.096965,30.623833;104.096755,30.623999;104.096267,30.624496;104.095221,30.625021;104.094429,30.625408;104.094203,30.625670;104.094206,30.625897;104.094214,30.626042;104.094315,30.626 [...]
-
-{ROAD_LINE: "104.098705,30.618664;104.098583,30.619461;104.098515,30.620568;104.098419,30.621469;104.098394,30.621605;104.098387,30.621620;104.098350,30.621667;104.098324,30.621651;104.098314,30.621639;104.098292,30.622018;104.098241,30.622537;104.097882,30.622966;104.097862,30.622999;104.097858,30.623012;104.097651,30.623199;104.097227,30.623587;104.096686,30.624121;104.096442,30.624371;104.096094,30.624632;104.095575,30.624905;104.094653,30.625328;104.094192,30.625624;104.094142,30.625 [...]
-
-{ROAD_LINE: "104.098850,30.617718;104.098735,30.617920;104.098359,30.621564;104.098350,30.621719;104.098355,30.621739;104.098381,30.622024;104.098356,30.622397;104.097819,30.623104;104.097794,30.623122;104.097674,30.623192;104.097671,30.623191;104.097666,30.623186;104.097309,30.623531;104.095721,30.624832;104.094144,30.625997;104.094136,30.626390;104.094147,30.626538;104.094159,30.626623;104.094219,30.627097;104.094219,30.627155;104.094576,30.628471;104.094904,30.629924;104.094898,30.630 [...]
-
-{ROAD_LINE: "104.098689,30.618551;104.098640,30.619361;104.098632,30.619368;104.098627,30.619374;104.098606,30.619719;104.098474,30.620481;104.098372,30.621611;104.098219,30.622599;104.097630,30.623226;104.097014,30.623833;104.096336,30.624507;104.095823,30.624814;104.094859,30.625298;104.094321,30.625588;104.094170,30.625742;104.094184,30.626142;104.094248,30.626750;104.094252,30.627086;104.094369,30.627711;104.094410,30.627869;104.094410,30.627879;104.094412,30.627883;104.094432,30.627 [...]
-
-{ROAD_LINE: "104.098801,30.618415;104.098688,30.618924;104.098624,30.619306;104.098524,30.619944;104.098349,30.621726;104.098343,30.621778;104.098338,30.621806;104.098341,30.621804;104.098342,30.621804;104.098341,30.621802;104.098353,30.621800;104.098355,30.621826;104.098311,30.622265;104.098075,30.622825;104.098032,30.622843;104.098016,30.622837;104.098003,30.622840;104.097603,30.623161;104.097074,30.623633;104.096534,30.624253;104.096139,30.624584;104.095513,30.624917;104.094765,30.625 [...]
-
-{ROAD_LINE: "104.098701,30.618125;104.098344,30.621751;104.098242,30.622458;104.097917,30.622888;104.098003,30.622920;104.097979,30.623019;104.097413,30.623472;104.097201,30.623582;104.097078,30.623668;104.096869,30.623902;104.096618,30.624127;104.096559,30.624151;104.096430,30.624263;104.096323,30.624387;104.096299,30.624407;104.096095,30.624595;104.095624,30.624857;104.095067,30.625149;104.094509,30.625404;104.094427,30.625452;104.094152,30.625818;104.094149,30.626325;104.094180,30.627 [...]
-
-{ROAD_LINE: "104.098758,30.617575;104.098703,30.618137;104.098613,30.619116;104.098533,30.619961;104.098438,30.620959;104.098387,30.621548;104.098366,30.621783;104.098310,30.622342;104.098144,30.622753;104.098081,30.622814;104.097943,30.622958;104.097737,30.623115;104.097460,30.623384;104.096978,30.623797;104.096531,30.624293;104.096158,30.624614;104.095690,30.624848;104.094846,30.625252;104.094328,30.625512;104.094168,30.625738;104.094154,30.625924;104.094191,30.626177;104.094276,30.626 [...]
-
-{ROAD_LINE: "104.099256,30.617650;104.099314,30.617661;104.099331,30.617669;104.099331,30.617677;104.099343,30.617676;104.099068,30.617645;104.098733,30.618145;104.098601,30.619193;104.098466,30.620256;104.098354,30.621398;104.098240,30.622278;104.097999,30.622890;104.097918,30.623000;104.097693,30.623134;104.097280,30.623501;104.096972,30.623845;104.096708,30.624099;104.096466,30.624330;104.096174,30.624590;104.095983,30.624693;104.095699,30.624823;104.095096,30.625129;104.094578,30.625 [...]
-
-{ROAD_LINE: "104.099338,30.617682;104.099060,30.617737;104.098734,30.617931;104.098643,30.618691;104.098634,30.618913;104.098623,30.618932;104.098579,30.619287;104.098540,30.619842;104.098484,30.620350;104.098437,30.620937;104.098387,30.621604;104.098331,30.622186;104.098322,30.622446;104.098311,30.622466;104.098274,30.622530;104.098139,30.622764;104.097837,30.623067;104.097297,30.623563;104.096677,30.624198;104.096577,30.624277;104.096291,30.624517;104.096013,30.624686;104.095948,30.624 [...]
-
-{ROAD_LINE: "104.098893,30.618078;104.098542,30.620765;104.098537,30.620776;104.098534,30.620778;104.098530,30.620792;104.098525,30.620799;104.098481,30.621122;104.098441,30.621437;104.098427,30.621631;104.098382,30.621735;104.098351,30.621741;104.098313,30.621832;104.098304,30.622072;104.098339,30.622348;104.098364,30.622388;104.098347,30.622509;104.098319,30.622576;104.098269,30.622652;104.098278,30.622668;104.098290,30.622679;104.098298,30.622684;104.098302,30.622683;104.098304,30.622 [...]
-
-{ROAD_LINE: "104.098475,30.618525;104.098757,30.616247;104.098753,30.616233;104.098883,30.614920;104.099170,30.611674;104.099132,30.611016;104.097445,30.610476;104.096892,30.609749;104.096548,30.608088;104.095009,30.607823;104.094974,30.607927;104.094827,30.609509;104.094768,30.610446;104.094780,30.610684;104.094767,30.610844;104.094768,30.610966;104.094695,30.611691;104.094160,30.613286;104.093448,30.614333;104.092879,30.615687;104.092878,30.615760;104.092878,30.615822;104.092874,30.615 [...]
-
-{ROAD_LINE: "104.098679,30.618427;104.098649,30.619055;104.098628,30.619222;104.098612,30.619241;104.098597,30.619253;104.098602,30.619245;104.098606,30.619241;104.098616,30.619239;104.098603,30.619245;104.098578,30.619275;104.098554,30.619583;104.098490,30.620298;104.098421,30.621212;104.098248,30.622139;104.097848,30.622977;104.097310,30.623486;104.096891,30.623867;104.096638,30.624132;104.096521,30.624246;104.096460,30.624315;104.096234,30.624520;104.095723,30.624874;104.095114,30.625 [...]
-
-{ROAD_LINE: "104.098601,30.618896;104.098601,30.618918;104.098583,30.619122;104.098517,30.619723;104.098473,30.620204;104.098423,30.620825;104.098368,30.621286;104.098336,30.621537;104.098322,30.622098;104.098290,30.622376;104.098292,30.622379;104.098285,30.622386;104.098280,30.622388;104.098276,30.622396;104.098199,30.622600;104.097853,30.622976;104.097622,30.623204;104.097567,30.623259;104.097576,30.623256;104.097579,30.623261;104.097574,30.623253;104.097571,30.623256;104.097567,30.623 [...]
-
-{ROAD_LINE: "104.098622,30.618757;104.098587,30.619291;104.098588,30.619395;104.098587,30.619397;104.098590,30.619399;104.098591,30.619403;104.098590,30.619409;104.098587,30.619417;104.098588,30.619417;104.098374,30.621605;104.098343,30.621933;104.098354,30.621968;104.098343,30.621981;104.098342,30.621996;104.098355,30.622044;104.098237,30.622618;104.098031,30.622790;104.098074,30.622866;104.098095,30.622900;104.098094,30.622911;104.097995,30.623032;104.097404,30.623586;104.096670,30.624 [...]
-
-{ROAD_LINE: "104.098559,30.618805;104.098554,30.618898;104.098564,30.618916;104.098526,30.619450;104.098489,30.619982;104.098406,30.620566;104.098330,30.621104;104.098281,30.621528;104.098248,30.622048;104.098142,30.622707;104.098109,30.622818;104.098083,30.622863;104.098109,30.622891;104.098067,30.622921;104.097789,30.623155;104.097523,30.623418;104.097657,30.623902;104.098157,30.624653;104.098882,30.625510;104.099026,30.625720;104.099010,30.625736;104.099006,30.625746;104.099252,30.626 [...]
-
-{ROAD_LINE: "104.098594,30.618759;104.098522,30.619401;104.098515,30.619915;104.098450,30.620514;104.098393,30.621254;104.098267,30.622050;104.098090,30.622727;104.097801,30.623027;104.097731,30.623119;104.097714,30.623158;104.097701,30.623189;104.097700,30.623205;104.097702,30.623216;104.097704,30.623223;104.097707,30.623220;104.097708,30.623216;104.097705,30.623215;104.097706,30.623212;104.097704,30.623216;104.097701,30.623223;104.097694,30.623239;104.097461,30.623465;104.096813,30.624 [...]
-
-{ROAD_LINE: "104.099772,30.617932;104.098729,30.619347;104.098693,30.619463;104.098691,30.619447;104.098681,30.619435;104.098672,30.619433;104.098665,30.619431;104.098657,30.619436;104.098654,30.619450;104.098602,30.619898;104.098519,30.620803;104.098397,30.621836;104.098428,30.621844;104.098464,30.621845;104.098504,30.621844;104.098496,30.621895;104.098404,30.622272;104.098144,30.622775;104.097965,30.622998;104.098013,30.623066;104.098013,30.623079;104.098016,30.623094;104.097735,30.623 [...]
-
-{ROAD_LINE: "104.100035,30.617686;104.100439,30.617695;104.100708,30.617767;104.101149,30.617796;104.101614,30.617824;104.102054,30.617836;104.102089,30.617818;104.102130,30.617818;104.102122,30.618155;104.102067,30.618784;104.102011,30.619378;104.102102,30.620097;104.102705,30.620770;104.103427,30.621494;104.104082,30.622142;104.104641,30.622686;104.104691,30.623188;104.103947,30.623786;104.103156,30.624301;104.102524,30.624706;104.101992,30.625088;104.100936,30.625798;104.100116,30.626 [...]
-
-{ROAD_LINE: "104.100458,30.617810;104.100089,30.617806;104.099620,30.617746;104.099043,30.617654;104.098736,30.618225;104.098576,30.619339;104.098558,30.619429;104.098549,30.619420;104.098545,30.619413;104.098542,30.619416;104.098499,30.620052;104.098395,30.621258;104.098206,30.622582;104.097802,30.623079;104.097797,30.623085;104.097796,30.623095;104.097789,30.623106;104.097789,30.623110;104.097418,30.623446;104.096725,30.624098;104.096349,30.624431;104.095874,30.624751;104.095302,30.625 [...]
-
-{ROAD_LINE: "104.100811,30.617784;104.101063,30.617804;104.101360,30.617836;104.101979,30.617870;104.102193,30.618034;104.102091,30.618475;104.102102,30.619251;104.102184,30.619980;104.102910,30.620916;104.103858,30.621935;104.104553,30.622664;104.104655,30.622778;104.104658,30.622789;104.104653,30.622800;104.104650,30.622809;104.104651,30.622836;104.104657,30.622839;104.104655,30.622839;104.104652,30.622840;104.104651,30.622839;104.104651,30.622837;104.104742,30.622974;104.104631,30.623 [...]
-
-{ROAD_LINE: "104.100089,30.617672;104.099448,30.617682;104.099082,30.617930;104.098826,30.618563;104.098742,30.618986;104.098709,30.619026;104.098684,30.619023;104.098626,30.619351;104.098529,30.620141;104.098459,30.620751;104.098346,30.621384;104.098324,30.621641;104.098312,30.621655;104.098266,30.621692;104.098241,30.622109;104.098214,30.622612;104.098101,30.622803;104.098108,30.622806;104.098104,30.622805;104.098092,30.622801;104.098079,30.622800;104.097998,30.622906;104.097635,30.623 [...]
-
-{ROAD_LINE: "104.100532,30.617669;104.100577,30.617673;104.100595,30.617692;104.100606,30.617714;104.100556,30.617738;104.100147,30.617712;104.099503,30.617663;104.099133,30.617660;104.098898,30.617999;104.098804,30.618666;104.098725,30.618996;104.098677,30.619271;104.098671,30.619461;104.098648,30.619724;104.098644,30.619822;104.098625,30.620030;104.098604,30.620218;104.098588,30.620414;104.098575,30.620548;104.098558,30.620868;104.098528,30.621025;104.098519,30.621021;104.098516,30.621 [...]
-
-{ROAD_LINE: "104.100555,30.617810;104.100735,30.617802;104.100916,30.617811;104.101022,30.617865;104.100677,30.617870;104.099917,30.617729;104.099160,30.617751;104.098903,30.618427;104.098731,30.619519;104.098600,30.620233;104.098462,30.621006;104.098447,30.621331;104.098368,30.621839;104.098358,30.622228;104.098303,30.622523;104.098256,30.622638;104.098070,30.622801;104.097798,30.623059;104.097163,30.623652;104.096531,30.624259;104.096268,30.624475;104.096029,30.624667;104.095970,30.624 [...]
-
-{ROAD_LINE: "104.100818,30.617637;104.100447,30.617612;104.099757,30.617667;104.099599,30.618221;104.099460,30.619304;104.099134,30.620503;104.098942,30.621314;104.098618,30.621620;104.098394,30.622043;104.098266,30.622521;104.097830,30.623016;104.097434,30.623380;104.096918,30.623813;104.096415,30.624346;104.096006,30.624625;104.095702,30.624831;104.094879,30.625264;104.094507,30.625515;104.094179,30.625876;104.094182,30.626610;104.094307,30.627501;104.094646,30.628547;104.094805,30.629 [...]
-
-{ROAD_LINE: "104.100270,30.617790;104.099420,30.617590;104.099118,30.617595;104.098820,30.617659;104.098745,30.617792;104.098475,30.620594;104.098474,30.620674;104.098474,30.620743;104.098474,30.620797;104.098407,30.621463;104.098329,30.621893;104.098327,30.621983;104.098340,30.622126;104.098288,30.622481;104.098238,30.622567;104.098213,30.622634;104.097841,30.623049;104.097681,30.623187;104.097342,30.623496;104.095046,30.625157;104.094154,30.625767;104.094162,30.625823;104.094488,30.628 [...]
-
-{ROAD_LINE: "104.099848,30.617613;104.099288,30.617612;104.099010,30.617674;104.098776,30.618304;104.098656,30.619167;104.098582,30.619783;104.098484,30.620648;104.098426,30.621385;104.098410,30.621641;104.098377,30.621736;104.098352,30.621738;104.098324,30.621732;104.098311,30.621729;104.098294,30.621724;104.098296,30.621724;104.098283,30.621877;104.098264,30.622145;104.098252,30.622305;104.098255,30.622313;104.098255,30.622322;104.098251,30.622325;104.098250,30.622330;104.098250,30.622 [...]
-
-{ROAD_LINE: "104.100284,30.617704;104.100046,30.617669;104.099781,30.617671;104.099395,30.617672;104.099097,30.617685;104.098870,30.618224;104.098796,30.618841;104.098752,30.619240;104.098681,30.619515;104.098543,30.620221;104.098421,30.621118;104.098333,30.621843;104.098309,30.622191;104.098167,30.622713;104.098194,30.622758;104.098201,30.622769;104.098205,30.622775;104.098201,30.622778;104.098156,30.622818;104.097747,30.623182;104.097123,30.623650;104.096798,30.623956;104.096574,30.624 [...]
-
-{ROAD_LINE: "104.099795,30.617827;104.098803,30.617973;104.098709,30.618555;104.098655,30.619043;104.098652,30.619052;104.098642,30.619050;104.098625,30.619048;104.098604,30.619051;104.098587,30.619041;104.098582,30.619039;104.098579,30.619039;104.098575,30.619050;104.098573,30.619054;104.098558,30.619301;104.098496,30.619867;104.098397,30.620577;104.098312,30.621593;104.098277,30.622369;104.098004,30.622881;104.097850,30.623028;104.097509,30.623301;104.097506,30.623753;104.097960,30.624 [...]
-
-{ROAD_LINE: "104.100121,30.617767;104.099570,30.617734;104.099285,30.617713;104.099098,30.617696;104.098825,30.618160;104.098692,30.619021;104.098545,30.620090;104.098403,30.621367;104.098260,30.622480;104.098083,30.622837;104.098131,30.622887;104.098072,30.622874;104.097789,30.623048;104.097412,30.623355;104.096949,30.623772;104.096459,30.624246;104.096117,30.624579;104.095441,30.624909;104.094402,30.625401;104.094054,30.625637;104.094066,30.625872;104.094087,30.626302;104.094128,30.626 [...]
-
-{ROAD_LINE: "104.099936,30.617734;104.099585,30.617706;104.098993,30.617661;104.098718,30.618186;104.098611,30.619339;104.098450,30.620728;104.098357,30.621645;104.098338,30.621609;104.098338,30.621617;104.098324,30.621616;104.098323,30.621623;104.098306,30.621894;104.098149,30.622615;104.097830,30.622956;104.097792,30.622999;104.097701,30.623098;104.097168,30.623566;104.096505,30.624243;104.095791,30.624728;104.094771,30.625206;104.094215,30.625573;104.094146,30.625940;104.094238,30.626 [...]
-
-{ROAD_LINE: "104.099662,30.617657;104.098735,30.617737;104.098495,30.620114;104.098492,30.620317;104.098357,30.621614;104.098355,30.621676;104.098339,30.621813;104.098332,30.621866;104.097990,30.622834;104.097752,30.623166;104.096651,30.624114;104.096137,30.624627;104.094256,30.625525;104.094114,30.625770;104.094117,30.625802;104.094308,30.627499;104.094673,30.628611;104.094821,30.629176;104.094828,30.629207;104.094926,30.629906;104.093719,30.633102;104.093081,30.635355;104.092185,30.637 [...]
-
-{ROAD_LINE: "104.100947,30.617745;104.100388,30.617674;104.099745,30.617621;104.099243,30.617647;104.098828,30.618300;104.098637,30.619621;104.098531,30.620801;104.098435,30.621537;104.098437,30.621566;104.098414,30.621808;104.098359,30.622257;104.098208,30.622689;104.098149,30.622776;104.098113,30.622793;104.098098,30.622817;104.098071,30.622856;104.097697,30.623155;104.097026,30.623731;104.096651,30.624096;104.096227,30.624518;104.095830,30.624785;104.095200,30.625071;104.094527,30.625 [...]
-
-{ROAD_LINE: "104.100668,30.617794;104.099057,30.617600;104.098665,30.618230;104.098404,30.621213;104.098291,30.622584;104.097561,30.623282;104.097552,30.623285;104.097556,30.623284;104.097556,30.623282;104.097552,30.623282;104.095951,30.624724;104.094136,30.626035;104.094484,30.628021;104.094602,30.628394;104.094939,30.629494;104.094964,30.629937;104.094050,30.632278;104.094049,30.632291;104.093799,30.632965;104.093022,30.635588;104.092977,30.635712;104.092868,30.635971;104.091088,30.638 [...]
-
-{ROAD_LINE: "104.099864,30.617706;104.098722,30.619674;104.098548,30.620848;104.098432,30.621848;104.098227,30.622796;104.098022,30.622978;104.097953,30.622986;104.097893,30.623029;104.097510,30.623338;104.096928,30.623893;104.096716,30.624082;104.096488,30.624305;104.095966,30.624729;104.095118,30.625129;104.094370,30.625481;104.094330,30.625457;104.094105,30.625701;104.094179,30.626465;104.094274,30.627330;104.094595,30.628457;104.094777,30.628922;104.094782,30.628939;104.094786,30.628 [...]
-
-{ROAD_LINE: "104.100410,30.617772;104.100863,30.617824;104.101533,30.617905;104.101863,30.617968;104.101990,30.618059;104.101991,30.618232;104.101918,30.618550;104.101858,30.618949;104.101824,30.619645;104.102244,30.620430;104.103138,30.621301;104.103943,30.622059;104.104444,30.622564;104.104542,30.622671;104.104550,30.622667;104.104571,30.622688;104.104803,30.623086;104.104267,30.623573;104.103568,30.624034;104.102859,30.624473;104.102698,30.624571;104.102206,30.624911;104.101340,30.625 [...]
-
-{ROAD_LINE: "104.100837,30.617829;104.100175,30.617768;104.099630,30.617795;104.099071,30.618127;104.098746,30.619106;104.098613,30.620019;104.098458,30.621169;104.098376,30.622230;104.098148,30.622871;104.097785,30.623158;104.097690,30.623235;104.097635,30.623284;104.097613,30.623310;104.097600,30.623324;104.097202,30.623651;104.096512,30.624304;104.095682,30.624871;104.094610,30.625375;104.094274,30.625894;104.094343,30.626884;104.094519,30.628026;104.094824,30.629103;104.094986,30.630 [...]
-
-{ROAD_LINE: "104.100016,30.617672;104.098753,30.618069;104.098281,30.622444;104.097604,30.623209;104.097385,30.623424;104.095694,30.624840;104.094166,30.626267;104.094227,30.626560;104.094967,30.630440;104.093156,30.635202;104.092623,30.636585;104.089926,30.640116;104.088747,30.641321;104.083408,30.643279;104.083343,30.643298;104.081192,30.644413;104.081149,30.644401;104.079556,30.645253;104.075414,30.646394;104.075147,30.647244;104.075179,30.647515;104.077841,30.651546;104.078270,30.652 [...]
-
-{ROAD_LINE: "104.101399,30.616149;104.100422,30.615965;104.099312,30.615905;104.098983,30.616405;104.098846,30.617316;104.098730,30.618372;104.098593,30.619515;104.098481,30.620678;104.098383,30.621347;104.098401,30.621546;104.098326,30.622007;104.098276,30.622562;104.097668,30.623239;104.096876,30.624000;104.096292,30.624585;104.096072,30.624702;104.095529,30.624945;104.094532,30.625397;104.094175,30.626018;104.094255,30.626778;104.094464,30.627779;104.094719,30.628631;104.094753,30.628 [...]
-
-{ROAD_LINE: "104.101105,30.616121;104.100045,30.616106;104.099236,30.616052;104.098883,30.616218;104.098747,30.617207;104.098712,30.617462;104.098698,30.617482;104.098691,30.617492;104.098684,30.617496;104.098656,30.617732;104.098601,30.618542;104.098465,30.619853;104.098410,30.620735;104.098358,30.621760;104.098314,30.621950;104.098324,30.621960;104.098317,30.621952;104.098267,30.621982;104.098147,30.622626;104.097900,30.622968;104.097968,30.622983;104.098013,30.623012;104.098041,30.623 [...]
-
-{ROAD_LINE: "104.102654,30.615620;104.102636,30.615625;104.102620,30.615617;104.102597,30.615611;104.102559,30.615597;104.102553,30.615497;104.102666,30.614760;104.101999,30.614666;104.100801,30.614596;104.099735,30.614510;104.099038,30.614749;104.098954,30.615486;104.098904,30.615741;104.098829,30.616586;104.098735,30.617590;104.098600,30.618799;104.098501,30.619951;104.098399,30.621009;104.098330,30.621643;104.098276,30.621835;104.098247,30.621888;104.098245,30.622111;104.098178,30.622 [...]
-
-{ROAD_LINE: "104.101133,30.616329;104.101169,30.616360;104.101131,30.616321;104.101112,30.616307;104.101133,30.616252;104.101107,30.616236;104.101101,30.616129;104.101164,30.616003;104.101183,30.615981;104.101108,30.616172;104.101115,30.616266;104.101195,30.616147;104.101258,30.616067;104.101249,30.616077;104.101301,30.616025;104.101199,30.616053;104.101079,30.616166;104.101205,30.616050;104.101246,30.616035;104.101204,30.616025;104.101144,30.616082;104.101293,30.616031;104.101193,30.616 [...]
-
-{ROAD_LINE: "104.102253,30.617152;104.101943,30.617768;104.101588,30.617854;104.100975,30.617896;104.100503,30.617941;104.099785,30.617816;104.099693,30.617798;104.099242,30.617777;104.098892,30.618021;104.098697,30.619139;104.098553,30.620231;104.098475,30.620771;104.098396,30.621417;104.098307,30.621963;104.098225,30.622588;104.097825,30.623095;104.097385,30.623546;104.096636,30.624247;104.095936,30.624817;104.095443,30.625028;104.095071,30.625211;104.094711,30.625357;104.094427,30.625 [...]
-
-{ROAD_LINE: "104.102001,30.616224;104.102149,30.616919;104.102144,30.617560;104.102070,30.618036;104.101956,30.618927;104.101870,30.619744;104.102312,30.620525;104.103182,30.621349;104.104111,30.622245;104.104750,30.623143;104.104024,30.623736;104.103207,30.624260;104.102869,30.624468;104.102465,30.624696;104.101743,30.625239;104.101234,30.625601;104.101021,30.625705;104.100971,30.625696;104.100516,30.625930;104.100077,30.626239;104.099790,30.626657;104.100268,30.627347;104.100691,30.628 [...]
-
-{ROAD_LINE: "104.101130,30.616276;104.100358,30.616183;104.099459,30.616094;104.099316,30.616064;104.099294,30.616052;104.099278,30.616046;104.099266,30.616032;104.099261,30.616022;104.099225,30.616019;104.098884,30.616183;104.098829,30.616898;104.098745,30.617318;104.098739,30.617305;104.098731,30.617346;104.098706,30.617586;104.098647,30.618237;104.098583,30.619206;104.098564,30.619332;104.098563,30.619334;104.098566,30.619338;104.098560,30.619403;104.098518,30.619853;104.098453,30.620 [...]
-
-{ROAD_LINE: "104.101201,30.616215;104.100731,30.616291;104.100627,30.616893;104.100548,30.617600;104.101069,30.617729;104.102141,30.617802;104.102247,30.618037;104.102197,30.618255;104.102130,30.618708;104.102117,30.619396;104.102075,30.619933;104.102543,30.620671;104.103447,30.621560;104.104314,30.622356;104.104681,30.622688;104.104680,30.622686;104.104681,30.622686;104.104682,30.622686;104.104682,30.622687;104.104679,30.622689;104.104735,30.622800;104.104470,30.623422;104.103397,30.624 [...]
-
-{ROAD_LINE: "104.101433,30.616244;104.101236,30.616225;104.100851,30.616143;104.100067,30.616115;104.099021,30.616055;104.098858,30.616735;104.098766,30.617542;104.098690,30.618247;104.098642,30.618912;104.098633,30.619092;104.098631,30.619091;104.098603,30.619305;104.098558,30.619851;104.098495,30.620601;104.098416,30.621402;104.098337,30.622161;104.098276,30.622514;104.098121,30.622774;104.097583,30.623247;104.097552,30.623296;104.097547,30.623304;104.097544,30.623304;104.097536,30.623 [...]
-
-{ROAD_LINE: "104.103113,30.616335;104.102582,30.616284;104.101700,30.616188;104.100782,30.616087;104.100069,30.616028;104.099219,30.615988;104.098938,30.616085;104.098849,30.616798;104.098796,30.617447;104.098793,30.617492;104.098792,30.617499;104.098790,30.617498;104.098787,30.617498;104.098745,30.617800;104.098639,30.618645;104.098542,30.619783;104.098423,30.620974;104.098305,30.622033;104.098078,30.622752;104.097595,30.623208;104.097049,30.623692;104.096602,30.624156;104.096315,30.624 [...]
-
-{ROAD_LINE: "104.102343,30.616251;104.102192,30.616232;104.100608,30.616148;104.099770,30.616158;104.098891,30.616307;104.098827,30.617200;104.098740,30.618035;104.098498,30.620291;104.098505,30.620656;104.098180,30.622691;104.097806,30.623026;104.096477,30.624165;104.095366,30.624996;104.094136,30.625848;104.094424,30.627884;104.094846,30.629283;104.094816,30.629238;104.094828,30.629229;104.094831,30.629249;104.094924,30.630147;104.093482,30.633923;104.093037,30.635671;104.092492,30.636 [...]
-
-{ROAD_LINE: "104.102502,30.616240;104.102498,30.616277;104.102206,30.617797;104.100662,30.617785;104.100232,30.617745;104.099328,30.617664;104.098788,30.617792;104.098638,30.618875;104.098638,30.619044;104.098599,30.619331;104.098503,30.620138;104.098399,30.621419;104.098397,30.621536;104.098345,30.622012;104.098241,30.622572;104.098101,30.622804;104.096575,30.624242;104.095747,30.624823;104.094142,30.625832;104.094378,30.627651;104.094708,30.628819;104.094781,30.629084;104.094864,30.629 [...]
-
-{ROAD_LINE: "104.103033,30.616381;104.103667,30.616396;104.104178,30.616816;104.104557,30.617313;104.104001,30.617706;104.103384,30.617863;104.102704,30.617864;104.102135,30.617829;104.101690,30.617785;104.101105,30.617703;104.100334,30.617627;104.099864,30.617587;104.099090,30.617722;104.098820,30.618641;104.098756,30.619265;104.098711,30.619361;104.098689,30.619370;104.098675,30.619376;104.098668,30.619380;104.098660,30.619383;104.098614,30.619721;104.098493,30.621217;104.098477,30.621 [...]
-
-{ROAD_LINE: "104.103294,30.616403;104.104522,30.617169;104.104630,30.617181;104.105050,30.616818;104.105281,30.616852;104.105598,30.617082;104.105878,30.617280;104.106088,30.617577;104.106445,30.617991;104.106817,30.618368;104.106928,30.618620;104.107075,30.619032;104.106927,30.619408;104.106730,30.619604;104.106458,30.619902;104.106085,30.620196;104.105529,30.620685;104.105240,30.620916;104.104781,30.621274;104.104219,30.621872;104.104513,30.622393;104.104762,30.622686;104.104755,30.622 [...]
-
-{ROAD_LINE: "104.103475,30.616317;104.099548,30.615978;104.098569,30.619158;104.098548,30.619219;104.098105,30.622738;104.097775,30.623170;104.097786,30.623176;104.094407,30.625466;104.094437,30.627874;104.094840,30.630663;104.093906,30.632647;104.092967,30.635656;104.092335,30.637032;104.089574,30.640522;104.085028,30.642756;104.080787,30.644583;104.076331,30.646238;104.072191,30.646710;104.069814,30.648592;104.068635,30.651960;104.068841,30.652570;104.068841,30.652570"},
-
-{ROAD_LINE: "104.103214,30.616311;104.104539,30.617192;104.104974,30.617006;104.105622,30.617122;104.106268,30.617770;104.106898,30.618384;104.107287,30.619104;104.106709,30.619751;104.106539,30.620200;104.107323,30.620846;104.107708,30.621163;104.107693,30.621183;104.107689,30.621184;104.106576,30.622097;104.105355,30.622902;104.105353,30.622909;104.105327,30.622931;104.104695,30.623342;104.103623,30.624038;104.102904,30.624505;104.102407,30.624836;104.101611,30.625396;104.101088,30.625 [...]
-
-{ROAD_LINE: "104.102356,30.616754;104.102360,30.617277;104.102199,30.617821;104.102198,30.618169;104.102145,30.618966;104.102058,30.619727;104.102537,30.620580;104.103468,30.621566;104.104120,30.622181;104.104581,30.622721;104.104589,30.622750;104.104588,30.622757;104.104695,30.623101;104.104228,30.623582;104.103484,30.624072;104.103359,30.624154;104.103363,30.624149;104.103350,30.624152;104.103364,30.624134;104.103081,30.624313;104.102451,30.624721;104.102129,30.624967;104.101892,30.625 [...]
-
-{ROAD_LINE: "104.102522,30.616247;104.102504,30.616279;104.102478,30.616340;104.102361,30.616654;104.102374,30.616712;104.102243,30.616980;104.102236,30.617524;104.102104,30.617809;104.101799,30.617856;104.101327,30.617837;104.101047,30.617839;104.100800,30.617789;104.100301,30.617748;104.099925,30.617756;104.099635,30.617723;104.099510,30.617694;104.099440,30.617673;104.099378,30.617663;104.099173,30.617691;104.098942,30.617714;104.098779,30.618320;104.098696,30.619008;104.098678,30.619 [...]
-
-{ROAD_LINE: "104.102393,30.616234;104.102423,30.616290;104.102416,30.616722;104.102380,30.617083;104.102375,30.617346;104.102276,30.617873;104.102241,30.618127;104.102179,30.618782;104.102109,30.619408;104.102100,30.620023;104.102639,30.620728;104.103551,30.621679;104.104468,30.622592;104.104621,30.622766;104.104609,30.622769;104.104605,30.622770;104.104606,30.622773;104.104606,30.622779;104.104601,30.622783;104.104601,30.622786;104.104602,30.622787;104.104670,30.623275;104.103633,30.623 [...]
-
-{ROAD_LINE: "104.102468,30.616468;104.102206,30.617752;104.101720,30.617813;104.101171,30.617762;104.099930,30.617669;104.099469,30.617671;104.099188,30.617674;104.098810,30.618342;104.098683,30.619073;104.098600,30.619803;104.098498,30.620499;104.098396,30.621204;104.098308,30.621724;104.098222,30.621949;104.098200,30.622310;104.098113,30.622702;104.097638,30.623189;104.097421,30.623631;104.097767,30.624292;104.098578,30.625453;104.098975,30.626077;104.099039,30.626175;104.099120,30.626 [...]
-
-{ROAD_LINE: "104.102374,30.617176;104.102296,30.617538;104.102209,30.618014;104.102142,30.618359;104.102103,30.618768;104.102029,30.619282;104.104673,30.622843;104.104714,30.623182;104.104117,30.623707;104.103421,30.624326;104.103834,30.625337;104.104128,30.626291;104.103294,30.626797;104.102434,30.627314;104.101846,30.627635;104.101266,30.628026;104.100986,30.628313;104.101411,30.629049;104.101953,30.630063;104.102626,30.631149;104.102967,30.631735;104.102977,30.631786;104.102960,30.631 [...]
-
-{ROAD_LINE: "104.101460,30.617917;104.099648,30.617667;104.099167,30.617625;104.098743,30.617792;104.098449,30.620726;104.098277,30.621733;104.098224,30.621829;104.098222,30.621868;104.098183,30.622554;104.098043,30.622880;104.097222,30.623564;104.095434,30.624895;104.094122,30.625775;104.094131,30.626088;104.094146,30.626372;104.094311,30.627651;104.094774,30.629201;104.094773,30.629203;104.094776,30.629204;104.094881,30.630206;104.093635,30.633300;104.093009,30.635660;104.091801,30.638 [...]
-
-{ROAD_LINE: "104.102133,30.617865;104.099467,30.617605;104.098705,30.618115;104.098484,30.620071;104.098247,30.621883;104.097976,30.622812;104.097690,30.623157;104.096892,30.623532;104.096471,30.623195;104.094066,30.621034;104.094047,30.620888;104.091909,30.620975;104.088564,30.620892;104.084757,30.620695;104.080803,30.620540;104.076376,30.620414;104.070749,30.620309;104.069210,30.620533;104.067515,30.620675;104.067500,30.620666;104.067156,30.621041;104.067145,30.621608;104.067147,30.621 [...]
-
-{ROAD_LINE: "104.102183,30.618649;104.102180,30.618730;104.102145,30.619124;104.102148,30.619189;104.102087,30.619721;104.102085,30.619784;104.102084,30.620079;104.104508,30.622571;104.104790,30.623060;104.104585,30.623366;104.102508,30.624726;104.100480,30.626107;104.100440,30.626142;104.098422,30.627362;104.096854,30.628369;104.096353,30.628721;104.094978,30.629871;104.093877,30.632636;104.093146,30.635220;104.092870,30.635876;104.091166,30.638814;104.088651,30.641432;104.085475,30.642 [...]
-
-{ROAD_LINE: "104.101021,30.617897;104.100518,30.617850;104.100079,30.617825;104.099664,30.617780;104.099629,30.617765;104.099610,30.617745;104.099602,30.617730;104.099519,30.617737;104.099199,30.617711;104.098870,30.617776;104.098698,30.618722;104.098493,30.620235;104.098400,30.621580;104.098372,30.622152;104.098406,30.622304;104.098484,30.622378;104.098362,30.622519;104.098204,30.622690;104.098010,30.622913;104.097819,30.623062;104.097797,30.623032;104.097787,30.623022;104.097743,30.623 [...]
-
-{ROAD_LINE: "104.102150,30.617991;104.100728,30.617724;104.100027,30.617549;104.099207,30.617698;104.098874,30.618463;104.098670,30.619658;104.098503,30.620985;104.098379,30.621665;104.098361,30.621713;104.098322,30.622235;104.098159,30.622741;104.097920,30.622957;104.097894,30.622998;104.097874,30.623019;104.097700,30.623150;104.097222,30.623574;104.096637,30.624184;104.096407,30.624394;104.096208,30.624544;104.095884,30.624739;104.095578,30.624881;104.095044,30.625131;104.094233,30.625 [...]
-
-{ROAD_LINE: "104.100966,30.617908;104.100404,30.617827;104.099676,30.617737;104.099183,30.617754;104.098949,30.618314;104.098767,30.619289;104.098573,30.620369;104.098506,30.621190;104.098491,30.621307;104.098456,30.621420;104.098423,30.621494;104.098396,30.621613;104.098348,30.621768;104.098272,30.621787;104.098167,30.621775;104.098131,30.621772;104.098104,30.621770;104.098070,30.621800;104.098158,30.622141;104.098224,30.622338;104.098264,30.622457;104.098278,30.622479;104.098288,30.622 [...]
-
-{ROAD_LINE: "104.101388,30.617850;104.100157,30.617820;104.098773,30.617732;104.098439,30.620074;104.098272,30.621598;104.098215,30.622742;104.097194,30.623631;104.096527,30.624219;104.096157,30.624607;104.094126,30.625682;104.094087,30.626007;104.094362,30.627994;104.094688,30.629104;104.094846,30.630089;104.093829,30.632796;104.093827,30.632845;104.093009,30.635563;104.092851,30.635981;104.092854,30.635981;104.092339,30.637139;104.090254,30.639831;104.088704,30.641445;104.086367,30.642 [...]
-
-{ROAD_LINE: "104.101218,30.617817;104.099460,30.617609;104.098937,30.617664;104.098823,30.617794;104.098439,30.620313;104.098359,30.621041;104.098322,30.621354;104.098315,30.622049;104.098390,30.622287;104.098281,30.622501;104.098276,30.622507;104.098013,30.622799;104.098013,30.622812;104.097960,30.622976;104.097894,30.623049;104.096419,30.624401;104.094861,30.625083;104.094060,30.625658;104.094096,30.625817;104.094090,30.625972;104.094124,30.626152;104.094137,30.626208;104.094159,30.626 [...]
-
-{ROAD_LINE: "104.101358,30.617727;104.100877,30.617624;104.100147,30.617567;104.099190,30.617617;104.098846,30.618154;104.098715,30.618857;104.098651,30.619091;104.098557,30.619603;104.098487,30.620276;104.098385,30.621000;104.098297,30.621776;104.098124,30.622641;104.097605,30.623269;104.096953,30.623872;104.096335,30.624479;104.096119,30.624632;104.095706,30.624873;104.095011,30.625270;104.094366,30.625612;104.094229,30.626101;104.094210,30.626658;104.094297,30.627361;104.094443,30.627 [...]
-
-{ROAD_LINE: "104.102136,30.618009;104.101059,30.617847;104.100499,30.617840;104.099802,30.617755;104.099337,30.617705;104.098938,30.617801;104.098724,30.618568;104.098659,30.619210;104.098633,30.619371;104.098562,30.619663;104.098452,30.620449;104.098346,30.621384;104.098317,30.622042;104.098047,30.622784;104.097735,30.623141;104.097659,30.623181;104.097594,30.623199;104.097638,30.623243;104.097649,30.623270;104.097646,30.623299;104.097692,30.623309;104.097702,30.623314;104.097696,30.623 [...]
-
-{ROAD_LINE: "104.102292,30.618081;104.102231,30.618321;104.102185,30.618561;104.102175,30.618899;104.102189,30.619321;104.102500,30.620162;104.103378,30.621288;104.104306,30.622307;104.104643,30.622676;104.104657,30.622715;104.104661,30.622727;104.104655,30.622735;104.104637,30.622743;104.104618,30.622750;104.104774,30.622983;104.104306,30.623570;104.103523,30.624071;104.103254,30.624244;104.103253,30.624243;104.103251,30.624242;104.103123,30.624325;104.102623,30.624651;104.102130,30.624 [...]
-
-{ROAD_LINE: "104.101281,30.617789;104.100838,30.617735;104.100303,30.617706;104.099989,30.617654;104.099496,30.617629;104.099306,30.617618;104.099220,30.617605;104.099185,30.617595;104.099022,30.617592;104.098780,30.617557;104.098719,30.616940;104.098720,30.616253;104.098486,30.615949;104.098000,30.615875;104.097140,30.615578;104.096150,30.615138;104.095424,30.614829;104.094996,30.614638;104.094924,30.614613;104.094331,30.614331;104.093722,30.614145;104.093372,30.614438;104.092942,30.615 [...]
-
-{ROAD_LINE: "104.102200,30.617947;104.101644,30.617871;104.101353,30.617809;104.100991,30.617724;104.100758,30.617704;104.100359,30.617682;104.099827,30.617640;104.099555,30.617608;104.099478,30.617609;104.099427,30.617616;104.099409,30.617623;104.099407,30.617626;104.099390,30.617622;104.099251,30.617612;104.098845,30.617719;104.098673,30.618439;104.098536,30.619638;104.098479,30.620548;104.098443,30.620844;104.098426,30.621068;104.098404,30.621250;104.098386,30.621462;104.098385,30.621 [...]
-
-{ROAD_LINE: "104.102290,30.618735;104.102258,30.619241;104.102400,30.620030;104.103020,30.620801;104.103724,30.621584;104.104295,30.622187;104.104856,30.622796;104.104638,30.623288;104.103879,30.623809;104.103144,30.624307;104.102630,30.624646;104.101910,30.625138;104.100969,30.625779;104.100220,30.626278;104.100129,30.626317;104.100118,30.626313;104.100137,30.626329;104.100148,30.626341;104.100149,30.626341;104.100144,30.626335;104.100142,30.626332;104.100143,30.626334;104.100022,30.626 [...]
-
-{ROAD_LINE: "104.101691,30.617870;104.101109,30.617850;104.100291,30.617805;104.099563,30.617797;104.099063,30.617909;104.098804,30.618769;104.098659,30.619966;104.098497,30.621179;104.098371,30.622288;104.097899,30.623005;104.097690,30.623172;104.097678,30.623173;104.097655,30.623176;104.096871,30.623867;104.096469,30.624304;104.095886,30.624735;104.094882,30.625205;104.094305,30.625475;104.094124,30.625801;104.094252,30.626631;104.094383,30.627643;104.094690,30.628638;104.094743,30.628 [...]
-
-{ROAD_LINE: "104.102135,30.618528;104.102141,30.618073;104.101709,30.617886;104.101119,30.617714;104.100776,30.617661;104.100186,30.617592;104.099606,30.617550;104.099042,30.617713;104.098837,30.618622;104.098569,30.619881;104.098406,30.621264;104.098254,30.622465;104.097618,30.623278;104.097556,30.623324;104.097561,30.623319;104.097562,30.623321;104.097558,30.623320;104.097553,30.623318;104.097548,30.623315;104.097551,30.623318;104.097553,30.623325;104.097553,30.623332;104.097556,30.623 [...]
-
-{ROAD_LINE: "104.101675,30.617844;104.100821,30.617778;104.100421,30.617791;104.099878,30.617773;104.099314,30.617778;104.099057,30.618184;104.098854,30.619229;104.098607,30.620308;104.098396,30.621185;104.098264,30.621946;104.098116,30.622534;104.098086,30.622562;104.098108,30.622590;104.098106,30.622615;104.097917,30.622843;104.097628,30.623215;104.096959,30.623843;104.096597,30.624142;104.096500,30.624170;104.096299,30.624391;104.096047,30.624613;104.095551,30.624888;104.094901,30.625 [...]
-
-{ROAD_LINE: "104.101912,30.617898;104.101451,30.617837;104.101219,30.617807;104.100837,30.617798;104.100153,30.617757;104.099281,30.617817;104.099051,30.618460;104.098909,30.619124;104.098840,30.619114;104.098801,30.619160;104.098705,30.619665;104.098633,30.620395;104.098554,30.621134;104.098495,30.621535;104.098431,30.621991;104.098361,30.622463;104.098325,30.622542;104.098316,30.622554;104.098311,30.622554;104.098290,30.622543;104.098232,30.622602;104.098188,30.622651;104.098164,30.622 [...]
-
-{ROAD_LINE: "104.102187,30.618783;104.102035,30.619347;104.102020,30.619665;104.102272,30.620311;104.103329,30.621421;104.104052,30.622128;104.104408,30.622474;104.104414,30.622489;104.104545,30.622624;104.104738,30.623040;104.104623,30.623280;104.103872,30.623793;104.103364,30.624274;104.103824,30.625358;104.104120,30.626330;104.103391,30.626781;104.102921,30.627044;104.102535,30.627325;104.101957,30.627645;104.101293,30.628112;104.101106,30.628483;104.101640,30.629503;104.102443,30.630 [...]
-
-{ROAD_LINE: "104.102303,30.617970;104.102300,30.618052;104.102298,30.618109;104.102295,30.618174;104.102268,30.618525;104.102262,30.618662;104.102170,30.619573;104.102167,30.619879;104.102164,30.619979;104.104628,30.622723;104.104639,30.622748;104.104733,30.623058;104.104433,30.623433;104.101944,30.625098;104.098612,30.627220;104.096653,30.628499;104.096056,30.628896;104.094959,30.630078;104.093387,30.634351;104.092890,30.635899;104.092027,30.637579;104.088989,30.641097;104.088609,30.641 [...]
-
-{ROAD_LINE: "104.103277,30.618001;104.102477,30.618012;104.102085,30.617989;104.101760,30.617976;104.101353,30.618031;104.100640,30.617992;104.099965,30.617964;104.099216,30.617822;104.098872,30.618181;104.098706,30.619275;104.098551,30.620073;104.098430,30.620762;104.098349,30.621286;104.098344,30.621465;104.098297,30.621664;104.098243,30.622108;104.098149,30.622590;104.097861,30.622876;104.097886,30.622937;104.097791,30.623110;104.097622,30.623273;104.097042,30.623810;104.096407,30.624 [...]
-
-{ROAD_LINE: "104.103417,30.617986;104.103070,30.617885;104.102693,30.617914;104.102556,30.617871;104.102466,30.617903;104.102392,30.617920;104.102318,30.617905;104.102063,30.617846;104.101754,30.617791;104.101309,30.617742;104.100706,30.617639;104.100080,30.617532;104.099371,30.617692;104.099062,30.618156;104.098865,30.618771;104.098730,30.619441;104.098631,30.620135;104.098533,30.620851;104.098422,30.621511;104.098332,30.622082;104.098154,30.622698;104.097667,30.623158;104.096883,30.623 [...]
-
-{ROAD_LINE: "104.103586,30.617910;104.101557,30.617992;104.101328,30.617913;104.098813,30.617650;104.098691,30.617722;104.098560,30.618194;104.098150,30.622397;104.096612,30.624101;104.096147,30.624630;104.095931,30.624797;104.093904,30.625820;104.094022,30.626780;104.094418,30.627859;104.094529,30.628331;104.094694,30.628858;104.094699,30.628868;104.094808,30.629039;104.094786,30.629141;104.094782,30.629181;104.094919,30.629821;104.093509,30.633670;104.092548,30.636666;104.091181,30.638 [...]
-
-{ROAD_LINE: "104.102362,30.618215;104.101955,30.619873;104.101980,30.620371;104.104443,30.622546;104.104616,30.622703;104.104616,30.622701;104.104759,30.622981;104.104770,30.623098;104.104516,30.623400;104.103086,30.624342;104.101777,30.625263;104.100245,30.626315;104.100245,30.626318;104.100245,30.626320;104.100247,30.626323;104.100114,30.626406;104.097939,30.627708;104.097028,30.628289;104.097021,30.628288;104.095919,30.629027;104.094714,30.631136;104.093416,30.634155;104.092382,30.636 [...]
-
-{ROAD_LINE: "104.102356,30.617853;104.099801,30.617792;104.099141,30.617740;104.098790,30.617804;104.098468,30.619759;104.098465,30.619834;104.098178,30.622196;104.098178,30.622227;104.098183,30.622257;104.098105,30.622786;104.097835,30.623046;104.097397,30.623387;104.097352,30.623422;104.095969,30.624699;104.094107,30.625978;104.094632,30.628669;104.094708,30.628961;104.094878,30.629533;104.094901,30.629811;104.094899,30.629898;104.094896,30.629986;104.094898,30.630079;104.094898,30.630 [...]
-
-{ROAD_LINE: "104.103043,30.617879;104.103904,30.617714;104.104292,30.617503;104.104734,30.617184;104.105119,30.616947;104.105448,30.616906;104.105739,30.617175;104.106057,30.617460;104.106324,30.617704;104.106782,30.618203;104.107089,30.618659;104.107327,30.619254;104.106838,30.619695;104.106470,30.620045;104.106727,30.620349;104.107035,30.620629;104.107421,30.620931;104.107537,30.621267;104.107044,30.621809;104.107038,30.621808;104.106978,30.621865;104.106346,30.622259;104.105614,30.622 [...]
-
-{ROAD_LINE: "104.103575,30.617995;104.102358,30.617882;104.102195,30.618015;104.102238,30.618330;104.102268,30.618504;104.102257,30.618557;104.102190,30.619017;104.102202,30.619087;104.102202,30.619618;104.102290,30.619908;104.102288,30.619983;104.104416,30.622551;104.104540,30.622656;104.104496,30.622690;104.104648,30.623011;104.104676,30.623118;104.104408,30.623469;104.102350,30.624790;104.100670,30.625862;104.100660,30.625877;104.098503,30.627268;104.097026,30.628244;104.096587,30.628 [...]
-
-{ROAD_LINE: "104.103626,30.617936;104.102706,30.617940;104.102408,30.618006;104.102260,30.618267;104.102035,30.618925;104.101999,30.619356;104.102017,30.619583;104.102299,30.620268;104.103386,30.621384;104.104336,30.622288;104.104758,30.622719;104.104738,30.623260;104.103909,30.623804;104.103094,30.624459;104.102649,30.624720;104.102225,30.625006;104.101774,30.625317;104.101406,30.625588;104.101070,30.625799;104.100866,30.625845;104.100593,30.626007;104.100367,30.626154;104.100298,30.626 [...]
-
-{ROAD_LINE: "104.102350,30.618214;104.102204,30.618490;104.102046,30.619225;104.102291,30.620393;104.103264,30.621385;104.104246,30.622249;104.104670,30.622681;104.104667,30.622709;104.104665,30.622721;104.104673,30.622718;104.104662,30.622730;104.104646,30.622751;104.104644,30.622761;104.104666,30.622744;104.104789,30.622879;104.104447,30.623463;104.103512,30.624083;104.103153,30.624305;104.102670,30.624596;104.102336,30.624837;104.102176,30.624971;104.102056,30.625045;104.101971,30.625 [...]
-
-{ROAD_LINE: "104.103607,30.617960;104.102997,30.617948;104.102523,30.617941;104.102316,30.618002;104.102209,30.618367;104.102124,30.618879;104.102093,30.619360;104.102153,30.620026;104.102972,30.620949;104.103910,30.621967;104.104524,30.622592;104.104564,30.622660;104.104569,30.622671;104.104572,30.622688;104.104817,30.622979;104.104726,30.623271;104.103980,30.623752;104.103176,30.624274;104.103074,30.624331;104.102917,30.624432;104.102465,30.624738;104.102107,30.625098;104.101632,30.625 [...]
-
-{ROAD_LINE: "104.103528,30.617945;104.103363,30.617943;104.102266,30.617965;104.102260,30.617988;104.102247,30.618040;104.102233,30.618165;104.102228,30.618219;104.102172,30.618615;104.102172,30.618672;104.102157,30.618797;104.102150,30.618840;104.102070,30.619153;104.102078,30.619219;104.102064,30.619444;104.102064,30.619579;104.102015,30.619839;104.102002,30.619939;104.101995,30.620034;104.104321,30.622415;104.104795,30.623085;104.104623,30.623335;104.101460,30.625415;104.100370,30.626 [...]
-
-{ROAD_LINE: "104.102594,30.618031;104.102430,30.618420;104.102282,30.618836;104.102231,30.619797;104.102662,30.620537;104.103607,30.621573;104.104435,30.622437;104.104683,30.622703;104.104674,30.622717;104.104673,30.622724;104.104675,30.622732;104.104675,30.622741;104.104673,30.622741;104.104670,30.622742;104.104670,30.622741;104.104700,30.622773;104.104637,30.623304;104.099907,30.626299;104.099584,30.626586;104.098530,30.627251;104.096654,30.628466;104.096635,30.628504;104.096650,30.628 [...]
-
-{ROAD_LINE: "104.103384,30.617937;104.102745,30.617945;104.102472,30.617942;104.102400,30.617990;104.102349,30.618327;104.102242,30.618658;104.102118,30.619335;104.102298,30.620267;104.103147,30.621209;104.104065,30.622161;104.104673,30.622709;104.104821,30.623027;104.104060,30.623766;104.102913,30.624498;104.102621,30.624691;104.102606,30.624717;104.102148,30.625021;104.101349,30.625561;104.100950,30.625831;104.100839,30.625894;104.100418,30.626127;104.099804,30.626475;104.098769,30.627 [...]
-
-{ROAD_LINE: "104.102450,30.617910;104.102222,30.618258;104.102192,30.618327;104.102188,30.618659;104.102185,30.618739;104.102190,30.618775;104.102074,30.619383;104.104025,30.622154;104.104641,30.622713;104.104669,30.622728;104.104721,30.622795;104.104798,30.622981;104.104796,30.623048;104.104546,30.623378;104.103730,30.623916;104.102815,30.624516;104.102616,30.624642;104.102540,30.624699;104.102465,30.624736;104.102352,30.624800;104.101912,30.625132;104.100944,30.625782;104.100880,30.625 [...]
-
-{ROAD_LINE: "104.104513,30.617363;104.104518,30.617385;104.104398,30.617462;104.102677,30.617919;104.101558,30.617879;104.099855,30.617607;104.098852,30.617604;104.098539,30.620013;104.098443,30.621109;104.098364,30.621699;104.098344,30.621859;104.098370,30.622132;104.098360,30.622182;104.098346,30.622301;104.098345,30.622342;104.098166,30.622726;104.098081,30.622852;104.097922,30.622719;104.097487,30.623122;104.097304,30.623329;104.095436,30.625007;104.094187,30.625808;104.094336,30.627 [...]
-
-{ROAD_LINE: "104.104311,30.617496;104.104036,30.617663;104.103729,30.617769;104.103142,30.617864;104.102629,30.617985;104.102468,30.617995;104.102314,30.617996;104.102290,30.618100;104.102270,30.618130;104.102225,30.618175;104.102202,30.618281;104.102133,30.618454;104.102140,30.618704;104.102197,30.618918;104.102116,30.619401;104.102129,30.619918;104.102683,30.620593;104.103288,30.621326;104.103932,30.622024;104.104263,30.622373;104.104564,30.622689;104.104583,30.622749;104.104811,30.623 [...]
-
-{ROAD_LINE: "104.104447,30.617273;104.104213,30.617490;104.103689,30.617719;104.103175,30.617724;104.102690,30.617880;104.102292,30.617809;104.101666,30.617657;104.101213,30.617650;104.100968,30.617634;104.100819,30.617666;104.100725,30.617690;104.100677,30.617645;104.100618,30.617622;104.100334,30.617620;104.099982,30.617515;104.099634,30.617506;104.099430,30.617586;104.099021,30.617832;104.098765,30.618670;104.098603,30.619764;104.098454,30.621007;104.098327,30.621833;104.098309,30.621 [...]
-
-{ROAD_LINE: "104.104570,30.617366;104.104353,30.617468;104.104319,30.617456;104.104262,30.617439;104.104255,30.617437;104.104034,30.617645;104.103677,30.617882;104.103171,30.617991;104.102717,30.618044;104.102433,30.618052;104.101773,30.618128;104.101029,30.618117;104.100736,30.618009;104.100513,30.618007;104.100027,30.617928;104.099533,30.617871;104.099074,30.617828;104.098944,30.617890;104.098759,30.618611;104.098582,30.619669;104.098501,30.620549;104.098395,30.620775;104.098387,30.620 [...]
-
-{ROAD_LINE: "104.104206,30.616803;104.102956,30.617934;104.102388,30.617906;104.101978,30.617881;104.101554,30.617836;104.100972,30.617750;104.099966,30.617693;104.099340,30.617692;104.098943,30.617708;104.098797,30.618350;104.098685,30.618850;104.098655,30.618863;104.098648,30.618867;104.098645,30.618868;104.098624,30.618872;104.098614,30.618869;104.098585,30.619126;104.098518,30.619730;104.098467,30.620285;104.098409,30.620892;104.098393,30.621183;104.098440,30.621206;104.098479,30.621 [...]
-
-{ROAD_LINE: "104.103999,30.616523;104.104245,30.616814;104.104490,30.617101;104.104323,30.617438;104.103928,30.617701;104.103351,30.617920;104.102549,30.617953;104.102335,30.618095;104.102284,30.618421;104.102257,30.618477;104.102227,30.618643;104.102162,30.619218;104.102141,30.619771;104.102555,30.620507;104.103430,30.621502;104.104126,30.622221;104.104662,30.622759;104.104664,30.622765;104.104662,30.622768;104.104649,30.622772;104.104651,30.622773;104.104655,30.622785;104.104652,30.622 [...]
-
-{ROAD_LINE: "104.105405,30.616825;104.104796,30.617120;104.103739,30.617859;104.102953,30.617912;104.102033,30.617907;104.100140,30.617763;104.098690,30.617939;104.098337,30.621363;104.098342,30.621914;104.098298,30.622289;104.097774,30.623171;104.097369,30.623512;104.095902,30.624763;104.095399,30.624992;104.094292,30.625380;104.094082,30.625718;104.094106,30.626013;104.094112,30.626067;104.094481,30.628081;104.094861,30.629489;104.094899,30.630049;104.094896,30.630126;104.094129,30.632 [...]
-
-{ROAD_LINE: "104.105433,30.616817;104.105328,30.616845;104.104069,30.617678;104.103337,30.617970;104.102282,30.617990;104.102317,30.618322;104.102257,30.618755;104.102255,30.618819;104.102173,30.619110;104.102153,30.619219;104.102055,30.619968;104.104655,30.622816;104.104718,30.623131;104.104600,30.623336;104.102738,30.624547;104.101464,30.625415;104.100455,30.626032;104.100050,30.626337;104.099860,30.626547;104.099867,30.626607;104.100438,30.627537;104.100693,30.627720;104.101753,30.629 [...]
-
-{ROAD_LINE: "104.105989,30.617285;104.105420,30.616810;104.105225,30.616904;104.105091,30.617010;104.103841,30.617842;104.103293,30.617958;104.102253,30.617943;104.102236,30.618040;104.102250,30.618112;104.102203,30.618672;104.102198,30.618710;104.102198,30.618752;104.102193,30.618797;104.102158,30.619095;104.102133,30.619388;104.102119,30.619538;104.102117,30.619581;104.102078,30.619719;104.102070,30.619834;104.102065,30.619991;104.104536,30.622595;104.104833,30.623069;104.104678,30.623 [...]
-
-{ROAD_LINE: "104.106015,30.617514;104.105658,30.617052;104.105513,30.617022;104.105074,30.617170;104.104753,30.617128;104.104266,30.616588;104.103833,30.616421;104.102845,30.616264;104.102578,30.616260;104.101769,30.616122;104.101243,30.616142;104.100564,30.616077;104.099640,30.616004;104.099020,30.616038;104.098920,30.617011;104.098879,30.617225;104.098857,30.617242;104.098846,30.617457;104.098766,30.618266;104.098646,30.619583;104.098529,30.620842;104.098409,30.622008;104.098177,30.622 [...]
-
-{ROAD_LINE: "104.104380,30.617535;104.103578,30.617735;104.102880,30.617689;104.102662,30.617744;104.102598,30.617878;104.102580,30.618191;104.102493,30.618519;104.102364,30.618994;104.102327,30.619504;104.102756,30.620566;104.103455,30.621340;104.104089,30.622094;104.104690,30.622687;104.104676,30.622716;104.104665,30.622739;104.104655,30.622758;104.104650,30.622778;104.104642,30.622791;104.104633,30.622810;104.104628,30.622820;104.104625,30.622820;104.104620,30.622817;104.104618,30.622 [...]
-
-{ROAD_LINE: "104.104147,30.617671;104.103468,30.617981;104.102566,30.617906;104.101813,30.617916;104.100959,30.617869;104.099607,30.617674;104.099263,30.617680;104.098943,30.618092;104.098829,30.618747;104.098773,30.619051;104.098730,30.619070;104.098682,30.619090;104.098677,30.619094;104.098687,30.619092;104.098695,30.619090;104.098647,30.619293;104.098565,30.619941;104.098521,30.620557;104.098441,30.621236;104.098350,30.621721;104.098288,30.622398;104.097979,30.622933;104.097524,30.623 [...]
-}
-
-
-var taxiRoutes = [];
-var data = szRoad.data;
-var hStep = 300 / (data.length - 1);
-
-var i = 0;
-for (var x in data) {
-    // i++;
-    // if(i<5000)
-    //     continue;
-    var line = data[x];
-    // if(busLines.length>500)
-    //     break;
-    var pointString = line.ROAD_LINE;
-    var pointArr = pointString.split(';');
-    var lnglats = [];
-    for (var j in pointArr) {
-        lnglats.push(pointArr[j].split(','))
-    }
-    taxiRoutes.push({
-        coords: lnglats,
-        lineStyle: {
-            // color: echarts.color.modifyHSL('#5A94DF', Math.round(hStep * x))
-        }
-    })
-}
-
-option = {
-    mapbox: {
-        center: [104.091, 30.639],
-        zoom: 13,
-        // pitch: 50,
-        // bearing: -10,
-        altitudeScale: 2,
-        style: 'mapbox://styles/mapbox/dark-v9',
-        postEffect: {
-            enable: true,
-            FXAA: {
-                enable: true
-            }
-        },
-        light: {
-            main: {
-                intensity: 1,
-                shadow: true,
-                shadowQuality: 'high'
-            },
-            ambient: {
-                intensity: 0.
-            },
-            ambientCubemap: {
-                texture: ROOT_PATH + '/data-gl/asset/pisa.hdr',
-                exposure: 1,
-                diffuseIntensity: 0.5,
-                specularIntensity: 2
-            }
-        }
-    },
-    series: [{
-        type: 'lines3D',
-
-        coordinateSystem: 'mapbox',
-
-        effect: {
-            show: true,
-            constantSpeed: 5,
-            trailWidth: 2,
-            trailLength: 0.4,
-            trailOpacity: 1,
-            spotIntensity: 10
-        },
-
-        blendMode: 'lighter',
-
-        polyline: true,
-
-        lineStyle: {
-            width: 0.1,
-            color: 'rgb(200, 40, 0)',
-            opacity: 0.
-        },
-
-        data: {
-            count: function () {
-                return taxiRoutes.length;
-            },
-            getItem: function (idx) {
-                return taxiRoutes[idx]
-            }
-        }
-    }]
-}
\ No newline at end of file
diff --git a/public/data-gl/lines3d-taxi-routes-of-cape-town.js b/public/data-gl/lines3d-taxi-routes-of-cape-town.js
deleted file mode 100644
index 794d059..0000000
--- a/public/data-gl/lines3d-taxi-routes-of-cape-town.js
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
-title: Taxi routes of Cape Town
-category: lines3D
-titleCN: Taxi routes of Cape Town
-*/
-
-mapboxgl.accessToken = mapboxglToken;
-
-var ENCODE_SCALE = 1e6;
-function decodeLine(line) {
-
-    var result = [];
-    var prevX = line[0];
-    var prevY = line[1];
-
-    for (var i = 0; i < line[2].length; i += 2) {
-        var x = line[2].charCodeAt(i) - 64;
-        var y = line[2].charCodeAt(i + 1) - 64;
-        // ZigZag decoding
-        x = (x >> 1) ^ (-(x & 1));
-        y = (y >> 1) ^ (-(y & 1));
-        // Delta deocding
-        x += prevX;
-        y += prevY;
-
-        prevX = x;
-        prevY = y;
-        // Dequantize
-        result.push([x / ENCODE_SCALE, y / ENCODE_SCALE, 10]);
-    }
-
-    return result;
-}
-
-var geoJSON = {
-    features: []
-};
-var regions = [];
-var readShp = new Promise(function (resolve, reject) {
-    shapefile.open(ROOT_PATH + '/asset/get/s/data-1498751177695-rkzAeiGEb.shp', ROOT_PATH + '/asset/get/s/data-1498751184605-rJYAxjMVW.dbf')
-        .then(source => source.read()
-            .then(function append(result) {
-                if (result.done) {
-                    resolve();
-                    return;
-                }
-                var feature = result.value;
-                feature.properties.name = geoJSON.features.length + '';
-                regions.push({
-                    name: geoJSON.features.length + '',
-                    value: 1,
-                    height: feature.properties.SHAPE_leng * 10000
-                })
-                geoJSON.features.push(feature);
-                return source.read().then(append);
-            })
-        );
-});
-
-myChart.showLoading();
-
-Promise.all([$.getJSON(ROOT_PATH + '/asset/get/s/data-1498751206824-HkkgZsfEW.json'), readShp])
-    .then(function ([data, lastFeature]) {
-
-        var lines = data.map(function (track) {
-            return {
-                coords: decodeLine(track)
-            };
-        });
-
-        myChart.hideLoading();
-
-        echarts.registerMap('buildings', geoJSON);
-
-        myChart.setOption({
-            mapbox: {
-                center: [18.424552361777955, -33.92188144682616],
-                zoom: 14,
-                pitch: 50,
-                bearing: -10,
-                altitudeScale: 2,
-                style: 'mapbox://styles/mapbox/dark-v9',
-                postEffect: {
-                    enable: true,
-                    screenSpaceAmbientOcclusion: {
-                        enable: true,
-                        intensity: 1.2,
-                        radius: 6,
-                        quality: 'high'
-                    },
-                    screenSpaceReflection: {
-                        enable: true
-                    }
-                },
-                light: {
-                    main: {
-                        intensity: 1,
-                        shadow: true,
-                        shadowQuality: 'high'
-                    },
-                    ambient: {
-                        intensity: 0.
-                    },
-                    ambientCubemap: {
-                        texture: ROOT_PATH + '/data-gl/asset/pisa.hdr',
-                        exposure: 1,
-                        diffuseIntensity: 0.5,
-                        specularIntensity: 2
-                    }
-                }
-            },
-            series: [{
-                type: 'lines3D',
-
-                coordinateSystem: 'mapbox',
-
-                effect: {
-                    show: true,
-                    constantSpeed: 5,
-                    trailWidth: 2,
-                    trailLength: 0.8,
-                    trailOpacity: 1,
-                    spotIntensity: 10
-                },
-
-                blendMode: 'lighter',
-
-                polyline: true,
-
-                lineStyle: {
-                    width: 0.1,
-                    color: 'rgb(200, 40, 0)',
-                    opacity: 0.
-                },
-
-                data: {
-                    count: function () {
-                        return lines.length;
-                    },
-                    getItem: function (idx) {
-                        return lines[idx]
-                    }
-                }
-            }, {
-                type: 'map3D',
-                map: 'buildings',
-
-                coordinateSystem: 'mapbox',
-                shading: 'realistic',
-                silent: true,
-
-                instancing: true,
-
-                data: regions,
-
-                realisticMaterial: {
-                    metalness: 1,
-                    roughness: 0.2,
-                }
-            }]
-        });
-    });
-
-window.addEventListener('keydown', function () {
-    myChart.dispatchAction({
-        type: 'lines3DToggleEffect',
-        seriesIndex: 0
-    });
-});
\ No newline at end of file
diff --git a/public/data-gl/linesGL-ny.js b/public/data-gl/linesGL-ny.js
deleted file mode 100644
index 01165a1..0000000
--- a/public/data-gl/linesGL-ny.js
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
-title: Use linesGL to draw 1 million ny streets.
-titleCN: 实时交互的纽约街道可视化
-category: linesGL
-*/
-
-
-var CHUNK_COUNT = 32;
-
-var dataCount = 0;
-
-function fetchData(idx) {
-    if (idx >= CHUNK_COUNT) {
-        return;
-    }
-    var dataURL = ROOT_PATH + '/data/asset/data/links-ny/links_ny_' + idx + '.bin';
-    var xhr = new XMLHttpRequest();
-    xhr.open('GET', dataURL, true);
-    xhr.responseType = 'arraybuffer';
-
-    xhr.onload = function (e) {
-        var rawData = new Float32Array(this.response);
-        var data = new Float64Array(rawData.length - 2);
-        var offsetX = rawData[0];
-        var offsetY = rawData[1];
-        var off = 0;
-        var addedDataCount = 0;
-        for (var i = 2; i < rawData.length;) {
-            var count = rawData[i++];
-            data[off++] = count;
-            for (var k = 0; k < count; k++) {
-                var x = rawData[i++] + offsetX;
-                var y = rawData[i++] + offsetY;
-                data[off++] = x;
-                data[off++] = y;
-
-                addedDataCount++;
-            }
-        }
-
-        myChart.appendData({
-            seriesIndex: 0,
-            data: data
-        });
-
-        dataCount += addedDataCount;
-
-        fetchData(idx + 1);
-    }
-
-    xhr.send();
-}
-
-option = {
-    progressive: 20000,
-    backgroundColor: '#111',
-    geo: {
-        center: [-74.04327099998152, 40.86737600240287],
-        zoom: 360,
-        map: 'world',
-        roam: true,
-        silent: true,
-        itemStyle: {
-            normal: {
-                color: 'transparent',
-                borderColor: 'rgba(255,255,255,0.1)',
-                borderWidth: 1
-            }
-        }
-    },
-    series: [{
-        type: 'linesGL',
-
-        coordinateSystem: 'geo',
-
-        blendMode: 'lighter',
-
-        dimensions: ['value'],
-
-        data: new Float64Array(),
-        polyline: true,
-        large: true,
-
-        lineStyle: {
-            color: 'orange',
-            opacity: 0.3
-        }
-    }]
-}
-
-fetchData(0);
\ No newline at end of file
diff --git a/public/data-gl/map3d-alcohol-consumption.js b/public/data-gl/map3d-alcohol-consumption.js
deleted file mode 100644
index abaaf8a..0000000
--- a/public/data-gl/map3d-alcohol-consumption.js
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
-title: Map3D - Alcohol Consumption
-category: map3D
-titleCN: Map3D - Alcohol Consumption
-*/
-
-$.getJSON(ROOT_PATH + '/data-gl/asset/data/alcohol.json', function (data) {
-    var regionData = data.map(function (item) {
-        return {
-            name: item[0],
-            value: item[1]
-        }
-    })
-    console.log(regionData);
-
-    myChart.setOption({
-        backgroundColor: '#cdcfd5',
-        visualMap: {
-            min: 0,
-            max: 15,
-            realtime: true,
-            calculable : true,
-            inRange: {
-                color: ['#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf', '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026']
-            }
-        },
-        series: [{
-            type: 'map3D',
-            map: 'world',
-            shading: 'lambert',
-            realisticMaterial: {
-                roughness: 0.2,
-                metalness: 0
-            },
-            postEffect: {
-                enable: true,
-                SSAO: {
-                    enable: true,
-                    radius: 2,
-                    intensity: 1
-                }
-            },
-            groundPlane: {
-                show: true
-            },
-            light: {
-                main: {
-                    intensity: 2,
-                    shadow: true,
-                    shadowQuality: 'high',
-                    alpha: 30
-                },
-                ambient: {
-                    intensity: 0
-                },
-                ambientCubemap: {
-                    texture: ROOT_PATH + '/data-gl/asset/canyon.hdr',
-                    exposure: 1,
-                    diffuseIntensity: 1
-                }
-            },
-            viewControl: {
-                distance: 50
-            },
-
-
-            regionHeight: 1,
-
-            data: regionData
-        }]
-    });
-})
\ No newline at end of file
diff --git a/public/data-gl/map3d-buildings-on-mapbox.js b/public/data-gl/map3d-buildings-on-mapbox.js
deleted file mode 100644
index a678ae9..0000000
--- a/public/data-gl/map3d-buildings-on-mapbox.js
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
-title: Buildings on Mapbox
-category: map3D
-titleCN: Buildings on Mapbox
-*/
-
-mapboxgl.accessToken = mapboxglToken;
-
-
-$.getJSON(ROOT_PATH + '/data-gl/asset/data/buildings.json', function (buildingsGeoJSON) {
-
-    echarts.registerMap('buildings', buildingsGeoJSON);
-
-    var regionsData = buildingsGeoJSON.features.map(function (feature) {
-        return {
-            name: feature.properties.name,
-            value: Math.random(),
-            height: +feature.properties.height * 10
-        };
-    });
-
-    myChart.setOption({
-        mapbox: {
-            center: [13.409779, 52.520645],
-            zoom: 13,
-            pitch: 50,
-            bearing: -10,
-            style: 'mapbox://styles/mapbox/dark-v9',
-            postEffect: {
-                enable: true,
-                SSAO: {
-                    enable: true,
-                    intensity: 1.2,
-                    radius: 10
-                },
-                screenSpaceReflection: {
-                    enable:true
-                }
-            },
-            light: {
-                main: {
-                    intensity: 1,
-                    shadow: false,
-                    shadowQuality: 'high'
-                },
-                ambient: {
-                    intensity: 0.
-                },
-                ambientCubemap: {
-                    texture: ROOT_PATH + '/data-gl/asset/pisa.hdr',
-                    exposure: 1,
-                    diffuseIntensity: 0.5,
-                    specularIntensity: 2
-                }
-            }
-        },
-        series: [{
-            type: 'map3D',
-            coordinateSystem: 'mapbox',
-            map: 'buildings',
-            data: regionsData,
-            shading: 'realistic',
-            instancing: true,
-            silent: true,
-            itemStyle: {
-                borderColor: [0, 2, 10],
-                borderWidth: 1
-            },
-            realisticMaterial: {
-                metalness: 1,
-                roughness: 0.4
-            }
-        }]
-    });
-
-
-});
\ No newline at end of file
diff --git a/public/data-gl/map3d-buildings.js b/public/data-gl/map3d-buildings.js
deleted file mode 100644
index 54b74dd..0000000
--- a/public/data-gl/map3d-buildings.js
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
-title: Buildings
-category: map3D
-titleCN: Buildings
-*/
-
-
-$.getJSON(ROOT_PATH + '/data-gl/asset/data/buildings.json', function (buildingsGeoJSON) {
-
-    echarts.registerMap('buildings', buildingsGeoJSON);
-
-    var regions = buildingsGeoJSON.features.map(function (feature) {
-        return {
-            name: feature.properties.name,
-            value: Math.random(),
-            height: feature.properties.height / 10
-        };
-    });
-
-
-    myChart.setOption({
-        visualMap: {
-            show: false,
-            min: 0.4,
-            max: 1,
-            inRange: {
-                color: ['#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf', '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026']
-            }
-        },
-        series: [{
-            type: 'map3D',
-            map: 'buildings',
-            shading: 'realistic',
-            environment: '#000',
-            realisticMaterial: {
-                roughness: 0.6,
-                textureTiling: 20
-            },
-            postEffect: {
-                enable: true,
-                SSAO: {
-                    enable: true,
-                    intensity: 1.3,
-                    radius: 5
-                },
-                screenSpaceReflection: {
-                    enable:false
-                },
-                depthOfField: {
-                    enable: true,
-                    blurRadius: 4,
-                    focalDistance: 30
-                }
-            },
-            light: {
-                main: {
-                    intensity: 3,
-                    alpha: 40,
-                    shadow: true,
-                    shadowQuality: 'high'
-                },
-                ambient: {
-                    intensity: 0.
-                },
-                ambientCubemap: {
-                    texture: ROOT_PATH + '/data-gl/asset/pisa.hdr',
-                    exposure: 1,
-                    diffuseIntensity: 0.5,
-                    specularIntensity: 1
-                }
-            },
-            groundPlane: {
-                show: false,
-                color: '#333'
-            },
-            viewControl: {
-                minBeta: -360,
-                maxBeta: 360,
-                alpha: 50,
-                center: [50, 0, -10],
-                distance: 30,
-                minDistance: 5,
-
-                panMouseButton: 'left',
-                rotateMouseButton: 'middle',
-                zoomSensitivity: 0.5
-            },
-
-            itemStyle: {
-                areaColor: '#666'
-                // borderColor: '#222',
-                // borderWidth: 1
-            },
-
-            label: {
-                color: 'white'
-            },
-
-            silent: true,
-
-            instancing: true,
-
-            boxWidth: 200,
-            boxHeight: 1,
-
-            data: regions
-        }]
-    });
-
-});
\ No newline at end of file
diff --git a/public/data-gl/map3d-colorful-cities.js b/public/data-gl/map3d-colorful-cities.js
deleted file mode 100644
index c436f41..0000000
--- a/public/data-gl/map3d-colorful-cities.js
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
-title: 五彩的城市建筑
-category: map3D
-titleCN: 五彩的城市建筑
-*/
-
-mapboxgl.accessToken = 'pk.eyJ1IjoicGlzc2FuZyIsImEiOiJjaXBnaGYxcW8wMDFodWNtNDc4NzdqMWR2In0.4XUWeduDltiCbsIiS-U8Lg';
-
-myChart.showLoading();
-
-$.getJSON(ROOT_PATH + '/data-gl/asset/data/buildings.json', function (buildingsGeoJSON) {
-
-    echarts.registerMap('buildings', buildingsGeoJSON);
-
-    myChart.hideLoading();
-
-    var regionsData = buildingsGeoJSON.features.map(function (feature) {
-        return {
-            name: feature.properties.name,
-            value: Math.random(),
-            height: +feature.properties.height * 10
-        };
-    });
-
-    myChart.setOption({
-        visualMap: {
-            show: false,
-            min: 0.4,
-            max: 1,
-            inRange: {
-                color: ['#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf', '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026']
-            }
-        },
-        mapbox: {
-            center: [13.409779, 52.520645],
-            zoom: 13,
-            pitch: 50,
-            bearing: -10,
-            style: 'mapbox://styles/mapbox/dark-v9',
-            postEffect: {
-                enable: true,
-                SSAO: {
-                    enable: true,
-                    intensity: 1.3,
-                    radius: 5
-                },
-                screenSpaceReflection: {
-                    enable:false
-                },
-                depthOfField: {
-                    enable: true,
-                    blurRadius: 4,
-                    focalDistance: 90
-                }
-            },
-            light: {
-                main: {
-                    intensity: 3,
-                    alpha: -40,
-                    shadow: true,
-                    shadowQuality: 'high'
-                },
-                ambient: {
-                    intensity: 0.
-                },
-                ambientCubemap: {
-                    texture: ROOT_PATH + '/data-gl/asset/pisa.hdr',
-                    exposure: 1,
-                    diffuseIntensity: 0.5,
-                    specularIntensity: 1
-                }
-            }
-        },
-        series: [{
-            type: 'map3D',
-            coordinateSystem: 'mapbox',
-            map: 'buildings',
-            data: regionsData,
-            shading: 'realistic',
-            instancing: true,
-            silent: true,
-            itemStyle: {
-                areaColor: '#fff'
-            },
-            realisticMaterial: {
-                metalness: 0,
-                roughness: 0.0
-            }
-        }]
-    });
-
-
-});
\ No newline at end of file
diff --git a/public/data-gl/map3d-plastic-material-style-buildings-on-mapbox.js b/public/data-gl/map3d-plastic-material-style-buildings-on-mapbox.js
deleted file mode 100644
index 64bfb9b..0000000
--- a/public/data-gl/map3d-plastic-material-style-buildings-on-mapbox.js
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
-title: Plastic material style buildings on Mapbox
-category: map3D
-titleCN: Plastic material style buildings on Mapbox
-*/
-
-mapboxgl.accessToken = 'pk.eyJ1IjoicGlzc2FuZyIsImEiOiJjaXBnaGYxcW8wMDFodWNtNDc4NzdqMWR2In0.4XUWeduDltiCbsIiS-U8Lg';
-
-myChart.showLoading();
-
-$.getJSON(ROOT_PATH + '/data-gl/asset/data/buildings.json', function (buildingsGeoJSON) {
-
-    echarts.registerMap('buildings', buildingsGeoJSON);
-
-    myChart.hideLoading();
-
-    var regionsData = buildingsGeoJSON.features.map(function (feature) {
-        return {
-            name: feature.properties.name,
-            value: Math.random(),
-            height: +feature.properties.height * 10
-        };
-    });
-
-    myChart.setOption({
-        mapbox: {
-            center: [13.409779, 52.520645],
-            zoom: 13,
-            pitch: 50,
-            bearing: -10,
-            style: 'mapbox://styles/mapbox/dark-v9',
-            postEffect: {
-                enable: true,
-                SSAO: {
-                    enable: true,
-                    intensity: 1.3,
-                    radius: 5
-                },
-                screenSpaceReflection: {
-                    enable:false
-                },
-                depthOfField: {
-                    enable: true,
-                    blurRadius: 4,
-                    focalDistance: 90
-                }
-            },
-            light: {
-                main: {
-                    intensity: 2,
-                    alpha: -40,
-                    shadow: true,
-                    shadowQuality: 'high'
-                },
-                ambient: {
-                    intensity: 0.
-                },
-                ambientCubemap: {
-                    texture: ROOT_PATH + '/data-gl/asset/pisa.hdr',
-                    exposure: 1,
-                    diffuseIntensity: 0.5,
-                    specularIntensity: 1
-                }
-            }
-        },
-        series: [{
-            type: 'map3D',
-            coordinateSystem: 'mapbox',
-            map: 'buildings',
-            data: regionsData,
-            shading: 'realistic',
-            instancing: true,
-            silent: true,
-            itemStyle: {
-                areaColor: '#fff'
-            },
-            realisticMaterial: {
-                metalness: 0,
-                roughness: 0.0
-            }
-        }]
-    });
-
-
-});
\ No newline at end of file
diff --git a/public/data-gl/map3d-wood-city.js b/public/data-gl/map3d-wood-city.js
deleted file mode 100644
index 6b89e7f..0000000
--- a/public/data-gl/map3d-wood-city.js
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
-title: Wood City
-category: map3D
-titleCN: Wood City
-*/
-
-
-$.getJSON(ROOT_PATH + '/data-gl/asset/data/buildings.json', function (buildingsGeoJSON) {
-
-    echarts.registerMap('buildings', buildingsGeoJSON);
-
-    var regions = buildingsGeoJSON.features.map(function (feature) {
-        return {
-            name: feature.properties.name,
-            value: Math.max(Math.sqrt(feature.properties.height), 0.1),
-            height: Math.max(Math.sqrt(feature.properties.height), 0.1)
-        };
-    });
-
-
-    myChart.setOption({
-        series: [{
-            type: 'map3D',
-            map: 'buildings',
-            shading: 'realistic',
-            realisticMaterial: {
-                roughness: 0.6,
-                textureTiling: 20,
-                detailTexture: ROOT_PATH + '/data-gl/asset/woods.jpg'
-            },
-            postEffect: {
-                enable: true,
-                bloom: {
-                    enable: false
-                },
-                SSAO: {
-                    enable: true,
-                    quality: 'medium',
-                    radius: 10,
-                    intensity: 1.2
-                },
-                depthOfField: {
-                    enable: false,
-                    focalRange: 5,
-                    fstop: 1,
-                    blurRadius: 6
-                }
-            },
-            groundPlane: {
-                show: true,
-                color: '#333'
-            },
-            light: {
-                main: {
-                    intensity: 6,
-                    shadow: true,
-                    shadowQuality: 'high',
-                    alpha: 30
-                },
-                ambient: {
-                    intensity: 0
-                },
-                ambientCubemap: {
-                    texture: ROOT_PATH + '/data-gl/asset/canyon.hdr',
-                    exposure: 2,
-                    diffuseIntensity: 1,
-                    specularIntensity: 1
-                }
-            },
-            viewControl: {
-                minBeta: -360,
-                maxBeta: 360
-            },
-
-            itemStyle: {
-                areaColor: '#666'
-            },
-
-            label: {
-                color: 'white'
-            },
-
-            silent: true,
-
-            instancing: true,
-
-            boxWidth: 200,
-            boxHeight: 1,
-
-            data: regions
-        }]
-    });
-
-});
\ No newline at end of file
diff --git a/public/data-gl/map3d-wood-map-on-mapbox.js b/public/data-gl/map3d-wood-map-on-mapbox.js
deleted file mode 100644
index b6a3582..0000000
--- a/public/data-gl/map3d-wood-map-on-mapbox.js
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
-title: 木质地图 on mapbox
-category: map3D
-titleCN: 木质地图 on mapbox
-*/
-
-mapboxgl.accessToken = mapboxglToken;
-
-$.getJSON(ROOT_PATH + '/data-gl/asset/data/alcohol.json', function (data) {
-    var regionData = data.map(function (item) {
-        return {
-            name: item[0],
-            height: item[1] + 1
-        }
-    })
-    option = {
-        mapbox: {
-            zoom: 2,
-            center: [0, 0],
-            style: 'mapbox://styles/mapbox/light-v9',
-            postEffect: {
-                enable: true,
-                SSAO: {
-                    enable: true,
-                    radius: 5,
-                    intensity: 1.5,
-                    quality: 'high'
-                }
-            },
-            altitudeScale: 1e5,
-            light: {
-                main: {
-                    intensity: 2,
-                    shadow: true,
-                    shadowQuality: 'high'
-                },
-                ambient: {
-                    intensity: 0
-                },
-                ambientCubemap: {
-                    diffuseIntensity: 1,
-                    specularIntensity: 1,
-                    exposure: 2,
-                    texture: ROOT_PATH + '/data-gl/asset/canyon.hdr'
-                }
-            }
-        },
-        series: [{
-            type: 'map3D',
-            map: 'world',
-            coordinateSystem: 'mapbox',
-            shading: 'realistic',
-            silent: true,
-            itemStyle: {
-                areaColor: '#fff'
-            },
-            realisticMaterial: {
-                roughness: ROOT_PATH + "/asset/get/s/data-1497191796671-B16_H05G-.png",
-                normalTexture: ROOT_PATH + "/asset/get/s/data-1497191771850-rJ4DrAqf-.jpg",
-                detailTexture: ROOT_PATH + "/asset/get/s/data-1497191756633-SJr8HRqzW.jpg",
-                textureTiling: [4, 4]
-            },
-            data: regionData
-        }]
-    };
-
-    myChart.setOption(option);
-});
\ No newline at end of file
diff --git a/public/data-gl/map3d-wood-map.js b/public/data-gl/map3d-wood-map.js
deleted file mode 100644
index 2648061..0000000
--- a/public/data-gl/map3d-wood-map.js
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
-title: 木质世界地图
-category: map3D
-titleCN: 木质世界地图
-*/
-
-$.getJSON(ROOT_PATH + '/data-gl/asset/data/alcohol.json', function (data) {
-    var regionData = data.map(function (item) {
-        return {
-            name: item[0],
-            height: Math.pow(item[1], 0.2) + 1
-        }
-    })
-    option = {
-        series: [{
-            type: 'map3D',
-            map: 'world',
-            shading: 'realistic',
-            realisticMaterial: {
-                roughness: ROOT_PATH + "/data-gl/asset/wood/roughness.jpg",
-                normalTexture: ROOT_PATH + "/data-gl/asset/wood/normal.jpg",
-                detailTexture: ROOT_PATH + "/data-gl/asset/wood/diffuse.jpg",
-                textureTiling: [2, 2]
-            },
-            postEffect: {
-                enable: true,
-                SSAO: {
-                    enable: true,
-                    radius: 3,
-                    intensity: 1.4,
-                    quality: 'high'
-                }
-            },
-            light: {
-                main: {
-                    intensity: 2,
-                    shadow: true,
-                    shadowQuality: 'high',
-                    alpha: 150,
-                    beta: 0
-                },
-                ambient: {
-                    intensity: 0
-                },
-                ambientCubemap: {
-                    diffuseIntensity: 2,
-                    specularIntensity: 2,
-                    texture: ROOT_PATH + '/data-gl/asset/canyon.hdr'
-                }
-            },
-            viewControl: {
-                alpha: 89,
-                rotateMouseButton: 'right',
-                panMouseButton: 'left',
-                distance: 80
-            },
-            groundPlane: {
-                show: true,
-                color: '#333',
-                realisticMaterial: {
-                    roughness: ROOT_PATH + "/data-gl/asset/redbricks/roughness.jpg",
-                    normalTexture: ROOT_PATH + "/data-gl/asset/redbricks/normal.jpg",
-                    detailTexture: ROOT_PATH + "/data-gl/asset/redbricks/diffuse.jpg",
-                    textureTiling: [8, 4]
-                }
-            },
-            data: regionData
-        }]
-    };
-
-    myChart.setOption(option);
-});
\ No newline at end of file
diff --git a/public/data-gl/metal-bar3d.js b/public/data-gl/metal-bar3d.js
deleted file mode 100644
index 0d2c83e..0000000
--- a/public/data-gl/metal-bar3d.js
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
-title: Metal Bar3D
-category: bar3D
-titleCN: Metal Bar3D
-*/
-
-$.getScript('https://cdn.jsdelivr.net/npm/simplex-noise@2.4.0/simplex-noise.js').done(function () {
-
-
-var noise = new SimplexNoise(Math.random);
-function generateData(theta, min, max) {
-    var data = [];
-    for (var i = 0; i <= 20; i++) {
-        for (var j = 0; j <= 20; j++) {
-            var value = noise.noise2D(i / 20, j / 20);
-            valMax = Math.max(valMax, value);
-            valMin = Math.min(valMin, value);
-            data.push([i, j, value * 2 + 4]);
-        }
-    }
-    return data;
-}
-var valMin = Infinity;
-var valMax = -Infinity;
-var data = generateData(2, -5, 5);
-
-
-myChart.setOption(option = {
-    tooltip: {},
-    xAxis3D: {
-        type: 'value'
-    },
-    yAxis3D: {
-        type: 'value'
-    },
-    zAxis3D: {
-        type: 'value',
-        max: 10,
-        min: 0
-    },
-    grid3D: {
-        environment: '#000',
-        axisPointer: {
-            show: false
-        },
-        postEffect: {
-            enable: true,
-            SSAO: {
-                enable: true,
-                radius: 5
-            }
-        },
-        light: {
-            main: {
-                intensity: 3
-            },
-            ambientCubemap: {
-                texture: ROOT_PATH + '/data-gl/asset/pisa.hdr',
-                exposure: 1,
-                diffuseIntensity: 0.5,
-                specularIntensity: 2
-            }
-        }
-    },
-    series: [{
-        type: 'bar3D',
-        data: data,
-
-        barSize: 4,
-
-        bevelSize: 0.4,
-        bevelSmoothness: 4,
-
-        shading: 'realistic',
-        realisticMaterial: {
-            roughness: 0.3,
-            metalness: 1
-        },
-
-        label: {
-            textStyle: {
-                fontSize: 16,
-                borderWidth: 1
-            }
-        },
-
-        itemStyle: {
-            color: '#ccc'
-        },
-
-        emphasis: {
-            label: {
-                show: false
-            }
-        }
-    }]
-});
-
-});
\ No newline at end of file
diff --git a/public/data-gl/metal-surface.js b/public/data-gl/metal-surface.js
deleted file mode 100644
index 6ebcd9c..0000000
--- a/public/data-gl/metal-surface.js
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
-title: Metal Surface
-category: surface
-titleCN: Metal Surface
-*/
-
-
-var sin = Math.sin;
-var cos = Math.cos;
-var pow = Math.pow;
-var sqrt = Math.sqrt;
-var cosh = Math.cosh;
-var sinh = Math.sinh;
-var PI = Math.PI;
-
-var aa = 0.4;
-var r = 1 - aa * aa;
-var w = sqrt(r);
-
-option = {
-    tooltip: {},
-    visualMap: {
-        show: false,
-        dimension: 2,
-        min: -5,
-        max: 5,
-        inRange: {
-            color: ['#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf', '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026']
-        }
-    },
-    xAxis3D: {},
-    yAxis3D: {},
-    zAxis3D: {},
-    grid3D: {
-        show: false,
-        postEffect: {
-            enable: true,
-            SSAO: {
-                enable: true,
-                radius: 4,
-                quality: 'high',
-                intensity: 1.5
-            }
-        },
-        temporalSuperSampling: {
-            enable: true
-        },
-        light: {
-            main: {
-                intensity: 2,
-                shadow: true
-            },
-            ambient: {
-                intensity: 0
-            },
-            ambientCubemap: {
-                texture: ROOT_PATH + '/data-gl/asset/canyon.hdr',
-                exposure: 2,
-                diffuseIntensity: 0.2,
-                specularIntensity: 3
-            }
-        }
-    },
-    series: [{
-        type: 'surface',
-        parametric: true,
-        silent: true,
-        wireframe: {
-            show: false
-        },
-        shading: 'realistic',
-        realisticMaterial: {
-            roughness: 0.2,
-            metalness: 1
-        },
-        parametricEquation: {
-            u: {
-                min: -13.2,
-                max: 13.2,
-                step: 0.2
-            },
-            v: {
-                min: -37.4,
-                max: 37.4,
-                step: 0.2
-            },
-            x: function (u, v) {
-                var denom = aa * (pow(w * cosh(aa * u), 2) + aa * pow(sin(w * v), 2))
-                return -u + (2 * r * cosh(aa * u) * sinh(aa * u) / denom);
-            },
-            y: function (u, v) {
-                var denom = aa * (pow(w * cosh(aa * u), 2) + aa * pow(sin(w * v), 2))
-                return 2 * w * cosh(aa * u) * (-(w * cos(v) * cos(w * v)) - (sin(v) * sin(w * v))) / denom;
-            },
-            z: function (u, v) {
-                var denom = aa * (pow(w * cosh(aa * u), 2) + aa * pow(sin(w * v), 2))
-                return  2 * w * cosh(aa * u) * (-(w * sin(v) * cos(w * v)) + (cos(v) * sin(w * v))) / denom
-            }
-        }
-    }]
-};
\ No newline at end of file
diff --git a/public/data-gl/parametric-surface-rose.js b/public/data-gl/parametric-surface-rose.js
deleted file mode 100644
index 8b71738..0000000
--- a/public/data-gl/parametric-surface-rose.js
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
-title: Parametric Surface Rose
-category: surface
-titleCN: Parametric Surface Rose
-*/
-
-
-var sin = Math.sin;
-var cos = Math.cos;
-var pow = Math.pow;
-var sqrt = Math.sqrt;
-var cosh = Math.cosh;
-var sinh = Math.sinh;
-var exp = Math.exp;
-var PI = Math.PI;
-var square = function (x) {
-    return x*x;
-}
-var mod2 = function (a, b) {
-    var c = a % b;
-    return c > 0 ? c : (c + b);
-}
-
-var theta1 = -(20/9) * PI;
-var theta2 = 15 * PI;
-function getParametricEquation() {
-    return {
-        u: {
-            min: 0,
-            max: 1,
-            step: 1 / 24
-        },
-        v: {
-            min: theta1,
-            max: theta2,
-            step: (theta2 - theta1) / 575
-        },
-        x: function (x1, theta) {
-            var phi = (PI/2)*exp(-theta/(8*PI));
-            var y1 = 1.9565284531299512*square(x1)*square(1.2768869870150188*x1-1)*sin(phi);
-            var X = 1-square(1.25*square(1-mod2((3.6*theta),(2*PI))/PI)-0.25)/2;
-            var r = X*(x1*sin(phi)+y1*cos(phi));
-            return r * sin(theta);
-        },
-        y: function (x1, theta) {
-            var phi = (PI/2)*exp(-theta/(8*PI));
-            var y1 = 1.9565284531299512*square(x1)*square(1.2768869870150188*x1-1)*sin(phi);
-            var X = 1-square(1.25*square(1-mod2((3.6*theta),(2*PI))/PI)-0.25)/2;
-            var r = X*(x1*sin(phi)+y1*cos(phi));
-            return r * cos(theta);
-        },
-        z: function (x1, theta) {
-            var phi = (PI/2)*exp(-theta/(8*PI));
-            var y1 = 1.9565284531299512*square(x1)*square(1.2768869870150188*x1-1)*sin(phi);
-            var X = 1-square(1.25*square(1-mod2((3.6*theta),(2*PI))/PI)-0.25)/2;
-            var r = X*(x1*sin(phi)+y1*cos(phi));
-            return X*(x1*cos(phi)-y1*sin(phi));
-        }
-    };
-}
-
-option = {
-    toolbox: {
-        feature: {
-            saveAsImage: {
-                backgroundColor: '#111'
-            }
-        },
-        iconStyle: {
-            normal: {
-                borderColor: '#fff'
-            }
-        },
-        left: 0
-    },
-    xAxis3D: {
-        type: 'value'
-    },
-    yAxis3D: {
-        type: 'value'
-    },
-    zAxis3D: {
-        type: 'value'
-    },
-    grid3D: {
-
-        show: false,
-
-        axisPointer: {
-            show: false
-        },
-        axisLine: {
-            lineStyle: {
-                color: '#fff'
-            }
-        },
-        postEffect: {
-            enable: true,
-            SSAO: {
-                enable: true,
-                radius: 10,
-                intensity: 2
-            },
-            edge: {
-                enable: true
-            }
-        },
-        temporalSuperSampling: {
-            enable: true
-        },
-        light: {
-            main: {
-                intensity: 3,
-                shadow: true,
-            },
-            ambient: {
-                intensity: 0
-            },
-            ambientCubemap: {
-                texture: ROOT_PATH + '/data-gl/asset/canyon.hdr',
-                exposure: 0,
-                diffuseIntensity: 1,
-                specularIntensity: 0.5
-            }
-        },
-        viewControl: {
-            // projection: 'orthographic'
-        }
-    },
-    series: [{
-        type: 'surface',
-        parametric: true,
-        shading: 'realistic',
-        silent: true,
-        wireframe: {
-            show: false
-        },
-        realisticMaterial: {
-            baseTexture: ROOT_PATH + '/asset/get/s/data-1494250104909-SkZtfeAyZ.jpg',
-            roughness: 0.7,
-            metalness: 0,
-            textureTiling: [200, 20]
-        },
-        itemStyle: {
-            color: '#fff'
-        },
-        parametricEquation: getParametricEquation()
-    }]
-};
\ No newline at end of file
diff --git a/public/data-gl/scatter3D-dataset.js b/public/data-gl/scatter3D-dataset.js
deleted file mode 100644
index d15364e..0000000
--- a/public/data-gl/scatter3D-dataset.js
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
-title: 3D Scatter with Dataset
-category: scatter3D
-titleCN: 使用 dataset 为三维散点图设置数据
-*/
-
-$.get(ROOT_PATH + '/data/asset/data/life-expectancy-table.json', function (data) {
-    var symbolSize = 2.5;
-    option = {
-        grid3D: {},
-        xAxis3D: {
-            type: 'category'
-        },
-        yAxis3D: {},
-        zAxis3D: {},
-        dataset: {
-            dimensions: [
-                'Income',
-                'Life Expectancy',
-                'Population',
-                'Country',
-                {name: 'Year', type: 'ordinal'}
-            ],
-            source: data
-        },
-        series: [
-            {
-                type: 'scatter3D',
-                symbolSize: symbolSize,
-                encode: {
-                    x: 'Country',
-                    y: 'Life Expectancy',
-                    z: 'Income',
-                    tooltip: [0, 1, 2, 3, 4]
-                }
-            }
-        ]
-    };
-
-    myChart.setOption(option);
-});
\ No newline at end of file
diff --git a/public/data-gl/scatter3d-globe-population.js b/public/data-gl/scatter3d-globe-population.js
deleted file mode 100644
index 189d244..0000000
--- a/public/data-gl/scatter3d-globe-population.js
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
-title: Scatter3D - Globe Population
-category: scatter3D
-titleCN: Scatter3D - Globe Population
-*/
-
-
-$.getJSON(ROOT_PATH + '/data-gl/asset/data/population.json', function (data) {
-
-    data = data.filter(function (dataItem) {
-        return dataItem[2] > 0;
-    }).map(function (dataItem) {
-        return [dataItem[0], dataItem[1], Math.sqrt(dataItem[2])];
-    });
-
-    myChart.setOption({
-        visualMap: {
-            show: false,
-            min: 0,
-            max: 60,
-            inRange: {
-                symbolSize: [1.0, 10.0]
-            }
-        },
-        globe: {
-
-            environment: ROOT_PATH + '/data-gl/asset/starfield.jpg',
-
-            heightTexture: ROOT_PATH + '/data-gl/asset/bathymetry_bw_composite_4k.jpg',
-
-            displacementScale: 0.05,
-            displacementQuality: 'high',
-
-            globeOuterRadius: 100,
-
-            baseColor: '#000',
-
-            shading: 'realistic',
-            realisticMaterial: {
-                roughness: 0.2,
-                metalness: 0
-            },
-
-            postEffect: {
-                enable: true,
-                depthOfField: {
-                    focalRange: 15,
-                    enable: true,
-                    focalDistance: 100
-                }
-            },
-            temporalSuperSampling: {
-                enable: true
-            },
-            light: {
-                ambient: {
-                    intensity: 0
-                },
-                main: {
-                    intensity: 0.1,
-                    shadow: false
-                },
-                ambientCubemap: {
-                    texture: ROOT_PATH + '/data-gl/asset/lake.hdr',
-                    exposure: 1,
-                    diffuseIntensity: 0.5,
-                    specularIntensity: 2
-                }
-            },
-            viewControl: {
-                autoRotate: false,
-                beta: 180,
-                alpha: 20,
-                distance: 100
-            }
-        },
-        series: {
-            type: 'scatter3D',
-            coordinateSystem: 'globe',
-            blendMode: 'lighter',
-            symbolSize: 2,
-            itemStyle: {
-                color: 'rgb(50, 50, 150)',
-                opacity: 1
-            },
-            data: data
-        }
-    });
-});
diff --git a/public/data-gl/scatter3d-orthographic.js b/public/data-gl/scatter3d-orthographic.js
deleted file mode 100644
index d2ab3a8..0000000
--- a/public/data-gl/scatter3d-orthographic.js
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
-title: 三维散点图正交投影
-category: scatter3D
-theme: dark
-titleCN: 三维散点图正交投影
-*/
-
-$.getScript('https://cdn.jsdelivr.net/npm/simplex-noise@2.4.0/simplex-noise.js').done(function () {
-
-
-var noise = new SimplexNoise(Math.random);
-function generateData(theta, min, max) {
-    var data = [];
-    for (var i = 0; i <= 40; i++) {
-        for (var j = 0; j <= 40; j++) {
-            for (var k = 0; k <= 40; k++) {
-                var value = noise.noise3D(i / 20, j / 20, k / 20);
-                valMax = Math.max(valMax, value);
-                valMin = Math.min(valMin, value);
-                data.push([i, j, k, value * 2 + 4]);
-            }
-        }
-    }
-    return data;
-}
-var valMin = Infinity;
-var valMax = -Infinity;
-var data = generateData(2, -5, 5);
-console.log(valMin, valMax);
-
-myChart.setOption(option = {
-    visualMap: {
-        show: false,
-        min: 2,
-        max: 6,
-        inRange: {
-            symbolSize: [0.5, 15],
-            color: ['#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf', '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026'],
-            colorAlpha: [0.2, 1]
-        }
-    },
-    xAxis3D: {
-        type: 'value'
-    },
-    yAxis3D: {
-        type: 'value'
-    },
-    zAxis3D: {
-        type: 'value'
-    },
-    grid3D: {
-        axisLine: {
-            lineStyle: { color: '#fff' }
-        },
-        axisPointer: {
-            lineStyle: { color: '#fff' }
-        },
-        viewControl: {
-            projection: 'orthographic'
-        }
-    },
-    series: [{
-        type: 'scatter3D',
-        data: data
-    }]
-});
-
-});
\ No newline at end of file
diff --git a/public/data-gl/scatter3d-scatter.js b/public/data-gl/scatter3d-scatter.js
deleted file mode 100644
index b1ee000..0000000
--- a/public/data-gl/scatter3d-scatter.js
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
-title: 3D Scatter with Scatter Matrix
-category: scatter3D
-titleCN: 三维散点图和散点矩阵结合使用
-*/
-
-$.get(ROOT_PATH + '/data/asset/data/life-expectancy-table.json', function (data) {
-
-    var sizeValue = '57%';
-    var symbolSize = 2.5;
-
-    option = {
-        tooltip: {},
-        grid3D: {
-            width: '50%'
-        },
-        xAxis3D: {},
-        yAxis3D: {},
-        zAxis3D: {},
-        grid: [
-            {left: '50%', width: '20%', bottom: sizeValue},
-            {left: '75%', width: '20%', bottom: sizeValue},
-            {left: '50%', width: '20%',  top: sizeValue},
-            {left: '75%', width: '20%', top: sizeValue}
-        ],
-        xAxis: [
-            {type: 'value', gridIndex: 0, name: 'Income', axisLabel: {rotate: 50, interval: 0}},
-            {type: 'category', gridIndex: 1, name: 'Country', boundaryGap: false, axisLabel: {rotate: 50, interval: 0}},
-            {type: 'value', gridIndex: 2, name: 'Income', axisLabel: {rotate: 50, interval: 0}},
-            {type: 'value', gridIndex: 3, name: 'Life Expectancy', axisLabel: {rotate: 50, interval: 0}}
-        ],
-        yAxis: [
-            {type: 'value', gridIndex: 0, name: 'Life Expectancy'},
-            {type: 'value', gridIndex: 1, name: 'Income'},
-            {type: 'value', gridIndex: 2, name: 'Population'},
-            {type: 'value', gridIndex: 3, name: 'Population'}
-        ],
-        dataset: {
-            dimensions: [
-                'Income',
-                'Life Expectancy',
-                'Population',
-                'Country',
-                {name: 'Year', type: 'ordinal'}
-            ],
-            source: data
-        },
-        series: [
-            {
-                type: 'scatter3D',
-                symbolSize: 3,
-                encode: {
-                    x: 'Population',
-                    y: 'Life Expectancy',
-                    z: 'Income',
-                    tooltip: [0, 1, 2, 3, 4]
-                }
-            },
-
-            {
-                type: 'scatter',
-                symbolSize: symbolSize,
-                xAxisIndex: 0,
-                yAxisIndex: 0,
-                encode: {
-                    x: 'Income',
-                    y: 'Life Expectancy',
-                    tooltip: [0, 1, 2, 3, 4]
-                }
-            },
-            {
-                type: 'scatter',
-                symbolSize: symbolSize,
-                xAxisIndex: 1,
-                yAxisIndex: 1,
-                encode: {
-                    x: 'Country',
-                    y: 'Income',
-                    tooltip: [0, 1, 2, 3, 4]
-                }
-            },
-            {
-                type: 'scatter',
-                symbolSize: symbolSize,
-                xAxisIndex: 2,
-                yAxisIndex: 2,
-                encode: {
-                    x: 'Income',
-                    y: 'Population',
-                    tooltip: [0, 1, 2, 3, 4]
-                }
-            },
-            {
-                type: 'scatter',
-                symbolSize: symbolSize,
-                xAxisIndex: 3,
-                yAxisIndex: 3,
-                encode: {
-                    x: 'Life Expectancy',
-                    y: 'Population',
-                    tooltip: [0, 1, 2, 3, 4]
-                }
-            }
-        ]
-    };
-
-    myChart.setOption(option);
-});
\ No newline at end of file
diff --git a/public/data-gl/scatter3d-shanghai.js b/public/data-gl/scatter3d-shanghai.js
deleted file mode 100644
index 7d322ea..0000000
--- a/public/data-gl/scatter3d-shanghai.js
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
-title: 上海房价可视化三维散点图
-category: scatter3D
-titleCN: 上海房价可视化三维散点图
-*/
-
-var uploadedDataURL = ROOT_PATH + "/asset/get/s/data-1495284690309-Bk9Ro3Te-.json";
-mapboxgl.accessToken = mapboxglToken;
-
-myChart.showLoading();
-
-$.getJSON(uploadedDataURL, function(linedata) {
-
-    myChart.hideLoading();
-
-    myChart.setOption({
-
-        visualMap: {
-            show: false,
-            calculable: true,
-            realtime: false,
-            inRange: {
-                color: ['#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf', '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026']
-            },
-            outOfRange: {
-                colorAlpha: 0
-            },
-            max: linedata[1]
-        },
-        mapbox: {
-            center: [121.4693, 31.123070],
-            zoom: 10,
-            pitch: 50,
-            bearing: -10,
-            style: 'mapbox://styles/mapbox/light-v9',
-            boxHeight: 2,
-            // altitudeScale: 3e2
-        },
-        series: [{
-            type: 'scatter3D',
-            coordinateSystem: 'mapbox',
-            silent: true,
-            data: linedata[0],
-            itemStyle: {
-                borderWidth: 0.5,
-                borderColor: '#fff'
-            }
-        }]
-    });
-});
\ No newline at end of file
diff --git a/public/data-gl/scatter3d-simplex-noise.js b/public/data-gl/scatter3d-simplex-noise.js
deleted file mode 100644
index 4421234..0000000
--- a/public/data-gl/scatter3d-simplex-noise.js
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
-title: Scatter3D - Simplex Noise
-category: scatter3D
-theme: dark
-titleCN: Scatter3D - Simplex Noise
-*/
-
-$.getScript('https://cdn.jsdelivr.net/npm/simplex-noise@2.4.0/simplex-noise.js').done(function () {
-
-
-var noise = new SimplexNoise(Math.random);
-function generateData(theta, min, max) {
-    var data = [];
-    for (var i = 0; i <= 20; i++) {
-        for (var j = 0; j <= 20; j++) {
-            for (var k = 0; k <= 20; k++) {
-                var value = noise.noise3D(i / 10, j / 10, k / 10);
-                valMax = Math.max(valMax, value);
-                valMin = Math.min(valMin, value);
-                data.push([i, j, k, value * 2 + 4]);
-            }
-        }
-    }
-    return data;
-}
-var valMin = Infinity;
-var valMax = -Infinity;
-var data = generateData(2, -5, 5);
-console.log(valMin, valMax);
-
-myChart.setOption(option = {
-    visualMap: {
-        show: false,
-        min: 2,
-        max: 6,
-        inRange: {
-            symbolSize: [0.5, 25],
-            color: ['#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf', '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026'],
-            colorAlpha: [0.2, 1]
-        }
-    },
-    xAxis3D: {
-        type: 'value'
-    },
-    yAxis3D: {
-        type: 'value'
-    },
-    zAxis3D: {
-        type: 'value'
-    },
-    grid3D: {
-        axisLine: {
-            lineStyle: { color: '#fff' }
-        },
-        axisPointer: {
-            lineStyle: { color: '#fff' }
-        },
-        viewControl: {
-            // autoRotate: true
-        }
-    },
-    series: [{
-        type: 'scatter3D',
-        data: data
-    }]
-});
-
-});
\ No newline at end of file
diff --git a/public/data-gl/scatter3d-weibo-checkin-on-mapbox.js b/public/data-gl/scatter3d-weibo-checkin-on-mapbox.js
deleted file mode 100644
index 2669d0d..0000000
--- a/public/data-gl/scatter3d-weibo-checkin-on-mapbox.js
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
-title: Weibo checkin on Mapbox
-category: scatter3D
-titleCN: Weibo checkin on Mapbox
-*/
-
-
-mapboxgl.accessToken = mapboxglToken;
-
-$.getJSON(ROOT_PATH + '/asset/get/s/data-1491917776060-Sku0i8qpx.json', function (weiboData) {
-
-    weiboData = weiboData.map(function (serieData, idx) {
-        var px = serieData[0] / 1000;
-        var py = serieData[1] / 1000;
-        var res = [[px, py, 1]];
-
-        for (var i = 2; i < serieData.length; i += 2) {
-            var dx = serieData[i] / 1000;
-            var dy = serieData[i + 1] / 1000;
-            var x = px + dx;
-            var y = py + dy;
-            res.push([x.toFixed(2), y.toFixed(2), 1]);
-
-            px = x;
-            py = y;
-        }
-        return res;
-    });
-
-    myChart.setOption({
-        mapbox: {
-            center: [104.114129, 37.550339],
-            zoom: 3,
-            pitch: 0,
-            bearing: 0,
-            style: 'mapbox://styles/mapbox/dark-v9',
-            postEffect: {
-                enable: true
-            },
-            light: {
-                main: {
-                    intensity: 2,
-                    shadow: false,
-                    shadowQuality: 'high'
-                },
-                ambient: {
-                    intensity: 0.
-                }
-            }
-        },
-        series: [{
-            name: '弱',
-            type: 'scatter3D',
-            coordinateSystem: 'mapbox',
-            symbolSize: 1,
-            itemStyle: {
-                shadowBlur: 2,
-                shadowColor: 'rgba(37, 140, 249, 0.8)',
-                color: 'rgba(37, 140, 249, 0.8)'
-            },
-            data: weiboData[0]
-        }, {
-            name: '中',
-            type: 'scatter3D',
-            coordinateSystem: 'mapbox',
-            symbolSize: 1,
-            itemStyle: {
-                shadowBlur: 2,
-                shadowColor: 'rgba(14, 241, 242, 0.8)',
-                color: 'rgba(14, 241, 242, 0.8)'
-            },
-            data: weiboData[1]
-        }, {
-            name: '强',
-            type: 'scatter3D',
-            coordinateSystem: 'mapbox',
-            symbolSize: 1,
-            itemStyle: {
-                shadowBlur: 2,
-                shadowColor: 'rgba(255, 255, 255, 0.8)',
-                color: 'rgba(255, 255, 255, 0.8)'
-            },
-            data: weiboData[2]
-        }]
-    });
-
-});
\ No newline at end of file
diff --git a/public/data-gl/scatter3d.js b/public/data-gl/scatter3d.js
deleted file mode 100644
index a3235f8..0000000
--- a/public/data-gl/scatter3d.js
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
-title: Scatter3D
-category: scatter3D
-theme: dark
-titleCN: Scatter3D
-*/
-
-
-var indices = {
-    name: 0,
-    group: 1,
-    id: 16
-};
-var schema = [
-    {name: 'name', index: 0},
-    {name: 'group', index: 1},
-    {name: 'protein', index: 2},
-    {name: 'calcium', index: 3},
-    {name: 'sodium', index: 4},
-    {name: 'fiber', index: 5},
-    {name: 'vitaminc', index: 6},
-    {name: 'potassium', index: 7},
-    {name: 'carbohydrate', index: 8},
-    {name: 'sugars', index: 9},
-    {name: 'fat', index: 10},
-    {name: 'water', index: 11},
-    {name: 'calories', index: 12},
-    {name: 'saturated', index: 13},
-    {name: 'monounsat', index: 14},
-    {name: 'polyunsat', index: 15},
-    {name: 'id', index: 16}
-];
-var data;
-
-var fieldIndices = schema.reduce(function (obj, item) {
-    obj[item.name] = item.index;
-    return obj;
-}, {});
-
-var groupCategories = [];
-var groupColors = [];
-var data;
-var fieldNames = schema.map(function (item) {
-    return item.name;
-});
-fieldNames = fieldNames.slice(2, fieldNames.length - 2);
-
-function getMaxOnExtent(data) {
-    var colorMax = -Infinity;
-    var symbolSizeMax = -Infinity;
-    for (var i = 0; i < data.length; i++) {
-        var item = data[i];
-        var colorVal = item[fieldIndices[config.color]];
-        var symbolSizeVal = item[fieldIndices[config.symbolSize]];
-        colorMax = Math.max(colorVal, colorMax);
-        symbolSizeMax = Math.max(symbolSizeVal, symbolSizeMax);
-    }
-    return {
-        color: colorMax,
-        symbolSize: symbolSizeMax
-    };
-}
-
-var config = app.config = {
-    xAxis3D: 'protein',
-    yAxis3D: 'fiber',
-    zAxis3D: 'sodium',
-    color: 'fiber',
-    symbolSize: 'vitaminc',
-
-    onChange: function () {
-        var max = getMaxOnExtent(data);
-        if (data) {
-            myChart.setOption({
-                visualMap: [{
-                    max: max.color / 2
-                }, {
-                    max: max.symbolSize / 2
-                }],
-                xAxis3D: {
-                    name: config.xAxis3D
-                },
-                yAxis3D: {
-                    name: config.yAxis3D
-                },
-                zAxis3D: {
-                    name: config.zAxis3D
-                },
-                series: {
-                    dimensions: [
-                        config.xAxis3D,
-                        config.yAxis3D,
-                        config.yAxis3D,
-                        config.color,
-                        config.symbolSiz
-                    ],
-                    data: data.map(function (item, idx) {
-                        return [
-                            item[fieldIndices[config.xAxis3D]],
-                            item[fieldIndices[config.yAxis3D]],
-                            item[fieldIndices[config.zAxis3D]],
-                            item[fieldIndices[config.color]],
-                            item[fieldIndices[config.symbolSize]],
-                            idx
-                        ];
-                    })
-                }
-            });
-        }
-    }
-};
-app.configParameters = {};
-['xAxis3D', 'yAxis3D', 'zAxis3D', 'color', 'symbolSize'].forEach(function (fieldName) {
-    app.configParameters[fieldName] = {
-        options: fieldNames
-    };
-});
-
-$.getJSON(ROOT_PATH + '/data/asset/data/nutrients.json', function (_data) {
-    data = _data;
-
-    var max = getMaxOnExtent(data);
-    myChart.setOption({
-        tooltip: {},
-        visualMap: [{
-            top: 10,
-            calculable: true,
-            dimension: 3,
-            max: max.color / 2,
-            inRange: {
-                color: ['#1710c0', '#0b9df0', '#00fea8', '#00ff0d', '#f5f811', '#f09a09', '#fe0300']
-            },
-            textStyle: {
-                color: '#fff'
-            }
-        }, {
-            bottom: 10,
-            calculable: true,
-            dimension: 4,
-            max: max.symbolSize / 2,
-            inRange: {
-                symbolSize: [10, 40]
-            },
-            textStyle: {
-                color: '#fff'
-            }
-        }],
-        xAxis3D: {
-            name: config.xAxis3D,
-            type: 'value'
-        },
-        yAxis3D: {
-            name: config.yAxis3D,
-            type: 'value'
-        },
-        zAxis3D: {
-            name: config.zAxis3D,
-            type: 'value'
-        },
-        grid3D: {
-            axisLine: {
-                lineStyle: {
-                    color: '#fff'
-                }
-            },
-            axisPointer: {
-                lineStyle: {
-                    color: '#ffbd67'
-                }
-            },
-            viewControl: {
-                // autoRotate: true
-                // projection: 'orthographic'
-            }
-        },
-        series: [{
-            type: 'scatter3D',
-            dimensions: [
-                config.xAxis3D,
-                config.yAxis3D,
-                config.yAxis3D,
-                config.color,
-                config.symbolSiz
-            ],
-            data: data.map(function (item, idx) {
-                return [
-                    item[fieldIndices[config.xAxis3D]],
-                    item[fieldIndices[config.yAxis3D]],
-                    item[fieldIndices[config.zAxis3D]],
-                    item[fieldIndices[config.color]],
-                    item[fieldIndices[config.symbolSize]],
-                    idx
-                ];
-            }),
-            symbolSize: 12,
-            // symbol: 'triangle',
-            itemStyle: {
-                borderWidth: 1,
-                borderColor: 'rgba(255,255,255,0.8)'
-            },
-            emphasis: {
-                itemStyle: {
-                    color: '#fff'
-                }
-            }
-        }]
-    });
-});
\ No newline at end of file
diff --git a/public/data-gl/scatterGL-gps.js b/public/data-gl/scatterGL-gps.js
deleted file mode 100644
index 18d8a19..0000000
--- a/public/data-gl/scatterGL-gps.js
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
-title: 10 million Bulk GPS points
-titleCN: 1 千万 GPS 点可视化
-category: scatterGL
-*/
-
-
-var dataCount = 0;
-var CHUNK_COUNT = 230;
-// https://blog.openstreetmap.org/2012/04/01/bulk-gps-point-data/
-function fetchData(idx) {
-    if (idx >= CHUNK_COUNT) {
-        return;
-    }
-    var dataURL = ROOT_PATH + '/data/asset/data/gps/gps_'+ idx + '.bin';
-    var xhr = new XMLHttpRequest();
-    xhr.open('GET', dataURL, true);
-    xhr.responseType = 'arraybuffer';
-
-    xhr.onload = function (e) {
-        var rawData = new Int32Array(this.response);
-        var data = new Float32Array(rawData.length);
-        var addedDataCount = rawData.length / 2;
-        for (var i = 0; i < rawData.length; i += 2) {
-            data[i] = rawData[i+1] / 1e7;
-            data[i+1] = rawData[i] / 1e7;
-        }
-
-        myChart.appendData({
-            seriesIndex: 0,
-            data: data
-        });
-
-        fetchData(idx + 1);
-    }
-
-    xhr.send();
-}
-
-option = {
-    backgroundColor: '#000',
-    title: {
-        text: '10000000 GPS Points',
-        left: 'center',
-        textStyle: {
-            color: '#fff'
-        }
-    },
-    geo: {
-        map: 'world',
-        roam: true,
-        label: {
-            emphasis: {
-                show: false
-            }
-        },
-        silent: true,
-        itemStyle: {
-            normal: {
-                areaColor: '#323c48',
-                borderColor: '#111'
-            },
-            emphasis: {
-                areaColor: '#2a333d'
-            }
-        }
-    },
-    series: [{
-        name: '弱',
-        type: 'scatterGL',
-        progressive: 1e6,
-        coordinateSystem: 'geo',
-        symbolSize: 1,
-        zoomScale: 0.002,
-        blendMode: 'lighter',
-        large: true,
-        itemStyle: {
-            color: 'rgb(20, 15, 2)'
-        },
-        postEffect: {
-            enable: true
-        },
-        silent: true,
-        dimensions: ['lng', 'lat'],
-        data: new Float32Array()
-    }]
-};
-
-fetchData(0);
\ No newline at end of file
diff --git a/public/data-gl/scattergl-weibo.js b/public/data-gl/scattergl-weibo.js
deleted file mode 100644
index 29eb1cc..0000000
--- a/public/data-gl/scattergl-weibo.js
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
-title: 微博签到数据点亮中国
-category: scatterGL
-theme: dark
-titleCN: 微博签到数据点亮中国
-*/
-
-
-$.getJSON(ROOT_PATH + '/data/asset/data/weibo.json', function (weiboData) {
-
-    weiboData = weiboData.map(function (serieData, idx) {
-        var px = serieData[0] / 1000;
-        var py = serieData[1] / 1000;
-        var res = [[px, py]];
-
-        for (var i = 2; i < serieData.length; i += 2) {
-            var dx = serieData[i] / 1000;
-            var dy = serieData[i + 1] / 1000;
-            var x = px + dx;
-            var y = py + dy;
-            res.push([x.toFixed(2), y.toFixed(2), 1]);
-
-            px = x;
-            py = y;
-        }
-        return res;
-    });
-    myChart.setOption(option = {
-        title : {
-            text: '微博签到数据点亮中国',
-            subtext: 'From ThinkGIS',
-            sublink: 'http://www.thinkgis.cn/public/sina',
-            left: 'center',
-            top: 'top',
-            textStyle: {
-                color: '#fff'
-            }
-        },
-        tooltip: {},
-        legend: {
-            left: 'left',
-            data: ['强', '中', '弱'],
-            textStyle: {
-                color: '#ccc'
-            }
-        },
-        geo: {
-            map: 'china',
-            roam: true,
-            label: {
-                emphasis: {
-                    show: false
-                }
-            },
-            itemStyle: {
-                normal: {
-                    areaColor: '#323c48',
-                    borderColor: '#111'
-                },
-                emphasis: {
-                    areaColor: '#2a333d'
-                }
-            }
-        },
-        series: [{
-            name: '弱',
-            type: 'scatterGL',
-            coordinateSystem: 'geo',
-            symbolSize: 1,
-            itemStyle: {
-                shadowBlur: 2,
-                shadowColor: 'rgba(37, 140, 249, 0.8)',
-                color: 'rgba(37, 140, 249, 0.8)'
-            },
-            data: weiboData[0]
-        }, {
-            name: '中',
-            type: 'scatterGL',
-            coordinateSystem: 'geo',
-            symbolSize: 1,
-            itemStyle: {
-                shadowBlur: 2,
-                shadowColor: 'rgba(14, 241, 242, 0.8)',
-                color: 'rgba(14, 241, 242, 0.8)'
-            },
-            data: weiboData[1]
-        }, {
-            name: '强',
-            type: 'scatterGL',
-            coordinateSystem: 'geo',
-            symbolSize: 1,
-            itemStyle: {
-                shadowBlur: 2,
-                shadowColor: 'rgba(255, 255, 255, 0.8)',
-                color: 'rgba(255, 255, 255, 0.8)'
-            },
-            data: weiboData[2]
-        }]
-    });
-});
\ No newline at end of file
diff --git a/public/data-gl/simple-surface.js b/public/data-gl/simple-surface.js
deleted file mode 100644
index 4b16ebd..0000000
--- a/public/data-gl/simple-surface.js
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
-title: Simple Surface
-category: surface
-titleCN: Simple Surface
-*/
-
-option = {
-    tooltip: {},
-    backgroundColor: '#fff',
-    visualMap: {
-        show: false,
-        dimension: 2,
-        min: -1,
-        max: 1,
-        inRange: {
-            color: ['#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf', '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026']
-        }
-    },
-    xAxis3D: {
-        type: 'value'
-    },
-    yAxis3D: {
-        type: 'value'
-    },
-    zAxis3D: {
-        type: 'value'
-    },
-    grid3D: {
-        viewControl: {
-            // projection: 'orthographic'
-        }
-    },
-    series: [{
-        type: 'surface',
-        wireframe: {
-            // show: false
-        },
-        equation: {
-            x: {
-                step: 0.05
-            },
-            y: {
-                step: 0.05
-            },
-            z: function (x, y) {
-                if (Math.abs(x) < 0.1 && Math.abs(y) < 0.1) {
-                    return '-';
-                }
-                return Math.sin(x * Math.PI) * Math.sin(y * Math.PI);
-            }
-        }
-    }]
-}
\ No newline at end of file
diff --git a/public/data-gl/sphere-parametric-surface.js b/public/data-gl/sphere-parametric-surface.js
deleted file mode 100644
index 507a4bf..0000000
--- a/public/data-gl/sphere-parametric-surface.js
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
-title: Sphere Parametric Surface
-category: surface
-titleCN: Sphere Parametric Surface
-*/
-
-option = {
-    tooltip: {},
-    visualMap: {
-        show: false,
-        dimension: 2,
-        min: -1,
-        max: 1,
-        inRange: {
-            color: ['#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf', '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026']
-        }
-    },
-    xAxis3D: {},
-    yAxis3D: {},
-    zAxis3D: {},
-    grid3D: {},
-    series: [{
-        type: 'surface',
-        parametric: true,
-        // shading: 'albedo',
-        parametricEquation: {
-            u: {
-                min: -Math.PI,
-                max: Math.PI,
-                step: Math.PI / 20
-            },
-            v: {
-                min: 0,
-                max: Math.PI,
-                step: Math.PI / 20
-            },
-            x: function (u, v) {
-                return Math.sin(v) * Math.sin(u);
-            },
-            y: function (u, v) {
-                return Math.sin(v) * Math.cos(u);
-            },
-            z: function (u, v) {
-                return Math.cos(v);
-            }
-        }
-    }]
-};
\ No newline at end of file
diff --git a/public/data-gl/stacked-bar3d.js b/public/data-gl/stacked-bar3d.js
deleted file mode 100644
index 450c47a..0000000
--- a/public/data-gl/stacked-bar3d.js
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
-title: Stacked Bar3D
-category: bar3D
-titleCN: Stacked Bar3D
-*/
-
-$.getScript('https://cdn.jsdelivr.net/npm/simplex-noise@2.4.0/simplex-noise.js').done(function () {
-
-
-function generateData() {
-    var data = [];
-    var noise = new SimplexNoise(Math.random);
-    for (var i = 0; i <= 10; i++) {
-        for (var j = 0; j <= 10; j++) {
-            var value = noise.noise2D(i / 5, j / 5);
-            data.push([i, j, value * 2 + 4]);
-        }
-    }
-    return data;
-}
-
-var series = [];
-for (var i = 0; i < 10; i++) {
-    series.push({
-        type: 'bar3D',
-        data: generateData(),
-        stack: 'stack',
-        shading: 'lambert',
-        emphasis: {
-            label: {
-                show: false
-            }
-        }
-    });
-}
-
-myChart.setOption({
-    xAxis3D: {
-        type: 'value'
-    },
-    yAxis3D: {
-        type: 'value'
-    },
-    zAxis3D: {
-        type: 'value'
-    },
-    grid3D: {
-        viewControl: {
-            // autoRotate: true
-        },
-        light: {
-            main: {
-                shadow: true,
-                quality: 'ultra',
-                intensity: 1.5
-            }
-        }
-    },
-    series: series
-});
-
-});
\ No newline at end of file
diff --git a/public/data-gl/surface-breather.js b/public/data-gl/surface-breather.js
deleted file mode 100644
index 6a1718b..0000000
--- a/public/data-gl/surface-breather.js
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
-title: Breather
-category: surface
-titleCN: Breather
-*/
-
-var sin = Math.sin;
-var cos = Math.cos;
-var pow = Math.pow;
-var sqrt = Math.sqrt;
-var cosh = Math.cosh;
-var sinh = Math.sinh;
-var PI = Math.PI;
-
-var aa = 0.4;
-var r = 1 - aa * aa;
-var w = sqrt(r);
-
-option = {
-    toolbox: {
-        left: 20,
-        iconStyle: {
-            normal: {
-                borderColor: '#000'
-            }
-        },
-        feature: {
-            myExportObj: {
-                title: 'Export OBJ',
-                icon: 'M4.7,22.9L29.3,45.5L54.7,23.4M4.6,43.6L4.6,58L53.8,58L53.8,43.6M29.2,45.1L29.2,0',
-                onclick: function () {
-                    var res = echarts.exportGL2PLY(myChart, {
-                        mainType: 'grid3D',
-                        index: 0
-                    });
-                    download(res, 'surface.ply', 'text/plain');
-                }
-            }
-        }
-    },
-    tooltip: {},
-    visualMap: {
-        show: false,
-        dimension: 2,
-        min: -3,
-        max: 3,
-        inRange: {
-            color: ['#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf', '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026']
-        }
-    },
-    xAxis3D: {},
-    yAxis3D: {},
-    zAxis3D: {},
-    grid3D: {
-        show: true,
-        postEffect: {
-            enable: true,
-            SSAO: {
-                enable: true,
-                radius: 4
-            }
-        },
-        viewControl: {
-            distance: 130,
-            beta: 50
-        },
-        light: {
-            main: {
-                intensity: 2,
-                shadow: true
-            },
-            ambient: {
-                intensity: 0
-            },
-            ambientCubemap: {
-                texture: ROOT_PATH + '/data-gl/asset/canyon.hdr',
-                exposure: 2,
-                diffuseIntensity: 0.2,
-                specularIntensity: 1
-            }
-        }
-    },
-    series: [{
-        type: 'surface',
-        parametric: true,
-        wireframe: {
-            show: false
-        },
-        shading: 'realistic',
-        realisticMaterial: {
-            roughness: 0.3,
-            metalness: 0
-        },
-        parametricEquation: {
-            u: {
-                min: -13.2,
-                max: 13.2,
-                step: 0.2
-            },
-            v: {
-                min: -37.4,
-                max: 37.4,
-                step: 0.2
-            },
-            x: function (u, v) {
-                var denom = aa * (pow(w * cosh(aa * u), 2) + aa * pow(sin(w * v), 2))
-                return -u + (2 * r * cosh(aa * u) * sinh(aa * u) / denom);
-            },
-            y: function (u, v) {
-                var denom = aa * (pow(w * cosh(aa * u), 2) + aa * pow(sin(w * v), 2))
-                return 2 * w * cosh(aa * u) * (-(w * cos(v) * cos(w * v)) - (sin(v) * sin(w * v))) / denom;
-            },
-            z: function (u, v) {
-                var denom = aa * (pow(w * cosh(aa * u), 2) + aa * pow(sin(w * v), 2))
-                return  2 * w * cosh(aa * u) * (-(w * sin(v) * cos(w * v)) + (cos(v) * sin(w * v))) / denom
-            }
-        }
-    }]
-};
\ No newline at end of file
diff --git a/public/data-gl/surface-golden-rose.js b/public/data-gl/surface-golden-rose.js
deleted file mode 100644
index eb61325..0000000
--- a/public/data-gl/surface-golden-rose.js
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
-title: Golden Rose
-category: surface
-titleCN: Golden Rose
-*/
-
-
-var sin = Math.sin;
-var cos = Math.cos;
-var pow = Math.pow;
-var sqrt = Math.sqrt;
-var cosh = Math.cosh;
-var sinh = Math.sinh;
-var exp = Math.exp;
-var PI = Math.PI;
-var square = function (x) {
-    return x*x;
-}
-var mod2 = function (a, b) {
-    var c = a % b;
-    return c > 0 ? c : (c + b);
-}
-
-var theta1 = -(20/9) * PI;
-var theta2 = 15 * PI;
-function getParametricEquation(dx, dy) {
-    return {
-        u: {
-            min: 0,
-            max: 1,
-            step: 1 / 24
-        },
-        v: {
-            min: theta1,
-            max: theta2,
-            step: (theta2 - theta1) / 575
-        },
-        x: function (x1, theta) {
-            var phi = (PI/2)*exp(-theta/(8*PI));
-            var y1 = 1.9565284531299512*square(x1)*square(1.2768869870150188*x1-1)*sin(phi);
-            var X = 1-square(1.25*square(1-mod2((3.6*theta),(2*PI))/PI)-0.25)/2;
-            var r = X*(x1*sin(phi)+y1*cos(phi));
-            return r * sin(theta) + dx;
-        },
-        y: function (x1, theta) {
-            var phi = (PI/2)*exp(-theta/(8*PI));
-            var y1 = 1.9565284531299512*square(x1)*square(1.2768869870150188*x1-1)*sin(phi);
-            var X = 1-square(1.25*square(1-mod2((3.6*theta),(2*PI))/PI)-0.25)/2;
-            var r = X*(x1*sin(phi)+y1*cos(phi));
-            return r * cos(theta) + dy;
-        },
-        z: function (x1, theta) {
-            var phi = (PI/2)*exp(-theta/(8*PI));
-            var y1 = 1.9565284531299512*square(x1)*square(1.2768869870150188*x1-1)*sin(phi);
-            var X = 1-square(1.25*square(1-mod2((3.6*theta),(2*PI))/PI)-0.25)/2;
-            var r = X*(x1*sin(phi)+y1*cos(phi));
-            return X*(x1*cos(phi)-y1*sin(phi));
-        }
-    };
-}
-
-function createSeries(dx, dy, color) {
-    return {
-        type: 'surface',
-        parametric: true,
-        shading: 'realistic',
-        silent: true,
-        wireframe: {
-            show: false
-        },
-        realisticMaterial: {
-            roughness: 0.3,
-            metalness: 1
-        },
-        itemStyle: {
-            color: color || [2, 1.5, 0.2]
-        },
-        parametricEquation: getParametricEquation(dx, dy)
-    };
-}
-
-option = {
-    toolbox: {
-        feature: {
-            saveAsImage: {
-                backgroundColor: '#111'
-            }
-        },
-        iconStyle: {
-            normal: {
-                borderColor: '#fff'
-            }
-        },
-        left: 0
-    },
-    xAxis3D: {
-        type: 'value'
-    },
-    yAxis3D: {
-        type: 'value'
-    },
-    zAxis3D: {
-        type: 'value'
-    },
-    grid3D: {
-
-        show: false,
-        boxWidth: 200,
-        boxDepth: 200,
-
-        axisPointer: {
-            show: false
-        },
-        axisLine: {
-            lineStyle: {
-                color: '#fff'
-            }
-        },
-        postEffect: {
-            enable: true,
-            SSAO: {
-                enable: true,
-                radius: 10,
-                intensity: 1
-            },
-            depthOfField: {
-                enable: true
-            }
-        },
-        temporalSuperSampling: {
-            enable: true
-        },
-        light: {
-            main: {
-                intensity: 1,
-                shadow: true,
-            },
-            ambient: {
-                intensity: 0
-            },
-            ambientCubemap: {
-                texture: ROOT_PATH + '/data-gl/asset/pisa.hdr',
-                exposure: 1,
-                diffuseIntensity: 1,
-                specularIntensity: 1
-            }
-        },
-        viewControl: {
-            // projection: 'orthographic'
-        }
-    },
-    series: [
-        createSeries(1.5, 1.5),
-        createSeries(-1.5, -1.5),
-        createSeries(-1.5, 1.5),
-        createSeries(1.5, -1.5),
-        createSeries(0, 0),
-    ]
-};
\ No newline at end of file
diff --git a/public/data-gl/surface-leather.js b/public/data-gl/surface-leather.js
deleted file mode 100644
index 10b0a68..0000000
--- a/public/data-gl/surface-leather.js
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
-title: 皮革材质
-category: surface
-titleCN: 皮革材质
-*/
-
-var TILING = [4, 2];
-
-var heightImg = new Image();
-heightImg.onload = update;
-heightImg.crossOrigin = 'anonymous';
-heightImg.src = ROOT_PATH + '/data-gl/asset/leather/leather_height.jpg';
-
-function update() {
-    var canvas = document.createElement('canvas');
-    var ctx = canvas.getContext('2d');
-    var width = canvas.width = heightImg.width;
-    var height = canvas.height = heightImg.height;
-    ctx.drawImage(heightImg, 0, 0, width, height);
-    var imgData = ctx.getImageData(0, 0, width, height).data;
-
-    function getScale(u, v) {
-        u = (u / Math.PI * 0.5 + 0.5) * TILING[0];
-        v = v / Math.PI * TILING[1];
-
-        u = Math.floor((u - Math.floor(u)) * (width - 1));
-        v = Math.floor((1 - v + Math.floor(v)) * (height - 1));
-
-        var idx = v * width + u;
-        return 1 + imgData[idx * 4] / 255 / 20;
-    }
-
-    myChart.setOption({
-        xAxis3D: {
-            type: 'value',
-            min: -1.5,
-            max: 1.5
-        },
-        yAxis3D: {
-            type: 'value',
-            min: -1.5,
-            max: 1.5
-        },
-        zAxis3D: {
-            type: 'value',
-            min: -1.5,
-            max: 1.5
-        },
-        grid3D: {
-            show: false,
-
-            environment: 'none',
-
-            axisPointer: {
-                show: false
-            },
-            postEffect: {
-                enable: true,
-                screenSpaceAmbientOcclusion: {
-                    enable: true,
-                    radius: 10,
-                    intensity: 2,
-                    quality: 'high'
-                },
-                screenSpaceReflection: {
-                    enable: false
-                },
-                depthOfField: {
-                    enable: false,
-                    focalRange: 10,
-                    fstop: 4
-                }
-            },
-            temporalSuperSampling: {
-                enable: true
-            },
-            light: {
-                main: {
-                    intensity: 2,
-                    shadow: true
-                },
-                ambient: {
-                    intensity: 0
-                },
-                ambientCubemap: {
-                    texture: ROOT_PATH + '/data-gl/asset/pisa.hdr',
-                    exposure: 1,
-                    diffuseIntensity: 1,
-                    specularIntensity: 2
-                }
-            },
-            viewControl: {
-                distance: 80
-                // projection: 'orthographic'
-            }
-        },
-        series: [{
-            type: 'surface',
-            parametric: true,
-            shading: 'realistic',
-            silent: true,
-            wireframe: {
-                show: false
-            },
-            realisticMaterial: {
-                // detailTexture: 'asset/leather/leather_albedo.jpg',
-                roughness: ROOT_PATH + '/data-gl/asset/leather/leather_roughness.jpg',
-                normalTexture: ROOT_PATH + '/data-gl/asset/leather/leather_normal.jpg',
-                textureTiling: TILING
-            },
-            itemStyle: {
-                color: '#300'
-            },
-            parametricEquation: {
-                u: {
-                    min: -Math.PI,
-                    max: Math.PI,
-                    step: Math.PI / 100
-                },
-                v: {
-                    min: 0.4,
-                    max: Math.PI - 0.4,
-                    step: Math.PI / 100
-                },
-                x: function (u, v) {
-                    return Math.sin(v) * Math.sin(u) * getScale(u, v);
-                },
-                y: function (u, v) {
-                    return Math.sin(v) * Math.cos(u) * getScale(u, v);
-                },
-                z: function (u, v) {
-                    return Math.cos(v) * getScale(u, v);
-                }
-            }
-        }]
-    });
-}
\ No newline at end of file
diff --git a/public/data-gl/surface-mollusc-shell.js b/public/data-gl/surface-mollusc-shell.js
deleted file mode 100644
index 7745288..0000000
--- a/public/data-gl/surface-mollusc-shell.js
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
-title: Mollusc Shell
-category: surface
-titleCN: Mollusc Shell
-*/
-
-option = {
-    tooltip: {},
-    visualMap: {
-        show: false,
-        dimension: 2,
-        min: -5,
-        max: 0,
-        inRange: {
-            color: ['#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf', '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026']
-        }
-    },
-    xAxis3D: {},
-    yAxis3D: {},
-    zAxis3D: {},
-    grid3D: {
-        show: true,
-        postEffect: {
-            enable: true
-        },
-        temporalSuperSampling: {
-            enable: true
-        },
-        light: {
-            main: {
-                intensity: 3,
-                shadow: true
-            },
-            ambient: {
-                intensity: 0
-            },
-            ambientCubemap: {
-                texture: ROOT_PATH + '/data-gl/asset/canyon.hdr',
-                exposure: 2,
-                diffuseIntensity: 1,
-                specularIntensity: 1
-            }
-        }
-    },
-    series: [{
-        type: 'surface',
-        parametric: true,
-        wireframe: {
-            show: false
-        },
-        shading: 'realistic',
-        realisticMaterial: {
-            roughness: 0.4,
-            metalness: 0
-        },
-        parametricEquation: {
-            u: {
-                min: -Math.PI,
-                max: Math.PI,
-                step: Math.PI / 40
-            },
-            v: {
-                min: -15,
-                max: 6,
-                step: 0.21
-            },
-            x: function (u, v) {
-                return Math.pow(1.16, v) * Math.cos(v) * (1 + Math.cos(u));
-            },
-            y: function (u, v) {
-                return -Math.pow(1.16, v) * Math.sin(v) * (1 + Math.cos(u));
-            },
-            z: function (u, v) {
-                return -2 * Math.pow(1.16, v) * (1 + Math.sin(u));
-            }
-        }
-    }]
-};
\ No newline at end of file
diff --git a/public/data-gl/surface-theme-roses.js b/public/data-gl/surface-theme-roses.js
deleted file mode 100644
index 376b7cf..0000000
--- a/public/data-gl/surface-theme-roses.js
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
-title: Theme Roses
-category: surface
-titleCN: Theme Roses
-*/
-
-
-var sin = Math.sin;
-var cos = Math.cos;
-var pow = Math.pow;
-var sqrt = Math.sqrt;
-var cosh = Math.cosh;
-var sinh = Math.sinh;
-var exp = Math.exp;
-var PI = Math.PI;
-var square = function (x) {
-    return x*x;
-}
-var mod2 = function (a, b) {
-    var c = a % b;
-    return c > 0 ? c : (c + b);
-}
-
-var theta1 = -(20/9) * PI;
-var theta2 = 15 * PI;
-function getParametricEquation(dx, dy) {
-    return {
-        u: {
-            min: 0,
-            max: 1,
-            step: 1 / 24
-        },
-        v: {
-            min: theta1,
-            max: theta2,
-            step: (theta2 - theta1) / 575
-        },
-        x: function (x1, theta) {
-            var phi = (PI/2)*exp(-theta/(8*PI));
-            var y1 = 1.9565284531299512*square(x1)*square(1.2768869870150188*x1-1)*sin(phi);
-            var X = 1-square(1.25*square(1-mod2((3.6*theta),(2*PI))/PI)-0.25)/2;
-            var r = X*(x1*sin(phi)+y1*cos(phi));
-            return r * sin(theta) + dx;
-        },
-        y: function (x1, theta) {
-            var phi = (PI/2)*exp(-theta/(8*PI));
-            var y1 = 1.9565284531299512*square(x1)*square(1.2768869870150188*x1-1)*sin(phi);
-            var X = 1-square(1.25*square(1-mod2((3.6*theta),(2*PI))/PI)-0.25)/2;
-            var r = X*(x1*sin(phi)+y1*cos(phi));
-            return r * cos(theta) + dy;
-        },
-        z: function (x1, theta) {
-            var phi = (PI/2)*exp(-theta/(8*PI));
-            var y1 = 1.9565284531299512*square(x1)*square(1.2768869870150188*x1-1)*sin(phi);
-            var X = 1-square(1.25*square(1-mod2((3.6*theta),(2*PI))/PI)-0.25)/2;
-            var r = X*(x1*sin(phi)+y1*cos(phi));
-            return X*(x1*cos(phi)-y1*sin(phi));
-        }
-    };
-}
-
-function createSeries(dx, dy, color) {
-    return {
-        type: 'surface',
-        parametric: true,
-        shading: 'realistic',
-        silent: true,
-        wireframe: {
-            show: false
-        },
-        realisticMaterial: {
-            roughness: 0.7,
-            metalness: 0,
-            textureTiling: [200, 20]
-        },
-        parametricEquation: getParametricEquation(dx, dy)
-    };
-}
-
-option = {
-    toolbox: {
-        feature: {
-            saveAsImage: {
-                backgroundColor: '#111'
-            }
-        },
-        iconStyle: {
-            normal: {
-                borderColor: '#fff'
-            }
-        },
-        left: 0
-    },
-    xAxis3D: {
-        type: 'value'
-    },
-    yAxis3D: {
-        type: 'value'
-    },
-    zAxis3D: {
-        type: 'value'
-    },
-    grid3D: {
-
-        show: false,
-        boxWidth: 200,
-        boxDepth: 200,
-
-        axisPointer: {
-            show: false
-        },
-        axisLine: {
-            lineStyle: {
-                color: '#fff'
-            }
-        },
-        postEffect: {
-            enable: true,
-            SSAO: {
-                enable: true,
-                radius: 10,
-                intensity: 1
-            }
-        },
-        temporalSuperSampling: {
-            enable: true
-        },
-        light: {
-            main: {
-                intensity: 1,
-                shadow: true,
-            },
-            ambient: {
-                intensity: 0
-            },
-            ambientCubemap: {
-                texture: ROOT_PATH + '/data-gl/asset/pisa.hdr',
-                exposure: 1,
-                diffuseIntensity: 1,
-                specularIntensity: 1
-            }
-        },
-        viewControl: {
-            // projection: 'orthographic'
-        }
-    },
-    series: [
-        createSeries(1.5, 1.5),
-        createSeries(-1.5, -1.5),
-        createSeries(-1.5, 1.5),
-        createSeries(1.5, -1.5),
-        createSeries(0, 0),
-    ]
-};
\ No newline at end of file
diff --git a/public/data-gl/surface-wave.js b/public/data-gl/surface-wave.js
deleted file mode 100644
index 23c7b24..0000000
--- a/public/data-gl/surface-wave.js
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
-title: Surface Wave
-category: surface
-titleCN: Surface Wave
-*/
-
-option = {
-    tooltip: {},
-    backgroundColor: '#fff',
-    visualMap: {
-        show: false,
-        dimension: 2,
-        min: -1,
-        max: 1,
-        inRange: {
-            color: ['#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf', '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026']
-        }
-    },
-    xAxis3D: {
-        type: 'value'
-    },
-    yAxis3D: {
-        type: 'value'
-    },
-    zAxis3D: {
-        type: 'value',
-        max: 1,
-        splitNumber: 2
-    },
-    grid3D: {
-        viewControl: {
-            // projection: 'orthographic'
-        },
-        boxHeight: 40
-    },
-    series: [{
-        type: 'surface',
-        wireframe: {
-            show: false
-        },
-        shading: 'color',
-        equation: {
-            x: {
-                step: 0.05,
-                min: -3,
-                max: 3,
-            },
-            y: {
-                step: 0.05,
-                min: -3,
-                max: 3,
-            },
-            z: function (x, y) {
-                return Math.sin(x * x + y * y) * x / 3.14
-            }
-        }
-    }]
-}
\ No newline at end of file
diff --git a/public/examples/ts/gl/animating-contour-on-globe.js b/public/examples/ts/gl/animating-contour-on-globe.js
new file mode 100644
index 0000000..dac7a49
--- /dev/null
+++ b/public/examples/ts/gl/animating-contour-on-globe.js
@@ -0,0 +1,182 @@
+/*
+title: Animating Contour on Globe
+category: globe
+titleCN: Animating Contour on Globe
+videoStart: 2000
+videoEnd: 6000
+*/
+
+var config = {
+  color: '#c0101a',
+  levels: 1,
+  intensity: 4,
+  threshold: 0.01
+};
+
+var canvas = document.createElement('canvas');
+canvas.width = 4096;
+canvas.height = 2048;
+context = canvas.getContext('2d');
+
+context.lineWidth = 0.5;
+context.strokeStyle = config.color;
+context.fillStyle = config.color;
+context.shadowColor = config.color;
+
+$.when(
+  $.getScript('https://cdn.jsdelivr.net/npm/d3-array@2.8.0/dist/d3-array.js'),
+  $.getScript(
+    'https://cdn.jsdelivr.net/npm/d3-contour@2.0.0/dist/d3-contour.js'
+  ),
+  $.getScript('https://cdn.jsdelivr.net/npm/d3-geo@2.0.1/dist/d3-geo.js'),
+  $.getScript('https://cdn.jsdelivr.net/npm/d3-timer@2.0.0/dist/d3-timer.js')
+).done(function () {
+  image(ROOT_PATH + '/data-gl/asset/bathymetry_bw_composite_4k.jpg').then(
+    function (image) {
+      var m = image.height,
+        n = image.width,
+        values = new Array(n * m),
+        contours = d3.contours().size([n, m]).smooth(true),
+        projection = d3.geoIdentity().scale(canvas.width / n),
+        path = d3.geoPath(projection, context);
+
+      //   StackBlur.R(image, 5);
+
+      for (var j = 0, k = 0; j < m; ++j) {
+        for (var i = 0; i < n; ++i, ++k) {
+          values[k] = image.data[k << 2] / 255;
+        }
+      }
+
+      var opt = {
+        image: canvas
+      };
+
+      var results = [];
+      function update(threshold, levels) {
+        context.clearRect(0, 0, canvas.width, canvas.height);
+        var thresholds = [];
+        for (var i = 0; i < levels; i++) {
+          thresholds.push((threshold + (1 / levels) * i) % 1);
+        }
+        results = contours.thresholds(thresholds)(values);
+        redraw();
+      }
+
+      function redraw() {
+        results.forEach(function (d, idx) {
+          context.beginPath();
+          path(d);
+          context.globalAlpha = 1;
+          context.stroke();
+          if (idx > (config.levels / 5) * 3) {
+            context.globalAlpha = 0.01;
+            context.fill();
+          }
+        });
+        opt.onupdate();
+      }
+      d3.timer(function (t) {
+        var threshold = (t % 10000) / 10000;
+        update(threshold, 1);
+      });
+
+      initCharts(opt);
+
+      update(config.threshold, config.levels);
+    }
+  );
+
+  function image(url) {
+    return new Promise(function (resolve) {
+      var image = new Image();
+      image.src = url;
+      image.crossOrigin = 'Anonymous';
+      image.onload = function () {
+        var canvas = document.createElement('canvas');
+        canvas.width = image.width / 8;
+        canvas.height = image.height / 8;
+        var context = canvas.getContext('2d');
+        context.drawImage(image, 0, 0, canvas.width, canvas.height);
+        resolve(context.getImageData(0, 0, canvas.width, canvas.height));
+      };
+    });
+  }
+
+  function initCharts(opt) {
+    var contourChart = echarts.init(document.createElement('canvas'), null, {
+      width: 4096,
+      height: 2048
+    });
+
+    var img = new echarts.graphic.Image({
+      style: {
+        image: opt.image,
+        x: -1,
+        y: -1,
+        width: opt.image.width + 2,
+        height: opt.image.height + 2
+      }
+    });
+    contourChart.getZr().add(img);
+
+    opt.onupdate = function () {
+      img.dirty();
+    };
+
+    myChart.setOption({
+      backgroundColor: '#000',
+      globe: {
+        environment: ROOT_PATH + '/data-gl/asset/starfield.jpg',
+
+        heightTexture:
+          ROOT_PATH + '/data-gl/asset/bathymetry_bw_composite_4k.jpg',
+
+        displacementScale: 0.05,
+        displacementQuality: 'high',
+
+        baseColor: '#000',
+
+        shading: 'realistic',
+        realisticMaterial: {
+          roughness: 0.2,
+          metalness: 0
+        },
+
+        postEffect: {
+          enable: true,
+          depthOfField: {
+            // enable: true
+          }
+        },
+        light: {
+          ambient: {
+            intensity: 0
+          },
+          main: {
+            intensity: 0.1,
+            shadow: false
+          },
+          ambientCubemap: {
+            texture: ROOT_PATH + '/data-gl/asset/lake.hdr',
+            exposure: 1,
+            diffuseIntensity: 0.5,
+            specularIntensity: 2
+          }
+        },
+        viewControl: {
+          autoRotate: false
+        },
+
+        layers: [
+          {
+            type: 'blend',
+            blendTo: 'emission',
+            texture: contourChart,
+            intensity: config.intensity
+          }
+        ]
+      }
+    });
+  }
+});
diff --git a/public/examples/ts/gl/bar3d-dataset.js b/public/examples/ts/gl/bar3d-dataset.js
new file mode 100644
index 0000000..0153ca2
--- /dev/null
+++ b/public/examples/ts/gl/bar3d-dataset.js
@@ -0,0 +1,51 @@
+/*
+title: 3D Bar with Dataset
+category: bar3D
+titleCN: 使用 dataset 为三维柱状图设置数据
+*/
+
+$.get(
+  ROOT_PATH + '/data/asset/data/life-expectancy-table.json',
+  function (data) {
+    option = {
+      grid3D: {},
+      tooltip: {},
+      xAxis3D: {
+        type: 'category'
+      },
+      yAxis3D: {
+        type: 'category'
+      },
+      zAxis3D: {},
+      visualMap: {
+        max: 1e8,
+        dimension: 'Population'
+      },
+      dataset: {
+        dimensions: [
+          'Income',
+          'Life Expectancy',
+          'Population',
+          'Country',
+          { name: 'Year', type: 'ordinal' }
+        ],
+        source: data
+      },
+      series: [
+        {
+          type: 'bar3D',
+          // symbolSize: symbolSize,
+          shading: 'lambert',
+          encode: {
+            x: 'Year',
+            y: 'Country',
+            z: 'Life Expectancy',
+            tooltip: [0, 1, 2, 3, 4]
+          }
+        }
+      ]
+    };
+
+    myChart.setOption(option);
+  }
+);
diff --git a/public/examples/ts/gl/bar3d-global-population.js b/public/examples/ts/gl/bar3d-global-population.js
new file mode 100644
index 0000000..d234396
--- /dev/null
+++ b/public/examples/ts/gl/bar3d-global-population.js
@@ -0,0 +1,109 @@
+/*
+title: Bar3D - Global Population
+category: bar3D
+titleCN: Bar3D - Global Population
+*/
+
+$.getJSON(ROOT_PATH + '/data-gl/asset/data/population.json', function (data) {
+  data = data
+    .filter(function (dataItem) {
+      return dataItem[2] > 0;
+    })
+    .map(function (dataItem) {
+      return [dataItem[0], dataItem[1], Math.sqrt(dataItem[2])];
+    });
+
+  myChart.setOption({
+    backgroundColor: '#cdcfd5',
+    geo3D: {
+      map: 'world',
+      shading: 'lambert',
+      light: {
+        main: {
+          intensity: 5,
+          shadow: true,
+          shadowQuality: 'high',
+          alpha: 30
+        },
+        ambient: {
+          intensity: 0
+        },
+        ambientCubemap: {
+          texture: 'data-gl/asset/canyon.hdr',
+          exposure: 1,
+          diffuseIntensity: 0.5
+        }
+      },
+      viewControl: {
+        distance: 50,
+        panMouseButton: 'left',
+        rotateMouseButton: 'right'
+      },
+      groundPlane: {
+        show: true,
+        color: '#999'
+      },
+      postEffect: {
+        enable: true,
+        bloom: {
+          enable: false
+        },
+        SSAO: {
+          radius: 1,
+          intensity: 1,
+          enable: true
+        },
+        depthOfField: {
+          enable: false,
+          focalRange: 10,
+          blurRadius: 10,
+          fstop: 1
+        }
+      },
+      temporalSuperSampling: {
+        enable: true
+      },
+      itemStyle: {},
+
+      regionHeight: 2
+    },
+    visualMap: {
+      max: 40,
+      calculable: true,
+      realtime: false,
+      inRange: {
+        color: [
+          '#313695',
+          '#4575b4',
+          '#74add1',
+          '#abd9e9',
+          '#e0f3f8',
+          '#ffffbf',
+          '#fee090',
+          '#fdae61',
+          '#f46d43',
+          '#d73027',
+          '#a50026'
+        ]
+      },
+      outOfRange: {
+        colorAlpha: 0
+      }
+    },
+    series: [
+      {
+        type: 'bar3D',
+        coordinateSystem: 'geo3D',
+        shading: 'lambert',
+        data: data,
+        barSize: 0.1,
+        minHeight: 0.2,
+        silent: true,
+        itemStyle: {
+          color: 'orange'
+          // opacity: 0.8
+        }
+      }
+    ]
+  });
+});
diff --git a/public/examples/ts/gl/bar3d-mapbox-view-change.js b/public/examples/ts/gl/bar3d-mapbox-view-change.js
new file mode 100644
index 0000000..befb244
--- /dev/null
+++ b/public/examples/ts/gl/bar3d-mapbox-view-change.js
@@ -0,0 +1,118 @@
+/*
+title: Mapbox 视角切换
+category: bar3D
+titleCN: Mapbox 视角切换
+*/
+
+mapboxgl.accessToken = mapboxglToken;
+
+$.getJSON(ROOT_PATH + '/data-gl/asset/data/population.json', function (data) {
+  data = data
+    .filter(function (dataItem) {
+      return dataItem[2] > 0;
+    })
+    .map(function (dataItem) {
+      return [dataItem[0], dataItem[1], dataItem[2]];
+    });
+
+  myChart.setOption({
+    title: {
+      text: '空格键切换视角',
+      left: 'center'
+    },
+    visualMap: {
+      show: false,
+      max: 1000,
+      calculable: true,
+      realtime: false,
+      inRange: {
+        color: [
+          '#313695',
+          '#4575b4',
+          '#74add1',
+          '#abd9e9',
+          '#e0f3f8',
+          '#ffffbf',
+          '#fee090',
+          '#fdae61',
+          '#f46d43',
+          '#d73027',
+          '#a50026'
+        ]
+      },
+      outOfRange: {
+        colorAlpha: 0
+      }
+    },
+    mapbox: {
+      center: [104.114129, 37.550339],
+      zoom: 3,
+      pitch: 50,
+      bearing: -10,
+      style: 'mapbox://styles/mapbox/light-v9',
+      boxHeight: 20,
+      // altitudeScale: 3e2,
+      postEffect: {
+        enable: true,
+        SSAO: {
+          enable: true,
+          radius: 2
+        }
+      },
+      light: {
+        main: {
+          intensity: 2,
+          shadow: true,
+          shadowQuality: 'high'
+        },
+        ambient: {
+          intensity: 0
+        },
+        ambientCubemap: {
+          texture: ROOT_PATH + '/data-gl/asset/canyon.hdr',
+          exposure: 2,
+          diffuseIntensity: 0.5
+        }
+      }
+    },
+    series: [
+      {
+        type: 'bar3D',
+        coordinateSystem: 'mapbox',
+        shading: 'lambert',
+        minHeight: 0.1,
+        barSize: 0.3,
+        data: data,
+        silent: true
+      }
+    ]
+  });
+
+  function top() {
+    myChart.setOption({
+      mapbox: {
+        pitch: 0,
+        bearing: 0,
+        boxHeight: 0
+      }
+    });
+  }
+
+  function perspective() {
+    myChart.setOption({
+      mapbox: {
+        pitch: 50,
+        bearing: -10,
+        boxHeight: 20
+      }
+    });
+  }
+
+  var isPerspective = true;
+  window.addEventListener('keydown', function (e) {
+    if (e.keyCode === 32) {
+      isPerspective ? top() : perspective();
+      isPerspective = !isPerspective;
+    }
+  });
+});
diff --git a/public/examples/ts/gl/bar3d-music-visualization.js b/public/examples/ts/gl/bar3d-music-visualization.js
new file mode 100644
index 0000000..52b5d98
--- /dev/null
+++ b/public/examples/ts/gl/bar3d-music-visualization.js
@@ -0,0 +1,161 @@
+/*
+title: Music Visualization
+category: bar3D
+titleCN: Music Visualization
+*/
+
+var UPDATE_DURATION = 100;
+
+window.AudioContext = window.AudioContext || window.webkitAudioContext;
+
+var audioContext = new AudioContext();
+
+var oReq = new XMLHttpRequest();
+oReq.open('GET', ROOT_PATH + '/data/asset/sound/roll-it-up.mp3', true);
+oReq.responseType = 'arraybuffer';
+
+oReq.onload = function (e) {
+  audioContext.decodeAudioData(oReq.response, initVisualizer);
+};
+oReq.send();
+
+function initVisualizer(audioBuffer) {
+  inited = true;
+
+  var source = audioContext.createBufferSource();
+  source.buffer = audioBuffer;
+
+  // Must invoked right after click event
+  if (source.noteOn) {
+    source.noteOn(0);
+  } else {
+    source.start(0);
+  }
+
+  var analyzer = audioContext.createAnalyser();
+  var gainNode = audioContext.createGain();
+  analyzer.fftSize = 4096;
+
+  gainNode.gain.value = 1;
+  source.connect(gainNode);
+  gainNode.connect(analyzer);
+  analyzer.connect(audioContext.destination);
+
+  var frequencyBinCount = analyzer.frequencyBinCount;
+  var dataArray = new Uint8Array(frequencyBinCount);
+
+  var beta = 0;
+  function update() {
+    analyzer.getByteFrequencyData(dataArray);
+
+    var item = [];
+    var size = 50;
+    var dataProvider = [];
+
+    for (var i = 0; i < size * size; i++) {
+      var x = i % size;
+      var y = Math.floor(i / size);
+      var dx = x - size / 2;
+      var dy = y - size / 2;
+
+      var angle = Math.atan2(dy, dx);
+      if (angle < 0) {
+        angle = Math.PI * 2 + angle;
+      }
+      var dist = Math.sqrt(dx * dx + dy * dy);
+      var idx = Math.min(
+        frequencyBinCount - 1,
+        Math.round((angle / Math.PI / 2) * 60 + dist * 60) + 100
+      );
+
+      var val = Math.pow(dataArray[idx] / 100, 3);
+      dataProvider.push([x, y, Math.max(val, 0.1)]);
+    }
+
+    myChart.setOption({
+      grid3D: {
+        viewControl: {
+          beta: beta,
+          alpha:
+            ((Math.sin(beta / 10 + 40) * ((beta % 10) + 5)) / 15) * 30 + 30,
+          distance:
+            ((Math.cos(beta / 50 + 20) * ((beta % 10) + 5)) / 15) * 50 + 80,
+          animationDurationUpdate: UPDATE_DURATION,
+          animationEasingUpdate: 'linear'
+        }
+      },
+      series: [
+        {
+          data: dataProvider
+        }
+      ]
+    });
+    beta += 2;
+
+    setTimeout(update, UPDATE_DURATION);
+  }
+
+  update();
+}
+
+option = {
+  tooltip: {},
+  visualMap: {
+    show: false,
+    min: 0.1,
+    max: 4,
+    inRange: {
+      color: ['#010103', '#2f490c', '#b0b70f', '#fdff44', '#fff']
+    }
+  },
+  xAxis3D: {
+    type: 'value'
+  },
+  yAxis3D: {
+    type: 'value'
+  },
+  zAxis3D: {
+    type: 'value',
+    min: -6,
+    max: 6
+  },
+  grid3D: {
+    show: false,
+    environment: '#000',
+    viewControl: {
+      distance: 100
+    },
+    postEffect: {
+      enable: true,
+      FXAA: {
+        enable: true
+      }
+    },
+    light: {
+      main: {
+        shadow: true,
+        intensity: 10,
+        quality: 'high'
+      },
+      ambientCubemap: {
+        texture: ROOT_PATH + '/data-gl/asset/canyon.hdr',
+        exposure: 0,
+        diffuseIntensity: 0.2
+      }
+    }
+  },
+  series: [
+    {
+      type: 'bar3D',
+      silent: true,
+      shading: 'lambert',
+      data: [],
+      barSize: 1,
+      lineStyle: {
+        width: 4
+      },
+      // animation: false,
+      animationDurationUpdate: UPDATE_DURATION
+    }
+  ]
+};
diff --git a/public/examples/ts/gl/bar3d-myth.js b/public/examples/ts/gl/bar3d-myth.js
new file mode 100644
index 0000000..137bf79
--- /dev/null
+++ b/public/examples/ts/gl/bar3d-myth.js
@@ -0,0 +1,107 @@
+/*
+title: 星云
+category: bar3D
+titleCN: 星云
+*/
+
+var img = new Image();
+var canvas = document.createElement('canvas');
+var ctx = canvas.getContext('2d');
+
+img.onload = function () {
+  var width = (canvas.width = img.width);
+  var height = (canvas.height = img.height);
+  ctx.drawImage(img, 0, 0, width, height);
+  var imgData = ctx.getImageData(0, 0, width, height);
+
+  var data = new Float32Array((imgData.data.length / 4) * 3);
+  var off = 0;
+  for (var i = 0; i < imgData.data.length / 4; i++) {
+    var r = imgData.data[i * 4];
+    var g = imgData.data[i * 4 + 1];
+    var b = imgData.data[i * 4 + 2];
+
+    var lum = 0.2125 * r + 0.7154 * g + 0.0721 * b;
+    lum = (lum - 125) / 4 + 50;
+
+    data[off++] = i % width;
+    data[off++] = height - Math.floor(i / width);
+    data[off++] = lum;
+  }
+
+  myChart.setOption(
+    (option = {
+      tooltip: {},
+      backgroundColor: '#fff',
+      xAxis3D: {
+        type: 'value'
+      },
+      yAxis3D: {
+        type: 'value'
+      },
+      zAxis3D: {
+        type: 'value',
+        min: 0,
+        max: 100
+      },
+      grid3D: {
+        show: false,
+        viewControl: {
+          alpha: 70,
+          beta: 0
+        },
+        postEffect: {
+          enable: true,
+          depthOfField: {
+            enable: true,
+            blurRadius: 4,
+            fstop: 10
+          }
+          // SSAO: {
+          //     enable: true
+          // }
+        },
+        boxDepth: 100,
+        boxHeight: 20,
+        environment: ROOT_PATH + '/data-gl/asset/starfield.jpg',
+        light: {
+          main: {
+            shadow: true,
+            intensity: 2
+          },
+          ambientCubemap: {
+            texture: ROOT_PATH + '/data-gl/asset/canyon.hdr',
+            exposure: 2,
+            diffuseIntensity: 0.2
+          }
+        }
+      },
+      series: [
+        {
+          type: 'bar3D',
+          shading: 'lambert',
+          barSize: 0.8,
+          silent: true,
+          dimensions: ['x', 'y', 'z'],
+          itemStyle: {
+            color: function (params) {
+              var i = params.dataIndex;
+              var r = imgData.data[i * 4] / 255;
+              var g = imgData.data[i * 4 + 1] / 255;
+              var b = imgData.data[i * 4 + 2] / 255;
+              var lum = 0.2125 * r + 0.7154 * g + 0.0721 * b;
+              r *= lum * 2;
+              g *= lum * 2;
+              b *= lum * 2;
+              return [r, g, b, 1];
+            }
+          },
+          data: data
+        }
+      ]
+    })
+  );
+};
+
+img.src = ROOT_PATH + '/data-gl/asset/sample.jpg';
+img.crossOrigin = 'Anonymous';
diff --git a/public/examples/ts/gl/bar3d-noise-modified-from-marpi-demo.js b/public/examples/ts/gl/bar3d-noise-modified-from-marpi-demo.js
new file mode 100644
index 0000000..a0db195
--- /dev/null
+++ b/public/examples/ts/gl/bar3d-noise-modified-from-marpi-demo.js
@@ -0,0 +1,216 @@
+/*
+title: Noise modified from marpi's demo
+category: bar3D
+titleCN: Noise modified from marpi's demo
+*/
+
+$.getScript(
+  'https://cdn.jsdelivr.net/npm/simplex-noise@2.4.0/simplex-noise.js'
+).done(function () {
+  var simplex = new SimplexNoise();
+
+  window.onresize = myChart.resize;
+
+  var UPDATE_DURATION = 1000;
+
+  function initVisualizer() {
+    var config = {
+      numWaves: 2,
+      randomize: randomize,
+      color1: '#000',
+      color2: '#300',
+      color3: '#fff',
+      size: 150,
+      roughness: 0.5,
+      metalness: 0
+    };
+
+    //gui.add(config, "numWaves", 1, 3).name("Waves number").onChange(update).listen();
+    for (var i = 0; i < 2; i++) {
+      config['wave' + i + 'axis' + 'x'] = Math.random();
+      config['wave' + i + 'axis' + 'y'] = Math.random();
+      config['wave' + i + 'rounding'] = Math.random();
+      config['wave' + i + 'square'] = Math.random();
+    }
+
+    function randomize() {
+      //config.numWaves = Math.floor(Math.random() * 3) + 1;
+      for (var i = 0; i < 2; i++) {
+        config['wave' + i + 'axis' + 'x'] = Math.random();
+        config['wave' + i + 'axis' + 'y'] = Math.random();
+        config['wave' + i + 'rounding'] = Math.random();
+        config['wave' + i + 'square'] = Math.random();
+      }
+
+      // Iterate over all controllers
+      for (var i in gui.__controllers) {
+        gui.__controllers[i].updateDisplay();
+      }
+      update();
+    }
+
+    function update() {
+      var item = [];
+      var dataProvider = [];
+
+      var mod = 0.1;
+
+      //config.numWaves = Math.round(config.numWaves)
+
+      //var occurenceR = Math.random() * .02
+      //var r = 0//Math.random()
+      for (var s = 0; s < config.size * config.size; s++) {
+        var x = s % config.size;
+        var y = Math.floor(s / config.size);
+
+        //if (Math.random() < occurenceR)
+        //    r = Math.random()
+
+        var output = 0;
+        for (var i = 0; i < config.numWaves; i++) {
+          var n = simplex.noise2D(
+            i * 213 +
+              (-50 + x) * mod * (1 - config['wave' + i + 'axis' + 'x']) * 0.5,
+            i * 3124 +
+              (-50 + y) * mod * (1 - config['wave' + i + 'axis' + 'y']) * 0.5
+          );
+          n = Math.pow(n, 1.95 - 1.9 * config['wave' + i + 'rounding']);
+          var square = Math.floor((1.1 - config['wave' + i + 'square']) * 100);
+          n = Math.round(n * square) / square;
+          //output*=n
+          if (output < n) output = n;
+        }
+        dataProvider.push([x, y, (output + 0.1) * 2]);
+      }
+
+      myChart.setOption({
+        visualMap: {
+          inRange: {
+            barSize: 100 / config.size,
+            color: [config.color1, config.color2, config.color3]
+          }
+        },
+        series: [
+          {
+            data: dataProvider,
+            realisticMaterial: {
+              roughness: config.roughness,
+              metalness: config.metalness
+            }
+          }
+        ]
+      });
+      //setTimeout(update, UPDATE_DURATION);
+    }
+
+    update();
+  }
+  var focalRange = 40;
+  var blurRadius = 4;
+
+  myChart.setOption(
+    (option = {
+      toolbox: {
+        left: 20,
+        iconStyle: {
+          normal: {
+            borderColor: '#fff'
+          }
+        }
+      },
+      tooltip: {},
+      visualMap: {
+        show: false,
+        min: 0.1,
+        max: 2.5,
+        inRange: {
+          color: ['#000', '#300', '#fff']
+        }
+      },
+      xAxis3D: {
+        type: 'value'
+      },
+      yAxis3D: {
+        type: 'value'
+      },
+      zAxis3D: {
+        type: 'value',
+        min: -6,
+        max: 6
+      },
+      grid3D: {
+        show: false,
+        environment: '#000',
+        viewControl: {
+          distance: 100,
+          maxDistance: 150,
+          minDistance: 50,
+          alpha: 38,
+          beta: 220,
+          minAlpha: 10
+          //maxBeta: 360,
+        },
+        postEffect: {
+          enable: true,
+          SSAO: {
+            enable: true,
+            intensity: 1.3,
+            radius: 5
+          },
+          screenSpaceReflection: {
+            enable: false
+          },
+          depthOfField: {
+            enable: true,
+            blurRadius: blurRadius,
+            focalRange: focalRange,
+            focalDistance: 70
+          }
+        },
+        light: {
+          main: {
+            intensity: 1,
+            shadow: true,
+            shadowQuality: 'high',
+            alpha: 30
+          },
+          ambient: {
+            intensity: 0
+          },
+          ambientCubemap: {
+            texture: ROOT_PATH + '/data-gl/asset/pisa.hdr',
+            exposure: 2,
+            diffuseIntensity: 1,
+            specularIntensity: 1
+          }
+        }
+      },
+      series: [
+        {
+          type: 'bar3D',
+          silent: true,
+          shading: 'realistic',
+          realisticMaterial: {
+            roughness: 0.5,
+            metalness: 0
+          },
+          instancing: true,
+          barSize: 0.6,
+          data: [],
+          lineStyle: {
+            width: 4
+          },
+          itemStyle: {
+            color: '#fff'
+          },
+          animation: false,
+          animationDurationUpdate: UPDATE_DURATION
+        }
+      ]
+    })
+  );
+
+  setTimeout(function () {
+    initVisualizer();
+  });
+});
diff --git a/public/examples/ts/gl/bar3d-on-mapbox.js b/public/examples/ts/gl/bar3d-on-mapbox.js
new file mode 100644
index 0000000..4bd5148
--- /dev/null
+++ b/public/examples/ts/gl/bar3d-on-mapbox.js
@@ -0,0 +1,86 @@
+/*
+title: Bar3D on Mapbox
+category: bar3D
+titleCN: Bar3D on Mapbox
+*/
+
+mapboxgl.accessToken =
+  'pk.eyJ1IjoicGlzc2FuZyIsImEiOiJjaXBnaGYxcW8wMDFodWNtNDc4NzdqMWR2In0.4XUWeduDltiCbsIiS-U8Lg';
+
+$.getJSON(ROOT_PATH + '/data-gl/asset/data/population.json', function (data) {
+  data = data
+    .filter(function (dataItem) {
+      return dataItem[2] > 0;
+    })
+    .map(function (dataItem) {
+      return [dataItem[0], dataItem[1], dataItem[2]];
+    });
+
+  myChart.setOption({
+    visualMap: {
+      show: false,
+      max: 1000,
+      calculable: true,
+      realtime: false,
+      inRange: {
+        color: [
+          '#313695',
+          '#4575b4',
+          '#74add1',
+          '#abd9e9',
+          '#e0f3f8',
+          '#ffffbf',
+          '#fee090',
+          '#fdae61',
+          '#f46d43',
+          '#d73027',
+          '#a50026'
+        ]
+      },
+      outOfRange: {
+        colorAlpha: 0
+      }
+    },
+    mapbox: {
+      center: [104.114129, 37.550339],
+      zoom: 3,
+      pitch: 50,
+      bearing: -10,
+      style: 'mapbox://styles/mapbox/light-v9',
+      altitudeScale: 3e2,
+      postEffect: {
+        enable: true,
+        SSAO: {
+          enable: true,
+          radius: 2
+        }
+      },
+      light: {
+        main: {
+          intensity: 2,
+          shadow: true,
+          shadowQuality: 'high'
+        },
+        ambient: {
+          intensity: 0
+        },
+        ambientCubemap: {
+          texture: ROOT_PATH + '/asset/canyon.hdr',
+          exposure: 2,
+          diffuseIntensity: 0.5
+        }
+      }
+    },
+    series: [
+      {
+        type: 'bar3D',
+        coordinateSystem: 'mapbox',
+        shading: 'lambert',
+        minHeight: 0.1,
+        barSize: 0.3,
+        data: data,
+        silent: true
+      }
+    ]
+  });
+});
diff --git a/public/data-gl/bar3d-punch-card.js b/public/examples/ts/gl/bar3d-punch-card.js
similarity index 61%
rename from public/data-gl/bar3d-punch-card.js
rename to public/examples/ts/gl/bar3d-punch-card.js
index c9b37af..255987b 100644
--- a/public/data-gl/bar3d-punch-card.js
+++ b/public/examples/ts/gl/bar3d-punch-card.js
@@ -4,72 +4,89 @@ category: bar3D
 titleCN: Bar3D - Punch Card
 */
 
-
+// prettier-ignore
 var hours = ['12a', '1a', '2a', '3a', '4a', '5a', '6a',
         '7a', '8a', '9a','10a','11a',
         '12p', '1p', '2p', '3p', '4p', '5p',
         '6p', '7p', '8p', '9p', '10p', '11p'];
+
+// prettier-ignore
 var days = ['Saturday', 'Friday', 'Thursday',
         'Wednesday', 'Tuesday', 'Monday', 'Sunday'];
 
+// prettier-ignore
 var data = [[0,0,5],[0,1,1],[0,2,0],[0,3,0],[0,4,0],[0,5,0],[0,6,0],[0,7,0],[0,8,0],[0,9,0],[0,10,0],[0,11,2],[0,12,4],[0,13,1],[0,14,1],[0,15,3],[0,16,4],[0,17,6],[0,18,4],[0,19,4],[0,20,3],[0,21,3],[0,22,2],[0,23,5],[1,0,7],[1,1,0],[1,2,0],[1,3,0],[1,4,0],[1,5,0],[1,6,0],[1,7,0],[1,8,0],[1,9,0],[1,10,5],[1,11,2],[1,12,2],[1,13,6],[1,14,9],[1,15,11],[1,16,6],[1,17,7],[1,18,8],[1,19,12],[1,20,5],[1,21,5],[1,22,7],[1,23,2],[2,0,1],[2,1,1],[2,2,0],[2,3,0],[2,4,0],[2,5,0],[2,6,0],[2,7,0],[2 [...]
 option = {
-    tooltip: {},
-    visualMap: {
-        max: 20,
-        inRange: {
-            color: ['#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf', '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026']
-        }
-    },
-    xAxis3D: {
-        type: 'category',
-        data: hours
-    },
-    yAxis3D: {
-        type: 'category',
-        data: days
-    },
-    zAxis3D: {
-        type: 'value'
+  tooltip: {},
+  visualMap: {
+    max: 20,
+    inRange: {
+      color: [
+        '#313695',
+        '#4575b4',
+        '#74add1',
+        '#abd9e9',
+        '#e0f3f8',
+        '#ffffbf',
+        '#fee090',
+        '#fdae61',
+        '#f46d43',
+        '#d73027',
+        '#a50026'
+      ]
+    }
+  },
+  xAxis3D: {
+    type: 'category',
+    data: hours
+  },
+  yAxis3D: {
+    type: 'category',
+    data: days
+  },
+  zAxis3D: {
+    type: 'value'
+  },
+  grid3D: {
+    boxWidth: 200,
+    boxDepth: 80,
+    viewControl: {
+      // projection: 'orthographic'
     },
-    grid3D: {
-        boxWidth: 200,
-        boxDepth: 80,
-        viewControl: {
-            // projection: 'orthographic'
-        },
-        light: {
-            main: {
-                intensity: 1.2,
-                shadow: true
-            },
-            ambient: {
-                intensity: 0.3
-            }
-        }
-    },
-    series: [{
-        type: 'bar3D',
-        data: data.map(function (item) {
-            return {
-                value: [item[1], item[0], item[2]],
-            }
-        }),
-        shading: 'lambert',
+    light: {
+      main: {
+        intensity: 1.2,
+        shadow: true
+      },
+      ambient: {
+        intensity: 0.3
+      }
+    }
+  },
+  series: [
+    {
+      type: 'bar3D',
+      data: data.map(function (item) {
+        return {
+          value: [item[1], item[0], item[2]]
+        };
+      }),
+      shading: 'lambert',
 
+      label: {
+        fontSize: 16,
+        borderWidth: 1
+      },
+
+      emphasis: {
         label: {
-            fontSize: 16,
-            borderWidth: 1
+          fontSize: 20,
+          color: '#900'
         },
-
-        emphasis: {
-            label: {
-                fontSize: 20,
-                color: '#900'
-            },
-            itemStyle: {
-                color: '#900'
-            }
+        itemStyle: {
+          color: '#900'
         }
-    }]
-}
\ No newline at end of file
+      }
+    }
+  ]
+};
diff --git a/public/examples/ts/gl/bar3d-shanghai.js b/public/examples/ts/gl/bar3d-shanghai.js
new file mode 100644
index 0000000..0543425
--- /dev/null
+++ b/public/examples/ts/gl/bar3d-shanghai.js
@@ -0,0 +1,84 @@
+/*
+title: 上海房价可视化 GL 版
+category: bar3D
+titleCN: 上海房价可视化 GL 版
+*/
+
+var uploadedDataURL =
+  ROOT_PATH + '/asset/get/s/data-1495284690309-Bk9Ro3Te-.json';
+mapboxgl.accessToken = mapboxglToken;
+
+myChart.showLoading();
+
+$.getJSON(uploadedDataURL, function (linedata) {
+  myChart.hideLoading();
+
+  myChart.setOption({
+    visualMap: {
+      show: false,
+      calculable: true,
+      realtime: false,
+      inRange: {
+        color: [
+          '#313695',
+          '#4575b4',
+          '#74add1',
+          '#abd9e9',
+          '#e0f3f8',
+          '#ffffbf',
+          '#fee090',
+          '#fdae61',
+          '#f46d43',
+          '#d73027',
+          '#a50026'
+        ]
+      },
+      outOfRange: {
+        colorAlpha: 0
+      },
+      max: linedata[1]
+    },
+    mapbox: {
+      center: [121.4693, 31.12307],
+      zoom: 10,
+      pitch: 50,
+      bearing: -10,
+      style: 'mapbox://styles/mapbox/light-v9',
+      boxHeight: 50,
+      // altitudeScale: 3e2,
+      postEffect: {
+        enable: true,
+        SSAO: {
+          enable: true,
+          radius: 2,
+          intensity: 1.5
+        }
+      },
+      light: {
+        main: {
+          intensity: 1,
+          shadow: true,
+          shadowQuality: 'high'
+        },
+        ambient: {
+          intensity: 0
+        },
+        ambientCubemap: {
+          texture: ROOT_PATH + '/data-gl/asset/canyon.hdr',
+          exposure: 1,
+          diffuseIntensity: 0.5
+        }
+      }
+    },
+    series: [
+      {
+        type: 'bar3D',
+        shading: 'realistic',
+        coordinateSystem: 'mapbox',
+        barSize: 0.2,
+        silent: true,
+        data: linedata[0]
+      }
+    ]
+  });
+});
diff --git a/public/examples/ts/gl/bar3d-simplex-noise.js b/public/examples/ts/gl/bar3d-simplex-noise.js
new file mode 100644
index 0000000..39788c9
--- /dev/null
+++ b/public/examples/ts/gl/bar3d-simplex-noise.js
@@ -0,0 +1,94 @@
+/*
+title: Bar3D - Simplex Noise
+category: bar3D
+titleCN: Bar3D - Simplex Noise
+theme: dark
+*/
+
+$.getScript(
+  'https://cdn.jsdelivr.net/npm/simplex-noise@2.4.0/simplex-noise.js'
+).done(function () {
+  var noise = new SimplexNoise(Math.random);
+  function generateData(theta, min, max) {
+    var data = [];
+    for (var i = 0; i <= 50; i++) {
+      for (var j = 0; j <= 50; j++) {
+        var value = noise.noise2D(i / 20, j / 20);
+        valMax = Math.max(valMax, value);
+        valMin = Math.min(valMin, value);
+        data.push([i, j, value * 2 + 4]);
+      }
+    }
+    return data;
+  }
+  var valMin = Infinity;
+  var valMax = -Infinity;
+  var data = generateData(2, -5, 5);
+  console.log(valMin, valMax);
+
+  myChart.setOption(
+    (option = {
+      visualMap: {
+        show: false,
+        min: 2,
+        max: 6,
+        inRange: {
+          color: [
+            '#313695',
+            '#4575b4',
+            '#74add1',
+            '#abd9e9',
+            '#e0f3f8',
+            '#ffffbf',
+            '#fee090',
+            '#fdae61',
+            '#f46d43',
+            '#d73027',
+            '#a50026'
+          ]
+        }
+      },
+      xAxis3D: {
+        type: 'value'
+      },
+      yAxis3D: {
+        type: 'value'
+      },
+      zAxis3D: {
+        type: 'value',
+        max: 10,
+        min: 0
+      },
+      grid3D: {
+        axisLine: {
+          lineStyle: { color: '#fff' }
+        },
+        axisPointer: {
+          lineStyle: { color: '#fff' }
+        },
+        viewControl: {
+          // autoRotate: true
+        },
+        light: {
+          main: {
+            shadow: true,
+            quality: 'ultra',
+            intensity: 1.5
+          }
+        }
+      },
+      series: [
+        {
+          type: 'bar3D',
+          data: data,
+          shading: 'lambert',
+          label: {
+            formatter: function (param) {
+              return param.value[2].toFixed(1);
+            }
+          }
+        }
+      ]
+    })
+  );
+});
diff --git a/public/examples/ts/gl/bar3d-voxelize-image.js b/public/examples/ts/gl/bar3d-voxelize-image.js
new file mode 100644
index 0000000..fcb2ecb
--- /dev/null
+++ b/public/examples/ts/gl/bar3d-voxelize-image.js
@@ -0,0 +1,175 @@
+/*
+title: Voxelize image
+category: bar3D
+titleCN: Voxelize image
+*/
+
+var canvas = document.createElement('canvas');
+var ctx = canvas.getContext('2d');
+
+var imgData;
+var currentImg;
+
+// Configurations
+var config = {
+  scale: 0.3,
+  roughness: 0,
+  metalness: 1,
+  projection: 'orthographic',
+  depthOfField: 4,
+  lockY: false,
+  move: true,
+  sameColor: false,
+  color: '#777',
+  colorContrast: 1.2,
+  lightIntensity: 1,
+  lightColor: '#fff',
+  lightRotate: 30,
+  lightPitch: 40,
+  AO: 1.5,
+  showEnvironment: false,
+
+  barNumber: 80,
+  barBevel: 0.18,
+  barSize: 1.2
+};
+
+option = {
+  tooltip: {},
+  backgroundColor: '#000',
+  xAxis3D: {
+    type: 'value'
+  },
+  yAxis3D: {
+    type: 'value'
+  },
+  zAxis3D: {
+    type: 'value',
+    min: 0,
+    max: 100
+  },
+  grid3D: {
+    show: false,
+    viewControl: {
+      projection: 'perspective',
+      alpha: 45,
+      beta: -45,
+      panSensitivity: config.move ? 1 : 0,
+      rotateSensitivity: config.lockY ? [1, 0] : 1,
+      damping: 0.9,
+      distance: 60
+    },
+    postEffect: {
+      enable: true,
+      bloom: {
+        intensity: 0.2
+      },
+      screenSpaceAmbientOcclusion: {
+        enable: true,
+        intensity: 1.5,
+        radius: 5,
+        quality: 'high'
+      },
+      screenSpaceReflection: {
+        enable: true
+      },
+      depthOfField: {
+        enable: true,
+        blurRadius: config.depthOfField,
+        fstop: 10,
+        focalDistance: 55
+      }
+    },
+    boxDepth: 100,
+    boxHeight: 20,
+    environment: 'none',
+    light: {
+      main: {
+        shadow: true,
+        intensity: 2
+      },
+      ambientCubemap: {
+        texture: ROOT_PATH + '/data-gl/asset/pisa.hdr',
+        exposure: 2,
+        diffuseIntensity: 0.2,
+        specularIntensity: 1.5
+      }
+    }
+  }
+};
+
+function updateData(pixelData, width, height) {
+  console.time('update');
+  var data = new Float32Array((pixelData.length / 4) * 3);
+  var off = 0;
+  for (var i = 0; i < pixelData.length / 4; i++) {
+    var r = pixelData[i * 4];
+    var g = pixelData[i * 4 + 1];
+    var b = pixelData[i * 4 + 2];
+
+    var lum = 0.2125 * r + 0.7154 * g + 0.0721 * b;
+    lum = (lum - 125) * config.scale + 50;
+    data[off++] = i % width;
+    data[off++] = height - Math.floor(i / width);
+    data[off++] = lum;
+  }
+
+  myChart.setOption({
+    grid3D: {
+      boxWidth: (100 / height) * width
+    },
+    series: [
+      {
+        animation: false,
+        type: 'bar3D',
+        shading: 'realistic',
+        realisticMaterial: {
+          roughness: config.roughness,
+          metalness: config.metalness
+        },
+        barSize: config.barSize,
+        bevelSize: config.barBevel,
+        silent: true,
+        dimensions: ['x', 'y', 'z'],
+        itemStyle: {
+          color: config.sameColor
+            ? config.color
+            : function (params) {
+                var i = params.dataIndex;
+                var r = pixelData[i * 4] / 255;
+                var g = pixelData[i * 4 + 1] / 255;
+                var b = pixelData[i * 4 + 2] / 255;
+                var lum = 0.2125 * r + 0.7154 * g + 0.0721 * b;
+                r *= lum * config.colorContrast;
+                g *= lum * config.colorContrast;
+                b *= lum * config.colorContrast;
+                return [r, g, b, 1];
+              }
+        },
+        data: data
+      }
+    ]
+  });
+
+  console.timeEnd('update');
+}
+
+function loadImage(img) {
+  var height = (canvas.height = Math.min(config.barNumber, img.height));
+  var aspect = img.width / img.height;
+  var width = (canvas.width = Math.round(height * aspect));
+
+  ctx.drawImage(img, 0, 0, width, height);
+
+  imgData = ctx.getImageData(0, 0, width, height);
+
+  updateData(imgData.data, width, height);
+}
+
+// Default
+var img = new Image();
+img.onload = function () {
+  loadImage(img);
+  currentImg = img;
+};
+img.src = ROOT_PATH + '/data-gl/asset/bitcoin.png';
diff --git a/public/examples/ts/gl/flowGL-noise.js b/public/examples/ts/gl/flowGL-noise.js
new file mode 100644
index 0000000..11810a4
--- /dev/null
+++ b/public/examples/ts/gl/flowGL-noise.js
@@ -0,0 +1,125 @@
+/*
+title: Flow on the cartesian
+category: flowGL
+titleCN: 直角坐标系上的向量场
+theme: dark
+videoStart: 2000
+videoEnd: 10000
+*/
+
+$.getScript(
+  'https://cdn.jsdelivr.net/npm/simplex-noise@2.4.0/simplex-noise.js'
+).done(function () {
+  var noise = new SimplexNoise(Math.random);
+  var noise2 = new SimplexNoise(Math.random);
+  function generateData() {
+    var data = [];
+    for (var i = 0; i <= 50; i++) {
+      for (var j = 0; j <= 50; j++) {
+        var dx = noise.noise2D(i / 30, j / 30);
+        var dy = noise2.noise2D(i / 30, j / 30);
+        var mag = Math.sqrt(dx * dx + dy * dy);
+        valMax = Math.max(valMax, mag);
+        valMin = Math.min(valMin, mag);
+        data.push([i, j, dx, dy, mag]);
+      }
+    }
+    return data;
+  }
+  var valMin = Infinity;
+  var valMax = -Infinity;
+  var data = generateData();
+
+  myChart.setOption({
+    visualMap: {
+      show: false,
+      min: valMin,
+      max: valMax,
+      dimension: 4,
+      inRange: {
+        color: [
+          '#313695',
+          '#4575b4',
+          '#74add1',
+          '#abd9e9',
+          '#e0f3f8',
+          '#ffffbf',
+          '#fee090',
+          '#fdae61',
+          '#f46d43',
+          '#d73027',
+          '#a50026'
+        ]
+      }
+    },
+    xAxis: {
+      type: 'value',
+      axisLine: {
+        lineStyle: {
+          color: '#fff'
+        }
+      },
+      splitLine: {
+        show: false,
+        lineStyle: {
+          color: 'rgba(255,255,255,0.2)'
+        }
+      }
+    },
+    yAxis: {
+      type: 'value',
+      axisLine: {
+        lineStyle: {
+          color: '#fff'
+        }
+      },
+      splitLine: {
+        show: false,
+        lineStyle: {
+          color: 'rgba(255,255,255,0.2)'
+        }
+      }
+    },
+    series: [
+      {
+        type: 'flowGL',
+        data: data,
+        particleDensity: 64,
+        particleSize: 5,
+        itemStyle: {
+          opacity: 0.5
+        }
+      },
+      {
+        type: 'custom',
+        data: data,
+        encode: {
+          x: 0,
+          y: 0
+        },
+        renderItem: function (params, api) {
+          var x = api.value(0),
+            y = api.value(1),
+            dx = api.value(2),
+            dy = api.value(3);
+          var start = api.coord([x - dx / 2, y - dy / 2]);
+          var end = api.coord([x + dx / 2, y + dy / 2]);
+          return {
+            type: 'line',
+            shape: {
+              x1: start[0],
+              y1: start[1],
+              x2: end[0],
+              y2: end[1]
+            },
+            style: {
+              lineWidth: 2,
+              stroke: '#fff',
+              opacity: 0.2
+            }
+          };
+        }
+      }
+    ]
+  });
+});
diff --git a/public/examples/ts/gl/geo3d-with-different-height.js b/public/examples/ts/gl/geo3d-with-different-height.js
new file mode 100644
index 0000000..1e57d9c
--- /dev/null
+++ b/public/examples/ts/gl/geo3d-with-different-height.js
@@ -0,0 +1,74 @@
+/*
+title: Geo3D with Different Height
+category: geo3D
+titleCN: Geo3D with Different Height
+*/
+
+$.getJSON(
+  ROOT_PATH + '/data-gl/asset/data/world-population.json',
+  function (populationData) {
+    var max = -Infinity;
+    var min = Infinity;
+    populationData.forEach(function (item) {
+      max = Math.max(Math.log(item.value), max);
+      min = Math.min(Math.log(item.value), min);
+    });
+
+    var regions = populationData.map(function (item) {
+      return {
+        name: item.name,
+        height: ((Math.log(item.value) - min) / (max - min)) * 3
+      };
+    });
+
+    myChart.setOption(
+      (option = {
+        backgroundColor: '#cdcfd5',
+        geo3D: {
+          map: 'world',
+          shading: 'lambert',
+
+          lambertMaterial: {
+            detailTexture: ROOT_PATH + '/data-gl/asset/woods.jpg',
+            textureTiling: 20
+          },
+
+          postEffect: {
+            enable: true,
+            SSAO: {
+              enable: true,
+              radius: 3,
+              quality: 'high'
+            }
+          },
+          groundPlane: {
+            show: true
+          },
+          light: {
+            main: {
+              intensity: 1,
+              shadow: true,
+              shadowQuality: 'high',
+              alpha: 30
+            },
+            ambient: {
+              intensity: 0
+            },
+            ambientCubemap: {
+              texture: ROOT_PATH + '/data-gl/asset/canyon.hdr',
+              exposure: 2,
+              diffuseIntensity: 0.3
+            }
+          },
+          viewControl: {
+            distance: 50
+          },
+
+          regionHeight: 0.5,
+
+          regions: regions
+        }
+      })
+    );
+  }
+);
diff --git a/public/examples/ts/gl/geo3d.js b/public/examples/ts/gl/geo3d.js
new file mode 100644
index 0000000..7472b0c
--- /dev/null
+++ b/public/examples/ts/gl/geo3d.js
@@ -0,0 +1,49 @@
+/*
+title: Geo3D
+category: geo3D
+titleCN: Geo3D
+*/
+
+option = {
+  geo3D: {
+    map: 'world',
+    lambertMaterial: {
+      baseTexture: ROOT_PATH + '/data-gl/asset/woods.jpg',
+      textureTiling: 10
+    },
+
+    postEffect: {
+      enable: true,
+      SSAO: {
+        enable: true,
+        radius: 1
+      }
+    },
+    groundPlane: {
+      show: true
+    },
+    light: {
+      main: {
+        intensity: 1,
+        shadow: true
+      },
+      ambientCubemap: {
+        texture: ROOT_PATH + '/data-gl/asset/canyon.hdr'
+      }
+    },
+    viewControl: {
+      distance: 50
+    },
+
+    itemStyle: {
+      borderColor: '#000',
+      borderWidth: 0.5
+    },
+
+    boxHeight: 1.0
+  }
+};
+
+myChart.on('click', function () {
+  alert('click');
+});
diff --git a/public/examples/ts/gl/global-population-bar3d-on-globe.js b/public/examples/ts/gl/global-population-bar3d-on-globe.js
new file mode 100644
index 0000000..68ccf01
--- /dev/null
+++ b/public/examples/ts/gl/global-population-bar3d-on-globe.js
@@ -0,0 +1,67 @@
+/*
+title: Global Population - Bar3D on Globe
+category: bar3D
+titleCN: Global Population - Bar3D on Globe
+*/
+
+$.getJSON(ROOT_PATH + '/data-gl/asset/data/population.json', function (data) {
+  data = data
+    .filter(function (dataItem) {
+      return dataItem[2] > 0;
+    })
+    .map(function (dataItem) {
+      return [dataItem[0], dataItem[1], Math.sqrt(dataItem[2])];
+    });
+
+  option = {
+    backgroundColor: '#000',
+    globe: {
+      baseTexture: ROOT_PATH + '/data-gl/asset/world.topo.bathy.200401.jpg',
+      heightTexture: ROOT_PATH + '/data-gl/asset/world.topo.bathy.200401.jpg',
+      shading: 'lambert',
+      environment: ROOT_PATH + '/data-gl/asset/starfield.jpg',
+      light: {
+        main: {
+          intensity: 2
+        }
+      },
+      viewControl: {
+        autoRotate: false
+      }
+    },
+    visualMap: {
+      max: 40,
+      calculable: true,
+      realtime: false,
+      inRange: {
+        colorLightness: [0.2, 0.9]
+      },
+      textStyle: {
+        color: '#fff'
+      },
+      controller: {
+        inRange: {
+          color: 'orange'
+        }
+      },
+      outOfRange: {
+        colorAlpha: 0
+      }
+    },
+    series: [
+      {
... 7595 lines suppressed ...

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@echarts.apache.org
For additional commands, e-mail: commits-help@echarts.apache.org


[echarts-examples] 02/15: use prettier to format code

Posted by sh...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

shenyi pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/echarts-examples.git

commit 16a668348fea384ceb3c90558616e04eda103199
Author: pissang <bm...@gmail.com>
AuthorDate: Mon Sep 6 12:59:21 2021 +0800

    use prettier to format code
---
 .babelrc                         |   11 +-
 .eslintrc.js                     |   13 +
 .eslintrc.yaml                   |  194 ------
 .gitignore                       |    1 +
 .gitignore => .prettierignore    |   14 +-
 .prettierrc                      |    7 +
 .vscode/settings.json            |    4 +
 README.md                        |   24 +-
 build/copyResource.js            |  139 ++--
 build/server.js                  |   24 +-
 build/webpack.config.js          |  155 ++---
 common/buildCode.js              |  611 +++++++++---------
 common/compareImage.js           |   81 +--
 common/task.js                   |   96 ++-
 config/common.js                 |    6 +-
 config/env.asf.js                |    2 +-
 config/env.dev.js                |    2 +-
 config/env.localsite.js          |    2 +-
 e2e/cases/README.md              |    2 +-
 e2e/cases/liquidfill.js          |   14 +-
 e2e/cases/wordcloud.js           |  230 +++----
 e2e/config.js                    |   58 +-
 e2e/main.js                      | 1290 +++++++++++++++++++++-----------------
 e2e/package.json                 |    3 +-
 e2e/preview.html                 |   47 +-
 e2e/report.html                  |  353 ++++++-----
 e2e/template.html                |   47 +-
 e2e/tsconfig.json                |   18 +-
 e2e/webpack.config.js            |   29 +-
 public/en/editor.html            |   53 +-
 public/en/index.html             |   54 +-
 public/en/view.html              |   53 +-
 public/zh/editor.html            |   53 +-
 public/zh/index.html             |   54 +-
 public/zh/view.html              |   53 +-
 src/common/config.js             |  224 +++----
 src/common/helper.js             |  105 ++--
 src/common/i18n.js               |  236 +++----
 src/common/store.js              |   80 +--
 src/dep/showDebugDirtyRect.js    |  152 ++---
 src/editor/CodeAce.vue           |  195 +++---
 src/editor/CodeMonaco.vue        |  267 ++++----
 src/editor/Editor.vue            |  772 ++++++++++++-----------
 src/editor/FullCodePreview.vue   |  139 ++--
 src/editor/Preview.vue           |  728 ++++++++++-----------
 src/editor/View.vue              |   27 +-
 src/editor/downloadExample.js    |   22 +-
 src/editor/object-visualizer.css |  122 ++--
 src/editor/sandbox.js            |  376 +++++------
 src/editor/transformTs.js        |   10 +-
 src/explore/ExampleCard.vue      |  236 +++----
 src/explore/Explore.vue          |  672 ++++++++++----------
 src/main.js                      |   61 +-
 src/style/color.scss             |   42 +-
 src/style/config.xl.scss         | 1219 ++++++++++++++++++-----------------
 tool/build-example.js            |  695 ++++++++++----------
 tool/screenshot.html             |  317 ++++++----
 tool/seedrandom.js               |  459 ++++++++------
 tool/updateFrontMatter.js        |   43 +-
 59 files changed, 5707 insertions(+), 5289 deletions(-)

diff --git a/.babelrc b/.babelrc
index e87d71a..9da67db 100644
--- a/.babelrc
+++ b/.babelrc
@@ -1,5 +1,10 @@
 {
-    "presets": [["@babel/preset-env", {
+  "presets": [
+    [
+      "@babel/preset-env",
+      {
         "modules": false
-    }]]
-}
\ No newline at end of file
+      }
+    ]
+  ]
+}
diff --git a/.eslintrc.js b/.eslintrc.js
new file mode 100644
index 0000000..d64a787
--- /dev/null
+++ b/.eslintrc.js
@@ -0,0 +1,13 @@
+module.exports = {
+  root: true,
+  env: {
+    browser: true,
+    node: true
+  },
+  extends: ['prettier', 'prettier/vue'],
+  plugins: ['prettier'],
+  // add your custom rules here
+  rules: {
+    'space-before-function-paren': 0
+  }
+};
diff --git a/.eslintrc.yaml b/.eslintrc.yaml
deleted file mode 100644
index e4a2cee..0000000
--- a/.eslintrc.yaml
+++ /dev/null
@@ -1,194 +0,0 @@
-# Note:
-# If eslint does not work in VSCode, please check:
-# (1) Whether "@typescript-eslint/eslint-plugin" and "@typescript-eslint/parser"
-# are npm installed locally. Should better in the same version.
-# (2) Whether "VSCode ESlint extension" is installed.
-# (3) If the project folder is not the root folder of your working space, please
-# config the "VSCode ESlint extension" in "settings":
-# ```json
-# "eslint.workingDirectories": [{"mode": "auto"}]
-# ```
-# Note that it should be "workingDirectories" rather than "WorkingDirectories".
-
-rules:
-    # Check the rules in: node_modules/@typescript-eslint/eslint-plugin/README.md
-    no-console:
-        - 2
-        -
-            allow:
-                - "warn"
-                - "error"
-    prefer-const: 1
-    no-constant-condition: 0
-    comma-dangle: 2
-    no-debugger: 2
-    no-dupe-keys: 2
-    no-empty-character-class: 2
-    no-ex-assign: 2
-    no-extra-boolean-cast: 0
-    no-func-assign: 2
-    no-inner-declarations: 2
-    no-invalid-regexp: 2
-    no-negated-in-lhs: 2
-    no-obj-calls: 2
-    no-sparse-arrays: 2
-    no-unreachable: 2
-    use-isnan: 2
-    valid-typeof: 2
-    block-scoped-var: 2
-    curly:
-        - 2
-        - "all"
-    eqeqeq:
-        - 2
-        - "allow-null"
-    guard-for-in: 2
-    no-else-return: 0
-    no-labels:
-        - 2
-        -
-            allowLoop: true
-    no-eval: 2
-    no-extend-native: 2
-    no-extra-bind: 0
-    no-implied-eval: 2
-    no-iterator: 2
-    no-irregular-whitespace: 2
-    no-lone-blocks: 2
-    no-loop-func: 2
-    no-multi-str: 2
-    no-native-reassign: 2
-    no-new-wrappers: 2
-    no-octal: 2
-    no-octal-escape: 2
-    no-proto: 2
-    no-redeclare: 2
-    no-self-compare: 2
-    no-unneeded-ternary: 2
-    no-with: 2
-    radix: 2
-    wrap-iife:
-        - 2
-        - "any"
-    no-delete-var: 2
-    no-dupe-args: 2
-    no-duplicate-case: 2
-    no-label-var: 2
-    no-shadow-restricted-names: 2
-    no-undef: 2
-    no-undef-init: 2
-    "no-use-before-define": 0
-    brace-style:
-        - 2
-        - "stroustrup"
-        - {}
-    comma-spacing:
-        - 2
-        -
-            before: false
-            after: true
-    comma-style:
-        - 2
-        - "last"
-    new-parens: 2
-    no-array-constructor: 2
-    no-multi-spaces:
-        - 1
-        -
-            ignoreEOLComments: true
-            exceptions:
-                Property: true
-    no-new-object: 2
-    no-trailing-spaces: 2
-    no-extra-parens:
-        - 2
-        - "functions"
-    no-mixed-spaces-and-tabs: 2
-    one-var:
-        - 2
-        - "never"
-    operator-linebreak:
-        - 2
-        - "before"
-        -
-            overrides:
-                "=": "after"
-    "quotes":
-        - 2
-        - "single"
-    "semi":
-        - 2
-        - "always"
-    semi-spacing: 2
-    keyword-spacing: 2
-    key-spacing:
-        - 2
-        -
-            beforeColon: false
-            afterColon: true
-    "space-before-function-paren":
-        - 2
-        -
-            anonymous: "always"
-            named: "never"
-    space-before-blocks:
-        - 2
-        - "always"
-    computed-property-spacing:
-        - 2
-        - "never"
-    space-in-parens:
-        - 2
-        - "never"
-    space-unary-ops: 2
-    spaced-comment: 0
-
-    max-nested-callbacks:
-        - 1
-        - 5
-    max-depth:
-        - 1
-        - 6
-    max-len:
-        - 2
-        - 120
-        - 4
-        -
-            ignoreUrls: true
-            ignoreComments: true
-    max-params:
-        - 1
-        - 15
-
-    space-infix-ops: 2
-    dot-notation:
-        - 2
-        -
-            allowKeywords: true
-            allowPattern: "^catch$"
-
-    arrow-spacing: 2
-    constructor-super: 2
-    no-confusing-arrow:
-        - 2
-        -
-            allowParens: true
-    no-class-assign: 2
-    no-const-assign: 2
-    # no-dupe-class-members: 2
-    no-this-before-super: 0
-    no-duplicate-imports: 2
-    prefer-rest-params: 0
-    unicode-bom: 2
-    max-statements-per-line: 2
-
-    no-useless-constructor: 0
-    indent: ["warn", 4]
-
-    "func-call-spacing": "error"
-
-    "no-unused-vars":
-        - 1
-        -
-            vars: "local"
-            args: "none"
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index b862812..5e01c25 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,6 +14,7 @@ public/vendors/echarts/map/raw
 /public/asset
 /public/data/option
 /public/data-gl/option
+/public/examples/js
 /e2e/package-lock.json
 
 tmp
diff --git a/.gitignore b/.prettierignore
similarity index 71%
copy from .gitignore
copy to .prettierignore
index b862812..84fc23f 100644
--- a/.gitignore
+++ b/.prettierignore
@@ -1,8 +1,16 @@
+public/data
+public/data-gl
+src/data
+src/data
+src/data
+
+
+
+# From git ignore
 node_modules
 release
 public/vendors/echarts/map/tool
 public/vendors/echarts/map/raw
-.DS_Store
 /public.zip
 /build/config.gypi
 /public-gh
@@ -14,7 +22,7 @@ public/vendors/echarts/map/raw
 /public/asset
 /public/data/option
 /public/data-gl/option
+/public/examples/js
 /e2e/package-lock.json
 
-tmp
-.webm
\ No newline at end of file
+tmp
\ No newline at end of file
diff --git a/.prettierrc b/.prettierrc
new file mode 100644
index 0000000..3410e80
--- /dev/null
+++ b/.prettierrc
@@ -0,0 +1,7 @@
+{
+  "tabWidth": 2,
+  "semi": true,
+  "singleQuote": true,
+  "trailingComma": "none",
+  "printWidth": 80
+}
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..1b6457c
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,4 @@
+{
+  "editor.formatOnSave": true,
+  "editor.defaultFormatter": "esbenp.prettier-vscode"
+}
diff --git a/README.md b/README.md
index 5891e3f..d2c7314 100644
--- a/README.md
+++ b/README.md
@@ -25,7 +25,6 @@ It will copy all the build resources to echarts-website/next/examples
 1. Update the URL of localEChartsMinJS in `common/config.js`
 2. Add `local=1` in URL. For example: `editor.html?c=area-basic&local=1`
 
-
 ## Edit example
 
 All test cases are in the `public/examples/ts` folder. The comment in the header
@@ -59,26 +58,27 @@ Most of examples are written in `TypeScript`. You need to comile it to `JavaScri
 npm run compile:example
 ```
 
-
 ## Some built-in features available in examples
 
 ### Import third-party library
 
 For example:
+
 ```js
 $.when(
-    $.getScript(ROOT_PATH + '/data/asset/js/xxxx.js'),
-    $.getScript('https://cdn.jsdelivr.net/npm/d3-contour@2.0.0/dist/d3-contour.jXs'),
+  $.getScript(ROOT_PATH + '/data/asset/js/xxxx.js'),
+  $.getScript(
+    'https://cdn.jsdelivr.net/npm/d3-contour@2.0.0/dist/d3-contour.jXs'
+  )
 ).done(function () {
-    // ...
+  // ...
 });
 ```
 
-
-
 ### Controller panel
 
 Use this code to enable controller panel for a example:
+
 ```js
 app.config = {
     aNameForTheSelectWidget: 'This is the initial value'
@@ -109,8 +109,8 @@ app.configParameters = {
 
 ```js
 app.onresize = function () {
-    // Do something.
-}
+  // Do something.
+};
 ```
 
 ### Get width and height of the chart area
@@ -120,7 +120,6 @@ var width = myChart.getWidth();
 var height = myChart.getHeight();
 ```
 
-
 ## Update example snapshots
 
 ```shell
@@ -133,7 +132,6 @@ Only for default theme
 node tool/build-example.js -t default
 ```
 
-
 ## Run e2e tests.
 
 Run all the examples to test package publishing and install, module importing, minimal bundling and DTS correctness.
@@ -145,6 +143,7 @@ npm run build:example
 ```
 
 Then run the tests.
+
 ```shell
 npm run test:e2e
 ```
@@ -152,6 +151,7 @@ npm run test:e2e
 You can change the testing branch or local dir, which is available when add `--local` in `e2e/config.js`
 
 If you want to test with esbuild bundler. Which is much faster.
+
 ```shell
 npm run test:e2e:esbuild
 ```
@@ -178,5 +178,3 @@ Specify matched tests.
 ```shell
 node e2e/main.js --skip npm --tests bar3D*
 ```
-
-
diff --git a/build/copyResource.js b/build/copyResource.js
index d36d55d..bfa378a 100644
--- a/build/copyResource.js
+++ b/build/copyResource.js
@@ -23,78 +23,91 @@ const projectDir = __dirname;
  */
 
 function initEnv() {
-    let envType = argv.env;
-    let isDev = argv.dev != null || argv.debug != null || envType === 'debug' || envType === 'dev';
-
-    if (isDev) {
-        console.warn('====================================================================');
-        console.warn('THIS IS IN DEV MODE');
-        console.warn('!!! Please input your local host in `config/env.dev.js` firstly !!!');
-        console.warn('====================================================================');
-        envType = 'dev';
-    }
-
-    if (!envType) {
-        throw new Error('--env MUST be specified');
-    }
-
-    let config = require('../config/env.' + envType);
-
-    if (isDev) {
-        console.warn('====================================================================');
-        console.warn('Please visit the website: ');
-        console.warn(config.host);
-        console.warn('====================================================================');
-    }
-
-    assert(path.isAbsolute(config.releaseDestDir));
-
-    config.envType = envType;
-
-    return config;
+  let envType = argv.env;
+  let isDev =
+    argv.dev != null ||
+    argv.debug != null ||
+    envType === 'debug' ||
+    envType === 'dev';
+
+  if (isDev) {
+    console.warn(
+      '===================================================================='
+    );
+    console.warn('THIS IS IN DEV MODE');
+    console.warn(
+      '!!! Please input your local host in `config/env.dev.js` firstly !!!'
+    );
+    console.warn(
+      '===================================================================='
+    );
+    envType = 'dev';
+  }
+
+  if (!envType) {
+    throw new Error('--env MUST be specified');
+  }
+
+  let config = require('../config/env.' + envType);
+
+  if (isDev) {
+    console.warn(
+      '===================================================================='
+    );
+    console.warn('Please visit the website: ');
+    console.warn(config.host);
+    console.warn(
+      '===================================================================='
+    );
+  }
+
+  assert(path.isAbsolute(config.releaseDestDir));
+
+  config.envType = envType;
+
+  return config;
 }
 
 async function copyResourcesToDest(config) {
-    let basePath = path.resolve(projectDir, '../public');
-    const filePaths = await globby([
-        '**/*',
-        // Use jade in echarts-www
-        '!zh/*',
-        '!en/*'
-    ], {
-        cwd: basePath
-    });
-
-    console.log();
-
-    for (let filePath of filePaths) {
-        fse.ensureDirSync(
-            path.resolve(config.releaseDestDir, path.dirname(filePath))
-        );
-        let destPath = path.resolve(config.releaseDestDir, filePath);
-        fs.copyFileSync(
-            path.resolve(basePath, filePath),
-            destPath
-        );
-
-        if (process.stdout.clearLine) {
-            process.stdout.clearLine();
-            process.stdout.cursorTo(0);
-            process.stdout.write(chalk.green(`resource copied to: ${destPath}`));
-        }
-        else {
-            console.log(chalk.green(`resource copied to: ${destPath}`));
-        }
+  let basePath = path.resolve(projectDir, '../public');
+  const filePaths = await globby(
+    [
+      '**/*',
+      // Use jade in echarts-www
+      '!zh/*',
+      '!en/*'
+    ],
+    {
+      cwd: basePath
+    }
+  );
+
+  console.log();
+
+  for (let filePath of filePaths) {
+    fse.ensureDirSync(
+      path.resolve(config.releaseDestDir, path.dirname(filePath))
+    );
+    let destPath = path.resolve(config.releaseDestDir, filePath);
+    fs.copyFileSync(path.resolve(basePath, filePath), destPath);
+
+    if (process.stdout.clearLine) {
+      process.stdout.clearLine();
+      process.stdout.cursorTo(0);
+      process.stdout.write(chalk.green(`resource copied to: ${destPath}`));
+    } else {
+      console.log(chalk.green(`resource copied to: ${destPath}`));
     }
+  }
 
-    console.log('\ncopyResourcesToDest done.');
+  console.log('\ncopyResourcesToDest done.');
 }
 
 async function run() {
-    let config = initEnv();
-    await copyResourcesToDest(config);
+  let config = initEnv();
+  await copyResourcesToDest(config);
 
-    console.log('All done.');
+  console.log('All done.');
 }
 
 run();
diff --git a/build/server.js b/build/server.js
index 77b0da6..03867d2 100644
--- a/build/server.js
+++ b/build/server.js
@@ -2,19 +2,23 @@ const nStatic = require('node-static');
 const open = require('open');
 
 const fileServer = new nStatic.Server(__dirname + '/../public');
-require('http').createServer(function (request, response) {
-    request.addListener('end', function () {
+require('http')
+  .createServer(function (request, response) {
+    request
+      .addListener('end', function () {
         fileServer.serve(request, response);
-    }).resume();
-}).listen(3002);
+      })
+      .resume();
+  })
+  .listen(3002);
 
 // Wait bundling to be finished
 setTimeout(() => {
-    open('http://127.0.0.1:3002/en/index.html');
+  open('http://127.0.0.1:3002/en/index.html');
 }, 3000);
 
-process.on('SIGINT', function() {
-    console.log('Closing');
-    // Close through ctrl + c;
-    process.exit();
-});
\ No newline at end of file
+process.on('SIGINT', function () {
+  console.log('Closing');
+  // Close through ctrl + c;
+  process.exit();
+});
diff --git a/build/webpack.config.js b/build/webpack.config.js
index 3107a0c..80dd631 100644
--- a/build/webpack.config.js
+++ b/build/webpack.config.js
@@ -6,81 +6,94 @@ const MiniCssExtractPlugin = require('mini-css-extract-plugin');
 const distPath = path.resolve(__dirname, '../public');
 
 module.exports = [
-    {
-        entry: path.resolve(__dirname, '../src/main.js'),
-        output: {
-            publicPath: './',
-            filename: 'example-bundle.js',
-            path: path.join(distPath, 'js'),
-            library: 'echartsExample',
-            libraryTarget: 'var'
+  {
+    entry: path.resolve(__dirname, '../src/main.js'),
+    output: {
+      publicPath: './',
+      filename: 'example-bundle.js',
+      path: path.join(distPath, 'js'),
+      library: 'echartsExample',
+      libraryTarget: 'var'
+    },
+    stats: 'minimal',
+    module: {
+      rules: [
+        {
+          test: /\.vue$/,
+          use: ['vue-loader']
         },
-        stats: 'minimal',
-        module: {
-            rules: [{
-                test: /\.vue$/,
-                use: ['vue-loader']
-            }, {
-                test: /\.js$/,
-                use: ['babel-loader'],
-                exclude: /node_modules/
-            }, {
-                test: /\.css$/,
-                use: [MiniCssExtractPlugin.loader, 'css-loader']
-            }, {
-                test: /\.scss$/,
-                use: [MiniCssExtractPlugin.loader, 'css-loader', 'sassjs-loader']
-            }, {
-                test: /\.(png|jpg|jpeg|gif|eot|ttf|woff|woff2)(\?.+)?$/,
-                use: [{
-                    loader: 'file-loader',
-                    options: {
-                        limit: 10000,
-                        outputPath: '../asset',
-                        name: '[name].[ext]'
-                    }
-                }]
-            }, {
-                test: /\.svg$/,
-                use: [{
-                    loader: 'html-loader',
-                    options: {
-                        minimize: true
-                    }
-                }]
-              },]
+        {
+          test: /\.js$/,
+          use: ['babel-loader'],
+          exclude: /node_modules/
         },
-        externals: {
-            vue: 'Vue'
+        {
+          test: /\.css$/,
+          use: [MiniCssExtractPlugin.loader, 'css-loader']
         },
-        plugins: [
-            new webpack.IgnorePlugin(/^fs$/),
-            new VueLoaderPlugin(),
-            new MiniCssExtractPlugin({
-                filename: '../css/example-bundle.css'
-            })
-        ]
-    },
-    {
-        // Sepearte built ts transformer to be loaded async
-        entry: path.resolve(__dirname, '../src/editor/transformTs.js'),
-        stats: 'minimal',
-        module: {
-            rules: [{
-                test: /\.m?js$/,
-                include: /node_modules/,
-                type: 'javascript/auto',
-                resolve: {
-                    fullySpecified: false
-                }
-            }]
+        {
+          test: /\.scss$/,
+          use: [MiniCssExtractPlugin.loader, 'css-loader', 'sassjs-loader']
         },
-        output: {
-            filename: 'example-transform-ts-bundle.js',
-            path: path.join(distPath, 'js'),
-            library: 'echartsExampleTransformTs',
-            libraryExport: 'default',
-            libraryTarget: 'var'
+        {
+          test: /\.(png|jpg|jpeg|gif|eot|ttf|woff|woff2)(\?.+)?$/,
+          use: [
+            {
+              loader: 'file-loader',
+              options: {
+                limit: 10000,
+                outputPath: '../asset',
+                name: '[name].[ext]'
+              }
+            }
+          ]
+        },
+        {
+          test: /\.svg$/,
+          use: [
+            {
+              loader: 'html-loader',
+              options: {
+                minimize: true
+              }
+            }
+          ]
         }
+      ]
+    },
+    externals: {
+      vue: 'Vue'
+    },
+    plugins: [
+      new webpack.IgnorePlugin(/^fs$/),
+      new VueLoaderPlugin(),
+      new MiniCssExtractPlugin({
+        filename: '../css/example-bundle.css'
+      })
+    ]
+  },
+  {
+    // Sepearte built ts transformer to be loaded async
+    entry: path.resolve(__dirname, '../src/editor/transformTs.js'),
+    stats: 'minimal',
+    module: {
+      rules: [
+        {
+          test: /\.m?js$/,
+          include: /node_modules/,
+          type: 'javascript/auto',
+          resolve: {
+            fullySpecified: false
+          }
+        }
+      ]
+    },
+    output: {
+      filename: 'example-transform-ts-bundle.js',
+      path: path.join(distPath, 'js'),
+      library: 'echartsExampleTransformTs',
+      libraryExport: 'default',
+      libraryTarget: 'var'
     }
+  }
 ];
diff --git a/common/buildCode.js b/common/buildCode.js
index f0f5afa..64e4204 100644
--- a/common/buildCode.js
+++ b/common/buildCode.js
@@ -1,84 +1,83 @@
 const COMPONENTS_MAP = {
-    grid: 'GridComponent',
-    polar: 'PolarComponent',
-    geo: 'GeoComponent',
-    singleAxis: 'SingleAxisComponent',
-    parallel: 'ParallelComponent',
-    calendar: 'CalendarComponent',
-    graphic: 'GraphicComponent',
-    toolbox: 'ToolboxComponent',
-    tooltip: 'TooltipComponent',
-    axisPointer: 'AxisPointerComponent',
-    brush: 'BrushComponent',
-    title: 'TitleComponent',
-    timeline: 'TimelineComponent',
-    markPoint: 'MarkPointComponent',
-    markLine: 'MarkLineComponent',
-    markArea: 'MarkAreaComponent',
-    legend: 'LegendComponent',
-    dataZoom: 'DataZoomComponent',
-    visualMap: 'VisualMapComponent',
-    aria: 'AriaComponent',
-    dataset: 'DatasetComponent',
-
-    // Dependencies
-    xAxis: 'GridComponent',
-    yAxis: 'GridComponent',
-    angleAxis: 'PolarComponent',
-    radiusAxis: 'PolarComponent'
-}
+  grid: 'GridComponent',
+  polar: 'PolarComponent',
+  geo: 'GeoComponent',
+  singleAxis: 'SingleAxisComponent',
+  parallel: 'ParallelComponent',
+  calendar: 'CalendarComponent',
+  graphic: 'GraphicComponent',
+  toolbox: 'ToolboxComponent',
+  tooltip: 'TooltipComponent',
+  axisPointer: 'AxisPointerComponent',
+  brush: 'BrushComponent',
+  title: 'TitleComponent',
+  timeline: 'TimelineComponent',
+  markPoint: 'MarkPointComponent',
+  markLine: 'MarkLineComponent',
+  markArea: 'MarkAreaComponent',
+  legend: 'LegendComponent',
+  dataZoom: 'DataZoomComponent',
+  visualMap: 'VisualMapComponent',
+  aria: 'AriaComponent',
+  dataset: 'DatasetComponent',
+
+  // Dependencies
+  xAxis: 'GridComponent',
+  yAxis: 'GridComponent',
+  angleAxis: 'PolarComponent',
+  radiusAxis: 'PolarComponent'
+};
 
 const CHARTS_MAP = {
-    line: 'LineChart',
-    bar: 'BarChart',
-    pie: 'PieChart',
-    scatter: 'ScatterChart',
-    radar: 'RadarChart',
-    map: 'MapChart',
-    tree: 'TreeChart',
-    treemap: 'TreemapChart',
-    graph: 'GraphChart',
-    gauge: 'GaugeChart',
-    funnel: 'FunnelChart',
-    parallel: 'ParallelChart',
-    sankey: 'SankeyChart',
-    boxplot: 'BoxplotChart',
-    candlestick: 'CandlestickChart',
-    effectScatter: 'EffectScatterChart',
-    lines: 'LinesChart',
-    heatmap: 'HeatmapChart',
-    pictorialBar: 'PictorialBarChart',
-    themeRiver: 'ThemeRiverChart',
-    sunburst: 'SunburstChart',
-    custom: 'CustomChart'
-}
+  line: 'LineChart',
+  bar: 'BarChart',
+  pie: 'PieChart',
+  scatter: 'ScatterChart',
+  radar: 'RadarChart',
+  map: 'MapChart',
+  tree: 'TreeChart',
+  treemap: 'TreemapChart',
+  graph: 'GraphChart',
+  gauge: 'GaugeChart',
+  funnel: 'FunnelChart',
+  parallel: 'ParallelChart',
+  sankey: 'SankeyChart',
+  boxplot: 'BoxplotChart',
+  candlestick: 'CandlestickChart',
+  effectScatter: 'EffectScatterChart',
+  lines: 'LinesChart',
+  heatmap: 'HeatmapChart',
+  pictorialBar: 'PictorialBarChart',
+  themeRiver: 'ThemeRiverChart',
+  sunburst: 'SunburstChart',
+  custom: 'CustomChart'
+};
 const COMPONENTS_GL_MAP = {
-
-    grid3D: 'Grid3DComponent',
-    geo3D: 'Geo3DComponent',
-    globe: 'GlobeComponent',
-    mapbox3D: 'Mapbox3DComponent',
-    maptalks3D: 'Maptalks3DComponent',
-
-    // Dependencies
-    xAxis3D: 'Grid3DComponent',
-    yAxis3D: 'Grid3DComponent',
-    zAxis3D: 'Grid3DComponent',
-}
+  grid3D: 'Grid3DComponent',
+  geo3D: 'Geo3DComponent',
+  globe: 'GlobeComponent',
+  mapbox3D: 'Mapbox3DComponent',
+  maptalks3D: 'Maptalks3DComponent',
+
+  // Dependencies
+  xAxis3D: 'Grid3DComponent',
+  yAxis3D: 'Grid3DComponent',
+  zAxis3D: 'Grid3DComponent'
+};
 const CHARTS_GL_MAP = {
-    bar3D: 'Bar3DChart',
-    line3D: 'Line3DChart',
-    scatter3D: 'Scatter3DChart',
-    lines3D: 'Lines3DChart',
-    polygons3D: 'Polygons3DChart',
-    surface: 'SurfaceChart',
-    map3D: 'Map3DChart',
-
-    scatterGL: 'ScatterGLChart',
-    graphGL: 'GraphGLChart',
-    flowGL: 'FlowGLChart',
-    linesGL: 'LinesGLChart'
-}
+  bar3D: 'Bar3DChart',
+  line3D: 'Line3DChart',
+  scatter3D: 'Scatter3DChart',
+  lines3D: 'Lines3DChart',
+  polygons3D: 'Polygons3DChart',
+  surface: 'SurfaceChart',
+  map3D: 'Map3DChart',
+
+  scatterGL: 'ScatterGLChart',
+  graphGL: 'GraphGLChart',
+  flowGL: 'FlowGLChart',
+  linesGL: 'LinesGLChart'
+};
 
 const COMPONENTS_MAP_REVERSE = {};
 const CHARTS_MAP_REVERSE = {};
@@ -86,32 +85,39 @@ const CHARTS_GL_MAP_REVERSE = {};
 const COMPONENTS_GL_MAP_REVERSE = {};
 
 const RENDERERS_MAP_REVERSE = {
-    'SVGRenderer': 'svg',
-    'CanvasRenderer': 'canvas'
-}
+  SVGRenderer: 'svg',
+  CanvasRenderer: 'canvas'
+};
 
 // Component that will be injected automatically in preprocessor
 // These should be excluded util find they were used explicitly.
 const MARKERS = ['markLine', 'markArea', 'markPoint'];
 const INJECTED_COMPONENTS = [
-    ...MARKERS, 'grid', 'axisPointer',
-    'aria'  // TODO aria
+  ...MARKERS,
+  'grid',
+  'axisPointer',
+  'aria' // TODO aria
 ];
 
 // Component that was dependent.
 const DEPENDENT_COMPONENTS = [
-    'xAxis', 'yAxis', 'angleAxis', 'radiusAxis',
-    'xAxis3D', 'yAxis3D', 'zAxis3D'
+  'xAxis',
+  'yAxis',
+  'angleAxis',
+  'radiusAxis',
+  'xAxis3D',
+  'yAxis3D',
+  'zAxis3D'
 ];
 
 function createReverseMap(map, reverseMap) {
-    Object.keys(map).forEach(key => {
-        // Exclude dependencies.
-        if (DEPENDENT_COMPONENTS.includes(key)) {
-            return;
-        }
-        reverseMap[map[key]] = key;
-    });
+  Object.keys(map).forEach((key) => {
+    // Exclude dependencies.
+    if (DEPENDENT_COMPONENTS.includes(key)) {
+      return;
+    }
+    reverseMap[map[key]] = key;
+  });
 }
 
 createReverseMap(COMPONENTS_MAP, COMPONENTS_MAP_REVERSE);
@@ -120,248 +126,273 @@ createReverseMap(COMPONENTS_GL_MAP, COMPONENTS_GL_MAP_REVERSE);
 createReverseMap(CHARTS_GL_MAP, CHARTS_GL_MAP_REVERSE);
 
 module.exports.collectDeps = function collectDeps(option) {
-    let deps = [];
-    if (option.options) {
+  let deps = [];
+  if (option.options) {
+    // TODO getOption() doesn't have baseOption and options.
+    option.options.forEach((opt) => {
+      deps = deps.concat(collectDeps(opt));
+    });
 
-        // TODO getOption() doesn't have baseOption and options.
-        option.options.forEach((opt) => {
-            deps = deps.concat(collectDeps(opt));
-        });
+    if (option.baseOption) {
+      deps = deps.concat(collectDeps(option.baseOption));
+    }
 
-        if (option.baseOption) {
-            deps = deps.concat(collectDeps(option.baseOption))
-        }
+    // Remove duplicates
+    return Array.from(new Set(deps));
+  }
 
-        // Remove duplicates
-        return Array.from(new Set(deps));
+  Object.keys(option).forEach((key) => {
+    if (INJECTED_COMPONENTS.includes(key)) {
+      return;
     }
+    const val = option[key];
 
-    Object.keys(option).forEach((key) => {
-        if (INJECTED_COMPONENTS.includes(key)) {
-            return;
-        }
-        const val = option[key];
-
-        if (Array.isArray(val) && !val.length) {
-            return;
-        }
-
-        if (COMPONENTS_MAP[key]) {
-            deps.push(COMPONENTS_MAP[key]);
-        }
-        if (COMPONENTS_GL_MAP[key]) {
-            deps.push(COMPONENTS_GL_MAP[key]);
-        }
-    });
+    if (Array.isArray(val) && !val.length) {
+      return;
+    }
 
-    let series = option.series;
-    if (!Array.isArray(series)) {
-        series = [series];
+    if (COMPONENTS_MAP[key]) {
+      deps.push(COMPONENTS_MAP[key]);
     }
+    if (COMPONENTS_GL_MAP[key]) {
+      deps.push(COMPONENTS_GL_MAP[key]);
+    }
+  });
+
+  let series = option.series;
+  if (!Array.isArray(series)) {
+    series = [series];
+  }
 
-    series.forEach((seriesOpt) => {
-        if (CHARTS_MAP[seriesOpt.type]) {
-            deps.push(CHARTS_MAP[seriesOpt.type]);
-        }
-        if (CHARTS_GL_MAP[seriesOpt.type]) {
-            deps.push(CHARTS_GL_MAP[seriesOpt.type]);
-        }
-        if (seriesOpt.type === 'map') {
-            // Needs geo component when using map
-            deps.push(COMPONENTS_MAP.geo);
-        }
-        MARKERS.forEach(markerType => {
-            if (seriesOpt[markerType]) {
-                deps.push(COMPONENTS_MAP[markerType]);
-            }
-        });
+  series.forEach((seriesOpt) => {
+    if (CHARTS_MAP[seriesOpt.type]) {
+      deps.push(CHARTS_MAP[seriesOpt.type]);
+    }
+    if (CHARTS_GL_MAP[seriesOpt.type]) {
+      deps.push(CHARTS_GL_MAP[seriesOpt.type]);
+    }
+    if (seriesOpt.type === 'map') {
+      // Needs geo component when using map
+      deps.push(COMPONENTS_MAP.geo);
+    }
+    MARKERS.forEach((markerType) => {
+      if (seriesOpt[markerType]) {
+        deps.push(COMPONENTS_MAP[markerType]);
+      }
     });
+  });
 
-    // Remove duplicates
-    return Array.from(new Set(deps));
-}
+  // Remove duplicates
+  return Array.from(new Set(deps));
+};
 
 function buildMinimalBundleCode(deps, includeType) {
-    const chartsImports = [];
-    const componentsImports = [];
-    const chartsGLImports = [];
-    const componentsGLImports = [];
-    const renderersImports = [];
-    deps.forEach(function (dep) {
-        if (dep.endsWith('Renderer')) {
-            renderersImports.push(dep);
-        }
-        else if (CHARTS_MAP_REVERSE[dep]) {
-            chartsImports.push(dep);
-            if (includeType) {
-                chartsImports.push(dep.replace(/Chart$/, 'SeriesOption'));
-            }
-        }
-        else if (COMPONENTS_MAP_REVERSE[dep]) {
-            componentsImports.push(dep);
-            if (includeType) {
-                componentsImports.push(dep.replace(/Component$/, 'ComponentOption'));
-            }
-        }
-        else if (CHARTS_GL_MAP_REVERSE[dep]) {
-            chartsGLImports.push(dep)
-        }
-        else if (COMPONENTS_GL_MAP_REVERSE[dep]) {
-            componentsGLImports.push(dep);
-        }
-    });
-
-    function getImportsPartCode(imports) {
-        return `${imports.map(str => `
-    ${str}`).join(',')}`;
+  const chartsImports = [];
+  const componentsImports = [];
+  const chartsGLImports = [];
+  const componentsGLImports = [];
+  const renderersImports = [];
+  deps.forEach(function (dep) {
+    if (dep.endsWith('Renderer')) {
+      renderersImports.push(dep);
+    } else if (CHARTS_MAP_REVERSE[dep]) {
+      chartsImports.push(dep);
+      if (includeType) {
+        chartsImports.push(dep.replace(/Chart$/, 'SeriesOption'));
+      }
+    } else if (COMPONENTS_MAP_REVERSE[dep]) {
+      componentsImports.push(dep);
+      if (includeType) {
+        componentsImports.push(dep.replace(/Component$/, 'ComponentOption'));
+      }
+    } else if (CHARTS_GL_MAP_REVERSE[dep]) {
+      chartsGLImports.push(dep);
+    } else if (COMPONENTS_GL_MAP_REVERSE[dep]) {
+      componentsGLImports.push(dep);
     }
-
-    const allImports = [
-        ...componentsImports,
-        ...chartsImports,
-        ...componentsGLImports,
-        ...chartsGLImports,
-        ...renderersImports
-    ];
-
-    const ECOptionTypeCode = `
+  });
+
+  function getImportsPartCode(imports) {
+    return `${imports
+      .map(
+        (str) => `
+    ${str}`
+      )
+      .join(',')}`;
+  }
+
+  const allImports = [
+    ...componentsImports,
+    ...chartsImports,
+    ...componentsGLImports,
+    ...chartsGLImports,
+    ...renderersImports
+  ];
+
+  const ECOptionTypeCode = `
 type ECOption = echarts.ComposeOption<
-    ${allImports.filter(a => a.endsWith('Option')).join(' | ')}
+    ${allImports.filter((a) => a.endsWith('Option')).join(' | ')}
 >`;
-    const importsCodes = [
-        [componentsImports, 'echarts/components'],
-        [chartsImports, 'echarts/charts'],
-        [renderersImports, 'echarts/renderers'],
-        [chartsGLImports, 'echarts-gl/charts'],
-        [componentsGLImports, 'echarts-gl/components']
-    ].filter(a => a[0].length > 0).map(item => `
+  const importsCodes = [
+    [componentsImports, 'echarts/components'],
+    [chartsImports, 'echarts/charts'],
+    [renderersImports, 'echarts/renderers'],
+    [chartsGLImports, 'echarts-gl/charts'],
+    [componentsGLImports, 'echarts-gl/components']
+  ]
+    .filter((a) => a[0].length > 0)
+    .map((item) =>
+      `
 import {${getImportsPartCode(item[0])}
 } from '${item[1]}';
-    `.trim()).join('\n');
+    `.trim()
+    )
+    .join('\n');
 
-    return `import * as echarts from 'echarts/core';
+  return (
+    `import * as echarts from 'echarts/core';
 ${importsCodes}
 
 echarts.use(
-    [${allImports.filter(a => !a.endsWith('Option')).join(', ')}]
+    [${allImports.filter((a) => !a.endsWith('Option')).join(', ')}]
 );
 ` + (includeType ? ECOptionTypeCode : '')
+  );
 }
 
 module.exports.buildMinimalBundleCode = buildMinimalBundleCode;
 
 function buildLegacyMinimalBundleCode(deps, isESM) {
-    const modules = [];
-    deps.forEach(function (dep) {
-        if (dep.endsWith('Renderer') && dep !== 'CanvasRenderer') {
-            modules.push(`zrender/lib/${RENDERERS_MAP_REVERSE[dep]}/${RENDERERS_MAP_REVERSE[dep]}`);
-        }
-        else if (CHARTS_MAP_REVERSE[dep]) {
-            modules.push(`echarts/lib/chart/${CHARTS_MAP_REVERSE[dep]}`);
-        }
-        else if (COMPONENTS_MAP_REVERSE[dep]) {
-            modules.push(`echarts/lib/component/${COMPONENTS_MAP_REVERSE[dep]}`);
-        }
-        else if (CHARTS_GL_MAP_REVERSE[dep]) {
-            modules.push(`echarts-gl/lib/chart/${CHARTS_GL_MAP_REVERSE[dep]}`);
-        }
-        else if (COMPONENTS_GL_MAP_REVERSE[dep]) {
-            modules.push(`echarts-gl/lib/component/${COMPONENTS_GL_MAP_REVERSE[dep]}`);
-        }
-    });
+  const modules = [];
+  deps.forEach(function (dep) {
+    if (dep.endsWith('Renderer') && dep !== 'CanvasRenderer') {
+      modules.push(
+        `zrender/lib/${RENDERERS_MAP_REVERSE[dep]}/${RENDERERS_MAP_REVERSE[dep]}`
+      );
+    } else if (CHARTS_MAP_REVERSE[dep]) {
+      modules.push(`echarts/lib/chart/${CHARTS_MAP_REVERSE[dep]}`);
+    } else if (COMPONENTS_MAP_REVERSE[dep]) {
+      modules.push(`echarts/lib/component/${COMPONENTS_MAP_REVERSE[dep]}`);
+    } else if (CHARTS_GL_MAP_REVERSE[dep]) {
+      modules.push(`echarts-gl/lib/chart/${CHARTS_GL_MAP_REVERSE[dep]}`);
+    } else if (COMPONENTS_GL_MAP_REVERSE[dep]) {
+      modules.push(
+        `echarts-gl/lib/component/${COMPONENTS_GL_MAP_REVERSE[dep]}`
+      );
+    }
+  });
 
-    return isESM ? `import * as echarts from 'echarts/lib/echarts';
-${modules.map(mod => {
+  return isESM
+    ? `import * as echarts from 'echarts/lib/echarts';
+${modules
+  .map((mod) => {
     return `import '${mod}';`;
-}).join('\n')}
-` : `const echarts = require('echarts/lib/echarts');
-${modules.map(mod => {
-    return `require('${mod}');`;
-}).join('\n')}
+  })
+  .join('\n')}
 `
+    : `const echarts = require('echarts/lib/echarts');
+${modules
+  .map((mod) => {
+    return `require('${mod}');`;
+  })
+  .join('\n')}
+`;
 }
 
 function hasGLInDeps(deps) {
-    return !!deps.find(dep => !!(CHARTS_GL_MAP_REVERSE[dep] || COMPONENTS_GL_MAP_REVERSE[dep]));
+  return !!deps.find(
+    (dep) => !!(CHARTS_GL_MAP_REVERSE[dep] || COMPONENTS_GL_MAP_REVERSE[dep])
+  );
 }
 
 module.buildLegacyMinimalBundleCode = buildLegacyMinimalBundleCode;
 
 module.exports.buildExampleCode = function (
-    jsCode, deps, {
-        // If enable minimal import
-        minimal,
-        // If is ESM module or CommonJS module
-        // Force to be true in ts mode or minimal mode.
-        esm = true,
-        // If use legacy minimal import, like:
-        // import 'echarts/lib/chart/bar';
-        // Only available when minimal is true.
-        legacy,
-        // If is ts code
-        ts,
-        // Theme
-        theme,
-        ROOT_PATH,
-        // Other imports code code string
-        // For example
-        // `import 'echarts-liquidfill'`
-        extraImports
-    }
+  jsCode,
+  deps,
+  {
+    // If enable minimal import
+    minimal,
+    // If is ESM module or CommonJS module
+    // Force to be true in ts mode or minimal mode.
+    esm = true,
+    // If use legacy minimal import, like:
+    // import 'echarts/lib/chart/bar';
+    // Only available when minimal is true.
+    legacy,
+    // If is ts code
+    ts,
+    // Theme
+    theme,
+    ROOT_PATH,
+    // Other imports code code string
+    // For example
+    // `import 'echarts-liquidfill'`
+    extraImports
+  }
 ) {
-    // if (minimal && !legacy) {
-    //     // ESM must be used when use the new minimal import
-    //     esm = true;
-    // }
-
-    if (ts) {
-        esm = true;
-    }
-
-    if (minimal && !esm) {
-        // Only legacy mode can be used when use require in mimimal bundle.
-        legacy = true;
-    }
-
-
-    const hasECStat = jsCode.indexOf('ecStat') >= 0;
-    const usedRootPath = jsCode.indexOf('ROOT_PATH') >= 0;
-    const usedApp = jsCode.indexOf('app') >= 0;
-
-    const DEP_CODE = `
-${hasECStat ?
-    esm ? `import ecStat from 'echarts-stat';`
-        : `var ecStat = require('echarts-stat');`
+  // if (minimal && !legacy) {
+  //     // ESM must be used when use the new minimal import
+  //     esm = true;
+  // }
+
+  if (ts) {
+    esm = true;
+  }
+
+  if (minimal && !esm) {
+    // Only legacy mode can be used when use require in mimimal bundle.
+    legacy = true;
+  }
+
+  const hasECStat = jsCode.indexOf('ecStat') >= 0;
+  const usedRootPath = jsCode.indexOf('ROOT_PATH') >= 0;
+  const usedApp = jsCode.indexOf('app') >= 0;
+
+  const DEP_CODE = `
+${
+  hasECStat
+    ? esm
+      ? `import ecStat from 'echarts-stat';`
+      : `var ecStat = require('echarts-stat');`
     : ''
 }
 `;
-    const IMPORT_CODE = [
-        !minimal
-            ? esm
-                ? `import * as echarts from 'echarts';${hasGLInDeps(deps) ? `\nimport 'echarts-gl';` : ''}`
-                : `var echarts = require('echarts');${hasGLInDeps(deps) ? `\nrequire('echarts-gl');` : ''}`
-            : legacy
-                ? buildLegacyMinimalBundleCode(deps, esm)
-                : buildMinimalBundleCode(deps, ts),
-        (theme && theme !== 'dark')
-            ? esm
-                ? `import 'echarts/theme/${theme}'`
-                : `require('echarts/theme/${theme}')`
-            : '',
-        extraImports
-    ].filter(a => !!a).join('\n');
-
-    const ENV_CODE = [
-        usedRootPath ? `var ROOT_PATH = '${ROOT_PATH}';` : '',
-        usedApp ? `var app${ts ? ': any' : ''} = {};` : '',
-        ts && !minimal ? 'type ECOption = echarts.EChartsOption' : ''
-    ].filter(a => !!a).join('\n');
-
-    const PREPARE_CODE = [
-        IMPORT_CODE.trim(), DEP_CODE.trim(), ENV_CODE.trim()
-    ].filter(a => !!a).join('\n\n');
-
-    return `${PREPARE_CODE}
+  const IMPORT_CODE = [
+    !minimal
+      ? esm
+        ? `import * as echarts from 'echarts';${
+            hasGLInDeps(deps) ? `\nimport 'echarts-gl';` : ''
+          }`
+        : `var echarts = require('echarts');${
+            hasGLInDeps(deps) ? `\nrequire('echarts-gl');` : ''
+          }`
+      : legacy
+      ? buildLegacyMinimalBundleCode(deps, esm)
+      : buildMinimalBundleCode(deps, ts),
+    theme && theme !== 'dark'
+      ? esm
+        ? `import 'echarts/theme/${theme}'`
+        : `require('echarts/theme/${theme}')`
+      : '',
+    extraImports
+  ]
+    .filter((a) => !!a)
+    .join('\n');
+
+  const ENV_CODE = [
+    usedRootPath ? `var ROOT_PATH = '${ROOT_PATH}';` : '',
+    usedApp ? `var app${ts ? ': any' : ''} = {};` : '',
+    ts && !minimal ? 'type ECOption = echarts.EChartsOption' : ''
+  ]
+    .filter((a) => !!a)
+    .join('\n');
+
+  const PREPARE_CODE = [IMPORT_CODE.trim(), DEP_CODE.trim(), ENV_CODE.trim()]
+    .filter((a) => !!a)
+    .join('\n\n');
+
+  return `${PREPARE_CODE}
 
 var chartDom = document.getElementById('main')${ts ? '!' : ''};
 var myChart = echarts.init(chartDom${theme ? `, '${theme}'` : ''});
@@ -371,4 +402,4 @@ ${jsCode.trim()}
 
 option && myChart.setOption(option);
 `;
-}
\ No newline at end of file
+};
diff --git a/common/compareImage.js b/common/compareImage.js
index e0d3a93..1515933 100644
--- a/common/compareImage.js
+++ b/common/compareImage.js
@@ -3,45 +3,52 @@ const PNG = require('pngjs').PNG;
 const pixelmatch = require('pixelmatch');
 
 function readPNG(path) {
-    return new Promise(resolve => {
-        fs.createReadStream(path)
-            .pipe(new PNG())
-            .on('parsed', function () {
-                resolve({
-                    data: this.data,
-                    width: this.width,
-                    height: this.height
-                });
-            });
-    });
+  return new Promise((resolve) => {
+    fs.createReadStream(path)
+      .pipe(new PNG())
+      .on('parsed', function () {
+        resolve({
+          data: this.data,
+          width: this.width,
+          height: this.height
+        });
+      });
+  });
 }
 
-module.exports.compareImage = function (targetPath, sourcePath, threshold = 0.1) {
-    if (!fs.existsSync(targetPath)) {
-        return true;
-    }
+module.exports.compareImage = function (
+  targetPath,
+  sourcePath,
+  threshold = 0.1
+) {
+  if (!fs.existsSync(targetPath)) {
+    return true;
+  }
 
-    return Promise.all([
-        readPNG(targetPath),
-        readPNG(sourcePath)
-    ]).then(([expectedImg, actualImg]) => {
-        let width = expectedImg.width;
-        let height = expectedImg.height;
-        if (
-            (width !== actualImg.width)
-          || (height !== actualImg.height)
-        ) {
-            return {diffRatio: 1}
+  return Promise.all([readPNG(targetPath), readPNG(sourcePath)]).then(
+    ([expectedImg, actualImg]) => {
+      let width = expectedImg.width;
+      let height = expectedImg.height;
+      if (width !== actualImg.width || height !== actualImg.height) {
+        return { diffRatio: 1 };
+      }
+      const diffPNG = new PNG({ width, height });
+      let diffPixelsCount = pixelmatch(
+        expectedImg.data,
+        actualImg.data,
+        diffPNG.data,
+        width,
+        height,
+        {
+          threshold
         }
-        const diffPNG = new PNG({width, height});
-        let diffPixelsCount = pixelmatch(expectedImg.data, actualImg.data, diffPNG.data, width, height, {
-            threshold
-        });
-        let totalPixelsCount = width * height;
+      );
+      let totalPixelsCount = width * height;
 
-        return {
-            diffRatio: diffPixelsCount / totalPixelsCount,
-            diffPNG
-        };
-    });
-}
\ No newline at end of file
+      return {
+        diffRatio: diffPixelsCount / totalPixelsCount,
+        diffPNG
+      };
+    }
+  );
+};
diff --git a/common/task.js b/common/task.js
index f2e5f1c..4ad82ce 100644
--- a/common/task.js
+++ b/common/task.js
@@ -1,51 +1,49 @@
-function runTasks(
-    taskParamsLists, createTask, concurrency
-) {
-    concurrency = Math.min(taskParamsLists.length, concurrency);
-    return new Promise((resolve, reject) => {
-        let runningTaskCount = 0;
-        let cursor = 0;
-        let rets = [];
-
-        function finishTask(res, idx) {
-            rets[idx] = res;
-            processNext();
-        }
-
-        function failTask(e) {
-            console.error(e);
-            processNext();
-        }
-
-        function processNext() {
-            runningTaskCount--;
-            addTask();
-
-            if (runningTaskCount === 0) {
-                resolve(rets);
-            }
-        }
-
-        function addTask() {
-            const param = taskParamsLists[cursor];
-            if (param) {
-                const currentTaskIdx = cursor;
-                runningTaskCount++;
-                createTask(param)
-                    .then((res) => finishTask(res, currentTaskIdx))
-                    .catch(failTask);
-                cursor++;
-            }
-        }
-
-        for (let i = 0; i < concurrency; i++) {
-            addTask();
-        }
-
-        if (!runningTaskCount) {
-            resolve(rets);
-        }
-    });
+function runTasks(taskParamsLists, createTask, concurrency) {
+  concurrency = Math.min(taskParamsLists.length, concurrency);
+  return new Promise((resolve, reject) => {
+    let runningTaskCount = 0;
+    let cursor = 0;
+    let rets = [];
+
+    function finishTask(res, idx) {
+      rets[idx] = res;
+      processNext();
+    }
+
+    function failTask(e) {
+      console.error(e);
+      processNext();
+    }
+
+    function processNext() {
+      runningTaskCount--;
+      addTask();
+
+      if (runningTaskCount === 0) {
+        resolve(rets);
+      }
+    }
+
+    function addTask() {
+      const param = taskParamsLists[cursor];
+      if (param) {
+        const currentTaskIdx = cursor;
+        runningTaskCount++;
+        createTask(param)
+          .then((res) => finishTask(res, currentTaskIdx))
+          .catch(failTask);
+        cursor++;
+      }
+    }
+
+    for (let i = 0; i < concurrency; i++) {
+      addTask();
+    }
+
+    if (!runningTaskCount) {
+      resolve(rets);
+    }
+  });
 }
 
-module.exports.runTasks = runTasks;
\ No newline at end of file
+module.exports.runTasks = runTasks;
diff --git a/config/common.js b/config/common.js
index e4d473f..f053ebf 100644
--- a/config/common.js
+++ b/config/common.js
@@ -1,5 +1 @@
-
-module.exports = {
-};
-
-
+module.exports = {};
diff --git a/config/env.asf.js b/config/env.asf.js
index 8c08547..16d9a2e 100644
--- a/config/env.asf.js
+++ b/config/env.asf.js
@@ -2,7 +2,7 @@ const path = require('path');
 const config = require('./common');
 
 Object.assign(config, {
-    releaseDestDir: path.resolve(__dirname, '../../echarts-website/examples')
+  releaseDestDir: path.resolve(__dirname, '../../echarts-website/examples')
 });
 
 module.exports = config;
diff --git a/config/env.dev.js b/config/env.dev.js
index 8c08547..16d9a2e 100644
--- a/config/env.dev.js
+++ b/config/env.dev.js
@@ -2,7 +2,7 @@ const path = require('path');
 const config = require('./common');
 
 Object.assign(config, {
-    releaseDestDir: path.resolve(__dirname, '../../echarts-website/examples')
+  releaseDestDir: path.resolve(__dirname, '../../echarts-website/examples')
 });
 
 module.exports = config;
diff --git a/config/env.localsite.js b/config/env.localsite.js
index 84106f2..b8fdaaf 100644
--- a/config/env.localsite.js
+++ b/config/env.localsite.js
@@ -2,7 +2,7 @@ const path = require('path');
 const config = require('./common');
 
 Object.assign(config, {
-    releaseDestDir: path.resolve(__dirname, '../../echarts-website/next/examples')
+  releaseDestDir: path.resolve(__dirname, '../../echarts-website/next/examples')
 });
 
 module.exports = config;
diff --git a/e2e/cases/README.md b/e2e/cases/README.md
index 7d12477..57c6a61 100644
--- a/e2e/cases/README.md
+++ b/e2e/cases/README.md
@@ -1,3 +1,3 @@
 # Handwritten Cases
 
-Mostly for testing extensions.
\ No newline at end of file
+Mostly for testing extensions.
diff --git a/e2e/cases/liquidfill.js b/e2e/cases/liquidfill.js
index c219859..e257bb4 100644
--- a/e2e/cases/liquidfill.js
+++ b/e2e/cases/liquidfill.js
@@ -2,9 +2,11 @@
 extension: echarts-liquidfill
 */
 option = {
-    series: [{
-        type: 'liquidFill',
-        data: [0.6],
-        radius: '70%'
-    }]
-};
\ No newline at end of file
+  series: [
+    {
+      type: 'liquidFill',
+      data: [0.6],
+      radius: '70%'
+    }
+  ]
+};
diff --git a/e2e/cases/wordcloud.js b/e2e/cases/wordcloud.js
index ee14f29..5c01bb8 100644
--- a/e2e/cases/wordcloud.js
+++ b/e2e/cases/wordcloud.js
@@ -2,120 +2,126 @@
 extension: echarts-wordcloud
 */
 option = {
-    tooltip: {},
-    series: [ {
-        type: 'wordCloud',
-        gridSize: 2,
-        sizeRange: [12, 50],
-        rotationRange: [-90, 90],
-        shape: 'pentagon',
-        width: 600,
-        height: 400,
-        drawOutOfBound: true,
+  tooltip: {},
+  series: [
+    {
+      type: 'wordCloud',
+      gridSize: 2,
+      sizeRange: [12, 50],
+      rotationRange: [-90, 90],
+      shape: 'pentagon',
+      width: 600,
+      height: 400,
+      drawOutOfBound: true,
+      textStyle: {
+        color: function () {
+          return (
+            'rgb(' +
+            [
+              Math.round(Math.random() * 160),
+              Math.round(Math.random() * 160),
+              Math.round(Math.random() * 160)
+            ].join(',') +
+            ')'
+          );
+        }
+      },
+      emphasis: {
         textStyle: {
-            color: function () {
-                return 'rgb(' + [
-                    Math.round(Math.random() * 160),
-                    Math.round(Math.random() * 160),
-                    Math.round(Math.random() * 160)
-                ].join(',') + ')';
-            }
-        },
-        emphasis: {
+          shadowBlur: 10,
+          shadowColor: '#333'
+        }
+      },
+      data: [
+        {
+          name: 'Sam S Club',
+          value: 10000,
+          textStyle: {
+            color: 'black'
+          },
+          emphasis: {
             textStyle: {
-                shadowBlur: 10,
-                shadowColor: '#333'
+              color: 'red'
             }
+          }
         },
-        data: [
-            {
-                name: 'Sam S Club',
-                value: 10000,
-                textStyle: {
-                    color: 'black'
-                },
-                emphasis: {
-                    textStyle: {
-                        color: 'red'
-                    }
-                }
-            },
-            {
-                name: 'Macys',
-                value: 6181
-            },
-            {
-                name: 'Amy Schumer',
-                value: 4386
-            },
-            {
-                name: 'Jurassic World',
-                value: 4055
-            },
-            {
-                name: 'Charter Communications',
-                value: 2467
-            },
-            {
-                name: 'Chick Fil A',
-                value: 2244
-            },
-            {
-                name: 'Planet Fitness',
-                value: 1898
-            },
-            {
-                name: 'Pitch Perfect',
-                value: 1484
-            },
-            {
-                name: 'Express',
-                value: 1112
-            },
-            {
-                name: 'Home',
-                value: 965
-            },
-            {
-                name: 'Johnny Depp',
-                value: 847
-            },
-            {
-                name: 'Lena Dunham',
-                value: 582
-            },
-            {
-                name: 'Lewis Hamilton',
-                value: 555
-            },
-            {
-                name: 'KXAN',
-                value: 550
-            },
-            {
-                name: 'Mary Ellen Mark',
-                value: 462
-            },
-            {
-                name: 'Farrah Abraham',
-                value: 366
-            },
-            {
-                name: 'Rita Ora',
-                value: 360
-            },
-            {
-                name: 'Serena Williams',
-                value: 282
-            },
-            {
-                name: 'NCAA baseball tournament',
-                value: 273
-            },
-            {
-                name: 'Point Break',
-                value: 265
-            }
-        ]
-    } ]
+        {
+          name: 'Macys',
+          value: 6181
+        },
+        {
+          name: 'Amy Schumer',
+          value: 4386
+        },
+        {
+          name: 'Jurassic World',
+          value: 4055
+        },
+        {
+          name: 'Charter Communications',
+          value: 2467
+        },
+        {
+          name: 'Chick Fil A',
+          value: 2244
+        },
+        {
+          name: 'Planet Fitness',
+          value: 1898
+        },
+        {
+          name: 'Pitch Perfect',
+          value: 1484
+        },
+        {
+          name: 'Express',
+          value: 1112
+        },
+        {
+          name: 'Home',
+          value: 965
+        },
+        {
+          name: 'Johnny Depp',
+          value: 847
+        },
+        {
+          name: 'Lena Dunham',
+          value: 582
+        },
+        {
+          name: 'Lewis Hamilton',
+          value: 555
+        },
+        {
+          name: 'KXAN',
+          value: 550
+        },
+        {
+          name: 'Mary Ellen Mark',
+          value: 462
+        },
+        {
+          name: 'Farrah Abraham',
+          value: 366
+        },
+        {
+          name: 'Rita Ora',
+          value: 360
+        },
+        {
+          name: 'Serena Williams',
+          value: 282
+        },
+        {
+          name: 'NCAA baseball tournament',
+          value: 273
+        },
+        {
+          name: 'Point Break',
+          value: 265
+        }
+      ]
+    }
+  ]
 };
diff --git a/e2e/config.js b/e2e/config.js
index d377f17..61bbff2 100644
--- a/e2e/config.js
+++ b/e2e/config.js
@@ -1,32 +1,32 @@
 const nodePath = require('path');
 
 module.exports = {
-    packages: [
-        // Handwritten topological sort by the rule of dependency.
-        {
-            name: 'zrender',    // package name
-            dir: nodePath.resolve(__dirname, '../../zrender'),
-            git: 'ecomfe/zrender#release'
-        },
-        {
-            name: 'echarts',
-            dir: nodePath.resolve(__dirname, '../../echarts'),
-            git: 'apache/echarts#release'
-        },
-        {
-            name: 'echarts-gl',
-            dir: nodePath.resolve(__dirname, '../../echarts-gl'),
-            git: 'ecomfe/echarts-gl#master'
-        },
-        {
-            name: 'echarts-wordcloud',
-            dir: nodePath.resolve(__dirname, '../../echarts-wordcloud'),
-            git: 'ecomfe/echarts-wordcloud#master'
-        },
-        {
-            name: 'echarts-liquidfill',
-            dir: nodePath.resolve(__dirname, '../../echarts-liquidfill'),
-            git: 'ecomfe/echarts-liquidfill#master'
-        }
-    ]
-}
\ No newline at end of file
+  packages: [
+    // Handwritten topological sort by the rule of dependency.
+    {
+      name: 'zrender', // package name
+      dir: nodePath.resolve(__dirname, '../../zrender'),
+      git: 'ecomfe/zrender#release'
+    },
+    {
+      name: 'echarts',
+      dir: nodePath.resolve(__dirname, '../../echarts'),
+      git: 'apache/echarts#release'
+    },
+    {
+      name: 'echarts-gl',
+      dir: nodePath.resolve(__dirname, '../../echarts-gl'),
+      git: 'ecomfe/echarts-gl#master'
+    },
+    {
+      name: 'echarts-wordcloud',
+      dir: nodePath.resolve(__dirname, '../../echarts-wordcloud'),
+      git: 'ecomfe/echarts-wordcloud#master'
+    },
+    {
+      name: 'echarts-liquidfill',
+      dir: nodePath.resolve(__dirname, '../../echarts-liquidfill'),
+      git: 'ecomfe/echarts-liquidfill#master'
+    }
+  ]
+};
diff --git a/e2e/main.js b/e2e/main.js
index c086f26..acc8517 100644
--- a/e2e/main.js
+++ b/e2e/main.js
@@ -2,7 +2,7 @@
 
 const fs = require('fs');
 const globby = require('globby');
-const {buildExampleCode, collectDeps} = require('../common/buildCode');
+const { buildExampleCode, collectDeps } = require('../common/buildCode');
 const nodePath = require('path');
 const { runTasks } = require('../common/task');
 const fse = require('fs-extra');
@@ -11,37 +11,37 @@ const ts = require('typescript');
 const chalk = require('chalk');
 const nStatic = require('node-static');
 const webpack = require('webpack');
-const {RawSource} = require('webpack-sources');
+const { RawSource } = require('webpack-sources');
 const argparse = require('argparse');
 const esbuild = require('esbuild');
 const puppeteer = require('puppeteer');
 const config = require('./config');
-const {compareImage} = require('../common/compareImage');
+const { compareImage } = require('../common/compareImage');
 const shell = require('shelljs');
 const downloadGit = require('download-git-repo');
-const {promisify} = require('util');
+const { promisify } = require('util');
 const matter = require('gray-matter');
 const minimatch = require('minimatch');
 
 const parser = new argparse.ArgumentParser({
-    addHelp: true
+  addHelp: true
 });
 parser.addArgument(['--bundler'], {
-    help: 'Bundler, can be webpack or esbuild'
+  help: 'Bundler, can be webpack or esbuild'
 });
 parser.addArgument(['-m', '--minify'], {
-    action: 'storeTrue',
-    help: 'If minify'
+  action: 'storeTrue',
+  help: 'If minify'
 });
 parser.addArgument(['--local'], {
-    action: 'storeTrue',
-    help: `If use local repos. If so, don't forget to update the location of local repo in config.js.`
+  action: 'storeTrue',
+  help: `If use local repos. If so, don't forget to update the location of local repo in config.js.`
 });
 parser.addArgument(['--skip'], {
-    help: 'If skip some stages to speed up the test. Can be npm,bundle,render,compare'
+  help: 'If skip some stages to speed up the test. Can be npm,bundle,render,compare'
 });
 parser.addArgument(['-t', '--tests'], {
-    help: 'If use pattern to specify which tests to run'
+  help: 'If use pattern to specify which tests to run'
 });
 const args = parser.parseArgs();
 
@@ -63,7 +63,7 @@ const USE_WEBPACK = !(args.bundler === 'esbuild');
 
 let testsPattern = args.tests;
 if (testsPattern) {
-    testsPattern = testsPattern.split(',');
+  testsPattern = testsPattern.split(',');
 }
 
 // Create a server
@@ -89,21 +89,23 @@ echarts.registerPreprocessor(function (option) {
         });
     }
 });
-`
+`;
 
 function buildPrepareCode(isESM, lang) {
-    return `
+  return `
 // @ts-ignore
-${isESM
+${
+  isESM
     ? `import _seedrandom from 'seedrandom';`
     : `const _seedrandom = require('seedrandom');`
 }
 
 // Check if i18n will break the minimal imports.
-${lang
+${
+  lang
     ? isESM
-        ? `import 'echarts/i18n/${lang}';`
-        : `require('echarts/i18n/${lang}');`
+      ? `import 'echarts/i18n/${lang}';`
+      : `require('echarts/i18n/${lang}');`
     : ''
 }
 // @ts-ignore
@@ -118,657 +120,767 @@ ${TEMPLATE_CODE}
 }
 
 async function prepare() {
-    fse.removeSync(TMP_DIR);
-    fse.removeSync(RUN_CODE_DIR);
-    fse.removeSync(BUNDLE_DIR);
-    fse.removeSync(SCREENSHOTS_DIR);
+  fse.removeSync(TMP_DIR);
+  fse.removeSync(RUN_CODE_DIR);
+  fse.removeSync(BUNDLE_DIR);
+  fse.removeSync(SCREENSHOTS_DIR);
 
-    fse.removeSync(REPO_DIR);
-    fse.removeSync(PACKAGE_DIR);
+  fse.removeSync(REPO_DIR);
+  fse.removeSync(PACKAGE_DIR);
 
-    fse.ensureDirSync(TMP_DIR);
-    fse.ensureDirSync(RUN_CODE_DIR);
-    fse.ensureDirSync(BUNDLE_DIR);
-    fse.ensureDirSync(SCREENSHOTS_DIR);
+  fse.ensureDirSync(TMP_DIR);
+  fse.ensureDirSync(RUN_CODE_DIR);
+  fse.ensureDirSync(BUNDLE_DIR);
+  fse.ensureDirSync(SCREENSHOTS_DIR);
 
-    fse.ensureDirSync(REPO_DIR);
-    fse.ensureDirSync(PACKAGE_DIR);
+  fse.ensureDirSync(REPO_DIR);
+  fse.ensureDirSync(PACKAGE_DIR);
 }
 
 async function downloadPackages(config) {
-    for (let pkg of config.packages) {
-        const pkgDownloadPath = nodePath.join(REPO_DIR, pkg.name);
-        console.log(chalk.gray(`Downloading ${pkg.git}`))
-        await promisify(downloadGit)(pkg.git, pkgDownloadPath);
-        // Override the path
-        pkg.dir = pkgDownloadPath;
-    }
+  for (let pkg of config.packages) {
+    const pkgDownloadPath = nodePath.join(REPO_DIR, pkg.name);
+    console.log(chalk.gray(`Downloading ${pkg.git}`));
+    await promisify(downloadGit)(pkg.git, pkgDownloadPath);
+    // Override the path
+    pkg.dir = pkgDownloadPath;
+  }
 }
 
 async function installPackages(config) {
-
-    const publishedPackages = {};
-
-    function checkFolder(pkg) {
-        const dir = pkg.dir;
-        if (!fs.existsSync(dir)) {
-            console.warn(chalk.yellow(`${dir} not exists. Please update it in e2e/config.js.`));
-            return false;
-        }
-        if (!nodePath.isAbsolute(dir)) {
-            console.warn(chalk.yellow(`${dir} is not an absolute path. Please update it in e2e/config.js.`));
-            return false;
-        }
-        return true;
+  const publishedPackages = {};
+
+  function checkFolder(pkg) {
+    const dir = pkg.dir;
+    if (!fs.existsSync(dir)) {
+      console.warn(
+        chalk.yellow(`${dir} not exists. Please update it in e2e/config.js.`)
+      );
+      return false;
     }
+    if (!nodePath.isAbsolute(dir)) {
+      console.warn(
+        chalk.yellow(
+          `${dir} is not an absolute path. Please update it in e2e/config.js.`
+        )
+      );
+      return false;
+    }
+    return true;
+  }
 
-    function publishPackage(pkg) {
-        console.log(chalk.gray(`Publishing ${pkg.dir}`))
-
-        shell.cd(pkg.dir);
-
-        const packageJson = JSON.parse(fs.readFileSync(nodePath.join(pkg.dir, 'package.json')));
-        const tgzFileName = `${packageJson.name}-${packageJson.version}.tgz`;
-        const targetTgzFilePath = nodePath.join(PACKAGE_DIR, tgzFileName);
-
-        if (packageJson.dependencies) {
-            for (let depPkgName in packageJson.dependencies) {
-                const depPkg = config.packages.find(a => a.name === depPkgName);
-                if (depPkg && !publishedPackages[depPkgName]) {
-                    publishPackage(depPkg);
-                    // Come back.
-                    shell.cd(pkg.dir);
-                }
+  function publishPackage(pkg) {
+    console.log(chalk.gray(`Publishing ${pkg.dir}`));
 
-                shell.exec(`npm install`);
+    shell.cd(pkg.dir);
 
-                if (depPkg) {
-                    console.log(chalk.gray(`Installing dependency ${depPkgName} from "${publishedPackages[depPkgName]}" ...`));
-                    shell.exec(`npm install ${publishedPackages[depPkgName]} --no-save`);
-                    console.log(chalk.gray(`Install dependency ${depPkgName} done.`));
-                }
-            }
+    const packageJson = JSON.parse(
+      fs.readFileSync(nodePath.join(pkg.dir, 'package.json'))
+    );
+    const tgzFileName = `${packageJson.name}-${packageJson.version}.tgz`;
+    const targetTgzFilePath = nodePath.join(PACKAGE_DIR, tgzFileName);
+
+    if (packageJson.dependencies) {
+      for (let depPkgName in packageJson.dependencies) {
+        const depPkg = config.packages.find((a) => a.name === depPkgName);
+        if (depPkg && !publishedPackages[depPkgName]) {
+          publishPackage(depPkg);
+          // Come back.
+          shell.cd(pkg.dir);
         }
 
-        shell.exec(`npm pack`);
-        fs.renameSync(nodePath.join(pkg.dir, tgzFileName), targetTgzFilePath);
-        publishedPackages[packageJson.name] = targetTgzFilePath;
-    }
+        shell.exec(`npm install`);
 
-    for (let pkg of config.packages) {
-        if (!checkFolder(pkg)) {
-            return;
+        if (depPkg) {
+          console.log(
+            chalk.gray(
+              `Installing dependency ${depPkgName} from "${publishedPackages[depPkgName]}" ...`
+            )
+          );
+          shell.exec(`npm install ${publishedPackages[depPkgName]} --no-save`);
+          console.log(chalk.gray(`Install dependency ${depPkgName} done.`));
         }
-
-        publishPackage(pkg);
-    };
-
-    shell.cd(__dirname);
-    for (let pkg of config.packages) {
-        console.log(chalk.gray(`Installing ${pkg.name} from "${publishedPackages[pkg.name]}" ...`));
-        shell.exec(`npm install ${publishedPackages[pkg.name]} --no-save`);
-        console.log(chalk.gray(`Install ${pkg.name} done.`));
-    }
-
-    // Come back.
-    shell.cd(process.cwd());
-}
-
-async function buildRunCode() {
-    const files = await globby([
-        `${EXAMPLE_DIR}/data/option/*.json`,
-        `${EXAMPLE_DIR}/data-gl/option/*.json`
-    ]);
-
-    if (!files.length) {
-        throw new Error('You need to run `node tool/build-example.js` before run this test.');
+      }
     }
 
-    async function addTestCase(testName, testCode, deps, checkTs, extraImports, extraRequire) {
-        const ROOT_PATH = `${baseUrl}/public`;
+    shell.exec(`npm pack`);
+    fs.renameSync(nodePath.join(pkg.dir, tgzFileName), targetTgzFilePath);
+    publishedPackages[packageJson.name] = targetTgzFilePath;
+  }
 
-        const fullCode = buildExampleCode(buildPrepareCode(true) + testCode, deps, {
-            minimal: false,
-            ts: checkTs,
-            // Check if theme will break the minimal imports.
-            theme: TEST_THEME,
-            ROOT_PATH,
-            extraImports
-        });
-        const minimalCode = buildExampleCode(buildPrepareCode(true) + testCode, deps, {
-            minimal: true,
-            ts: checkTs,
-            theme: TEST_THEME,
-            ROOT_PATH,
-            extraImports
-        });
-        const legacyCode = buildExampleCode(buildPrepareCode(false) + testCode, deps, {
-            minimal: true,
-            esm: false,
-            ts: false,
-            theme: TEST_THEME,
-            ROOT_PATH,
-            extraImports: extraRequire
-        });
-
-        await fse.writeFile(
-            nodePath.join(RUN_CODE_DIR, testName + (checkTs ? '.ts' : '.js')),
-            prettier.format(fullCode, {
-                singleQuote: true,
-                parser: checkTs ? 'typescript' : 'babel'
-            }), 'utf-8'
-        );
-        await fse.writeFile(
-            nodePath.join(RUN_CODE_DIR, testName + `.${MINIMAL_POSTFIX}.${checkTs ? 'ts' : 'js'}`),
-            prettier.format(minimalCode, {
-                singleQuote: true,
-                parser: checkTs ? 'typescript' : 'babel'
-            }), 'utf-8'
-        );
-        await fse.writeFile(
-            nodePath.join(RUN_CODE_DIR, testName + `.${MINIMAL_LEGACY_POSTFIX}.js`),
-            prettier.format(legacyCode, {
-                singleQuote: true,
-                parser: 'babel'
-            }), 'utf-8'
-        );
-        console.log(
-            chalk.green('Generated: ', testName)
-        );
+  for (let pkg of config.packages) {
+    if (!checkFolder(pkg)) {
+      return;
     }
 
-    const builtinTestCases = await runTasks(files, async (fileName) => {
-        const isGL = fileName.startsWith(`${EXAMPLE_DIR}/data-gl`);
-        const testName = nodePath.basename(fileName, '.json');
-
-        if (testsPattern && !testsPattern.some(pattern => minimatch(testName, pattern))) {
-            return;
-        }
+    publishPackage(pkg);
+  }
 
-        const optionCode = await fse.readFile(fileName, 'utf-8');
-        let option;
-        try {
-            option = JSON.parse(optionCode);
-        }
-        catch (err) {
-            console.error(`Parse JSON error: fileName: ${fileName} | fileContent: ${optionCode}`);
-            throw err;
-        }
-        const testCode = await fse.readFile(nodePath.join(
-            EXAMPLE_DIR, isGL ? 'data-gl' : 'data', testName + '.js'
-        ), 'utf-8');
-
-        // TODO Ignore case with extension.
-
-        const deps = collectDeps(option).concat([
-            // TODO SVG
-            'CanvasRenderer'
-        ]);
-
-        if (
-            !(testName === 'map-HK' || testName === 'map-usa')  // Only test these two map examples
-            && (deps.includes('MapChart')
-                || deps.includes('GeoComponent')
-                || option.bmap)
-        ) {
-            console.warn(chalk.yellow(`Ignored map tests ${testName}`));
-            return;
-        }
+  shell.cd(__dirname);
+  for (let pkg of config.packages) {
+    console.log(
+      chalk.gray(
+        `Installing ${pkg.name} from "${publishedPackages[pkg.name]}" ...`
+      )
+    );
+    shell.exec(`npm install ${publishedPackages[pkg.name]} --no-save`);
+    console.log(chalk.gray(`Install ${pkg.name} done.`));
+  }
 
-        // TODO: Don't support TypeScript in GL
-        await addTestCase(testName, testCode, deps, !isGL);
+  // Come back.
+  shell.cd(process.cwd());
+}
 
-        return testName;
-    }, 20);
-    const extensionTestCases = await runTasks(await globby(__dirname + '/cases/*.js'), async (fileName) => {
-        const testName = nodePath.basename(fileName, '.js');
-        if (testsPattern && !testsPattern.some(pattern => minimatch(testName, pattern))) {
-            return;
-        }
+async function buildRunCode() {
+  const files = await globby([
+    `${EXAMPLE_DIR}/data/option/*.json`,
+    `${EXAMPLE_DIR}/data-gl/option/*.json`
+  ]);
+
+  if (!files.length) {
+    throw new Error(
+      'You need to run `node tool/build-example.js` before run this test.'
+    );
+  }
+
+  async function addTestCase(
+    testName,
+    testCode,
+    deps,
+    checkTs,
+    extraImports,
+    extraRequire
+  ) {
+    const ROOT_PATH = `${baseUrl}/public`;
+
+    const fullCode = buildExampleCode(buildPrepareCode(true) + testCode, deps, {
+      minimal: false,
+      ts: checkTs,
+      // Check if theme will break the minimal imports.
+      theme: TEST_THEME,
+      ROOT_PATH,
+      extraImports
+    });
+    const minimalCode = buildExampleCode(
+      buildPrepareCode(true) + testCode,
+      deps,
+      {
+        minimal: true,
+        ts: checkTs,
+        theme: TEST_THEME,
+        ROOT_PATH,
+        extraImports
+      }
+    );
+    const legacyCode = buildExampleCode(
+      buildPrepareCode(false) + testCode,
+      deps,
+      {
+        minimal: true,
+        esm: false,
+        ts: false,
+        theme: TEST_THEME,
+        ROOT_PATH,
+        extraImports: extraRequire
+      }
+    );
 
-        const testCode = await fse.readFile(fileName, 'utf-8');
-        let importsCode = '';
-        let requireCode = '';
-        try {
-            const fmResult = matter(testCode, {
-                delimiters: ['/*', '*/']
-            });
-            const extension = fmResult.data.extension;
-            if (extension) {
-                importsCode = `import '${extension}';`;
-                requireCode = `require('${extension}');`;
-            }
-        }
-        catch (e)  {
+    await fse.writeFile(
+      nodePath.join(RUN_CODE_DIR, testName + (checkTs ? '.ts' : '.js')),
+      prettier.format(fullCode, {
+        singleQuote: true,
+        parser: checkTs ? 'typescript' : 'babel'
+      }),
+      'utf-8'
+    );
+    await fse.writeFile(
+      nodePath.join(
+        RUN_CODE_DIR,
+        testName + `.${MINIMAL_POSTFIX}.${checkTs ? 'ts' : 'js'}`
+      ),
+      prettier.format(minimalCode, {
+        singleQuote: true,
+        parser: checkTs ? 'typescript' : 'babel'
+      }),
+      'utf-8'
+    );
+    await fse.writeFile(
+      nodePath.join(RUN_CODE_DIR, testName + `.${MINIMAL_LEGACY_POSTFIX}.js`),
+      prettier.format(legacyCode, {
+        singleQuote: true,
+        parser: 'babel'
+      }),
+      'utf-8'
+    );
+    console.log(chalk.green('Generated: ', testName));
+  }
+
+  const builtinTestCases = await runTasks(
+    files,
+    async (fileName) => {
+      const isGL = fileName.startsWith(`${EXAMPLE_DIR}/data-gl`);
+      const testName = nodePath.basename(fileName, '.json');
+
+      if (
+        testsPattern &&
+        !testsPattern.some((pattern) => minimatch(testName, pattern))
+      ) {
+        return;
+      }
+
+      const optionCode = await fse.readFile(fileName, 'utf-8');
+      let option;
+      try {
+        option = JSON.parse(optionCode);
+      } catch (err) {
+        console.error(
+          `Parse JSON error: fileName: ${fileName} | fileContent: ${optionCode}`
+        );
+        throw err;
+      }
+      const testCode = await fse.readFile(
+        nodePath.join(EXAMPLE_DIR, isGL ? 'data-gl' : 'data', testName + '.js'),
+        'utf-8'
+      );
+
+      // TODO Ignore case with extension.
+
+      const deps = collectDeps(option).concat([
+        // TODO SVG
+        'CanvasRenderer'
+      ]);
+
+      if (
+        !(testName === 'map-HK' || testName === 'map-usa') && // Only test these two map examples
+        (deps.includes('MapChart') ||
+          deps.includes('GeoComponent') ||
+          option.bmap)
+      ) {
+        console.warn(chalk.yellow(`Ignored map tests ${testName}`));
+        return;
+      }
+
+      // TODO: Don't support TypeScript in GL
+      await addTestCase(testName, testCode, deps, !isGL);
+
+      return testName;
+    },
+    20
+  );
+  const extensionTestCases = await runTasks(
+    await globby(__dirname + '/cases/*.js'),
+    async (fileName) => {
+      const testName = nodePath.basename(fileName, '.js');
+      if (
+        testsPattern &&
+        !testsPattern.some((pattern) => minimatch(testName, pattern))
+      ) {
+        return;
+      }
+
+      const testCode = await fse.readFile(fileName, 'utf-8');
+      let importsCode = '';
+      let requireCode = '';
+      try {
+        const fmResult = matter(testCode, {
+          delimiters: ['/*', '*/']
+        });
+        const extension = fmResult.data.extension;
+        if (extension) {
+          importsCode = `import '${extension}';`;
+          requireCode = `require('${extension}');`;
         }
-        await addTestCase(testName, testCode, [], false, importsCode, requireCode);
-
-        return testName;
-    }, 20);
-
-    return builtinTestCases.concat(extensionTestCases).filter(a => !!a);
+      } catch (e) {}
+      await addTestCase(
+        testName,
+        testCode,
+        [],
+        false,
+        importsCode,
+        requireCode
+      );
+
+      return testName;
+    },
+    20
+  );
+
+  return builtinTestCases.concat(extensionTestCases).filter((a) => !!a);
 }
 
 async function compileTs(tsTestFiles, result) {
-    const config = JSON.parse(fs.readFileSync(nodePath.join(__dirname, 'tsconfig.json'), 'utf-8'));
-
-    const compilerOptions = {
-        ...config.compilerOptions
-    };
-
-    const {options, errors} = ts.convertCompilerOptionsFromJson(compilerOptions, nodePath.resolve(__dirname));
-
-    if (errors.length) {
-        let errMsg = 'tsconfig parse failed: '
-            + errors.map(error => error.messageText).join('. ')
-            + '\n compilerOptions: \n' + JSON.stringify(config.compilerOptions, null, 4);
-        assert(false, errMsg);
-    }
-
-    // Generate this config file for checking the source code in vscode.
-    fs.writeFileSync(nodePath.join(RUN_CODE_DIR, 'tsconfig.json'), JSON.stringify({
+  const config = JSON.parse(
+    fs.readFileSync(nodePath.join(__dirname, 'tsconfig.json'), 'utf-8')
+  );
+
+  const compilerOptions = {
+    ...config.compilerOptions
+  };
+
+  const { options, errors } = ts.convertCompilerOptionsFromJson(
+    compilerOptions,
+    nodePath.resolve(__dirname)
+  );
+
+  if (errors.length) {
+    let errMsg =
+      'tsconfig parse failed: ' +
+      errors.map((error) => error.messageText).join('. ') +
+      '\n compilerOptions: \n' +
+      JSON.stringify(config.compilerOptions, null, 4);
+    assert(false, errMsg);
+  }
+
+  // Generate this config file for checking the source code in vscode.
+  fs.writeFileSync(
+    nodePath.join(RUN_CODE_DIR, 'tsconfig.json'),
+    JSON.stringify(
+      {
         compilerOptions
-    }, null, 2), 'utf-8');
-
-    // See: https://github.com/microsoft/TypeScript/wiki/Using-the-Compiler-API
-    let program = ts.createProgram(tsTestFiles, options);
-    let emitResult = program.emit();
-
-    let allDiagnostics = ts
-        .getPreEmitDiagnostics(program)
-        .concat(emitResult.diagnostics);
-
-    allDiagnostics.forEach(diagnostic => {
-        if (diagnostic.file) {
-            let {line, character} = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start);
-            let message = ts.flattenDiagnosticMessageText(diagnostic.messageText, '\n');
-
-            const compilerError = {
-                location: [line + 1, character + 1],
-                message
-            };
-            if (diagnostic.file.fileName.endsWith(`${MINIMAL_POSTFIX}.ts`)) {
-                const basename = nodePath.basename(diagnostic.file.fileName, `.${MINIMAL_POSTFIX}.ts`);
-                if (!result[basename]) {
-                    throw new Error(`${basename} does not exists in result.`);
-                }
-                result[basename].compileErrors.minimal.push(compilerError);
-            }
-            else {
-                const basename = nodePath.basename(diagnostic.file.fileName, `.ts`);
-                if (!result[basename]) {
-                    throw new Error(`${basename} does not exists in result.`);
-                }
-                result[basename].compileErrors.full.push(compilerError);
-            }
-            // console.log(chalk.red(`${diagnostic.file.fileName} (${line + 1},${character + 1})`));
-            // console.log(chalk.gray(message));
+      },
+      null,
+      2
+    ),
+    'utf-8'
+  );
+
+  // See: https://github.com/microsoft/TypeScript/wiki/Using-the-Compiler-API
+  let program = ts.createProgram(tsTestFiles, options);
+  let emitResult = program.emit();
+
+  let allDiagnostics = ts
+    .getPreEmitDiagnostics(program)
+    .concat(emitResult.diagnostics);
+
+  allDiagnostics.forEach((diagnostic) => {
+    if (diagnostic.file) {
+      let { line, character } = diagnostic.file.getLineAndCharacterOfPosition(
+        diagnostic.start
+      );
+      let message = ts.flattenDiagnosticMessageText(
+        diagnostic.messageText,
+        '\n'
+      );
+
+      const compilerError = {
+        location: [line + 1, character + 1],
+        message
+      };
+      if (diagnostic.file.fileName.endsWith(`${MINIMAL_POSTFIX}.ts`)) {
+        const basename = nodePath.basename(
+          diagnostic.file.fileName,
+          `.${MINIMAL_POSTFIX}.ts`
+        );
+        if (!result[basename]) {
+          throw new Error(`${basename} does not exists in result.`);
         }
-        else {
-            console.log(chalk.red(ts.flattenDiagnosticMessageText(diagnostic.messageText, '\n')));
+        result[basename].compileErrors.minimal.push(compilerError);
+      } else {
+        const basename = nodePath.basename(diagnostic.file.fileName, `.ts`);
+        if (!result[basename]) {
+          throw new Error(`${basename} does not exists in result.`);
         }
-    });
-    // assert(!emitResult.emitSkipped, 'ts compile failed.');
+        result[basename].compileErrors.full.push(compilerError);
+      }
+      // console.log(chalk.red(`${diagnostic.file.fileName} (${line + 1},${character + 1})`));
+      // console.log(chalk.gray(message));
+    } else {
+      console.log(
+        chalk.red(ts.flattenDiagnosticMessageText(diagnostic.messageText, '\n'))
+      );
+    }
+  });
+  // assert(!emitResult.emitSkipped, 'ts compile failed.');
 }
 
 async function webpackBundle(esbuildService, entry, result) {
-    return new Promise((resolve) => {
-        webpack({
-            entry,
-            output: {
-                path: BUNDLE_DIR,
-                filename: '[name].js'
-            },
-            // Use esbuild as minify, terser is tooooooo slow for so much tests.
-            optimization: {
-                minimizer: MINIFY_BUNDLE ? [{
-                    apply(compiler) {
-                        compiler.hooks.compilation.tap(
-                            'ESBuild Minify',
-                            (compilation) => {
-                                compilation.hooks.optimizeChunkAssets.tapPromise(
-                                    'ESBuild Minify',
-                                    async (chunks) => {
-                                        for (const chunk of chunks) {
-                                            for (const file of chunk.files) {
-                                                const asset = compilation.assets[file];
-                                                const { source } = asset.sourceAndMap();
-                                                const result = await esbuildService.transform(source, {
-                                                    minify: true,
-                                                    sourcemap: false
-                                                });
-                                                compilation.updateAsset(file, () => {
-                                                    return new RawSource(result.code || '');
-                                                });
-                                            }
-                                        }
-                                    }
+  return new Promise((resolve) => {
+    webpack(
+      {
+        entry,
+        output: {
+          path: BUNDLE_DIR,
+          filename: '[name].js'
+        },
+        // Use esbuild as minify, terser is tooooooo slow for so much tests.
+        optimization: {
+          minimizer: MINIFY_BUNDLE
+            ? [
+                {
+                  apply(compiler) {
+                    compiler.hooks.compilation.tap(
+                      'ESBuild Minify',
+                      (compilation) => {
+                        compilation.hooks.optimizeChunkAssets.tapPromise(
+                          'ESBuild Minify',
+                          async (chunks) => {
+                            for (const chunk of chunks) {
+                              for (const file of chunk.files) {
+                                const asset = compilation.assets[file];
+                                const { source } = asset.sourceAndMap();
+                                const result = await esbuildService.transform(
+                                  source,
+                                  {
+                                    minify: true,
+                                    sourcemap: false
+                                  }
                                 );
-                            },
-                          );
-
-                    }
-                }] : []
-            }
-        }, (err, stats) => {
-            if (err || stats.hasErrors()) {
-                if (err) {
-                    console.error(err.stack || err);
-                    if (err.details) {
-                        console.error(err.details);
-                    }
-                    resolve();
-                    return;
-                }
-
-                const info = stats.toJson();
-
-                if (stats.hasErrors()) {
-                    console.error(info.errors);
-                }
-
-                if (stats.hasWarnings()) {
-                    console.warn(info.warnings);
+                                compilation.updateAsset(file, () => {
+                                  return new RawSource(result.code || '');
+                                });
+                              }
+                            }
+                          }
+                        );
+                      }
+                    );
+                  }
                 }
+              ]
+            : []
+        }
+      },
+      (err, stats) => {
+        if (err || stats.hasErrors()) {
+          if (err) {
+            console.error(err.stack || err);
+            if (err.details) {
+              console.error(err.details);
             }
-            else {
-                console.log(chalk.green(`${Object.values(entry).map(a => `Bundled ${a}`).join('\n')}`));
-            }
-
             resolve();
-        });
-    })
+            return;
+          }
+
+          const info = stats.toJson();
+
+          if (stats.hasErrors()) {
+            console.error(info.errors);
+          }
+
+          if (stats.hasWarnings()) {
+            console.warn(info.warnings);
+          }
+        } else {
+          console.log(
+            chalk.green(
+              `${Object.values(entry)
+                .map((a) => `Bundled ${a}`)
+                .join('\n')}`
+            )
+          );
+        }
+
+        resolve();
+      }
+    );
+  });
 }
 
 function esbuildBundle(entry, result, minify) {
-    return esbuild.build({
-        entryPoints: entry,
-        bundle: true,
-        minify: minify,
-        define: {
-            'process.env.NODE_ENV': JSON.stringify(minify ? 'production' : 'development')
-        },
-        outdir: BUNDLE_DIR
-    });
+  return esbuild.build({
+    entryPoints: entry,
+    bundle: true,
+    minify: minify,
+    define: {
+      'process.env.NODE_ENV': JSON.stringify(
+        minify ? 'production' : 'development'
+      )
+    },
+    outdir: BUNDLE_DIR
+  });
 }
 
 async function bundle(entryFiles, result) {
-    if (USE_WEBPACK) {
-        // Split to multiple buckets to seepup bundle
-        // TODO Multiple entry may have effects on the final bundle.
-        const BUCKET_SIZE = 1;
-        const buckets = [];
-        const esbuildService = await esbuild.startService();
-        let count = 0;
-        outer: while (true) {
-            const bucket = {};
-            for (let i = 0; i < BUCKET_SIZE; i++) {
-                const filePath = entryFiles[count++];
-                if (!filePath) {
-                    break outer;
-                }
-                const basename = nodePath.basename(filePath, '.js');
-                bucket[basename] = filePath;
-            }
-            buckets.push(bucket);
-        }
-
-        // TODO Multiple thread.
-        for (let bucket of buckets) {
-            await webpackBundle(esbuildService, bucket, result);
+  if (USE_WEBPACK) {
+    // Split to multiple buckets to seepup bundle
+    // TODO Multiple entry may have effects on the final bundle.
+    const BUCKET_SIZE = 1;
+    const buckets = [];
+    const esbuildService = await esbuild.startService();
+    let count = 0;
+    outer: while (true) {
+      const bucket = {};
+      for (let i = 0; i < BUCKET_SIZE; i++) {
+        const filePath = entryFiles[count++];
+        if (!filePath) {
+          break outer;
         }
+        const basename = nodePath.basename(filePath, '.js');
+        bucket[basename] = filePath;
+      }
+      buckets.push(bucket);
+    }
 
-        esbuildService.stop();
+    // TODO Multiple thread.
+    for (let bucket of buckets) {
+      await webpackBundle(esbuildService, bucket, result);
     }
-    else {
-        for (let file of entryFiles) {
-            await esbuildBundle([file], result, MINIFY_BUNDLE);
-            console.log(chalk.green(`Bundled ${file}`));
-        }
+
+    esbuildService.stop();
+  } else {
+    for (let file of entryFiles) {
+      await esbuildBundle([file], result, MINIFY_BUNDLE);
+      console.log(chalk.green(`Bundled ${file}`));
     }
+  }
 }
 
 function waitTime(time) {
-    return new Promise((resolve) => setTimeout(resolve, time));
+  return new Promise((resolve) => setTimeout(resolve, time));
 }
 async function runExamples(jsFiles, result) {
-    const fileServer = new nStatic.Server(__dirname + '/../');
-    const server = require('http').createServer(function (request, response) {
-        request.addListener('end', function () {
-            fileServer.serve(request, response);
-        }).resume();
-    })
-    server.listen(port);
+  const fileServer = new nStatic.Server(__dirname + '/../');
+  const server = require('http').createServer(function (request, response) {
+    request
+      .addListener('end', function () {
+        fileServer.serve(request, response);
+      })
+      .resume();
+  });
+  server.listen(port);
+
+  try {
+    const IGNORE_LOG = [
+      'A cookie associated with a cross-site resource at',
+      'A parser-blocking, cross site',
+      // For ECharts GL
+      'RENDER WARNING',
+      'GL ERROR',
+      'GL_INVALID_OPERATION'
+    ];
+
+    const browser = await puppeteer.launch({
+      headless: false,
+      args: [
+        '--headless',
+        '--hide-scrollbars',
+        // https://github.com/puppeteer/puppeteer/issues/4913
+        '--use-gl=egl',
+        '--mute-audio'
+      ]
+    });
 
-    try {
-        const IGNORE_LOG = [
-            'A cookie associated with a cross-site resource at',
-            'A parser-blocking, cross site',
-            // For ECharts GL
-            'RENDER WARNING',
-            'GL ERROR',
-            'GL_INVALID_OPERATION'
-        ];
-
-        const browser = await puppeteer.launch({
-            headless: false,
-            args: [
-                '--headless',
-                '--hide-scrollbars',
-                // https://github.com/puppeteer/puppeteer/issues/4913
-                '--use-gl=egl',
-                '--mute-audio'
-            ]
+    await runTasks(
+      jsFiles,
+      async (file) => {
+        const page = await browser.newPage();
+        const basename = nodePath.basename(file, '.js');
+        await page.setViewport({ width: 800, height: 600 });
+
+        page.on('pageerror', function (err) {
+          // TODO Record pageerror
+          console.error(chalk.red(`[PAGE ERROR] [${basename}]`));
+          console.error(chalk.red(err.toString()));
+        });
+        page.on('console', (msg) => {
+          const text = msg.text();
+          if (!IGNORE_LOG.find((a) => text.indexOf(a) >= 0)) {
+            console.log(chalk.gray(`[PAGE LOG] [${basename}]: ${text}`));
+          }
         });
 
-        await runTasks(jsFiles, async (file) => {
-            const page = await browser.newPage();
-            const basename = nodePath.basename(file, '.js');
-            await page.setViewport({ width: 800, height: 600 });
-
-            page.on('pageerror', function (err) {
-                // TODO Record pageerror
-                console.error(chalk.red(`[PAGE ERROR] [${basename}]`));
-                console.error(chalk.red(err.toString()));
-            });
-            page.on('console', msg => {
-                const text = msg.text();
-                if (!IGNORE_LOG.find(a => text.indexOf(a) >= 0)) {
-                    console.log(chalk.gray(`[PAGE LOG] [${basename}]: ${text}`));
-                }
-            });
-
-            await page.goto(`${baseUrl}/e2e/template.html`, {
-                waitUntil: 'networkidle0',
-                timeout: 10000
-            });
-            await page.addScriptTag({
-                url: `${baseUrl}/e2e/tmp/bundles/${basename}.js`
-            });
-            await waitTime(200);
-
-            await page.screenshot({
-                type: 'png',
-                path: nodePath.resolve(SCREENSHOTS_DIR, basename + '.png')
-            });
-
-            await page.close();
-
-            console.log(chalk.green(`Rendered ${file}`));
-        }, 8);
-    }
-    catch (e) {
-        server.close();
-        throw e;
-    }
-}
+        await page.goto(`${baseUrl}/e2e/template.html`, {
+          waitUntil: 'networkidle0',
+          timeout: 10000
+        });
+        await page.addScriptTag({
+          url: `${baseUrl}/e2e/tmp/bundles/${basename}.js`
+        });
+        await waitTime(200);
 
+        await page.screenshot({
+          type: 'png',
+          path: nodePath.resolve(SCREENSHOTS_DIR, basename + '.png')
+        });
 
-async function compareExamples(testNames, result) {
+        await page.close();
 
-    function writePNG(png, diffPath) {
-        return new Promise(resolve => {
-            const writer = fs.createWriteStream(diffPath);
-            png.pack().pipe(writer);
-            writer.on('finish', () => { resolve(); });
-        });
-    }
+        console.log(chalk.green(`Rendered ${file}`));
+      },
+      8
+    );
+  } catch (e) {
+    server.close();
+    throw e;
+  }
+}
 
-    for (let testName of testNames) {
-        const diffMinimal = await compareImage(
-            nodePath.resolve(SCREENSHOTS_DIR, testName + '.png'),
-            nodePath.resolve(SCREENSHOTS_DIR, `${testName}.${MINIMAL_POSTFIX}.png`)
-        );
-        const diffMinimalLegacy = await compareImage(
-            nodePath.resolve(SCREENSHOTS_DIR, testName + '.png'),
-            nodePath.resolve(SCREENSHOTS_DIR, `${testName}.${MINIMAL_LEGACY_POSTFIX}.png`)
-        );
+async function compareExamples(testNames, result) {
+  function writePNG(png, diffPath) {
+    return new Promise((resolve) => {
+      const writer = fs.createWriteStream(diffPath);
+      png.pack().pipe(writer);
+      writer.on('finish', () => {
+        resolve();
+      });
+    });
+  }
 
-        const diffMinimalPNGPath = nodePath.resolve(SCREENSHOTS_DIR, `${testName}.${MINIMAL_POSTFIX}.diff.png`);
-        const diffMinimalLegacyPNGPath = nodePath.resolve(SCREENSHOTS_DIR, `${testName}.${MINIMAL_LEGACY_POSTFIX}.diff.png`);
+  for (let testName of testNames) {
+    const diffMinimal = await compareImage(
+      nodePath.resolve(SCREENSHOTS_DIR, testName + '.png'),
+      nodePath.resolve(SCREENSHOTS_DIR, `${testName}.${MINIMAL_POSTFIX}.png`)
+    );
+    const diffMinimalLegacy = await compareImage(
+      nodePath.resolve(SCREENSHOTS_DIR, testName + '.png'),
+      nodePath.resolve(
+        SCREENSHOTS_DIR,
+        `${testName}.${MINIMAL_LEGACY_POSTFIX}.png`
+      )
+    );
 
-        writePNG(diffMinimal.diffPNG, diffMinimalPNGPath);
-        writePNG(diffMinimalLegacy.diffPNG, diffMinimalLegacyPNGPath);
+    const diffMinimalPNGPath = nodePath.resolve(
+      SCREENSHOTS_DIR,
+      `${testName}.${MINIMAL_POSTFIX}.diff.png`
+    );
+    const diffMinimalLegacyPNGPath = nodePath.resolve(
+      SCREENSHOTS_DIR,
+      `${testName}.${MINIMAL_LEGACY_POSTFIX}.diff.png`
+    );
 
-        result[testName].screenshotDiff = {
-            minimal: {
-                ratio: diffMinimal.diffRatio,
-                png: nodePath.basename(diffMinimalPNGPath)
-            },
-            minimalLegacy: {
-                ratio: diffMinimalLegacy.diffRatio,
-                png: nodePath.basename(diffMinimalLegacyPNGPath)
-            }
-        }
+    writePNG(diffMinimal.diffPNG, diffMinimalPNGPath);
+    writePNG(diffMinimalLegacy.diffPNG, diffMinimalLegacyPNGPath);
+
+    result[testName].screenshotDiff = {
+      minimal: {
+        ratio: diffMinimal.diffRatio,
+        png: nodePath.basename(diffMinimalPNGPath)
+      },
+      minimalLegacy: {
+        ratio: diffMinimalLegacy.diffRatio,
+        png: nodePath.basename(diffMinimalLegacyPNGPath)
+      }
+    };
 
-        if (diffMinimal.diffRatio > 0 || diffMinimalLegacy.diffRatio > 0) {
-            console.log(chalk.red(`Failed ${testName}`));
-        }
-        else {
-            console.log(chalk.green(`Passed ${testName}`));
-        }
+    if (diffMinimal.diffRatio > 0 || diffMinimalLegacy.diffRatio > 0) {
+      console.log(chalk.red(`Failed ${testName}`));
+    } else {
+      console.log(chalk.green(`Passed ${testName}`));
     }
+  }
 }
 
-
 async function main() {
-    let result;
-
-    if (!args.skip && !args.tests) {
-        // Don't clean up if skipping some of the stages.
-        await prepare();
-        result = {};
-    }
-    else {
-        // Read result.
-        try {
-            result = JSON.parse(fs.readFileSync(__dirname + '/tmp/result.json', 'utf-8'));
-        }
-        catch (e) {
-            console.error(e);
-            throw 'Must run full e2e test without --skip and --tests at least once.';
-        }
-    }
-
-    function isNotSkipped(stage) {
-        return !((args.skip || '').indexOf(stage) >= 0);
+  let result;
+
+  if (!args.skip && !args.tests) {
+    // Don't clean up if skipping some of the stages.
+    await prepare();
+    result = {};
+  } else {
+    // Read result.
+    try {
+      result = JSON.parse(
+        fs.readFileSync(__dirname + '/tmp/result.json', 'utf-8')
+      );
+    } catch (e) {
+      console.error(e);
+      throw 'Must run full e2e test without --skip and --tests at least once.';
     }
+  }
 
-    // We don't have to test the npm if bundle is also skipped.
-    if (isNotSkipped('npm') && isNotSkipped('bundle')) {
-        if (!args.local) {
-            console.log(chalk.gray('Downloading packages'));
-            await downloadPackages(config);
-        }
+  function isNotSkipped(stage) {
+    return !((args.skip || '').indexOf(stage) >= 0);
+  }
 
-        console.log(chalk.gray('Installing packages'));
-        await installPackages(config);
-    }
-    else {
-        console.log(chalk.yellow('Skipped NPM.'));
+  // We don't have to test the npm if bundle is also skipped.
+  if (isNotSkipped('npm') && isNotSkipped('bundle')) {
+    if (!args.local) {
+      console.log(chalk.gray('Downloading packages'));
+      await downloadPackages(config);
     }
 
-
-    console.log(chalk.gray('Generating codes'));
-    // Always build code.
-    const testNames = await buildRunCode();
-
-    for (let key of testNames) {
-        result[key] = result[key] || {};
-    }
-
-    Object.keys(result).forEach(key => {
-        // Always do TS check on all tests. So reset all compile errors.
-        result[key].compileErrors = {
-            full: [],
-            minimal: [],
-            minimalLegacy: []
-        };
-    });
-
-    console.log('Compiling TypeScript');
-    // Always run typescript check to generate the js code.
-    await compileTs(
-        (await globby(nodePath.join(RUN_CODE_DIR, '*.ts')))
-            // No need to check types of the minimal legacy imports
-            .filter(a => !a.endsWith(`${MINIMAL_LEGACY_POSTFIX}.ts`)),
-        result
+    console.log(chalk.gray('Installing packages'));
+    await installPackages(config);
+  } else {
+    console.log(chalk.yellow('Skipped NPM.'));
+  }
+
+  console.log(chalk.gray('Generating codes'));
+  // Always build code.
+  const testNames = await buildRunCode();
+
+  for (let key of testNames) {
+    result[key] = result[key] || {};
+  }
+
+  Object.keys(result).forEach((key) => {
+    // Always do TS check on all tests. So reset all compile errors.
+    result[key].compileErrors = {
+      full: [],
+      minimal: [],
+      minimalLegacy: []
+    };
+  });
+
+  console.log('Compiling TypeScript');
+  // Always run typescript check to generate the js code.
+  await compileTs(
+    (
+      await globby(nodePath.join(RUN_CODE_DIR, '*.ts'))
+    )
+      // No need to check types of the minimal legacy imports
+      .filter((a) => !a.endsWith(`${MINIMAL_LEGACY_POSTFIX}.ts`)),
+    result
+  );
+
+  if (isNotSkipped('bundle')) {
+    console.log(
+      chalk.green(`Bundling with ${USE_WEBPACK ? 'webpack' : 'esbuild'}`)
     );
-
-    if (isNotSkipped('bundle')) {
-        console.log(chalk.green(`Bundling with ${USE_WEBPACK ? 'webpack' : 'esbuild'}`));
-        const jsFiles = [];
-        for (let testName of testNames) {
-            jsFiles.push(
-                nodePath.join(RUN_CODE_DIR, `${testName}.js`),
-                nodePath.join(RUN_CODE_DIR, `${testName}.${MINIMAL_POSTFIX}.js`),
-                nodePath.join(RUN_CODE_DIR, `${testName}.${MINIMAL_LEGACY_POSTFIX}.js`)
-            );
-        }
-        await bundle(jsFiles, result);
-    }
-    else {
-        console.log(chalk.yellow('Skipped Bundle.'));
-    }
-
-    if (isNotSkipped('render')) {
-        console.log(chalk.green('Running examples'));
-        const bundleFiles = [];
-        for (let testName of testNames) {
-            bundleFiles.push(
-                nodePath.join(BUNDLE_DIR, `${testName}.js`),
-                nodePath.join(BUNDLE_DIR, `${testName}.${MINIMAL_POSTFIX}.js`),
-                nodePath.join(BUNDLE_DIR, `${testName}.${MINIMAL_LEGACY_POSTFIX}.js`)
-            );
-        }
-        await runExamples(bundleFiles, result);
-    }
-    else {
-        console.log(chalk.yellow('Skipped Render.'));
-    }
-
-    if (isNotSkipped('compare')) {
-        console.log(chalk.green('Comparing Results'));
-        await compareExamples(testNames, result);
+    const jsFiles = [];
+    for (let testName of testNames) {
+      jsFiles.push(
+        nodePath.join(RUN_CODE_DIR, `${testName}.js`),
+        nodePath.join(RUN_CODE_DIR, `${testName}.${MINIMAL_POSTFIX}.js`),
+        nodePath.join(RUN_CODE_DIR, `${testName}.${MINIMAL_LEGACY_POSTFIX}.js`)
+      );
     }
-    else {
-        console.log(chalk.yellow('Skipped Compare.'));
+    await bundle(jsFiles, result);
+  } else {
+    console.log(chalk.yellow('Skipped Bundle.'));
+  }
+
+  if (isNotSkipped('render')) {
+    console.log(chalk.green('Running examples'));
+    const bundleFiles = [];
+    for (let testName of testNames) {
+      bundleFiles.push(
+        nodePath.join(BUNDLE_DIR, `${testName}.js`),
+        nodePath.join(BUNDLE_DIR, `${testName}.${MINIMAL_POSTFIX}.js`),
+        nodePath.join(BUNDLE_DIR, `${testName}.${MINIMAL_LEGACY_POSTFIX}.js`)
+      );
     }
-
-    fs.writeFileSync(__dirname + '/tmp/result.json', JSON.stringify(
-        result, null, 2
-    ), 'utf-8');
+    await runExamples(bundleFiles, result);
+  } else {
+    console.log(chalk.yellow('Skipped Render.'));
+  }
+
+  if (isNotSkipped('compare')) {
+    console.log(chalk.green('Comparing Results'));
+    await compareExamples(testNames, result);
+  } else {
+    console.log(chalk.yellow('Skipped Compare.'));
+  }
+
+  fs.writeFileSync(
+    __dirname + '/tmp/result.json',
+    JSON.stringify(result, null, 2),
+    'utf-8'
+  );
 }
 
-main().catch(e => {
+main()
+  .catch((e) => {
     console.error(e);
     process.exit();
-}).then(() => {
+  })
+  .then(() => {
     process.exit();
-});
+  });
 
-process.on('SIGINT', function() {
-    console.log('Closing');
-    // Close through ctrl + c;
-    process.exit();
-});
\ No newline at end of file
+process.on('SIGINT', function () {
+  console.log('Closing');
+  // Close through ctrl + c;
+  process.exit();
+});
diff --git a/e2e/package.json b/e2e/package.json
index bb44880..5dbec9c 100644
--- a/e2e/package.json
+++ b/e2e/package.json
@@ -9,6 +9,5 @@
   },
   "author": "",
   "license": "ISC",
-  "dependencies": {
-  }
+  "dependencies": {}
 }
diff --git a/e2e/preview.html b/e2e/preview.html
index fb94486..46f4ad5 100644
--- a/e2e/preview.html
+++ b/e2e/preview.html
@@ -1,27 +1,34 @@
 <!DOCTYPE html>
 <html lang="en">
-<head>
-    <meta charset="UTF-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/jquery@2.2.4/dist/jquery.min.js"></script>
-    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/dat.gui@0.6.5/build/dat.gui.min.js"></script>
+  <head>
+    <meta charset="UTF-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <script
+      type="text/javascript"
+      src="https://cdn.jsdelivr.net/npm/jquery@2.2.4/dist/jquery.min.js"
+    ></script>
+    <script
+      type="text/javascript"
+      src="https://cdn.jsdelivr.net/npm/dat.gui@0.6.5/build/dat.gui.min.js"
+    ></script>
     <title>Test Container</title>
-</head>
-<body>
+  </head>
+  <body>
     <style>
-        html, body {
-            margin: 0;
-            overflow: hidden;
-        }
-        #main {
-            position: absolute;
-            left: 0px;
-            top: 0px;
-            right: 0px;
-            bottom: 0px;
-        }
+      html,
+      body {
+        margin: 0;
+        overflow: hidden;
+      }
+      #main {
+        position: absolute;
+        left: 0px;
+        top: 0px;
+        right: 0px;
+        bottom: 0px;
+      }
     </style>
     <div id="main"></div>
     <script src="tmp/bundles/graph-grid.js"></script>
-</body>
-</html>
\ No newline at end of file
+  </body>
+</html>
diff --git a/e2e/report.html b/e2e/report.html
index d4c44f2..edc4589 100644
--- a/e2e/report.html
+++ b/e2e/report.html
@@ -1,186 +1,209 @@
 <!DOCTYPE html>
 <html lang="en">
-<head>
-    <meta charset="UTF-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <head>
+    <meta charset="UTF-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
     <title>Test Report</title>
-    <link href="https://cdn.jsdelivr.net/npm/element-ui@2.14.1/lib/theme-chalk/index.css" rel="stylesheet" type="text/css">
+    <link
+      href="https://cdn.jsdelivr.net/npm/element-ui@2.14.1/lib/theme-chalk/index.css"
+      rel="stylesheet"
+      type="text/css"
+    />
 
     <style>
-        #app {
-            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
-        }
+      #app {
+        font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+      }
 
-        .import-type-title {
-            padding: 10px;
-        }
+      .import-type-title {
+        padding: 10px;
+      }
 
-        .import-type-title div {
-            font-size: 14px;
-            font-family:'Courier New', Courier, monospace;
-        }
+      .import-type-title div {
+        font-size: 14px;
+        font-family: 'Courier New', Courier, monospace;
+      }
 
-        .type-error-log {
-            padding: 10px;
-            color: red;
-            font-family:'Courier New', Courier, monospace;
-        }
-        .type-error-log pre {
-            margin: 5px 0;
-            padding: 0;
-            /* https://css-tricks.com/snippets/css/make-pre-text-wrap/ */
-            white-space: pre-wrap;
-        }
-        .type-passed {
-            font-size: 14px;
-            color: green;
-            font-family:'Courier New', Courier, monospace;
-            padding: 10px;
-        }
+      .type-error-log {
+        padding: 10px;
+        color: red;
+        font-family: 'Courier New', Courier, monospace;
+      }
+      .type-error-log pre {
+        margin: 5px 0;
+        padding: 0;
+        /* https://css-tricks.com/snippets/css/make-pre-text-wrap/ */
+        white-space: pre-wrap;
+      }
+      .type-passed {
+        font-size: 14px;
+        color: green;
+        font-family: 'Courier New', Courier, monospace;
+        padding: 10px;
+      }
     </style>
-
-</head>
-<body>
+  </head>
+  <body>
     <div id="app">
-        <el-tabs v-model="tab" type="border-card">
-            <el-tab-pane label="Type Checking" name="typechecking">
-                <div v-for="item in typeCheckingResult">
-                    <h3>{{ item.testName }}({{item.compileErrorsCount}})</h3>
-                    <el-row :gutter="30">
-                        <el-col :span="12">
-                            <el-card :body-style="{ padding: '0px' }">
-                                <div class="import-type-title">
-                                    <div>全量引入</div>
-                                    <div>Full Import</div>
-                                </div>
-                                <div class="type-error-log" v-if="item.compileErrors.full.length">
-                                    <div v-for="compileError in item.compileErrors.full">
-                                        <pre>[{{compileError.location.join(', ')}}] {{compileError.message}}</pre>
-                                    </div>
-                                </div>
-                                <div class="type-passed" v-else>
-                                    No Error
-                                </div>
-                            </el-card>
-                        </el-col>
-                        <el-col :span="12">
-                            <el-card :body-style="{ padding: '0px' }">
-                                <div class="import-type-title">
-                                    <div>按需引入</div>
-                                    <div>Minimal Import </div>
-                                </div>
-                                <div class="type-error-log" v-if="item.compileErrors.minimal.length">
-                                    <div v-for="compileError in item.compileErrors.minimal">
-                                        <pre>[{{compileError.location.join(', ')}}] {{compileError.message}}</pre>
-                                    </div>
-                                </div>
-                                <div class="type-passed" v-else>
-                                    No Error
-                                </div>
-                            </el-card>
-                        </el-col>
-                    </el-row>
-                </div>
-            </el-tab-pane>
-            <el-tab-pane label="Screenshots Compare" name="screenshots">
-                <div v-for="item in screenshotsCompareResult">
-                    <h3>{{ item.testName }}({{item.screenshotDiffRatio}})</h3>
-                    <el-row :gutter="10">
-                        <el-col :span="4">
-                            <el-card :body-style="{ padding: '0px' }">
-                                <el-image :src="SCREENSHOT_ROOT + item.testName + '.png'"></el-image>
-                                <div class="import-type-title">
-                                    <div>全量引入</div>
-                                    <div>Full Import</div>
-                                </div>
-                            </el-card>
-                        </el-col>
-                        <el-col :span="4">
-                            <el-card :body-style="{ padding: '0px' }">
-                                <el-image :src="SCREENSHOT_ROOT + item.testName + '.minimal.png'"></el-image>
-                                <div class="import-type-title">
-                                    <div>按需引入</div>
-                                    <div>Minimal Import </div>
-                                </div>
-                            </el-card>
-                        </el-col>
-                        <el-col :span="4">
-                            <el-card :body-style="{ padding: '0px' }">
-                                <el-image :src="SCREENSHOT_ROOT + item.testName + '.minimal.legacy.png'"></el-image>
-                                <div class="import-type-title">
-                                    <div>自注册方式按需引入</div>
-                                    <div>Minimal Import with Self Registion</div>
-                                </div>
-                            </el-card>
-                        </el-col>
-                        <el-col :span="4">
-                            <el-card :body-style="{ padding: '0px' }">
-                                <el-image :src="SCREENSHOT_ROOT + item.testName + '.minimal.diff.png'"></el-image>
-                                <div class="import-type-title">
-                                    <div>按需引入差异</div>
-                                    <div>Diff of Minimal Import </div>
-                                </div>
-                            </el-card>
-                        </el-col>
-                        <el-col :span="4">
-                            <el-card :body-style="{ padding: '0px' }">
-                                <el-image :src="SCREENSHOT_ROOT + item.testName + '.minimal.legacy.diff.png'"></el-image>
-                                <div class="import-type-title">
-                                    <div>自注册方式按需引入差异</div>
-                                    <div>Diff of Minimal Import with Self Registion</div>
-                                </div>
-                            </el-card>
-                        </el-col>
-                    </el-row>
-                </div>
-            </el-tab-pane>
-        </el-tabs>
+      <el-tabs v-model="tab" type="border-card">
+        <el-tab-pane label="Type Checking" name="typechecking">
+          <div v-for="item in typeCheckingResult">
+            <h3>{{ item.testName }}({{item.compileErrorsCount}})</h3>
+            <el-row :gutter="30">
+              <el-col :span="12">
+                <el-card :body-style="{ padding: '0px' }">
+                  <div class="import-type-title">
+                    <div>全量引入</div>
+                    <div>Full Import</div>
+                  </div>
+                  <div
+                    class="type-error-log"
+                    v-if="item.compileErrors.full.length"
+                  >
+                    <div v-for="compileError in item.compileErrors.full">
+                      <pre>
+[{{compileError.location.join(', ')}}] {{compileError.message}}</pre
+                      >
+                    </div>
+                  </div>
+                  <div class="type-passed" v-else>No Error</div>
+                </el-card>
+              </el-col>
+              <el-col :span="12">
+                <el-card :body-style="{ padding: '0px' }">
+                  <div class="import-type-title">
+                    <div>按需引入</div>
+                    <div>Minimal Import</div>
+                  </div>
+                  <div
+                    class="type-error-log"
+                    v-if="item.compileErrors.minimal.length"
+                  >
+                    <div v-for="compileError in item.compileErrors.minimal">
+                      <pre>
+[{{compileError.location.join(', ')}}] {{compileError.message}}</pre
+                      >
+                    </div>
+                  </div>
+                  <div class="type-passed" v-else>No Error</div>
+                </el-card>
+              </el-col>
+            </el-row>
+          </div>
+        </el-tab-pane>
+        <el-tab-pane label="Screenshots Compare" name="screenshots">
+          <div v-for="item in screenshotsCompareResult">
+            <h3>{{ item.testName }}({{item.screenshotDiffRatio}})</h3>
+            <el-row :gutter="10">
+              <el-col :span="4">
+                <el-card :body-style="{ padding: '0px' }">
+                  <el-image
+                    :src="SCREENSHOT_ROOT + item.testName + '.png'"
+                  ></el-image>
+                  <div class="import-type-title">
+                    <div>全量引入</div>
+                    <div>Full Import</div>
+                  </div>
+                </el-card>
+              </el-col>
+              <el-col :span="4">
+                <el-card :body-style="{ padding: '0px' }">
+                  <el-image
+                    :src="SCREENSHOT_ROOT + item.testName + '.minimal.png'"
+                  ></el-image>
+                  <div class="import-type-title">
+                    <div>按需引入</div>
+                    <div>Minimal Import</div>
+                  </div>
+                </el-card>
+              </el-col>
+              <el-col :span="4">
+                <el-card :body-style="{ padding: '0px' }">
+                  <el-image
+                    :src="SCREENSHOT_ROOT + item.testName + '.minimal.legacy.png'"
+                  ></el-image>
+                  <div class="import-type-title">
+                    <div>自注册方式按需引入</div>
+                    <div>Minimal Import with Self Registion</div>
+                  </div>
+                </el-card>
+              </el-col>
+              <el-col :span="4">
+                <el-card :body-style="{ padding: '0px' }">
+                  <el-image
+                    :src="SCREENSHOT_ROOT + item.testName + '.minimal.diff.png'"
+                  ></el-image>
+                  <div class="import-type-title">
+                    <div>按需引入差异</div>
+                    <div>Diff of Minimal Import</div>
+                  </div>
+                </el-card>
+              </el-col>
+              <el-col :span="4">
+                <el-card :body-style="{ padding: '0px' }">
+                  <el-image
+                    :src="SCREENSHOT_ROOT + item.testName + '.minimal.legacy.diff.png'"
+                  ></el-image>
+                  <div class="import-type-title">
+                    <div>自注册方式按需引入差异</div>
+                    <div>Diff of Minimal Import with Self Registion</div>
+                  </div>
+                </el-card>
+              </el-col>
+            </el-row>
+          </div>
+        </el-tab-pane>
+      </el-tabs>
     </div>
     <script src="https://cdn.jsdelivr.net/npm/vue@^2.0.0/dist/vue.min.js"></script>
     <script src="https://cdn.jsdelivr.net/npm/element-ui@2.14.1/lib/index.js"></script>
 
     <script>
-        const app = new Vue({
-            el: '#app',
-            data() {
-                return {
-                    typeCheckingResult: [],
-                    screenshotsCompareResult: [],
+      const app = new Vue({
+        el: '#app',
+        data() {
+          return {
+            typeCheckingResult: [],
+            screenshotsCompareResult: [],
 
-                    SCREENSHOT_ROOT: './tmp/screenshots/',
+            SCREENSHOT_ROOT: './tmp/screenshots/',
 
-                    tab: 'screenshots',
-                    splitterModel: 10
-                };
-            }
-        });
+            tab: 'screenshots',
+            splitterModel: 10
+          };
+        }
+      });
 
-        fetch('./tmp/result.json')
-            .then(response => response.json())
-            .then(json => {
-                const result = [];
-                function getCompilerErrorsCount({ full, minimal, minimalLegacy }) {
-                    return full.length + minimal.length + minimalLegacy.length;
-                }
-                function getScreenshotDiffRatio({ minimal, minimalLegacy }) {
-                    return minimal.ratio + minimalLegacy.ratio;
-                }
+      fetch('./tmp/result.json')
+        .then((response) => response.json())
+        .then((json) => {
+          const result = [];
+          function getCompilerErrorsCount({ full, minimal, minimalLegacy }) {
+            return full.length + minimal.length + minimalLegacy.length;
+          }
+          function getScreenshotDiffRatio({ minimal, minimalLegacy }) {
+            return minimal.ratio + minimalLegacy.ratio;
+          }
 
-                Object.keys(json).forEach(key => {
-                    result.push({
-                        ...json[key],
-                        compileErrorsCount: getCompilerErrorsCount(json[key].compileErrors),
-                        screenshotDiffRatio: getScreenshotDiffRatio(json[key].screenshotDiff),
-                        testName: key
-                    });
-                });
-                app.typeCheckingResult = result.slice().sort((a, b) => {
-                    return b.compileErrorsCount - a.compileErrorsCount;
-                });
-                app.screenshotsCompareResult = result.slice().sort((a, b) => {
-                    return b.screenshotDiffRatio - a.screenshotDiffRatio;
-                });
+          Object.keys(json).forEach((key) => {
+            result.push({
+              ...json[key],
+              compileErrorsCount: getCompilerErrorsCount(
+                json[key].compileErrors
+              ),
+              screenshotDiffRatio: getScreenshotDiffRatio(
+                json[key].screenshotDiff
+              ),
+              testName: key
             });
+          });
+          app.typeCheckingResult = result.slice().sort((a, b) => {
+            return b.compileErrorsCount - a.compileErrorsCount;
+          });
+          app.screenshotsCompareResult = result.slice().sort((a, b) => {
+            return b.screenshotDiffRatio - a.screenshotDiffRatio;
+          });
+        });
     </script>
-</body>
-</html>
\ No newline at end of file
+  </body>
+</html>
diff --git a/e2e/template.html b/e2e/template.html
index 71c3b5b..664924f 100644
--- a/e2e/template.html
+++ b/e2e/template.html
@@ -1,26 +1,33 @@
 <!DOCTYPE html>
 <html lang="en">
-<head>
-    <meta charset="UTF-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/jquery@2.2.4/dist/jquery.min.js"></script>
-    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/dat.gui@0.6.5/build/dat.gui.min.js"></script>
+  <head>
+    <meta charset="UTF-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <script
+      type="text/javascript"
+      src="https://cdn.jsdelivr.net/npm/jquery@2.2.4/dist/jquery.min.js"
+    ></script>
+    <script
+      type="text/javascript"
+      src="https://cdn.jsdelivr.net/npm/dat.gui@0.6.5/build/dat.gui.min.js"
+    ></script>
     <title>Test Container</title>
-</head>
-<body>
+  </head>
+  <body>
     <style>
-        html, body {
-            margin: 0;
-            overflow: hidden;
-        }
-        #main {
-            position: absolute;
-            left: 0px;
-            top: 0px;
-            right: 0px;
-            bottom: 0px;
-        }
+      html,
+      body {
+        margin: 0;
+        overflow: hidden;
+      }
+      #main {
+        position: absolute;
+        left: 0px;
+        top: 0px;
+        right: 0px;
+        bottom: 0px;
+      }
     </style>
     <div id="main"></div>
-</body>
-</html>
\ No newline at end of file
+  </body>
+</html>
diff --git a/e2e/tsconfig.json b/e2e/tsconfig.json
index ad6231a..8c0fd90 100644
--- a/e2e/tsconfig.json
+++ b/e2e/tsconfig.json
@@ -1,13 +1,13 @@
 {
-    "compilerOptions": {
-        "target": "ES6",
+  "compilerOptions": {
+    "target": "ES6",
 
-        "strict": true,
+    "strict": true,
 
-        "moduleResolution": "node",
-        "pretty": true,
-        "outDir": "tmp/tests",
+    "moduleResolution": "node",
+    "pretty": true,
+    "outDir": "tmp/tests",
 
-        "baseUrl": "./"
-    }
-}
\ No newline at end of file
+    "baseUrl": "./"
+  }
+}
diff --git a/e2e/webpack.config.js b/e2e/webpack.config.js
index 9d8c056..02610e6 100644
--- a/e2e/webpack.config.js
+++ b/e2e/webpack.config.js
@@ -1,20 +1,19 @@
 const path = require('path');
-const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
+const BundleAnalyzerPlugin =
+  require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
 const config = require('./config');
 
 module.exports = {
-    entry: path.resolve(__dirname, 'tmp/tests/area-basic.minimal.js'),
-    plugins: [
-        new BundleAnalyzerPlugin()
-    ],
-    resolve: {
-        alias: {
-            echarts: config.echartsDir,
-            zrender: config.zrenderDir
-        }
-    },
-    output: {
-        path: path.resolve(__dirname, 'tmp/bundles/'),
-        filename: 'area-basic.minimal.js'
+  entry: path.resolve(__dirname, 'tmp/tests/area-basic.minimal.js'),
+  plugins: [new BundleAnalyzerPlugin()],
+  resolve: {
+    alias: {
+      echarts: config.echartsDir,
+      zrender: config.zrenderDir
     }
-}
\ No newline at end of file
+  },
+  output: {
+    path: path.resolve(__dirname, 'tmp/bundles/'),
+    filename: 'area-basic.minimal.js'
+  }
+};
diff --git a/public/en/editor.html b/public/en/editor.html
index 2a92cdc..006c037 100644
--- a/public/en/editor.html
+++ b/public/en/editor.html
@@ -1,38 +1,45 @@
 <!DOCTYPE html>
 <html lang="en">
-<head>
-    <meta charset="UTF-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <head>
+    <meta charset="UTF-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
     <title>ECharts Examples</title>
     <style>
-        body {
-            margin: 0;
-        }
-        ul, li {
-            margin: 0;
-            padding: 0;
-        }
+      body {
+        margin: 0;
+      }
+      ul,
+      li {
+        margin: 0;
+        padding: 0;
+      }
     </style>
-    <link rel="stylesheet" href="//cdn.jsdelivr.net/npm/bootstrap@3.4.1/dist/css/bootstrap.min.css">
-    <link rel="stylesheet" href="//cdn.jsdelivr.net/npm/element-ui@2.13.2/lib/theme-chalk/index.css">
+    <link
+      rel="stylesheet"
+      href="//cdn.jsdelivr.net/npm/bootstrap@3.4.1/dist/css/bootstrap.min.css"
+    />
+    <link
+      rel="stylesheet"
+      href="//cdn.jsdelivr.net/npm/element-ui@2.13.2/lib/theme-chalk/index.css"
+    />
     <script src="//cdn.jsdelivr.net/npm/vue@2.6.11/dist/vue.min.js"></script>
     <script src="//cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.min.js"></script>
     <script src="//cdn.jsdelivr.net/npm/bootstrap@3.4.1/dist/js/bootstrap.min.js"></script>
     <script src="//cdn.jsdelivr.net/npm/element-ui@2.13.2/lib/index.js"></script>
-</head>
-<body>
+  </head>
+  <body>
     <div id="main"></div>
 
-    <link rel="stylesheet" href="../css/example-bundle.css">
+    <link rel="stylesheet" href="../css/example-bundle.css" />
     <script src="../js/example-bundle.js"></script>
 
     <script>
-        echartsExample.init(document.querySelector('#main'), {
-            locale: 'en',
-            cdnRoot: '../',
-            page: 'editor',
-            version: Date.now()
-        });
+      echartsExample.init(document.querySelector('#main'), {
+        locale: 'en',
+        cdnRoot: '../',
+        page: 'editor',
+        version: Date.now()
+      });
     </script>
-</body>
-</html>
\ No newline at end of file
+  </body>
+</html>
diff --git a/public/en/index.html b/public/en/index.html
index 31a4ee6..f70e34c 100644
--- a/public/en/index.html
+++ b/public/en/index.html
@@ -1,39 +1,45 @@
 <!DOCTYPE html>
 <html lang="en">
-<head>
-    <meta charset="UTF-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <head>
+    <meta charset="UTF-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
     <title>ECharts Examples</title>
     <style>
-        body {
-            margin: 0;
-        }
-        ul, li {
-            margin: 0;
-            padding: 0;
-        }
-
+      body {
+        margin: 0;
+      }
+      ul,
+      li {
+        margin: 0;
+        padding: 0;
+      }
     </style>
-    <link rel="stylesheet" href="//cdn.jsdelivr.net/npm/bootstrap@3.4.1/dist/css/bootstrap.min.css">
-    <link rel="stylesheet" href="//cdn.jsdelivr.net/npm/element-ui@2.13.2/lib/theme-chalk/index.css">
+    <link
+      rel="stylesheet"
+      href="//cdn.jsdelivr.net/npm/bootstrap@3.4.1/dist/css/bootstrap.min.css"
+    />
+    <link
+      rel="stylesheet"
+      href="//cdn.jsdelivr.net/npm/element-ui@2.13.2/lib/theme-chalk/index.css"
+    />
     <script src="//cdn.jsdelivr.net/npm/vue@2.6.11/dist/vue.min.js"></script>
     <script src="//cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.min.js"></script>
     <script src="//cdn.jsdelivr.net/npm/bootstrap@3.4.1/dist/js/bootstrap.min.js"></script>
     <script src="//cdn.jsdelivr.net/npm/element-ui@2.13.2/lib/index.js"></script>
-</head>
-<body>
+  </head>
+  <body>
     <div id="main"></div>
 
-    <link rel="stylesheet" href="../css/example-bundle.css">
+    <link rel="stylesheet" href="../css/example-bundle.css" />
     <script src="../js/example-bundle.js"></script>
 
     <script>
-        echartsExample.init(document.querySelector('#main'), {
-            locale: 'en',
-            cdnRoot: '../',
-            page: 'explore',
-            version: Date.now()
-        });
+      echartsExample.init(document.querySelector('#main'), {
+        locale: 'en',
+        cdnRoot: '../',
+        page: 'explore',
+        version: Date.now()
+      });
     </script>
-</body>
-</html>
\ No newline at end of file
+  </body>
+</html>
diff --git a/public/en/view.html b/public/en/view.html
index 1d1cc5a..a2e1d01 100644
--- a/public/en/view.html
+++ b/public/en/view.html
@@ -1,38 +1,45 @@
 <!DOCTYPE html>
 <html lang="en">
-<head>
-    <meta charset="UTF-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <head>
+    <meta charset="UTF-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
     <title>ECharts Examples</title>
     <style>
-        body {
-            margin: 0;
-        }
-        ul, li {
-            margin: 0;
-            padding: 0;
-        }
+      body {
+        margin: 0;
+      }
+      ul,
+      li {
+        margin: 0;
+        padding: 0;
+      }
     </style>
-    <link rel="stylesheet" href="//cdn.jsdelivr.net/npm/bootstrap@3.4.1/dist/css/bootstrap.min.css">
-    <link rel="stylesheet" href="//cdn.jsdelivr.net/npm/element-ui@2.13.2/lib/theme-chalk/index.css">
+    <link
+      rel="stylesheet"
+      href="//cdn.jsdelivr.net/npm/bootstrap@3.4.1/dist/css/bootstrap.min.css"
+    />
+    <link
+      rel="stylesheet"
+      href="//cdn.jsdelivr.net/npm/element-ui@2.13.2/lib/theme-chalk/index.css"
+    />
     <script src="//cdn.jsdelivr.net/npm/vue@2.6.11/dist/vue.min.js"></script>
     <script src="//cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.min.js"></script>
     <script src="//cdn.jsdelivr.net/npm/bootstrap@3.4.1/dist/js/bootstrap.min.js"></script>
     <script src="//cdn.jsdelivr.net/npm/element-ui@2.13.2/lib/index.js"></script>
-</head>
-<body>
+  </head>
+  <body>
     <div id="main"></div>
 
-    <link rel="stylesheet" href="../css/example-bundle.css">
+    <link rel="stylesheet" href="../css/example-bundle.css" />
     <script src="../js/example-bundle.js"></script>
 
     <script>
-        echartsExample.init(document.querySelector('#main'), {
-            locale: 'en',
-            cdnRoot: '../',
-            page: 'view',
-            version: Date.now()
-        });
+      echartsExample.init(document.querySelector('#main'), {
+        locale: 'en',
+        cdnRoot: '../',
+        page: 'view',
+        version: Date.now()
+      });
     </script>
-</body>
-</html>
\ No newline at end of file
+  </body>
+</html>
diff --git a/public/zh/editor.html b/public/zh/editor.html
index ce69154..65edec1 100644
--- a/public/zh/editor.html
+++ b/public/zh/editor.html
@@ -1,38 +1,45 @@
 <!DOCTYPE html>
 <html lang="en">
-<head>
-    <meta charset="UTF-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <head>
+    <meta charset="UTF-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
     <title>ECharts Examples</title>
     <style>
-        body {
-            margin: 0;
-        }
-        ul, li {
-            margin: 0;
-            padding: 0;
-        }
+      body {
+        margin: 0;
+      }
+      ul,
+      li {
+        margin: 0;
+        padding: 0;
+      }
     </style>
-    <link rel="stylesheet" href="//cdn.jsdelivr.net/npm/bootstrap@3.4.1/dist/css/bootstrap.min.css">
-    <link rel="stylesheet" href="//cdn.jsdelivr.net/npm/element-ui@2.13.2/lib/theme-chalk/index.css">
+    <link
+      rel="stylesheet"
+      href="//cdn.jsdelivr.net/npm/bootstrap@3.4.1/dist/css/bootstrap.min.css"
+    />
+    <link
+      rel="stylesheet"
+      href="//cdn.jsdelivr.net/npm/element-ui@2.13.2/lib/theme-chalk/index.css"
+    />
     <script src="//cdn.jsdelivr.net/npm/vue@2.6.11/dist/vue.min.js"></script>
     <script src="//cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.min.js"></script>
     <script src="//cdn.jsdelivr.net/npm/bootstrap@3.4.1/dist/js/bootstrap.min.js"></script>
     <script src="//cdn.jsdelivr.net/npm/element-ui@2.13.2/lib/index.js"></script>
-</head>
-<body>
+  </head>
+  <body>
     <div id="main"></div>
 
-    <link rel="stylesheet" href="../css/example-bundle.css">
+    <link rel="stylesheet" href="../css/example-bundle.css" />
     <script src="../js/example-bundle.js"></script>
 
     <script>
-        echartsExample.init(document.querySelector('#main'), {
-            locale: 'zh',
-            cdnRoot: '../',
-            page: 'editor',
-            version: Date.now()
-        });
+      echartsExample.init(document.querySelector('#main'), {
+        locale: 'zh',
+        cdnRoot: '../',
+        page: 'editor',
+        version: Date.now()
+      });
     </script>
-</body>
-</html>
\ No newline at end of file
+  </body>
+</html>
diff --git a/public/zh/index.html b/public/zh/index.html
index 4d534de..4012cfa 100644
--- a/public/zh/index.html
+++ b/public/zh/index.html
@@ -1,39 +1,45 @@
 <!DOCTYPE html>
 <html lang="en">
-<head>
-    <meta charset="UTF-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <head>
+    <meta charset="UTF-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
     <title>ECharts Examples</title>
     <style>
-        body {
-            margin: 0;
-        }
-        ul, li {
-            margin: 0;
-            padding: 0;
-        }
-
+      body {
+        margin: 0;
+      }
+      ul,
+      li {
+        margin: 0;
+        padding: 0;
+      }
     </style>
-    <link rel="stylesheet" href="//cdn.jsdelivr.net/npm/bootstrap@3.4.1/dist/css/bootstrap.min.css">
-    <link rel="stylesheet" href="//cdn.jsdelivr.net/npm/element-ui@2.13.2/lib/theme-chalk/index.css">
+    <link
+      rel="stylesheet"
+      href="//cdn.jsdelivr.net/npm/bootstrap@3.4.1/dist/css/bootstrap.min.css"
+    />
+    <link
+      rel="stylesheet"
+      href="//cdn.jsdelivr.net/npm/element-ui@2.13.2/lib/theme-chalk/index.css"
+    />
     <script src="//cdn.jsdelivr.net/npm/vue@2.6.11/dist/vue.min.js"></script>
     <script src="//cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.min.js"></script>
     <script src="//cdn.jsdelivr.net/npm/bootstrap@3.4.1/dist/js/bootstrap.min.js"></script>
     <script src="//cdn.jsdelivr.net/npm/element-ui@2.13.2/lib/index.js"></script>
-</head>
-<body>
+  </head>
+  <body>
     <div id="main"></div>
 
-    <link rel="stylesheet" href="../css/example-bundle.css">
+    <link rel="stylesheet" href="../css/example-bundle.css" />
     <script src="../js/example-bundle.js"></script>
 
     <script>
-        echartsExample.init(document.querySelector('#main'), {
-            locale: 'zh',
-            cdnRoot: '../',
-            page: 'explore',
-            version: Date.now()
-        });
+      echartsExample.init(document.querySelector('#main'), {
+        locale: 'zh',
+        cdnRoot: '../',
+        page: 'explore',
+        version: Date.now()
+      });
     </script>
-</body>
-</html>
\ No newline at end of file
+  </body>
+</html>
diff --git a/public/zh/view.html b/public/zh/view.html
index b3d3927..5edb35b 100644
--- a/public/zh/view.html
+++ b/public/zh/view.html
@@ -1,38 +1,45 @@
 <!DOCTYPE html>
 <html lang="en">
-<head>
-    <meta charset="UTF-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <head>
+    <meta charset="UTF-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
     <title>ECharts Examples</title>
     <style>
-        body {
-            margin: 0;
-        }
-        ul, li {
-            margin: 0;
-            padding: 0;
-        }
+      body {
+        margin: 0;
+      }
+      ul,
+      li {
+        margin: 0;
+        padding: 0;
+      }
     </style>
-    <link rel="stylesheet" href="//cdn.jsdelivr.net/npm/bootstrap@3.4.1/dist/css/bootstrap.min.css">
-    <link rel="stylesheet" href="//cdn.jsdelivr.net/npm/element-ui@2.13.2/lib/theme-chalk/index.css">
+    <link
+      rel="stylesheet"
+      href="//cdn.jsdelivr.net/npm/bootstrap@3.4.1/dist/css/bootstrap.min.css"
+    />
+    <link
+      rel="stylesheet"
+      href="//cdn.jsdelivr.net/npm/element-ui@2.13.2/lib/theme-chalk/index.css"
+    />
     <script src="//cdn.jsdelivr.net/npm/vue@2.6.11/dist/vue.min.js"></script>
     <script src="//cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.min.js"></script>
     <script src="//cdn.jsdelivr.net/npm/bootstrap@3.4.1/dist/js/bootstrap.min.js"></script>
     <script src="//cdn.jsdelivr.net/npm/element-ui@2.13.2/lib/index.js"></script>
-</head>
-<body>
+  </head>
+  <body>
     <div id="main"></div>
 
-    <link rel="stylesheet" href="../css/example-bundle.css">
+    <link rel="stylesheet" href="../css/example-bundle.css" />
     <script src="../js/example-bundle.js"></script>
 
     <script>
-        echartsExample.init(document.querySelector('#main'), {
-            locale: 'zh',
-            cdnRoot: '../',
-            page: 'view',
-            version: Date.now()
-        });
+      echartsExample.init(document.querySelector('#main'), {
+        locale: 'zh',
+        cdnRoot: '../',
+        page: 'view',
+        version: Date.now()
+      });
     </script>
-</body>
-</html>
\ No newline at end of file
+  </body>
+</html>
diff --git a/src/common/config.js b/src/common/config.js
index faab503..c737a41 100644
--- a/src/common/config.js
+++ b/src/common/config.js
@@ -1,134 +1,138 @@
-
 export const EXAMPLE_CATEGORIES = [
-    'line',
-    'bar',
-    'pie',
-    'scatter',
-    'map',
-    'candlestick',
-    'radar',
-    'boxplot',
-    'heatmap',
-    'graph',
-    'lines',
-    'tree',
-    'treemap',
-    'sunburst',
-    'parallel',
-    'sankey',
-    'funnel',
-    'gauge',
-    'pictorialBar',
-    'themeRiver',
-    'calendar',
-    'custom',
+  'line',
+  'bar',
+  'pie',
+  'scatter',
+  'map',
+  'candlestick',
+  'radar',
+  'boxplot',
+  'heatmap',
+  'graph',
+  'lines',
+  'tree',
+  'treemap',
+  'sunburst',
+  'parallel',
+  'sankey',
+  'funnel',
+  'gauge',
+  'pictorialBar',
+  'themeRiver',
+  'calendar',
+  'custom',
 
-    'dataset',
-    'dataZoom',
-    'drag',
-    'rich',
+  'dataset',
+  'dataZoom',
+  'drag',
+  'rich',
 
-    'globe',
-    'bar3D',
-    'scatter3D',
-    'surface',
-    'map3D',
-    'lines3D',
-    'line3D',
-    'scatterGL',
-    'linesGL',
-    'flowGL',
-    'graphGL'
+  'globe',
+  'bar3D',
+  'scatter3D',
+  'surface',
+  'map3D',
+  'lines3D',
+  'line3D',
+  'scatterGL',
+  'linesGL',
+  'flowGL',
+  'graphGL'
 ];
 
 export const THEMES = {
-    default: [
-        '#5470c6',
-        '#91cc75',
-        '#fac858',
-        '#ee6666',
-        '#73c0de',
-        '#3ba272',
-        '#fc8452',
-        '#9a60b4',
-        '#ea7ccc'
-    ],
-    dark: [
-        '#4992ff',
-        '#7cffb2',
-        '#fddd60',
-        '#ff6e76',
-        '#58d9f9',
-        '#05c091',
-        '#ff8a45',
-        '#8d48e3',
-        '#dd79ff'
-    ]
+  default: [
+    '#5470c6',
+    '#91cc75',
+    '#fac858',
+    '#ee6666',
+    '#73c0de',
+    '#3ba272',
+    '#fc8452',
+    '#9a60b4',
+    '#ea7ccc'
+  ],
+  dark: [
+    '#4992ff',
+    '#7cffb2',
+    '#fddd60',
+    '#ff6e76',
+    '#58d9f9',
+    '#05c091',
+    '#ff8a45',
+    '#8d48e3',
+    '#dd79ff'
+  ]
 };
 
 export const BLACK_MAP = (function (list) {
-    const map = {};
-    for (var i = 0; i < list.length; i++) {
-        map[list[i]] = 1;
-    }
-    return location.href.indexOf('github.io') >= 0 ? {} : map;
+  const map = {};
+  for (var i = 0; i < list.length; i++) {
+    map[list[i]] = 1;
+  }
+  return location.href.indexOf('github.io') >= 0 ? {} : map;
 })([
-    'effectScatter-map',
-    'geo-lines',
-    'geo-map-scatter',
-    'heatmap-map',
-    'lines-airline',
-    'map-china',
-    'map-china-dataRange',
-    'map-labels',
-    'map-locate',
-    'map-province',
-    'map-world',
-    'map-world-dataRange',
-    'scatter-map',
-    'scatter-map-brush',
-    'scatter-weibo',
-    'scatter-world-population',
-    'geo3d',
-    'geo3d-with-different-height',
-    'globe-country-carousel',
-    'globe-with-echarts-surface',
-    'map3d-alcohol-consumption',
-    'map3d-wood-map',
-    'scattergl-weibo'
+  'effectScatter-map',
+  'geo-lines',
+  'geo-map-scatter',
+  'heatmap-map',
+  'lines-airline',
+  'map-china',
+  'map-china-dataRange',
+  'map-labels',
+  'map-locate',
+  'map-province',
+  'map-world',
+  'map-world-dataRange',
+  'scatter-map',
+  'scatter-map-brush',
+  'scatter-weibo',
+  'scatter-world-population',
+  'geo3d',
+  'geo3d-with-different-height',
+  'globe-country-carousel',
+  'globe-with-echarts-surface',
+  'map3d-alcohol-consumption',
+  'map3d-wood-map',
+  'scattergl-weibo'
 ]);
 
-
 const URL_PARAMS = {};
-(location.search || '').substr(1).split('&').forEach(function (item) {
+(location.search || '')
+  .substr(1)
+  .split('&')
+  .forEach(function (item) {
     const kv = item.split('=');
     URL_PARAMS[kv[0]] = kv[1];
-});
+  });
 
-export {URL_PARAMS};
+export { URL_PARAMS };
 
 export const SUPPORT_WEBP = (function () {
-    var elem = document.createElement('canvas');
-    elem.width = elem.height = 1;
-    if (!!(elem.getContext && elem.getContext('2d'))) {
-        // was able or not to get WebP representation
-        return elem.toDataURL('image/webp').indexOf('data:image/webp') === 0;
-    }
-    // very old browser like IE 8, canvas not supported
-    return false;
+  var elem = document.createElement('canvas');
+  elem.width = elem.height = 1;
+  if (!!(elem.getContext && elem.getContext('2d'))) {
+    // was able or not to get WebP representation
+    return elem.toDataURL('image/webp').indexOf('data:image/webp') === 0;
+  }
+  // very old browser like IE 8, canvas not supported
+  return false;
 })();
 
 export const SCRIPT_URLS = {
-    echartsMinJS: 'https://cdn.jsdelivr.net/npm/echarts@5/dist/echarts.min.js',
-    echartsDir: 'https://cdn.jsdelivr.net/npm/echarts@5',
+  echartsMinJS: 'https://cdn.jsdelivr.net/npm/echarts@5/dist/echarts.min.js',
+  echartsDir: 'https://cdn.jsdelivr.net/npm/echarts@5',
 
-    localEChartsMinJS: 'http://localhost/echarts/dist/echarts.js',
-    localEChartsDir: 'http://localhost/echarts',
+  localEChartsMinJS: 'http://localhost/echarts/dist/echarts.js',
+  localEChartsDir: 'http://localhost/echarts',
 
-    echartsStatMinJS: 'https://cdn.jsdelivr.net/npm/echarts-stat@latest/dist/ecStat.min.js',
-    // echartsGLMinJS: 'http://localhost/echarts-gl/dist/echarts-gl.min.js',
-    echartsGLMinJS: 'https://cdn.jsdelivr.net/npm/echarts-gl@2/dist/echarts-gl.min.js',
-    datGUIMinJS: 'https://cdn.jsdelivr.net/npm/dat.gui@0.6.5/build/dat.gui.min.js',
-    monacoDir: 'https://cdn.jsdelivr.net/npm/monaco-editor@0.21.2/min/vs',
-    aceDir: 'https://cdn.jsdelivr.net/npm/ace-builds@1.4.12/src-min-noconflict'
+  echartsStatMinJS:
+    'https://cdn.jsdelivr.net/npm/echarts-stat@latest/dist/ecStat.min.js',
+  // echartsGLMinJS: 'http://localhost/echarts-gl/dist/echarts-gl.min.js',
+  echartsGLMinJS:
+    'https://cdn.jsdelivr.net/npm/echarts-gl@2/dist/echarts-gl.min.js',
+  datGUIMinJS:
+    'https://cdn.jsdelivr.net/npm/dat.gui@0.6.5/build/dat.gui.min.js',
+  monacoDir: 'https://cdn.jsdelivr.net/npm/monaco-editor@0.21.2/min/vs',
+  aceDir: 'https://cdn.jsdelivr.net/npm/ace-builds@1.4.12/src-min-noconflict'
 };
diff --git a/src/common/helper.js b/src/common/helper.js
index ac4397a..811442e 100644
--- a/src/common/helper.js
+++ b/src/common/helper.js
@@ -1,60 +1,59 @@
-
 const promisesCache = {};
 
 export function loadScriptsAsync(scripts) {
-    return Promise.all(scripts.map(function (scriptUrl) {
-        if (typeof scriptUrl === 'string') {
-            scriptUrl = {
-                url: scriptUrl,
-                // TODO Not supported type
-                type: scriptUrl.match(/\.css$/) ? 'css' : 'js'
-            };
-        }
-        if (promisesCache[scriptUrl.url]) {
-            return promisesCache[scriptUrl.url];
+  return Promise.all(
+    scripts.map(function (scriptUrl) {
+      if (typeof scriptUrl === 'string') {
+        scriptUrl = {
+          url: scriptUrl,
+          // TODO Not supported type
+          type: scriptUrl.match(/\.css$/) ? 'css' : 'js'
+        };
+      }
+      if (promisesCache[scriptUrl.url]) {
+        return promisesCache[scriptUrl.url];
+      }
+      const promise = new Promise((resolve, reject) => {
+        if (scriptUrl.type === 'js') {
+          const script = document.createElement('script');
+          script.src = scriptUrl.url;
+          script.async = false;
+          script.onload = function () {
+            resolve();
+          };
+          script.onerror = function () {
+            reject();
+          };
+          document.body.appendChild(script);
+        } else if (scriptUrl.type === 'css') {
+          const link = document.createElement('link');
+          link.rel = 'stylesheet';
+          link.href = scriptUrl.url;
+          link.onload = function () {
+            resolve();
+          };
+          link.onerror = function () {
+            reject();
+          };
+          document.body.appendChild(link);
         }
-        const promise = new Promise((resolve, reject) => {
-            if (scriptUrl.type === 'js') {
-                const script = document.createElement('script');
-                script.src = scriptUrl.url;
-                script.async = false;
-                script.onload = function () {
-                    resolve();
-                };
-                script.onerror = function () {
-                    reject();
-                };
-                document.body.appendChild(script);
-            }
-            else if (scriptUrl.type === 'css') {
-                const link = document.createElement('link');
-                link.rel = 'stylesheet';
-                link.href = scriptUrl.url;
-                link.onload = function () {
-                    resolve();
-                };
-                link.onerror = function () {
-                    reject();
-                };
-                document.body.appendChild(link);
-            }
-        });
-        promisesCache[scriptUrl.url] = promise;
-        return promise;
-    }));
+      });
+      promisesCache[scriptUrl.url] = promise;
+      return promise;
+    })
+  );
 }
 
 export function downloadBlob(blob, fileName) {
-    // for IE
-    if (typeof window.navigator.msSaveBlob === 'function') {
-        window.navigator.msSaveOrOpenBlob(blob, fileName);
-    }
-    else {
-        const a = document.createElement('a');
-        a.href = URL.createObjectURL(blob);
-        a.download = fileName;
-        a.click();
-        // should revoke the blob url after the download
-        URL.revokeObjectURL(a.href);
-    }
-}
\ No newline at end of file
+  // for IE
+  if (typeof window.navigator.msSaveBlob === 'function') {
+    window.navigator.msSaveOrOpenBlob(blob, fileName);
+  } else {
+    const a = document.createElement('a');
+    a.href = URL.createObjectURL(blob);
+    a.download = fileName;
+    a.click();
+    // should revoke the blob url after the download
+    URL.revokeObjectURL(a.href);
+  }
+}
diff --git a/src/common/i18n.js b/src/common/i18n.js
index 369cba4..88e6493 100644
--- a/src/common/i18n.js
+++ b/src/common/i18n.js
@@ -1,135 +1,135 @@
 export default {
-    en: {
-        editor: {
-            run: 'Run',
-            errorInEditor: 'Errors exist in code!',
-            chartOK: 'Chart has been generated successfully, ',
+  en: {
+    editor: {
+      run: 'Run',
+      errorInEditor: 'Errors exist in code!',
+      chartOK: 'Chart has been generated successfully, ',
 
-            darkMode: 'Dark Mode',
-            enableDecal: 'Decal Pattern',
-            // lightMode: 'Light Mode',
+      darkMode: 'Dark Mode',
+      enableDecal: 'Decal Pattern',
+      // lightMode: 'Light Mode',
 
-            renderCfgTitle: 'Render',
-            renderer: 'Renderer',
-            useDirtyRect: 'Use Dirty Rect',
+      renderCfgTitle: 'Render',
+      renderer: 'Renderer',
+      useDirtyRect: 'Use Dirty Rect',
 
-            download: 'Download',
+      download: 'Download',
 
-            edit: 'Edit',
-            monacoMode: 'Enable Type Checking',
+      edit: 'Edit',
+      monacoMode: 'Enable Type Checking',
 
-            tabEditor: 'Edit Example',
-            tabFullCodePreview: 'Full Code',
-            tabOptionPreview: 'Option Preview',
-            minimalBundle: 'Minimal Bundle'
-        },
+      tabEditor: 'Edit Example',
+      tabFullCodePreview: 'Full Code',
+      tabOptionPreview: 'Option Preview',
+      minimalBundle: 'Minimal Bundle'
+    },
 
-        chartTypes: {
-            line: 'Line',
-            bar: 'Bar',
-            pie: 'Pie',
-            scatter: 'Scatter',
-            map: 'GEO/Map',
-            candlestick: 'Candlestick',
-            radar: 'Radar',
-            boxplot: 'Boxplot',
-            heatmap: 'Heatmap',
-            graph: 'Graph',
-            lines: 'Lines',
-            tree: 'Tree',
-            treemap: 'Treemap',
-            sunburst: 'Sunburst',
-            parallel: 'Parallel',
-            sankey: 'Sankey',
-            funnel: 'Funnel',
-            gauge: 'Gauge',
-            pictorialBar: 'PictorialBar',
-            themeRiver: 'ThemeRiver',
-            calendar: 'Calendar',
-            custom: 'Custom',
+    chartTypes: {
+      line: 'Line',
+      bar: 'Bar',
+      pie: 'Pie',
+      scatter: 'Scatter',
+      map: 'GEO/Map',
+      candlestick: 'Candlestick',
+      radar: 'Radar',
+      boxplot: 'Boxplot',
+      heatmap: 'Heatmap',
+      graph: 'Graph',
+      lines: 'Lines',
+      tree: 'Tree',
+      treemap: 'Treemap',
+      sunburst: 'Sunburst',
+      parallel: 'Parallel',
+      sankey: 'Sankey',
+      funnel: 'Funnel',
+      gauge: 'Gauge',
+      pictorialBar: 'PictorialBar',
+      themeRiver: 'ThemeRiver',
+      calendar: 'Calendar',
+      custom: 'Custom',
 
-            dataset: 'Dataset',
-            dataZoom: 'DataZoom',
-            drag: 'Drag',
-            rich: 'Rich Text',
+      dataset: 'Dataset',
+      dataZoom: 'DataZoom',
+      drag: 'Drag',
+      rich: 'Rich Text',
 
-            globe: '3D Globe',
-            bar3D: '3D Bar',
-            scatter3D: '3D Scatter',
-            surface: '3D Surface',
-            map3D: '3D Map',
-            lines3D: '3D Lines',
-            line3D: '3D Line',
-            scatterGL: 'Scatter GL',
-            linesGL: 'Lines GL',
-            flowGL: 'Flow GL',
-            graphGL: 'Graph GL'
-        }
-    },
-    zh: {
-        editor: {
-            run: '运行',
-            errorInEditor: '编辑器内容有误!',
-            chartOK: '图表已生成, ',
+      globe: '3D Globe',
+      bar3D: '3D Bar',
+      scatter3D: '3D Scatter',
+      surface: '3D Surface',
+      map3D: '3D Map',
+      lines3D: '3D Lines',
+      line3D: '3D Line',
+      scatterGL: 'Scatter GL',
+      linesGL: 'Lines GL',
+      flowGL: 'Flow GL',
+      graphGL: 'Graph GL'
+    }
+  },
+  zh: {
+    editor: {
+      run: '运行',
+      errorInEditor: '编辑器内容有误!',
+      chartOK: '图表已生成, ',
 
-            darkMode: '深色模式',
-            enableDecal: '无障碍花纹',
-            // lightMode: '浅色模式',
+      darkMode: '深色模式',
+      enableDecal: '无障碍花纹',
+      // lightMode: '浅色模式',
 
-            renderCfgTitle: '渲染设置',
-            useDirtyRect: '开启脏矩形优化',
-            renderer: '渲染模式',
-            download: '下载示例',
+      renderCfgTitle: '渲染设置',
+      useDirtyRect: '开启脏矩形优化',
+      renderer: '渲染模式',
+      download: '下载示例',
 
-            edit: '编辑',
-            monacoMode: '开启类型检查',
+      edit: '编辑',
+      monacoMode: '开启类型检查',
 
-            tabEditor: '示例编辑',
-            tabFullCodePreview: '完整代码',
-            tabOptionPreview: '配置项',
-            minimalBundle: '按需引入'
-        },
+      tabEditor: '示例编辑',
+      tabFullCodePreview: '完整代码',
+      tabOptionPreview: '配置项',
+      minimalBundle: '按需引入'
+    },
 
-        chartTypes: {
-            line: '折线图',
-            bar: '柱状图',
-            pie: '饼图',
-            scatter: '散点图',
-            map: '地理坐标/地图',
-            candlestick: 'K 线图',
-            radar: '雷达图',
-            boxplot: '盒须图',
-            heatmap: '热力图',
-            graph: '关系图',
-            lines: '路径图',
-            tree: '树图',
-            treemap: '矩形树图',
-            sunburst: '旭日图',
-            parallel: '平行坐标系',
-            sankey: '桑基图',
-            funnel: '漏斗图',
-            gauge: '仪表盘',
-            pictorialBar: '象形柱图',
-            themeRiver: '主题河流图',
-            calendar: '日历坐标系',
-            custom: '自定义系列',
+    chartTypes: {
+      line: '折线图',
+      bar: '柱状图',
+      pie: '饼图',
+      scatter: '散点图',
+      map: '地理坐标/地图',
+      candlestick: 'K 线图',
+      radar: '雷达图',
+      boxplot: '盒须图',
+      heatmap: '热力图',
+      graph: '关系图',
+      lines: '路径图',
+      tree: '树图',
+      treemap: '矩形树图',
+      sunburst: '旭日图',
+      parallel: '平行坐标系',
+      sankey: '桑基图',
+      funnel: '漏斗图',
+      gauge: '仪表盘',
+      pictorialBar: '象形柱图',
+      themeRiver: '主题河流图',
+      calendar: '日历坐标系',
+      custom: '自定义系列',
 
-            dataset: '数据集',
-            dataZoom: '数据区域缩放',
-            drag: '拖拽',
-            rich: '富文本',
+      dataset: '数据集',
+      dataZoom: '数据区域缩放',
+      drag: '拖拽',
+      rich: '富文本',
 
-            globe: '3D 地球',
-            bar3D: '3D 柱状图',
-            scatter3D: '3D 散点图',
-            surface: '3D 曲面',
-            map3D: '3D 地图',
-            lines3D: '3D 路径图',
-            line3D: '3D 折线图',
-            scatterGL: 'GL 散点图',
-            linesGL: 'GL 路径图',
-            flowGL: 'GL 矢量场图',
-            graphGL: 'GL 关系图'
-        }
+      globe: '3D 地球',
+      bar3D: '3D 柱状图',
+      scatter3D: '3D 散点图',
+      surface: '3D 曲面',
+      map3D: '3D 地图',
+      lines3D: '3D 路径图',
+      line3D: '3D 折线图',
+      scatterGL: 'GL 散点图',
+      linesGL: 'GL 路径图',
+      flowGL: 'GL 矢量场图',
+      graphGL: 'GL 关系图'
     }
-};
\ No newline at end of file
+  }
+};
diff --git a/src/common/store.js b/src/common/store.js
index 95a0d0f..54cc80a 100644
--- a/src/common/store.js
+++ b/src/common/store.js
@@ -1,58 +1,60 @@
-
 // import * as matter from 'gray-matter';
-import {URL_PARAMS} from '../common/config';
+import { URL_PARAMS } from '../common/config';
 
 export const store = {
-    cdnRoot: '',
-    version: '',
-    locale: '',
+  cdnRoot: '',
+  version: '',
+  locale: '',
 
-    darkMode: URL_PARAMS.theme === 'dark',
-    enableDecal: 'decal' in URL_PARAMS,
-    renderer: URL_PARAMS.renderer || 'canvas',
+  darkMode: URL_PARAMS.theme === 'dark',
+  enableDecal: 'decal' in URL_PARAMS,
+  renderer: URL_PARAMS.renderer || 'canvas',
 
-    typeCheck: URL_PARAMS.editor === 'monaco',
-    useDirtyRect: 'useDirtyRect' in URL_PARAMS,
+  typeCheck: URL_PARAMS.editor === 'monaco',
+  useDirtyRect: 'useDirtyRect' in URL_PARAMS,
 
-    runCode: '',
-    sourceCode: '',
+  runCode: '',
+  sourceCode: '',
 
-    runHash: '',
+  runHash: '',
 
-    isMobile: window.innerWidth < 600,
+  isMobile: window.innerWidth < 600,
 
-    editorStatus: {
-        type: '',
-        message: ''
-    }
+  editorStatus: {
+    type: '',
+    message: ''
+  }
 };
 
 export function loadExampleCode() {
-    return new Promise(resolve => {
-        const dataRoot = URL_PARAMS.gl ? 'data-gl' : 'data';
-        $.ajax(
-            store.typeCheck
-                ?  `${store.cdnRoot}/examples/ts/${URL_PARAMS.c}.ts?_v_${store.version}`
-                : `${store.cdnRoot}/${dataRoot}/${URL_PARAMS.c}.js?_v_${store.version}`,
-            {
-                dataType: 'text',
-                success: (data) => {
-                    resolve(data);
-                }
-            }
-        );
-    });
+  return new Promise((resolve) => {
+    const dataRoot = URL_PARAMS.gl ? 'data-gl' : 'data';
+    $.ajax(
+      store.typeCheck
+        ? `${store.cdnRoot}/examples/ts/${URL_PARAMS.c}.ts?_v_${store.version}`
+        : `${store.cdnRoot}/${dataRoot}/${URL_PARAMS.c}.js?_v_${store.version}`,
+      {
+        dataType: 'text',
+        success: (data) => {
+          resolve(data);
+        }
+      }
+    );
+  });
 }
 
 export function parseSourceCode(code) {
-    return code
-        // remove front matter
-        .replace(/\/\*[\w\W]*?\*\//, '').trim()
-        // ts code needs add `export {}` to be a module. remove it.
-        .replace(/export\s+\{\s*\}\s*;?$/g, '');
+  return (
+    code
+      // remove front matter
+      .replace(/\/\*[\w\W]*?\*\//, '')
+      .trim()
+      // ts code needs add `export {}` to be a module. remove it.
+      .replace(/export\s+\{\s*\}\s*;?$/g, '')
+  );
 }
 
 let hashId = 123;
 export function updateRunHash() {
-    store.runHash = hashId++;
-}
\ No newline at end of file
+  store.runHash = hashId++;
+}
diff --git a/src/dep/showDebugDirtyRect.js b/src/dep/showDebugDirtyRect.js
index fcd6e64..5ee3204 100644
--- a/src/dep/showDebugDirtyRect.js
+++ b/src/dep/showDebugDirtyRect.js
@@ -1,79 +1,83 @@
 var DebugRect = (function () {
-    function DebugRect(style) {
-        var dom = this.dom = document.createElement('div');
-        dom.className = 'ec-debug-dirty-rect';
-        style = Object.assign({}, style);
-        Object.assign(style, {
-            backgroundColor: 'rgba(0, 0, 255, 0.2)',
-            border: '1px solid #00f'
-        });
-        dom.style.cssText = "\nposition: absolute;\nopacity: 0;\ntransition: opacity 0.5s linear;\npointer-events: none;\n";
-        for (var key in style) {
-            if (style.hasOwnProperty(key)) {
-                dom.style[key] = style[key];
-            }
-        }
+  function DebugRect(style) {
+    var dom = (this.dom = document.createElement('div'));
+    dom.className = 'ec-debug-dirty-rect';
+    style = Object.assign({}, style);
+    Object.assign(style, {
+      backgroundColor: 'rgba(0, 0, 255, 0.2)',
+      border: '1px solid #00f'
+    });
+    dom.style.cssText =
+      '\nposition: absolute;\nopacity: 0;\ntransition: opacity 0.5s linear;\npointer-events: none;\n';
+    for (var key in style) {
+      if (style.hasOwnProperty(key)) {
+        dom.style[key] = style[key];
+      }
     }
-    DebugRect.prototype.update = function (rect) {
-        var domStyle = this.dom.style;
-        domStyle.width = rect.width + 'px';
-        domStyle.height = rect.height + 'px';
-        domStyle.left = rect.x + 'px';
-        domStyle.top = rect.y + 'px';
-    };
-    DebugRect.prototype.hide = function () {
-        this.dom.style.opacity = '0';
-    };
-    DebugRect.prototype.show = function () {
-        var _this = this;
-        clearTimeout(this._hideTimeout);
-        this.dom.style.opacity = '1';
-        this._hideTimeout = setTimeout(function () {
-            _this.hide();
-        }, 500);
-    };
-    return DebugRect;
-}());
+  }
+  DebugRect.prototype.update = function (rect) {
+    var domStyle = this.dom.style;
+    domStyle.width = rect.width + 'px';
+    domStyle.height = rect.height + 'px';
+    domStyle.left = rect.x + 'px';
+    domStyle.top = rect.y + 'px';
+  };
+  DebugRect.prototype.hide = function () {
+    this.dom.style.opacity = '0';
+  };
+  DebugRect.prototype.show = function () {
+    var _this = this;
+    clearTimeout(this._hideTimeout);
+    this.dom.style.opacity = '1';
+    this._hideTimeout = setTimeout(function () {
+      _this.hide();
+    }, 500);
+  };
+  return DebugRect;
+})();
 export default function (zr, opts) {
-    opts = opts || {};
-    var painter = zr.painter;
-    if (!painter.getLayers) {
-        throw new Error('Debug dirty rect can only been used on canvas renderer.');
-    }
-    if (painter.isSingleCanvas()) {
-        throw new Error('Debug dirty rect can only been used on zrender inited with container.');
-    }
-    var debugViewRoot = document.createElement('div');
-    debugViewRoot.style.cssText = "\nposition:absolute;\nleft:0;\ntop:0;\nright:0;\nbottom:0;\npointer-events:none;\n";
-    debugViewRoot.className = 'ec-debug-dirty-rect-container';
-    var debugRects = [];
-    var dom = zr.dom;
-    dom.appendChild(debugViewRoot);
-    var computedStyle = getComputedStyle(dom);
-    if (computedStyle.position === 'static') {
-        dom.style.position = 'relative';
-    }
-    zr.on('rendered', function () {
-        if (painter.getLayers) {
-            var idx_1 = 0;
-            painter.eachBuiltinLayer(function (layer) {
-                if (!layer.debugGetPaintRects) {
-                    return;
-                }
-                var paintRects = layer.debugGetPaintRects();
-                for (var i = 0; i < paintRects.length; i++) {
-                    if (!debugRects[idx_1]) {
-                        debugRects[idx_1] = new DebugRect(opts.style);
-                        debugViewRoot.appendChild(debugRects[idx_1].dom);
-                    }
-                    debugRects[idx_1].show();
-                    debugRects[idx_1].update(paintRects[i]);
-                    idx_1++;
-                }
-            });
-            for (var i = idx_1; i < debugRects.length; i++) {
-                debugRects[i].hide();
-            }
+  opts = opts || {};
+  var painter = zr.painter;
+  if (!painter.getLayers) {
+    throw new Error('Debug dirty rect can only been used on canvas renderer.');
+  }
+  if (painter.isSingleCanvas()) {
+    throw new Error(
+      'Debug dirty rect can only been used on zrender inited with container.'
+    );
+  }
+  var debugViewRoot = document.createElement('div');
+  debugViewRoot.style.cssText =
+    '\nposition:absolute;\nleft:0;\ntop:0;\nright:0;\nbottom:0;\npointer-events:none;\n';
+  debugViewRoot.className = 'ec-debug-dirty-rect-container';
+  var debugRects = [];
+  var dom = zr.dom;
+  dom.appendChild(debugViewRoot);
+  var computedStyle = getComputedStyle(dom);
+  if (computedStyle.position === 'static') {
+    dom.style.position = 'relative';
+  }
+  zr.on('rendered', function () {
+    if (painter.getLayers) {
+      var idx_1 = 0;
+      painter.eachBuiltinLayer(function (layer) {
+        if (!layer.debugGetPaintRects) {
+          return;
         }
-    });
+        var paintRects = layer.debugGetPaintRects();
+        for (var i = 0; i < paintRects.length; i++) {
+          if (!debugRects[idx_1]) {
+            debugRects[idx_1] = new DebugRect(opts.style);
+            debugViewRoot.appendChild(debugRects[idx_1].dom);
+          }
+          debugRects[idx_1].show();
+          debugRects[idx_1].update(paintRects[i]);
+          idx_1++;
+        }
+      });
+      for (var i = idx_1; i < debugRects.length; i++) {
+        debugRects[i].hide();
+      }
+    }
+  });
 }
diff --git a/src/editor/CodeAce.vue b/src/editor/CodeAce.vue
index ef2a34c..72258ca 100644
--- a/src/editor/CodeAce.vue
+++ b/src/editor/CodeAce.vue
@@ -1,116 +1,115 @@
 <template>
-<div class="ace-editor-main" v-loading="loading"></div>
+  <div class="ace-editor-main" v-loading="loading"></div>
 </template>
 
 <script>
-
-import {keywords} from '../data/option-keywords';
-import {loadScriptsAsync} from '../common/helper';
-import {store} from '../common/store';
-import {SCRIPT_URLS} from '../common/config';
+import { keywords } from '../data/option-keywords';
+import { loadScriptsAsync } from '../common/helper';
+import { store } from '../common/store';
+import { SCRIPT_URLS } from '../common/config';
 
 function ensureACE() {
-    if (typeof ace === 'undefined') {
-        return loadScriptsAsync([
-            SCRIPT_URLS.aceDir + '/ace.js',
-            SCRIPT_URLS.aceDir + '/ext-language_tools.js'
-        ]).then(function () {
-            const lnTools = ace.require('ace/ext/language_tools');
-
-            const completions = [];
-            keywords.forEach(keyword => {
-                completions.push({
-                    caption: keyword.name,
-                    value: keyword.name,
-                    score: keyword.count,
-                    metal: 'local'
-                });
-            });
+  if (typeof ace === 'undefined') {
+    return loadScriptsAsync([
+      SCRIPT_URLS.aceDir + '/ace.js',
+      SCRIPT_URLS.aceDir + '/ext-language_tools.js'
+    ]).then(function () {
+      const lnTools = ace.require('ace/ext/language_tools');
+
+      const completions = [];
+      keywords.forEach((keyword) => {
+        completions.push({
+          caption: keyword.name,
+          value: keyword.name,
+          score: keyword.count,
+          metal: 'local'
+        });
+      });
 
-            lnTools.addCompleter({
-                getCompletions: function (editor, session, pos, prefix, callback) {
-                    callback(null, completions);
-                }
-            });
-        })
-    }
-    return Promise.resolve();
+      lnTools.addCompleter({
+        getCompletions: function (editor, session, pos, prefix, callback) {
+          callback(null, completions);
+        }
+      });
+    });
+  }
+  return Promise.resolve();
 }
 
 export default {
-
-    props: ['initialCode'],
-
-    data() {
-        return {
-            shared: store,
-            loading: false
-        }
-    },
-
-    mounted() {
-        this.loading = true;
-        ensureACE().then(() => {
-            this.loading = false;
-            const editor = ace.edit(this.$el);
-            editor.getSession().setMode('ace/mode/javascript');
-            editor.setOptions({
-                enableBasicAutocompletion: true,
-                enableSnippets: true,
-                enableLiveAutocompletion: true
-            });
-
-            this._editor = editor;
-
-            editor.on('change', () => {
-                store.sourceCode =
-                    store.runCode = editor.getValue();
-            });
-
-            if (this.initialCode) {
-                this.setInitialCode(this.initialCode);
-            }
+  props: ['initialCode'],
+
+  data() {
+    return {
+      shared: store,
+      loading: false
+    };
+  },
+
+  mounted() {
+    this.loading = true;
+    ensureACE().then(() => {
+      this.loading = false;
+      const editor = ace.edit(this.$el);
+      editor.getSession().setMode('ace/mode/javascript');
+      editor.setOptions({
+        enableBasicAutocompletion: true,
+        enableSnippets: true,
+        enableLiveAutocompletion: true
+      });
+
+      this._editor = editor;
+
+      editor.on('change', () => {
+        store.sourceCode = store.runCode = editor.getValue();
+      });
+
+      if (this.initialCode) {
+        this.setInitialCode(this.initialCode);
+      }
+    });
+  },
+
+  methods: {
+    setInitialCode(code) {
+      if (this._editor && code) {
+        this._editor.setValue(code || '');
+        this._editor.selection.setSelectionRange({
+          start: {
+            row: 1,
+            column: 4
+          },
+          end: {
+            row: 1,
+            column: 4
+          }
         });
-    },
-
-    methods: {
-        setInitialCode(code) {
-            if (this._editor && code) {
-                this._editor.setValue(code || '');
-                this._editor.selection.setSelectionRange({
-                    start: {
-                        row:1,
-                        column: 4
-                    }, end: {
-                        row:1,
-                        column: 4
-                    }
-                });
-            }
-        }
-    },
+      }
+    }
+  },
 
-    watch: {
-        initialCode(newVal) {
-            this.setInitialCode(newVal);
-        }
+  watch: {
+    initialCode(newVal) {
+      this.setInitialCode(newVal);
     }
-}
+  }
+};
 </script>
 
 <style lang="scss">
 .ace-editor-main {
-    font-family: 'Source Code Pro', 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', monospace;
-    font-size: 12px;
-    line-height: 18px;
-    padding: 10px;
-    // height: 100%;
-
-    // Fix safari
-    position: absolute;
-    left: 0;
-    top: 0;
-    bottom: 0;
-    right: 0;
+  font-family: 'Source Code Pro', 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas',
+    monospace;
+  font-size: 12px;
+  line-height: 18px;
+  padding: 10px;
+  // height: 100%;
+
+  // Fix safari
+  position: absolute;
+  left: 0;
+  top: 0;
+  bottom: 0;
+  right: 0;
 }
-</style>
\ No newline at end of file
+</style>
diff --git a/src/editor/CodeMonaco.vue b/src/editor/CodeMonaco.vue
index 128c900..695af20 100644
--- a/src/editor/CodeMonaco.vue
+++ b/src/editor/CodeMonaco.vue
@@ -1,53 +1,56 @@
 <template>
-<div class="monaco-editor-main" v-loading="loading"></div>
+  <div class="monaco-editor-main" v-loading="loading"></div>
 </template>
 
 <script>
-
-import {loadScriptsAsync} from '../common/helper';
-import {store} from '../common/store';
-import {SCRIPT_URLS, URL_PARAMS} from '../common/config';
+import { loadScriptsAsync } from '../common/helper';
+import { store } from '../common/store';
+import { SCRIPT_URLS, URL_PARAMS } from '../common/config';
 import { ensureECharts } from './Preview.vue';
 
 function loadTypes() {
-    return fetch(
-        ('local' in URL_PARAMS
-                ? SCRIPT_URLS.localEChartsDir : SCRIPT_URLS.echartsDir) + '/types/dist/echarts.d.ts', {
-        mode: 'cors'
-    }).then(response => response.text()).then(code => {
-
-        // validation settings
-        monaco.languages.typescript.typescriptDefaults.setDiagnosticsOptions({
-            noSemanticValidation: false,
-            noSyntaxValidation: false
-        });
-
-        // compiler options
-        monaco.languages.typescript.typescriptDefaults.setCompilerOptions({
-            target: monaco.languages.typescript.ScriptTarget.ES6,
-            allowNonTsExtensions: true,
-            noResolve: false
-        });
-
-        // console.log('file:///node_modules/@types/' + res[i].path);
-        monaco.languages.typescript.typescriptDefaults.addExtraLib(
-            code,
-            // https://github.com/microsoft/monaco-editor/issues/667#issuecomment-468164794
-            'file:///node_modules/@types/echarts/echarts.d.ts'
-        );
-
-        monaco.languages.typescript.typescriptDefaults.addExtraLib(
-            `
+  return fetch(
+    ('local' in URL_PARAMS
+      ? SCRIPT_URLS.localEChartsDir
+      : SCRIPT_URLS.echartsDir) + '/types/dist/echarts.d.ts',
+    {
+      mode: 'cors'
+    }
+  )
+    .then((response) => response.text())
+    .then((code) => {
+      // validation settings
+      monaco.languages.typescript.typescriptDefaults.setDiagnosticsOptions({
+        noSemanticValidation: false,
+        noSyntaxValidation: false
+      });
+
+      // compiler options
+      monaco.languages.typescript.typescriptDefaults.setCompilerOptions({
+        target: monaco.languages.typescript.ScriptTarget.ES6,
+        allowNonTsExtensions: true,
+        noResolve: false
+      });
+
+      // console.log('file:///node_modules/@types/' + res[i].path);
+      monaco.languages.typescript.typescriptDefaults.addExtraLib(
+        code,
+        // https://github.com/microsoft/monaco-editor/issues/667#issuecomment-468164794
+        'file:///node_modules/@types/echarts/echarts.d.ts'
+      );
+
+      monaco.languages.typescript.typescriptDefaults.addExtraLib(
+        `
 import * as echarts from './echarts';
 // Export for UMD module.
 export as namespace echarts
 export = echarts;`,
-            // https://github.com/microsoft/monaco-editor/issues/667#issuecomment-468164794
-            'file:///node_modules/@types/echarts/index.d.ts'
-        );
+        // https://github.com/microsoft/monaco-editor/issues/667#issuecomment-468164794
+        'file:///node_modules/@types/echarts/index.d.ts'
+      );
 
-        monaco.languages.typescript.typescriptDefaults.addExtraLib(
-`import * as echarts from 'echarts';
+      monaco.languages.typescript.typescriptDefaults.addExtraLib(
+        `import * as echarts from 'echarts';
 // Declare to global namespace.
 declare global {
     const ROOT_PATH: string
@@ -76,117 +79,115 @@ declare global {
     const echarts: typeof echarts
 }
 `,
-            'file:///example.d.ts'
-        );
-        return;
+        'file:///example.d.ts'
+      );
+      return;
     });
 }
 
 function ensureMonacoAndTsTransformer() {
-    function loadMonaco() {
-        if (typeof monaco === 'undefined') {
-            return loadScriptsAsync([
-                SCRIPT_URLS.monacoDir + '/loader.js',
-                // Prebuilt TS transformer with surcrase
-                store.cdnRoot + '/js/example-transform-ts-bundle.js'
-            ]).then(function () {
-                window.require.config({ paths: { 'vs': SCRIPT_URLS.monacoDir }});
-                return new Promise(resolve => {
-                    window.require([
-                        'vs/editor/editor.main'
-                    ], function () {
-                        loadTypes().then(() => {
-                            resolve();
-                        });
-                    })
-                });
-            })
-        }
-        return Promise.resolve();
+  function loadMonaco() {
+    if (typeof monaco === 'undefined') {
+      return loadScriptsAsync([
+        SCRIPT_URLS.monacoDir + '/loader.js',
+        // Prebuilt TS transformer with surcrase
+        store.cdnRoot + '/js/example-transform-ts-bundle.js'
+      ]).then(function () {
+        window.require.config({ paths: { vs: SCRIPT_URLS.monacoDir } });
+        return new Promise((resolve) => {
+          window.require(['vs/editor/editor.main'], function () {
+            loadTypes().then(() => {
+              resolve();
+            });
+          });
+        });
+      });
     }
+    return Promise.resolve();
+  }
 
-    // Must load echarts before monaco. Or the AMD loader will affect loading of echarts.
-    return ensureECharts().then(loadMonaco);
+  // Must load echarts before monaco. Or the AMD loader will affect loading of echarts.
+  return ensureECharts().then(loadMonaco);
 }
 
 export default {
+  props: ['initialCode'],
 
-    props: ['initialCode'],
-
-    data() {
-        return {
-            shared: store,
-            loading: false
-        }
-    },
-
-    mounted() {
-        this.loading = true;
-        ensureMonacoAndTsTransformer().then(() => {
-            this.loading = false;
-            const model = monaco.editor.createModel(
-                this.initialCode || '',
-                'typescript',
-                // Should also be a file path so it can resolve the lib.
-                monaco.Uri.parse('file:///main.ts')
-            );
-            const editor = monaco.editor.create(this.$el, {
-                model,
-                fontFamily: `'Source Code Pro', 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', monospace`,
-                minimap: {
-                    enabled: false
-                },
-                automaticLayout: true
-            });
+  data() {
+    return {
+      shared: store,
+      loading: false
+    };
+  },
+
+  mounted() {
+    this.loading = true;
+    ensureMonacoAndTsTransformer().then(() => {
+      this.loading = false;
+      const model = monaco.editor.createModel(
+        this.initialCode || '',
+        'typescript',
+        // Should also be a file path so it can resolve the lib.
+        monaco.Uri.parse('file:///main.ts')
+      );
+      const editor = monaco.editor.create(this.$el, {
+        model,
+        fontFamily: `'Source Code Pro', 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', monospace`,
+        minimap: {
+          enabled: false
+        },
+        automaticLayout: true
+      });
+
+      this._editor = editor;
+
+      if (this.initialCode) {
+        store.sourceCode = this.initialCode;
+        store.runCode = echartsExampleTransformTs(store.sourceCode);
+      }
+      editor.onDidChangeModelContent(() => {
+        store.sourceCode = editor.getValue();
+        store.runCode = echartsExampleTransformTs(store.sourceCode);
+      });
+    });
+  },
 
-            this._editor = editor;
+  destroyed() {
+    if (this._editor) {
+      this._editor.getModel().dispose();
+      this._editor.dispose();
+    }
+  },
 
-            if (this.initialCode) {
-                store.sourceCode = this.initialCode;
-                store.runCode = echartsExampleTransformTs(store.sourceCode);
-            }
-            editor.onDidChangeModelContent(() => {
-                store.sourceCode = editor.getValue();
-                store.runCode = echartsExampleTransformTs(store.sourceCode);
-            });
-        });
-    },
-
-    destroyed() {
-        if (this._editor) {
-            this._editor.getModel().dispose();
-            this._editor.dispose();
-        }
-    },
-
-    methods: {
-        setInitialCode(code) {
-            if (this._editor && code) {
-                this._editor.setValue(code || '');
-            }
-        }
-    },
+  methods: {
+    setInitialCode(code) {
+      if (this._editor && code) {
+        this._editor.setValue(code || '');
+      }
+    }
+  },
 
-    watch: {
-        initialCode(newVal) {
-            this.setInitialCode(newVal);
-        }
+  watch: {
+    initialCode(newVal) {
+      this.setInitialCode(newVal);
     }
-}
+  }
+};
 </script>
 
 <style lang="scss">
 .monaco-editor-main {
-    font-family: 'Source Code Pro', 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', monospace;
-    font-size: 12px;
-    padding: 0;
-    overflow-y: hidden;
-    // height: 100%;
-    // Fix safari
-    position: absolute;
-    left: 0;
-    top: 0;
-    bottom: 0;
-    right: 0;
+  font-family: 'Source Code Pro', 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas',
+    monospace;
+  font-size: 12px;
+  padding: 0;
+  overflow-y: hidden;
+  // height: 100%;
+  // Fix safari
+  position: absolute;
+  left: 0;
+  top: 0;
+  bottom: 0;
+  right: 0;
 }
-</style>
\ No newline at end of file
+</style>
diff --git a/src/editor/Editor.vue b/src/editor/Editor.vue
index fe5532d..284487c 100644
--- a/src/editor/Editor.vue
+++ b/src/editor/Editor.vue
@@ -1,236 +1,264 @@
 <template>
-<div id="main-container">
-    <div id="editor-left-container" :style="{width: leftContainerSize + '%'}" v-if="!shared.isMobile">
-        <el-tabs v-model="currentTab" type="border-card">
-            <el-tab-pane :label="$t('editor.tabEditor')" name="code-editor">
-                <el-container>
-                    <el-header id="editor-control-panel">
-                        <div id="code-info">
-                            <template v-if="shared.editorStatus.message">
-                                <span class="code-info-time">{{currentTime}}</span>
-                                <span :class="'code-info-type-' + shared.editorStatus.type">{{shared.editorStatus.message}}</span>
-                            </template>
-                        </div>
-                        <div class="editor-controls">
-                            <!-- <el-switch v-model="shared.typeCheck"
+  <div id="main-container">
+    <div
+      id="editor-left-container"
+      :style="{ width: leftContainerSize + '%' }"
+      v-if="!shared.isMobile"
+    >
+      <el-tabs v-model="currentTab" type="border-card">
+        <el-tab-pane :label="$t('editor.tabEditor')" name="code-editor">
+          <el-container>
+            <el-header id="editor-control-panel">
+              <div id="code-info">
+                <template v-if="shared.editorStatus.message">
+                  <span class="code-info-time">{{ currentTime }}</span>
+                  <span :class="'code-info-type-' + shared.editorStatus.type">{{
+                    shared.editorStatus.message
+                  }}</span>
+                </template>
+              </div>
+              <div class="editor-controls">
+                <!-- <el-switch v-model="shared.typeCheck"
                                 :active-text="$t('editor.monacoMode')"
                                 :inactive-text="''"
                             ></el-switch> -->
-                            <a href="javascript:;" class='btn btn-default btn-sm' @click='disposeAndRun'>{{$t('editor.run')}}</a>
-                        </div>
-                    </el-header>
-                    <el-main>
-                        <CodeMonaco v-if="shared.typeCheck" id="code-panel" :initialCode="initialCode"></CodeMonaco>
-                        <CodeAce v-else id="code-panel" :initialCode="initialCode"></CodeAce>
-                    </el-main>
-                </el-container>
-            </el-tab-pane>
-
-            <el-tab-pane :label="$t('editor.tabFullCodePreview')" name="full-code" :lazy="true">
-                <el-container style="width: 100%; height: 100%">
-                    <el-header id="full-code-generate-config">
-                        <span class="full-code-generate-config-label">
-                            <!-- <i class="el-icon-setting"></i> 配置 -->
-                        </span>
-                        <el-switch
-                            class="enable-decal"
-                            v-model="fullCodeConfig.minimal"
-                            :active-text="$t('editor.minimalBundle')"
-                            :inactive-text="''">
-                        </el-switch>
-                        <el-switch
-                            class="enable-decal"
-                            v-model="fullCodeConfig.esm"
-                            active-text="ES Modules"
-                            :inactive-text="''">
-                        </el-switch>
-                    </el-header>
-                    <el-main>
-                        <FullCodePreview :code="fullCode"></FullCodePreview>
-                    </el-main>
-                </el-container>
-            </el-tab-pane>
-            <el-tab-pane :label="$t('editor.tabOptionPreview')" name="full-option">
-                <div id="option-outline"></div>
-            </el-tab-pane>
-        </el-tabs>
+                <a
+                  href="javascript:;"
+                  class="btn btn-default btn-sm"
+                  @click="disposeAndRun"
+                  >{{ $t('editor.run') }}</a
+                >
+              </div>
+            </el-header>
+            <el-main>
+              <CodeMonaco
+                v-if="shared.typeCheck"
+                id="code-panel"
+                :initialCode="initialCode"
+              ></CodeMonaco>
+              <CodeAce
+                v-else
+                id="code-panel"
+                :initialCode="initialCode"
+              ></CodeAce>
+            </el-main>
+          </el-container>
+        </el-tab-pane>
+
+        <el-tab-pane
+          :label="$t('editor.tabFullCodePreview')"
+          name="full-code"
+          :lazy="true"
+        >
+          <el-container style="width: 100%; height: 100%">
+            <el-header id="full-code-generate-config">
+              <span class="full-code-generate-config-label">
+                <!-- <i class="el-icon-setting"></i> 配置 -->
+              </span>
+              <el-switch
+                class="enable-decal"
+                v-model="fullCodeConfig.minimal"
+                :active-text="$t('editor.minimalBundle')"
+                :inactive-text="''"
+              >
+              </el-switch>
+              <el-switch
+                class="enable-decal"
+                v-model="fullCodeConfig.esm"
+                active-text="ES Modules"
+                :inactive-text="''"
+              >
+              </el-switch>
+            </el-header>
+            <el-main>
+              <FullCodePreview :code="fullCode"></FullCodePreview>
+            </el-main>
+          </el-container>
+        </el-tab-pane>
+        <el-tab-pane :label="$t('editor.tabOptionPreview')" name="full-option">
+          <div id="option-outline"></div>
+        </el-tab-pane>
+      </el-tabs>
     </div>
-    <div class="handler" id="h-handler" @mousedown="onSplitterDragStart" :style="{left: leftContainerSize + '%'}" v-if="!shared.isMobile"></div>
-    <Preview :inEditor="true" class="right-container" ref="preview" :style="{
-        width: (100 - leftContainerSize) + '%',
+    <div
+      class="handler"
+      id="h-handler"
+      @mousedown="onSplitterDragStart"
+      :style="{ left: leftContainerSize + '%' }"
+      v-if="!shared.isMobile"
+    ></div>
+    <Preview
+      :inEditor="true"
+      class="right-container"
+      ref="preview"
+      :style="{
+        width: 100 - leftContainerSize + '%',
         left: leftContainerSize + '%'
-    }"></Preview>
-</div>
+      }"
+    ></Preview>
+  </div>
 </template>
 
 <script>
-
 import CodeAce from './CodeAce.vue';
 import CodeMonaco from './CodeMonaco.vue';
 import FullCodePreview from './FullCodePreview.vue';
 import Preview from './Preview.vue';
-import {store, loadExampleCode, parseSourceCode} from '../common/store';
-import {collectDeps, buildExampleCode} from '../../common/buildCode';
-import { mount } from "@lang/object-visualizer";
+import { store, loadExampleCode, parseSourceCode } from '../common/store';
+import { collectDeps, buildExampleCode } from '../../common/buildCode';
+import { mount } from '@lang/object-visualizer';
 
 import './object-visualizer.css';
 
 export default {
-    components: {
-        CodeAce,
-        CodeMonaco,
-        FullCodePreview,
-        Preview
-    },
-
-    data() {
-        return {
-            mousedown: false,
-            leftContainerSize: 40,
-            mobileMode: false,
-            shared: store,
-            initialCode: '',
-
-            currentTab: 'code-editor',
+  components: {
+    CodeAce,
+    CodeMonaco,
+    FullCodePreview,
+    Preview
+  },
+
+  data() {
+    return {
+      mousedown: false,
+      leftContainerSize: 40,
+      mobileMode: false,
+      shared: store,
+      initialCode: '',
+
+      currentTab: 'code-editor',
+
+      fullCode: '',
+
+      fullCodeConfig: {
+        mimimal: false,
+        esm: true,
+        node: false // If is in node
+      }
+    };
+  },
+
+  computed: {
+    currentTime() {
+      // Update time when message updated.
+      const message = this.shared.message;
+
+      const time = new Date();
+      const digits = [time.getHours(), time.getMinutes(), time.getSeconds()];
+      let timeStr = '';
+      for (let i = 0, len = digits.length; i < len; ++i) {
+        timeStr += (digits[i] < 10 ? '0' : '') + digits[i];
+        if (i < len - 1) {
+          timeStr += ':';
+        }
+      }
+      return timeStr;
+    }
+  },
+
+  mounted() {
+    if (store.isMobile) {
+      this.leftContainerSize = 0;
+      loadExampleCode().then((code) => {
+        // No editor available. Set to runCode directly.
+        store.runCode = parseSourceCode(code);
+      });
+    } else {
+      loadExampleCode().then((code) => {
+        // Only set the code in editor. editor will sync to the store.
+        this.initialCode = parseSourceCode(code);
+      });
+
+      window.addEventListener('mousemove', (e) => {
+        if (this.mousedown) {
+          let percentage = e.clientX / window.innerWidth;
+          percentage = Math.min(0.9, Math.max(0.1, percentage));
+          this.leftContainerSize = percentage * 100;
+        }
+      });
 
-            fullCode: '',
+      window.addEventListener('mouseup', (e) => {
+        this.mousedown = false;
+      });
+    }
+  },
 
-            fullCodeConfig: {
-                mimimal: false,
-                esm: true,
-                node: false // If is in node
-            }
-        };
+  methods: {
+    onSplitterDragStart() {
+      this.mousedown = true;
     },
-
-    computed: {
-        currentTime() {
-            // Update time when message updated.
-            const message = this.shared.message;
-
-            const time = new Date();
-            const digits = [time.getHours(), time.getMinutes(), time.getSeconds()];
-            let timeStr = '';
-            for (let i = 0, len = digits.length; i < len; ++i) {
-                timeStr += (digits[i] < 10 ? '0' : '') + digits[i];
-                if (i < len - 1) {
-                    timeStr += ':';
-                }
-            }
-            return timeStr;
-        }
+    disposeAndRun() {
+      this.$refs.preview.refreshAll();
     },
-
-    mounted() {
-
-        if (store.isMobile) {
-            this.leftContainerSize = 0;
-            loadExampleCode().then(code => {
-                // No editor available. Set to runCode directly.
-                store.runCode = parseSourceCode(code);
-            });
-        }
-        else {
-            loadExampleCode().then(code => {
-                // Only set the code in editor. editor will sync to the store.
-                this.initialCode = parseSourceCode(code);
-            });
-
-            window.addEventListener('mousemove', (e) => {
-                if (this.mousedown) {
-                    let percentage = e.clientX / window.innerWidth;
-                    percentage = Math.min(0.9, Math.max(0.1, percentage));
-                    this.leftContainerSize = percentage * 100;
-                }
-            });
-
-            window.addEventListener('mouseup', (e) => {
-                this.mousedown = false;
-            });
-        }
+    updateFullCode() {
+      const option = this.$refs.preview.getOption();
+      if (!option) {
+        return;
+      }
+      const deps = collectDeps(option);
+      deps.push(store.renderer === 'svg' ? 'SVGRenderer' : 'CanvasRenderer');
+      this.fullCode = buildExampleCode(store.sourceCode, deps, {
+        minimal: this.fullCodeConfig.minimal,
+        ts: false,
+        esm: this.fullCodeConfig.esm,
+        // legacy: true,
+        theme: store.darkMode ? 'dark' : '',
+        ROOT_PATH: store.cdnRoot
+      });
     },
-
-    methods: {
-        onSplitterDragStart() {
-            this.mousedown = true;
-        },
-        disposeAndRun() {
-            this.$refs.preview.refreshAll();
-        },
-        updateFullCode() {
-            const option = this.$refs.preview.getOption();
-            if (!option) {
-                return;
-            }
-            const deps = collectDeps(option);
-            deps.push(store.renderer === 'svg' ? 'SVGRenderer' : 'CanvasRenderer');
-            this.fullCode = buildExampleCode(store.sourceCode, deps, {
-                minimal: this.fullCodeConfig.minimal,
-                ts: false,
-                esm: this.fullCodeConfig.esm,
-                // legacy: true,
-                theme: store.darkMode ? 'dark' : '',
-                ROOT_PATH: store.cdnRoot
-            });
-        },
-        updateOptionOutline() {
-            const option = Object.freeze(this.$refs.preview.getOption());
-            if (!option) {
-                return;
+    updateOptionOutline() {
+      const option = Object.freeze(this.$refs.preview.getOption());
+      if (!option) {
+        return;
+      }
+      mount(option, this.$el.querySelector('#option-outline'), {
+        getKeys(object, path) {
+          return Object.keys(object).filter((key) => {
+            if (Array.isArray(object[key]) && !object[key].length) {
+              return false;
             }
-            mount(
-                option,
-                this.$el.querySelector('#option-outline'),
-                {
-                    getKeys(object, path) {
-                        return Object.keys(object).filter(key => {
-                            if (Array.isArray(object[key]) && !object[key].length) {
-                                return false;
-                            }
-                            return true;
-                        });
-                    },
-                    expandOnCreatedAndUpdated(path) {
-                        return path.length === 0
-                            || (path[0] === 'series' && path.length <= 1);
-                    },
-                }
-            );
+            return true;
+          });
         },
-        updateTabContent(tab) {
-            if (tab === 'full-code') {
-                this.updateFullCode();
-            }
-            else if (tab === 'full-option') {
-                this.updateOptionOutline();
-            }
+        expandOnCreatedAndUpdated(path) {
+          return (
+            path.length === 0 || (path[0] === 'series' && path.length <= 1)
+          );
         }
+      });
     },
+    updateTabContent(tab) {
+      if (tab === 'full-code') {
+        this.updateFullCode();
+      } else if (tab === 'full-option') {
+        this.updateOptionOutline();
+      }
+    }
+  },
 
-    watch: {
-        'shared.typeCheck'(enableTypeCheck) {
-            // Update initialCode to avoid code changed when switching editor
-            this.initialCode = store.sourceCode;
-            this.updateFullCode();
-        },
-        'currentTab'(tab) {
-            this.updateTabContent(tab);
-        },
-        'shared.runHash'() {
-            this.updateTabContent(this.currentTab);
-        },
-        fullCodeConfig: {
-            deep: true,
-            handler() {
-                this.updateFullCode();
-            }
-        }
+  watch: {
+    'shared.typeCheck'(enableTypeCheck) {
+      // Update initialCode to avoid code changed when switching editor
+      this.initialCode = store.sourceCode;
+      this.updateFullCode();
+    },
+    currentTab(tab) {
+      this.updateTabContent(tab);
+    },
+    'shared.runHash'() {
+      this.updateTabContent(this.currentTab);
+    },
+    fullCodeConfig: {
+      deep: true,
+      handler() {
+        this.updateFullCode();
+      }
     }
-}
+  }
+};
 </script>
 
 <style lang="scss">
-
 @import '../style/color.scss';
 
 $code-info-height: 25px;
@@ -239,215 +267,215 @@ $pd-basic: 10px;
 $handler-width: 5px;
 
 #main-container {
-    .handler {
-        position: absolute;
-        left: 50%;
-
-        top: 0;
-        bottom: 0;
-        width: $handler-width;
-
-        cursor: col-resize;
-        z-index: 100;
-        background-color: transparent;
-        border-left: 1px solid #ececec;
-        // border-right: 1px solid $clr-border;
-    }
+  .handler {
+    position: absolute;
+    left: 50%;
 
+    top: 0;
+    bottom: 0;
+    width: $handler-width;
+
+    cursor: col-resize;
+    z-index: 100;
+    background-color: transparent;
+    border-left: 1px solid #ececec;
+    // border-right: 1px solid $clr-border;
+  }
 }
 
 #editor-left-container {
-    position: absolute;
-    left: 0;
-    bottom: 0;
-    top: 0;
+  position: absolute;
+  left: 0;
+  bottom: 0;
+  top: 0;
 
-    width: 50%;
+  width: 50%;
 
-    .el-tab-pane {
-        height: 100%;
-
-        .el-container {
-            width: 100%;
-            height: 100%;
-        }
-
-        .el-header {
-            height: $control-panel-height!important;
-            position: relative;
-            z-index: 10;
-            padding: 0;
-        }
-        .el-main {
-            padding: 0;
-            position: relative;
-
-            ::-webkit-scrollbar {
-                height:8px;
-                width:8px;
-                transition:all 0.3s ease-in-out;
-                border-radius:2px;
-            }
-
-            ::-webkit-scrollbar-button {
-                display:none;
-            }
-
-            ::-webkit-scrollbar-thumb {
-                width:8px;
-                min-height:15px;
-                background:rgba(50, 50, 50, 0.6) !important;
-                transition:all 0.3s ease-in-out;border-radius:2px;
-            }
-
-            ::-webkit-scrollbar-thumb:hover {
-                background:rgba(0, 0, 0, 0.5) !important;
-            }
-        }
-    }
+  .el-tab-pane {
+    height: 100%;
 
-    .el-tabs {
-        box-shadow: none;
+    .el-container {
+      width: 100%;
+      height: 100%;
     }
 
-    .el-tabs--border-card>.el-tabs__header {
-        border-bottom: none;
+    .el-header {
+      height: $control-panel-height !important;
+      position: relative;
+      z-index: 10;
+      padding: 0;
     }
-
-    .el-tabs__content {
-        position: absolute;
-        top: 34px;
-        left: 0;
-        right: 0;
-        bottom: 0;
-        padding: 0;
+    .el-main {
+      padding: 0;
+      position: relative;
+
+      ::-webkit-scrollbar {
+        height: 8px;
+        width: 8px;
+        transition: all 0.3s ease-in-out;
+        border-radius: 2px;
+      }
+
+      ::-webkit-scrollbar-button {
+        display: none;
+      }
+
+      ::-webkit-scrollbar-thumb {
+        width: 8px;
+        min-height: 15px;
+        background: rgba(50, 50, 50, 0.6) !important;
+        transition: all 0.3s ease-in-out;
+        border-radius: 2px;
+      }
+
+      ::-webkit-scrollbar-thumb:hover {
+        background: rgba(0, 0, 0, 0.5) !important;
+      }
     }
+  }
 
-    .el-tabs__item {
-        height: 34px;
-        line-height: 34px;
-    }
-}
+  .el-tabs {
+    box-shadow: none;
+  }
 
-#editor-control-panel, #full-code-generate-config {
-    box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
-}
+  .el-tabs--border-card > .el-tabs__header {
+    border-bottom: none;
+  }
 
-#option-outline {
-    // height: 100%;
-    // Fix safari
+  .el-tabs__content {
     position: absolute;
+    top: 34px;
     left: 0;
-    top: 0;
-    bottom: 0;
     right: 0;
+    bottom: 0;
+    padding: 0;
+  }
 
-    font-size: 13px;
-
-    font-family: 'Source Code Pro', 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', monospace;
+  .el-tabs__item {
+    height: 34px;
+    line-height: 34px;
+  }
 }
 
+#editor-control-panel,
 #full-code-generate-config {
-    .full-code-generate-config-label {
-        height: $control-panel-height;
-        line-height: $control-panel-height;
-        vertical-align: middle;
-        margin: 0 0 0 20px;
-    }
+  box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
+}
 
-    .el-switch {
-        margin-right: 10px;
-    }
+#option-outline {
+  // height: 100%;
+  // Fix safari
+  position: absolute;
+  left: 0;
+  top: 0;
+  bottom: 0;
+  right: 0;
+
+  font-size: 13px;
+
+  font-family: 'Source Code Pro', 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas',
+    monospace;
+}
 
-    .el-switch__label {
-        margin-left: 8px;
-        margin-top: -2px;
-    }
-    .el-switch__label * {
-        font-size: 12px;
-    }
+#full-code-generate-config {
+  .full-code-generate-config-label {
+    height: $control-panel-height;
+    line-height: $control-panel-height;
+    vertical-align: middle;
+    margin: 0 0 0 20px;
+  }
+
+  .el-switch {
+    margin-right: 10px;
+  }
+
+  .el-switch__label {
+    margin-left: 8px;
+    margin-top: -2px;
+  }
+  .el-switch__label * {
+    font-size: 12px;
+  }
 }
 
 #editor-control-panel {
-    .setting-panel {
-        display: inline-block;
+  .setting-panel {
+    display: inline-block;
 
-        .btn-group + .btn-group {
-            margin-left: $pd-basic;
-        }
+    .btn-group + .btn-group {
+      margin-left: $pd-basic;
     }
+  }
 
-    .editor-controls  {
-        float: right;
+  .editor-controls {
+    float: right;
 
-        .el-switch__label {
-            margin-top: -3px;
-        }
-        .el-switch__label * {
-            font-size: 12px;
-        }
-
-        .btn {
-            color: #FFF;
-            border-radius: 0;
-            background-color: #409eff;
-            margin-left: $pd-basic;
-            border: none;
-            height: 30px;
-            width: 50px;
-        }
-        .btn:hover {
-            background-color: lighten($color: #409eff, $amount: 5);
-        }
+    .el-switch__label {
+      margin-top: -3px;
     }
-}
-
-#code-info {
-    position: absolute;
-    bottom: 0;
-    overflow: hidden;
-
-    height: $control-panel-height;
-    line-height: $control-panel-height;
-    padding: 0px 10px;
-
-    // border-top: 1px solid $clr-border;
-    font-size: 0.9rem;
-
-    .code-info-time {
-        color: $clr-text;
-        display: inline-block;
-        margin-right: 10px;
-        font-size: 12px;
+    .el-switch__label * {
+      font-size: 12px;
     }
 
-    .code-info-type-info {
-        color: $clr-text;
-        font-size: 12px;
+    .btn {
+      color: #fff;
+      border-radius: 0;
+      background-color: #409eff;
+      margin-left: $pd-basic;
+      border: none;
+      height: 30px;
+      width: 50px;
     }
-
-    .code-info-type-warn {
-        color: $clr-warn;
+    .btn:hover {
+      background-color: lighten($color: #409eff, $amount: 5);
     }
+  }
+}
 
-    .code-info-type-error {
-        color: $clr-error;
-    }
+#code-info {
+  position: absolute;
+  bottom: 0;
+  overflow: hidden;
+
+  height: $control-panel-height;
+  line-height: $control-panel-height;
+  padding: 0px 10px;
+
+  // border-top: 1px solid $clr-border;
+  font-size: 0.9rem;
+
+  .code-info-time {
+    color: $clr-text;
+    display: inline-block;
+    margin-right: 10px;
+    font-size: 12px;
+  }
+
+  .code-info-type-info {
+    color: $clr-text;
+    font-size: 12px;
+  }
+
+  .code-info-type-warn {
+    color: $clr-warn;
+  }
+
+  .code-info-type-error {
+    color: $clr-error;
+  }
 }
 
 .right-container {
-    position: absolute;
-    right: 0;
+  position: absolute;
+  right: 0;
 
-    width: 50%;
-    height: 100%;
-    padding: 0;
-    padding-left: $handler-width;
-    border: none;
-    z-index: 30;
+  width: 50%;
+  height: 100%;
+  padding: 0;
+  padding-left: $handler-width;
+  border: none;
+  z-index: 30;
 
-    background: $clr-bg;
+  background: $clr-bg;
 }
-
-
-</style>
\ No newline at end of file
+</style>
diff --git a/src/editor/FullCodePreview.vue b/src/editor/FullCodePreview.vue
index e2f1c3f..19fce17 100644
--- a/src/editor/FullCodePreview.vue
+++ b/src/editor/FullCodePreview.vue
@@ -1,94 +1,91 @@
 <template>
-<div class="full-code-preview" v-loading="loading"></div>
+  <div class="full-code-preview" v-loading="loading"></div>
 </template>
 
 <script>
-
-import {loadScriptsAsync} from '../common/helper';
-import {store} from '../common/store';
-import {SCRIPT_URLS} from '../common/config';
+import { loadScriptsAsync } from '../common/helper';
+import { store } from '../common/store';
+import { SCRIPT_URLS } from '../common/config';
 
 function ensureACE() {
-    if (typeof ace === 'undefined') {
-        return loadScriptsAsync([
-            SCRIPT_URLS.aceDir + '/ace.js'
-        ]);
-    }
-    return Promise.resolve();
+  if (typeof ace === 'undefined') {
+    return loadScriptsAsync([SCRIPT_URLS.aceDir + '/ace.js']);
+  }
+  return Promise.resolve();
 }
 
 export default {
+  props: ['code'],
 
-    props: ['code'],
-
-    data() {
-        return {
-            shared: store,
-            loading: false
-        }
-    },
+  data() {
+    return {
+      shared: store,
+      loading: false
+    };
+  },
 
-    mounted() {
-        this.loading = true;
-        ensureACE().then(() => {
-            this.loading = false;
-            const editor = ace.edit(this.$el);
-            editor.getSession().setMode('ace/mode/javascript');
-            // https://stackoverflow.com/questions/32806060/is-there-a-programmatic-way-to-hide-the-cursor-in-ace-editor
-            editor.setOptions({
-                readOnly: true,
-                showLineNumbers: false,
-                showFoldWidgets: false,
-                highlightActiveLine: false,
-                highlightGutterLine: false
-            });
-            // editor.renderer.setShowGutter(false);
-            editor.renderer.$cursorLayer.element.style.display = 'none';
+  mounted() {
+    this.loading = true;
+    ensureACE().then(() => {
+      this.loading = false;
+      const editor = ace.edit(this.$el);
+      editor.getSession().setMode('ace/mode/javascript');
+      // https://stackoverflow.com/questions/32806060/is-there-a-programmatic-way-to-hide-the-cursor-in-ace-editor
+      editor.setOptions({
+        readOnly: true,
+        showLineNumbers: false,
+        showFoldWidgets: false,
+        highlightActiveLine: false,
+        highlightGutterLine: false
+      });
+      // editor.renderer.setShowGutter(false);
+      editor.renderer.$cursorLayer.element.style.display = 'none';
 
-            this._editor = editor;
+      this._editor = editor;
 
-            this.setCode(this.code);
+      this.setCode(this.code);
+    });
+  },
 
+  methods: {
+    setCode(code) {
+      if (this._editor) {
+        this._editor.setValue(code);
+        this._editor.selection.setSelectionRange({
+          start: {
+            row: 1,
+            column: 4
+          },
+          end: {
+            row: 1,
+            column: 4
+          }
         });
-    },
-
-    methods: {
-        setCode(code) {
-            if (this._editor) {
-                this._editor.setValue(code);
-                this._editor.selection.setSelectionRange({
-                    start: {
-                        row:1,
-                        column: 4
-                    }, end: {
-                        row:1,
-                        column: 4
-                    }
-                });
-            }
-        }
-    },
+      }
+    }
+  },
 
-    watch: {
-        code(newVal) {
-            this.setCode(newVal);
-        }
+  watch: {
+    code(newVal) {
+      this.setCode(newVal);
     }
-}
+  }
+};
 </script>
 
 <style lang="scss">
 .full-code-preview {
-    font-family: 'Source Code Pro', 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', monospace;
-    font-size: 12px;
-    line-height: 18px;
-    // height: 100%;
+  font-family: 'Source Code Pro', 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas',
+    monospace;
+  font-size: 12px;
+  line-height: 18px;
+  // height: 100%;
 
-    // Fix safari
-    position: absolute;
-    left: 0;
-    top: 0;
-    bottom: 0;
-    right: 0;
+  // Fix safari
+  position: absolute;
+  left: 0;
+  top: 0;
+  bottom: 0;
+  right: 0;
 }
-</style>
\ No newline at end of file
+</style>
diff --git a/src/editor/Preview.vue b/src/editor/Preview.vue
index 7903283..3d27e1d 100644
--- a/src/editor/Preview.vue
+++ b/src/editor/Preview.vue
@@ -1,424 +1,446 @@
 <template>
-<div :class="[(inEditor && !shared.isMobile) ? '' : 'full']">
-    <div v-loading="loading"
-        class="right-panel"
-        id="chart-panel"
-        :style="{background: backgroundColor}"
+  <div :class="[inEditor && !shared.isMobile ? '' : 'full']">
+    <div
+      v-loading="loading"
+      class="right-panel"
+      id="chart-panel"
+      :style="{ background: backgroundColor }"
     >
-        <div class="chart-container"></div>
+      <div class="chart-container"></div>
     </div>
     <div id="tool-panel">
-        <div class="left-panel">
-            <el-switch
-                class="dark-mode"
-                v-model="shared.darkMode"
-                active-color="#181432"
-                :active-text="$t('editor.darkMode')"
-                :inactive-text="''">
-            </el-switch>
-            <el-switch
-                v-if="!isGL"
-
-                class="enable-decal"
-                v-model="shared.enableDecal"
-                :active-text="$t('editor.enableDecal')"
-                :inactive-text="''">
-            </el-switch>
-
-            <el-popover
-                placement="bottom"
-                width="450"
-                trigger="click"
-                style="margin-top:3px;"
-
-                v-if="!isGL"
-            >
-                <div class="render-config-container">
-                    <el-row :gutter="2" type="flex" align="middle">
-                        <el-col :span="12">
-                            <label class="tool-label">{{ $t('editor.renderer') }}</label>
-                            <el-radio-group v-model="shared.renderer" size="mini" style="text-transform: uppercase">
-                                <el-radio-button label="svg"></el-radio-button>
-                                <el-radio-button label="canvas"></el-radio-button>
-                            </el-radio-group>
-                        </el-col>
-                        <el-col :span="12">
-                            <el-switch
-                                v-if="shared.renderer==='canvas'"
-                                v-model="shared.useDirtyRect"
-                                :active-text="$t('editor.useDirtyRect')"
-                                :inactive-text="''">
-                            </el-switch>
-                        </el-col>
-                    </el-row>
-                </div>
-                <span class="render-config-trigger" slot="reference"><i class="el-icon-setting el-icon--left"></i>{{$t('editor.renderCfgTitle')}}</span>
-            </el-popover>
-        </div>
-        <template v-if="inEditor">
-            <button v-if="!shared.isMobile" class="download btn btn-sm" @click="downloadExample">{{ $t('editor.download') }}</button>
-            <a class="screenshot" @click="screenshot" target="_blank"><i class="el-icon-camera-solid"></i></a>
-        </template>
-        <a :href="editLink" target="_blank" v-else class="edit btn btn-sm">{{ $t('editor.edit') }}</a>
+      <div class="left-panel">
+        <el-switch
+          class="dark-mode"
+          v-model="shared.darkMode"
+          active-color="#181432"
+          :active-text="$t('editor.darkMode')"
+          :inactive-text="''"
+        >
+        </el-switch>
+        <el-switch
+          v-if="!isGL"
+          class="enable-decal"
+          v-model="shared.enableDecal"
+          :active-text="$t('editor.enableDecal')"
+          :inactive-text="''"
+        >
+        </el-switch>
+
+        <el-popover
+          placement="bottom"
+          width="450"
+          trigger="click"
+          style="margin-top: 3px"
+          v-if="!isGL"
+        >
+          <div class="render-config-container">
+            <el-row :gutter="2" type="flex" align="middle">
+              <el-col :span="12">
+                <label class="tool-label">{{ $t('editor.renderer') }}</label>
+                <el-radio-group
+                  v-model="shared.renderer"
+                  size="mini"
+                  style="text-transform: uppercase"
+                >
+                  <el-radio-button label="svg"></el-radio-button>
+                  <el-radio-button label="canvas"></el-radio-button>
+                </el-radio-group>
+              </el-col>
+              <el-col :span="12">
+                <el-switch
+                  v-if="shared.renderer === 'canvas'"
+                  v-model="shared.useDirtyRect"
+                  :active-text="$t('editor.useDirtyRect')"
+                  :inactive-text="''"
+                >
+                </el-switch>
+              </el-col>
+            </el-row>
+          </div>
+          <span class="render-config-trigger" slot="reference"
+            ><i class="el-icon-setting el-icon--left"></i
+            >{{ $t('editor.renderCfgTitle') }}</span
+          >
+        </el-popover>
+      </div>
+      <template v-if="inEditor">
+        <button
+          v-if="!shared.isMobile"
+          class="download btn btn-sm"
+          @click="downloadExample"
+        >
+          {{ $t('editor.download') }}
+        </button>
+        <a class="screenshot" @click="screenshot" target="_blank"
+          ><i class="el-icon-camera-solid"></i
+        ></a>
+      </template>
+      <a :href="editLink" target="_blank" v-else class="edit btn btn-sm">{{
+        $t('editor.edit')
+      }}</a>
     </div>
-</div>
+  </div>
 </template>
 
 <script>
-
-import {store, updateRunHash} from '../common/store';
-import {SCRIPT_URLS, URL_PARAMS} from '../common/config';
-import {loadScriptsAsync} from '../common/helper';
-import {createSandbox} from './sandbox';
+import { store, updateRunHash } from '../common/store';
+import { SCRIPT_URLS, URL_PARAMS } from '../common/config';
+import { loadScriptsAsync } from '../common/helper';
+import { createSandbox } from './sandbox';
 import debounce from 'lodash/debounce';
 import { addListener, removeListener } from 'resize-detector';
 import CHART_LIST from '../data/chart-list-data';
 import CHART_LIST_GL from '../data/chart-list-data-gl';
-import {download} from './downloadExample';
+import { download } from './downloadExample';
 
 function findExample(item) {
-    return URL_PARAMS.c === item.id;
+  return URL_PARAMS.c === item.id;
 }
 const example = CHART_LIST.concat(CHART_LIST_GL).find(findExample);
 const isGL = CHART_LIST_GL.find(findExample);
 
 function addDecalIfNecessary(option) {
-    if (store.enableDecal) {
-        option.aria = option.aria || {};
-        option.aria.decal = option.aria.decal || {};
-        option.aria.decal.show = true;
-        option.aria.show = option.aria.enabled = true;
-    }
+  if (store.enableDecal) {
+    option.aria = option.aria || {};
+    option.aria.decal = option.aria.decal || {};
+    option.aria.decal.show = true;
+    option.aria.show = option.aria.enabled = true;
+  }
 }
 
 export function ensureECharts() {
-    if (typeof echarts === 'undefined') {
-
-        const hasBmap = example && example.tags.indexOf('bmap') >= 0;
-
-        // Code from https://api.map.baidu.com/api?v=2.0&ak=KOmVjPVUAey1G2E8zNhPiuQ6QiEmAwZu
-        if (hasBmap) {
-            window.HOST_TYPE = "2";
-            window.BMap_loadScriptTime = (new Date).getTime();
-        }
+  if (typeof echarts === 'undefined') {
+    const hasBmap = example && example.tags.indexOf('bmap') >= 0;
 
-        return loadScriptsAsync([
-            SCRIPT_URLS.datGUIMinJS,
-            'local' in URL_PARAMS
-                ? SCRIPT_URLS.localEChartsMinJS : SCRIPT_URLS.echartsMinJS,
-            SCRIPT_URLS.echartsDir + '/dist/extension/dataTool.js',
-            'https://cdn.jsdelivr.net/npm/echarts@4.9.0/map/js/world.js',
-            SCRIPT_URLS.echartsStatMinJS,
-            ...URL_PARAMS.gl ? [SCRIPT_URLS.echartsGLMinJS] : [],
-            ...hasBmap ? [
-                'https://api.map.baidu.com/getscript?v=3.0&ak=KOmVjPVUAey1G2E8zNhPiuQ6QiEmAwZu&services=&t=20200327103013',
-                SCRIPT_URLS.echartsDir + '/dist/extension/bmap.js'
-            ] : []
-        ]).then(() => {
-            echarts.registerPreprocessor(addDecalIfNecessary)
-        });
+    // Code from https://api.map.baidu.com/api?v=2.0&ak=KOmVjPVUAey1G2E8zNhPiuQ6QiEmAwZu
+    if (hasBmap) {
+      window.HOST_TYPE = '2';
+      window.BMap_loadScriptTime = new Date().getTime();
     }
-    return Promise.resolve();
-}
 
+    return loadScriptsAsync([
+      SCRIPT_URLS.datGUIMinJS,
+      'local' in URL_PARAMS
+        ? SCRIPT_URLS.localEChartsMinJS
+        : SCRIPT_URLS.echartsMinJS,
+      SCRIPT_URLS.echartsDir + '/dist/extension/dataTool.js',
+      'https://cdn.jsdelivr.net/npm/echarts@4.9.0/map/js/world.js',
+      SCRIPT_URLS.echartsStatMinJS,
+      ...(URL_PARAMS.gl ? [SCRIPT_URLS.echartsGLMinJS] : []),
+      ...(hasBmap
+        ? [
+            'https://api.map.baidu.com/getscript?v=3.0&ak=KOmVjPVUAey1G2E8zNhPiuQ6QiEmAwZu&services=&t=20200327103013',
+            SCRIPT_URLS.echartsDir + '/dist/extension/bmap.js'
+          ]
+        : [])
+    ]).then(() => {
+      echarts.registerPreprocessor(addDecalIfNecessary);
+    });
+  }
+  return Promise.resolve();
+}
 
 function log(text, type) {
-    if (type !== 'warn' && type !== 'error') {
-        type = 'info';
-    }
-    store.editorStatus.message = text;
-    store.editorStatus.type = type;
+  if (type !== 'warn' && type !== 'error') {
+    type = 'info';
+  }
+  store.editorStatus.message = text;
+  store.editorStatus.type = type;
 }
 
-
 function run() {
-
-    if (typeof echarts === 'undefined') {
-        return;
-    }
-    if (!this.sandbox) {
-        this.sandbox = createSandbox((chart) => {
-            const option = chart.getOption();
-            if (typeof option.backgroundColor === 'string' && option.backgroundColor !== 'transparent') {
-                this.backgroundColor = option.backgroundColor;
-            }
-            else {
-                this.backgroundColor = '#fff';
-            }
+  if (typeof echarts === 'undefined') {
+    return;
+  }
+  if (!this.sandbox) {
+    this.sandbox = createSandbox((chart) => {
+      const option = chart.getOption();
+      if (
+        typeof option.backgroundColor === 'string' &&
+        option.backgroundColor !== 'transparent'
+      ) {
+        this.backgroundColor = option.backgroundColor;
+      } else {
+        this.backgroundColor = '#fff';
+      }
+    });
+  }
+
+  try {
+    const updateTime = this.sandbox.run(
+      this.$el.querySelector('.chart-container'),
+      store
+    );
+
+    log(this.$t('editor.chartOK') + updateTime + 'ms');
+
+    // Find the appropriate throttle time
+    const debounceTime = 500;
+    const debounceTimeQuantities = [0, 500, 2000, 5000, 10000];
+    for (let i = debounceTimeQuantities.length - 1; i >= 0; i--) {
+      const quantity = debounceTimeQuantities[i];
+      const preferredDebounceTime = debounceTimeQuantities[i + 1] || 1000000;
+      if (
+        updateTime >= quantity &&
+        this.debouncedTime !== preferredDebounceTime
+      ) {
+        this.debouncedRun = debounce(run, preferredDebounceTime, {
+          trailing: true
         });
+        this.debouncedTime = preferredDebounceTime;
+        break;
+      }
     }
 
-    try {
-        const updateTime = this.sandbox.run(this.$el.querySelector('.chart-container'), store);
-
-        log(this.$t('editor.chartOK') + updateTime + 'ms');
-
-        // Find the appropriate throttle time
-        const debounceTime = 500;
-        const debounceTimeQuantities = [0, 500, 2000, 5000, 10000];
-        for (let i = debounceTimeQuantities.length - 1; i >= 0; i--) {
-            const quantity = debounceTimeQuantities[i];
-            const preferredDebounceTime = debounceTimeQuantities[i + 1] || 1000000;
-            if (updateTime >= quantity && this.debouncedTime !== preferredDebounceTime) {
-                this.debouncedRun = debounce(run, preferredDebounceTime, {
-                    trailing: true
-                });
-                this.debouncedTime = preferredDebounceTime;
-                break;
-            }
-        }
-
-        // Update run hash to let others known chart has been changed.
-        updateRunHash();
-
-    }
-    catch (e) {
-        log(this.$t('editor.errorInEditor'), 'error');
-        console.error(e);
-    }
+    // Update run hash to let others known chart has been changed.
+    updateRunHash();
+  } catch (e) {
+    log(this.$t('editor.errorInEditor'), 'error');
+    console.error(e);
+  }
 }
 
-
 export default {
-
-    props: ['inEditor'],
-
-    data() {
-        return {
-            shared: store,
-            debouncedTime: undefined,
-            backgroundColor: '',
-            autoRun: true,
-            loading: false,
-
-            isGL
+  props: ['inEditor'],
+
+  data() {
+    return {
+      shared: store,
+      debouncedTime: undefined,
+      backgroundColor: '',
+      autoRun: true,
+      loading: false,
+
+      isGL
+    };
+  },
+
+  mounted() {
+    this.loading = true;
+    ensureECharts().then(() => {
+      this.loading = false;
+      if (store.runCode) {
+        this.run();
+      }
+    });
+
+    addListener(this.$el, () => {
+      if (this.sandbox) {
+        this.sandbox.resize();
+      }
+    });
+  },
+
+  computed: {
+    editLink() {
+      const params = ['c=' + URL_PARAMS.c];
+      if (URL_PARAMS.theme) {
+        params.push(['theme=' + URL_PARAMS.theme]);
+      }
+      if (URL_PARAMS.gl) {
+        params.push(['gl=' + URL_PARAMS.gl]);
+      }
+      return './editor.html?' + params.join('&');
+    }
+  },
+
+  watch: {
+    'shared.runCode'(val) {
+      if (this.autoRun || !this.sandbox) {
+        if (!this.debouncedRun) {
+          // First run
+          this.run();
+        } else {
+          this.debouncedRun();
         }
+      }
     },
-
-    mounted() {
-        this.loading = true;
-        ensureECharts().then(() => {
-            this.loading = false;
-            if (store.runCode) {
-                this.run();
-            }
-        });
-
-        addListener(this.$el, () => {
-            if (this.sandbox) {
-                this.sandbox.resize();
-            }
-        })
+    'shared.renderer'() {
+      this.refreshAll();
     },
-
-    computed: {
-        editLink() {
-            const params = ['c=' + URL_PARAMS.c];
-            if (URL_PARAMS.theme) {
-                params.push(['theme=' + URL_PARAMS.theme]);
-            }
-            if (URL_PARAMS.gl) {
-                params.push(['gl=' + URL_PARAMS.gl]);
-            }
-            return './editor.html?' + params.join('&');
-        }
+    'shared.darkMode'() {
+      this.refreshAll();
     },
-
-    watch: {
-        'shared.runCode'(val) {
-            if (this.autoRun || !this.sandbox) {
-                if (!this.debouncedRun) {
-                    // First run
-                    this.run();
-                }
-                else {
-                    this.debouncedRun();
-                }
-            }
-        },
-        'shared.renderer'() {
-            this.refreshAll();
-        },
-        'shared.darkMode'() {
-            this.refreshAll();
-        },
-        'shared.enableDecal'() {
-            this.refreshAll();
-        },
-        'shared.useDirtyRect'() {
-            this.refreshAll();
-        }
+    'shared.enableDecal'() {
+      this.refreshAll();
     },
-
-    methods: {
-        run,
-        // debouncedRun will be created at first run
-        // debouncedRun: null,
-        refreshAll() {
-            this.dispose();
-            this.run();
-        },
-        dispose() {
-            if (this.sandbox) {
-                this.sandbox.dispose();
-            }
-        },
-        downloadExample() {
-            download();
-        },
-        screenshot() {
-            if (this.sandbox) {
-                const url = this.sandbox.getDataURL();
-                const $a = document.createElement('a');
-                $a.download = URL_PARAMS.c + '.' + (store.renderer === 'svg' ? 'svg' : 'png');
-                $a.target = '_blank';
-                $a.href = url;
-                const evt = new MouseEvent('click', {
-                    bubbles: true,
-                    cancelable: false
-                });
-                $a.dispatchEvent(evt);
-            }
-        },
-        getOption() {
-            return this.sandbox && this.sandbox.getOption();
-        }
-        // hasEditorError() {
-        //     const annotations = this.editor.getSession().getAnnotations();
-        //     for (let aid = 0, alen = annotations.length; aid < alen; ++aid) {
-        //         if (annotations[aid].type === 'error') {
-        //             return true;
-        //         }
-        //     }
-        //     return false;
-        // }
+    'shared.useDirtyRect'() {
+      this.refreshAll();
     }
-}
+  },
+
+  methods: {
+    run,
+    // debouncedRun will be created at first run
+    // debouncedRun: null,
+    refreshAll() {
+      this.dispose();
+      this.run();
+    },
+    dispose() {
+      if (this.sandbox) {
+        this.sandbox.dispose();
+      }
+    },
+    downloadExample() {
+      download();
+    },
+    screenshot() {
+      if (this.sandbox) {
+        const url = this.sandbox.getDataURL();
+        const $a = document.createElement('a');
+        $a.download =
+          URL_PARAMS.c + '.' + (store.renderer === 'svg' ? 'svg' : 'png');
+        $a.target = '_blank';
+        $a.href = url;
+        const evt = new MouseEvent('click', {
+          bubbles: true,
+          cancelable: false
+        });
+        $a.dispatchEvent(evt);
+      }
+    },
+    getOption() {
+      return this.sandbox && this.sandbox.getOption();
+    }
+    // hasEditorError() {
+    //     const annotations = this.editor.getSession().getAnnotations();
+    //     for (let aid = 0, alen = annotations.length; aid < alen; ++aid) {
+    //         if (annotations[aid].type === 'error') {
+    //             return true;
+    //         }
+    //     }
+    //     return false;
+    // }
+  }
+};
 </script>
 
 <style lang="scss">
-
 #chart-panel {
-    position: absolute;
-    // top: $control-panel-height;
-    top: 42px;
-    right: 15px;
-    bottom: 15px;
-    left: 15px;
-    box-sizing: border-box;
-    box-shadow: rgba(0, 0, 0, 0.1) 0px 0px 20px;
-    border-radius: 5px;
-    background: #fff;
-    overflow: hidden;
-
-    padding: 10px;
-
-    .ec-debug-dirty-rect-container {
-        left: 10px!important;
-        top: 10px!important;
-        right: 10px!important;
-        bottom: 10px!important;
-
-        .ec-debug-dirty-rect {
-            background-color: rgba(255, 0, 0, 0.2)!important;
-            border: 1px solid red!important;
-        }
+  position: absolute;
+  // top: $control-panel-height;
+  top: 42px;
+  right: 15px;
+  bottom: 15px;
+  left: 15px;
+  box-sizing: border-box;
+  box-shadow: rgba(0, 0, 0, 0.1) 0px 0px 20px;
+  border-radius: 5px;
+  background: #fff;
+  overflow: hidden;
+
+  padding: 10px;
+
+  .ec-debug-dirty-rect-container {
+    left: 10px !important;
+    top: 10px !important;
+    right: 10px !important;
+    bottom: 10px !important;
+
+    .ec-debug-dirty-rect {
+      background-color: rgba(255, 0, 0, 0.2) !important;
+      border: 1px solid red !important;
     }
+  }
 
-    .chart-container {
-        position: relative;
-        height: 100%;
-    }
+  .chart-container {
+    position: relative;
+    height: 100%;
+  }
 }
 
 .render-config-container {
-    .el-radio-group {
-        label {
-            margin-bottom: 0;
-        }
+  .el-radio-group {
+    label {
+      margin-bottom: 0;
     }
+  }
 }
 
 #tool-panel {
-    position: absolute;
-    top: 0;
-    right: 0;
-    left: 0;
-    padding-top: 5px;
-    padding-left: 15px;
-
-    // .el-switch__label * {
-    //     font-size: 12px;
-    // }
-
-    .render-config-trigger {
-        margin-left: 10px;
-        cursor: pointer;
-        font-weight: 500;
-        // font-size: 12px;
-    }
-
-    label {
-        margin-bottom: 0;
-    }
-
-    .left-panel {
-        float: left;
-    }
-
-    .left-panel>* {
-        vertical-align: middle;
-        display: inline-block;
-    }
-
-    .tool-label {
-        font-weight: bold;
-        text-transform: uppercase;
-        margin-left: 20px;
-    }
-
-    .screenshot, .download, .edit {
-        float: right;
-        margin-right: 15px;
-        cursor: pointer;
-    }
-    .screenshot {
-        font-size: 22px;
-        margin-right: 10px;
-    }
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+  padding-top: 5px;
+  padding-left: 15px;
+
+  // .el-switch__label * {
+  //     font-size: 12px;
+  // }
+
+  .render-config-trigger {
+    margin-left: 10px;
+    cursor: pointer;
+    font-weight: 500;
+    // font-size: 12px;
+  }
+
+  label {
+    margin-bottom: 0;
+  }
+
+  .left-panel {
+    float: left;
+  }
+
+  .left-panel > * {
+    vertical-align: middle;
+    display: inline-block;
+  }
+
+  .tool-label {
+    font-weight: bold;
+    text-transform: uppercase;
+    margin-left: 20px;
+  }
+
+  .screenshot,
+  .download,
+  .edit {
+    float: right;
+    margin-right: 15px;
+    cursor: pointer;
+  }
+  .screenshot {
+    font-size: 22px;
+    margin-right: 10px;
+  }
 }
 
 .full {
-    #chart-panel {
-        top: 40px;
-        right: 5px;
-        bottom: 5px;
-        left: 5px;
-        box-shadow: rgba(10, 9, 9, 0.1) 0px 0px 5px;
-    }
-    #tool-panel {
-        padding-left: 5px;
-        .download, .edit {
-            margin-right: 5px;
-        }
+  #chart-panel {
+    top: 40px;
+    right: 5px;
+    bottom: 5px;
+    left: 5px;
+    box-shadow: rgba(10, 9, 9, 0.1) 0px 0px 5px;
+  }
+  #tool-panel {
+    padding-left: 5px;
+    .download,
+    .edit {
+      margin-right: 5px;
     }
+  }
 }
 
 .dg.main * {
-    box-sizing: content-box;
+  box-sizing: content-box;
 }
 .dg.main input {
-    line-height: normal;
+  line-height: normal;
 }
 
 .dg.main.a {
-    overflow-x: visible;
+  overflow-x: visible;
 }
 
 .dg.main .c {
-    select {
-        color: #000;
-    }
+  select {
+    color: #000;
+  }
 }
-
-</style>
\ No newline at end of file
+</style>
diff --git a/src/editor/View.vue b/src/editor/View.vue
index f6abe53..a8b1ca1 100644
--- a/src/editor/View.vue
+++ b/src/editor/View.vue
@@ -1,25 +1,22 @@
 <template>
-<preview></Preview>
+  <preview></preview>
 </template>
 
 <script>
-
 import Preview from './Preview.vue';
-import {store, loadExampleCode, parseSourceCode} from '../common/store';
+import { store, loadExampleCode, parseSourceCode } from '../common/store';
 
 export default {
-    components: {
-        Preview
-    },
+  components: {
+    Preview
+  },
 
-    mounted() {
-        loadExampleCode().then(code => {
-            store.runCode = parseSourceCode(code);
-        });
-    }
-}
+  mounted() {
+    loadExampleCode().then((code) => {
+      store.runCode = parseSourceCode(code);
+    });
+  }
+};
 </script>
 
-<style lang="scss">
-
-</style>
\ No newline at end of file
+<style lang="scss"></style>
diff --git a/src/editor/downloadExample.js b/src/editor/downloadExample.js
index b9f1a48..d4235df 100644
--- a/src/editor/downloadExample.js
+++ b/src/editor/downloadExample.js
@@ -1,12 +1,12 @@
-import {store} from '../common/store';
-import {URL_PARAMS, SCRIPT_URLS} from '../common/config';
-import {downloadBlob} from '../common/helper';
+import { store } from '../common/store';
+import { URL_PARAMS, SCRIPT_URLS } from '../common/config';
+import { downloadBlob } from '../common/helper';
 
 const hasRootPath = store.sourceCode.indexOf('ROOT_PATH') >= 0;
 const rootPathCode = hasRootPath ? `var ROOT_PATH = '${store.cdnRoot}'` : '';
 
 export function download() {
-    const code = `<!--
+  const code = `<!--
     THIS EXAMPLE WAS DOWNLOADED FROM ${window.location.href}
 -->
 <!DOCTYPE html>
@@ -55,10 +55,10 @@ if (option && typeof option === 'object') {
     </body>
 </html>
     `;
-    const file = new Blob([code], {
-        type: 'text/html;charset=UTF-8',
-        encoding: 'UTF-8'
-    });
-    // download the blob
-    downloadBlob(file, URL_PARAMS.c + '.html');
-}
\ No newline at end of file
+  const file = new Blob([code], {
+    type: 'text/html;charset=UTF-8',
+    encoding: 'UTF-8'
+  });
+  // download the blob
+  downloadBlob(file, URL_PARAMS.c + '.html');
+}
diff --git a/src/editor/object-visualizer.css b/src/editor/object-visualizer.css
index 372a9fd..f135039 100644
--- a/src/editor/object-visualizer.css
+++ b/src/editor/object-visualizer.css
@@ -1,72 +1,72 @@
 .object-visualizer {
-    border-radius: 4px;
-    overflow-x: auto;
-    margin: 0;
-    padding: 10px;
-    /* font-family: Menlo; */
-    font-size: 0.6em;
-    line-height: 1.7;
-  }
+  border-radius: 4px;
+  overflow-x: auto;
+  margin: 0;
+  padding: 10px;
+  /* font-family: Menlo; */
+  font-size: 0.6em;
+  line-height: 1.7;
+}
 
-  .array > .value,
-  .object > .value {
-    display: flex;
-    flex-direction: column;
-    margin-left: 2em;
-  }
+.array > .value,
+.object > .value {
+  display: flex;
+  flex-direction: column;
+  margin-left: 2em;
+}
 
-  .key {
-    /* color: #4078f2; */
-    color: #111;
-    user-select: none;
-  }
+.key {
+  /* color: #4078f2; */
+  color: #111;
+  user-select: none;
+}
 
-  .string > .value {
-    color: #50a14f;
-  }
+.string > .value {
+  color: #50a14f;
+}
 
-  .boolean > .value,
-  .number > .value {
-    color: #d19a66;
-  }
+.boolean > .value,
+.number > .value {
+  color: #d19a66;
+}
 
-  .null > .value,
-  .undefined > .value {
-    color: hsl(0, 0%, 40%);
-  }
+.null > .value,
+.undefined > .value {
+  color: hsl(0, 0%, 40%);
+}
 
-  .separator {
-    cursor: pointer;
-    font-size: 0.8em;
-    user-select: none;
-    color: hsl(0, 0%, 30%);
-  }
+.separator {
+  cursor: pointer;
+  font-size: 0.8em;
+  user-select: none;
+  color: hsl(0, 0%, 30%);
+}
 
-  .indicator {
-    cursor: pointer;
-    font-size: 0.8em;
-    padding-right: 0.5em;
-    user-select: none;
-    vertical-align: text-bottom;
-    color: hsl(0, 0%, 30%);
-  }
+.indicator {
+  cursor: pointer;
+  font-size: 0.8em;
+  padding-right: 0.5em;
+  user-select: none;
+  vertical-align: text-bottom;
+  color: hsl(0, 0%, 30%);
+}
 
-  .array > .key,
-  .object > .key {
-    cursor: pointer;
-  }
+.array > .key,
+.object > .key {
+  cursor: pointer;
+}
 
-  .value > .array,
-  .value > .object {
-    position: relative;
-    left: -0.8em;
-  }
+.value > .array,
+.value > .object {
+  position: relative;
+  left: -0.8em;
+}
 
-  .count,
-  .preview,
-  .quotes {
-    cursor: pointer;
-    font-size: 0.8em;
-    user-select: none;
-    color: hsl(0, 0%, 30%);
-  }
+.count,
+.preview,
+.quotes {
+  cursor: pointer;
+  font-size: 0.8em;
+  user-select: none;
+  color: hsl(0, 0%, 30%);
+}
diff --git a/src/editor/sandbox.js b/src/editor/sandbox.js
index 4786d75..de496c5 100644
--- a/src/editor/sandbox.js
+++ b/src/editor/sandbox.js
@@ -1,190 +1,210 @@
 import showDebugDirtyRect from '../dep/showDebugDirtyRect';
 
 export function createSandbox(optionUpdated) {
-    let appEnv = {};
-    let gui;
-
-    let _intervalIdList = [];
-    let _timeoutIdList = [];
-
-    const _oldSetTimeout = window.setTimeout;
-    const _oldSetInterval = window.setInterval;
-
-    function setTimeout(func, delay) {
-        var id = _oldSetTimeout(func, delay);
-        _timeoutIdList.push(id);
-        return id;
+  let appEnv = {};
+  let gui;
+
+  let _intervalIdList = [];
+  let _timeoutIdList = [];
+
+  const _oldSetTimeout = window.setTimeout;
+  const _oldSetInterval = window.setInterval;
+
+  function setTimeout(func, delay) {
+    var id = _oldSetTimeout(func, delay);
+    _timeoutIdList.push(id);
+    return id;
+  }
+  function setInterval(func, gap) {
+    var id = _oldSetInterval(func, gap);
+    _intervalIdList.push(id);
+    return id;
+  }
+  function _clearTimeTickers() {
+    for (var i = 0; i < _intervalIdList.length; i++) {
+      clearInterval(_intervalIdList[i]);
+    }
+    for (var i = 0; i < _timeoutIdList.length; i++) {
+      clearTimeout(_timeoutIdList[i]);
+    }
+    _intervalIdList = [];
+    _timeoutIdList = [];
+  }
+  const _events = [];
+  function _wrapOnMethods(chart) {
+    const oldOn = chart.on;
+    const oldSetOption = chart.setOption;
+    chart.on = function (eventName) {
+      const res = oldOn.apply(chart, arguments);
+      _events.push(eventName);
+      return res;
     };
-    function setInterval(func, gap) {
-        var id = _oldSetInterval(func, gap);
-        _intervalIdList.push(id);
-        return id;
+    chart.setOption = function () {
+      const res = oldSetOption.apply(this, arguments);
+      optionUpdated && optionUpdated(chart);
+      return res;
     };
-    function _clearTimeTickers() {
-        for (var i = 0; i < _intervalIdList.length; i++) {
-            clearInterval(_intervalIdList[i]);
-        }
-        for (var i = 0; i < _timeoutIdList.length; i++) {
-            clearTimeout(_timeoutIdList[i]);
+  }
+
+  function _clearChartEvents(chart) {
+    _events.forEach(function (eventName) {
+      if (chart) {
+        chart.off(eventName);
+      }
+    });
+
+    _events.length = 0;
+  }
+
+  let chartInstance;
+
+  return {
+    resize() {
+      if (chartInstance) {
+        chartInstance.resize();
+      }
+    },
+
+    dispose() {
+      if (chartInstance) {
+        chartInstance.dispose();
+        chartInstance = null;
+      }
+    },
+
+    getDataURL() {
+      return chartInstance.getDataURL({
+        pixelRatio: 2,
+        excludeComponents: ['toolbox']
+      });
+    },
+
+    getOption() {
+      return chartInstance.getOption();
+    },
+
+    run(el, store) {
+      if (!chartInstance) {
+        chartInstance = echarts.init(el, store.darkMode ? 'dark' : '', {
+          renderer: store.renderer,
+          useDirtyRect: store.useDirtyRect
+        });
+        if (store.useDirtyRect && store.renderer === 'canvas') {
+          try {
+            showDebugDirtyRect(chartInstance.getZr(), {
+              autoHideDelay: 500
+            });
+          } catch (e) {
+            console.error(e);
+          }
         }
-        _intervalIdList = [];
-        _timeoutIdList = [];
-    }
-    const _events = [];
-    function _wrapOnMethods(chart) {
-        const oldOn = chart.on;
-        const oldSetOption = chart.setOption;
-        chart.on = function (eventName) {
-            const res = oldOn.apply(chart, arguments);
-            _events.push(eventName);
-            return res;
-        };
-        chart.setOption = function () {
-            const res = oldSetOption.apply(this, arguments);
-            optionUpdated && optionUpdated(chart);
-            return res;
-        };
-    }
-
-    function _clearChartEvents(chart) {
-        _events.forEach(function (eventName) {
-            if (chart) {
-                chart.off(eventName);
-            }
+        _wrapOnMethods(chartInstance);
+      }
+
+      // if (this.hasEditorError()) {
+      //     log(this.$t('editor.errorInEditor'), 'error');
+      //     return;
+      // }
+
+      // TODO Scope the variables in component.
+      _clearTimeTickers();
+      _clearChartEvents(chartInstance);
+      // Reset
+      appEnv.config = null;
+
+      // run the code
+
+      const compiledCode = store.runCode;
+
+      const func = new Function(
+        'myChart',
+        'app',
+        'setTimeout',
+        'setInterval',
+        'ROOT_PATH',
+        'var option;\n' + compiledCode + '\nreturn option;'
+      );
+      const option = func(
+        chartInstance,
+        appEnv,
+        setTimeout,
+        setInterval,
+        store.cdnRoot
+      );
+      let updateTime = 0;
+
+      if (option && typeof option === 'object') {
+        const startTime = +new Date();
+        chartInstance.setOption(option, true);
+        const endTime = +new Date();
+        updateTime = endTime - startTime;
+      }
+
+      if (gui) {
+        $(gui.domElement).remove();
+        gui.destroy();
+        gui = null;
+      }
+
+      if (appEnv.config) {
+        gui = new dat.GUI({
+          autoPlace: false
         });
-
-        _events.length = 0;
-    }
-
-    let chartInstance;
-
-    return {
-        resize() {
-            if (chartInstance) {
-                chartInstance.resize();
-            }
-        },
-
-        dispose() {
-            if (chartInstance) {
-                chartInstance.dispose();
-                chartInstance = null;
+        $(gui.domElement).css({
+          position: 'absolute',
+          right: 5,
+          top: 0,
+          zIndex: 1000
+        });
+        $('.right-container').append(gui.domElement);
+
+        var configParameters = appEnv.configParameters || {};
+        for (var name in appEnv.config) {
+          var value = appEnv.config[name];
+          if (name !== 'onChange' && name !== 'onFinishChange') {
+            var isColor = false;
+            // var value = obj;
+            var controller = null;
+            if (configParameters[name]) {
+              if (configParameters[name].options) {
+                controller = gui.add(
+                  appEnv.config,
+                  name,
+                  configParameters[name].options
+                );
+              } else if (configParameters[name].min != null) {
+                controller = gui.add(
+                  appEnv.config,
+                  name,
+                  configParameters[name].min,
+                  configParameters[name].max
+                );
+              }
             }
-        },
-
-        getDataURL() {
-            return chartInstance.getDataURL({
-                pixelRatio: 2,
-                excludeComponents: ['toolbox']
-            });
-        },
-
-        getOption() {
-            return chartInstance.getOption();
-        },
-
-        run(el, store) {
-
-            if (!chartInstance) {
-                chartInstance = echarts.init(el, store.darkMode ? 'dark' : '', {
-                    renderer: store.renderer,
-                    useDirtyRect: store.useDirtyRect
-                });
-                if (store.useDirtyRect && store.renderer === 'canvas') {
-                    try {
-                        showDebugDirtyRect(chartInstance.getZr(), {
-                            autoHideDelay: 500
-                        });
-                    }
-                    catch (e) {
-                        console.error(e);
-                    }
+            if (typeof obj === 'string') {
+              try {
+                var colorArr = echarts.color.parse(value);
+                isColor = !!colorArr;
+                if (isColor) {
+                  value = echarts.color.stringify(colorArr, 'rgba');
                 }
-                _wrapOnMethods(chartInstance);
-            }
-
-            // if (this.hasEditorError()) {
-            //     log(this.$t('editor.errorInEditor'), 'error');
-            //     return;
-            // }
-
-            // TODO Scope the variables in component.
-            _clearTimeTickers();
-            _clearChartEvents(chartInstance);
-            // Reset
-            appEnv.config = null;
-
-            // run the code
-
-            const compiledCode = store.runCode;
-
-            const func = new Function(
-                'myChart', 'app', 'setTimeout', 'setInterval', 'ROOT_PATH',
-                'var option;\n' + compiledCode + '\nreturn option;'
-            );
-            const option = func(chartInstance, appEnv, setTimeout, setInterval, store.cdnRoot);
-            let updateTime = 0;
-
-            if (option && typeof option === 'object') {
-                const startTime = +new Date();
-                chartInstance.setOption(option, true);
-                const endTime = +new Date();
-                updateTime = endTime - startTime;
+              } catch (e) {}
             }
-
-            if (gui) {
-                $(gui.domElement).remove();
-                gui.destroy();
-                gui = null;
+            if (!controller) {
+              controller = gui[isColor ? 'addColor' : 'add'](
+                appEnv.config,
+                name
+              );
             }
-
-            if (appEnv.config) {
-                gui = new dat.GUI({
-                    autoPlace: false
-                });
-                $(gui.domElement).css({
-                    position: 'absolute',
-                    right: 5,
-                    top: 0,
-                    zIndex: 1000
-                });
-                $('.right-container').append(gui.domElement);
-
-                var configParameters = appEnv.configParameters || {};
-                for (var name in appEnv.config) {
-                    var value = appEnv.config[name];
-                    if (name !== 'onChange' && name !== 'onFinishChange') {
-                        var isColor = false;
-                        // var value = obj;
-                        var controller = null;
-                        if (configParameters[name]) {
-                            if (configParameters[name].options) {
-                                controller = gui.add(appEnv.config, name, configParameters[name].options);
-                            }
-                            else if (configParameters[name].min != null) {
-                                controller = gui.add(appEnv.config, name, configParameters[name].min, configParameters[name].max);
-                            }
-                        }
-                        if (typeof obj === 'string') {
-                            try {
-                                var colorArr = echarts.color.parse(value);
-                                isColor = !!colorArr;
-                                if (isColor) {
-                                    value = echarts.color.stringify(colorArr, 'rgba');
-                                }
-                            }
-                            catch (e) {}
-                        }
-                        if (!controller) {
-                            controller = gui[isColor ? 'addColor' : 'add'](appEnv.config, name);
-                        }
-                        appEnv.config.onChange && controller.onChange(appEnv.config.onChange);
-                        appEnv.config.onFinishChange && controller.onFinishChange(appEnv.config.onFinishChange);
-                    }
-                }
-            }
-
-            return updateTime;
+            appEnv.config.onChange &&
+              controller.onChange(appEnv.config.onChange);
+            appEnv.config.onFinishChange &&
+              controller.onFinishChange(appEnv.config.onFinishChange);
+          }
         }
-    };
-};
\ No newline at end of file
+      }
+
+      return updateTime;
+    }
+  };
+}
diff --git a/src/editor/transformTs.js b/src/editor/transformTs.js
index b47973e..cb2cb1c 100644
--- a/src/editor/transformTs.js
+++ b/src/editor/transformTs.js
@@ -1,7 +1,7 @@
-import {transform} from 'sucrase';
+import { transform } from 'sucrase';
 
 export default function (code) {
-    return transform(code, {
-        transforms: ['typescript']
-    }).code.trim();
-}
\ No newline at end of file
+  return transform(code, {
+    transforms: ['typescript']
+  }).code.trim();
+}
diff --git a/src/explore/ExampleCard.vue b/src/explore/ExampleCard.vue
index bd465b8..17d6959 100644
--- a/src/explore/ExampleCard.vue
+++ b/src/explore/ExampleCard.vue
@@ -1,140 +1,144 @@
 <template>
-<div class="example-list-item">
+  <div class="example-list-item">
     <a target="_blank" class="example-link" :href="exampleLink">
-        <img class="chart-area" src="../asset/placeholder.jpg" :data-src="screenshotURL" />
-        <h4 class="example-title">{{title}}</h4>
-        <h5 class="example-subtitle" v-if="showSubtitle">{{subtitle}}</h5>
+      <img
+        class="chart-area"
+        src="../asset/placeholder.jpg"
+        :data-src="screenshotURL"
+      />
+      <h4 class="example-title">{{ title }}</h4>
+      <h5 class="example-subtitle" v-if="showSubtitle">{{ subtitle }}</h5>
     </a>
-</div>
+  </div>
 </template>
 
 <script>
-
-import {store} from '../common/store';
-import {SUPPORT_WEBP, URL_PARAMS} from '../common/config';
+import { store } from '../common/store';
+import { SUPPORT_WEBP, URL_PARAMS } from '../common/config';
 
 export default {
-    props: ['example'],
-
-    computed: {
-
-        title() {
-            return (store.locale === 'zh' ? this.example.titleCN : this.example.title)
-                || this.example.title || '';
-        },
-
-        showSubtitle() {
-            return store.locale === 'zh';
-        },
-
-        subtitle() {
-            return this.example.title || '';
-        },
-
-        exampleTheme() {
-            const example = this.example;
-            return example.theme || (store.darkMode ? 'dark' : '');
-        },
-
-        exampleLink() {
-            const example = this.example;
-            const hash = ['c=' + example.id];
-            const exampleTheme = this.exampleTheme;
-            if (example.isGL) {
-                hash.push('gl=1');
-            }
-            if (exampleTheme) {
-                hash.push('theme=' + exampleTheme);
-            }
-            if ('local' in URL_PARAMS) {
-                hash.push('local');
-            }
-            if ('useDirtyRect' in URL_PARAMS) {
-                hash.push('useDirtyRect');
-            }
-            return './editor.html?' + hash.join('&');
-        },
-
-        screenshotURL() {
-            const example = this.example;
-            const themePostfix = this.exampleTheme ? ('-' + this.exampleTheme) : '';
-            const ext = SUPPORT_WEBP ? 'webp' : 'png';
-            const folder = example.isGL ? 'data-gl' : 'data';
-            return `${store.cdnRoot}/${folder}/thumb${themePostfix}/${example.id}.${ext}?_v_=${store.version}`;
-        }
+  props: ['example'],
+
+  computed: {
+    title() {
+      return (
+        (store.locale === 'zh' ? this.example.titleCN : this.example.title) ||
+        this.example.title ||
+        ''
+      );
+    },
+
+    showSubtitle() {
+      return store.locale === 'zh';
+    },
+
+    subtitle() {
+      return this.example.title || '';
+    },
+
+    exampleTheme() {
+      const example = this.example;
+      return example.theme || (store.darkMode ? 'dark' : '');
+    },
+
+    exampleLink() {
+      const example = this.example;
+      const hash = ['c=' + example.id];
+      const exampleTheme = this.exampleTheme;
+      if (example.isGL) {
+        hash.push('gl=1');
+      }
+      if (exampleTheme) {
+        hash.push('theme=' + exampleTheme);
+      }
+      if ('local' in URL_PARAMS) {
+        hash.push('local');
+      }
+      if ('useDirtyRect' in URL_PARAMS) {
+        hash.push('useDirtyRect');
+      }
+      return './editor.html?' + hash.join('&');
+    },
+
+    screenshotURL() {
+      const example = this.example;
+      const themePostfix = this.exampleTheme ? '-' + this.exampleTheme : '';
+      const ext = SUPPORT_WEBP ? 'webp' : 'png';
+      const folder = example.isGL ? 'data-gl' : 'data';
+      return `${store.cdnRoot}/${folder}/thumb${themePostfix}/${example.id}.${ext}?_v_=${store.version}`;
     }
-}
+  }
+};
 </script>
 
 <style lang="scss">
-
-@import "../style/color.scss";
+@import '../style/color.scss';
 
 .example-list-item {
-    width: 100%;
-    max-width: 350px;
-    margin-bottom: 30px;
-
-    border-radius: 2px;
-
-    .example-link {
-        position: relative;
-        display: block;
-
-        .chart-area {
-            width: 100%;
-            height: 100%;
-            border-radius: 5px;
-            box-shadow: 0 0 20px rgba(0, 0, 0, 0.05);
-            margin-top: 10px;
-        }
-
-        .example-title {
-            color: $clr-primary;
-            overflow: hidden;
-            text-overflow: ellipsis;
-            white-space: nowrap;
-
-            padding: 10px 10px 2px 10px;
-            margin: 0;
-            font-weight: normal;
-            font-size: 14px;
-            text-align: center;
-        }
-
-        .example-subtitle {
-            font-size: 12px;
-            text-align: center;
-            color: #aaa;
-            font-weight: normal;
-            // font-weight: 200;
-            overflow: hidden;
-            white-space: nowrap;
-            text-overflow: ellipsis;
-            margin: 3px 0 0 0;
-        }
+  width: 100%;
+  max-width: 350px;
+  margin-bottom: 30px;
+
+  border-radius: 2px;
+
+  .example-link {
+    position: relative;
+    display: block;
+
+    .chart-area {
+      width: 100%;
+      height: 100%;
+      border-radius: 5px;
+      box-shadow: 0 0 20px rgba(0, 0, 0, 0.05);
+      margin-top: 10px;
+    }
+
+    .example-title {
+      color: $clr-primary;
+      overflow: hidden;
+      text-overflow: ellipsis;
+      white-space: nowrap;
+
+      padding: 10px 10px 2px 10px;
+      margin: 0;
+      font-weight: normal;
+      font-size: 14px;
+      text-align: center;
+    }
+
+    .example-subtitle {
+      font-size: 12px;
+      text-align: center;
+      color: #aaa;
+      font-weight: normal;
+      // font-weight: 200;
+      overflow: hidden;
+      white-space: nowrap;
+      text-overflow: ellipsis;
+      margin: 3px 0 0 0;
     }
+  }
 
-    .example-info {
-        padding: 5px 0;
+  .example-info {
+    padding: 5px 0;
 
-        font-weight: bold;
+    font-weight: bold;
 
-        .chart-icon {
-            float: right;
+    .chart-icon {
+      float: right;
 
-            .chart-delete {
-                display: none;
+      .chart-delete {
+        display: none;
 
-                transition: 1s;
-            }
-        }
+        transition: 1s;
+      }
     }
+  }
 
-    &:hover .example-info .chart-icon .chart-delete {
-        display: block;
+  &:hover .example-info .chart-icon .chart-delete {
+    display: block;
 
-        text-decoration: none;
-    }
+    text-decoration: none;
+  }
 }
-</style>
\ No newline at end of file
+</style>
diff --git a/src/explore/Explore.vue b/src/explore/Explore.vue
index 873674e..cd81d4c 100644
--- a/src/explore/Explore.vue
+++ b/src/explore/Explore.vue
@@ -1,209 +1,251 @@
 <template>
-<div id="example-explore">
+  <div id="example-explore">
     <div id="left-container">
-        <div id="left-chart-nav">
-            <scrollactive
-                active-class="active"
-                :offset="80"
-                :duration="500"
-                :scroll-container-selector="'#example-explore'"
-                bezier-easing-value=".5,0,.35,1"
-                @itemchanged="onActiveNavChanged"
-            >
-                <ul>
-                    <li v-for="category in EXAMPLE_CATEGORIES" :key="category">
-                        <a class="left-chart-nav-link scrollactive-item" :id="'left-chart-nav-' + category"
-                            :href="'#chart-type-' + category"
-                        >
-                            <span class="chart-icon" v-html="icons[category]"></span>
-                            <span class="chart-name">{{$t('chartTypes.' + category)}}</span>
-                        </a>
-                    </li>
-                </ul>
-            </scrollactive>
-        </div>
+      <div id="left-chart-nav">
+        <scrollactive
+          active-class="active"
+          :offset="80"
+          :duration="500"
+          :scroll-container-selector="'#example-explore'"
+          bezier-easing-value=".5,0,.35,1"
+          @itemchanged="onActiveNavChanged"
+        >
+          <ul>
+            <li v-for="category in EXAMPLE_CATEGORIES" :key="category">
+              <a
+                class="left-chart-nav-link scrollactive-item"
+                :id="'left-chart-nav-' + category"
+                :href="'#chart-type-' + category"
+              >
+                <span class="chart-icon" v-html="icons[category]"></span>
+                <span class="chart-name">{{
+                  $t('chartTypes.' + category)
+                }}</span>
+              </a>
+            </li>
+          </ul>
+        </scrollactive>
+      </div>
     </div>
     <div id="explore-container">
-        <div class="example-list-panel">
-            <div v-for="categoryObj in exampleList" :key="categoryObj.category">
-                <h3 class="chart-type-head" :id="'chart-type-' + categoryObj.category">
-                    {{$t('chartTypes.' + categoryObj.category)}}
-                    <span>{{categoryObj.category}}</span>
-                </h3>
-
-                <div class="row" :id="'chart-row-' + categoryObj.category">
-                    <div class="col-xl-2 col-lg-3 col-md-4 col-sm-6"
-                        v-for="exampleItem in categoryObj.examples"
-                        :key="exampleItem.id"
-                    >
-                        <ExampleCard :example="exampleItem"></ExampleCard>
-                    </div>
-                </div>
+      <div class="example-list-panel">
+        <div v-for="categoryObj in exampleList" :key="categoryObj.category">
+          <h3
+            class="chart-type-head"
+            :id="'chart-type-' + categoryObj.category"
+          >
+            {{ $t('chartTypes.' + categoryObj.category) }}
+            <span>{{ categoryObj.category }}</span>
+          </h3>
+
+          <div class="row" :id="'chart-row-' + categoryObj.category">
+            <div
+              class="col-xl-2 col-lg-3 col-md-4 col-sm-6"
+              v-for="exampleItem in categoryObj.examples"
+              :key="exampleItem.id"
+            >
+              <ExampleCard :example="exampleItem"></ExampleCard>
             </div>
+          </div>
         </div>
+      </div>
     </div>
     <div id="toolbar">
-        <el-switch
-            v-model="shared.darkMode"
-            active-color="#181432"
-            :active-text="$t('editor.darkMode')"
-            :inactive-text="''">
-        </el-switch>
+      <el-switch
+        v-model="shared.darkMode"
+        active-color="#181432"
+        :active-text="$t('editor.darkMode')"
+        :inactive-text="''"
+      >
+      </el-switch>
     </div>
-</div>
+  </div>
 </template>
 
 <script>
-
 import CHART_LIST from '../data/chart-list-data';
 import CHART_LIST_GL from '../data/chart-list-data-gl';
-import {EXAMPLE_CATEGORIES, BLACK_MAP, URL_PARAMS} from '../common/config';
-import {store} from '../common/store';
+import { EXAMPLE_CATEGORIES, BLACK_MAP, URL_PARAMS } from '../common/config';
+import { store } from '../common/store';
 import ExampleCard from './ExampleCard.vue';
 import LazyLoad from 'vanilla-lazyload/dist/lazyload.esm';
 // import scrollIntoView from 'scroll-into-view';
 
 const icons = {};
 
-['line', 'bar', 'scatter', 'pie', 'radar', 'funnel', 'gauge', 'map',
-    'graph', 'treemap', 'parallel', 'sankey', 'candlestick', 'boxplot', 'heatmap',
-    'pictorialBar', 'themeRiver', 'calendar', 'custom', 'sunburst', 'tree', 'dataset', 'geo', 'lines',
-    'dataZoom', 'rich', 'drag'
+[
+  'line',
+  'bar',
+  'scatter',
+  'pie',
+  'radar',
+  'funnel',
+  'gauge',
+  'map',
+  'graph',
+  'treemap',
+  'parallel',
+  'sankey',
+  'candlestick',
+  'boxplot',
+  'heatmap',
+  'pictorialBar',
+  'themeRiver',
+  'calendar',
+  'custom',
+  'sunburst',
+  'tree',
+  'dataset',
+  'geo',
+  'lines',
+  'dataZoom',
+  'rich',
+  'drag'
 ].forEach(function (category) {
-    icons[category] = require('../asset/icon/' + category + '.svg');
+  icons[category] = require('../asset/icon/' + category + '.svg');
 });
 
 const glIcon = require('../asset/icon/gl.svg');
-['globe', 'bar3D', 'scatter3D', 'surface', 'map3D', 'lines3D', 'line3D',
-    'scatterGL', 'linesGL', 'flowGL', 'graphGL', 'geo3D'].forEach(function (category) {
-    icons[category] = glIcon;
+[
+  'globe',
+  'bar3D',
+  'scatter3D',
+  'surface',
+  'map3D',
+  'lines3D',
+  'line3D',
+  'scatterGL',
+  'linesGL',
+  'flowGL',
+  'graphGL',
+  'geo3D'
+].forEach(function (category) {
+  icons[category] = glIcon;
 });
 
 const LAZY_LOADED_CLASS = 'ec-shot-loaded';
 
 export default {
+  components: {
+    ExampleCard
+  },
+
+  data() {
+    const exampleListByCategory = {};
+
+    function addExamples(list, isGL) {
+      let categoryOrder = 0;
+      // Add by category order in each example.
+      do {
+        let added = false;
+        for (let i = 0; i < list.length; i++) {
+          const example = list[i];
+          if (BLACK_MAP.hasOwnProperty(example.id)) {
+            continue;
+          }
+          if (typeof example.category === 'string') {
+            example.category = [example.category];
+          }
+
+          const categoryStr = (example.category || [])[categoryOrder];
+          if (categoryStr) {
+            added = true;
+            let categoryObj = exampleListByCategory[categoryStr];
+            if (!categoryObj) {
+              categoryObj = {
+                category: categoryStr,
+                examples: []
+              };
+              exampleListByCategory[categoryStr] = categoryObj;
+            }
+            example.isGL = isGL;
 
-    components: {
-        ExampleCard
-    },
-
-    data() {
-        const exampleListByCategory = {};
-
-        function addExamples(list, isGL) {
-            let categoryOrder = 0;
-            // Add by category order in each example.
-            do {
-                let added = false;
-                for (let i = 0; i < list.length; i++) {
-                    const example = list[i];
-                    if (BLACK_MAP.hasOwnProperty(example.id)) {
-                        continue;
-                    }
-                    if (typeof example.category === 'string') {
-                        example.category = [example.category];
-                    }
-
-                    const categoryStr = (example.category || [])[categoryOrder];
-                    if (categoryStr) {
-                        added = true;
-                        let categoryObj = exampleListByCategory[categoryStr];
-                        if (!categoryObj) {
-                            categoryObj = {
-                                category: categoryStr,
-                                examples: []
-                            }
-                            exampleListByCategory[categoryStr] = categoryObj;
-                        }
-                        example.isGL = isGL;
-
-                        categoryObj.examples.push(example);
-                    }
-                }
-
-                if (!added) {
-                    break;
-                }
-            } while (++categoryOrder && categoryOrder < 4)  // At most 4 category
+            categoryObj.examples.push(example);
+          }
         }
 
-        addExamples(CHART_LIST, false);
-        addExamples(CHART_LIST_GL, true);
-
-        return {
-            shared: store,
-
-            icons,
-
-            EXAMPLE_CATEGORIES,
-            // [{
-            //  category: '',
-            //  isGL: false
-            //  examples: []
-            // }]
-            exampleListByCategory
-        }
-    },
-
-    watch: {
-        "shared.darkMode"() {
-            const imgs = this.$el.querySelectorAll('img.chart-area');
-            for (let i = 0; i < imgs.length; i++) {
-                // Force lazyload to update
-                imgs[i].classList.remove(LAZY_LOADED_CLASS);
-                imgs[i].setAttribute('data-was-processed', 'false');
-            }
-            this._lazyload.update();
+        if (!added) {
+          break;
         }
-    },
-
-    computed: {
-        exampleList() {
-            const list = [];
-            for (let i = 0; i < EXAMPLE_CATEGORIES.length; i++) {
-                const category = EXAMPLE_CATEGORIES[i];
-                const categoryObj = this.exampleListByCategory[category];
-                if (categoryObj && categoryObj.examples.length > 0) {
-                    list.push({
-                        category,
-                        examples: categoryObj.examples
-                    });
-                }
-            }
-            return list;
-        }
-    },
-
-    mounted() {
-        this._lazyload = new LazyLoad({
-            // Container should be the scroll viewport.
-            // container: this.$el.querySelector('#explore-container .example-list-panel'),
-            elements_selector: 'img.chart-area',
-            load_delay: 400,
-            class_loaded: LAZY_LOADED_CLASS
-        });
-    },
-
-    methods: {
-        onActiveNavChanged(event, currentItem, lastActiveItem) {
-            // currentItem && currentItem.scrollIntoView && currentItem.parentNode.scrollIntoView();
-            // scrollIntoView(currentItem, {
-            //     time: 100,
-            //     cancellable: false,
-            //     align: {
-            //         top: 0,
-            //         topOffset: 50
-            //     }
-            // });
+      } while (++categoryOrder && categoryOrder < 4); // At most 4 category
+    }
+
+    addExamples(CHART_LIST, false);
+    addExamples(CHART_LIST_GL, true);
+
+    return {
+      shared: store,
+
+      icons,
+
+      EXAMPLE_CATEGORIES,
+      // [{
+      //  category: '',
+      //  isGL: false
+      //  examples: []
+      // }]
+      exampleListByCategory
+    };
+  },
+
+  watch: {
+    'shared.darkMode'() {
+      const imgs = this.$el.querySelectorAll('img.chart-area');
+      for (let i = 0; i < imgs.length; i++) {
+        // Force lazyload to update
+        imgs[i].classList.remove(LAZY_LOADED_CLASS);
+        imgs[i].setAttribute('data-was-processed', 'false');
+      }
+      this._lazyload.update();
+    }
+  },
+
+  computed: {
+    exampleList() {
+      const list = [];
+      for (let i = 0; i < EXAMPLE_CATEGORIES.length; i++) {
+        const category = EXAMPLE_CATEGORIES[i];
+        const categoryObj = this.exampleListByCategory[category];
+        if (categoryObj && categoryObj.examples.length > 0) {
+          list.push({
+            category,
+            examples: categoryObj.examples
+          });
         }
+      }
+      return list;
     }
-}
+  },
+
+  mounted() {
+    this._lazyload = new LazyLoad({
+      // Container should be the scroll viewport.
+      // container: this.$el.querySelector('#explore-container .example-list-panel'),
+      elements_selector: 'img.chart-area',
+      load_delay: 400,
+      class_loaded: LAZY_LOADED_CLASS
+    });
+  },
+
+  methods: {
+    onActiveNavChanged(event, currentItem, lastActiveItem) {
+      // currentItem && currentItem.scrollIntoView && currentItem.parentNode.scrollIntoView();
+      // scrollIntoView(currentItem, {
+      //     time: 100,
+      //     cancellable: false,
+      //     align: {
+      //         top: 0,
+      //         topOffset: 50
+      //     }
+      // });
+    }
+  }
+};
 </script>
 
 <style lang="scss">
-
-@import "../style/color.scss";
-@import "../style/config.xl.scss";
+@import '../style/color.scss';
+@import '../style/config.xl.scss';
 
 $chart-nav-width: 200px;
 $chart-icon-width: 25px;
@@ -212,10 +254,10 @@ $chart-icon-border: 1px;
 $toolbar-height: 30px;
 
 $nav-height: 50px;
-$nav-active-bg: #5470C6;
+$nav-active-bg: #5470c6;
 $nav-hover-border: $nav-active-bg;
 
-$nav-text-color: #6E7079;
+$nav-text-color: #6e7079;
 $nav-hover-text-color: #464646;
 
 $pd-basic: 10px;
@@ -223,178 +265,176 @@ $pd-sm: 6px;
 $pd-lg: 20px;
 
 #example-explore {
-    background: $clr-bg;
-
-    // Use this as scrollable viewport insteadof window because echarts-www has a viewport.
-    position: absolute;
-    top: 0;
-    right: 0;
-    bottom: 0;
-    left: 0;
-    overflow-y: auto;
-
-    ::-webkit-scrollbar {
-        height: 4px;
-        width: 4px;
-        -webkit-transition: all 0.3s ease-in-out;
-        transition: all 0.3s ease-in-out;
-        border-radius: 2px;
-        background: #fff;
-    }
-
-    ::-webkit-scrollbar-button {
-        display: none
-    }
-
-    ::-webkit-scrollbar-thumb {
-        width: 4px;
-        min-height: 15px;
-        background: rgba(50, 50, 50, 0.2) !important;
-        -webkit-transition: all 0.3s ease-in-out;
-        transition: all 0.3s ease-in-out;
-        border-radius: 2px
-    }
-
-    ::-webkit-scrollbar-thumb:hover {
-        background: rgba(0, 0, 0, 0.5) !important
-    }
+  background: $clr-bg;
+
+  // Use this as scrollable viewport insteadof window because echarts-www has a viewport.
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  overflow-y: auto;
+
+  ::-webkit-scrollbar {
+    height: 4px;
+    width: 4px;
+    -webkit-transition: all 0.3s ease-in-out;
+    transition: all 0.3s ease-in-out;
+    border-radius: 2px;
+    background: #fff;
+  }
+
+  ::-webkit-scrollbar-button {
+    display: none;
+  }
+
+  ::-webkit-scrollbar-thumb {
+    width: 4px;
+    min-height: 15px;
+    background: rgba(50, 50, 50, 0.2) !important;
+    -webkit-transition: all 0.3s ease-in-out;
+    transition: all 0.3s ease-in-out;
+    border-radius: 2px;
+  }
+
+  ::-webkit-scrollbar-thumb:hover {
+    background: rgba(0, 0, 0, 0.5) !important;
+  }
 }
 
 #explore-container {
-    margin-left: $chart-nav-width + 20px;
-    padding: 10px 10px;
-    // background-color: $clr-bg;
+  margin-left: $chart-nav-width + 20px;
+  padding: 10px 10px;
+  // background-color: $clr-bg;
 }
 
 .example-list-panel {
-    margin: 30px 15px 30px 15px;
-
-    h3 {
-        margin-bottom: 20px;
-        padding-bottom: 10px;
-        border-bottom: 1px solid #E1E5F2;
-        font-weight: normal;
-        color: #464646;
-        font-size: 20px;
-    }
-    .chart-type-head span {
-        font-size: 16px;
-        padding-left: 5px;
-        color: #949CB1;
-        font-weight: 200;
-    }
+  margin: 30px 15px 30px 15px;
+
+  h3 {
+    margin-bottom: 20px;
+    padding-bottom: 10px;
+    border-bottom: 1px solid #e1e5f2;
+    font-weight: normal;
+    color: #464646;
+    font-size: 20px;
+  }
+  .chart-type-head span {
+    font-size: 16px;
+    padding-left: 5px;
+    color: #949cb1;
+    font-weight: 200;
+  }
 }
 
 #left-container {
-    position: sticky;
-    left: 0;
-    top: 0;
-    float: left;
-    height: calc(100%);
-    width: $chart-nav-width;
-    box-shadow: 0 0 10px rgba(0,0,0,0.1);
-    overflow-y: auto;
-
+  position: sticky;
+  left: 0;
+  top: 0;
+  float: left;
+  height: calc(100%);
+  width: $chart-nav-width;
+  box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
+  overflow-y: auto;
 }
 
 #toolbar {
-    position: fixed;
-    right: 30px;
-    top: 20px;
-    height: $toolbar-height;
-    background-color: #fff;
-    border-radius: $toolbar-height / 2;
+  position: fixed;
+  right: 30px;
+  top: 20px;
+  height: $toolbar-height;
+  background-color: #fff;
+  border-radius: $toolbar-height / 2;
+  // color: #fff;
+  padding: 4px 15px;
+  box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
+
+  .el-switch__label * {
+    font-size: 12px;
     // color: #fff;
-    padding: 4px 15px;
-    box-shadow: 0 0 10px rgba(0,0,0,0.1);
-
-    .el-switch__label * {
-        font-size: 12px;
-        // color: #fff;
-        text-transform: uppercase;
-    }
-    .el-switch__label.is-active {
-        color: #181432;
-    }
+    text-transform: uppercase;
+  }
+  .el-switch__label.is-active {
+    color: #181432;
+  }
 }
 
 #left-chart-nav {
-    background-color: #fff;
-    overflow-y: hidden;
-    color: #111;
-    box-shadow: 0 0 20px rgba(0,0,0,0.2);
+  background-color: #fff;
+  overflow-y: hidden;
+  color: #111;
+  box-shadow: 0 0 20px rgba(0, 0, 0, 0.2);
 
-    &:hover {
-        overflow-y: auto;
+  &:hover {
+    overflow-y: auto;
 
-        a {
-            text-decoration: none;
-        }
+    a {
+      text-decoration: none;
     }
+  }
+
+  li {
+    // transition: background-color 0.5s;
+    cursor: pointer;
+
+    a {
+      height: 45px;
+      padding: 10px 0 10px 20px;
+      display: block;
+      // transition: background-color 0.5s;
+      text-decoration: none;
+      color: $nav-text-color;
+
+      .chart-name {
+        display: inline-block;
+        position: relative;
+        vertical-align: middle;
+        margin-left: 10px;
+      }
+
+      .chart-icon {
+        content: '';
+        width: 20px;
+        display: inline-block;
+        border-radius: 50%;
+        vertical-align: middle;
+
+        svg {
+          width: 100% !important;
+          height: auto !important;
+        }
+      }
 
-    li {
-        // transition: background-color 0.5s;
-        cursor: pointer;
-
-        a {
-            height: 45px;
-            padding: 10px 0 10px 20px;
-            display: block;
-            // transition: background-color 0.5s;
-            text-decoration: none;
-            color: $nav-text-color;
-
-            .chart-name {
-                display: inline-block;
-                position: relative;
-                vertical-align: middle;
-                margin-left: 10px;
-            }
-
-            .chart-icon {
-                content: '';
-                width: 20px;
-                display: inline-block;
-                border-radius: 50%;
-                vertical-align: middle;
-
-                svg {
-                    width: 100%!important;
-                    height: auto!important;
-                }
-            }
-
-            &.active {
-                background-color: $nav-active-bg;
-                color: #fff;
-
-                .chart-icon * {
-                    fill: #fff;
-                }
-            }
+      &.active {
+        background-color: $nav-active-bg;
+        color: #fff;
 
-            &.active:hover {
-                color: #fff;
-            }
+        .chart-icon * {
+          fill: #fff;
         }
+      }
 
-        &:hover {
-            border-right: 4px solid $nav-hover-border;
+      &.active:hover {
+        color: #fff;
+      }
+    }
 
-            a {
-                color: $nav-hover-text-color;
-            }
-        }
+    &:hover {
+      border-right: 4px solid $nav-hover-border;
+
+      a {
+        color: $nav-hover-text-color;
+      }
     }
+  }
 }
 
 @media (max-width: 768px) {
-    #left-container {
-        display: none;
-    }
-    #explore-container {
-        margin-left: 0;
-    }
+  #left-container {
+    display: none;
+  }
+  #explore-container {
+    margin-left: 0;
+  }
 }
-
-</style>
\ No newline at end of file
+</style>
diff --git a/src/main.js b/src/main.js
index bcb7e55..7f6bcf2 100644
--- a/src/main.js
+++ b/src/main.js
@@ -4,7 +4,7 @@ import messages from './common/i18n';
 import EditorPage from './editor/Editor.vue';
 import ExplorePage from './explore/Explore.vue';
 import ViewPage from './editor/View.vue';
-import {store} from './common/store';
+import { store } from './common/store';
 import VueScrollactive from 'vue-scrollactive';
 
 Vue.use(VueScrollactive);
@@ -19,35 +19,36 @@ Vue.use(VueScrollactive);
  * @param {string} [option.version]
  */
 export function init(el, option) {
-    const i18n = new VueI18n({
-        locale: option.locale,
-        fallbackLocale: 'en',
-        messages
-    });
-    store.cdnRoot = option.cdnRoot;
-    store.version = option.version;
-    store.locale = option.locale || 'en';
+  const i18n = new VueI18n({
+    locale: option.locale,
+    fallbackLocale: 'en',
+    messages
+  });
+  store.cdnRoot = option.cdnRoot;
+  store.version = option.version;
+  store.locale = option.locale || 'en';
 
+  if (typeof el === 'string') {
+    el = document.querySelector(el);
+  }
+  if (!el) {
+    throw new Error("Can't find el.");
+  }
 
-    if (typeof el === 'string') {
-        el = document.querySelector(el);
-    }
-    if (!el) {
-        throw new Error('Can\'t find el.');
-    }
+  const container = document.createElement('div');
+  el.appendChild(container);
 
-    const container = document.createElement('div');
-    el.appendChild(container);
-
-    new Vue({
-        i18n,
-        el: container,
-        render: h => {
-            return h(({
-                editor: EditorPage,
-                explore: ExplorePage,
-                view: ViewPage
-            })[option.page] || ExplorePage);
-        }
-    });
-}
\ No newline at end of file
+  new Vue({
+    i18n,
+    el: container,
+    render: (h) => {
+      return h(
+        {
+          editor: EditorPage,
+          explore: ExplorePage,
+          view: ViewPage
+        }[option.page] || ExplorePage
+      );
+    }
+  });
+}
diff --git a/src/style/color.scss b/src/style/color.scss
index fda7835..62ed085 100644
--- a/src/style/color.scss
+++ b/src/style/color.scss
@@ -1,38 +1,36 @@
-$clr-primary:        #293c55;
-$clr-primary-light:  #849dbe;
-$clr-primary-dark:   #162436;
+$clr-primary: #293c55;
+$clr-primary-light: #849dbe;
+$clr-primary-dark: #162436;
 $clr-primary-darker: #0e151f;
 
-$clr-primary-home:   #333743;
-$clr-text-home:      #9297A3;
+$clr-primary-home: #333743;
+$clr-text-home: #9297a3;
 
-$clr-secondary:      #a9334c;
+$clr-secondary: #a9334c;
 $clr-secondary-dark: darken($clr-secondary, 10%);
 
-$clr-contrast:       #e43c59;
-$clr-contrast-dark:  #bf465b;
+$clr-contrast: #e43c59;
+$clr-contrast-dark: #bf465b;
 
-$clr-darkest:        #000;
-$clr-darker:         #333;
-$clr-dark:           #666;
-$clr-light:          #999;
-$clr-lighter:        #eee;
-$clr-lightest:       #f9f9f9;
+$clr-darkest: #000;
+$clr-darker: #333;
+$clr-dark: #666;
+$clr-light: #999;
+$clr-lighter: #eee;
+$clr-lightest: #f9f9f9;
 
-$clr-thirdary:       #40A7DC;
+$clr-thirdary: #40a7dc;
 $clr-thirdary-light: lighten($clr-thirdary, 10%);
 
 $clr-border: rgba(78, 97, 118, 0.45);
 $clr-border-light: rgba(78, 97, 118, 0.25);
 
-$clr-gray:           #ccc;
-$clr-gray-dark:      #999;
-$clr-gray-light:     #f3f3f3;
-
-$clr-warn:           #f93;
-$clr-error:          $clr-contrast;
-
+$clr-gray: #ccc;
+$clr-gray-dark: #999;
+$clr-gray-light: #f3f3f3;
 
+$clr-warn: #f93;
+$clr-error: $clr-contrast;
 
 $clr-bg: #f3f4fa;
 $clr-text: $clr-dark;
diff --git a/src/style/config.xl.scss b/src/style/config.xl.scss
index 678b094..37e7de6 100644
--- a/src/style/config.xl.scss
+++ b/src/style/config.xl.scss
@@ -18,607 +18,676 @@
    Fix visible-lg and hidden-lg for resolutions over 1600px
    Remove if don't want to use
    ========================================================================== */
-   @media (min-width: 1600px) {
-    .visible-lg {
-      display: none !important;
-    }
-    .hidden-lg {
-      display: block !important;
-    }
-    table.hidden-lg {
-      display: table;
-    }
-    tr.hidden-lg {
-      display: table-row !important;
-    }
-    th.hidden-lg,
-    td.hidden-lg {
-      display: table-cell !important;
-    }
+@media (min-width: 1600px) {
+  .visible-lg {
+    display: none !important;
+  }
+  .hidden-lg {
+    display: block !important;
+  }
+  table.hidden-lg {
+    display: table;
   }
+  tr.hidden-lg {
+    display: table-row !important;
+  }
+  th.hidden-lg,
+  td.hidden-lg {
+    display: table-cell !important;
+  }
+}
 
-  /* ==========================================================================
+/* ==========================================================================
      Set containers fixed sizes for >1600px, >1920px, >2560px
      Remove all if don't want to use big fixed sizes for all blocks
      You still can use cols with .container-fluid blocks
      ========================================================================== */
-  @media (min-width: 1600px) {
-    .container {
-      width: 1530px;
-    }
+@media (min-width: 1600px) {
+  .container {
+    width: 1530px;
   }
-  @media (min-width: 1920px) {
-    .container {
-      width: 1830px;
-    }
+}
+@media (min-width: 1920px) {
+  .container {
+    width: 1830px;
   }
-  @media (min-width: 2560px) {
-    .container {
-      width: 2490px;
-    }
+}
+@media (min-width: 2560px) {
+  .container {
+    width: 2490px;
   }
+}
 
-  /* ==========================================================================
+/* ==========================================================================
      col-xl, col-xxl, col-xxxl setup.
      Don't remove anything below this line
      ========================================================================== */
 
-  .col-xl-1, .col-xxl-1, .col-xxxl-1, .col-xl-2, .col-xxl-2, .col-md-2, .col-xxxl-2, .col-xl-3, .col-xxl-3, .col-md-3, .col-xxxl-3, .col-xl-4, .col-xxl-4, .col-md-4, .col-xxxl-4, .col-xl-5, .col-xxl-5, .col-md-5, .col-xxxl-5, .col-xl-6, .col-xxl-6, .col-md-6, .col-xxxl-6, .col-xl-7, .col-xxl-7, .col-md-7, .col-xxxl-7, .col-xl-8, .col-xxl-8, .col-md-8, .col-xxxl-8, .col-xl-9, .col-xxl-9, .col-md-9, .col-xxxl-9, .col-xl-10, .col-xxl-100, .col-xxxl-10, .col-xl-11, .col-xxl-111, .col-xxxl-11 [...]
-    position: relative;
-    min-height: 1px;
-    padding-right: 15px;
-    padding-left: 15px;
-  }
-  @media (min-width: 1600px) {
-    .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12 {
-      float: left;
-    }
-    .col-xl-12 {
-      width: 100%;
-    }
-    .col-xl-11 {
-      width: 91.66666667%;
-    }
-    .col-xl-10 {
-      width: 83.33333333%;
-    }
-    .col-xl-9 {
-      width: 75%;
-    }
-    .col-xl-8 {
-      width: 66.66666667%;
-    }
-    .col-xl-7 {
-      width: 58.33333333%;
-    }
-    .col-xl-6 {
-      width: 50%;
-    }
-    .col-xl-5 {
-      width: 41.66666667%;
-    }
-    .col-xl-4 {
-      width: 33.33333333%;
-    }
-    .col-xl-3 {
-      width: 25%;
-    }
-    .col-xl-2 {
-      width: 16.66666667%;
-    }
-    .col-xl-1 {
-      width: 8.33333333%;
-    }
-    .col-xl-pull-12 {
-      right: 100%;
-    }
-    .col-xl-pull-11 {
-      right: 91.66666667%;
-    }
-    .col-xl-pull-10 {
-      right: 83.33333333%;
-    }
-    .col-xl-pull-9 {
-      right: 75%;
-    }
-    .col-xl-pull-8 {
-      right: 66.66666667%;
-    }
-    .col-xl-pull-7 {
-      right: 58.33333333%;
-    }
-    .col-xl-pull-6 {
-      right: 50%;
-    }
-    .col-xl-pull-5 {
-      right: 41.66666667%;
-    }
-    .col-xl-pull-4 {
-      right: 33.33333333%;
-    }
-    .col-xl-pull-3 {
-      right: 25%;
-    }
-    .col-xl-pull-2 {
-      right: 16.66666667%;
-    }
-    .col-xl-pull-1 {
-      right: 8.33333333%;
-    }
-    .col-xl-pull-0 {
-      right: 0;
-    }
-    .col-xl-push-12 {
-      left: 100%;
-    }
-    .col-xl-push-11 {
-      left: 91.66666667%;
-    }
-    .col-xl-push-10 {
-      left: 83.33333333%;
-    }
-    .col-xl-push-9 {
-      left: 75%;
-    }
-    .col-xl-push-8 {
-      left: 66.66666667%;
-    }
-    .col-xl-push-7 {
-      left: 58.33333333%;
-    }
-    .col-xl-push-6 {
-      left: 50%;
-    }
-    .col-xl-push-5 {
-      left: 41.66666667%;
-    }
-    .col-xl-push-4 {
-      left: 33.33333333%;
-    }
-    .col-xl-push-3 {
-      left: 25%;
-    }
-    .col-xl-push-2 {
-      left: 16.66666667%;
-    }
-    .col-xl-push-1 {
-      left: 8.33333333%;
-    }
-    .col-xl-push-0 {
-      left: 0;
-    }
-    .col-xl-offset-12 {
-      margin-left: 100%;
-    }
-    .col-xl-offset-11 {
-      margin-left: 91.66666667%;
-    }
-    .col-xl-offset-10 {
-      margin-left: 83.33333333%;
-    }
-    .col-xl-offset-9 {
-      margin-left: 75%;
-    }
-    .col-xl-offset-8 {
-      margin-left: 66.66666667%;
-    }
-    .col-xl-offset-7 {
-      margin-left: 58.33333333%;
-    }
-    .col-xl-offset-6 {
-      margin-left: 50%;
-    }
-    .col-xl-offset-5 {
-      margin-left: 41.66666667%;
-    }
-    .col-xl-offset-4 {
-      margin-left: 33.33333333%;
-    }
-    .col-xl-offset-3 {
-      margin-left: 25%;
-    }
-    .col-xl-offset-2 {
-      margin-left: 16.66666667%;
-    }
-    .col-xl-offset-1 {
-      margin-left: 8.33333333%;
-    }
-    .col-xl-offset-0 {
-      margin-left: 0;
-    }
+.col-xl-1,
+.col-xxl-1,
+.col-xxxl-1,
+.col-xl-2,
+.col-xxl-2,
+.col-md-2,
+.col-xxxl-2,
+.col-xl-3,
+.col-xxl-3,
+.col-md-3,
+.col-xxxl-3,
+.col-xl-4,
+.col-xxl-4,
+.col-md-4,
+.col-xxxl-4,
+.col-xl-5,
+.col-xxl-5,
+.col-md-5,
+.col-xxxl-5,
+.col-xl-6,
+.col-xxl-6,
+.col-md-6,
+.col-xxxl-6,
+.col-xl-7,
+.col-xxl-7,
+.col-md-7,
+.col-xxxl-7,
+.col-xl-8,
+.col-xxl-8,
+.col-md-8,
+.col-xxxl-8,
+.col-xl-9,
+.col-xxl-9,
+.col-md-9,
+.col-xxxl-9,
+.col-xl-10,
+.col-xxl-100,
+.col-xxxl-10,
+.col-xl-11,
+.col-xxl-111,
+.col-xxxl-11,
+.col-xl-12,
+.col-xxl-122,
+.col-xxxl-12 {
+  position: relative;
+  min-height: 1px;
+  padding-right: 15px;
+  padding-left: 15px;
+}
+@media (min-width: 1600px) {
+  .col-xl-1,
+  .col-xl-2,
+  .col-xl-3,
+  .col-xl-4,
+  .col-xl-5,
+  .col-xl-6,
+  .col-xl-7,
+  .col-xl-8,
+  .col-xl-9,
+  .col-xl-10,
+  .col-xl-11,
+  .col-xl-12 {
+    float: left;
   }
-
-  @media (min-width: 1920px) {
-    .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12 {
-      float: left;
-    }
-    .col-xxl-12 {
-      width: 100%;
-    }
-    .col-xxl-11 {
-      width: 91.66666667%;
-    }
-    .col-xxl-10 {
-      width: 83.33333333%;
-    }
-    .col-xxl-9 {
-      width: 75%;
-    }
-    .col-xxl-8 {
-      width: 66.66666667%;
-    }
-    .col-xxl-7 {
-      width: 58.33333333%;
-    }
-    .col-xxl-6 {
-      width: 50%;
-    }
-    .col-xxl-5 {
-      width: 41.66666667%;
-    }
-    .col-xxl-4 {
-      width: 33.33333333%;
-    }
... 2617 lines suppressed ...

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@echarts.apache.org
For additional commands, e-mail: commits-help@echarts.apache.org


[echarts-examples] 01/15: compile ts to js files

Posted by sh...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

shenyi pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/echarts-examples.git

commit 424edd89bb70f7bc4ff887498c478ed04adecad5
Author: pissang <bm...@gmail.com>
AuthorDate: Mon Sep 6 12:35:21 2021 +0800

    compile ts to js files
---
 README.md                                          |    8 +-
 _config.yml                                        |    2 -
 package-lock.json                                  |  196 ++-
 package.json                                       |    6 +-
 public/data/area-basic.js                          |   22 -
 public/data/area-pieces.js                         |   66 -
 public/data/area-rainfall.js                       |  188 ---
 public/data/area-simple.js                         |   78 --
 public/data/area-stack-gradient.js                 |  174 ---
 public/data/area-stack.js                          |  103 --
 public/data/area-time-axis.js                      |   67 -
 public/data/bar-animation-delay.js                 |   70 --
 public/data/bar-background.js                      |   24 -
 public/data/bar-brush.js                           |  114 --
 public/data/bar-data-color.js                      |   25 -
 public/data/bar-drilldown.js                       |   99 --
 public/data/bar-gradient.js                        |   96 --
 public/data/bar-histogram.js                       |  126 --
 public/data/bar-label-rotation.js                  |  166 ---
 public/data/bar-large.js                           |   93 --
 public/data/bar-negative.js                        |   77 --
 public/data/bar-negative2.js                       |   66 -
 public/data/bar-polar-label-radial.js              |   30 -
 public/data/bar-polar-label-tangential.js          |   30 -
 public/data/bar-polar-real-estate.js               |  101 --
 public/data/bar-polar-stack-radial.js              |   49 -
 public/data/bar-polar-stack.js                     |   50 -
 public/data/bar-race-country.js                    |  142 ---
 public/data/bar-race.js                            |   65 -
 public/data/bar-rich-text.js                       |  151 ---
 public/data/bar-simple.js                          |   20 -
 public/data/bar-stack.js                           |  125 --
 public/data/bar-tick-align.js                      |   43 -
 public/data/bar-waterfall.js                       |   66 -
 public/data/bar-waterfall2.js                      |   91 --
 public/data/bar-y-category-stack.js                |   92 --
 public/data/bar-y-category.js                      |   48 -
 public/data/bar1.js                                |   74 --
 public/data/boxplot-light-velocity.js              |   84 --
 public/data/boxplot-light-velocity2.js             |   87 --
 public/data/boxplot-multi.js                       |  106 --
 public/data/bubble-gradient.js                     |  109 --
 public/data/calendar-charts.js                     |  193 ---
 public/data/calendar-effectscatter.js              |  167 ---
 public/data/calendar-graph.js                      |  126 --
 public/data/calendar-heatmap.js                    |   54 -
 public/data/calendar-horizontal.js                 |   72 --
 public/data/calendar-lunar.js                      |  468 -------
 public/data/calendar-pie.js                        |  116 --
 public/data/calendar-simple.js                     |   37 -
 public/data/calendar-vertical.js                   |   78 --
 public/data/candlestick-brush.js                   |  264 ----
 public/data/candlestick-large.js                   |  208 ----
 public/data/candlestick-sh-2015.js                 |  134 --
 public/data/candlestick-sh.js                      |  324 -----
 public/data/candlestick-simple.js                  |   22 -
 public/data/candlestick-touch.js                   |  245 ----
 public/data/circle-packing-with-d3.js              |  219 ----
 public/data/confidence-band.js                     |  113 --
 public/data/covid-america.js                       |  404 ------
 public/data/custom-bar-trend.js                    |  115 --
 public/data/custom-calendar-icon.js                |  119 --
 public/data/data-transform-filter.js               |   81 --
 public/data/data-transform-multiple-pie.js         |   80 --
 public/data/data-transform-sort-bar.js             |   38 -
 public/data/dataset-default.js                     |   50 -
 public/data/dataset-encode0.js                     |   49 -
 public/data/dataset-encode1.js                     |   98 --
 public/data/dataset-link.js                        |   73 --
 public/data/dataset-series-layout-by.js            |   42 -
 public/data/dataset-simple0.js                     |   29 -
 public/data/dataset-simple1.js                     |   29 -
 public/data/dynamic-data.js                        |  132 --
 public/data/dynamic-data2.js                       |   77 --
 public/data/effectScatter-bmap.js                  |  575 ---------
 public/data/effectScatter-map.js                   |  503 --------
 public/data/funnel-align.js                        |  114 --
 public/data/funnel-customize.js                    |   88 --
 public/data/funnel-mutiple.js                      |  103 --
 public/data/funnel.js                              |   72 --
 public/data/gauge-barometer.js                     |  122 --
 public/data/gauge-car.js                           |  575 ---------
 public/data/gauge-clock.js                         |  230 ----
 public/data/gauge-grade.js                         |   88 --
 public/data/gauge-multi-title.js                   |   85 --
 public/data/gauge-progress.js                      |   93 --
 public/data/gauge-ring.js                          |  102 --
 public/data/gauge-simple.js                        |   29 -
 public/data/gauge-speed.js                         |   55 -
 public/data/gauge-stage.js                         |   61 -
 public/data/gauge-temperature.js                   |  125 --
 public/data/gauge.js                               |   23 -
 public/data/geo-beef-cuts.js                       |   74 --
 public/data/geo-seatmap-flight.js                  |   93 --
 public/data/geo-svg-lines.js                       |   84 --
 public/data/geo-svg-map.js                         |  202 ---
 public/data/geo-svg-scatter-simple.js              |   54 -
 public/data/geo-svg-traffic.js                     |  167 ---
 public/data/graph-circular-layout.js               |   59 -
 public/data/graph-force-dynamic.js                 |   57 -
 public/data/graph-force.js                         |   48 -
 public/data/graph-force2.js                        |   64 -
 public/data/graph-grid.js                          |   50 -
 public/data/graph-label-overlap.js                 |   49 -
 public/data/graph-life-expectancy.js               |  103 --
 public/data/graph-npm.js                           |   54 -
 public/data/graph-simple.js                        |   87 --
 public/data/graph-webkit-dep.js                    |   43 -
 public/data/graph.js                               |   61 -
 public/data/grid-multiple.js                       |  174 ---
 public/data/heatmap-cartesian.js                   |   65 -
 public/data/line-aqi.js                            |   99 --
 public/data/line-draggable.js                      |  139 ---
 public/data/line-easing.js                         |  233 ----
 public/data/line-function.js                       |   72 --
 public/data/line-gradient.js                       |   74 --
 public/data/line-graphic.js                        |  125 --
 public/data/line-in-cartesian-coordinate-system.js |   15 -
 public/data/line-log.js                            |   57 -
 public/data/line-marker.js                         |   88 --
 public/data/line-markline.js                       |   78 --
 public/data/line-pen.js                            |   73 --
 public/data/line-polar.js                          |   42 -
 public/data/line-polar2.js                         |   47 -
 public/data/line-race.js                           |   90 --
 public/data/line-sections.js                       |   86 --
 public/data/line-simple.js                         |   20 -
 public/data/line-smooth.js                         |   21 -
 public/data/line-stack.js                          |   69 --
 public/data/line-step.js                           |   56 -
 public/data/line-style.js                          |   32 -
 public/data/line-tooltip-touch.js                  |  151 ---
 public/data/line-y-category.js                     |   53 -
 public/data/lines-airline.js                       |   64 -
 public/data/lines-bmap-bus.js                      |  148 ---
 public/data/lines-bmap-effect.js                   |  195 ---
 public/data/lines-bmap.js                          |  133 --
 public/data/lines-ny.js                            |   91 --
 public/data/map-HK.js                              |   98 --
 public/data/map-bar-morph.js                       |  147 ---
 public/data/map-usa.js                             |  137 ---
 public/data/mix-line-bar.js                        |   78 --
 public/data/mix-zoom-on-value.js                   |  101 --
 public/data/multiple-x-axis.js                     |   96 --
 public/data/multiple-y-axis.js                     |  111 --
 public/data/parallel-aqi.js                        |  224 ----
 public/data/parallel-nutrients.js                  |  186 ---
 public/data/parallel-simple.js                     |   31 -
 public/data/pictorialBar-bar-transition.js         |  144 ---
 public/data/pictorialBar-body-fill.js              |  146 ---
 public/data/pictorialBar-dotted.js                 |  111 --
 public/data/pictorialBar-forest.js                 |  111 --
 public/data/pictorialBar-hill.js                   |  113 --
 public/data/pictorialBar-spirit.js                 |  114 --
 public/data/pictorialBar-vehicle.js                |  113 --
 public/data/pictorialBar-velocity.js               |  100 --
 public/data/pie-alignTo.js                         |   94 --
 public/data/pie-borderRadius.js                    |   50 -
 public/data/pie-custom.js                          |   70 --
 public/data/pie-doughnut.js                        |   45 -
 public/data/pie-labelLine-adjust.js                |   95 --
 public/data/pie-legend.js                          |   81 --
 public/data/pie-nest.js                            |   87 --
 public/data/pie-parliament-transition.js           |  141 ---
 public/data/pie-pattern.js                         |   63 -
 public/data/pie-rich-text.js                       |  135 ---
 public/data/pie-roseType-simple.js                 |   44 -
 public/data/pie-roseType.js                        |   82 --
 public/data/pie-simple.js                          |   42 -
 public/data/polar-roundCap.js                      |   49 -
 public/data/radar-aqi.js                           |  222 ----
 public/data/radar-custom.js                        |  138 ---
 public/data/radar-multiple.js                      |   97 --
 public/data/radar.js                               |   40 -
 public/data/radar2.js                              |   73 --
 public/data/sankey-energy.js                       |   35 -
 public/data/sankey-itemstyle.js                    | 1281 --------------------
 public/data/sankey-levels.js                       |   71 --
 public/data/sankey-nodeAlign-left.js               |   37 -
 public/data/sankey-nodeAlign-right.js              |   38 -
 public/data/sankey-simple.js                       |   54 -
 public/data/sankey-vertical.js                     |   47 -
 public/data/scatter-aggregate-bar.js               |  187 ---
 public/data/scatter-anscombe-quartet.js            |  145 ---
 public/data/scatter-aqi-color.js                   |  261 ----
 public/data/scatter-clustering.js                  |  131 --
 public/data/scatter-effect.js                      |   78 --
 public/data/scatter-exponential-regression.js      |   84 --
 public/data/scatter-label-align-right.js           |   57 -
 public/data/scatter-label-align-top.js             |   51 -
 public/data/scatter-large.js                       |   74 --
 public/data/scatter-linear-regression.js           |  267 ----
 public/data/scatter-logarithmic-regression.js      |  133 --
 public/data/scatter-map-brush.js                   |  652 ----------
 public/data/scatter-matrix.js                      |  300 -----
 public/data/scatter-nebula.js                      |   76 --
 public/data/scatter-nutrients-matrix.js            |  422 -------
 public/data/scatter-nutrients.js                   |  177 ---
 public/data/scatter-painter-choice.js              |   61 -
 public/data/scatter-polar-punchCard.js             |   65 -
 public/data/scatter-polynomial-regression.js       |   84 --
 public/data/scatter-punchCard.js                   |   70 --
 public/data/scatter-simple.js                      |   39 -
 public/data/scatter-single-axis.js                 |   56 -
 public/data/scatter-stream-visual.js               |   60 -
 public/data/scatter-symbol-morph.js                |  133 --
 public/data/scatter-weibo.js                       |  103 --
 public/data/scatter-weight.js                      |  264 ----
 public/data/sunburst-borderRadius.js               |   65 -
 public/data/sunburst-drink.js                      |  723 -----------
 public/data/sunburst-label-rotate.js               |   95 --
 public/data/sunburst-monochrome.js                 |  175 ---
 public/data/sunburst-simple.js                     |   64 -
 public/data/sunburst-visualMap.js                  |   94 --
 public/data/themeRiver-basic.js                    |  100 --
 public/data/themeRiver-lastfm.js                   |   80 --
 public/data/tree-basic.js                          |   58 -
 public/data/tree-legend.js                         |  260 ----
 public/data/tree-orient-bottom-top.js              |   59 -
 public/data/tree-orient-right-left.js              |   64 -
 public/data/tree-polyline.js                       |  179 ---
 public/data/tree-radial.js                         |   41 -
 public/data/tree-vertical.js                       |   54 -
 public/data/treemap-disk.js                        |   87 --
 public/data/treemap-drill-down.js                  |   85 --
 public/data/treemap-obama.js                       |  226 ----
 public/data/treemap-show-parent.js                 |  103 --
 public/data/treemap-simple.js                      |   33 -
 public/data/treemap-sunburst-transition.js         |   56 -
 public/data/treemap-visual.js                      |  144 ---
 public/data/watermark.js                           |  218 ----
 public/data/wind-barb.js                           |  272 -----
 public/examples/ts/README.md                       |    3 +
 .../ts}/archive/custom-aggregate-scatter-bar.js    |    0
 .../archive/custom-aggregate-scatter-cluster.js    |    0
 .../ts}/archive/custom-aggregate-scatter-pie.js    |    0
 .../ts}/archive/custom-combine-separate-morph.js   |    0
 .../ts}/archive/custom-one-to-one-morph.js         |    0
 .../ts}/archive/custom-story-transition.js         |    0
 .../ts}/custom-cartesian-polygon.js                |    0
 public/{data => examples/ts}/custom-error-bar.js   |    0
 .../{data => examples/ts}/custom-error-scatter.js  |    0
 .../{data => examples/ts}/custom-gantt-flight.js   |    0
 public/{data => examples/ts}/custom-gauge.js       |    0
 public/{data => examples/ts}/custom-hexbin.js      |    0
 public/{data => examples/ts}/custom-ohlc.js        |    0
 .../{data => examples/ts}/custom-polar-heatmap.js  |    0
 public/{data => examples/ts}/custom-profile.js     |    0
 public/{data => examples/ts}/custom-profit.js      |    0
 public/{data => examples/ts}/custom-spiral-race.js |    0
 public/{data => examples/ts}/custom-wind.js        |    0
 public/{data => examples/ts}/cycle-plot.js         |    0
 .../ts}/data-transform-aggregate.js                |    0
 .../ts}/doc-example/aria-decal-newspaper.js        |    0
 .../ts}/doc-example/aria-decal-simple.js           |    0
 .../ts}/doc-example/aria-decal.js                  |    0
 .../{data => examples/ts}/doc-example/aria-pie.js  |    0
 .../ts}/doc-example/axisPointer-handle-image.js    |    0
 .../ts}/doc-example/bar-dataZoom-filterMode.js     |    0
 .../{data => examples/ts}/doc-example/bar-large.js |    0
 .../ts}/doc-example/bar-media-timeline.js          |    0
 .../ts}/doc-example/barGrid-barGap.js              |    0
 .../ts}/doc-example/candlestick-axisPointer.js     |    0
 .../ts}/doc-example/canvas-vs-svg-en.js            |    0
 .../ts}/doc-example/canvas-vs-svg.js               |    0
 .../ts}/doc-example/custom-transition-simple.js    |    0
 .../data-transform-multiple-sort-bar.js            |    0
 .../ts}/doc-example/dataset-encode-simple0.js      |    2 +-
 .../ts}/doc-example/geo-svg-label-basic.js         |    0
 .../ts}/doc-example/geo-svg-layout-basic.js        |    0
 .../ts}/doc-example/geo-svg-named-basic.js         |    0
 .../ts}/doc-example/getting-started.js             |    0
 .../ts}/doc-example/graphic-bounding.js            |    0
 .../ts}/doc-example/label-position.js              |    0
 .../ts}/doc-example/line-stack-tiled.js            |    0
 .../ts}/doc-example/map-example.js                 |    0
 .../doc-example/map-visualMap-continuous-text.js   |    0
 .../ts}/doc-example/map-visualMap-continuous.js    |    0
 .../ts}/doc-example/map-visualMap-pieces.js        |    0
 .../doc-example/map-visualMap-piecewise-text.js    |    0
 .../ts}/doc-example/mix-timeline-all.js            |    0
 .../ts}/doc-example/parallel-all.js                |    0
 .../ts}/doc-example/pictorialBar-clip.js           |    0
 .../ts}/doc-example/pictorialBar-graphicType.js    |    0
 .../ts}/doc-example/pictorialBar-patternSize.js    |    0
 .../ts}/doc-example/pictorialBar-position.js       |    0
 .../ts}/doc-example/pictorialBar-repeat.js         |    0
 .../doc-example/pictorialBar-repeatDirection.js    |    0
 .../ts}/doc-example/pictorialBar-repeatLayout.js   |    0
 .../pictorialBar-symbolBoundingDataArray.js        |    0
 .../ts}/doc-example/pictorialBar-symbolSize.js     |    0
 .../ts}/doc-example/pie-highlight.js               |    0
 .../ts}/doc-example/pie-label-bleedMargin.js       |    0
 .../doc-example/pie-label-distanceToLabelLine.js   |    0
 .../ts}/doc-example/pie-label-margin.js            |    0
 .../{data => examples/ts}/doc-example/pie-media.js |    0
 .../ts}/doc-example/polar-anticlockwise.js         |    0
 .../ts}/doc-example/polar-start-angle.js           |    0
 public/{data => examples/ts}/doc-example/radar.js  |    0
 .../ts}/doc-example/scatter-dataZoom-all.js        |    0
 .../ts}/doc-example/scatter-tutorial-dataZoom-1.js |    0
 .../ts}/doc-example/scatter-tutorial-dataZoom-2.js |    0
 .../ts}/doc-example/scatter-tutorial-dataZoom-3.js |    0
 .../doc-example/scatter-visualMap-categories.js    |    0
 .../ts}/doc-example/scatter-visualMap-piecewise.js |    0
 .../ts}/doc-example/sunburst-color.js              |    2 +-
 .../ts}/doc-example/sunburst-highlight-ancestor.js |    0
 .../doc-example/sunburst-highlight-descendant.js   |    0
 .../ts}/doc-example/sunburst-label-align.js        |    0
 .../ts}/doc-example/sunburst-simple.js             |    2 +-
 .../ts}/doc-example/text-block-fragment.js         |    0
 .../ts}/doc-example/text-fregment-align.js         |    0
 .../ts}/doc-example/text-options.js                |    0
 .../ts}/doc-example/timeline-dynamic-series.js     |    2 +-
 .../ts}/doc-example/title-block.js                 |    0
 .../ts}/doc-example/treemap-borderColor.js         |    0
 .../ts}/doc-example/tutorial-async.js              |    0
 .../ts}/doc-example/tutorial-dynamic-data.js       |    0
 .../ts}/doc-example/tutorial-loading.js            |    0
 .../ts}/doc-example/tutorial-styling-step0.js      |    0
 .../ts}/doc-example/tutorial-styling-step1.js      |    0
 .../ts}/doc-example/tutorial-styling-step2.js      |    0
 .../ts}/doc-example/tutorial-styling-step3.js      |    0
 .../ts}/doc-example/tutorial-styling-step4.js      |    0
 .../ts}/doc-example/tutorial-styling-step5.js      |    0
 .../ts}/doc-example/value-animation-simple.js      |    0
 public/{data => examples/ts}/geo-lines.js          |    0
 public/{data => examples/ts}/geo-map-scatter.js    |    0
 public/{data => examples/ts}/geo-organ.js          |    0
 public/{data => examples/ts}/heatmap-bmap.js       |    0
 .../ts}/heatmap-large-piecewise.js                 |    0
 public/{data => examples/ts}/heatmap-large.js      |    0
 public/{data => examples/ts}/heatmap-map.js        |    0
 public/examples/ts/line-gradient.ts                |    2 +-
 public/{data => examples/ts}/map-bin.js            |    0
 .../{data => examples/ts}/map-china-dataRange.js   |    0
 public/{data => examples/ts}/map-china.js          |    0
 public/{data => examples/ts}/map-labels.js         |    2 +-
 public/{data => examples/ts}/map-locate.js         |    0
 public/{data => examples/ts}/map-polygon.js        |    0
 public/{data => examples/ts}/map-province.js       |    0
 .../{data => examples/ts}/map-world-dataRange.js   |    0
 public/{data => examples/ts}/map-world.js          |    0
 .../{data => examples/ts}/mix-timeline-finance.js  |    0
 .../ts}/scatter-clustering-process.js              |    0
 .../ts}/scatter-life-expectancy-timeline.js        |    0
 public/{data => examples/ts}/scatter-map.js        |    0
 .../ts}/scatter-world-population.js                |    0
 public/{data => examples/ts}/sunburst-book.js      |   38 +-
 public/examples/ts/watermark.ts                    |    2 +-
 public/examples/tsconfig.json                      |    9 +-
 public/examples/types/example.d.ts                 |   46 +-
 tool/build-example.js                              |    1 -
 353 files changed, 243 insertions(+), 27272 deletions(-)

diff --git a/README.md b/README.md
index b56d153..5891e3f 100644
--- a/README.md
+++ b/README.md
@@ -28,7 +28,7 @@ It will copy all the build resources to echarts-website/next/examples
 
 ## Edit example
 
-All test cases are in the `public/data` folder. The comment in the header
+All test cases are in the `public/examples/ts` folder. The comment in the header
 
 ```js
 /*
@@ -53,6 +53,12 @@ videoEnd: 6000
 */
 ```
 
+Most of examples are written in `TypeScript`. You need to comile it to `JavaScript` by using command:
+
+```shell
+npm run compile:example
+```
+
 
 ## Some built-in features available in examples
 
diff --git a/_config.yml b/_config.yml
deleted file mode 100644
index a98ff5b..0000000
--- a/_config.yml
+++ /dev/null
@@ -1,2 +0,0 @@
-# Handling Reading
-markdown_ext: "markdown,mkdown,mkdn,mkd"
diff --git a/package-lock.json b/package-lock.json
index fc83889..215c765 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1251,6 +1251,15 @@
         "@types/node": "*"
       }
     },
+    "@types/jquery": {
+      "version": "3.5.6",
+      "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.6.tgz",
+      "integrity": "sha512-SmgCQRzGPId4MZQKDj9Hqc6kSXFNWZFHpELkyK8AQhf8Zr6HKfCzFv9ZC1Fv3FyQttJZOlap3qYb12h61iZAIg==",
+      "dev": true,
+      "requires": {
+        "@types/sizzle": "*"
+      }
+    },
     "@types/json-schema": {
       "version": "7.0.5",
       "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz",
@@ -1269,6 +1278,12 @@
       "integrity": "sha1-bRGowtWEBbPbk4irdAEGy/pkw8k=",
       "dev": true
     },
+    "@types/sizzle": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz",
+      "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==",
+      "dev": true
+    },
     "@typescript-eslint/types": {
       "version": "4.12.0",
       "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.12.0.tgz",
@@ -3116,6 +3131,124 @@
         }
       }
     },
+    "download-git-repo": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/download-git-repo/-/download-git-repo-3.0.2.tgz",
+      "integrity": "sha512-N8hWXD4hXqmEcNoR8TBYFntaOcYvEQ7Bz90mgm3bZRTuteGQqwT32VDMnTyD0KTEvb8BWrMc1tVmzuV9u/WrAg==",
+      "dev": true,
+      "requires": {
+        "download": "^7.1.0",
+        "git-clone": "^0.1.0",
+        "rimraf": "^3.0.0"
+      },
+      "dependencies": {
+        "download": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/download/-/download-7.1.0.tgz",
+          "integrity": "sha512-xqnBTVd/E+GxJVrX5/eUJiLYjCGPwMpdL+jGhGU57BvtcA7wwhtHVbXBeUk51kOpW3S7Jn3BQbN9Q1R1Km2qDQ==",
+          "dev": true,
+          "requires": {
+            "archive-type": "^4.0.0",
+            "caw": "^2.0.1",
+            "content-disposition": "^0.5.2",
+            "decompress": "^4.2.0",
+            "ext-name": "^5.0.0",
+            "file-type": "^8.1.0",
+            "filenamify": "^2.0.0",
+            "get-stream": "^3.0.0",
+            "got": "^8.3.1",
+            "make-dir": "^1.2.0",
+            "p-event": "^2.1.0",
+            "pify": "^3.0.0"
+          }
+        },
+        "get-stream": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+          "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
+          "dev": true
+        },
+        "got": {
+          "version": "8.3.2",
+          "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz",
+          "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==",
+          "dev": true,
+          "requires": {
+            "@sindresorhus/is": "^0.7.0",
+            "cacheable-request": "^2.1.1",
+            "decompress-response": "^3.3.0",
+            "duplexer3": "^0.1.4",
+            "get-stream": "^3.0.0",
+            "into-stream": "^3.1.0",
+            "is-retry-allowed": "^1.1.0",
+            "isurl": "^1.0.0-alpha5",
+            "lowercase-keys": "^1.0.0",
+            "mimic-response": "^1.0.0",
+            "p-cancelable": "^0.4.0",
+            "p-timeout": "^2.0.1",
+            "pify": "^3.0.0",
+            "safe-buffer": "^5.1.1",
+            "timed-out": "^4.0.1",
+            "url-parse-lax": "^3.0.0",
+            "url-to-options": "^1.0.1"
+          }
+        },
+        "make-dir": {
+          "version": "1.3.0",
+          "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
+          "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==",
+          "dev": true,
+          "requires": {
+            "pify": "^3.0.0"
+          }
+        },
+        "p-cancelable": {
+          "version": "0.4.1",
+          "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz",
+          "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==",
+          "dev": true
+        },
+        "p-event": {
+          "version": "2.3.1",
+          "resolved": "https://registry.npmjs.org/p-event/-/p-event-2.3.1.tgz",
+          "integrity": "sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==",
+          "dev": true,
+          "requires": {
+            "p-timeout": "^2.0.1"
+          }
+        },
+        "p-timeout": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz",
+          "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==",
+          "dev": true,
+          "requires": {
+            "p-finally": "^1.0.0"
+          }
+        },
+        "pify": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+          "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+          "dev": true
+        },
+        "prepend-http": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
+          "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=",
+          "dev": true
+        },
+        "url-parse-lax": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
+          "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
+          "dev": true,
+          "requires": {
+            "prepend-http": "^2.0.0"
+          }
+        }
+      }
+    },
     "duplexer": {
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
@@ -3129,19 +3262,19 @@
       "dev": true
     },
     "echarts": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.0.0.tgz",
-      "integrity": "sha512-6SDcJbLVOcfQyjPg+spNU1+JVrkU1B9fzUa5tpbP/mMNUPyigCOJwcEIQAJSbp9jt5UP3EXvQR0vtYXIo9AjyA==",
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.2.0.tgz",
+      "integrity": "sha512-7CrCKGRjFdpLIJ/Yt1gpHeqs5PiCem2GHPdWZPwKl7WSYeZu0Qzm1bcCFe9/b4dfVaL1zlY4JmdzaVwKksVeqg==",
       "dev": true,
       "requires": {
-        "tslib": "1.10.0",
-        "zrender": "5.0.1"
+        "tslib": "2.3.0",
+        "zrender": "5.2.0"
       },
       "dependencies": {
         "tslib": {
-          "version": "1.10.0",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz",
-          "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==",
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz",
+          "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==",
           "dev": true
         }
       }
@@ -3221,6 +3354,12 @@
         "is-arrayish": "^0.2.1"
       }
     },
+    "esbuild": {
+      "version": "0.8.57",
+      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.8.57.tgz",
+      "integrity": "sha512-j02SFrUwFTRUqiY0Kjplwjm1psuzO1d6AjaXKuOR9hrY0HuPsT6sV42B6myW34h1q4CRy+Y3g4RU/cGJeI/nNA==",
+      "dev": true
+    },
     "escalade": {
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.0.2.tgz",
@@ -3427,6 +3566,12 @@
         "schema-utils": "^2.5.0"
       }
     },
+    "file-type": {
+      "version": "8.1.0",
+      "resolved": "https://registry.npmjs.org/file-type/-/file-type-8.1.0.tgz",
+      "integrity": "sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ==",
+      "dev": true
+    },
     "filename-reserved-regex": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz",
@@ -3574,6 +3719,12 @@
         "pinkie-promise": "^2.0.0"
       }
     },
+    "git-clone": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/git-clone/-/git-clone-0.1.0.tgz",
+      "integrity": "sha1-DXYWN3gJOu9/HDAjjyqe8/B6Lrk=",
+      "dev": true
+    },
     "github-from-package": {
       "version": "0.0.0",
       "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
@@ -5367,9 +5518,9 @@
       "dev": true
     },
     "prettier": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz",
-      "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==",
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.2.tgz",
+      "integrity": "sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ==",
       "dev": true
     },
     "process-nextick-args": {
@@ -5643,6 +5794,15 @@
       "integrity": "sha1-kNo4Kx4SbvwCFG6QhFqI2xKSXXY=",
       "dev": true
     },
+    "rimraf": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+      "dev": true,
+      "requires": {
+        "glob": "^7.1.3"
+      }
+    },
     "run-parallel": {
       "version": "1.1.9",
       "resolved": "https://registry.npm.taobao.org/run-parallel/download/run-parallel-1.1.9.tgz",
@@ -7161,18 +7321,18 @@
       "dev": true
     },
     "zrender": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.0.1.tgz",
-      "integrity": "sha512-i8FNCKAKfF0EfZFJ6w2p30umBrCyy481/PePFQqPdtNgCl5Hp5z7/dovqb7soEoFkhNvhjJ/J4W9zFALeae6yA==",
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.2.0.tgz",
+      "integrity": "sha512-87v3gvB0lcWy48ObA/DwrhQ95ADMMRhECVrXmHDFCBNvbxHFfEDZtrZh4VmVjLAeFAjimY4PyZ65rbLCivdszA==",
       "dev": true,
       "requires": {
-        "tslib": "1.10.0"
+        "tslib": "2.3.0"
       },
       "dependencies": {
         "tslib": {
-          "version": "1.10.0",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz",
-          "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==",
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz",
+          "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==",
           "dev": true
         }
       }
diff --git a/package.json b/package.json
index 39e45f0..8fe1fee 100644
--- a/package.json
+++ b/package.json
@@ -9,6 +9,7 @@
     "release": "npm run build && node build/copyResource.js --env asf",
     "dev": "npx concurrently --kill-others \"npm:watch\" \"npm:server\"",
     "build:example": "node tool/build-example.js && node tool/build-example.js --source data-gl",
+    "compile:example": "tsc --project public/examples/tsconfig.json",
     "test:e2e": "node e2e/main.js --bundler webpack -m",
     "test:e2e:local": "node e2e/main.js --bundler webpack -m --local",
     "test:e2e:esbuild": "node e2e/main.js --bundler esbuild -m",
@@ -20,6 +21,7 @@
     "@babel/preset-env": "^7.10.2",
     "@ffmpeg/core": "^0.10.0",
     "@ffmpeg/ffmpeg": "^0.10.1",
+    "@types/jquery": "^3.5.6",
     "@typescript-eslint/typescript-estree": "^4.10.0",
     "argparse": "^1.0.9",
     "babel-loader": "^8.1.0",
@@ -28,7 +30,7 @@
     "css-loader": "^3.5.3",
     "cwebp-bin": "^6.1.1",
     "download-git-repo": "^3.0.2",
-    "echarts": "^5.0.0",
+    "echarts": "^5.2.0",
     "echarts-stat": "^1.2.0",
     "esbuild": "^0.8.34",
     "file-loader": "^4.3.0",
@@ -42,7 +44,7 @@
     "open": "^7.1.0",
     "pixelmatch": "^5.2.1",
     "pngjs": "^6.0.0",
-    "prettier": "^2.2.1",
+    "prettier": "^2.3.2",
     "sass.js": "^0.11.1",
     "sassjs-loader": "^2.0.0",
     "seedrandom": "^3.0.5",
diff --git a/public/data/area-basic.js b/public/data/area-basic.js
deleted file mode 100644
index 6200298..0000000
--- a/public/data/area-basic.js
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
-title: Basic area chart
-titleCN: 基础面积图
-category: line
-difficulty: 1
-*/
-
-option = {
-    xAxis: {
-        type: 'category',
-        boundaryGap: false,
-        data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
-    },
-    yAxis: {
-        type: 'value'
-    },
-    series: [{
-        data: [820, 932, 901, 934, 1290, 1330, 1320],
-        type: 'line',
-        areaStyle: {}
-    }]
-};
diff --git a/public/data/area-pieces.js b/public/data/area-pieces.js
deleted file mode 100644
index a6cb4a1..0000000
--- a/public/data/area-pieces.js
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
-title: Area Pieces
-titleCN: 折线图区域高亮
-category: 'line, visualMap'
-difficulty: 3
-*/
-
-
-option = {
-    xAxis: {
-        type: 'category',
-        boundaryGap: false
-    },
-    yAxis: {
-        type: 'value',
-        boundaryGap: [0, '30%']
-    },
-    visualMap: {
-        type: 'piecewise',
-        show: false,
-        dimension: 0,
-        seriesIndex: 0,
-        pieces: [{
-            gt: 1,
-            lt: 3,
-            color: 'rgba(0, 0, 180, 0.4)'
-        }, {
-            gt: 5,
-            lt: 7,
-            color: 'rgba(0, 0, 180, 0.4)'
-        }]
-    },
-    series: [
-        {
-            type: 'line',
-            smooth: 0.6,
-            symbol: 'none',
-            lineStyle: {
-                color: '#5470C6',
-                width: 5
-            },
-            markLine: {
-                symbol: ['none', 'none'],
-                label: {show: false},
-                data: [
-                    {xAxis: 1},
-                    {xAxis: 3},
-                    {xAxis: 5},
-                    {xAxis: 7}
-                ]
-            },
-            areaStyle: {},
-            data: [
-                ['2019-10-10', 200],
-                ['2019-10-11', 560],
-                ['2019-10-12', 750],
-                ['2019-10-13', 580],
-                ['2019-10-14', 250],
-                ['2019-10-15', 300],
-                ['2019-10-16', 450],
-                ['2019-10-17', 300],
-                ['2019-10-18', 100]
-            ]
-        }
-    ]
-};
\ No newline at end of file
diff --git a/public/data/area-rainfall.js b/public/data/area-rainfall.js
deleted file mode 100644
index 1ca5bc9..0000000
--- a/public/data/area-rainfall.js
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
-title: Rainfall
-titleCN: 雨量流量关系图
-category: line
-difficulty: 5
-*/
-
-option = {
-    title: {
-        text: '雨量流量关系图',
-        subtext: '数据来自西安兰特水电测控技术有限公司',
-        left: 'center',
-        align: 'right'
-    },
-    grid: {
-        bottom: 80
-    },
-    toolbox: {
-        feature: {
-            dataZoom: {
-                yAxisIndex: 'none'
-            },
-            restore: {},
-            saveAsImage: {}
-        }
-    },
-    tooltip: {
-        trigger: 'axis',
-        axisPointer: {
-            type: 'cross',
-            animation: false,
-            label: {
-                backgroundColor: '#505765'
-            }
-        }
-    },
-    legend: {
-        data: ['流量', '降雨量'],
-        left: 10
-    },
-    dataZoom: [
-        {
-            show: true,
-            realtime: true,
-            start: 65,
-            end: 85
-        },
-        {
-            type: 'inside',
-            realtime: true,
-            start: 65,
-            end: 85
-        }
-    ],
-    xAxis: [
-        {
-            type: 'category',
-            boundaryGap: false,
-            axisLine: {onZero: false},
-            data: [
-                '2009/6/12 2:00', '2009/6/12 3:00', '2009/6/12 4:00', '2009/6/12 5:00', '2009/6/12 6:00', '2009/6/12 7:00', '2009/6/12 8:00', '2009/6/12 9:00', '2009/6/12 10:00', '2009/6/12 11:00', '2009/6/12 12:00', '2009/6/12 13:00', '2009/6/12 14:00', '2009/6/12 15:00', '2009/6/12 16:00', '2009/6/12 17:00', '2009/6/12 18:00', '2009/6/12 19:00', '2009/6/12 20:00', '2009/6/12 21:00', '2009/6/12 22:00', '2009/6/12 23:00',
-                '2009/6/13 0:00', '2009/6/13 1:00', '2009/6/13 2:00', '2009/6/13 3:00', '2009/6/13 4:00', '2009/6/13 5:00', '2009/6/13 6:00', '2009/6/13 7:00', '2009/6/13 8:00', '2009/6/13 9:00', '2009/6/13 10:00', '2009/6/13 11:00', '2009/6/13 12:00', '2009/6/13 13:00', '2009/6/13 14:00', '2009/6/13 15:00', '2009/6/13 16:00', '2009/6/13 17:00', '2009/6/13 18:00', '2009/6/13 19:00', '2009/6/13 20:00', '2009/6/13 21:00', '2009/6/13 22:00', '2009/6/13 23:00',
-                '2009/6/14 0:00', '2009/6/14 1:00', '2009/6/14 2:00', '2009/6/14 3:00', '2009/6/14 4:00', '2009/6/14 5:00', '2009/6/14 6:00', '2009/6/14 7:00', '2009/6/14 8:00', '2009/6/14 9:00', '2009/6/14 10:00', '2009/6/14 11:00', '2009/6/14 12:00', '2009/6/14 13:00', '2009/6/14 14:00', '2009/6/14 15:00', '2009/6/14 16:00', '2009/6/14 17:00', '2009/6/14 18:00', '2009/6/14 19:00', '2009/6/14 20:00', '2009/6/14 21:00', '2009/6/14 22:00', '2009/6/14 23:00',
-                '2009/6/15 0:00', '2009/6/15 1:00', '2009/6/15 2:00', '2009/6/15 3:00', '2009/6/15 4:00', '2009/6/15 5:00', '2009/6/15 6:00', '2009/6/15 7:00', '2009/6/15 8:00', '2009/6/15 9:00', '2009/6/15 10:00', '2009/6/15 11:00', '2009/6/15 12:00', '2009/6/15 13:00', '2009/6/15 14:00', '2009/6/15 15:00', '2009/6/15 16:00', '2009/6/15 17:00', '2009/6/15 18:00', '2009/6/15 19:00', '2009/6/15 20:00', '2009/6/15 21:00', '2009/6/15 22:00', '2009/6/15 23:00',
-                '2009/6/15 0:00', '2009/6/16 1:00', '2009/6/16 2:00', '2009/6/16 3:00', '2009/6/16 4:00', '2009/6/16 5:00', '2009/6/16 6:00', '2009/6/16 7:00', '2009/6/16 8:00', '2009/6/16 9:00', '2009/6/16 10:00', '2009/6/16 11:00', '2009/6/16 12:00', '2009/6/16 13:00', '2009/6/16 14:00', '2009/6/16 15:00', '2009/6/16 16:00', '2009/6/16 17:00', '2009/6/16 18:00', '2009/6/16 19:00', '2009/6/16 20:00', '2009/6/16 21:00', '2009/6/16 22:00', '2009/6/16 23:00',
-                '2009/6/15 0:00', '2009/6/17 1:00', '2009/6/17 2:00', '2009/6/17 3:00', '2009/6/17 4:00', '2009/6/17 5:00', '2009/6/17 6:00', '2009/6/17 7:00', '2009/6/17 8:00', '2009/6/17 9:00', '2009/6/17 10:00', '2009/6/17 11:00', '2009/6/17 12:00', '2009/6/17 13:00', '2009/6/17 14:00', '2009/6/17 15:00', '2009/6/17 16:00', '2009/6/17 17:00', '2009/6/17 18:00', '2009/6/17 19:00', '2009/6/17 20:00', '2009/6/17 21:00', '2009/6/17 22:00', '2009/6/17 23:00',
-                '2009/6/18 0:00', '2009/6/18 1:00', '2009/6/18 2:00', '2009/6/18 3:00', '2009/6/18 4:00', '2009/6/18 5:00', '2009/6/18 6:00', '2009/6/18 7:00', '2009/6/18 8:00', '2009/6/18 9:00', '2009/6/18 10:00', '2009/6/18 11:00', '2009/6/18 12:00', '2009/6/18 13:00', '2009/6/18 14:00', '2009/6/18 15:00', '2009/6/18 16:00', '2009/6/18 17:00', '2009/6/18 18:00', '2009/6/18 19:00', '2009/6/18 20:00', '2009/6/18 21:00', '2009/6/18 22:00', '2009/6/18 23:00',
-                '2009/6/15 0:00', '2009/6/19 1:00', '2009/6/19 2:00', '2009/6/19 3:00', '2009/6/19 4:00', '2009/6/19 5:00', '2009/6/19 6:00', '2009/6/19 7:00', '2009/6/19 8:00', '2009/6/19 9:00', '2009/6/19 10:00', '2009/6/19 11:00', '2009/6/19 12:00', '2009/6/19 13:00', '2009/6/19 14:00', '2009/6/19 15:00', '2009/6/19 16:00', '2009/6/19 17:00', '2009/6/19 18:00', '2009/6/19 19:00', '2009/6/19 20:00', '2009/6/19 21:00', '2009/6/19 22:00', '2009/6/19 23:00',
-                '2009/6/20 0:00', '2009/6/20 1:00', '2009/6/20 2:00', '2009/6/20 3:00', '2009/6/20 4:00', '2009/6/20 5:00', '2009/6/20 6:00', '2009/6/20 7:00', '2009/6/20 8:00', '2009/6/20 9:00', '2009/6/20 10:00', '2009/6/20 11:00', '2009/6/20 12:00', '2009/6/20 13:00', '2009/6/20 14:00', '2009/6/20 15:00', '2009/6/20 16:00', '2009/6/20 17:00', '2009/6/20 18:00', '2009/6/20 19:00', '2009/6/20 20:00', '2009/6/20 21:00', '2009/6/20 22:00', '2009/6/20 23:00',
-                '2009/6/21 0:00', '2009/6/21 1:00', '2009/6/21 2:00', '2009/6/21 3:00', '2009/6/21 4:00', '2009/6/21 5:00', '2009/6/21 6:00', '2009/6/21 7:00', '2009/6/21 8:00', '2009/6/21 9:00', '2009/6/21 10:00', '2009/6/21 11:00', '2009/6/21 12:00', '2009/6/21 13:00', '2009/6/21 14:00', '2009/6/21 15:00', '2009/6/21 16:00', '2009/6/21 17:00', '2009/6/21 18:00', '2009/6/21 19:00', '2009/6/21 20:00', '2009/6/21 21:00', '2009/6/21 22:00', '2009/6/21 23:00',
-                '2009/6/22 0:00', '2009/6/22 1:00', '2009/6/22 2:00', '2009/6/22 3:00', '2009/6/22 4:00', '2009/6/22 5:00', '2009/6/22 6:00', '2009/6/22 7:00', '2009/6/22 8:00', '2009/6/22 9:00', '2009/6/22 10:00', '2009/6/22 11:00', '2009/6/22 12:00', '2009/6/22 13:00', '2009/6/22 14:00', '2009/6/22 15:00', '2009/6/22 16:00', '2009/6/22 17:00', '2009/6/22 18:00', '2009/6/22 19:00', '2009/6/22 20:00', '2009/6/22 21:00', '2009/6/22 22:00', '2009/6/22 23:00',
-                '2009/6/23 0:00', '2009/6/23 1:00', '2009/6/23 2:00', '2009/6/23 3:00', '2009/6/23 4:00', '2009/6/23 5:00', '2009/6/23 6:00', '2009/6/23 7:00', '2009/6/23 8:00', '2009/6/23 9:00', '2009/6/23 10:00', '2009/6/23 11:00', '2009/6/23 12:00', '2009/6/23 13:00', '2009/6/23 14:00', '2009/6/23 15:00', '2009/6/23 16:00', '2009/6/23 17:00', '2009/6/23 18:00', '2009/6/23 19:00', '2009/6/23 20:00', '2009/6/23 21:00', '2009/6/23 22:00', '2009/6/23 23:00',
-                '2009/6/24 0:00', '2009/6/24 1:00', '2009/6/24 2:00', '2009/6/24 3:00', '2009/6/24 4:00', '2009/6/24 5:00', '2009/6/24 6:00', '2009/6/24 7:00', '2009/6/24 8:00', '2009/6/24 9:00', '2009/6/24 10:00', '2009/6/24 11:00', '2009/6/24 12:00', '2009/6/24 13:00', '2009/6/24 14:00', '2009/6/24 15:00', '2009/6/24 16:00', '2009/6/24 17:00', '2009/6/24 18:00', '2009/6/24 19:00', '2009/6/24 20:00', '2009/6/24 21:00', '2009/6/24 22:00', '2009/6/24 23:00',
-                '2009/6/25 0:00', '2009/6/25 1:00', '2009/6/25 2:00', '2009/6/25 3:00', '2009/6/25 4:00', '2009/6/25 5:00', '2009/6/25 6:00', '2009/6/25 7:00', '2009/6/25 8:00', '2009/6/25 9:00', '2009/6/25 10:00', '2009/6/25 11:00', '2009/6/25 12:00', '2009/6/25 13:00', '2009/6/25 14:00', '2009/6/25 15:00', '2009/6/25 16:00', '2009/6/25 17:00', '2009/6/25 18:00', '2009/6/25 19:00', '2009/6/25 20:00', '2009/6/25 21:00', '2009/6/25 22:00', '2009/6/25 23:00',
-                '2009/6/26 0:00', '2009/6/26 1:00', '2009/6/26 2:00', '2009/6/26 3:00', '2009/6/26 4:00', '2009/6/26 5:00', '2009/6/26 6:00', '2009/6/26 7:00', '2009/6/26 8:00', '2009/6/26 9:00', '2009/6/26 10:00', '2009/6/26 11:00', '2009/6/26 12:00', '2009/6/26 13:00', '2009/6/26 14:00', '2009/6/26 15:00', '2009/6/26 16:00', '2009/6/26 17:00', '2009/6/26 18:00', '2009/6/26 19:00', '2009/6/26 20:00', '2009/6/26 21:00', '2009/6/26 22:00', '2009/6/26 23:00',
-                '2009/6/27 0:00', '2009/6/27 1:00', '2009/6/27 2:00', '2009/6/27 3:00', '2009/6/27 4:00', '2009/6/27 5:00', '2009/6/27 6:00', '2009/6/27 7:00', '2009/6/27 8:00', '2009/6/27 9:00', '2009/6/27 10:00', '2009/6/27 11:00', '2009/6/27 12:00', '2009/6/27 13:00', '2009/6/27 14:00', '2009/6/27 15:00', '2009/6/27 16:00', '2009/6/27 17:00', '2009/6/27 18:00', '2009/6/27 19:00', '2009/6/27 20:00', '2009/6/27 21:00', '2009/6/27 22:00', '2009/6/27 23:00',
-                '2009/6/28 0:00', '2009/6/28 1:00', '2009/6/28 2:00', '2009/6/28 3:00', '2009/6/28 4:00', '2009/6/28 5:00', '2009/6/28 6:00', '2009/6/28 7:00', '2009/6/28 8:00', '2009/6/28 9:00', '2009/6/28 10:00', '2009/6/28 11:00', '2009/6/28 12:00', '2009/6/28 13:00', '2009/6/28 14:00', '2009/6/28 15:00', '2009/6/28 16:00', '2009/6/28 17:00', '2009/6/28 18:00', '2009/6/28 19:00', '2009/6/28 20:00', '2009/6/28 21:00', '2009/6/28 22:00', '2009/6/28 23:00',
-                '2009/6/29 0:00', '2009/6/29 1:00', '2009/6/29 2:00', '2009/6/29 3:00', '2009/6/29 4:00', '2009/6/29 5:00', '2009/6/29 6:00', '2009/6/29 7:00', '2009/6/29 8:00', '2009/6/29 9:00', '2009/6/29 10:00', '2009/6/29 11:00', '2009/6/29 12:00', '2009/6/29 13:00', '2009/6/29 14:00', '2009/6/29 15:00', '2009/6/29 16:00', '2009/6/29 17:00', '2009/6/29 18:00', '2009/6/29 19:00', '2009/6/29 20:00', '2009/6/29 21:00', '2009/6/29 22:00', '2009/6/29 23:00',
-                '2009/6/30 0:00', '2009/6/30 1:00', '2009/6/30 2:00', '2009/6/30 3:00', '2009/6/30 4:00', '2009/6/30 5:00', '2009/6/30 6:00', '2009/6/30 7:00', '2009/6/30 8:00', '2009/6/30 9:00', '2009/6/30 10:00', '2009/6/30 11:00', '2009/6/30 12:00', '2009/6/30 13:00', '2009/6/30 14:00', '2009/6/30 15:00', '2009/6/30 16:00', '2009/6/30 17:00', '2009/6/30 18:00', '2009/6/30 19:00', '2009/6/30 20:00', '2009/6/30 21:00', '2009/6/30 22:00', '2009/6/30 23:00',
-                '2009/7/1 0:00', '2009/7/1 1:00', '2009/7/1 2:00', '2009/7/1 3:00', '2009/7/1 4:00', '2009/7/1 5:00', '2009/7/1 6:00', '2009/7/1 7:00', '2009/7/1 8:00', '2009/7/1 9:00', '2009/7/1 10:00', '2009/7/1 11:00', '2009/7/1 12:00', '2009/7/1 13:00', '2009/7/1 14:00', '2009/7/1 15:00', '2009/7/1 16:00', '2009/7/1 17:00', '2009/7/1 18:00', '2009/7/1 19:00', '2009/7/1 20:00', '2009/7/1 21:00', '2009/7/1 22:00', '2009/7/1 23:00',
-                '2009/7/2 0:00', '2009/7/2 1:00', '2009/7/2 2:00', '2009/7/2 3:00', '2009/7/2 4:00', '2009/7/2 5:00', '2009/7/2 6:00', '2009/7/2 7:00', '2009/7/2 8:00', '2009/7/2 9:00', '2009/7/2 10:00', '2009/7/2 11:00', '2009/7/2 12:00', '2009/7/2 13:00', '2009/7/2 14:00', '2009/7/2 15:00', '2009/7/2 16:00', '2009/7/2 17:00', '2009/7/2 18:00', '2009/7/2 19:00', '2009/7/2 20:00', '2009/7/2 21:00', '2009/7/2 22:00', '2009/7/2 23:00',
-                '2009/7/3 0:00', '2009/7/3 1:00', '2009/7/3 2:00', '2009/7/3 3:00', '2009/7/3 4:00', '2009/7/3 5:00', '2009/7/3 6:00', '2009/7/3 7:00', '2009/7/3 8:00', '2009/7/3 9:00', '2009/7/3 10:00', '2009/7/3 11:00', '2009/7/3 12:00', '2009/7/3 13:00', '2009/7/3 14:00', '2009/7/3 15:00', '2009/7/3 16:00', '2009/7/3 17:00', '2009/7/3 18:00', '2009/7/3 19:00', '2009/7/3 20:00', '2009/7/3 21:00', '2009/7/3 22:00', '2009/7/3 23:00',
-                '2009/7/4 0:00', '2009/7/4 1:00', '2009/7/4 2:00', '2009/7/4 3:00', '2009/7/4 4:00', '2009/7/4 5:00', '2009/7/4 6:00', '2009/7/4 7:00', '2009/7/4 8:00', '2009/7/4 9:00', '2009/7/4 10:00', '2009/7/4 11:00', '2009/7/4 12:00', '2009/7/4 13:00', '2009/7/4 14:00', '2009/7/4 15:00', '2009/7/4 16:00', '2009/7/4 17:00', '2009/7/4 18:00', '2009/7/4 19:00', '2009/7/4 20:00', '2009/7/4 21:00', '2009/7/4 22:00', '2009/7/4 23:00',
-                '2009/7/5 0:00', '2009/7/5 1:00', '2009/7/5 2:00', '2009/7/5 3:00', '2009/7/5 4:00', '2009/7/5 5:00', '2009/7/5 6:00', '2009/7/5 7:00', '2009/7/5 8:00', '2009/7/5 9:00', '2009/7/5 10:00', '2009/7/5 11:00', '2009/7/5 12:00', '2009/7/5 13:00', '2009/7/5 14:00', '2009/7/5 15:00', '2009/7/5 16:00', '2009/7/5 17:00', '2009/7/5 18:00', '2009/7/5 19:00', '2009/7/5 20:00', '2009/7/5 21:00', '2009/7/5 22:00', '2009/7/5 23:00',
-                '2009/7/6 0:00', '2009/7/6 1:00', '2009/7/6 2:00', '2009/7/6 3:00', '2009/7/6 4:00', '2009/7/6 5:00', '2009/7/6 6:00', '2009/7/6 7:00', '2009/7/6 8:00', '2009/7/6 9:00', '2009/7/6 10:00', '2009/7/6 11:00', '2009/7/6 12:00', '2009/7/6 13:00', '2009/7/6 14:00', '2009/7/6 15:00', '2009/7/6 16:00', '2009/7/6 17:00', '2009/7/6 18:00', '2009/7/6 19:00', '2009/7/6 20:00', '2009/7/6 21:00', '2009/7/6 22:00', '2009/7/6 23:00',
-                '2009/7/7 0:00', '2009/7/7 1:00', '2009/7/7 2:00', '2009/7/7 3:00', '2009/7/7 4:00', '2009/7/7 5:00', '2009/7/7 6:00', '2009/7/7 7:00', '2009/7/7 8:00', '2009/7/7 9:00', '2009/7/7 10:00', '2009/7/7 11:00', '2009/7/7 12:00', '2009/7/7 13:00', '2009/7/7 14:00', '2009/7/7 15:00', '2009/7/7 16:00', '2009/7/7 17:00', '2009/7/7 18:00', '2009/7/7 19:00', '2009/7/7 20:00', '2009/7/7 21:00', '2009/7/7 22:00', '2009/7/7 23:00',
-                '2009/7/8 0:00', '2009/7/8 1:00', '2009/7/8 2:00', '2009/7/8 3:00', '2009/7/8 4:00', '2009/7/8 5:00', '2009/7/8 6:00', '2009/7/8 7:00', '2009/7/8 8:00', '2009/7/8 9:00', '2009/7/8 10:00', '2009/7/8 11:00', '2009/7/8 12:00', '2009/7/8 13:00', '2009/7/8 14:00', '2009/7/8 15:00', '2009/7/8 16:00', '2009/7/8 17:00', '2009/7/8 18:00', '2009/7/8 19:00', '2009/7/8 20:00', '2009/7/8 21:00', '2009/7/8 22:00', '2009/7/8 23:00',
-                '2009/7/9 0:00', '2009/7/9 1:00', '2009/7/9 2:00', '2009/7/9 3:00', '2009/7/9 4:00', '2009/7/9 5:00', '2009/7/9 6:00', '2009/7/9 7:00', '2009/7/9 8:00', '2009/7/9 9:00', '2009/7/9 10:00', '2009/7/9 11:00', '2009/7/9 12:00', '2009/7/9 13:00', '2009/7/9 14:00', '2009/7/9 15:00', '2009/7/9 16:00', '2009/7/9 17:00', '2009/7/9 18:00', '2009/7/9 19:00', '2009/7/9 20:00', '2009/7/9 21:00', '2009/7/9 22:00', '2009/7/9 23:00',
-                '2009/7/10 0:00', '2009/7/10 1:00', '2009/7/10 2:00', '2009/7/10 3:00', '2009/7/10 4:00', '2009/7/10 5:00', '2009/7/10 6:00', '2009/7/10 7:00', '2009/7/10 8:00', '2009/7/10 9:00', '2009/7/10 10:00', '2009/7/10 11:00', '2009/7/10 12:00', '2009/7/10 13:00', '2009/7/10 14:00', '2009/7/10 15:00', '2009/7/10 16:00', '2009/7/10 17:00', '2009/7/10 18:00', '2009/7/10 19:00', '2009/7/10 20:00', '2009/7/10 21:00', '2009/7/10 22:00', '2009/7/10 23:00',
-                '2009/7/11 0:00', '2009/7/11 1:00', '2009/7/11 2:00', '2009/7/11 3:00', '2009/7/11 4:00', '2009/7/11 5:00', '2009/7/11 6:00', '2009/7/11 7:00', '2009/7/11 8:00', '2009/7/11 9:00', '2009/7/11 10:00', '2009/7/11 11:00', '2009/7/11 12:00', '2009/7/11 13:00', '2009/7/11 14:00', '2009/7/11 15:00', '2009/7/11 16:00', '2009/7/11 17:00', '2009/7/11 18:00', '2009/7/11 19:00', '2009/7/11 20:00', '2009/7/11 21:00', '2009/7/11 22:00', '2009/7/11 23:00',
-                '2009/7/12 0:00', '2009/7/12 1:00', '2009/7/12 2:00', '2009/7/12 3:00', '2009/7/12 4:00', '2009/7/12 5:00', '2009/7/12 6:00', '2009/7/12 7:00', '2009/7/12 8:00', '2009/7/12 9:00', '2009/7/12 10:00', '2009/7/12 11:00', '2009/7/12 12:00', '2009/7/12 13:00', '2009/7/12 14:00', '2009/7/12 15:00', '2009/7/12 16:00', '2009/7/12 17:00', '2009/7/12 18:00', '2009/7/12 19:00', '2009/7/12 20:00', '2009/7/12 21:00', '2009/7/12 22:00', '2009/7/12 23:00',
-                '2009/7/13 0:00', '2009/7/13 1:00', '2009/7/13 2:00', '2009/7/13 3:00', '2009/7/13 4:00', '2009/7/13 5:00', '2009/7/13 6:00', '2009/7/13 7:00', '2009/7/13 8:00', '2009/7/13 9:00', '2009/7/13 10:00', '2009/7/13 11:00', '2009/7/13 12:00', '2009/7/13 13:00', '2009/7/13 14:00', '2009/7/13 15:00', '2009/7/13 16:00', '2009/7/13 17:00', '2009/7/13 18:00', '2009/7/13 19:00', '2009/7/13 20:00', '2009/7/13 21:00', '2009/7/13 22:00', '2009/7/13 23:00',
-                '2009/7/14 0:00', '2009/7/14 1:00', '2009/7/14 2:00', '2009/7/14 3:00', '2009/7/14 4:00', '2009/7/14 5:00', '2009/7/14 6:00', '2009/7/14 7:00', '2009/7/14 8:00', '2009/7/14 9:00', '2009/7/14 10:00', '2009/7/14 11:00', '2009/7/14 12:00', '2009/7/14 13:00', '2009/7/14 14:00', '2009/7/14 15:00', '2009/7/14 16:00', '2009/7/14 17:00', '2009/7/14 18:00', '2009/7/14 19:00', '2009/7/14 20:00', '2009/7/14 21:00', '2009/7/14 22:00', '2009/7/14 23:00',
-                '2009/7/15 0:00', '2009/7/15 1:00', '2009/7/15 2:00', '2009/7/15 3:00', '2009/7/15 4:00', '2009/7/15 5:00', '2009/7/15 6:00', '2009/7/15 7:00', '2009/7/15 8:00', '2009/7/15 9:00', '2009/7/15 10:00', '2009/7/15 11:00', '2009/7/15 12:00', '2009/7/15 13:00', '2009/7/15 14:00', '2009/7/15 15:00', '2009/7/15 16:00', '2009/7/15 17:00', '2009/7/15 18:00', '2009/7/15 19:00', '2009/7/15 20:00', '2009/7/15 21:00', '2009/7/15 22:00', '2009/7/15 23:00',
-                '2009/7/16 0:00', '2009/7/16 1:00', '2009/7/16 2:00', '2009/7/16 3:00', '2009/7/16 4:00', '2009/7/16 5:00', '2009/7/16 6:00', '2009/7/16 7:00', '2009/7/16 8:00', '2009/7/16 9:00', '2009/7/16 10:00', '2009/7/16 11:00', '2009/7/16 12:00', '2009/7/16 13:00', '2009/7/16 14:00', '2009/7/16 15:00', '2009/7/16 16:00', '2009/7/16 17:00', '2009/7/16 18:00', '2009/7/16 19:00', '2009/7/16 20:00', '2009/7/16 21:00', '2009/7/16 22:00', '2009/7/16 23:00',
-                '2009/7/17 0:00', '2009/7/17 1:00', '2009/7/17 2:00', '2009/7/17 3:00', '2009/7/17 4:00', '2009/7/17 5:00', '2009/7/17 6:00', '2009/7/17 7:00', '2009/7/17 8:00', '2009/7/17 9:00', '2009/7/17 10:00', '2009/7/17 11:00', '2009/7/17 12:00', '2009/7/17 13:00', '2009/7/17 14:00', '2009/7/17 15:00', '2009/7/17 16:00', '2009/7/17 17:00', '2009/7/17 18:00', '2009/7/17 19:00', '2009/7/17 20:00', '2009/7/17 21:00', '2009/7/17 22:00', '2009/7/17 23:00',
-                '2009/7/18 0:00', '2009/7/18 1:00', '2009/7/18 2:00', '2009/7/18 3:00', '2009/7/18 4:00', '2009/7/18 5:00', '2009/7/18 6:00', '2009/7/18 7:00', '2009/7/18 8:00', '2009/7/18 9:00', '2009/7/18 10:00', '2009/7/18 11:00', '2009/7/18 12:00', '2009/7/18 13:00', '2009/7/18 14:00', '2009/7/18 15:00', '2009/7/18 16:00', '2009/7/18 17:00', '2009/7/18 18:00', '2009/7/18 19:00', '2009/7/18 20:00', '2009/7/18 21:00', '2009/7/18 22:00', '2009/7/18 23:00',
-                '2009/7/19 0:00', '2009/7/19 1:00', '2009/7/19 2:00', '2009/7/19 3:00', '2009/7/19 4:00', '2009/7/19 5:00', '2009/7/19 6:00', '2009/7/19 7:00', '2009/7/19 8:00', '2009/7/19 9:00', '2009/7/19 10:00', '2009/7/19 11:00', '2009/7/19 12:00', '2009/7/19 13:00', '2009/7/19 14:00', '2009/7/19 15:00', '2009/7/19 16:00', '2009/7/19 17:00', '2009/7/19 18:00', '2009/7/19 19:00', '2009/7/19 20:00', '2009/7/19 21:00', '2009/7/19 22:00', '2009/7/19 23:00',
-                '2009/7/20 0:00', '2009/7/20 1:00', '2009/7/20 2:00', '2009/7/20 3:00', '2009/7/20 4:00', '2009/7/20 5:00', '2009/7/20 6:00', '2009/7/20 7:00', '2009/7/20 8:00', '2009/7/20 9:00', '2009/7/20 10:00', '2009/7/20 11:00', '2009/7/20 12:00', '2009/7/20 13:00', '2009/7/20 14:00', '2009/7/20 15:00', '2009/7/20 16:00', '2009/7/20 17:00', '2009/7/20 18:00', '2009/7/20 19:00', '2009/7/20 20:00', '2009/7/20 21:00', '2009/7/20 22:00', '2009/7/20 23:00',
-                '2009/7/21 0:00', '2009/7/21 1:00', '2009/7/21 2:00', '2009/7/21 3:00', '2009/7/21 4:00', '2009/7/21 5:00', '2009/7/21 6:00', '2009/7/21 7:00', '2009/7/21 8:00', '2009/7/21 9:00', '2009/7/21 10:00', '2009/7/21 11:00', '2009/7/21 12:00', '2009/7/21 13:00', '2009/7/21 14:00', '2009/7/21 15:00', '2009/7/21 16:00', '2009/7/21 17:00', '2009/7/21 18:00', '2009/7/21 19:00', '2009/7/21 20:00', '2009/7/21 21:00', '2009/7/21 22:00', '2009/7/21 23:00',
-                '2009/7/22 0:00', '2009/7/22 1:00', '2009/7/22 2:00', '2009/7/22 3:00', '2009/7/22 4:00', '2009/7/22 5:00', '2009/7/22 6:00', '2009/7/22 7:00', '2009/7/22 8:00', '2009/7/22 9:00', '2009/7/22 10:00', '2009/7/22 11:00', '2009/7/22 12:00', '2009/7/22 13:00', '2009/7/22 14:00', '2009/7/22 15:00', '2009/7/22 16:00', '2009/7/22 17:00', '2009/7/22 18:00', '2009/7/22 19:00', '2009/7/22 20:00', '2009/7/22 21:00', '2009/7/22 22:00', '2009/7/22 23:00',
-                '2009/7/23 0:00', '2009/7/23 1:00', '2009/7/23 2:00', '2009/7/23 3:00', '2009/7/23 4:00', '2009/7/23 5:00', '2009/7/23 6:00', '2009/7/23 7:00', '2009/7/23 8:00', '2009/7/23 9:00', '2009/7/23 10:00', '2009/7/23 11:00', '2009/7/23 12:00', '2009/7/23 13:00', '2009/7/23 14:00', '2009/7/23 15:00', '2009/7/23 16:00', '2009/7/23 17:00', '2009/7/23 18:00', '2009/7/23 19:00', '2009/7/23 20:00', '2009/7/23 21:00', '2009/7/23 22:00', '2009/7/23 23:00',
-                '2009/7/24 0:00', '2009/7/24 1:00', '2009/7/24 2:00', '2009/7/24 3:00', '2009/7/24 4:00', '2009/7/24 5:00', '2009/7/24 6:00', '2009/7/24 7:00', '2009/7/24 8:00', '2009/7/24 9:00', '2009/7/24 10:00', '2009/7/24 11:00', '2009/7/24 12:00', '2009/7/24 13:00', '2009/7/24 14:00', '2009/7/24 15:00', '2009/7/24 16:00', '2009/7/24 17:00', '2009/7/24 18:00', '2009/7/24 19:00', '2009/7/24 20:00', '2009/7/24 21:00', '2009/7/24 22:00', '2009/7/24 23:00',
-                '2009/7/25 0:00', '2009/7/25 1:00', '2009/7/25 2:00', '2009/7/25 3:00', '2009/7/25 4:00', '2009/7/25 5:00', '2009/7/25 6:00', '2009/7/25 7:00', '2009/7/25 8:00', '2009/7/25 9:00', '2009/7/25 10:00', '2009/7/25 11:00', '2009/7/25 12:00', '2009/7/25 13:00', '2009/7/25 14:00', '2009/7/25 15:00', '2009/7/25 16:00', '2009/7/25 17:00', '2009/7/25 18:00', '2009/7/25 19:00', '2009/7/25 20:00', '2009/7/25 21:00', '2009/7/25 22:00', '2009/7/25 23:00',
-                '2009/7/26 0:00', '2009/7/26 1:00', '2009/7/26 2:00', '2009/7/26 3:00', '2009/7/26 4:00', '2009/7/26 5:00', '2009/7/26 6:00', '2009/7/26 7:00', '2009/7/26 8:00', '2009/7/26 9:00', '2009/7/26 10:00', '2009/7/26 11:00', '2009/7/26 12:00', '2009/7/26 13:00', '2009/7/26 14:00', '2009/7/26 15:00', '2009/7/26 16:00', '2009/7/26 17:00', '2009/7/26 18:00', '2009/7/26 19:00', '2009/7/26 20:00', '2009/7/26 21:00', '2009/7/26 22:00', '2009/7/26 23:00',
-                '2009/7/27 0:00', '2009/7/27 1:00', '2009/7/27 2:00', '2009/7/27 3:00', '2009/7/27 4:00', '2009/7/27 5:00', '2009/7/27 6:00', '2009/7/27 7:00', '2009/7/27 8:00', '2009/7/27 9:00', '2009/7/27 10:00', '2009/7/27 11:00', '2009/7/27 12:00', '2009/7/27 13:00', '2009/7/27 14:00', '2009/7/27 15:00', '2009/7/27 16:00', '2009/7/27 17:00', '2009/7/27 18:00', '2009/7/27 19:00', '2009/7/27 20:00', '2009/7/27 21:00', '2009/7/27 22:00', '2009/7/27 23:00',
-                '2009/7/28 0:00', '2009/7/28 1:00', '2009/7/28 2:00', '2009/7/28 3:00', '2009/7/28 4:00', '2009/7/28 5:00', '2009/7/28 6:00', '2009/7/28 7:00', '2009/7/28 8:00', '2009/7/28 9:00', '2009/7/28 10:00', '2009/7/28 11:00', '2009/7/28 12:00', '2009/7/28 13:00', '2009/7/28 14:00', '2009/7/28 15:00', '2009/7/28 16:00', '2009/7/28 17:00', '2009/7/28 18:00', '2009/7/28 19:00', '2009/7/28 20:00', '2009/7/28 21:00', '2009/7/28 22:00', '2009/7/28 23:00',
-                '2009/7/29 0:00', '2009/7/29 1:00', '2009/7/29 2:00', '2009/7/29 3:00', '2009/7/29 4:00', '2009/7/29 5:00', '2009/7/29 6:00', '2009/7/29 7:00', '2009/7/29 8:00', '2009/7/29 9:00', '2009/7/29 10:00', '2009/7/29 11:00', '2009/7/29 12:00', '2009/7/29 13:00', '2009/7/29 14:00', '2009/7/29 15:00', '2009/7/29 16:00', '2009/7/29 17:00', '2009/7/29 18:00', '2009/7/29 19:00', '2009/7/29 20:00', '2009/7/29 21:00', '2009/7/29 22:00', '2009/7/29 23:00',
-                '2009/7/30 0:00', '2009/7/30 1:00', '2009/7/30 2:00', '2009/7/30 3:00', '2009/7/30 4:00', '2009/7/30 5:00', '2009/7/30 6:00', '2009/7/30 7:00', '2009/7/30 8:00', '2009/7/30 9:00', '2009/7/30 10:00', '2009/7/30 11:00', '2009/7/30 12:00', '2009/7/30 13:00', '2009/7/30 14:00', '2009/7/30 15:00', '2009/7/30 16:00', '2009/7/30 17:00', '2009/7/30 18:00', '2009/7/30 19:00', '2009/7/30 20:00', '2009/7/30 21:00', '2009/7/30 22:00', '2009/7/30 23:00',
-                '2009/7/31 0:00', '2009/7/31 1:00', '2009/7/31 2:00', '2009/7/31 3:00', '2009/7/31 4:00', '2009/7/31 5:00', '2009/7/31 6:00', '2009/7/31 7:00', '2009/7/31 8:00', '2009/7/31 9:00', '2009/7/31 10:00', '2009/7/31 11:00', '2009/7/31 12:00', '2009/7/31 13:00', '2009/7/31 14:00', '2009/7/31 15:00', '2009/7/31 16:00', '2009/7/31 17:00', '2009/7/31 18:00', '2009/7/31 19:00', '2009/7/31 20:00', '2009/7/31 21:00', '2009/7/31 22:00', '2009/7/31 23:00',
-                '2009/8/1 0:00', '2009/8/1 1:00', '2009/8/1 2:00', '2009/8/1 3:00', '2009/8/1 4:00', '2009/8/1 5:00', '2009/8/1 6:00', '2009/8/1 7:00', '2009/8/1 8:00', '2009/8/1 9:00', '2009/8/1 10:00', '2009/8/1 11:00', '2009/8/1 12:00', '2009/8/1 13:00', '2009/8/1 14:00', '2009/8/1 15:00', '2009/8/1 16:00', '2009/8/1 17:00', '2009/8/1 18:00', '2009/8/1 19:00', '2009/8/1 20:00', '2009/8/1 21:00', '2009/8/1 22:00', '2009/8/1 23:00', '2009/8/2 0:00', '2009/8/2 1:00', '2009/8/2 2:00', '20 [...]
-                '2009/9/1 0:00', '2009/9/1 1:00', '2009/9/1 2:00', '2009/9/1 3:00', '2009/9/1 4:00', '2009/9/1 5:00', '2009/9/1 6:00', '2009/9/1 7:00', '2009/9/1 8:00', '2009/9/1 9:00', '2009/9/1 10:00', '2009/9/1 11:00', '2009/9/1 12:00', '2009/9/1 13:00', '2009/9/1 14:00', '2009/9/1 15:00', '2009/9/1 16:00', '2009/9/1 17:00', '2009/9/1 18:00', '2009/9/1 19:00', '2009/9/1 20:00', '2009/9/1 21:00', '2009/9/1 22:00', '2009/9/1 23:00', '2009/9/2 0:00', '2009/9/2 1:00', '2009/9/2 2:00', '20 [...]
-                '2009/10/1 0:00', '2009/10/1 1:00', '2009/10/1 2:00', '2009/10/1 3:00', '2009/10/1 4:00', '2009/10/1 5:00', '2009/10/1 6:00', '2009/10/1 7:00', '2009/10/1 8:00', '2009/10/1 9:00', '2009/10/1 10:00', '2009/10/1 11:00', '2009/10/1 12:00', '2009/10/1 13:00', '2009/10/1 14:00', '2009/10/1 15:00', '2009/10/1 16:00', '2009/10/1 17:00', '2009/10/1 18:00', '2009/10/1 19:00', '2009/10/1 20:00', '2009/10/1 21:00', '2009/10/1 22:00', '2009/10/1 23:00', '2009/10/2 0:00', '2009/10/2 1 [...]
-            ].map(function (str) {
-                return str.replace(' ', '\n');
-            })
-        }
-    ],
-    yAxis: [
-        {
-            name: '流量(m^3/s)',
-            type: 'value',
-            max: 500
-        },
-        {
-            name: '降雨量(mm)',
-            nameLocation: 'start',
-            max: 5,
-            type: 'value',
-            inverse: true
-        }
-    ],
-    series: [
-        {
-            name: '流量',
-            type: 'line',
-            areaStyle: {},
-            lineStyle: {
-                width: 1
-            },
-            emphasis: {
-                focus: 'series'
-            },
-            markArea: {
-                silent: true,
-                itemStyle: {
-                    opacity: 0.3
-                },
-                data: [[{
-                    xAxis: '2009/9/12\n7:00'
-                }, {
-                    xAxis: '2009/9/22\n7:00'
-                }]]
-            },
-            data: [
-                0.97,0.96,0.96,0.95,0.95,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0.94,0 [...]
-            ]
-        },
-        {
-            name: '降雨量',
-            type: 'line',
-            yAxisIndex: 1,
-            areaStyle: {},
-            lineStyle: {
-                width: 1
-            },
-            emphasis: {
-                focus: 'series'
-            },
-            markArea: {
-                silent: true,
-                itemStyle: {
-                    opacity: 0.3
-                },
-                data: [
-                    [{
-                        xAxis: '2009/9/10\n7:00'
-                    }, {
-                        xAxis: '2009/9/20\n7:00'
-                    }]
-                ]
-            },
-            data: [
-                0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.005,0.017,0.017,0.017,0.017,0.011,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.021,0.026,0.03,0.036,0.036,0.195,0.221,0.019,0.013,0.017,0.03,0.03,0.03,0.046,0.045,0.038,0.084,0.045,0.045,0.037,0.034,0.035,0.036,0.044,0.052,0.048,0.109,0.033,0.029,0.04,0.042,0.042,0.042,0.073,0.076,0.062,0.066,0.066,0.075,0.096,0.128 [...]
-            ]
-        }
-    ]
-};
diff --git a/public/data/area-simple.js b/public/data/area-simple.js
deleted file mode 100644
index 84b9682..0000000
--- a/public/data/area-simple.js
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
-title: Large scale area chart
-titleCN: 大数据量面积图
-category: 'line, dataZoom'
-difficulty: 4
-*/
-
-var base = +new Date(1968, 9, 3);
-var oneDay = 24 * 3600 * 1000;
-var date = [];
-
-var data = [Math.random() * 300];
-
-for (var i = 1; i < 20000; i++) {
-    var now = new Date(base += oneDay);
-    date.push([now.getFullYear(), now.getMonth() + 1, now.getDate()].join('/'));
-    data.push(Math.round((Math.random() - 0.5) * 20 + data[i - 1]));
-}
-
-option = {
-    tooltip: {
-        trigger: 'axis',
-        position: function (pt) {
-            return [pt[0], '10%'];
-        }
-    },
-    title: {
-        left: 'center',
-        text: '大数据量面积图',
-    },
-    toolbox: {
-        feature: {
-            dataZoom: {
-                yAxisIndex: 'none'
-            },
-            restore: {},
-            saveAsImage: {}
-        }
-    },
-    xAxis: {
-        type: 'category',
-        boundaryGap: false,
-        data: date
-    },
-    yAxis: {
-        type: 'value',
-        boundaryGap: [0, '100%']
-    },
-    dataZoom: [{
-        type: 'inside',
-        start: 0,
-        end: 10
-    }, {
-        start: 0,
-        end: 10
-    }],
-    series: [
-        {
-            name: '模拟数据',
-            type: 'line',
-            symbol: 'none',
-            sampling: 'lttb',
-            itemStyle: {
-                color: 'rgb(255, 70, 131)'
-            },
-            areaStyle: {
-                color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
-                    offset: 0,
-                    color: 'rgb(255, 158, 68)'
-                }, {
-                    offset: 1,
-                    color: 'rgb(255, 70, 131)'
-                }])
-            },
-            data: data
-        }
-    ]
-};
diff --git a/public/data/area-stack-gradient.js b/public/data/area-stack-gradient.js
deleted file mode 100644
index 320f241..0000000
--- a/public/data/area-stack-gradient.js
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
-title: Gradient Stacked area chart
-titleCN: 渐变堆叠面积图
-category: line
-difficulty: 2
-*/
-
-option = {
-    color: ['#80FFA5', '#00DDFF', '#37A2FF', '#FF0087', '#FFBF00'],
-    title: {
-        text: '渐变堆叠面积图'
-    },
-    tooltip: {
-        trigger: 'axis',
-        axisPointer: {
-            type: 'cross',
-            label: {
-                backgroundColor: '#6a7985'
-            }
-        }
-    },
-    legend: {
-        data: ['Line 1', 'Line 2', 'Line 3', 'Line 4', 'Line 5']
-    },
-    toolbox: {
-        feature: {
-            saveAsImage: {}
-        }
-    },
-    grid: {
-        left: '3%',
-        right: '4%',
-        bottom: '3%',
-        containLabel: true
-    },
-    xAxis: [
-        {
-            type: 'category',
-            boundaryGap: false,
-            data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
-        }
-    ],
-    yAxis: [
-        {
-            type: 'value'
-        }
-    ],
-    series: [
-        {
-            name: 'Line 1',
-            type: 'line',
-            stack: '总量',
-            smooth: true,
-            lineStyle: {
-                width: 0
-            },
-            showSymbol: false,
-            areaStyle: {
-                opacity: 0.8,
-                color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
-                    offset: 0,
-                    color: 'rgba(128, 255, 165)'
-                }, {
-                    offset: 1,
-                    color: 'rgba(1, 191, 236)'
-                }])
-            },
-            emphasis: {
-                focus: 'series'
-            },
-            data: [140, 232, 101, 264, 90, 340, 250]
-        },
-        {
-            name: 'Line 2',
-            type: 'line',
-            stack: '总量',
-            smooth: true,
-            lineStyle: {
-                width: 0
-            },
-            showSymbol: false,
-            areaStyle: {
-                opacity: 0.8,
-                color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
-                    offset: 0,
-                    color: 'rgba(0, 221, 255)'
-                }, {
-                    offset: 1,
-                    color: 'rgba(77, 119, 255)'
-                }])
-            },
-            emphasis: {
-                focus: 'series'
-            },
-            data: [120, 282, 111, 234, 220, 340, 310]
-        },
-        {
-            name: 'Line 3',
-            type: 'line',
-            stack: '总量',
-            smooth: true,
-            lineStyle: {
-                width: 0
-            },
-            showSymbol: false,
-            areaStyle: {
-                opacity: 0.8,
-                color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
-                    offset: 0,
-                    color: 'rgba(55, 162, 255)'
-                }, {
-                    offset: 1,
-                    color: 'rgba(116, 21, 219)'
-                }])
-            },
-            emphasis: {
-                focus: 'series'
-            },
-            data: [320, 132, 201, 334, 190, 130, 220]
-        },
-        {
-            name: 'Line 4',
-            type: 'line',
-            stack: '总量',
-            smooth: true,
-            lineStyle: {
-                width: 0
-            },
-            showSymbol: false,
-            areaStyle: {
-                opacity: 0.8,
-                color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
-                    offset: 0,
-                    color: 'rgba(255, 0, 135)'
-                }, {
-                    offset: 1,
-                    color: 'rgba(135, 0, 157)'
-                }])
-            },
-            emphasis: {
-                focus: 'series'
-            },
-            data: [220, 402, 231, 134, 190, 230, 120]
-        },
-        {
-            name: 'Line 5',
-            type: 'line',
-            stack: '总量',
-            smooth: true,
-            lineStyle: {
-                width: 0
-            },
-            showSymbol: false,
-            label: {
-                show: true,
-                position: 'top'
-            },
-            areaStyle: {
-                opacity: 0.8,
-                color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
-                    offset: 0,
-                    color: 'rgba(255, 191, 0)'
-                }, {
-                    offset: 1,
-                    color: 'rgba(224, 62, 76)'
-                }])
-            },
-            emphasis: {
-                focus: 'series'
-            },
-            data: [220, 302, 181, 234, 210, 290, 150]
-        }
-    ]
-};
\ No newline at end of file
diff --git a/public/data/area-stack.js b/public/data/area-stack.js
deleted file mode 100644
index f229254..0000000
--- a/public/data/area-stack.js
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
-title: Stacked area chart
-titleCN: 堆叠面积图
-category: line
-difficulty: 2
-*/
-
-option = {
-    title: {
-        text: '堆叠区域图'
-    },
-    tooltip: {
-        trigger: 'axis',
-        axisPointer: {
-            type: 'cross',
-            label: {
-                backgroundColor: '#6a7985'
-            }
-        }
-    },
-    legend: {
-        data: ['邮件营销', '联盟广告', '视频广告', '直接访问', '搜索引擎']
-    },
-    toolbox: {
-        feature: {
-            saveAsImage: {}
-        }
-    },
-    grid: {
-        left: '3%',
-        right: '4%',
-        bottom: '3%',
-        containLabel: true
-    },
-    xAxis: [
-        {
-            type: 'category',
-            boundaryGap: false,
-            data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
-        }
-    ],
-    yAxis: [
-        {
-            type: 'value'
-        }
-    ],
-    series: [
-        {
-            name: '邮件营销',
-            type: 'line',
-            stack: '总量',
-            areaStyle: {},
-            emphasis: {
-                focus: 'series'
-            },
-            data: [120, 132, 101, 134, 90, 230, 210]
-        },
-        {
-            name: '联盟广告',
-            type: 'line',
-            stack: '总量',
-            areaStyle: {},
-            emphasis: {
-                focus: 'series'
-            },
-            data: [220, 182, 191, 234, 290, 330, 310]
-        },
-        {
-            name: '视频广告',
-            type: 'line',
-            stack: '总量',
-            areaStyle: {},
-            emphasis: {
-                focus: 'series'
-            },
-            data: [150, 232, 201, 154, 190, 330, 410]
-        },
-        {
-            name: '直接访问',
-            type: 'line',
-            stack: '总量',
-            areaStyle: {},
-            emphasis: {
-                focus: 'series'
-            },
-            data: [320, 332, 301, 334, 390, 330, 320]
-        },
-        {
-            name: '搜索引擎',
-            type: 'line',
-            stack: '总量',
-            label: {
-                show: true,
-                position: 'top'
-            },
-            areaStyle: {},
-            emphasis: {
-                focus: 'series'
-            },
-            data: [820, 932, 901, 934, 1290, 1330, 1320]
-        }
-    ]
-};
diff --git a/public/data/area-time-axis.js b/public/data/area-time-axis.js
deleted file mode 100644
index c17d393..0000000
--- a/public/data/area-time-axis.js
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
-title: Area Chart with Time Axis
-titleCN: 时间轴折线图
-category: line
-difficulty: 5
-*/
-
-var base = +new Date(1988, 9, 3);
-var oneDay = 24 * 3600 * 1000;
-
-var data = [[base, Math.random() * 300]];
-
-for (var i = 1; i < 20000; i++) {
-    var now = new Date(base += oneDay);
-    data.push([
-        [now.getFullYear(), now.getMonth() + 1, now.getDate()].join('/'),
-        Math.round((Math.random() - 0.5) * 20 + data[i - 1][1])
-    ]);
-}
-
-option = {
-    tooltip: {
-        trigger: 'axis',
-        position: function (pt) {
-            return [pt[0], '10%'];
-        }
-    },
-    title: {
-        left: 'center',
-        text: '大数据量面积图',
-    },
-    toolbox: {
-        feature: {
-            dataZoom: {
-                yAxisIndex: 'none'
-            },
-            restore: {},
-            saveAsImage: {}
-        }
-    },
-    xAxis: {
-        type: 'time',
-        boundaryGap: false
-    },
-    yAxis: {
-        type: 'value',
-        boundaryGap: [0, '100%']
-    },
-    dataZoom: [{
-        type: 'inside',
-        start: 0,
-        end: 20
-    }, {
-        start: 0,
-        end: 20
-    }],
-    series: [
-        {
-            name: '模拟数据',
-            type: 'line',
-            smooth: true,
-            symbol: 'none',
-            areaStyle: {},
-            data: data
-        }
-    ]
-};
\ No newline at end of file
diff --git a/public/data/bar-animation-delay.js b/public/data/bar-animation-delay.js
deleted file mode 100644
index e06247a..0000000
--- a/public/data/bar-animation-delay.js
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
-title: Animation Delay
-titleCN: 柱状图动画延迟
-category: bar
-difficulty: 5
-*/
-
-var xAxisData = [];
-var data1 = [];
-var data2 = [];
-for (var i = 0; i < 100; i++) {
-    xAxisData.push('类目' + i);
-    data1.push((Math.sin(i / 5) * (i / 5 -10) + i / 6) * 5);
-    data2.push((Math.cos(i / 5) * (i / 5 -10) + i / 6) * 5);
-}
-
-option = {
-    title: {
-        text: '柱状图动画延迟'
-    },
-    legend: {
-        data: ['bar', 'bar2']
-    },
-    toolbox: {
-        // y: 'bottom',
-        feature: {
-            magicType: {
-                type: ['stack', 'tiled']
-            },
-            dataView: {},
-            saveAsImage: {
-                pixelRatio: 2
-            }
-        }
-    },
-    tooltip: {},
-    xAxis: {
-        data: xAxisData,
-        splitLine: {
-            show: false
-        }
-    },
-    yAxis: {
-    },
-    series: [{
-        name: 'bar',
-        type: 'bar',
-        data: data1,
-        emphasis: {
-            focus: 'series'
-        },
-        animationDelay: function (idx) {
-            return idx * 10;
-        }
-    }, {
-        name: 'bar2',
-        type: 'bar',
-        data: data2,
-        emphasis: {
-            focus: 'series'
-        },
-        animationDelay: function (idx) {
-            return idx * 10 + 100;
-        }
-    }],
-    animationEasing: 'elasticOut',
-    animationDelayUpdate: function (idx) {
-        return idx * 5;
-    }
-};
\ No newline at end of file
diff --git a/public/data/bar-background.js b/public/data/bar-background.js
deleted file mode 100644
index 74d9ce0..0000000
--- a/public/data/bar-background.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
-title: Bar with Background
-category: bar
-titleCN: 带背景色的柱状图
-difficulty: 0
-*/
-
-option = {
-    xAxis: {
-        type: 'category',
-        data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
-    },
-    yAxis: {
-        type: 'value'
-    },
-    series: [{
-        data: [120, 200, 150, 80, 70, 110, 130],
-        type: 'bar',
-        showBackground: true,
-        backgroundStyle: {
-            color: 'rgba(180, 180, 180, 0.2)'
-        }
-    }]
-};
diff --git a/public/data/bar-brush.js b/public/data/bar-brush.js
deleted file mode 100644
index 82f6178..0000000
--- a/public/data/bar-brush.js
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
-title: Brush Select on Column Chart
-titleCN: 柱状图框选
-category: bar
-difficulty: 4
-*/
-
-var xAxisData = [];
-var data1 = [];
-var data2 = [];
-var data3 = [];
-var data4 = [];
-
-for (var i = 0; i < 10; i++) {
-    xAxisData.push('Class' + i);
-    data1.push((Math.random() * 2).toFixed(2));
-    data2.push((Math.random() * 5).toFixed(2));
-    data3.push((Math.random() + 0.3).toFixed(2));
-    data4.push(-Math.random().toFixed(2));
-}
-
-var emphasisStyle = {
-    itemStyle: {
-        shadowBlur: 10,
-        shadowColor: 'rgba(0,0,0,0.3)'
-    }
-};
-
-option = {
-    legend: {
-        data: ['bar', 'bar2', 'bar3', 'bar4'],
-        left: '10%'
-    },
-    brush: {
-        toolbox: ['rect', 'polygon', 'lineX', 'lineY', 'keep', 'clear'],
-        xAxisIndex: 0
-    },
-    toolbox: {
-        feature: {
-            magicType: {
-                type: ['stack', 'tiled']
-            },
-            dataView: {}
-        }
-    },
-    tooltip: {},
-    xAxis: {
-        data: xAxisData,
-        name: 'X Axis',
-        axisLine: {onZero: true},
-        splitLine: {show: false},
-        splitArea: {show: false}
-    },
-    yAxis: {},
-    grid: {
-        bottom: 100
-    },
-    series: [
-        {
-            name: 'bar',
-            type: 'bar',
-            stack: 'one',
-            emphasis: emphasisStyle,
-            data: data1
-        },
-        {
-            name: 'bar2',
-            type: 'bar',
-            stack: 'one',
-            emphasis: emphasisStyle,
-            data: data2
-        },
-        {
-            name: 'bar3',
-            type: 'bar',
-            stack: 'two',
-            emphasis: emphasisStyle,
-            data: data3
-        },
-        {
-            name: 'bar4',
-            type: 'bar',
-            stack: 'two',
-            emphasis: emphasisStyle,
-            data: data4
-        }
-    ]
-};
-
-myChart.on('brushSelected', renderBrushed);
-
-function renderBrushed(params) {
-    var brushed = [];
-    var brushComponent = params.batch[0];
-
-    for (var sIdx = 0; sIdx < brushComponent.selected.length; sIdx++) {
-        var rawIndices = brushComponent.selected[sIdx].dataIndex;
-        brushed.push('[Series ' + sIdx + '] ' + rawIndices.join(', '));
-    }
-
-    myChart.setOption({
-        title: {
-            backgroundColor: '#333',
-            text: 'SELECTED DATA INDICES: \n' + brushed.join('\n'),
-            bottom: 0,
-            right:'10%',
-            width: 100,
-            textStyle: {
-                fontSize: 12,
-                color: '#fff'
-            }
-        }
-    });
-}
\ No newline at end of file
diff --git a/public/data/bar-data-color.js b/public/data/bar-data-color.js
deleted file mode 100644
index f6e42c7..0000000
--- a/public/data/bar-data-color.js
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
-title: Set Style of Single Bar.
-category: bar
-titleCN: 自定义单个柱子颜色
-difficulty: 1
-*/
-
-option = {
-    xAxis: {
-        type: 'category',
-        data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
-    },
-    yAxis: {
-        type: 'value'
-    },
-    series: [{
-        data: [120, {
-            value: 200,
-            itemStyle: {
-                color: '#a90000'
-            }
-        }, 150, 80, 70, 110, 130],
-        type: 'bar'
-    }]
-};
\ No newline at end of file
diff --git a/public/data/bar-drilldown.js b/public/data/bar-drilldown.js
deleted file mode 100644
index 8a95a53..0000000
--- a/public/data/bar-drilldown.js
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
-title: Bar Chart Drilldown Animation.
-category: bar
-titleCN: 柱状图下钻动画
-difficulty: 5
-*/
-
-option = {
-    xAxis: {
-        data: ['Animals', 'Fruits', 'Cars']
-    },
-    yAxis: {},
-    dataGroupId: '',
-    animationDurationUpdate: 500,
-    series: {
-        type: 'bar',
-        id: 'sales',
-        data: [{
-            value: 5,
-            groupId: 'animals'
-        }, {
-            value: 2,
-            groupId: 'fruits'
-        }, {
-            value: 4,
-            groupId: 'cars'
-        }],
-        universalTransition: {
-            enabled: true,
-            divideShape: 'clone'
-        }
-    }
-};
-
-var drilldownData = [{
-    dataGroupId: 'animals',
-    data: [
-        ['Cats', 4],
-        ['Dogs', 2],
-        ['Cows', 1],
-        ['Sheep', 2],
-        ['Pigs', 1]
-    ]
-}, {
-    dataGroupId: 'fruits',
-    data: [
-        ['Apples', 4],
-        ['Oranges', 2]
-    ]
-}, {
-    dataGroupId: 'cars',
-    data: [
-        ['Toyota', 4],
-        ['Opel', 2],
-        ['Volkswagen', 2]
-    ]
-}];
-
-myChart.on('click', function (event) {
-    if (event.data) {
-        var subData = drilldownData.find(function (data) {
-            return data.dataGroupId === event.data.groupId;
-        });
-        if (!subData) {
-            return;
-        }
-        myChart.setOption({
-            xAxis: {
-                data: subData.data.map(function (item) {
-                    return item[0];
-                })
-            },
-            series: {
-                type: 'bar',
-                id: 'sales',
-                dataGroupId: subData.dataGroupId,
-                data: subData.data.map(function (item) {
-                    return item[1];
-                }),
-                universalTransition: {
-                    enabled: true,
-                    divideShape: 'clone'
-                }
-            },
-            graphic: [{
-                type: 'text',
-                left: 50,
-                top: 20,
-                style: {
-                    text: 'Back',
-                    fontSize: 18
-                },
-                onclick: function () {
-                    myChart.setOption(option);
-                }
-            }]
-        });
-    }
-});
\ No newline at end of file
diff --git a/public/data/bar-gradient.js b/public/data/bar-gradient.js
deleted file mode 100644
index a98dd16..0000000
--- a/public/data/bar-gradient.js
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
-title: Clickable Column Chart with Gradient
-titleCN: 特性示例:渐变色 阴影 点击缩放
-category: bar
-difficulty: 3
-*/
-
-var dataAxis = ['点', '击', '柱', '子', '或', '者', '两', '指', '在', '触', '屏', '上', '滑', '动', '能', '够', '自', '动', '缩', '放'];
-var data = [220, 182, 191, 234, 290, 330, 310, 123, 442, 321, 90, 149, 210, 122, 133, 334, 198, 123, 125, 220];
-var yMax = 500;
-var dataShadow = [];
-
-for (var i = 0; i < data.length; i++) {
-    dataShadow.push(yMax);
-}
-
-option = {
-    title: {
-        text: '特性示例:渐变色 阴影 点击缩放',
-        subtext: 'Feature Sample: Gradient Color, Shadow, Click Zoom'
-    },
-    xAxis: {
-        data: dataAxis,
-        axisLabel: {
-            inside: true,
-            textStyle: {
-                color: '#fff'
-            }
-        },
-        axisTick: {
-            show: false
-        },
-        axisLine: {
-            show: false
-        },
-        z: 10
-    },
-    yAxis: {
-        axisLine: {
-            show: false
-        },
-        axisTick: {
-            show: false
-        },
-        axisLabel: {
-            textStyle: {
-                color: '#999'
-            }
-        }
-    },
-    dataZoom: [
-        {
-            type: 'inside'
-        }
-    ],
-    series: [
-        {
-            type: 'bar',
-            showBackground: true,
-            itemStyle: {
-                color: new echarts.graphic.LinearGradient(
-                    0, 0, 0, 1,
-                    [
-                        {offset: 0, color: '#83bff6'},
-                        {offset: 0.5, color: '#188df0'},
-                        {offset: 1, color: '#188df0'}
-                    ]
-                )
-            },
-            emphasis: {
-                itemStyle: {
-                    color: new echarts.graphic.LinearGradient(
-                        0, 0, 0, 1,
-                        [
-                            {offset: 0, color: '#2378f7'},
-                            {offset: 0.7, color: '#2378f7'},
-                            {offset: 1, color: '#83bff6'}
-                        ]
-                    )
-                }
-            },
-            data: data
-        }
-    ]
-};
-
-// Enable data zoom when user click bar.
-var zoomSize = 6;
-myChart.on('click', function (params) {
-    console.log(dataAxis[Math.max(params.dataIndex - zoomSize / 2, 0)]);
-    myChart.dispatchAction({
-        type: 'dataZoom',
-        startValue: dataAxis[Math.max(params.dataIndex - zoomSize / 2, 0)],
-        endValue: dataAxis[Math.min(params.dataIndex + zoomSize / 2, data.length - 1)]
-    });
-});
\ No newline at end of file
diff --git a/public/data/bar-histogram.js b/public/data/bar-histogram.js
deleted file mode 100644
index 9a5d405..0000000
--- a/public/data/bar-histogram.js
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
-title: Histogram with Custom Series
-category: custom
-titleCN: 直方图(自定义系列)
-difficulty: 0
-*/
-
-// See https://github.com/ecomfe/echarts-stat
-echarts.registerTransform(ecStat.transform.histogram);
-
-option = {
-    dataset: [{
-        source: [
-            [8.3, 143],
-            [8.6, 214],
-            [8.8, 251],
-            [10.5, 26],
-            [10.7, 86],
-            [10.8, 93],
-            [11.0, 176],
-            [11.0, 39],
-            [11.1, 221],
-            [11.2, 188],
-            [11.3, 57],
-            [11.4, 91],
-            [11.4, 191],
-            [11.7, 8],
-            [12.0, 196],
-            [12.9, 177],
-            [12.9, 153],
-            [13.3, 201],
-            [13.7, 199],
-            [13.8, 47],
-            [14.0, 81],
-            [14.2, 98],
-            [14.5, 121],
-            [16.0, 37],
-            [16.3, 12],
-            [17.3, 105],
-            [17.5, 168],
-            [17.9, 84],
-            [18.0, 197],
-            [18.0, 155],
-            [20.6, 125]
-        ]
-    }, {
-        transform: {
-            type: 'ecStat:histogram'
-        }
-    }, {
-        transform: {
-            type: 'ecStat:histogram',
-            // print: true,
-            config: { dimensions: [1] }
-        }
-    }],
-    tooltip: {
-    },
-    grid: [{
-        top: '50%',
-        right: '50%'
-    }, {
-        bottom: '52%',
-        right: '50%',
-    }, {
-        top: '50%',
-        left: '52%'
-    }],
-    xAxis: [{
-        scale: true,
-        gridIndex: 0
-    }, {
-        type: 'category',
-        scale: true,
-        axisTick: { show: false },
-        axisLabel: { show: false },
-        axisLine: { show: false },
-        gridIndex: 1
-    }, {
-        scale: true,
-        gridIndex: 2
-    }],
-    yAxis: [{
-        gridIndex: 0
-    }, {
-        gridIndex: 1
-    }, {
-        type: 'category',
-        axisTick: { show: false },
-        axisLabel: { show: false },
-        axisLine: { show: false },
-        gridIndex: 2
-    }],
-    series: [{
-        name: 'origianl scatter',
-        type: 'scatter',
-        xAxisIndex: 0,
-        yAxisIndex: 0,
-        encode: { tooltip: [0, 1] },
-        datasetIndex: 0
-    }, {
-        name: 'histogram',
-        type: 'bar',
-        xAxisIndex: 1,
-        yAxisIndex: 1,
-        barWidth: '99.3%',
-        label: {
-            show: true,
-            position: 'top'
-        },
-        encode: { x: 0, y: 1, itemName: 4 },
-        datasetIndex: 1
-    }, {
-        name: 'histogram',
-        type: 'bar',
-        xAxisIndex: 2,
-        yAxisIndex: 2,
-        barWidth: '99.3%',
-        label: {
-            show: true,
-            position: 'right'
-        },
-        encode: { x: 1, y: 0, itemName: 4 },
-        datasetIndex: 2
-    }]
-};
diff --git a/public/data/bar-label-rotation.js b/public/data/bar-label-rotation.js
deleted file mode 100644
index 141a643..0000000
--- a/public/data/bar-label-rotation.js
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
-title: Bar Label Rotation
-titleCN: 柱状图标签旋转
-category: bar
-difficulty: 3
-*/
-
-var posList = [
-    'left', 'right', 'top', 'bottom',
-    'inside',
-    'insideTop', 'insideLeft', 'insideRight', 'insideBottom',
-    'insideTopLeft', 'insideTopRight', 'insideBottomLeft', 'insideBottomRight'
-];
-
-app.configParameters = {
-    rotate: {
-        min: -90,
-        max: 90
-    },
-    align: {
-        options: {
-            left: 'left',
-            center: 'center',
-            right: 'right'
-        }
-    },
-    verticalAlign: {
-        options: {
-            top: 'top',
-            middle: 'middle',
-            bottom: 'bottom'
-        }
-    },
-    position: {
-        options: posList.reduce(function (map, pos) {
-            map[pos] = pos;
-            return map;
-        }, {})
-    },
-    distance: {
-        min: 0,
-        max: 100
-    }
-};
-
-app.config = {
-    rotate: 90,
-    align: 'left',
-    verticalAlign: 'middle',
-    position: 'insideBottom',
-    distance: 15,
-    onChange: function () {
-        var labelOption = {
-            normal: {
-                rotate: app.config.rotate,
-                align: app.config.align,
-                verticalAlign: app.config.verticalAlign,
-                position: app.config.position,
-                distance: app.config.distance
-            }
-        };
-        myChart.setOption({
-            series: [{
-                label: labelOption
-            }, {
-                label: labelOption
-            }, {
-                label: labelOption
-            }, {
-                label: labelOption
-            }]
-        });
-    }
-};
-
-
-var labelOption = {
-    show: true,
-    position: app.config.position,
-    distance: app.config.distance,
-    align: app.config.align,
-    verticalAlign: app.config.verticalAlign,
-    rotate: app.config.rotate,
-    formatter: '{c}  {name|{a}}',
-    fontSize: 16,
-    rich: {
-        name: {
-        }
-    }
-};
-
-option = {
-    tooltip: {
-        trigger: 'axis',
-        axisPointer: {
-            type: 'shadow'
-        }
-    },
-    legend: {
-        data: ['Forest', 'Steppe', 'Desert', 'Wetland']
-    },
-    toolbox: {
-        show: true,
-        orient: 'vertical',
-        left: 'right',
-        top: 'center',
-        feature: {
-            mark: {show: true},
-            dataView: {show: true, readOnly: false},
-            magicType: {show: true, type: ['line', 'bar', 'stack', 'tiled']},
-            restore: {show: true},
-            saveAsImage: {show: true}
-        }
-    },
-    xAxis: [
-        {
-            type: 'category',
-            axisTick: {show: false},
-            data: ['2012', '2013', '2014', '2015', '2016']
-        }
-    ],
-    yAxis: [
-        {
-            type: 'value'
-        }
-    ],
-    series: [
-        {
-            name: 'Forest',
-            type: 'bar',
-            barGap: 0,
-            label: labelOption,
-            emphasis: {
-                focus: 'series'
-            },
-            data: [320, 332, 301, 334, 390]
-        },
-        {
-            name: 'Steppe',
-            type: 'bar',
-            label: labelOption,
-            emphasis: {
-                focus: 'series'
-            },
-            data: [220, 182, 191, 234, 290]
-        },
-        {
-            name: 'Desert',
-            type: 'bar',
-            label: labelOption,
-            emphasis: {
-                focus: 'series'
-            },
-            data: [150, 232, 201, 154, 190]
-        },
-        {
-            name: 'Wetland',
-            type: 'bar',
-            label: labelOption,
-            emphasis: {
-                focus: 'series'
-            },
-            data: [98, 77, 101, 99, 40]
-        }
-    ]
-};
\ No newline at end of file
diff --git a/public/data/bar-large.js b/public/data/bar-large.js
deleted file mode 100644
index 926c0ee..0000000
--- a/public/data/bar-large.js
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
-title: Large Scale Bar Chart
-category: bar
-titleCN: 大数据量柱图
-difficulty: 5
-*/
-
-
-var dataCount = 5e5;
-var data = generateData(dataCount);
-
-var option = {
-    title: {
-        text: echarts.format.addCommas(dataCount) + ' Data',
-        left: 10
-    },
-    toolbox: {
-        feature: {
-            dataZoom: {
-                yAxisIndex: false
-            },
-            saveAsImage: {
-                pixelRatio: 2
-            }
-        }
-    },
-    tooltip: {
-        trigger: 'axis',
-        axisPointer: {
-            type: 'shadow'
-        }
-    },
-    grid: {
-        bottom: 90
-    },
-    dataZoom: [{
-        type: 'inside'
-    }, {
-        type: 'slider'
-    }],
-    xAxis: {
-        data: data.categoryData,
-        silent: false,
-        splitLine: {
-            show: false
-        },
-        splitArea: {
-            show: false
-        }
-    },
-    yAxis: {
-        splitArea: {
-            show: false
-        }
-    },
-    series: [{
-        type: 'bar',
-        data: data.valueData,
-        // Set `large` for large data amount
-        large: true
-    }]
-};
-
-function generateData(count) {
-    var baseValue = Math.random() * 1000;
-    var time = +new Date(2011, 0, 1);
-    var smallBaseValue;
-
-    function next(idx) {
-        smallBaseValue = idx % 30 === 0
-            ? Math.random() * 700
-            : (smallBaseValue + Math.random() * 500 - 250);
-        baseValue += Math.random() * 20 - 10;
-        return Math.max(
-            0,
-            Math.round(baseValue + smallBaseValue) + 3000
-        );
-    }
-
-    var categoryData = [];
-    var valueData = [];
-
-    for (var i = 0; i < count; i++) {
-        categoryData.push(echarts.format.formatTime('yyyy-MM-dd\nhh:mm:ss', time));
-        valueData.push(next(i).toFixed(2));
-        time += 1000;
-    }
-
-    return {
-        categoryData: categoryData,
-        valueData: valueData
-    };
-}
diff --git a/public/data/bar-negative.js b/public/data/bar-negative.js
deleted file mode 100644
index 8cfd1c6..0000000
--- a/public/data/bar-negative.js
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
-title: Bar Chart with Negative Value
-titleCN: 正负条形图
-category: bar
-difficulty: 4
-*/
-
-option = {
-    tooltip: {
-        trigger: 'axis',
-        axisPointer: {            // 坐标轴指示器,坐标轴触发有效
-            type: 'shadow'        // 默认为直线,可选为:'line' | 'shadow'
-        }
-    },
-    legend: {
-        data: ['利润', '支出', '收入']
-    },
-    grid: {
-        left: '3%',
-        right: '4%',
-        bottom: '3%',
-        containLabel: true
-    },
-    xAxis: [
-        {
-            type: 'value'
-        }
-    ],
-    yAxis: [
-        {
-            type: 'category',
-            axisTick: {
-                show: false
-            },
-            data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
-        }
-    ],
-    series: [
-        {
-            name: '利润',
-            type: 'bar',
-            label: {
-                show: true,
-                position: 'inside'
-            },
-            emphasis: {
-                focus: 'series'
-            },
-            data: [200, 170, 240, 244, 200, 220, 210]
-        },
-        {
-            name: '收入',
-            type: 'bar',
-            stack: '总量',
-            label: {
-                show: true
-            },
-            emphasis: {
-                focus: 'series'
-            },
-            data: [320, 302, 341, 374, 390, 450, 420]
-        },
-        {
-            name: '支出',
-            type: 'bar',
-            stack: '总量',
-            label: {
-                show: true,
-                position: 'left'
-            },
-            emphasis: {
-                focus: 'series'
-            },
-            data: [-120, -132, -101, -134, -190, -230, -210]
-        }
-    ]
-};
diff --git a/public/data/bar-negative2.js b/public/data/bar-negative2.js
deleted file mode 100644
index 64fcde9..0000000
--- a/public/data/bar-negative2.js
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
-title: Bar Chart with Negative Value
-titleCN: 交错正负轴标签
-category: bar
-difficulty: 2
-*/
-
-var labelRight = {
-    position: 'right'
-};
-option = {
-    title: {
-        text: '交错正负轴标签',
-        subtext: 'From ExcelHome',
-        sublink: 'http://e.weibo.com/1341556070/AjwF2AgQm'
-    },
-    tooltip: {
-        trigger: 'axis',
-        axisPointer: {            // 坐标轴指示器,坐标轴触发有效
-            type: 'shadow'        // 默认为直线,可选为:'line' | 'shadow'
-        }
-    },
-    grid: {
-        top: 80,
-        bottom: 30
-    },
-    xAxis: {
-        type: 'value',
-        position: 'top',
-        splitLine: {
-            lineStyle: {
-                type: 'dashed'
-            }
-        }
-    },
-    yAxis: {
-        type: 'category',
-        axisLine: {show: false},
-        axisLabel: {show: false},
-        axisTick: {show: false},
-        splitLine: {show: false},
-        data: ['ten', 'nine', 'eight', 'seven', 'six', 'five', 'four', 'three', 'two', 'one']
-    },
-    series: [
-        {
-            name: '生活费',
-            type: 'bar',
-            stack: '总量',
-            label: {
-                show: true,
-                formatter: '{b}'
-            },
-            data: [
-                {value: -0.07, label: labelRight},
-                {value: -0.09, label: labelRight},
-                0.2, 0.44,
-                {value: -0.23, label: labelRight},
-                0.08,
-                {value: -0.17, label: labelRight},
-                0.47,
-                {value: -0.36, label: labelRight},
-                0.18
-            ]
-        }
-    ]
-};
diff --git a/public/data/bar-polar-label-radial.js b/public/data/bar-polar-label-radial.js
deleted file mode 100644
index f5c9054..0000000
--- a/public/data/bar-polar-label-radial.js
+++ /dev/null
@@ -1,30 +0,0 @@
-option = {
-    title: [{
-        text: 'Radial Polar Bar Label Position (middle)'
-    }],
-    polar: {
-        radius: [30, '80%']
-    },
-    radiusAxis: {
-        max: 4,
-        startAngle: 75
-    },
-    angleAxis: {
-        type: 'category',
-        data: ['a', 'b', 'c', 'd'],
-        startAngle: 75
-    },
-    tooltip: {},
-    series: {
-        type: 'bar',
-        data: [2, 1.2, 2.4, 3.6],
-        coordinateSystem: 'polar',
-        label: {
-            show: true,
-            position: 'middle', // or 'start', 'insideStart', 'end', 'insideEnd'
-            formatter: '{b}: {c}',
-        }
-    },
-    backgroundColor: '#fff',
-    animation: 0
-};
diff --git a/public/data/bar-polar-label-tangential.js b/public/data/bar-polar-label-tangential.js
deleted file mode 100644
index db37d3b..0000000
--- a/public/data/bar-polar-label-tangential.js
+++ /dev/null
@@ -1,30 +0,0 @@
-option = {
-    title: [{
-        text: 'Radial Polar Bar Label Position (middle)'
-    }],
-    polar: {
-        radius: [30, '80%']
-    },
-    angleAxis: {
-        max: 4,
-        startAngle: 75
-    },
-    radiusAxis: {
-        type: 'category',
-        data: ['a', 'b', 'c', 'd'],
-        startAngle: 75
-    },
-    tooltip: {},
-    series: {
-        type: 'bar',
-        data: [2, 1.2, 2.4, 3.6],
-        coordinateSystem: 'polar',
-        label: {
-            show: true,
-            position: 'middle', // or 'start', 'insideStart', 'end', 'insideEnd'
-            formatter: '{b}: {c}',
-        }
-    },
-    backgroundColor: '#fff',
-    animation: 0
-};
diff --git a/public/data/bar-polar-real-estate.js b/public/data/bar-polar-real-estate.js
deleted file mode 100644
index 31fc51d..0000000
--- a/public/data/bar-polar-real-estate.js
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
-title: Bar Chart on Polar
-category: bar
-difficulty: 7
-shotWidth: 800
-*/
-
-var data = [
-    [5000, 10000, 6785.71],
-    [4000, 10000, 6825],
-    [3000, 6500, 4463.33],
-    [2500, 5600, 3793.83],
-    [2000, 4000, 3060],
-    [2000, 4000, 3222.33],
-    [2500, 4000, 3133.33],
-    [1800, 4000, 3100],
-    [2000, 3500, 2750],
-    [2000, 3000, 2500],
-    [1800, 3000, 2433.33],
-    [2000, 2700, 2375],
-    [1500, 2800, 2150],
-    [1500, 2300, 2100],
-    [1600, 3500, 2057.14],
-    [1500, 2600, 2037.5],
-    [1500, 2417.54, 1905.85],
-    [1500, 2000, 1775],
-    [1500, 1800, 1650]
-];
-var cities = ['北京', '上海', '深圳', '广州', '苏州', '杭州', '南京', '福州', '青岛', '济南', '长春', '大连', '温州', '郑州', '武汉', '成都', '东莞', '沈阳', '烟台'];
-var barHeight = 50;
-
-option = {
-    title: {
-        text: '在中国租个房子有多贵?',
-        subtext: '市中心一室月租费(数据来源:https://www.numbeo.com)'
-    },
-    legend: {
-        show: true,
-        data: ['价格范围', '均值']
-    },
-    grid: {
-        top: 100
-    },
-    angleAxis: {
-        type: 'category',
-        data: cities
-    },
-    tooltip: {
-        show: true,
-        formatter: function (params) {
-            var id = params.dataIndex;
-            return cities[id] + '<br>最低:' + data[id][0] + '<br>最高:' + data[id][1] + '<br>平均:' + data[id][2];
-        }
-    },
-    radiusAxis: {
-    },
-    polar: {
-    },
-    series: [{
-        type: 'bar',
-        itemStyle: {
-            color: 'transparent'
-        },
-        data: data.map(function (d) {
-            return d[0];
-        }),
-        coordinateSystem: 'polar',
-        stack: '最大最小值',
-        silent: true
-    }, {
-        type: 'bar',
-        data: data.map(function (d) {
-            return d[1] - d[0];
-        }),
-        coordinateSystem: 'polar',
-        name: '价格范围',
-        stack: '最大最小值'
-    }, {
-        type: 'bar',
-        itemStyle: {
-            color: 'transparent'
-        },
-        data: data.map(function (d) {
-            return d[2] - barHeight;
-        }),
-        coordinateSystem: 'polar',
-        stack: '均值',
-        silent: true,
-        z: 10
-    }, {
-        type: 'bar',
-        data: data.map(function (d) {
-            return barHeight * 2;
-        }),
-        coordinateSystem: 'polar',
-        name: '均值',
-        stack: '均值',
-        barGap: '-100%',
-        z: 10
-    }]
-};
diff --git a/public/data/bar-polar-stack-radial.js b/public/data/bar-polar-stack-radial.js
deleted file mode 100644
index f076e6f..0000000
--- a/public/data/bar-polar-stack-radial.js
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
-title: Stacked Bar Chart on Polar(Radial)
-titleCN: 极坐标系下的堆叠柱状图
-category: bar
-difficulty: 7
-*/
-
-option = {
-    angleAxis: {
-        type: 'category',
-        data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
-    },
-    radiusAxis: {
-    },
-    polar: {
-    },
-    series: [{
-        type: 'bar',
-        data: [1, 2, 3, 4, 3, 5, 1],
-        coordinateSystem: 'polar',
-        name: 'A',
-        stack: 'a',
-        emphasis: {
-            focus: 'series'
-        }
-    }, {
-        type: 'bar',
-        data: [2, 4, 6, 1, 3, 2, 1],
-        coordinateSystem: 'polar',
-        name: 'B',
-        stack: 'a',
-        emphasis: {
-            focus: 'series'
-        }
-    }, {
-        type: 'bar',
-        data: [1, 2, 3, 4, 1, 2, 5],
-        coordinateSystem: 'polar',
-        name: 'C',
-        stack: 'a',
-        emphasis: {
-            focus: 'series'
-        }
-    }],
-    legend: {
-        show: true,
-        data: ['A', 'B', 'C']
-    }
-};
diff --git a/public/data/bar-polar-stack.js b/public/data/bar-polar-stack.js
deleted file mode 100644
index 8812346..0000000
--- a/public/data/bar-polar-stack.js
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
-title: Stacked Bar Chart on Polar
-titleCN: 极坐标系下的堆叠柱状图
-category: bar
-difficulty: 7
-*/
-
-option = {
-    angleAxis: {
-    },
-    radiusAxis: {
-        type: 'category',
-        data: ['周一', '周二', '周三', '周四'],
-        z: 10
-    },
-    polar: {
-    },
-    series: [{
-        type: 'bar',
-        data: [1, 2, 3, 4],
-        coordinateSystem: 'polar',
-        name: 'A',
-        stack: 'a',
-        emphasis: {
-            focus: 'series'
-        }
-    }, {
-        type: 'bar',
-        data: [2, 4, 6, 8],
-        coordinateSystem: 'polar',
-        name: 'B',
-        stack: 'a',
-        emphasis: {
-            focus: 'series'
-        }
-    }, {
-        type: 'bar',
-        data: [1, 2, 3, 4],
-        coordinateSystem: 'polar',
-        name: 'C',
-        stack: 'a',
-        emphasis: {
-            focus: 'series'
-        }
-    }],
-    legend: {
-        show: true,
-        data: ['A', 'B', 'C']
-    }
-};
diff --git a/public/data/bar-race-country.js b/public/data/bar-race-country.js
deleted file mode 100644
index 1dcc988..0000000
--- a/public/data/bar-race-country.js
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
-title: Bar Race
-titleCN: 动态排序柱状图 - 人均收入
-category: bar
-difficulty: 6
-videoStart: 1000
-videoEnd: 6000
-*/
-
-
-var updateFrequency = 2000;
-var dimension = 0;
-
-var countryColors = {"Australia":"#00008b","Canada":"#f00","China":"#ffde00","Cuba":"#002a8f","Finland":"#003580","France":"#ed2939","Germany":"#000","Iceland":"#003897","India":"#f93","Japan":"#bc002d","North Korea":"#024fa2","South Korea":"#000","New Zealand":"#00247d","Norway":"#ef2b2d","Poland":"#dc143c","Russia":"#d52b1e","Turkey":"#e30a17","United Kingdom":"#00247d","United States":"#b22234"};
-
-$.when(
-    $.getJSON('https://cdn.jsdelivr.net/npm/emoji-flags@1.3.0/data.json'),
-    $.getJSON(ROOT_PATH + '/data/asset/data/life-expectancy-table.json')
-).done(function (res0, res1) {
-    var flags = res0[0];
-    var data = res1[0];
-    var years = [];
-    for (var i = 0; i < data.length; ++i) {
-        if (years.length === 0 || years[years.length - 1] !== data[i][4]) {
-            years.push(data[i][4]);
-        }
-    }
-
-    function getFlag(countryName) {
-        if (!countryName) {
-            return '';
-        }
-        return (flags.find(function (item) {
-            return item.name === countryName;
-        }) || {}).emoji;
-    }
-    var startIndex = 10;
-    var startYear = years[startIndex];
-
-    var option = {
-        grid: {
-            top: 10,
-            bottom: 30,
-            left: 150,
-            right: 80
-        },
-        xAxis: {
-            max: 'dataMax',
-            label: {
-                formatter: function (n) {
-                    return Math.round(n);
-                }
-            }
-        },
-        dataset: {
-            source: data.slice(1).filter(function (d) {
-                return d[4] === startYear;
-            })
-        },
-        yAxis: {
-            type: 'category',
-            inverse: true,
-            max: 10,
-            axisLabel: {
-                show: true,
-                textStyle: {
-                    fontSize: 14
-                },
-                formatter: function (value) {
-                    return value + '{flag|' + getFlag(value) + '}';
-                },
-                rich: {
-                    flag: {
-                        fontSize: 25,
-                        padding: 5
-                    }
-                }
-            },
-            animationDuration: 300,
-            animationDurationUpdate: 300
-        },
-        series: [{
-            realtimeSort: true,
-            seriesLayoutBy: 'column',
-            type: 'bar',
-            itemStyle: {
-                color: function (param) {
-                    return countryColors[param.value[3]] || '#5470c6';
-                }
-            },
-            encode: {
-                x: dimension,
-                y: 3
-            },
-            label: {
-                show: true,
-                precision: 1,
-                position: 'right',
-                valueAnimation: true,
-                fontFamily: 'monospace'
-            }
-        }],
-        // Disable init animation.
-        animationDuration: 0,
-        animationDurationUpdate: updateFrequency,
-        animationEasing: 'linear',
-        animationEasingUpdate: 'linear',
-        graphic: {
-            elements: [{
-                type: 'text',
-                right: 160,
-                bottom: 60,
-                style: {
-                    text: startYear,
-                    font: 'bolder 80px monospace',
-                    fill: 'rgba(100, 100, 100, 0.25)'
-                },
-                z: 100
-            }]
-        }
-    };
-
-    // console.log(option);
-    myChart.setOption(option);
-
-    for (var i = startIndex; i < years.length - 1; ++i) {
-        (function (i) {
-            setTimeout(function () {
-                updateYear(years[i + 1]);
-            }, (i - startIndex) * updateFrequency);
-        })(i);
-    }
-
-    function updateYear(year) {
-        var source = data.slice(1).filter(function (d) {
-            return d[4] === year;
-        });
-        option.series[0].data = source;
-        option.graphic.elements[0].style.text = year;
-        myChart.setOption(option);
-    }
-})
\ No newline at end of file
diff --git a/public/data/bar-race.js b/public/data/bar-race.js
deleted file mode 100644
index 21f76bf..0000000
--- a/public/data/bar-race.js
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
-title: Bar Race
-titleCN: 动态排序柱状图
-category: bar
-difficulty: 5
-videoStart: 1000
-videoEnd: 6000
-*/
-
-var data = [];
-for (let i = 0; i < 5; ++i) {
-    data.push(Math.round(Math.random() * 200));
-}
-
-option = {
-    xAxis: {
-        max: 'dataMax',
-    },
-    yAxis: {
-        type: 'category',
-        data: ['A', 'B', 'C', 'D', 'E'],
-        inverse: true,
-        animationDuration: 300,
-        animationDurationUpdate: 300,
-        max: 2 // only the largest 3 bars will be displayed
-    },
-    series: [{
-        realtimeSort: true,
-        name: 'X',
-        type: 'bar',
-        data: data,
-        label: {
-            show: true,
-            position: 'right',
-            valueAnimation: true
-        }
-    }],
-    legend: {
-        show: true
-    },
-    animationDuration: 0,
-    animationDurationUpdate: 3000,
-    animationEasing: 'linear',
-    animationEasingUpdate: 'linear'
-};
-
-function run () {
-    var data = option.series[0].data;
-    for (var i = 0; i < data.length; ++i) {
-        if (Math.random() > 0.9) {
-            data[i] += Math.round(Math.random() * 2000);
-        }
-        else {
-            data[i] += Math.round(Math.random() * 200);
-        }
-    }
-    myChart.setOption(option);
-}
-
-setTimeout(function() {
-    run();
-}, 0);
-setInterval(function () {
-    run();
-}, 3000);
diff --git a/public/data/bar-rich-text.js b/public/data/bar-rich-text.js
deleted file mode 100644
index d0c35d4..0000000
--- a/public/data/bar-rich-text.js
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
-title: Wheater Statistics
-category: 'bar, rich'
-titleCN: 天气统计(富文本)
-difficulty: 6
-*/
-
-
-var weatherIcons = {
-    'Sunny': ROOT_PATH + '/data/asset/img/weather/sunny_128.png',
-    'Cloudy': ROOT_PATH + '/data/asset/img/weather/cloudy_128.png',
-    'Showers': ROOT_PATH + '/data/asset/img/weather/showers_128.png'
-};
-
-var seriesLabel = {
-    show: true
-}
-
-option = {
-    title: {
-        text: 'Weather Statistics'
-    },
-    tooltip: {
-        trigger: 'axis',
-        axisPointer: {
-            type: 'shadow'
-        }
-    },
-    legend: {
-        data: ['City Alpha', 'City Beta', 'City Gamma']
-    },
-    grid: {
-        left: 100
-    },
-    toolbox: {
-        show: true,
-        feature: {
-            saveAsImage: {}
-        }
-    },
-    xAxis: {
-        type: 'value',
-        name: 'Days',
-        axisLabel: {
-            formatter: '{value}'
-        }
-    },
-    yAxis: {
-        type: 'category',
-        inverse: true,
-        data: ['Sunny', 'Cloudy', 'Showers'],
-        axisLabel: {
-            formatter: function (value) {
-                return '{' + value + '| }\n{value|' + value + '}';
-            },
-            margin: 20,
-            rich: {
-                value: {
-                    lineHeight: 30,
-                    align: 'center'
-                },
-                Sunny: {
-                    height: 40,
-                    align: 'center',
-                    backgroundColor: {
-                        image: weatherIcons.Sunny
-                    }
-                },
-                Cloudy: {
-                    height: 40,
-                    align: 'center',
-                    backgroundColor: {
-                        image: weatherIcons.Cloudy
-                    }
-                },
-                Showers: {
-                    height: 40,
-                    align: 'center',
-                    backgroundColor: {
-                        image: weatherIcons.Showers
-                    }
-                }
-            }
-        }
-    },
-    series: [
-        {
-            name: 'City Alpha',
-            type: 'bar',
-            data: [165, 170, 30],
-            label: seriesLabel,
-            markPoint: {
-                symbolSize: 1,
-                symbolOffset: [0, '50%'],
-                label: {
-                    formatter: '{a|{a}\n}{b|{b} }{c|{c}}',
-                    backgroundColor: 'rgb(242,242,242)',
-                    borderColor: '#aaa',
-                    borderWidth: 1,
-                    borderRadius: 4,
-                    padding: [4, 10],
-                    lineHeight: 26,
-                    // shadowBlur: 5,
-                    // shadowColor: '#000',
-                    // shadowOffsetX: 0,
-                    // shadowOffsetY: 1,
-                    position: 'right',
-                    distance: 20,
-                    rich: {
-                        a: {
-                            align: 'center',
-                            color: '#fff',
-                            fontSize: 18,
-                            textShadowBlur: 2,
-                            textShadowColor: '#000',
-                            textShadowOffsetX: 0,
-                            textShadowOffsetY: 1,
-                            textBorderColor: '#333',
-                            textBorderWidth: 2
-                        },
-                        b: {
-                            color: '#333'
-                        },
-                        c: {
-                            color: '#ff8811',
-                            textBorderColor: '#000',
-                            textBorderWidth: 1,
-                            fontSize: 22
-                        }
-                    }
-                },
-                data: [
-                    {type: 'max', name: 'max days: '},
-                    {type: 'min', name: 'min days: '}
-                ]
-            }
-        },
-        {
-            name: 'City Beta',
-            type: 'bar',
-            label: seriesLabel,
-            data: [150, 105, 110]
-        },
-        {
-            name: 'City Gamma',
-            type: 'bar',
-            label: seriesLabel,
-            data: [220, 82, 63]
-        }
-    ]
-};
diff --git a/public/data/bar-simple.js b/public/data/bar-simple.js
deleted file mode 100644
index 6a584f3..0000000
--- a/public/data/bar-simple.js
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
-title: Basic Bar
-category: bar
-titleCN: 基础柱状图
-difficulty: 0
-*/
-
-option = {
-    xAxis: {
-        type: 'category',
-        data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
-    },
-    yAxis: {
-        type: 'value'
-    },
-    series: [{
-        data: [120, 200, 150, 80, 70, 110, 130],
-        type: 'bar'
-    }]
-};
diff --git a/public/data/bar-stack.js b/public/data/bar-stack.js
deleted file mode 100644
index 8d87101..0000000
--- a/public/data/bar-stack.js
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
-title: Stacked Column Chart
-titleCN: 堆叠柱状图
-category: bar
-difficulty: 3
-*/
-
-option = {
-    tooltip: {
-        trigger: 'axis',
-        axisPointer: {            // 坐标轴指示器,坐标轴触发有效
-            type: 'shadow'        // 默认为直线,可选为:'line' | 'shadow'
-        }
-    },
-    legend: {
-        data: ['直接访问', '邮件营销', '联盟广告', '视频广告', '搜索引擎', '百度', '谷歌', '必应', '其他']
-    },
-    grid: {
-        left: '3%',
-        right: '4%',
-        bottom: '3%',
-        containLabel: true
-    },
-    xAxis: [
-        {
-            type: 'category',
-            data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
-        }
-    ],
-    yAxis: [
-        {
-            type: 'value'
-        }
-    ],
-    series: [
-        {
-            name: '直接访问',
-            type: 'bar',
-            emphasis: {
-                focus: 'series'
-            },
-            data: [320, 332, 301, 334, 390, 330, 320]
-        },
-        {
-            name: '邮件营销',
-            type: 'bar',
-            stack: '广告',
-            emphasis: {
-                focus: 'series'
-            },
-            data: [120, 132, 101, 134, 90, 230, 210]
-        },
-        {
-            name: '联盟广告',
-            type: 'bar',
-            stack: '广告',
-            emphasis: {
-                focus: 'series'
-            },
-            data: [220, 182, 191, 234, 290, 330, 310]
-        },
-        {
-            name: '视频广告',
-            type: 'bar',
-            stack: '广告',
-            emphasis: {
-                focus: 'series'
-            },
-            data: [150, 232, 201, 154, 190, 330, 410]
-        },
-        {
-            name: '搜索引擎',
-            type: 'bar',
-            data: [862, 1018, 964, 1026, 1679, 1600, 1570],
-            emphasis: {
-                focus: 'series'
-            },
-            markLine: {
-                lineStyle: {
-                    type: 'dashed'
-                },
-                data: [
-                    [{type: 'min'}, {type: 'max'}]
-                ]
-            }
-        },
-        {
-            name: '百度',
-            type: 'bar',
-            barWidth: 5,
-            stack: '搜索引擎',
-            emphasis: {
-                focus: 'series'
-            },
-            data: [620, 732, 701, 734, 1090, 1130, 1120]
-        },
-        {
-            name: '谷歌',
-            type: 'bar',
-            stack: '搜索引擎',
-            emphasis: {
-                focus: 'series'
-            },
-            data: [120, 132, 101, 134, 290, 230, 220]
-        },
-        {
-            name: '必应',
-            type: 'bar',
-            stack: '搜索引擎',
-            emphasis: {
-                focus: 'series'
-            },
-            data: [60, 72, 71, 74, 190, 130, 110]
-        },
-        {
-            name: '其他',
-            type: 'bar',
-            stack: '搜索引擎',
-            emphasis: {
-                focus: 'series'
-            },
-            data: [62, 82, 91, 84, 109, 110, 120]
-        }
-    ]
-};
diff --git a/public/data/bar-tick-align.js b/public/data/bar-tick-align.js
deleted file mode 100644
index 7707cd0..0000000
--- a/public/data/bar-tick-align.js
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
-title: Axis Align with Tick
-titleCN: 坐标轴刻度与标签对齐
-category: bar
-difficulty: 0
-*/
-
-option = {
-    tooltip: {
-        trigger: 'axis',
-        axisPointer: {            // 坐标轴指示器,坐标轴触发有效
-            type: 'shadow'        // 默认为直线,可选为:'line' | 'shadow'
-        }
-    },
-    grid: {
-        left: '3%',
-        right: '4%',
-        bottom: '3%',
-        containLabel: true
-    },
-    xAxis: [
-        {
-            type: 'category',
-            data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
-            axisTick: {
-                alignWithLabel: true
-            }
-        }
-    ],
-    yAxis: [
-        {
-            type: 'value'
-        }
-    ],
-    series: [
-        {
-            name: '直接访问',
-            type: 'bar',
-            barWidth: '60%',
-            data: [10, 52, 200, 334, 390, 330, 220]
-        }
-    ]
-};
diff --git a/public/data/bar-waterfall.js b/public/data/bar-waterfall.js
deleted file mode 100644
index 5e03b5c..0000000
--- a/public/data/bar-waterfall.js
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
-title: Waterfall Chart
-titleCN: 瀑布图(柱状图模拟)
-category: bar
-difficulty: 1
-*/
-
-option = {
-    title: {
-        text: '深圳月最低生活费组成(单位:元)',
-        subtext: 'From ExcelHome',
-        sublink: 'http://e.weibo.com/1341556070/AjQH99che'
-    },
-    tooltip: {
-        trigger: 'axis',
-        axisPointer: {            // 坐标轴指示器,坐标轴触发有效
-            type: 'shadow'        // 默认为直线,可选为:'line' | 'shadow'
-        },
-        formatter: function (params) {
-            var tar = params[1];
-            return tar.name + '<br/>' + tar.seriesName + ' : ' + tar.value;
-        }
-    },
-    grid: {
-        left: '3%',
-        right: '4%',
-        bottom: '3%',
-        containLabel: true
-    },
-    xAxis: {
-        type: 'category',
-        splitLine: {show: false},
-        data: ['总费用', '房租', '水电费', '交通费', '伙食费', '日用品数']
-    },
-    yAxis: {
-        type: 'value'
-    },
-    series: [
-        {
-            name: '辅助',
-            type: 'bar',
-            stack: '总量',
-            itemStyle: {
-                barBorderColor: 'rgba(0,0,0,0)',
-                color: 'rgba(0,0,0,0)'
-            },
-            emphasis: {
-                itemStyle: {
-                    barBorderColor: 'rgba(0,0,0,0)',
-                    color: 'rgba(0,0,0,0)'
-                }
-            },
-            data: [0, 1700, 1400, 1200, 300, 0]
-        },
-        {
-            name: '生活费',
-            type: 'bar',
-            stack: '总量',
-            label: {
-                show: true,
-                position: 'inside'
-            },
-            data: [2900, 1200, 300, 200, 900, 300]
-        }
-    ]
-};
diff --git a/public/data/bar-waterfall2.js b/public/data/bar-waterfall2.js
deleted file mode 100644
index d661a64..0000000
--- a/public/data/bar-waterfall2.js
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
-title: Waterfall Chart
-titleCN: 阶梯瀑布图(柱状图模拟)
-category: bar
-difficulty: 3
-*/
-
-option = {
-    title: {
-        text: '阶梯瀑布图',
-        subtext: 'From ExcelHome',
-        sublink: 'http://e.weibo.com/1341556070/Aj1J2x5a5'
-    },
-    tooltip: {
-        trigger: 'axis',
-        axisPointer: {            // 坐标轴指示器,坐标轴触发有效
-            type: 'shadow'        // 默认为直线,可选为:'line' | 'shadow'
-        },
-        formatter: function (params) {
-            var tar;
-            if (params[1].value !== '-') {
-                tar = params[1];
-            }
-            else {
-                tar = params[0];
-            }
-            return tar.name + '<br/>' + tar.seriesName + ' : ' + tar.value;
-        }
-    },
-    legend: {
-        data: ['支出', '收入']
-    },
-    grid: {
-        left: '3%',
-        right: '4%',
-        bottom: '3%',
-        containLabel: true
-    },
-    xAxis: {
-        type: 'category',
-        splitLine: {show: false},
-        data: function () {
-            var list = [];
-            for (var i = 1; i <= 11; i++) {
-                list.push('11月' + i + '日');
-            }
-            return list;
-        }()
-    },
-    yAxis: {
-        type: 'value'
-    },
-    series: [
-        {
-            name: '辅助',
-            type: 'bar',
-            stack: '总量',
-            itemStyle: {
-                barBorderColor: 'rgba(0,0,0,0)',
-                color: 'rgba(0,0,0,0)'
-            },
-            emphasis: {
-                itemStyle: {
-                    barBorderColor: 'rgba(0,0,0,0)',
-                    color: 'rgba(0,0,0,0)'
-                }
-            },
-            data: [0, 900, 1245, 1530, 1376, 1376, 1511, 1689, 1856, 1495, 1292]
-        },
-        {
-            name: '收入',
-            type: 'bar',
-            stack: '总量',
-            label: {
-                show: true,
-                position: 'top'
-            },
-            data: [900, 345, 393, '-', '-', 135, 178, 286, '-', '-', '-']
-        },
-        {
-            name: '支出',
-            type: 'bar',
-            stack: '总量',
-            label: {
-                show: true,
-                position: 'bottom'
-            },
-            data: ['-', '-', '-', 108, 154, '-', '-', '-', 119, 361, 203]
-        }
-    ]
-};
diff --git a/public/data/bar-y-category-stack.js b/public/data/bar-y-category-stack.js
deleted file mode 100644
index 9bc05e6..0000000
--- a/public/data/bar-y-category-stack.js
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
-title: Stacked Horizontal Bar
-titleCN: 堆叠条形图
-category: bar
-difficulty: 3
-*/
-option = {
-    tooltip: {
-        trigger: 'axis',
-        axisPointer: {            // Use axis to trigger tooltip
-            type: 'shadow'        // 'shadow' as default; can also be 'line' or 'shadow'
-        }
-    },
-    legend: {
-        data: ['Direct', 'Mail Ad', 'Affiliate Ad', 'Video Ad', 'Search Engine']
-    },
-    grid: {
-        left: '3%',
-        right: '4%',
-        bottom: '3%',
-        containLabel: true
-    },
-    xAxis: {
-        type: 'value'
-    },
-    yAxis: {
-        type: 'category',
-        data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
-    },
-    series: [
-        {
-            name: 'Direct',
-            type: 'bar',
-            stack: 'total',
-            label: {
-                show: true
-            },
-            emphasis: {
-                focus: 'series'
-            },
-            data: [320, 302, 301, 334, 390, 330, 320]
-        },
-        {
-            name: 'Mail Ad',
-            type: 'bar',
-            stack: 'total',
-            label: {
-                show: true
-            },
-            emphasis: {
-                focus: 'series'
-            },
-            data: [120, 132, 101, 134, 90, 230, 210]
-        },
-        {
-            name: 'Affiliate Ad',
-            type: 'bar',
-            stack: 'total',
-            label: {
-                show: true
-            },
-            emphasis: {
-                focus: 'series'
-            },
-            data: [220, 182, 191, 234, 290, 330, 310]
-        },
-        {
-            name: 'Video Ad',
-            type: 'bar',
-            stack: 'total',
-            label: {
-                show: true
-            },
-            emphasis: {
-                focus: 'series'
-            },
-            data: [150, 212, 201, 154, 190, 330, 410]
-        },
-        {
-            name: 'Search Engine',
-            type: 'bar',
-            stack: 'total',
-            label: {
-                show: true
-            },
-            emphasis: {
-                focus: 'series'
-            },
-            data: [820, 832, 901, 934, 1290, 1330, 1320]
-        }
-    ]
-};
diff --git a/public/data/bar-y-category.js b/public/data/bar-y-category.js
deleted file mode 100644
index 514c798..0000000
--- a/public/data/bar-y-category.js
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
-title: World Total Population
-category: bar
-titleCN: 世界人口总量 - 条形图
-difficulty: 2
-*/
-
-option = {
-    title: {
-        text: '世界人口总量',
-        subtext: '数据来自网络'
-    },
-    tooltip: {
-        trigger: 'axis',
-        axisPointer: {
-            type: 'shadow'
-        }
-    },
-    legend: {
-        data: ['2011年', '2012年']
-    },
-    grid: {
-        left: '3%',
-        right: '4%',
-        bottom: '3%',
-        containLabel: true
-    },
-    xAxis: {
-        type: 'value',
-        boundaryGap: [0, 0.01]
-    },
-    yAxis: {
-        type: 'category',
-        data: ['巴西', '印尼', '美国', '印度', '中国', '世界人口(万)']
-    },
-    series: [
-        {
-            name: '2011年',
-            type: 'bar',
-            data: [18203, 23489, 29034, 104970, 131744, 630230]
-        },
-        {
-            name: '2012年',
-            type: 'bar',
-            data: [19325, 23438, 31000, 121594, 134141, 681807]
-        }
-    ]
-};
diff --git a/public/data/bar1.js b/public/data/bar1.js
deleted file mode 100644
index a4fd5f4..0000000
--- a/public/data/bar1.js
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
-title: Rainfall and Evaporation
-category: bar
-titleCN: 某地区蒸发量和降水量
-difficulty: 4
-*/
-
-option = {
-    title: {
-        text: '某地区蒸发量和降水量',
-        subtext: '纯属虚构'
-    },
-    tooltip: {
-        trigger: 'axis'
-    },
-    legend: {
-        data: ['蒸发量', '降水量']
-    },
-    toolbox: {
-        show: true,
-        feature: {
-            dataView: {show: true, readOnly: false},
-            magicType: {show: true, type: ['line', 'bar']},
-            restore: {show: true},
-            saveAsImage: {show: true}
-        }
-    },
-    calculable: true,
-    xAxis: [
-        {
-            type: 'category',
-            data: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']
-        }
-    ],
-    yAxis: [
-        {
-            type: 'value'
-        }
-    ],
-    series: [
-        {
-            name: '蒸发量',
-            type: 'bar',
-            data: [2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3],
-            markPoint: {
-                data: [
-                    {type: 'max', name: '最大值'},
-                    {type: 'min', name: '最小值'}
-                ]
-            },
-            markLine: {
-                data: [
-                    {type: 'average', name: '平均值'}
-                ]
-            }
-        },
-        {
-            name: '降水量',
-            type: 'bar',
-            data: [2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3],
-            markPoint: {
-                data: [
-                    {name: '年最高', value: 182.2, xAxis: 7, yAxis: 183},
-                    {name: '年最低', value: 2.3, xAxis: 11, yAxis: 3}
-                ]
-            },
-            markLine: {
-                data: [
-                    {type: 'average', name: '平均值'}
-                ]
-            }
-        }
-    ]
-};
diff --git a/public/data/boxplot-light-velocity.js b/public/data/boxplot-light-velocity.js
deleted file mode 100644
index e475ca3..0000000
--- a/public/data/boxplot-light-velocity.js
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
-title: Boxplot Light Velocity
-category: boxplot
-titleCN: 基础盒须图
-*/
-
-option = {
-    title: [
-        {
-            text: 'Michelson-Morley Experiment',
-            left: 'center'
-        },
-        {
-            text: 'upper: Q3 + 1.5 * IQR \nlower: Q1 - 1.5 * IQR',
-            borderColor: '#999',
-            borderWidth: 1,
-            textStyle: {
-                fontWeight: 'normal',
-                fontSize: 14,
-                lineHeight: 20
-            },
-            left: '10%',
-            top: '90%'
-        }
-    ],
-    dataset: [{
-        source: [
-            [850, 740, 900, 1070, 930, 850, 950, 980, 980, 880, 1000, 980, 930, 650, 760, 810, 1000, 1000, 960, 960],
-            [960, 940, 960, 940, 880, 800, 850, 880, 900, 840, 830, 790, 810, 880, 880, 830, 800, 790, 760, 800],
-            [880, 880, 880, 860, 720, 720, 620, 860, 970, 950, 880, 910, 850, 870, 840, 840, 850, 840, 840, 840],
-            [890, 810, 810, 820, 800, 770, 760, 740, 750, 760, 910, 920, 890, 860, 880, 720, 840, 850, 850, 780],
-            [890, 840, 780, 810, 760, 810, 790, 810, 820, 850, 870, 870, 810, 740, 810, 940, 950, 800, 810, 870]
-        ]
-    }, {
-        transform: {
-            type: 'boxplot',
-            config: { itemNameFormatter: 'expr {value}' }
-        }
-    }, {
-        fromDatasetIndex: 1,
-        fromTransformResult: 1
-    }],
-    tooltip: {
-        trigger: 'item',
-        axisPointer: {
-            type: 'shadow'
-        }
-    },
-    grid: {
-        left: '10%',
-        right: '10%',
-        bottom: '15%'
-    },
-    xAxis: {
-        type: 'category',
-        boundaryGap: true,
-        nameGap: 30,
-        splitArea: {
-            show: false
-        },
-        splitLine: {
-            show: false
-        }
-    },
-    yAxis: {
-        type: 'value',
-        name: 'km/s minus 299,000',
-        splitArea: {
-            show: true
-        }
-    },
-    series: [
-        {
-            name: 'boxplot',
-            type: 'boxplot',
-            datasetIndex: 1
-        },
-        {
-            name: 'outlier',
-            type: 'scatter',
-            datasetIndex: 2
-        }
-    ]
-};
\ No newline at end of file
diff --git a/public/data/boxplot-light-velocity2.js b/public/data/boxplot-light-velocity2.js
deleted file mode 100644
index a4af14d..0000000
--- a/public/data/boxplot-light-velocity2.js
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
-title: Boxplot Light Velocity2
-category: boxplot
-titleCN: 垂直方向盒须图
-*/
-
-option = {
-    title: [
-        {
-            text: 'Michelson-Morley Experiment',
-            left: 'center'
-        },
-        {
-            text: 'upper: Q3 + 1.5 * IRQ \nlower: Q1 - 1.5 * IRQ',
-            borderColor: '#999',
-            borderWidth: 1,
-            textStyle: {
-                fontSize: 14
-            },
-            left: '10%',
-            top: '90%'
-        }
-    ],
-    dataset: [{
-        source: [
-            [850, 740, 900, 1070, 930, 850, 950, 980, 980, 880, 1000, 980, 930, 650, 760, 810, 1000, 1000, 960, 960],
-            [960, 940, 960, 940, 880, 800, 850, 880, 900, 840, 830, 790, 810, 880, 880, 830, 800, 790, 760, 800],
-            [880, 880, 880, 860, 720, 720, 620, 860, 970, 950, 880, 910, 850, 870, 840, 840, 850, 840, 840, 840],
-            [890, 810, 810, 820, 800, 770, 760, 740, 750, 760, 910, 920, 890, 860, 880, 720, 840, 850, 850, 780],
-            [890, 840, 780, 810, 760, 810, 790, 810, 820, 850, 870, 870, 810, 740, 810, 940, 950, 800, 810, 870]
-        ]
-    }, {
-        transform: {
-            type: 'boxplot',
-            config: {
-                itemNameFormatter: function (params) {
-                    return 'expr ' + params.value;
-                }
-            }
-        }
-    }, {
-        fromDatasetIndex: 1,
-        fromTransformResult: 1
-    }],
-    tooltip: {
-        trigger: 'item',
-        axisPointer: {
-            type: 'shadow'
-        }
-    },
-    grid: {
-        left: '10%',
-        right: '10%',
-        bottom: '15%'
-    },
-    yAxis: {
-        type: 'category',
-        boundaryGap: true,
-        nameGap: 30,
-        splitArea: {
-            show: false
-        },
-        splitLine: {
-            show: false
-        }
-    },
-    xAxis: {
-        type: 'value',
-        name: 'km/s minus 299,000',
-        splitArea: {
-            show: true
-        }
-    },
-    series: [
-        {
-            name: 'boxplot',
-            type: 'boxplot',
-            datasetIndex: 1
-        },
-        {
-            name: 'outlier',
-            type: 'scatter',
-            encode: { x: 1, y: 0 },
-            datasetIndex: 2
-        }
-    ]
-};
\ No newline at end of file
diff --git a/public/data/boxplot-multi.js b/public/data/boxplot-multi.js
deleted file mode 100644
index 44e6177..0000000
--- a/public/data/boxplot-multi.js
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
-title: Multiple Categories
-category: boxplot
-titleCN: 多系列盒须图
-*/
-
-
-// Generate data.
-function makeData() {
-    var data = [];
-    for (var i = 0; i < 18; i++) {
-        var cate = [];
-        for (var j = 0; j < 100; j++) {
-            cate.push(Math.random() * 200);
-        }
-        data.push(cate);
-    }
-    return data;
-}
-var data0 = makeData();
-var data1 = makeData();
-var data2 = makeData();
-
-
-option = {
-    title: {
-        text: 'Multiple Categories',
-        left: 'center'
-    },
-    dataset: [{
-        source: data0
-    }, {
-        source: data1
-    }, {
-        source: data2
-    }, {
-        fromDatasetIndex: 0,
-        transform: { type: 'boxplot' }
-    }, {
-        fromDatasetIndex: 1,
-        transform: { type: 'boxplot' }
-    }, {
-        fromDatasetIndex: 2,
-        transform: { type: 'boxplot' }
-    }],
-    legend: {
-        top: '10%'
-    },
-    tooltip: {
-        trigger: 'item',
-        axisPointer: {
-            type: 'shadow'
-        }
-    },
-    grid: {
-        left: '10%',
-        top: '20%',
-        right: '10%',
-        bottom: '15%'
-    },
-    xAxis: {
-        type: 'category',
-        boundaryGap: true,
-        nameGap: 30,
-        splitArea: {
-            show: true
-        },
-        splitLine: {
-            show: false
-        }
-    },
-    yAxis: {
-        type: 'value',
-        name: 'Value',
-        min: -400,
-        max: 600,
-        splitArea: {
-            show: false
-        }
-    },
-    dataZoom: [{
-        type: 'inside',
-        start: 0,
-        end: 20
-    }, {
-        show: true,
-        type: 'slider',
-        top: '90%',
-        xAxisIndex: [0],
-        start: 0,
-        end: 20
-    }],
-    series: [{
-        name: 'category0',
-        type: 'boxplot',
-        datasetIndex: 3
-    }, {
-        name: 'category1',
-        type: 'boxplot',
-        datasetIndex: 4
-    }, {
-        name: 'category2',
-        type: 'boxplot',
-        datasetIndex: 5
-    }]
-};
diff --git a/public/data/bubble-gradient.js b/public/data/bubble-gradient.js
deleted file mode 100644
index 9ab5549..0000000
--- a/public/data/bubble-gradient.js
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
-title: Bubble Chart
-category: scatter
-titleCN: 气泡图
-difficulty: 6
-*/
-
-var data = [
-    [[28604,77,17096869,'Australia',1990],[31163,77.4,27662440,'Canada',1990],[1516,68,1154605773,'China',1990],[13670,74.7,10582082,'Cuba',1990],[28599,75,4986705,'Finland',1990],[29476,77.1,56943299,'France',1990],[31476,75.4,78958237,'Germany',1990],[28666,78.1,254830,'Iceland',1990],[1777,57.7,870601776,'India',1990],[29550,79.1,122249285,'Japan',1990],[2076,67.9,20194354,'North Korea',1990],[12087,72,42972254,'South Korea',1990],[24021,75.4,3397534,'New Zealand',1990],[43296,76.8,42 [...]
-    [[44056,81.8,23968973,'Australia',2015],[43294,81.7,35939927,'Canada',2015],[13334,76.9,1376048943,'China',2015],[21291,78.5,11389562,'Cuba',2015],[38923,80.8,5503457,'Finland',2015],[37599,81.9,64395345,'France',2015],[44053,81.1,80688545,'Germany',2015],[42182,82.8,329425,'Iceland',2015],[5903,66.8,1311050527,'India',2015],[36162,83.5,126573481,'Japan',2015],[1390,71.4,25155317,'North Korea',2015],[34644,80.7,50293439,'South Korea',2015],[34186,80.6,4528526,'New Zealand',2015],[643 [...]
-];
-
-option = {
-    backgroundColor: new echarts.graphic.RadialGradient(0.3, 0.3, 0.8, [{
-        offset: 0,
-        color: '#f7f8fa'
-    }, {
-        offset: 1,
-        color: '#cdd0d5'
-    }]),
-    title: {
-        text: '1990 与 2015 年各国家人均寿命与 GDP' ,
-        left: '5%',
-        top: '3%'
-    },
-    legend: {
-        right: '10%',
-        top: '3%',
-        data: ['1990', '2015']
-    },
-    grid: {
-        left: '8%',
-        top: '10%'
-    },
-    xAxis: {
-        splitLine: {
-            lineStyle: {
-                type: 'dashed'
-            }
-        }
-    },
-    yAxis: {
-        splitLine: {
-            lineStyle: {
-                type: 'dashed'
-            }
-        },
-        scale: true
-    },
-    series: [{
-        name: '1990',
-        data: data[0],
-        type: 'scatter',
-        symbolSize: function (data) {
-            return Math.sqrt(data[2]) / 5e2;
-        },
-        emphasis: {
-            focus: 'series',
-            label: {
-                show: true,
-                formatter: function (param) {
-                    return param.data[3];
-                },
-                position: 'top'
-            }
-        },
-        itemStyle: {
-            shadowBlur: 10,
-            shadowColor: 'rgba(120, 36, 50, 0.5)',
-            shadowOffsetY: 5,
-            color: new echarts.graphic.RadialGradient(0.4, 0.3, 1, [{
-                offset: 0,
-                color: 'rgb(251, 118, 123)'
-            }, {
-                offset: 1,
-                color: 'rgb(204, 46, 72)'
-            }])
-        }
-    }, {
-        name: '2015',
-        data: data[1],
-        type: 'scatter',
-        symbolSize: function (data) {
-            return Math.sqrt(data[2]) / 5e2;
-        },
-        emphasis: {
-            focus: 'series',
-            label: {
-                show: true,
-                formatter: function (param) {
-                    return param.data[3];
-                },
-                position: 'top'
-            }
-        },
-        itemStyle: {
-            shadowBlur: 10,
-            shadowColor: 'rgba(25, 100, 150, 0.5)',
-            shadowOffsetY: 5,
-            color: new echarts.graphic.RadialGradient(0.4, 0.3, 1, [{
-                offset: 0,
-                color: 'rgb(129, 227, 238)'
-            }, {
-                offset: 1,
-                color: 'rgb(25, 183, 207)'
-            }])
-        }
-    }]
-};
\ No newline at end of file
diff --git a/public/data/calendar-charts.js b/public/data/calendar-charts.js
deleted file mode 100644
index 9b0cbd2..0000000
--- a/public/data/calendar-charts.js
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
-title: Calendar Charts
-category: 'calendar, scatter'
-titleCN: 日历图
-shotWidth: 1000
-difficulty: 11
-*/
-
-function getVirtulData(year) {
-    year = year || '2017';
-    var date = +echarts.number.parseDate(year + '-01-01');
-    var end = +echarts.number.parseDate((+year + 1) + '-01-01');
-    var dayTime = 3600 * 24 * 1000;
-    var data = [];
-    for (var time = date; time < end; time += dayTime) {
-        data.push([
-            echarts.format.formatTime('yyyy-MM-dd', time),
-            Math.floor(Math.random() * 1000)
-        ]);
-    }
-    console.log(data[data.length - 1]);
-    return data;
-}
-
-
-
-var graphData = [
-    [
-       '2017-02-01',
-        260
-    ],
-    [
-        '2017-02-04',
-        200
-    ],
-    [
-        '2017-02-09',
-        279
-    ],
-    [
-        '2017-02-13',
-        847
-    ],
-    [
-        '2017-02-18',
-        241
-    ],
-    [
-        '2017-02-23',
-        411
-    ],
-    [
-        '2017-02-27',
-        985
-    ]
-];
-
-var links = graphData.map(function (item, idx) {
-    return {
-        source: idx,
-        target: idx + 1
-    };
-});
-links.pop();
-
-option = {
-    tooltip: {
-        position: 'top'
-    },
-
-    visualMap: [{
-        min: 0,
-        max: 1000,
-        calculable: true,
-        seriesIndex: [2, 3, 4],
-        orient: 'horizontal',
-        left: '55%',
-        bottom: 20
-    }, {
-        min: 0,
-        max: 1000,
-        inRange: {
-            color: ['grey'],
-            opacity: [0, 0.3]
-        },
-        controller: {
-            inRange: {
-                opacity: [0.3, 0.6]
-            },
-            outOfRange: {
-                color: '#ccc'
-            }
-        },
-        seriesIndex: [1],
-        orient: 'horizontal',
-        left: '10%',
-        bottom: 20
-    }],
-
-    calendar: [{
-        orient: 'vertical',
-        yearLabel: {
-            margin: 40
-        },
-        monthLabel: {
-            nameMap: 'cn',
-            margin: 20
-        },
-        dayLabel: {
-            firstDay: 1,
-            nameMap: 'cn'
-        },
-        cellSize: 40,
-        range: '2017-02'
-    },
-    {
-        orient: 'vertical',
-        yearLabel: {
-            margin: 40
-        },
-        monthLabel: {
-            margin: 20
-        },
-        cellSize: 40,
-        left: 460,
-        range: '2017-01'
-    },
-    {
-        orient: 'vertical',
-        yearLabel: {
-            margin: 40
-        },
-        monthLabel: {
-            margin: 20
-        },
-        cellSize: 40,
-        top: 350,
-        range: '2017-03'
-    },
-    {
-        orient: 'vertical',
-        yearLabel: {
-            margin: 40
-        },
-        dayLabel: {
-            firstDay: 1,
-            nameMap: ['周日', '周一', '周二', '周三', '周四', '周五', '周六']
-        },
-        monthLabel: {
-            nameMap: 'cn',
-            margin: 20
-        },
-        cellSize: 40,
-        top: 350,
-        left: 460,
-        range: '2017-04'
-    }],
-
-    series: [{
-        type: 'graph',
-        edgeSymbol: ['none', 'arrow'],
-        coordinateSystem: 'calendar',
-        links: links,
-        symbolSize: 10,
-        calendarIndex: 0,
-        data: graphData
-    }, {
-        type: 'heatmap',
-        coordinateSystem: 'calendar',
-        data: getVirtulData(2017)
-    }, {
-        type: 'effectScatter',
-        coordinateSystem: 'calendar',
-        calendarIndex: 1,
-        symbolSize: function (val) {
-            return val[1] / 40;
-        },
-        data: getVirtulData(2017)
-    }, {
-        type: 'scatter',
-        coordinateSystem: 'calendar',
-        calendarIndex: 2,
-        symbolSize: function (val) {
-            return val[1] / 60;
-        },
-        data: getVirtulData(2017)
-    }, {
-        type: 'heatmap',
-        coordinateSystem: 'calendar',
-        calendarIndex: 3,
-        data: getVirtulData(2017)
-    }]
-};
diff --git a/public/data/calendar-effectscatter.js b/public/data/calendar-effectscatter.js
deleted file mode 100644
index df84192..0000000
--- a/public/data/calendar-effectscatter.js
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
-title: Calendar Effectscatter
-category: calendar
-titleCN: 热力特效散点图
-difficulty:3
-*/
-
-function getVirtulData(year) {
-    year = year || '2017';
-    var date = +echarts.number.parseDate(year + '-01-01');
-    var end = +echarts.number.parseDate((+year + 1) + '-01-01');
-    var dayTime = 3600 * 24 * 1000;
-    var data = [];
-    for (var time = date; time < end; time += dayTime) {
-        data.push([
-            echarts.format.formatTime('yyyy-MM-dd', time),
-            Math.floor(Math.random() * 10000)
-        ]);
-    }
-    return data;
-}
-
-var data = getVirtulData(2016);
-
-option = {
-    backgroundColor: '#404a59',
-
-    title: {
-        top: 30,
-        text: '2016年某人每天的步数',
-        subtext: '数据纯属虚构',
-        left: 'center',
-        textStyle: {
-            color: '#fff'
-        }
-    },
-    tooltip: {
-        trigger: 'item'
-    },
-    legend: {
-        top: '30',
-        left: '100',
-        data: ['步数', 'Top 12'],
-        textStyle: {
-            color: '#fff'
-        }
-    },
-    calendar: [{
-        top: 100,
-        left: 'center',
-        range: ['2016-01-01', '2016-06-30'],
-        splitLine: {
-            show: true,
-            lineStyle: {
-                color: '#000',
-                width: 4,
-                type: 'solid'
-            }
-        },
-        yearLabel: {
-            formatter: '{start}  1st',
-            textStyle: {
-                color: '#fff'
-            }
-        },
-        itemStyle: {
-            color: '#323c48',
-            borderWidth: 1,
-            borderColor: '#111'
-        }
-    }, {
-        top: 340,
-        left: 'center',
-        range: ['2016-07-01', '2016-12-31'],
-        splitLine: {
-            show: true,
-            lineStyle: {
-                color: '#000',
-                width: 4,
-                type: 'solid'
-            }
-        },
-        yearLabel: {
-            formatter: '{start}  2nd',
-            textStyle: {
-                color: '#fff'
-            }
-        },
-        itemStyle: {
-            color: '#323c48',
-            borderWidth: 1,
-            borderColor: '#111'
-        }
-    }],
-    series: [
-        {
-            name: '步数',
-            type: 'scatter',
-            coordinateSystem: 'calendar',
-            data: data,
-            symbolSize: function (val) {
-                return val[1] / 500;
-            },
-            itemStyle: {
-                color: '#ddb926'
-            }
-        },
-        {
-            name: '步数',
-            type: 'scatter',
-            coordinateSystem: 'calendar',
-            calendarIndex: 1,
-            data: data,
-            symbolSize: function (val) {
-                return val[1] / 500;
-            },
-            itemStyle: {
-                color: '#ddb926'
-            }
-        },
-        {
-            name: 'Top 12',
-            type: 'effectScatter',
-            coordinateSystem: 'calendar',
-            calendarIndex: 1,
-            data: data.sort(function (a, b) {
-                return b[1] - a[1];
-            }).slice(0, 12),
-            symbolSize: function (val) {
-                return val[1] / 500;
-            },
-            showEffectOn: 'render',
-            rippleEffect: {
-                brushType: 'stroke'
-            },
-            hoverAnimation: true,
-            itemStyle: {
-                color: '#f4e925',
-                shadowBlur: 10,
-                shadowColor: '#333'
-            },
-            zlevel: 1
-        },
-        {
-            name: 'Top 12',
-            type: 'effectScatter',
-            coordinateSystem: 'calendar',
-            data: data.sort(function (a, b) {
-                return b[1] - a[1];
-            }).slice(0, 12),
-            symbolSize: function (val) {
-                return val[1] / 500;
-            },
-            showEffectOn: 'render',
-            rippleEffect: {
-                brushType: 'stroke'
-            },
-            hoverAnimation: true,
-            itemStyle: {
-                color: '#f4e925',
-                shadowBlur: 10,
-                shadowColor: '#333'
-            },
-            zlevel: 1
-        }
-    ]
-};
diff --git a/public/data/calendar-graph.js b/public/data/calendar-graph.js
deleted file mode 100644
index 7dd07ab..0000000
--- a/public/data/calendar-graph.js
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
-title: Calendar Graph
-category: 'calendar, graph'
-titleCN: 日历关系图
-difficulty: 4
-*/
-
-var graphData = [
-    [
-       '2017-02-01',
-        260
-    ],
-    [
-        '2017-02-04',
-        200
-    ],
-    [
-        '2017-02-09',
-        279
-    ],
-    [
-        '2017-02-13',
-        847
-    ],
-    [
-        '2017-02-18',
-        241
-    ],
-    [
-        '2017-02-23',
-        411
-    ],
-    [
-        '2017-03-14',
-        985
-    ]
-];
-
-var links = graphData.map(function (item, idx) {
-    return {
-        source: idx,
-        target: idx + 1
-    };
-});
-links.pop();
-
-function getVirtulData(year) {
-    year = year || '2017';
-    var date = +echarts.number.parseDate(year + '-01-01');
-    var end = +echarts.number.parseDate((+year + 1) + '-01-01');
-    var dayTime = 3600 * 24 * 1000;
-    var data = [];
-    for (var time = date; time < end; time += dayTime) {
-        data.push([
-            echarts.format.formatTime('yyyy-MM-dd', time),
-            Math.floor(Math.random() * 1000)
-        ]);
-    }
-    return data;
-}
-
-
-option = {
-    tooltip: {},
-    calendar: {
-        top: 'middle',
-        left: 'center',
-        orient: 'vertical',
-        cellSize: 40,
-        yearLabel: {
-            margin: 50,
-            textStyle: {
-                fontSize: 30
-            }
-        },
-        dayLabel: {
-            firstDay: 1,
-            nameMap: 'cn'
-        },
-        monthLabel: {
-            nameMap: 'cn',
-            margin: 15,
-            fontSize: 20,
-            color: '#999'
-        },
-        range: ['2017-02', '2017-03-31']
-    },
-    visualMap: {
-        min: 0,
-        max: 1000,
-        type: 'piecewise',
-        left: 'center',
-        bottom: 20,
-        inRange: {
-            color: ['#5291FF', '#C7DBFF']
-        },
-        seriesIndex: [1],
-        orient: 'horizontal'
-    },
-    series: [{
-        type: 'graph',
-        edgeSymbol: ['none', 'arrow'],
-        coordinateSystem: 'calendar',
-        links: links,
-        symbolSize: 15,
-        calendarIndex: 0,
-        itemStyle: {
-            color: 'yellow',
-            shadowBlur: 9,
-            shadowOffsetX: 1.5,
-            shadowOffsetY: 3,
-            shadowColor: '#555'
-        },
-        lineStyle: {
-            color: '#D10E00',
-            width: 1,
-            opacity: 1
-        },
-        data: graphData,
-        z: 20
-    }, {
-        type: 'heatmap',
-        coordinateSystem: 'calendar',
-        data: getVirtulData(2017)
-    }]
-};
diff --git a/public/data/calendar-heatmap.js b/public/data/calendar-heatmap.js
deleted file mode 100644
index 4540da6..0000000
--- a/public/data/calendar-heatmap.js
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
-title: Calendar Heatmap
-category: 'calendar, heatmap'
-titleCN: 日历热力图
-difficulty: 1
-*/
-
-function getVirtulData(year) {
-    year = year || '2017';
-    var date = +echarts.number.parseDate(year + '-01-01');
-    var end = +echarts.number.parseDate((+year + 1) + '-01-01');
-    var dayTime = 3600 * 24 * 1000;
-    var data = [];
-    for (var time = date; time < end; time += dayTime) {
-        data.push([
-            echarts.format.formatTime('yyyy-MM-dd', time),
-            Math.floor(Math.random() * 10000)
-        ]);
-    }
-    return data;
-}
-
-option = {
-    title: {
-        top: 30,
-        left: 'center',
-        text: '2016年某人每天的步数'
-    },
-    tooltip: {},
-    visualMap: {
-        min: 0,
-        max: 10000,
-        type: 'piecewise',
-        orient: 'horizontal',
-        left: 'center',
-        top: 65
-    },
-    calendar: {
-        top: 120,
-        left: 30,
-        right: 30,
-        cellSize: ['auto', 13],
-        range: '2016',
-        itemStyle: {
-            borderWidth: 0.5
-        },
-        yearLabel: {show: false}
-    },
-    series: {
-        type: 'heatmap',
-        coordinateSystem: 'calendar',
-        data: getVirtulData(2016)
-    }
-};
diff --git a/public/data/calendar-horizontal.js b/public/data/calendar-horizontal.js
deleted file mode 100644
index c9d9015..0000000
--- a/public/data/calendar-horizontal.js
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
-title: Calendar Heatmap Horizontal
-category: calendar
-titleCN: 横向日历图
-shotWidth: 900
-difficulty: 2
-*/
-
-function getVirtulData(year) {
-    year = year || '2017';
-    var date = +echarts.number.parseDate(year + '-01-01');
-    var end = +echarts.number.parseDate((+year + 1) + '-01-01');
-    var dayTime = 3600 * 24 * 1000;
-    var data = [];
-    for (var time = date; time < end; time += dayTime) {
-        data.push([
-            echarts.format.formatTime('yyyy-MM-dd', time),
-            Math.floor(Math.random() * 1000)
-        ]);
-    }
-    return data;
-}
-
-
-
-option = {
-    tooltip: {
-        position: 'top'
-    },
-    visualMap: {
-        min: 0,
-        max: 1000,
-        calculable: true,
-        orient: 'horizontal',
-        left: 'center',
-        top: 'top'
-    },
-
-    calendar: [{
-        range: '2017',
-        cellSize: ['auto', 20]
-    },
-    {
-        top: 260,
-        range: '2016',
-        cellSize: ['auto', 20]
-    },
-    {
-        top: 450,
-        range: '2015',
-        cellSize: ['auto', 20],
-        right: 5
-    }],
-
-    series: [{
-        type: 'heatmap',
-        coordinateSystem: 'calendar',
-        calendarIndex: 0,
-        data: getVirtulData(2017)
-    }, {
-        type: 'heatmap',
-        coordinateSystem: 'calendar',
-        calendarIndex: 1,
-        data: getVirtulData(2016)
-    }, {
-        type: 'heatmap',
-        coordinateSystem: 'calendar',
-        calendarIndex: 2,
-        data: getVirtulData(2015)
-    }]
-
-};
diff --git a/public/data/calendar-lunar.js b/public/data/calendar-lunar.js
deleted file mode 100644
index 16856cd..0000000
--- a/public/data/calendar-lunar.js
+++ /dev/null
@@ -1,468 +0,0 @@
-/*
-title: Calendar Lunar
-category: calendar
-titleCN: 农历日历图
-difficulty: 4
-*/
-
-var dateList = [
-    ['2017-1-1', '初四'],
-    ['2017-1-2', '初五'],
-    ['2017-1-3', '初六'],
-    ['2017-1-4', '初七'],
-    ['2017-1-5', '初八', '小寒'],
-    ['2017-1-6', '初九'],
-    ['2017-1-7', '初十'],
-    ['2017-1-8', '十一'],
-    ['2017-1-9', '十二'],
-    ['2017-1-10', '十三'],
-    ['2017-1-11', '十四'],
-    ['2017-1-12', '十五'],
-    ['2017-1-13', '十六'],
-    ['2017-1-14', '十七'],
-    ['2017-1-15', '十八'],
-    ['2017-1-16', '十九'],
-    ['2017-1-17', '二十'],
-    ['2017-1-18', '廿一'],
-    ['2017-1-19', '廿二'],
-    ['2017-1-20', '廿三', '大寒'],
-    ['2017-1-21', '廿四'],
-    ['2017-1-22', '廿五'],
-    ['2017-1-23', '廿六'],
-    ['2017-1-24', '廿七'],
-    ['2017-1-25', '廿八'],
-    ['2017-1-26', '廿九'],
-    ['2017-1-27', '三十'],
-    ['2017-1-28', '正月'],
-    ['2017-1-29', '初二'],
-    ['2017-1-30', '初三'],
-    ['2017-1-31', '初四'],
-    ['2017-2-1', '初五'],
-    ['2017-2-2', '初六'],
-    ['2017-2-3', '初七', '立春'],
-    ['2017-2-4', '初八'],
-    ['2017-2-5', '初九'],
-    ['2017-2-6', '初十'],
-    ['2017-2-7', '十一'],
-    ['2017-2-8', '十二'],
-    ['2017-2-9', '十三'],
-    ['2017-2-10', '十四'],
-    ['2017-2-11', '十五'],
-    ['2017-2-12', '十六'],
-    ['2017-2-13', '十七'],
-    ['2017-2-14', '十八'],
-    ['2017-2-15', '十九'],
-    ['2017-2-16', '二十'],
-    ['2017-2-17', '廿一'],
-    ['2017-2-18', '廿二', '雨水'],
-    ['2017-2-19', '廿三'],
-    ['2017-2-20', '廿四'],
-    ['2017-2-21', '廿五'],
-    ['2017-2-22', '廿六'],
-    ['2017-2-23', '廿七'],
-    ['2017-2-24', '廿八'],
-    ['2017-2-25', '廿九'],
-    ['2017-2-26', '二月'],
-    ['2017-2-27', '初二'],
-    ['2017-2-28', '初三'],
-    ['2017-3-1', '初四'],
-    ['2017-3-2', '初五'],
-    ['2017-3-3', '初六'],
-    ['2017-3-4', '初七'],
-    ['2017-3-5', '初八', '驚蟄'],
-    ['2017-3-6', '初九'],
-    ['2017-3-7', '初十'],
-    ['2017-3-8', '十一'],
-    ['2017-3-9', '十二'],
-    ['2017-3-10', '十三'],
-    ['2017-3-11', '十四'],
-    ['2017-3-12', '十五'],
-    ['2017-3-13', '十六'],
-    ['2017-3-14', '十七'],
-    ['2017-3-15', '十八'],
-    ['2017-3-16', '十九'],
-    ['2017-3-17', '二十'],
-    ['2017-3-18', '廿一'],
-    ['2017-3-19', '廿二'],
-    ['2017-3-20', '廿三', '春分'],
-    ['2017-3-21', '廿四'],
-    ['2017-3-22', '廿五'],
-    ['2017-3-23', '廿六'],
-    ['2017-3-24', '廿七'],
-    ['2017-3-25', '廿八'],
-    ['2017-3-26', '廿九'],
-    ['2017-3-27', '三十'],
-    ['2017-3-28', '三月'],
-    ['2017-3-29', '初二'],
-    ['2017-3-30', '初三'],
-    ['2017-3-31', '初四'],
-    ['2017-4-1', '初五'],
-    ['2017-4-2', '初六'],
-    ['2017-4-3', '初七'],
-    ['2017-4-4', '初八', '清明'],
-    ['2017-4-5', '初九'],
-    ['2017-4-6', '初十'],
-    ['2017-4-7', '十一'],
-    ['2017-4-8', '十二'],
-    ['2017-4-9', '十三'],
-    ['2017-4-10', '十四'],
-    ['2017-4-11', '十五'],
-    ['2017-4-12', '十六'],
-    ['2017-4-13', '十七'],
-    ['2017-4-14', '十八'],
-    ['2017-4-15', '十九'],
-    ['2017-4-16', '二十'],
-    ['2017-4-17', '廿一'],
-    ['2017-4-18', '廿二'],
-    ['2017-4-19', '廿三'],
-    ['2017-4-20', '廿四', '穀雨'],
-    ['2017-4-21', '廿五'],
-    ['2017-4-22', '廿六'],
-    ['2017-4-23', '廿七'],
-    ['2017-4-24', '廿八'],
-    ['2017-4-25', '廿九'],
-    ['2017-4-26', '四月'],
-    ['2017-4-27', '初二'],
-    ['2017-4-28', '初三'],
-    ['2017-4-29', '初四'],
-    ['2017-4-30', '初五'],
-    ['2017-5-1', '初六'],
-    ['2017-5-2', '初七'],
-    ['2017-5-3', '初八'],
-    ['2017-5-4', '初九'],
-    ['2017-5-5', '初十', '立夏'],
-    ['2017-5-6', '十一'],
-    ['2017-5-7', '十二'],
-    ['2017-5-8', '十三'],
-    ['2017-5-9', '十四'],
-    ['2017-5-10', '十五'],
-    ['2017-5-11', '十六'],
-    ['2017-5-12', '十七'],
-    ['2017-5-13', '十八'],
-    ['2017-5-14', '十九'],
-    ['2017-5-15', '二十'],
-    ['2017-5-16', '廿一'],
-    ['2017-5-17', '廿二'],
-    ['2017-5-18', '廿三'],
-    ['2017-5-19', '廿四'],
-    ['2017-5-20', '廿五'],
-    ['2017-5-21', '廿六', '小滿'],
-    ['2017-5-22', '廿七'],
-    ['2017-5-23', '廿八'],
-    ['2017-5-24', '廿九'],
-    ['2017-5-25', '三十'],
-    ['2017-5-26', '五月'],
-    ['2017-5-27', '初二'],
-    ['2017-5-28', '初三'],
-    ['2017-5-29', '初四'],
-    ['2017-5-30', '初五'],
-    ['2017-5-31', '初六'],
-    ['2017-6-1', '初七'],
-    ['2017-6-2', '初八'],
-    ['2017-6-3', '初九'],
-    ['2017-6-4', '初十'],
-    ['2017-6-5', '十一', '芒種'],
-    ['2017-6-6', '十二'],
-    ['2017-6-7', '十三'],
-    ['2017-6-8', '十四'],
-    ['2017-6-9', '十五'],
-    ['2017-6-10', '十六'],
-    ['2017-6-11', '十七'],
-    ['2017-6-12', '十八'],
-    ['2017-6-13', '十九'],
-    ['2017-6-14', '二十'],
-    ['2017-6-15', '廿一'],
-    ['2017-6-16', '廿二'],
-    ['2017-6-17', '廿三'],
-    ['2017-6-18', '廿四'],
-    ['2017-6-19', '廿五'],
-    ['2017-6-20', '廿六'],
-    ['2017-6-21', '廿七', '夏至'],
-    ['2017-6-22', '廿八'],
-    ['2017-6-23', '廿九'],
-    ['2017-6-24', '六月'],
-    ['2017-6-25', '初二'],
-    ['2017-6-26', '初三'],
-    ['2017-6-27', '初四'],
-    ['2017-6-28', '初五'],
-    ['2017-6-29', '初六'],
-    ['2017-6-30', '初七'],
-    ['2017-7-1', '初八'],
-    ['2017-7-2', '初九'],
-    ['2017-7-3', '初十'],
-    ['2017-7-4', '十一'],
-    ['2017-7-5', '十二'],
-    ['2017-7-6', '十三'],
-    ['2017-7-7', '十四', '小暑'],
-    ['2017-7-8', '十五'],
-    ['2017-7-9', '十六'],
-    ['2017-7-10', '十七'],
-    ['2017-7-11', '十八'],
-    ['2017-7-12', '十九'],
-    ['2017-7-13', '二十'],
-    ['2017-7-14', '廿一'],
-    ['2017-7-15', '廿二'],
-    ['2017-7-16', '廿三'],
-    ['2017-7-17', '廿四'],
-    ['2017-7-18', '廿五'],
-    ['2017-7-19', '廿六'],
-    ['2017-7-20', '廿七'],
-    ['2017-7-21', '廿八'],
-    ['2017-7-22', '廿九', '大暑'],
-    ['2017-7-23', '閏六',],
-    ['2017-7-24', '初二'],
-    ['2017-7-25', '初三'],
-    ['2017-7-26', '初四'],
-    ['2017-7-27', '初五'],
-    ['2017-7-28', '初六'],
-    ['2017-7-29', '初七'],
-    ['2017-7-30', '初八'],
-    ['2017-7-31', '初九'],
-    ['2017-8-1', '初十'],
-    ['2017-8-2', '十一'],
-    ['2017-8-3', '十二'],
-    ['2017-8-4', '十三'],
-    ['2017-8-5', '十四'],
-    ['2017-8-6', '十五'],
-    ['2017-8-7', '十六', '立秋'],
-    ['2017-8-8', '十七'],
-    ['2017-8-9', '十八'],
-    ['2017-8-10', '十九'],
-    ['2017-8-11', '二十'],
-    ['2017-8-12', '廿一'],
-    ['2017-8-13', '廿二'],
-    ['2017-8-14', '廿三'],
-    ['2017-8-15', '廿四'],
-    ['2017-8-16', '廿五'],
-    ['2017-8-17', '廿六'],
-    ['2017-8-18', '廿七'],
-    ['2017-8-19', '廿八'],
-    ['2017-8-20', '廿九'],
-    ['2017-8-21', '三十'],
-    ['2017-8-22', '七月'],
-    ['2017-8-23', '初二', '處暑'],
-    ['2017-8-24', '初三'],
-    ['2017-8-25', '初四'],
-    ['2017-8-26', '初五'],
-    ['2017-8-27', '初六'],
-    ['2017-8-28', '初七'],
-    ['2017-8-29', '初八'],
-    ['2017-8-30', '初九'],
-    ['2017-8-31', '初十'],
-    ['2017-9-1', '十一'],
-    ['2017-9-2', '十二'],
-    ['2017-9-3', '十三'],
-    ['2017-9-4', '十四'],
-    ['2017-9-5', '十五'],
-    ['2017-9-6', '十六'],
-    ['2017-9-7', '十七', '白露'],
-    ['2017-9-8', '十八'],
-    ['2017-9-9', '十九'],
-    ['2017-9-10', '二十'],
-    ['2017-9-11', '廿一'],
-    ['2017-9-12', '廿二'],
-    ['2017-9-13', '廿三'],
-    ['2017-9-14', '廿四'],
-    ['2017-9-15', '廿五'],
-    ['2017-9-16', '廿六'],
-    ['2017-9-17', '廿七'],
-    ['2017-9-18', '廿八'],
-    ['2017-9-19', '廿九'],
-    ['2017-9-20', '八月'],
-    ['2017-9-21', '初二'],
-    ['2017-9-22', '初三'],
-    ['2017-9-23', '初四', '秋分'],
-    ['2017-9-24', '初五'],
-    ['2017-9-25', '初六'],
-    ['2017-9-26', '初七'],
-    ['2017-9-27', '初八'],
-    ['2017-9-28', '初九'],
-    ['2017-9-29', '初十'],
-    ['2017-9-30', '十一'],
-    ['2017-10-1', '十二'],
-    ['2017-10-2', '十三'],
-    ['2017-10-3', '十四'],
-    ['2017-10-4', '十五'],
-    ['2017-10-5', '十六'],
-    ['2017-10-6', '十七'],
-    ['2017-10-7', '十八'],
-    ['2017-10-8', '十九', '寒露'],
-    ['2017-10-9', '二十'],
-    ['2017-10-10', '廿一'],
-    ['2017-10-11', '廿二'],
-    ['2017-10-12', '廿三'],
-    ['2017-10-13', '廿四'],
-    ['2017-10-14', '廿五'],
-    ['2017-10-15', '廿六'],
-    ['2017-10-16', '廿七'],
-    ['2017-10-17', '廿八'],
-    ['2017-10-18', '廿九'],
-    ['2017-10-19', '三十'],
-    ['2017-10-20', '九月'],
-    ['2017-10-21', '初二'],
-    ['2017-10-22', '初三'],
-    ['2017-10-23', '初四', '霜降'],
-    ['2017-10-24', '初五'],
-    ['2017-10-25', '初六'],
-    ['2017-10-26', '初七'],
-    ['2017-10-27', '初八'],
-    ['2017-10-28', '初九'],
-    ['2017-10-29', '初十'],
-    ['2017-10-30', '十一'],
-    ['2017-10-31', '十二'],
-    ['2017-11-1', '十三'],
-    ['2017-11-2', '十四'],
-    ['2017-11-3', '十五'],
-    ['2017-11-4', '十六'],
-    ['2017-11-5', '十七'],
-    ['2017-11-6', '十八'],
-    ['2017-11-7', '十九', '立冬'],
-    ['2017-11-8', '二十'],
-    ['2017-11-9', '廿一'],
-    ['2017-11-10', '廿二'],
-    ['2017-11-11', '廿三'],
-    ['2017-11-12', '廿四'],
-    ['2017-11-13', '廿五'],
-    ['2017-11-14', '廿六'],
-    ['2017-11-15', '廿七'],
-    ['2017-11-16', '廿八'],
-    ['2017-11-17', '廿九'],
-    ['2017-11-18', '十月'],
-    ['2017-11-19', '初二'],
-    ['2017-11-20', '初三'],
-    ['2017-11-21', '初四'],
-    ['2017-11-22', '初五', '小雪'],
-    ['2017-11-23', '初六'],
-    ['2017-11-24', '初七'],
-    ['2017-11-25', '初八'],
-    ['2017-11-26', '初九'],
-    ['2017-11-27', '初十'],
-    ['2017-11-28', '十一'],
-    ['2017-11-29', '十二'],
-    ['2017-11-30', '十三'],
-    ['2017-12-1', '十四'],
-    ['2017-12-2', '十五'],
-    ['2017-12-3', '十六'],
-    ['2017-12-4', '十七'],
-    ['2017-12-5', '十八'],
-    ['2017-12-6', '十九'],
-    ['2017-12-7', '二十', '大雪'],
-    ['2017-12-8', '廿一'],
-    ['2017-12-9', '廿二'],
-    ['2017-12-10', '廿三'],
-    ['2017-12-11', '廿四'],
-    ['2017-12-12', '廿五'],
-    ['2017-12-13', '廿六'],
-    ['2017-12-14', '廿七'],
-    ['2017-12-15', '廿八'],
-    ['2017-12-16', '廿九'],
-    ['2017-12-17', '三十'],
-    ['2017-12-18', '十一月'],
-    ['2017-12-19', '初二'],
-    ['2017-12-20', '初三'],
-    ['2017-12-21', '初四'],
-    ['2017-12-22', '初五', '冬至'],
-    ['2017-12-23', '初六'],
-    ['2017-12-24', '初七'],
-    ['2017-12-25', '初八'],
-    ['2017-12-26', '初九'],
-    ['2017-12-27', '初十'],
-    ['2017-12-28', '十一'],
-    ['2017-12-29', '十二'],
-    ['2017-12-30', '十三'],
-    ['2017-12-31', '十四']
-];
-
-var heatmapData = [];
-var lunarData = [];
-for (var i = 0; i < dateList.length; i++) {
-    heatmapData.push([
-        dateList[i][0],
-        Math.random() * 300
-    ]);
-    lunarData.push([
-        dateList[i][0],
-        1,
-        dateList[i][1],
-        dateList[i][2]
-    ]);
-}
-
-
-option = {
-    tooltip: {
-        formatter: function (params) {
-            return '降雨量: ' + params.value[1].toFixed(2);
-        }
-    },
-
-    visualMap: {
-        show: false,
-        min: 0,
-        max: 300,
-        calculable: true,
-        seriesIndex: [2],
-        orient: 'horizontal',
-        left: 'center',
-        bottom: 20,
-        inRange: {
-            color: ['#e0ffff', '#006edd'],
-            opacity: 0.3
-        },
-        controller: {
-            inRange: {
-                opacity: 0.5
-            }
-        }
-    },
-
-    calendar: [{
-        left: 'center',
-        top: 'middle',
-        cellSize: [70, 70],
-        yearLabel: {show: false},
-        orient: 'vertical',
-        dayLabel: {
-            firstDay: 1,
-            nameMap: 'cn'
-        },
-        monthLabel: {
-            show: false
-        },
-        range: '2017-03'
-    }],
-
-    series: [{
-        type: 'scatter',
-        coordinateSystem: 'calendar',
-        symbolSize: 1,
-        label: {
-            show: true,
-            formatter: function (params) {
-                var d = echarts.number.parseDate(params.value[0]);
-                return d.getDate() + '\n\n' + params.value[2] + '\n\n';
-            },
-            color: '#000'
-        },
-        data: lunarData
-    }, {
-        type: 'scatter',
-        coordinateSystem: 'calendar',
-        symbolSize: 1,
-        label: {
-            show: true,
-            formatter: function (params) {
-                return '\n\n\n' + (params.value[3] || '');
-            },
-            fontSize: 14,
-            fontWeight: 700,
-            color: '#a00'
-        },
-        data: lunarData
-    }, {
-        name: '降雨量',
-        type: 'heatmap',
-        coordinateSystem: 'calendar',
-        data: heatmapData
-    }]
-};
\ No newline at end of file
diff --git a/public/data/calendar-pie.js b/public/data/calendar-pie.js
deleted file mode 100644
index 6097b0c..0000000
--- a/public/data/calendar-pie.js
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
-title: Calendar Pie
-category: 'calendar, pie'
-titleCN: 日历饼图
-difficulty: 6
-*/
-
-var cellSize = [80, 80];
-var pieRadius = 30;
-
-function getVirtulData() {
-    var date = +echarts.number.parseDate('2017-02-01');
-    var end = +echarts.number.parseDate('2017-03-01');
-    var dayTime = 3600 * 24 * 1000;
-    var data = [];
-    for (var time = date; time < end; time += dayTime) {
-        data.push([
-            echarts.format.formatTime('yyyy-MM-dd', time),
-            Math.floor(Math.random() * 10000)
-        ]);
-    }
-    return data;
-}
-
-function getPieSeries(scatterData, chart) {
-    return scatterData.map(function (item, index) {
-        var center = chart.convertToPixel('calendar', item);
-        return {
-            id: index + 'pie',
-            type: 'pie',
-            center: center,
-            label: {
-                normal: {
-                    formatter: '{c}',
-                    position: 'inside'
-                }
-            },
-            radius: pieRadius,
-            data: [
-                {name: '工作', value: Math.round(Math.random() * 24)},
-                {name: '娱乐', value: Math.round(Math.random() * 24)},
-                {name: '睡觉', value: Math.round(Math.random() * 24)}
-            ]
-        };
-    });
-}
-
-function getPieSeriesUpdate(scatterData, chart) {
-    return scatterData.map(function (item, index) {
-        var center = chart.convertToPixel('calendar', item);
-        return {
-            id: index + 'pie',
-            center: center
-        };
-    });
-}
-
-var scatterData = getVirtulData();
-
-option = {
-    tooltip : {},
-    legend: {
-        data: ['工作', '娱乐', '睡觉'],
-        bottom: 20
-    },
-    calendar: {
-        top: 'middle',
-        left: 'center',
-        orient: 'vertical',
-        cellSize: cellSize,
-        yearLabel: {
-            show: false,
-            fontSize: 30
-        },
-        dayLabel: {
-            margin: 20,
-            firstDay: 1,
-            nameMap: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']
-        },
-        monthLabel: {
-            show: false
-        },
-        range: ['2017-02']
-    },
-    series: [{
-        id: 'label',
-        type: 'scatter',
-        coordinateSystem: 'calendar',
-        symbolSize: 1,
-        label: {
-            show: true,
-            formatter: function (params) {
-                return echarts.format.formatTime('dd', params.value[0]);
-            },
-            offset: [-cellSize[0] / 2 + 10, -cellSize[1] / 2 + 10],
-            fontSize: 14
-        },
-        data: scatterData
-    }]
-};
-
-var pieInitialized;
-setTimeout(function () {
-    pieInitialized = true;
-    myChart.setOption({
-        series: getPieSeries(scatterData, myChart)
-    });
-}, 10);
-
-app.onresize = function () {
-    if (pieInitialized) {
-        myChart.setOption({
-            series: getPieSeriesUpdate(scatterData, myChart)
-        });
-    }
-};
\ No newline at end of file
diff --git a/public/data/calendar-simple.js b/public/data/calendar-simple.js
deleted file mode 100644
index 0d628bb..0000000
--- a/public/data/calendar-simple.js
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
-title: Simple Calendar
-titleCN: 基础日历图
-category: calendar
-difficulty: 0
-*/
-
-function getVirtulData(year) {
-    year = year || '2017';
-    var date = +echarts.number.parseDate(year + '-01-01');
-    var end = +echarts.number.parseDate(year + '-12-31');
-    var dayTime = 3600 * 24 * 1000;
-    var data = [];
-    for (var time = date; time <= end; time += dayTime) {
-        data.push([
-            echarts.format.formatTime('yyyy-MM-dd', time),
-            Math.floor(Math.random() * 10000)
-        ]);
-    }
-    return data;
-}
-
-option = {
-    visualMap: {
-        show: false,
-        min: 0,
-        max: 10000
-    },
-    calendar: {
-        range: '2017'
-    },
-    series: {
-        type: 'heatmap',
-        coordinateSystem: 'calendar',
-        data: getVirtulData(2017)
-    }
-};
diff --git a/public/data/calendar-vertical.js b/public/data/calendar-vertical.js
deleted file mode 100644
index 3b27d7a..0000000
--- a/public/data/calendar-vertical.js
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
-title: Calendar Heatmap Vertical
-category: 'calendar, heatmap'
-titleCN: 纵向日历图
-shotWidth: 900
-difficulty: 1
-*/
-
-function getVirtulData(year) {
-    year = year || '2017';
-    var date = +echarts.number.parseDate(year + '-01-01');
-    var end = +echarts.number.parseDate((+year + 1) + '-01-01');
-    var dayTime = 3600 * 24 * 1000;
-    var data = [];
-    for (var time = date; time < end; time += dayTime) {
-        data.push([
-            echarts.format.formatTime('yyyy-MM-dd', time),
-            Math.floor(Math.random() * 1000)
-        ]);
-    }
-    return data;
-}
-
-
-option = {
-    tooltip: {
-        position: 'top',
-        formatter: function (p) {
-            var format = echarts.format.formatTime('yyyy-MM-dd', p.data[0]);
-            return format + ': ' + p.data[1];
-        }
-    },
-    visualMap: {
-        min: 0,
-        max: 1000,
-        calculable: true,
-        orient: 'vertical',
-        left: '670',
-        top: 'center'
-    },
-
-    calendar: [{
-        orient: 'vertical',
-        range: '2015'
-    },
-    {
-        left: 300,
-        orient: 'vertical',
-        range: '2016'
-    },
-    {
-        left: 520,
-        cellSize: [20, 'auto'],
-        bottom: 10,
-        orient: 'vertical',
-        range: '2017',
-        dayLabel: {
-            margin: 5
-        }
-    }],
-
-    series: [{
-        type: 'heatmap',
-        coordinateSystem: 'calendar',
-        calendarIndex: 0,
-        data: getVirtulData(2015)
-    }, {
-        type: 'heatmap',
-        coordinateSystem: 'calendar',
-        calendarIndex: 1,
-        data: getVirtulData(2016)
-    }, {
-        type: 'heatmap',
-        coordinateSystem: 'calendar',
-        calendarIndex: 2,
-        data: getVirtulData(2017)
-    }]
-};
diff --git a/public/data/candlestick-brush.js b/public/data/candlestick-brush.js
deleted file mode 100644
index 36c4da7..0000000
--- a/public/data/candlestick-brush.js
+++ /dev/null
@@ -1,264 +0,0 @@
-/*
-title: Candlestick Brush
-category: candlestick
-titleCN: 日历图刷选
-*/
-
-var upColor = '#00da3c';
-var downColor = '#ec0000';
-
-
-function splitData(rawData) {
-    var categoryData = [];
-    var values = [];
-    var volumes = [];
-    for (var i = 0; i < rawData.length; i++) {
-        categoryData.push(rawData[i].splice(0, 1)[0]);
-        values.push(rawData[i]);
-        volumes.push([i, rawData[i][4], rawData[i][0] > rawData[i][1] ? 1 : -1]);
-    }
-
-    return {
-        categoryData: categoryData,
-        values: values,
-        volumes: volumes
-    };
-}
-
-function calculateMA(dayCount, data) {
-    var result = [];
-    for (var i = 0, len = data.values.length; i < len; i++) {
-        if (i < dayCount) {
-            result.push('-');
-            continue;
-        }
-        var sum = 0;
-        for (var j = 0; j < dayCount; j++) {
-            sum += data.values[i - j][1];
-        }
-        result.push(+(sum / dayCount).toFixed(3));
-    }
-    return result;
-}
-
-$.get(ROOT_PATH + '/data/asset/data/stock-DJI.json', function (rawData) {
-
-    var data = splitData(rawData);
-
-    myChart.setOption(option = {
-        animation: false,
-        legend: {
-            bottom: 10,
-            left: 'center',
-            data: ['Dow-Jones index', 'MA5', 'MA10', 'MA20', 'MA30']
-        },
-        tooltip: {
-            trigger: 'axis',
-            axisPointer: {
-                type: 'cross'
-            },
-            borderWidth: 1,
-            borderColor: '#ccc',
-            padding: 10,
-            textStyle: {
-                color: '#000'
-            },
-            position: function (pos, params, el, elRect, size) {
-                var obj = {top: 10};
-                obj[['left', 'right'][+(pos[0] < size.viewSize[0] / 2)]] = 30;
-                return obj;
-            }
-            // extraCssText: 'width: 170px'
-        },
-        axisPointer: {
-            link: {xAxisIndex: 'all'},
-            label: {
-                backgroundColor: '#777'
-            }
-        },
-        toolbox: {
-            feature: {
-                dataZoom: {
-                    yAxisIndex: false
-                },
-                brush: {
-                    type: ['lineX', 'clear']
-                }
-            }
-        },
-        brush: {
-            xAxisIndex: 'all',
-            brushLink: 'all',
-            outOfBrush: {
-                colorAlpha: 0.1
-            }
-        },
-        visualMap: {
-            show: false,
-            seriesIndex: 5,
-            dimension: 2,
-            pieces: [{
-                value: 1,
-                color: downColor
-            }, {
-                value: -1,
-                color: upColor
-            }]
-        },
-        grid: [
-            {
-                left: '10%',
-                right: '8%',
-                height: '50%'
-            },
-            {
-                left: '10%',
-                right: '8%',
-                top: '63%',
-                height: '16%'
-            }
-        ],
-        xAxis: [
-            {
-                type: 'category',
-                data: data.categoryData,
-                scale: true,
-                boundaryGap: false,
-                axisLine: {onZero: false},
-                splitLine: {show: false},
-                splitNumber: 20,
-                min: 'dataMin',
-                max: 'dataMax',
-                axisPointer: {
-                    z: 100
-                }
-            },
-            {
-                type: 'category',
-                gridIndex: 1,
-                data: data.categoryData,
-                scale: true,
-                boundaryGap: false,
-                axisLine: {onZero: false},
-                axisTick: {show: false},
-                splitLine: {show: false},
-                axisLabel: {show: false},
-                splitNumber: 20,
-                min: 'dataMin',
-                max: 'dataMax'
-            }
-        ],
-        yAxis: [
-            {
-                scale: true,
-                splitArea: {
-                    show: true
-                }
-            },
-            {
-                scale: true,
-                gridIndex: 1,
-                splitNumber: 2,
-                axisLabel: {show: false},
-                axisLine: {show: false},
-                axisTick: {show: false},
-                splitLine: {show: false}
-            }
-        ],
-        dataZoom: [
-            {
-                type: 'inside',
-                xAxisIndex: [0, 1],
-                start: 98,
-                end: 100
-            },
-            {
-                show: true,
-                xAxisIndex: [0, 1],
-                type: 'slider',
-                top: '85%',
-                start: 98,
-                end: 100
-            }
-        ],
-        series: [
-            {
-                name: 'Dow-Jones index',
-                type: 'candlestick',
-                data: data.values,
-                itemStyle: {
-                    color: upColor,
-                    color0: downColor,
-                    borderColor: null,
-                    borderColor0: null
-                },
-                tooltip: {
-                    formatter: function (param) {
-                        param = param[0];
-                        return [
-                            'Date: ' + param.name + '<hr size=1 style="margin: 3px 0">',
-                            'Open: ' + param.data[0] + '<br/>',
-                            'Close: ' + param.data[1] + '<br/>',
-                            'Lowest: ' + param.data[2] + '<br/>',
-                            'Highest: ' + param.data[3] + '<br/>'
-                        ].join('');
-                    }
-                }
-            },
-            {
-                name: 'MA5',
-                type: 'line',
-                data: calculateMA(5, data),
-                smooth: true,
-                lineStyle: {
-                    opacity: 0.5
-                }
-            },
-            {
-                name: 'MA10',
-                type: 'line',
-                data: calculateMA(10, data),
-                smooth: true,
-                lineStyle: {
-                    opacity: 0.5
-                }
-            },
-            {
-                name: 'MA20',
-                type: 'line',
-                data: calculateMA(20, data),
-                smooth: true,
-                lineStyle: {
-                    opacity: 0.5
-                }
-            },
-            {
-                name: 'MA30',
-                type: 'line',
-                data: calculateMA(30, data),
-                smooth: true,
-                lineStyle: {
-                    opacity: 0.5
-                }
-            },
-            {
-                name: 'Volume',
-                type: 'bar',
-                xAxisIndex: 1,
-                yAxisIndex: 1,
-                data: data.volumes
-            }
-        ]
-    }, true);
-
-    myChart.dispatchAction({
-        type: 'brush',
-        areas: [
-            {
-                brushType: 'lineX',
-                coordRange: ['2016-06-02', '2016-06-20'],
-                xAxisIndex: 0
-            }
-        ]
-    });
-});
\ No newline at end of file
diff --git a/public/data/candlestick-large.js b/public/data/candlestick-large.js
deleted file mode 100644
index b1c942f..0000000
--- a/public/data/candlestick-large.js
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
-title: Large Scale Candlestick
-category: candlestick
-titleCN: 大数据量K线图
-difficulty: 3
-*/
-
-var upColor = '#ec0000';
-var upBorderColor = '#8A0000';
-var downColor = '#00da3c';
-var downBorderColor = '#008F28';
-
-var dataCount = 2e5;
-var data = generateOHLC(dataCount);
-
-var option = {
-    dataset: {
-        source: data
-    },
-    title: {
-        text: 'Data Amount: ' + echarts.format.addCommas(dataCount)
-    },
-    tooltip: {
-        trigger: 'axis',
-        axisPointer: {
-            type: 'line'
-        }
-    },
-    toolbox: {
-        feature: {
-            dataZoom: {
-                yAxisIndex: false
-            },
-        }
-    },
-    grid: [
-        {
-            left: '10%',
-            right: '10%',
-            bottom: 200
-        },
-        {
-            left: '10%',
-            right: '10%',
-            height: 80,
-            bottom: 80
-        }
-    ],
-    xAxis: [
-        {
-            type: 'category',
-            scale: true,
-            boundaryGap: false,
-            // inverse: true,
-            axisLine: {onZero: false},
-            splitLine: {show: false},
-            splitNumber: 20,
-            min: 'dataMin',
-            max: 'dataMax'
-        },
-        {
-            type: 'category',
-            gridIndex: 1,
-            scale: true,
-            boundaryGap: false,
-            axisLine: {onZero: false},
-            axisTick: {show: false},
-            splitLine: {show: false},
-            axisLabel: {show: false},
-            splitNumber: 20,
-            min: 'dataMin',
-            max: 'dataMax'
-        }
-    ],
-    yAxis: [
-        {
-            scale: true,
-            splitArea: {
-                show: true
-            }
-        },
-        {
-            scale: true,
-            gridIndex: 1,
-            splitNumber: 2,
-            axisLabel: {show: false},
-            axisLine: {show: false},
-            axisTick: {show: false},
-            splitLine: {show: false}
-        }
-    ],
-    dataZoom: [
-        {
-            type: 'inside',
-            xAxisIndex: [0, 1],
-            start: 10,
-            end: 100
-        },
-        {
-            show: true,
-            xAxisIndex: [0, 1],
-            type: 'slider',
-            bottom: 10,
-            start: 10,
-            end: 100
-        }
-    ],
-    visualMap: {
-        show: false,
-        seriesIndex: 1,
-        dimension: 6,
-        pieces: [{
-            value: 1,
-            color: upColor
-        }, {
-            value: -1,
-            color: downColor
-        }]
-    },
-    series: [
-        {
-            type: 'candlestick',
-            itemStyle: {
-                color: upColor,
-                color0: downColor,
-                borderColor: upBorderColor,
-                borderColor0: downBorderColor
-            },
-            encode: {
-                x: 0,
-                y: [1, 4, 3, 2]
-            }
-        },
-        {
-            name: 'Volumn',
-            type: 'bar',
-            xAxisIndex: 1,
-            yAxisIndex: 1,
-            itemStyle: {
-                color: '#7fbe9e'
-            },
-            large: true,
-            encode: {
-                x: 0,
-                y: 5
-            }
-        }
-    ]
-};
-
-function generateOHLC(count) {
-    var data = [];
-
-    var xValue = +new Date(2011, 0, 1);
-    var minute = 60 * 1000;
-    var baseValue = Math.random() * 12000;
-    var boxVals = new Array(4);
-    var dayRange = 12;
-
-    for (var i = 0; i < count; i++) {
-        baseValue = baseValue + Math.random() * 20 - 10;
-
-        for (var j = 0; j < 4; j++) {
-            boxVals[j] = (Math.random() - 0.5) * dayRange + baseValue;
-        }
-        boxVals.sort();
-
-        var openIdx = Math.round(Math.random() * 3);
-        var closeIdx = Math.round(Math.random() * 2);
-        if (closeIdx === openIdx) {
-            closeIdx++;
-        }
-        var volumn = boxVals[3] * (1000 + Math.random() * 500);
-
-        // ['open', 'close', 'lowest', 'highest', 'volumn']
-        // [1, 4, 3, 2]
-        data[i] = [
-            echarts.format.formatTime('yyyy-MM-dd\nhh:mm:ss', xValue += minute),
-            +boxVals[openIdx].toFixed(2), // open
-            +boxVals[3].toFixed(2), // highest
-            +boxVals[0].toFixed(2), // lowest
-            +boxVals[closeIdx].toFixed(2),  // close
-            volumn.toFixed(0),
-            getSign(data, i, +boxVals[openIdx], +boxVals[closeIdx], 4) // sign
-        ];
-    }
-
-    return data;
-
-    function getSign(data, dataIndex, openVal, closeVal, closeDimIdx) {
-        var sign;
-        if (openVal > closeVal) {
-            sign = -1;
-        }
-        else if (openVal < closeVal) {
-            sign = 1;
-        }
-        else {
-            sign = dataIndex > 0
-                // If close === open, compare with close of last record
-                ? (data[dataIndex - 1][closeDimIdx] <= closeVal ? 1 : -1)
-                // No record of previous, set to be positive
-                : 1;
-        }
-
-        return sign;
-    }
-}
diff --git a/public/data/candlestick-sh-2015.js b/public/data/candlestick-sh-2015.js
deleted file mode 100644
index 7dec204..0000000
--- a/public/data/candlestick-sh-2015.js
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
-title: 'ShangHai Index, 2015'
-category: candlestick
-titleCN: 2015 年上证指数
-*/
-
-var rawData = [['2015/12/31','3570.47','3539.18','-33.69','-0.94%','3538.35','3580.6','176963664','25403106','-'],['2015/12/30','3566.73','3572.88','9.14','0.26%','3538.11','3573.68','187889600','26778766','-'],['2015/12/29','3528.4','3563.74','29.96','0.85%','3515.52','3564.17','182551920','25093890','-'],['2015/12/28','3635.77','3533.78','-94.13','-2.59%','3533.78','3641.59','269983264','36904280','-'],['2015/12/25','3614.05','3627.91','15.43','0.43%','3601.74','3635.26','198451120','2 [...]
-
-function calculateMA(dayCount, data) {
-    var result = [];
-    for (var i = 0, len = data.length; i < len; i++) {
-        if (i < dayCount) {
-            result.push('-');
-            continue;
-        }
-        var sum = 0;
-        for (var j = 0; j < dayCount; j++) {
-            sum += data[i - j][1];
-        }
-        result.push(sum / dayCount);
-    }
-    return result;
-}
-
-
-var dates = rawData.map(function (item) {
-    return item[0];
-});
-
-var data = rawData.map(function (item) {
-    return [+item[1], +item[2], +item[5], +item[6]];
-});
-var option = {
-    legend: {
-        data: ['日K', 'MA5', 'MA10', 'MA20', 'MA30'],
-        inactiveColor: '#777',
-    },
-    tooltip: {
-        trigger: 'axis',
-        axisPointer: {
-            animation: false,
-            type: 'cross',
-            lineStyle: {
-                color: '#376df4',
-                width: 2,
-                opacity: 1
-            }
-        }
-    },
-    xAxis: {
-        type: 'category',
-        data: dates,
-        axisLine: { lineStyle: { color: '#8392A5' } }
-    },
-    yAxis: {
-        scale: true,
-        axisLine: { lineStyle: { color: '#8392A5' } },
-        splitLine: { show: false }
-    },
-    grid: {
-        bottom: 80
-    },
-    dataZoom: [{
-        textStyle: {
-            color: '#8392A5'
-        },
-        handleIcon: 'path://M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4v1.3h1.3v-1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7V23h6.6V24.4z M13.3,19.6H6.7v-1.4h6.6V19.6z',
-        dataBackground: {
-            areaStyle: {
-                color: '#8392A5'
-            },
-            lineStyle: {
-                opacity: 0.8,
-                color: '#8392A5'
-            }
-        },
-        brushSelect: true
-    }, {
-        type: 'inside'
-    }],
-    series: [
-        {
-            type: 'candlestick',
-            name: '日K',
-            data: data,
-            itemStyle: {
-                color: '#FD1050',
-                color0: '#0CF49B',
-                borderColor: '#FD1050',
-                borderColor0: '#0CF49B'
-            }
-        },
-        {
-            name: 'MA5',
-            type: 'line',
-            data: calculateMA(5, data),
-            smooth: true,
-            showSymbol: false,
-            lineStyle: {
-                width: 1
-            }
-        },
-        {
-            name: 'MA10',
-            type: 'line',
-            data: calculateMA(10, data),
-            smooth: true,
-            showSymbol: false,
-            lineStyle: {
-                width: 1
-            }
-        },
-        {
-            name: 'MA20',
-            type: 'line',
-            data: calculateMA(20, data),
-            smooth: true,
-            showSymbol: false,
-            lineStyle: {
-                width: 1
-            }
-        },
-        {
-            name: 'MA30',
-            type: 'line',
-            data: calculateMA(30, data),
-            smooth: true,
-            showSymbol: false,
-            lineStyle: {
-                width: 1
-            }
-        }
-    ]
-};
\ No newline at end of file
diff --git a/public/data/candlestick-sh.js b/public/data/candlestick-sh.js
deleted file mode 100644
index 3563bd4..0000000
--- a/public/data/candlestick-sh.js
+++ /dev/null
@@ -1,324 +0,0 @@
-/*
-title: ShangHai Index
-category: candlestick
-titleCN: 上证指数
-difficulty: 2
-*/
-
-var upColor = '#ec0000';
-var upBorderColor = '#8A0000';
-var downColor = '#00da3c';
-var downBorderColor = '#008F28';
-
-
-// 数据意义:开盘(open),收盘(close),最低(lowest),最高(highest)
-var data0 = splitData([
-    ['2013/1/24', 2320.26,2320.26,2287.3,2362.94],
-    ['2013/1/25', 2300,2291.3,2288.26,2308.38],
-    ['2013/1/28', 2295.35,2346.5,2295.35,2346.92],
-    ['2013/1/29', 2347.22,2358.98,2337.35,2363.8],
-    ['2013/1/30', 2360.75,2382.48,2347.89,2383.76],
-    ['2013/1/31', 2383.43,2385.42,2371.23,2391.82],
-    ['2013/2/1', 2377.41,2419.02,2369.57,2421.15],
-    ['2013/2/4', 2425.92,2428.15,2417.58,2440.38],
-    ['2013/2/5', 2411,2433.13,2403.3,2437.42],
-    ['2013/2/6', 2432.68,2434.48,2427.7,2441.73],
-    ['2013/2/7', 2430.69,2418.53,2394.22,2433.89],
-    ['2013/2/8', 2416.62,2432.4,2414.4,2443.03],
-    ['2013/2/18', 2441.91,2421.56,2415.43,2444.8],
-    ['2013/2/19', 2420.26,2382.91,2373.53,2427.07],
-    ['2013/2/20', 2383.49,2397.18,2370.61,2397.94],
-    ['2013/2/21', 2378.82,2325.95,2309.17,2378.82],
-    ['2013/2/22', 2322.94,2314.16,2308.76,2330.88],
-    ['2013/2/25', 2320.62,2325.82,2315.01,2338.78],
-    ['2013/2/26', 2313.74,2293.34,2289.89,2340.71],
-    ['2013/2/27', 2297.77,2313.22,2292.03,2324.63],
-    ['2013/2/28', 2322.32,2365.59,2308.92,2366.16],
-    ['2013/3/1', 2364.54,2359.51,2330.86,2369.65],
-    ['2013/3/4', 2332.08,2273.4,2259.25,2333.54],
-    ['2013/3/5', 2274.81,2326.31,2270.1,2328.14],
-    ['2013/3/6', 2333.61,2347.18,2321.6,2351.44],
-    ['2013/3/7', 2340.44,2324.29,2304.27,2352.02],
-    ['2013/3/8', 2326.42,2318.61,2314.59,2333.67],
-    ['2013/3/11', 2314.68,2310.59,2296.58,2320.96],
-    ['2013/3/12', 2309.16,2286.6,2264.83,2333.29],
-    ['2013/3/13', 2282.17,2263.97,2253.25,2286.33],
-    ['2013/3/14', 2255.77,2270.28,2253.31,2276.22],
-    ['2013/3/15', 2269.31,2278.4,2250,2312.08],
-    ['2013/3/18', 2267.29,2240.02,2239.21,2276.05],
-    ['2013/3/19', 2244.26,2257.43,2232.02,2261.31],
-    ['2013/3/20', 2257.74,2317.37,2257.42,2317.86],
-    ['2013/3/21', 2318.21,2324.24,2311.6,2330.81],
-    ['2013/3/22', 2321.4,2328.28,2314.97,2332],
-    ['2013/3/25', 2334.74,2326.72,2319.91,2344.89],
-    ['2013/3/26', 2318.58,2297.67,2281.12,2319.99],
-    ['2013/3/27', 2299.38,2301.26,2289,2323.48],
-    ['2013/3/28', 2273.55,2236.3,2232.91,2273.55],
-    ['2013/3/29', 2238.49,2236.62,2228.81,2246.87],
-    ['2013/4/1', 2229.46,2234.4,2227.31,2243.95],
-    ['2013/4/2', 2234.9,2227.74,2220.44,2253.42],
-    ['2013/4/3', 2232.69,2225.29,2217.25,2241.34],
-    ['2013/4/8', 2196.24,2211.59,2180.67,2212.59],
-    ['2013/4/9', 2215.47,2225.77,2215.47,2234.73],
-    ['2013/4/10', 2224.93,2226.13,2212.56,2233.04],
-    ['2013/4/11', 2236.98,2219.55,2217.26,2242.48],
-    ['2013/4/12', 2218.09,2206.78,2204.44,2226.26],
-    ['2013/4/15', 2199.91,2181.94,2177.39,2204.99],
-    ['2013/4/16', 2169.63,2194.85,2165.78,2196.43],
-    ['2013/4/17', 2195.03,2193.8,2178.47,2197.51],
-    ['2013/4/18', 2181.82,2197.6,2175.44,2206.03],
-    ['2013/4/19', 2201.12,2244.64,2200.58,2250.11],
-    ['2013/4/22', 2236.4,2242.17,2232.26,2245.12],
-    ['2013/4/23', 2242.62,2184.54,2182.81,2242.62],
-    ['2013/4/24', 2187.35,2218.32,2184.11,2226.12],
-    ['2013/4/25', 2213.19,2199.31,2191.85,2224.63],
-    ['2013/4/26', 2203.89,2177.91,2173.86,2210.58],
-    ['2013/5/2', 2170.78,2174.12,2161.14,2179.65],
-    ['2013/5/3', 2179.05,2205.5,2179.05,2222.81],
-    ['2013/5/6', 2212.5,2231.17,2212.5,2236.07],
-    ['2013/5/7', 2227.86,2235.57,2219.44,2240.26],
-    ['2013/5/8', 2242.39,2246.3,2235.42,2255.21],
-    ['2013/5/9', 2246.96,2232.97,2221.38,2247.86],
-    ['2013/5/10', 2228.82,2246.83,2225.81,2247.67],
-    ['2013/5/13', 2247.68,2241.92,2231.36,2250.85],
-    ['2013/5/14', 2238.9,2217.01,2205.87,2239.93],
-    ['2013/5/15', 2217.09,2224.8,2213.58,2225.19],
-    ['2013/5/16', 2221.34,2251.81,2210.77,2252.87],
-    ['2013/5/17', 2249.81,2282.87,2248.41,2288.09],
-    ['2013/5/20', 2286.33,2299.99,2281.9,2309.39],
-    ['2013/5/21', 2297.11,2305.11,2290.12,2305.3],
-    ['2013/5/22', 2303.75,2302.4,2292.43,2314.18],
-    ['2013/5/23', 2293.81,2275.67,2274.1,2304.95],
-    ['2013/5/24', 2281.45,2288.53,2270.25,2292.59],
-    ['2013/5/27', 2286.66,2293.08,2283.94,2301.7],
-    ['2013/5/28', 2293.4,2321.32,2281.47,2322.1],
-    ['2013/5/29', 2323.54,2324.02,2321.17,2334.33],
-    ['2013/5/30', 2316.25,2317.75,2310.49,2325.72],
-    ['2013/5/31', 2320.74,2300.59,2299.37,2325.53],
-    ['2013/6/3', 2300.21,2299.25,2294.11,2313.43],
-    ['2013/6/4', 2297.1,2272.42,2264.76,2297.1],
-    ['2013/6/5', 2270.71,2270.93,2260.87,2276.86],
-    ['2013/6/6', 2264.43,2242.11,2240.07,2266.69],
-    ['2013/6/7', 2242.26,2210.9,2205.07,2250.63],
-    ['2013/6/13', 2190.1,2148.35,2126.22,2190.1]
-]);
-
-
-function splitData(rawData) {
-    var categoryData = [];
-    var values = []
-    for (var i = 0; i < rawData.length; i++) {
-        categoryData.push(rawData[i].splice(0, 1)[0]);
-        values.push(rawData[i])
-    }
-    return {
-        categoryData: categoryData,
-        values: values
-    };
-}
-
-function calculateMA(dayCount) {
-    var result = [];
-    for (var i = 0, len = data0.values.length; i < len; i++) {
-        if (i < dayCount) {
-            result.push('-');
-            continue;
-        }
-        var sum = 0;
-        for (var j = 0; j < dayCount; j++) {
-            sum += data0.values[i - j][1];
-        }
-        result.push(sum / dayCount);
-    }
-    return result;
-}
-
-
-
-option = {
-    title: {
-        text: '上证指数',
-        left: 0
-    },
-    tooltip: {
-        trigger: 'axis',
-        axisPointer: {
-            type: 'cross'
-        }
-    },
-    legend: {
-        data: ['日K', 'MA5', 'MA10', 'MA20', 'MA30']
-    },
-    grid: {
-        left: '10%',
-        right: '10%',
-        bottom: '15%'
-    },
-    xAxis: {
-        type: 'category',
-        data: data0.categoryData,
-        scale: true,
-        boundaryGap: false,
-        axisLine: {onZero: false},
-        splitLine: {show: false},
-        splitNumber: 20,
-        min: 'dataMin',
-        max: 'dataMax'
-    },
-    yAxis: {
-        scale: true,
-        splitArea: {
-            show: true
-        }
-    },
-    dataZoom: [
-        {
-            type: 'inside',
-            start: 50,
-            end: 100
-        },
-        {
-            show: true,
-            type: 'slider',
-            top: '90%',
-            start: 50,
-            end: 100
-        }
-    ],
-    series: [
-        {
-            name: '日K',
-            type: 'candlestick',
-            data: data0.values,
-            itemStyle: {
-                color: upColor,
-                color0: downColor,
-                borderColor: upBorderColor,
-                borderColor0: downBorderColor
-            },
-            markPoint: {
-                label: {
-                    normal: {
-                        formatter: function (param) {
-                            return param != null ? Math.round(param.value) : '';
-                        }
-                    }
-                },
-                data: [
-                    {
-                        name: 'XX标点',
-                        coord: ['2013/5/31', 2300],
-                        value: 2300,
-                        itemStyle: {
-                            color: 'rgb(41,60,85)'
-                        }
-                    },
-                    {
-                        name: 'highest value',
-                        type: 'max',
-                        valueDim: 'highest'
-                    },
-                    {
-                        name: 'lowest value',
-                        type: 'min',
-                        valueDim: 'lowest'
-                    },
-                    {
-                        name: 'average value on close',
-                        type: 'average',
-                        valueDim: 'close'
-                    }
-                ],
-                tooltip: {
-                    formatter: function (param) {
-                        return param.name + '<br>' + (param.data.coord || '');
-                    }
-                }
-            },
-            markLine: {
-                symbol: ['none', 'none'],
-                data: [
-                    [
-                        {
-                            name: 'from lowest to highest',
-                            type: 'min',
-                            valueDim: 'lowest',
-                            symbol: 'circle',
-                            symbolSize: 10,
-                            label: {
-                                show: false
-                            },
-                            emphasis: {
-                                label: {
-                                    show: false
-                                }
-                            }
-                        },
-                        {
-                            type: 'max',
-                            valueDim: 'highest',
-                            symbol: 'circle',
-                            symbolSize: 10,
-                            label: {
-                                show: false
-                            },
-                            emphasis: {
-                                label: {
-                                    show: false
-                                }
-                            }
-                        }
-                    ],
-                    {
-                        name: 'min line on close',
-                        type: 'min',
-                        valueDim: 'close'
-                    },
-                    {
-                        name: 'max line on close',
-                        type: 'max',
-                        valueDim: 'close'
-                    }
-                ]
-            }
-        },
-        {
-            name: 'MA5',
-            type: 'line',
-            data: calculateMA(5),
-            smooth: true,
-            lineStyle: {
-                opacity: 0.5
-            }
-        },
-        {
-            name: 'MA10',
-            type: 'line',
-            data: calculateMA(10),
-            smooth: true,
-            lineStyle: {
-                opacity: 0.5
-            }
-        },
-        {
-            name: 'MA20',
-            type: 'line',
-            data: calculateMA(20),
-            smooth: true,
-            lineStyle: {
-                opacity: 0.5
-            }
-        },
-        {
-            name: 'MA30',
-            type: 'line',
-            data: calculateMA(30),
-            smooth: true,
-            lineStyle: {
-                opacity: 0.5
-            }
-        },
-
-    ]
-};
-
diff --git a/public/data/candlestick-simple.js b/public/data/candlestick-simple.js
deleted file mode 100644
index a5dbdff..0000000
--- a/public/data/candlestick-simple.js
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
-title: Basic Candlestick
-category: candlestick
-titleCN: 基础 K 线图
-difficulty: 0
-*/
-
-option = {
-    xAxis: {
-        data: ['2017-10-24', '2017-10-25', '2017-10-26', '2017-10-27']
-    },
-    yAxis: {},
-    series: [{
-        type: 'k',
-        data: [
-            [20, 34, 10,38],
-            [40, 35, 30, 50],
-            [31, 38, 33, 44],
-            [38, 15, 5, 42]
-        ]
-    }]
-};
diff --git a/public/data/candlestick-touch.js b/public/data/candlestick-touch.js
deleted file mode 100644
index 70c338f..0000000
--- a/public/data/candlestick-touch.js
+++ /dev/null
@@ -1,245 +0,0 @@
-/*
-title: Axis Pointer Link and Touch
-category: candlestick
-titleCN: 触屏上的坐标轴指示器
-difficulty: 4
-*/
-
-
-var rawData = [["2015/1/5","3258.63","3350.52","115.84","3.58%","3253.88","3369.28","531352384","54976008","-"],["2015/1/6","3330.8","3351.45","0.93","0.03%","3303.18","3394.22","501661696","53239848","-"],["2015/1/7","3326.65","3373.95","22.51","0.67%","3312.21","3374.9","391918880","43641672","-"],["2015/1/8","3371.96","3293.46","-80.5","-2.39%","3285.09","3381.57","371131200","39923032","-"],["2015/1/9","3276.97","3285.41","-8.04","-0.24%","3267.51","3404.83","410240864","45864804","- [...]
-var colorList = ['#c23531','#2f4554', '#61a0a8', '#d48265', '#91c7ae','#749f83',  '#ca8622', '#bda29a','#6e7074', '#546570', '#c4ccd3'];
-var labelFont = 'bold 12px Sans-serif';
-
-function calculateMA(dayCount, data) {
-    var result = [];
-    for (var i = 0, len = data.length; i < len; i++) {
-        if (i < dayCount) {
-            result.push('-');
-            continue;
-        }
-        var sum = 0;
-        for (var j = 0; j < dayCount; j++) {
-            sum += data[i - j][1];
-        }
-        result.push((sum / dayCount).toFixed(2));
-    }
-    return result;
-}
-
-
-var dates = ["2016-03-29", "2016-03-30", "2016-03-31", "2016-04-01", "2016-04-04", "2016-04-05", "2016-04-06", "2016-04-07", "2016-04-08", "2016-04-11", "2016-04-12", "2016-04-13", "2016-04-14", "2016-04-15", "2016-04-18", "2016-04-19", "2016-04-20", "2016-04-21", "2016-04-22", "2016-04-25", "2016-04-26", "2016-04-27", "2016-04-28", "2016-04-29", "2016-05-02", "2016-05-03", "2016-05-04", "2016-05-05", "2016-05-06", "2016-05-09", "2016-05-10", "2016-05-11", "2016-05-12", "2016-05-13", "20 [...]
-var data = [[17512.58,17633.11,17434.27,17642.81,86160000],[17652.36,17716.66,17652.36,17790.11,79330000],[17716.05,17685.09,17669.72,17755.7,102600000],[17661.74,17792.75,17568.02,17811.48,104890000],[17799.39,17737,17710.67,17806.38,85230000],[17718.03,17603.32,17579.56,17718.03,115230000],[17605.45,17716.05,17542.54,17723.55,99410000],[17687.28,17541.96,17484.23,17687.28,90120000],[17555.39,17576.96,17528.16,17694.51,79990000],[17586.48,17556.41,17555.9,17731.63,107100000],[17571.34,1 [...]
-var volumes = [86160000,79330000,102600000,104890000,85230000,115230000,99410000,90120000,79990000,107100000,81020000,91710000,84510000,118160000,89390000,89820000,100210000,102720000,134120000,83770000,92570000,109090000,100920000,136670000,80100000,97060000,95020000,81530000,80020000,85590000,75790000,87390000,88560000,86640000,88440000,103260000,79120000,95530000,111990000,87790000,86480000,79180000,68940000,73190000,147390000,78530000,75560000,82270000,71870000,78750000,71260000,6969 [...]
-
-var dataMA5 = calculateMA(5, data);
-var dataMA10 = calculateMA(10, data);
-var dataMA20 = calculateMA(20, data);
-
-
-option = {
-    animation: false,
-    color: colorList,
-    title: {
-        left: 'center',
-        text: '移动端 K线图'
-    },
-    legend: {
-        top: 30,
-        data: ['日K', 'MA5', 'MA10', 'MA20', 'MA30']
-    },
-    tooltip: {
-        triggerOn: 'none',
-        transitionDuration: 0,
-        confine: true,
-        borderRadius: 4,
-        borderWidth: 1,
-        borderColor: '#333',
-        backgroundColor: 'rgba(255,255,255,0.9)',
-        textStyle: {
-            fontSize: 12,
-            color: '#333'
-        },
-        position: function (pos, params, el, elRect, size) {
-            var obj = {
-                top: 60
-            };
-            obj[['left', 'right'][+(pos[0] < size.viewSize[0] / 2)]] = 5;
-            return obj;
-        }
-    },
-    axisPointer: {
-        link: [{
-            xAxisIndex: [0, 1]
-        }]
-    },
-    dataZoom: [{
-        type: 'slider',
-        xAxisIndex: [0, 1],
-        realtime: false,
-        start: 20,
-        end: 70,
-        top: 65,
-        height: 20,
-        handleIcon: 'path://M10.7,11.9H9.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4h1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7V23h6.6V24.4z M13.3,19.6H6.7v-1.4h6.6V19.6z',
-        handleSize: '120%'
-    }, {
-        type: 'inside',
-        xAxisIndex: [0, 1],
-        start: 40,
-        end: 70,
-        top: 30,
-        height: 20
-    }],
-    xAxis: [{
-        type: 'category',
-        data: dates,
-        boundaryGap : false,
-        axisLine: { lineStyle: { color: '#777' } },
-        axisLabel: {
-            formatter: function (value) {
-                return echarts.format.formatTime('MM-dd', value);
-            }
-        },
-        min: 'dataMin',
-        max: 'dataMax',
-        axisPointer: {
-            show: true
-        }
-    }, {
-        type: 'category',
-        gridIndex: 1,
-        data: dates,
-        scale: true,
-        boundaryGap : false,
-        splitLine: {show: false},
-        axisLabel: {show: false},
-        axisTick: {show: false},
-        axisLine: { lineStyle: { color: '#777' } },
-        splitNumber: 20,
-        min: 'dataMin',
-        max: 'dataMax',
-        axisPointer: {
-            type: 'shadow',
-            label: {show: false},
-            triggerTooltip: true,
-            handle: {
-                show: true,
-                margin: 30,
-                color: '#B80C00'
-            }
-        }
-    }],
-    yAxis: [{
-        scale: true,
-        splitNumber: 2,
-        axisLine: { lineStyle: { color: '#777' } },
-        splitLine: { show: true },
-        axisTick: { show: false },
-        axisLabel: {
-            inside: true,
-            formatter: '{value}\n'
-        }
-    }, {
-        scale: true,
-        gridIndex: 1,
-        splitNumber: 2,
-        axisLabel: {show: false},
-        axisLine: {show: false},
-        axisTick: {show: false},
-        splitLine: {show: false}
-    }],
-    grid: [{
-        left: 20,
-        right: 20,
-        top: 110,
-        height: 120
-    }, {
-        left: 20,
-        right: 20,
-        height: 40,
-        top: 260
-    }],
-    graphic: [{
-        type: 'group',
-        left: 'center',
-        top: 70,
-        width: 300,
-        bounding: 'raw',
-        children: [{
-            id: 'MA5',
-            type: 'text',
-            style: {fill: colorList[1], font: labelFont},
-            left: 0
-        }, {
-            id: 'MA10',
-            type: 'text',
-            style: {fill: colorList[2], font: labelFont},
-            left: 'center'
-        }, {
-            id: 'MA20',
-            type: 'text',
-            style: {fill: colorList[3], font: labelFont},
-            right: 0
-        }]
-    }],
-    series: [{
-        name: 'Volume',
-        type: 'bar',
-        xAxisIndex: 1,
-        yAxisIndex: 1,
-        itemStyle: {
-            color: '#7fbe9e'
-        },
-        emphasis: {
-            itemStyle: {
-                color: '#140'
-            }
-        },
-        data: volumes
-    }, {
-        type: 'candlestick',
-        name: '日K',
-        data: data,
-        itemStyle: {
-            color: '#ef232a',
-            color0: '#14b143',
-            borderColor: '#ef232a',
-            borderColor0: '#14b143'
-        },
-        emphasis: {
-            itemStyle: {
-                color: 'black',
-                color0: '#444',
-                borderColor: 'black',
-                borderColor0: '#444'
-            }
-        }
-    }, {
-        name: 'MA5',
-        type: 'line',
-        data: dataMA5,
-        smooth: true,
-        showSymbol: false,
-        lineStyle: {
-            width: 1
-        }
-    }, {
-        name: 'MA10',
-        type: 'line',
-        data: dataMA10,
-        smooth: true,
-        showSymbol: false,
-        lineStyle: {
-            width: 1
-        }
-    }, {
-        name: 'MA20',
-        type: 'line',
-        data: dataMA20,
-        smooth: true,
-        showSymbol: false,
-        lineStyle: {
-            width: 1
-        }
-    }]
-};
diff --git a/public/data/circle-packing-with-d3.js b/public/data/circle-packing-with-d3.js
deleted file mode 100644
index 4cedb94..0000000
--- a/public/data/circle-packing-with-d3.js
+++ /dev/null
@@ -1,219 +0,0 @@
-/*
-title: Circle Packing with d3
-category: custom
-titleCN: Circle Packing with d3
-difficulty: 11
-*/
-
-$.when(
-    $.get(ROOT_PATH + '/data/asset/data/option-view.json'),
-    $.getScript('https://cdn.jsdelivr.net/npm/d3-hierarchy@2.0.0/dist/d3-hierarchy.min.js')
-).done(function (res) {
-    run(res[0]);
-});
-
-function run(rawData) {
-
-    var dataWrap = prepareData(rawData);
-
-    initChart(dataWrap.seriesData, dataWrap.maxDepth);
-}
-
-function prepareData(rawData) {
-    var seriesData = [];
-    var maxDepth = 0;
-
-    function convert(source, basePath, depth) {
-        if (source == null) {
-            return;
-        }
-        if (maxDepth > 5) {
-            return;
-        }
-        maxDepth = Math.max(depth, maxDepth);
-
-        seriesData.push({
-            id: basePath,
-            value: source.$count,
-            depth: depth,
-            index: seriesData.length
-        });
-
-        for (var key in source) {
-            if (source.hasOwnProperty(key) && !key.match(/^\$/)) {
-                var path = basePath + '.' + key;
-                convert(source[key], path, depth + 1);
-            }
-        }
-    }
-
-    convert(rawData, 'option', 0);
-
-    return {
-        seriesData: seriesData,
-        maxDepth: maxDepth
-    };
-}
-
-function initChart(seriesData, maxDepth) {
-    var displayRoot = stratify();
-
-    function stratify() {
-        return d3.stratify()
-            .parentId(function (d) {
-                return d.id.substring(0, d.id.lastIndexOf('.'));
-            })(
-                seriesData
-            )
-            .sum(function (d) {
-                return d.value || 0;
-            })
-            .sort(function (a, b) {
-                return b.value - a.value;
-            });
-    }
-
-    function overallLayout(params, api) {
-        var context = params.context;
-        d3.pack()
-            .size([api.getWidth() - 2, api.getHeight() - 2])
-            .padding(3)(displayRoot);
-
-        context.nodes = {};
-        displayRoot.descendants().forEach(function (node, index) {
-            context.nodes[node.id] = node;
-        });
-    }
-
-    function renderItem(params, api) {
-        var context = params.context;
-
-        // Only do that layout once in each time `setOption` called.
-        if (!context.layout) {
-            context.layout = true;
-            overallLayout(params, api);
-        }
-
-        var nodePath = api.value('id');
-        var node = context.nodes[nodePath];
-
-        if (!node) {
-            // Reder nothing.
-            return;
-        }
-
-        var isLeaf = !node.children || !node.children.length;
-
-        var focus = new Uint32Array(node.descendants().map(function (node) {
-            return node.data.index;
-        }));
-
-        var nodeName = isLeaf
-            ? nodePath.slice(nodePath.lastIndexOf('.') + 1).split(/(?=[A-Z][^A-Z])/g).join('\n')
-            : '';
-
-        var z2 = api.value('depth') * 2;
-
-        return {
-            type: 'circle',
-            focus: focus,
-            shape: {
-                cx: node.x,
-                cy: node.y,
-                r: node.r
-            },
-            transition: ['shape'],
-            z2: z2,
-            textContent: {
-                type: 'text',
-                style: {
-                    // transition: isLeaf ? 'fontSize' : null,
-                    text: nodeName,
-                    fontFamily: 'Arial',
-                    width: node.r * 1.3,
-                    overflow: 'truncate',
-                    fontSize: node.r / 3
-                },
-                emphasis: {
-                    style: {
-                        overflow: null,
-                        fontSize: Math.max(node.r / 3, 12)
-                    }
-                }
-            },
-            textConfig: {
-                position: 'inside'
-            },
-            style: {
-                fill: api.visual('color')
-            },
-            emphasis: {
-                style: {
-                    fontFamily: 'Arial',
-                    fontSize: 12,
-                    shadowBlur: 20,
-                    shadowOffsetX: 3,
-                    shadowOffsetY: 5,
-                    shadowColor: 'rgba(0,0,0,0.3)'
-                }
-            }
-        };
-    }
-
-    var option = {
-        dataset: {
-            source: seriesData
-        },
-        tooltip: {},
-        visualMap: {
-            show: false,
-            min: 0,
-            max: maxDepth,
-            dimension: 'depth',
-            inRange: {
-                color: ['#006edd', '#e0ffff']
-            }
-        },
-        hoverLayerThreshold: Infinity,
-        series: {
-            type: 'custom',
-            renderItem: renderItem,
-            progressive: 0,
-            coordinateSystem: 'none',
-            encode: {
-                tooltip: 'value',
-                itemName: 'id'
-            }
-        }
-    };
-
-    myChart.setOption(option);
-
-    myChart.on('click', { seriesIndex: 0 }, function (params) {
-        drillDown(params.data.id);
-    });
-
-    function drillDown(targetNodeId) {
-        displayRoot = stratify();
-        if (targetNodeId != null) {
-            displayRoot = displayRoot.descendants().find(function (node) {
-                return node.data.id === targetNodeId;
-            });
-        }
-        // A trick to prevent d3-hierarchy from visiting parents in this algorithm.
-        displayRoot.parent = null;
-
-        myChart.setOption({
-            dataset: {
-                source: seriesData
-            }
-        });
-    }
-
-    // Reset: click on the blank area.
-    myChart.getZr().on('click', function (event) {
-        if (!event.target) {
-            drillDown();
-        }
-    });
-}
diff --git a/public/data/confidence-band.js b/public/data/confidence-band.js
deleted file mode 100644
index 1cf5bb7..0000000
--- a/public/data/confidence-band.js
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
-title: Confidence Band
-category: line
-titleCN: Confidence Band
-difficulty: 4
-*/
-
-myChart.showLoading();
-$.get(ROOT_PATH + '/data/asset/data/confidence-band.json', function (data) {
-    myChart.hideLoading();
-
-    var base = -data.reduce(function (min, val) {
-        return Math.floor(Math.min(min, val.l));
-    }, Infinity);
-    myChart.setOption(option = {
-        title: {
-            text: 'Confidence Band',
-            subtext: 'Example in MetricsGraphics.js',
-            left: 'center'
-        },
-        tooltip: {
-            trigger: 'axis',
-            axisPointer: {
-                type: 'cross',
-                animation: false,
-                label: {
-                    backgroundColor: '#ccc',
-                    borderColor: '#aaa',
-                    borderWidth: 1,
-                    shadowBlur: 0,
-                    shadowOffsetX: 0,
-                    shadowOffsetY: 0,
-
-                    color: '#222'
-                }
-            },
-            formatter: function (params) {
-                return params[2].name + '<br />' + ((params[2].value - base) * 100).toFixed(1) + '%';
-            }
-        },
-        grid: {
-            left: '3%',
-            right: '4%',
-            bottom: '3%',
-            containLabel: true
-        },
-        xAxis: {
-            type: 'category',
-            data: data.map(function (item) {
-                return item.date;
-            }),
-            axisLabel: {
-                formatter: function (value, idx) {
-                    var date = new Date(value);
-                    return idx === 0 ? value : [date.getMonth() + 1, date.getDate()].join('-');
-                }
-            },
-            boundaryGap: false
-        },
-        yAxis: {
-            axisLabel: {
-                formatter: function (val) {
-                    return (val - base) * 100 + '%';
-                }
-            },
-            axisPointer: {
-                label: {
-                    formatter: function (params) {
-                        return ((params.value - base) * 100).toFixed(1) + '%';
-                    }
-                }
-            },
-            splitNumber: 3
-        },
-        series: [{
-            name: 'L',
-            type: 'line',
-            data: data.map(function (item) {
-                return item.l + base;
-            }),
-            lineStyle: {
-                opacity: 0
-            },
-            stack: 'confidence-band',
-            symbol: 'none'
-        }, {
-            name: 'U',
-            type: 'line',
-            data: data.map(function (item) {
-                return item.u - item.l;
-            }),
-            lineStyle: {
-                opacity: 0
-            },
-            areaStyle: {
-                color: '#ccc'
-            },
-            stack: 'confidence-band',
-            symbol: 'none'
-        }, {
-            type: 'line',
-            data: data.map(function (item) {
-                return item.value + base;
-            }),
-            hoverAnimation: false,
-            symbolSize: 6,
-            itemStyle: {
-                color: '#333'
-            },
-            showSymbol: false
-        }]
-    });
-});
diff --git a/public/data/covid-america.js b/public/data/covid-america.js
deleted file mode 100644
index 27d2049..0000000
--- a/public/data/covid-america.js
+++ /dev/null
@@ -1,404 +0,0 @@
-// https://www.makeapie.com/editor.html?c=x02yMqYpqC
-// 作品源于社区作者: 电***n
-
-// Do not prepared to expose.
-
-
-var _timelineDuration = 500;
-var _barDurationUpdate = 490;
-var _axisDurationUpdate = null;
-// var _timelineDuration = 5500;
-// var _barDurationUpdate = 5490;
-// var _axisDurationUpdate = 5000;
-
-$.get(ROOT_PATH + '/data/asset/geo/USA.json', function (usaJson) {
-
-    echarts.registerMap('USA', usaJson, {
-        'Alaska': {
-            left: -123,
-            top: 20,
-            width: 15
-        },
-        'Hawaii': {
-            left: -95,
-            top: 20,
-            width: 5
-        },
-        'Puerto Rico': {
-            left: -85,
-            top: 22,
-            width: 2
-        }
-    });
-
-    run();
-
-});
-
-
-function run() {
-
-    var days = ['1/22/20', '1/23/20', '1/24/20', '1/25/20', '1/26/20', '1/27/20', '1/28/20', '1/29/20', '1/30/20', '1/31/20', '2/1/20', '2/2/20', '2/3/20', '2/4/20', '2/5/20', '2/6/20', '2/7/20', '2/8/20', '2/9/20', '2/10/20', '2/11/20', '2/12/20', '2/13/20', '2/14/20', '2/15/20', '2/16/20', '2/17/20', '2/18/20', '2/19/20', '2/20/20', '2/21/20', '2/22/20', '2/23/20', '2/24/20', '2/25/20', '2/26/20', '2/27/20', '2/28/20', '2/29/20', '3/1/20', '3/2/20', '3/3/20', '3/4/20', '3/5/20', '3/6/2 [...]
-
-    var _country = ['Alabama', 'Alaska', 'American Samoa', 'Arizona', 'Arkansas', 'California', 'Colorado', 'Connecticut', 'Delaware', 'Diamond Princess', 'District of Columbia', 'Florida', 'Georgia', 'Grand Princess', 'Guam', 'Hawaii', 'Idaho', 'Illinois', 'Indiana', 'Iowa', 'Kansas', 'Kentucky', 'Louisiana', 'Maine', 'Maryland', 'Massachusetts', 'Michigan', 'Minnesota', 'Mississippi', 'Missouri', 'Montana', 'Nebraska', 'Nevada', 'New Hampshire', 'New Jersey', 'New Mexico', 'New York',  [...]
-
-    var rawData = [
-        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
-        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
-        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
-        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
-        [0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
-        [0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
-        [0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
-        [0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
-        [0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
-        [0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
-        [0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
-        [0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
-        [0, 0, 0, 1, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
-        [0, 0, 0, 1, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
-        [0, 0, 0, 1, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
-        [0, 0, 0, 1, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
-        [0, 0, 0, 1, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
-        [0, 0, 0, 1, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
-        [0, 0, 0, 1, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
-        [0, 0, 0, 1, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
-        [0, 0, 0, 1, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
-        [0, 0, 0, 1, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
-        [0, 0, 0, 1, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
-        [0, 0, 0, 1, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
-        [0, 0, 0, 1, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
-        [0, 0, 0, 1, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
-        [0, 0, 0, 1, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
-        [0, 0, 0, 1, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
-        [0, 0, 0, 1, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
-        [0, 0, 0, 1, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
-        [0, 0, 0, 1, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
-        [0, 0, 0, 1, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
-        [0, 0, 0, 1, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
-        [0, 0, 0, 1, 0, 10, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
-        [0, 0, 0, 1, 0, 10, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
-        [0, 0, 0, 1, 0, 10, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
-        [0, 0, 0, 1, 0, 11, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
-        [0, 0, 0, 1, 0, 11, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
-        [0, 0, 0, 1, 0, 12, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0],
-        [0, 0, 0, 1, 0, 12, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0],
-        [0, 0, 0, 1, 0, 21, 0, 0, 0, 45, 0, 1, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 3, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0],
-        [0, 0, 0, 1, 0, 25, 0, 0, 0, 45, 0, 2, 2, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 1, 0, 0, 0, 0, 3, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0],
-        [0, 0, 0, 1, 0, 35, 0, 0, 0, 45, 0, 2, 2, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 11, 1, 0, 0, 0, 0, 3, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0],
-        [0, 0, 0, 1, 0, 51, 0, 0, 0, 45, 0, 3, 2, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 1, 2, 2, 0, 23, 1, 0, 0, 0, 0, 3, 0, 0, 2, 0, 0, 1, 3, 0, 0, 0, 0, 70, 0, 0, 0],
-        [0, 0, 0, 2, 0, 59, 3, 0, 0, 45, 0, 3, 3, 0, 0, 0, 0, 5, 1, 0, 0, 1, 0, 0, 3, 6, 0, 1, 0, 0, 0, 1, 2, 2, 2, 0, 31, 2, 0, 0, 0, 0, 3, 2, 0, 2, 0, 0, 1, 4, 0, 0, 0, 0, 78, 0, 0, 0],
-        [0, 0, 0, 4, 0, 81, 7, 0, 0, 45, 0, 7, 5, 21, 0, 1, 0, 6, 1, 0, 0, 1, 0, 0, 3, 6, 0, 1, 0, 0, 0, 1, 2, 2, 4, 0, 76, 2, 0, 0, 0, 1, 6, 2, 0, 3, 2, 0, 1, 8, 1, 0, 0, 0, 102, 0, 0, 0],
-        [0, 0, 0, 4, 0, 95, 7, 0, 0, 45, 2, 10, 5, 21, 0, 1, 0, 7, 2, 0, 1, 1, 0, 0, 5, 22, 0, 1, 0, 1, 0, 1, 4, 4, 5, 0, 106, 2, 0, 0, 0, 1, 14, 6, 0, 3, 2, 0, 3, 11, 1, 1, 0, 2, 122, 0, 0, 0],
-        [0, 0, 0, 4, 0, 101, 7, 0, 0, 45, 2, 13, 10, 21, 0, 1, 0, 7, 3, 3, 1, 4, 1, 0, 5, 22, 0, 2, 0, 1, 0, 3, 4, 4, 5, 0, 142, 2, 0, 0, 0, 1, 14, 7, 0, 3, 3, 0, 3, 13, 1, 1, 0, 2, 122, 0, 0, 0],
-        [0, 0, 0, 6, 0, 144, 15, 2, 0, 46, 5, 15, 17, 21, 0, 2, 0, 12, 6, 8, 1, 6, 1, 0, 8, 92, 0, 3, 0, 1, 0, 3, 4, 4, 15, 0, 173, 7, 0, 0, 3, 2, 15, 12, 0, 3, 7, 0, 7, 13, 2, 1, 0, 7, 267, 0, 3, 0],
-        [0, 0, 0, 9, 1, 177, 34, 3, 1, 46, 10, 28, 23, 21, 0, 2, 0, 25, 11, 13, 1, 8, 6, 0, 9, 95, 2, 5, 0, 1, 1, 5, 7, 5, 23, 3, 220, 7, 0, 0, 4, 2, 19, 16, 0, 5, 10, 8, 9, 21, 3, 1, 0, 9, 366, 0, 6, 0],
-        [0, 0, 0, 9, 6, 221, 45, 5, 1, 46, 10, 35, 31, 21, 0, 2, 0, 32, 13, 16, 1, 10, 19, 0, 12, 108, 2, 9, 1, 1, 1, 10, 14, 6, 29, 5, 328, 15, 1, 0, 5, 2, 24, 22, 0, 5, 12, 8, 18, 27, 5, 2, 0, 17, 442, 0, 8, 1],
-        [5, 1, 0, 9, 6, 282, 49, 11, 4, 46, 10, 50, 42, 21, 0, 2, 1, 46, 13, 17, 5, 14, 36, 1, 18, 123, 16, 14, 1, 2, 1, 13, 17, 6, 29, 10, 421, 17, 1, 0, 13, 2, 30, 41, 0, 14, 13, 8, 26, 43, 9, 2, 0, 30, 568, 0, 19, 1],
-        [6, 1, 0, 12, 12, 340, 101, 22, 6, 46, 10, 76, 66, 21, 0, 4, 2, 64, 16, 17, 8, 14, 77, 3, 26, 138, 25, 21, 6, 4, 5, 14, 21, 7, 69, 10, 525, 24, 1, 0, 26, 4, 32, 47, 3, 20, 19, 9, 32, 57, 10, 5, 1, 41, 572, 0, 27, 2],
-        [12, 1, 0, 13, 16, 426, 131, 24, 7, 46, 16, 115, 99, 21, 3, 6, 5, 93, 20, 18, 8, 20, 91, 12, 32, 164, 33, 35, 10, 5, 7, 17, 24, 13, 98, 13, 732, 33, 1, 0, 37, 7, 36, 66, 5, 20, 28, 9, 39, 72, 28, 8, 1, 45, 643, 0, 32, 3],
-        [29, 1, 0, 18, 22, 557, 160, 30, 8, 47, 22, 155, 121, 20, 3, 7, 5, 105, 25, 23, 11, 21, 136, 17, 41, 197, 53, 54, 13, 6, 7, 18, 45, 17, 178, 17, 967, 38, 1, 0, 50, 10, 39, 77, 5, 21, 33, 10, 52, 85, 39, 12, 1, 49, 904, 0, 47, 3],
-        [39, 3, 0, 20, 22, 698, 160, 68, 16, 47, 22, 216, 146, 21, 3, 10, 8, 161, 30, 23, 18, 26, 196, 32, 60, 218, 65, 60, 21, 11, 9, 21, 56, 26, 267, 23, 1706, 64, 3, 0, 67, 19, 66, 112, 5, 23, 47, 11, 74, 110, 51, 12, 2, 67, 1076, 1, 72, 11],
-        [46, 6, 0, 27, 33, 751, 184, 68, 19, 47, 31, 314, 199, 21, 5, 14, 9, 162, 39, 29, 18, 27, 257, 42, 85, 218, 83, 77, 34, 18, 11, 24, 55, 26, 267, 23, 2495, 70, 6, 0, 86, 19, 68, 152, 5, 33, 47, 11, 79, 173, 51, 18, 2, 77, 1014, 1, 92, 15],
-        [78, 9, 0, 45, 62, 952, 277, 159, 30, 47, 40, 417, 287, 22, 12, 16, 11, 422, 60, 44, 34, 37, 392, 52, 107, 328, 334, 89, 50, 31, 11, 29, 95, 44, 742, 35, 5365, 123, 18, 0, 119, 44, 88, 206, 5, 44, 81, 11, 154, 260, 80, 22, 3, 99, 1376, 2, 159, 18],
-        [83, 12, 0, 78, 96, 1177, 363, 194, 38, 49, 71, 563, 420, 23, 14, 26, 23, 585, 86, 45, 44, 47, 538, 56, 149, 413, 552, 115, 80, 53, 15, 37, 114, 44, 890, 43, 8310, 172, 19, 0, 173, 49, 114, 303, 14, 54, 126, 14, 233, 394, 78, 29, 3, 122, 1524, 7, 207, 19],
-        [131, 15, 0, 118, 122, 1364, 390, 194, 45, 49, 77, 659, 507, 23, 15, 37, 36, 753, 128, 68, 57, 87, 585, 70, 193, 525, 788, 138, 140, 74, 21, 38, 161, 55, 1327, 43, 11710, 253, 28, 0, 248, 53, 114, 396, 21, 66, 171, 14, 371, 581, 136, 29, 3, 156, 1793, 8, 282, 23],
-        [157, 20, 0, 152, 165, 1646, 591, 327, 56, 49, 204, 1004, 621, 30, 27, 53, 42, 1049, 204, 90, 65, 103, 837, 89, 244, 646, 1035, 167, 207, 87, 34, 51, 190, 74, 1914, 57, 15800, 305, 28, 0, 356, 67, 161, 509, 23, 83, 196, 21, 505, 643, 162, 52, 6, 220, 1997, 16, 381, 26],
-        [196, 30, 0, 235, 192, 2108, 704, 415, 68, 49, 120, 1227, 772, 28, 29, 56, 68, 1285, 270, 105, 84, 123, 1172, 107, 290, 777, 1329, 234, 249, 187, 34, 51, 245, 101, 2844, 83, 20884, 353, 30, 0, 443, 81, 191, 698, 31, 106, 298, 28, 614, 758, 257, 75, 7, 254, 2221, 16, 425, 26],
-        [242, 34, 0, 326, 219, 2538, 723, 618, 104, 49, 141, 1412, 1026, 28, 32, 90, 81, 1537, 368, 124, 100, 162, 1388, 118, 349, 1159, 1793, 261, 320, 257, 51, 66, 278, 101, 3675, 100, 25681, 495, 36, 0, 567, 106, 210, 946, 39, 124, 342, 30, 772, 955, 298, 95, 17, 293, 2328, 22, 481, 29],
-        [381, 41, 0, 401, 280, 2998, 1021, 875, 119, 49, 187, 1682, 1247, 28, 37, 91, 91, 1865, 477, 146, 134, 197, 1795, 142, 425, 1838, 2296, 286, 377, 354, 65, 71, 323, 108, 4402, 113, 30841, 590, 45, 0, 704, 164, 266, 1260, 51, 132, 424, 41, 916, 1229, 340, 125, 17, 396, 2591, 39, 621, 44],
-        [517, 56, 0, 508, 335, 3899, 1430, 1012, 130, 49, 231, 2357, 1525, 28, 45, 95, 146, 2538, 645, 179, 172, 247, 2304, 155, 583, 2417, 2845, 344, 485, 520, 90, 74, 420, 137, 6876, 113, 37877, 738, 51, 0, 868, 248, 316, 1795, 64, 165, 424, 46, 1097, 1563, 396, 158, 17, 466, 3207, 52, 728, 53],
-        [587, 58, 0, 665, 381, 4657, 1433, 1291, 163, 49, 271, 2900, 2000, 28, 51, 106, 205, 3024, 979, 235, 206, 301, 2744, 168, 775, 3240, 3634, 396, 579, 666, 109, 82, 536, 158, 8825, 136, 44876, 887, 68, 0, 1137, 322, 416, 2345, 79, 203, 542, 58, 1318, 1937, 472, 184, 19, 607, 3477, 76, 926, 70],
-        [694, 85, 0, 773, 409, 5095, 1740, 1524, 214, 49, 304, 3763, 2366, 103, 55, 149, 234, 3491, 1233, 298, 266, 380, 3315, 211, 995, 4257, 4650, 441, 663, 836, 129, 96, 626, 187, 11124, 208, 52410, 1020, 94, 0, 1406, 377, 479, 2845, 100, 239, 660, 68, 1511, 2455, 602, 211, 22, 740, 4030, 96, 1055, 82],
-        [825, 102, 0, 919, 426, 5852, 2307, 1993, 232, 49, 342, 4246, 2651, 103, 56, 149, 281, 4596, 1513, 336, 330, 438, 3540, 253, 1239, 4955, 5488, 503, 759, 915, 154, 108, 920, 214, 13386, 237, 59648, 1191, 98, 0, 1653, 429, 548, 3432, 127, 294, 774, 90, 1720, 2792, 720, 235, 23, 890, 4465, 113, 1164, 86],
-        [899, 114, 0, 1157, 473, 7138, 2311, 2571, 264, 49, 401, 5473, 2808, 103, 58, 175, 340, 5056, 1786, 424, 372, 479, 4025, 275, 1413, 5752, 6498, 576, 847, 1051, 171, 145, 1012, 314, 16636, 237, 66663, 1313, 109, 0, 1933, 481, 606, 4155, 174, 408, 925, 101, 1917, 3147, 798, 256, 30, 1020, 4923, 145, 1230, 94],
-        [987, 119, 0, 1289, 523, 8210, 2966, 3128, 319, 49, 495, 6741, 3929, 103, 69, 204, 515, 5994, 2158, 497, 434, 628, 5237, 303, 1660, 6620, 7615, 629, 937, 1357, 198, 172, 1114, 357, 18696, 315, 75833, 1535, 122, 2, 2199, 568, 690, 4963, 239, 488, 1083, 108, 2391, 3809, 888, 293, 30, 1249, 5432, 162, 1412, 109],
-        [1060, 132, 0, 1530, 584, 9399, 2982, 3557, 368, 49, 586, 6956, 4638, 103, 77, 224, 566, 6980, 2564, 547, 485, 632, 6424, 303, 1986, 7738, 9315, 689, 1073, 1613, 208, 210, 1279, 367, 22255, 340, 83948, 1675, 142, 6, 2547, 721, 736, 6009, 286, 566, 1293, 129, 2933, 4355, 888, 321, 30, 1483, 5608, 191, 1556, 130],
-        [1233, 143, 0, 1715, 643, 10773, 3342, 3824, 393, 49, 653, 9008, 5348, 103, 82, 256, 776, 7695, 3038, 614, 553, 770, 9149, 376, 2331, 8966, 10791, 742, 1177, 1857, 241, 246, 1463, 316, 25590, 388, 92506, 1977, 159, 6, 2901, 881, 826, 7268, 316, 645, 1554, 165, 3013, 5069, 1092, 338, 30, 1706, 6389, 216, 1748, 150],
-        [1495, 157, 0, 1937, 704, 12004, 3742, 4914, 450, 49, 757, 10268, 5831, 103, 84, 319, 891, 8904, 3437, 699, 629, 770, 10297, 432, 2758, 10402, 12744, 788, 1358, 1864, 243, 279, 1514, 479, 29895, 534, 102987, 2251, 173, 8, 3312, 990, 899, 8570, 316, 711, 1700, 187, 3067, 5734, 1255, 389, 37, 2012, 6846, 237, 2012, 162],
-        [1614, 171, 0, 2187, 743, 12837, 4188, 5276, 593, 49, 902, 11537, 6160, 103, 93, 351, 1022, 10357, 3953, 787, 698, 917, 12496, 456, 3125, 11736, 14225, 865, 1455, 2310, 265, 321, 1742, 540, 34124, 534, 113833, 2486, 186, 8, 3739, 1161, 899, 10444, 452, 806, 1917, 212, 3322, 6567, 1435, 461, 40, 2407, 7247, 282, 2030, 187],
-        [1765, 185, 0, 2486, 837, 15034, 4950, 5675, 673, 49, 1002, 12350, 6647, 103, 112, 371, 1078, 11259, 4411, 869, 751, 955, 13010, 470, 3617, 12500, 15718, 935, 1638, 2347, 286, 364, 1855, 621, 37505, 670, 123160, 2649, 207, 8, 4043, 1254, 1068, 11589, 475, 922, 2049, 240, 3633, 7209, 1608, 512, 42, 2640, 7825, 324, 2320, 197],
-        [1952, 190, 0, 2732, 875, 16019, 5183, 6906, 783, 49, 1097, 13324, 7314, 103, 113, 387, 1101, 12262, 4956, 946, 849, 955, 14867, 499, 4045, 13837, 17221, 986, 1738, 2736, 299, 417, 1953, 715, 41090, 757, 131815, 2962, 225, 8, 4453, 1329, 1068, 13127, 513, 1082, 2232, 288, 3802, 8043, 1685, 543, 43, 2878, 8311, 345, 2449, 210],
-        [2169, 213, 0, 2870, 946, 17351, 5429, 7781, 928, 49, 1211, 14545, 8822, 103, 121, 410, 1170, 12271, 5510, 1046, 912, 1149, 16284, 519, 4371, 15202, 18970, 1069, 1915, 3130, 319, 447, 2124, 715, 44416, 876, 139875, 3299, 237, 8, 4782, 1474, 1132, 14853, 573, 1229, 2417, 320, 4139, 8925, 1746, 575, 43, 3335, 8692, 412, 2578, 216],
-        [2328, 226, 0, 3036, 1000, 18897, 5655, 7781, 1116, 49, 1440, 15456, 9901, 103, 121, 410, 1210, 15078, 5943, 1145, 1046, 1149, 17030, 537, 5529, 16790, 20346, 1154, 2003, 3209, 332, 519, 2259, 747, 47437, 902, 151061, 3499, 251, 11, 5148, 1526, 1181, 16631, 620, 1450, 2417, 393, 4363, 9777, 1855, 605, 45, 3645, 9276, 483, 2710, 221],
-        [2703, 235, 0, 3018, 1119, 19710, 5655, 9784, 1209, 49, 1523, 16364, 10566, 103, 128, 442, 1232, 15079, 6351, 1270, 1116, 1341, 18283, 560, 6185, 18941, 21504, 1240, 2260, 3432, 354, 568, 2456, 819, 51027, 865, 161779, 3736, 269, 11, 5512, 1686, 1321, 18300, 683, 1727, 2793, 447, 4634, 11208, 1856, 628, 45, 4042, 9639, 514, 2886, 230],
-        [2947, 246, 0, 3112, 1171, 21081, 6202, 10538, 1326, 49, 1660, 17531, 11485, 103, 130, 442, 1354, 17887, 6907, 1388, 1117, 1693, 19253, 586, 6968, 20974, 22434, 1336, 2469, 3897, 365, 635, 2722, 819, 54588, 1081, 172348, 3965, 278, 11, 5878, 1794, 1322, 20051, 725, 1727, 3067, 536, 4891, 12105, 2103, 679, 50, 4509, 10119, 574, 3068, 239],
-        [3217, 257, 0, 3393, 1228, 21706, 6513, 11510, 1479, 49, 1778, 18494, 12159, 103, 133, 465, 1396, 19180, 7435, 1510, 1275, 1693, 20014, 616, 7694, 22860, 23605, 1427, 2642, 4108, 377, 699, 2702, 885, 58151, 1091, 181026, 4354, 293, 11, 6250, 1868, 1371, 21719, 788, 2349, 3211, 626, 5132, 13023, 2207, 711, 51, 5077, 10434, 577, 3213, 261],
-        [3563, 272, 0, 3542, 1280, 22795, 7307, 12035, 1625, 49, 1875, 19895, 12452, 103, 133, 499, 1407, 20852, 7928, 1587, 1344, 1963, 20595, 633, 8225, 25475, 24244, 1621, 2781, 4269, 387, 791, 2836, 929, 61850, 1245, 189033, 4570, 308, 11, 6604, 1970, 1527, 22938, 897, 2665, 3320, 730, 5508, 13677, 2303, 727, 51, 5274, 10609, 593, 3341, 270],
-        [3734, 277, 0, 3705, 1410, 23931, 7691, 13381, 1758, 49, 1955, 21019, 13315, 103, 133, 504, 1426, 22025, 8359, 1710, 1390, 2018, 21016, 698, 8936, 26867, 25635, 1621, 2942, 4515, 394, 814, 2990, 985, 64584, 1262, 195749, 4886, 331, 11, 6975, 2069, 1584, 24292, 903, 2665, 3391, 868, 5610, 14275, 2363, 748, 51, 5747, 10635, 611, 3428, 275],
-        [3953, 285, 0, 3809, 1498, 25356, 7950, 13989, 1926, 49, 2058, 21628, 14578, 103, 133, 511, 1464, 23248, 8527, 1899, 1441, 2048, 21518, 735, 9472, 28164, 27001, 1695, 3087, 4746, 399, 897, 3134, 922, 68824, 1345, 203020, 5113, 341, 11, 7285, 2184, 1633, 25465, 923, 3251, 3553, 988, 5827, 15006, 2417, 752, 51, 6182, 10799, 640, 3555, 282],
-        [4075, 293, 0, 3964, 1569, 26686, 7956, 14755, 2014, 49, 2197, 22511, 14987, 103, 135, 524, 1473, 24593, 8960, 1995, 1504, 2210, 21951, 770, 10032, 29918, 28059, 1809, 3360, 4791, 404, 901, 3211, 1139, 71030, 1484, 214454, 5340, 365, 13, 7794, 2263, 1663, 26753, 974, 3251, 3656, 1168, 5827, 15907, 2548, 759, 51, 6500, 10942, 702, 3721, 287],
-        [4345, 300, 0, 4237, 1620, 27677, 8286, 15884, 2070, 49, 2350, 23343, 15669, 103, 135, 530, 1587, 25734, 9542, 2141, 1615, 2435, 22532, 796, 10784, 32181, 28809, 1809, 3624, 5174, 415, 952, 3214, 1139, 75317, 1484, 223691, 5639, 393, 13, 8414, 2357, 1736, 28258, 1043, 3529, 3931, 1311, 6375, 16876, 2683, 774, 51, 6889, 11057, 728, 3875, 296],
-        [4571, 309, 0, 4511, 1695, 29157, 8691, 16809, 2317, 49, 2476, 24759, 17194, 103, 136, 541, 1609, 27578, 10154, 2332, 1730, 2522, 23118, 827, 11572, 34402, 30023, 2070, 3793, 5371, 422, 1066, 3524, 1287, 78467, 1597, 230597, 6045, 393, 13, 9107, 2465, 1785, 29888, 1068, 4177, 4099, 1411, 6263, 17849, 2793, 779, 51, 7491, 11517, 775, 4053, 305],
-        [4712, 314, 0, 4724, 1744, 30491, 9047, 17550, 2538, 49, 2666, 25492, 17669, 103, 136, 574, 1655, 29160, 10641, 2513, 1821, 2707, 23580, 847, 12326, 36372, 30791, 2209, 3974, 5579, 426, 1249, 3626, 1342, 81420, 1798, 241712, 6328, 528, 14, 10222, 2465, 1844, 31652, 1118, 4491, 4248, 1542, 6589, 18704, 2917, 803, 53, 8053, 11776, 785, 4199, 309],
-        [4888, 319, 0, 4933, 1781, 31431, 9730, 17962, 2538, 49, 2793, 26314, 18301, 103, 136, 580, 1668, 30357, 11211, 2902, 1905, 2960, 23928, 867, 12847, 38077, 31424, 2356, 4274, 5743, 433, 1474, 3728, 1390, 85301, 1845, 247815, 6601, 585, 14, 11602, 2567, 1910, 32902, 1213, 4706, 4377, 1635, 7070, 19260, 3069, 813, 53, 8542, 12255, 890, 4346, 313],
-        [5079, 321, 0, 5068, 1973, 33686, 9730, 19815, 2745, 49, 2927, 27059, 19407, 103, 136, 584, 1672, 31513, 11688, 3159, 2048, 3050, 24523, 875, 13684, 38077, 32000, 2470, 4512, 5890, 433, 1648, 3830, 1447, 88722, 1971, 253060, 6895, 627, 14, 12919, 2680, 1957, 33914, 1252, 5090, 4446, 1685, 7238, 19751, 3213, 816, 53, 8990, 12114, 902, 4499, 317],
-        [5317, 329, 0, 5256, 1990, 35465, 10473, 20360, 2931, 49, 3098, 27869, 19881, 103, 136, 586, 1736, 33059, 12097, 3641, 2164, 3204, 24854, 888, 14193, 41199, 32667, 2567, 4716, 6066, 437, 1685, 3937, 1490, 92387, 1971, 258361, 7134, 644, 14, 13725, 2807, 2004, 35249, 1298, 5500, 4439, 1755, 7394, 20574, 3297, 818, 53, 9630, 12392, 908, 4625, 443],
-        [5593, 335, 0, 5473, 2276, 37344, 10891, 22469, 3200, 49, 3206, 28309, 21214, 103, 136, 592, 1766, 35107, 12438, 3748, 2331, 3378, 25258, 907, 14775, 42944, 33966, 2722, 4894, 6277, 439, 1813, 4081, 1588, 95914, 2210, 263292, 7495, 679, 14, 14117, 2894, 2059, 36082, 1252, 5841, 4761, 1858, 7394, 21321, 3445, 823, 54, 10266, 12596, 939, 4845, 447],
-        [5832, 337, 0, 5772, 2599, 39561, 11278, 23100, 3308, 49, 3361, 29648, 21883, 103, 139, 596, 1836, 36937, 13039, 3924, 2721, 3479, 25739, 937, 15737, 46023, 35296, 2942, 5153, 6506, 442, 2202, 4208, 1670, 100025, 2379, 263460, 7820, 709, 14, 14694, 3017, 2127, 38379, 1416, 6256, 4917, 1956, 8266, 22650, 3612, 825, 54, 10998, 12753, 981, 5052, 453],
-        [6026, 339, 0, 6045, 2810, 41355, 12256, 23936, 3442, 49, 3528, 30533, 22491, 103, 141, 601, 1870, 39658, 13681, 4445, 2959, 3779, 26140, 965, 16616, 50969, 36641, 3185, 5434, 6788, 444, 2424, 4398, 1720, 102196, 2521, 271590, 8290, 748, 14, 15169, 3121, 2177, 40208, 1276, 6699, 5070, 2040, 8728, 23642, 3782, 827, 54, 11594, 12977, 1010, 5356, 473],
-        [6026, 339, 0, 6286, 2911, 42368, 12968, 24583, 3576, 49, 3699, 30839, 23222, 103, 141, 605, 1887, 41777, 14399, 5092, 3135, 3915, 26512, 965, 17766, 53348, 37074, 3446, 5718, 6935, 445, 2719, 4539, 1797, 105498, 2660, 282143, 8768, 803, 14, 15587, 3194, 2253, 41153, 1307, 7129, 5253, 2147, 9189, 24153, 3948, 843, 55, 12366, 13319, 1010, 5687, 491],
-        [6421, 340, 0, 6534, 3001, 43558, 13441, 25269, 4034, 49, 3841, 31532, 23486, 103, 141, 606, 1897, 43903, 15012, 5476, 3277, 4085, 26773, 1015, 18581, 54938, 37778, 3602, 5911, 7120, 448, 3028, 4734, 1864, 109038, 2726, 288045, 8997, 867, 14, 15972, 3254, 2311, 42616, 1371, 7439, 5498, 2212, 9667, 24967, 4123, 851, 57, 12970, 13521, 1055, 5912, 502],
-        [6539, 345, 0, 6725, 3069, 44966, 13879, 25997, 4162, 49, 3892, 32138, 24302, 103, 141, 607, 1897, 45883, 15961, 5868, 3473, 4156, 27068, 1023, 19487, 56462, 38210, 3811, 6094, 7305, 449, 3358, 4700, 1938, 111188, 2825, 291996, 9428, 942, 14, 16325, 3281, 2354, 43558, 1389, 7708, 5613, 2244, 9918, 25321, 4236, 855, 57, 13538, 13686, 1063, 6081, 520],
-        [6750, 351, 0, 6955, 3127, 46164, 14316, 26312, 4575, 49, 3994, 32848, 24922, 103, 141, 609, 1952, 48102, 16588, 6376, 3652, 4375, 27286, 1040, 20113, 58302, 39262, 4181, 6342, 7450, 451, 3517, 4821, 2010, 113856, 2974, 295106, 9755, 991, 14, 16769, 3410, 2385, 45137, 1400, 7927, 5735, 2313, 10052, 26357, 4345, 862, 57, 14339, 13842, 1095, 6289, 536],
-        [6912, 355, 0, 7209, 3193, 48747, 14758, 26767, 4655, 49, 4106, 33193, 25775, 103, 141, 613, 1952, 50358, 17182, 6843, 3839, 4537, 27660, 1056, 20849, 60265, 40399, 4644, 6569, 7660, 451, 3851, 4934, 2058, 116365, 3213, 299691, 10180, 1033, 14, 17303, 3473, 2446, 46327, 1433, 8247, 5882, 2373, 10366, 27257, 4497, 862, 57, 14962, 14070, 1110, 6520, 545],
-        [7088, 355, 0, 7655, 3281, 50130, 15284, 27700, 4734, 49, 4323, 33690, 26264, 103, 145, 618, 1984, 52918, 17835, 7145, 4413, 4708, 28001, 1095, 21742, 62205, 41379, 5136, 6815, 7818, 453, 4281, 5053, 2146, 118652, 3411, 304372, 10754, 1067, 14, 18027, 3618, 2510, 47971, 1539, 8621, 6095, 2449, 10735, 28727, 4672, 866, 66, 15847, 14327, 1125, 6854, 559],
-        [7294, 364, 0, 7969, 3337, 52026, 15793, 28764, 4918, 49, 4658, 34728, 27489, 103, 145, 619, 2015, 56055, 18630, 7884, 4634, 4882, 28711, 1123, 23472, 64311, 42356, 5730, 7212, 8067, 453, 5008, 5248, 2310, 121190, 3513, 308314, 11070, 1107, 14, 18743, 3748, 2579, 49579, 1575, 8962, 6258, 2525, 11891, 29692, 4828, 879, 66, 16902, 14637, 1152, 7314, 566],
-        [7611, 365, 0, 8364, 3372, 53347, 16225, 29287, 5038, 49, 4797, 35463, 28331, 103, 145, 620, 2061, 58505, 19295, 8643, 4885, 4879, 29140, 1153, 24473, 66263, 43207, 6232, 7441, 8356, 455, 5317, 5389, 2429, 123717, 3732, 312977, 11588, 1153, 14, 19335, 3851, 2635, 50494, 1757, 9289, 6489, 2588, 12661, 30917, 4985, 886, 66, 17738, 15003, 1185, 7660, 579],
-        [7888, 368, 0, 8640, 3437, 54903, 16635, 29287, 5208, 49, 5016, 36078, 28665, 103, 145, 620, 2061, 61499, 19933, 9175, 5156, 5130, 29340, 1185, 25462, 68087, 43801, 6663, 7550, 8618, 455, 5661, 5472, 2518, 126744, 3850, 316415, 11770, 1191, 14, 19914, 3972, 2680, 51225, 1808, 9477, 6626, 2631, 13177, 31998, 5175, 897, 66, 18672, 15185, 1195, 7964, 586],
-        [8112, 370, 0, 8924, 3491, 55884, 16918, 29973, 5288, 49, 5170, 36897, 29451, 103, 145, 621, 2106, 63777, 20507, 9703, 5383, 5245, 29673, 1205, 26408, 69087, 43990, 7234, 7877, 8946, 457, 6037, 5630, 2588, 128269, 4031, 318953, 11971, 1225, 14, 20474, 4044, 2759, 52816, 1843, 9652, 6757, 2668, 13571, 32783, 5317, 902, 66, 19493, 15462, 1224, 8236, 596],
-        [8437, 371, 0, 9305, 3525, 58456, 17367, 30621, 5371, 49, 5322, 37439, 29998, 103, 145, 625, 2127, 65889, 21033, 10111, 5648, 5822, 29996, 1226, 27117, 70271, 44451, 7851, 8207, 9121, 456, 6373, 5660, 2636, 130593, 4138, 321192, 12510, 1266, 14, 20969, 4127, 2839, 53864, 1924, 9933, 6841, 2721, 13690, 33912, 5449, 907, 66, 20257, 15594, 1246, 8566, 604],
-        [8691, 372, 0, 9707, 3611, 60616, 17832, 30995, 5778, 49, 5461, 38002, 30743, 103, 149, 626, 2158, 68232, 21870, 10404, 5993, 5934, 30399, 1254, 28163, 72025, 45179, 8579, 8424, 9323, 456, 6689, 5741, 2741, 131890, 4291, 323978, 13053, 1323, 15, 21576, 4202, 2916, 54800, 1968, 10205, 6936, 2780, 13938, 34928, 5595, 908, 66, 20257, 15905, 1242, 8901, 631],
-        [9046, 374, 0, 9945, 3703, 62148, 18370, 31784, 5939, 49, 5654, 38828, 31618, 103, 149, 629, 2178, 70871, 22503, 11059, 6332, 6129, 30652, 1330, 29374, 73721, 45745, 9365, 8686, 9581, 456, 7334, 5855, 2843, 133991, 4493, 327469, 13540, 1371, 15, 22131, 4330, 2989, 55956, 2031, 10530, 7142, 2906, 14096, 36036, 5724, 916, 66, 21570, 16231, 1287, 9215, 635],
-        [9385, 377, 0, 10526, 3747, 63779, 18827, 32411, 6111, 49, 5899, 39199, 32181, 103, 151, 629, 2178, 73760, 23146, 11457, 6667, 6288, 30855, 1374, 30485, 75333, 46386, 10088, 9090, 9733, 458, 7818, 5920, 2947, 135840, 4673, 330407, 14006, 1425, 15, 23016, 4424, 3068, 57371, 2156, 10779, 7367, 3145, 14441, 37246, 5919, 919, 68, 22342, 16388, 1323, 9590, 644],
-        [9668, 378, 0, 10960, 3747, 66558, 19375, 32984, 6277, 49, 6102, 40001, 32588, 103, 151, 631, 2205, 76085, 23732, 11671, 6829, 6440, 31417, 1408, 31534, 76743, 46815, 10790, 9378, 9911, 458, 8093, 6171, 3011, 137397, 4778, 333122, 14478, 1464, 16, 23697, 4490, 3160, 58560, 2173, 10989, 7531, 3393, 14768, 38394, 6103, 921, 68, 23196, 16674, 1323, 9939, 653],
-        [9889, 379, 0, 11119, 4012, 67600, 19703, 33554, 6277, 49, 6272, 40596, 33580, 103, 151, 632, 2230, 77741, 24126, 11959, 6951, 6440, 31600, 1436, 32587, 77793, 47182, 11271, 9501, 10068, 458, 8171, 6120, 3071, 138754, 4863, 335395, 14938, 1491, 16, 24081, 4589, 3228, 59939, 2198, 11274, 7653, 3517, 14985, 39258, 6251, 927, 69, 24081, 16891, 1360, 10219, 662],
-        [10164, 379, 0, 11383, 4043, 69329, 19879, 33765, 6565, 49, 6389, 40982, 34002, 103, 151, 634, 2260, 79007, 24627, 12373, 7159, 6677, 31815, 1462, 33373, 78462, 47552, 11799, 9674, 10157, 459, 8407, 6152, 3160, 140206, 5069, 337055, 15274, 1518, 19, 24777, 4613, 3286, 60459, 2256, 11450, 7792, 3614, 15544, 40555, 6362, 926, 69, 25070, 17122, 1366, 10418, 669],
-        [10464, 383, 0, 11736, 4164, 70978, 20157, 34333, 6741, 49, 6485, 41923, 34924, 103, 152, 635, 2293, 83021, 25127, 12912, 7240, 6853, 32050, 1477, 34061, 79332, 48021, 12494, 9908, 10269, 461, 8532, 6313, 3239, 140917, 5212, 338485, 15622, 1571, 19, 25250, 4732, 3358, 61310, 2299, 11614, 7927, 3663, 16111, 41432, 6432, 927, 69, 25800, 17330, 1378, 10611, 675],
-        [10700, 383, 0, 12216, 4236, 72798, 20475, 34855, 6952, 49, 6584, 42402, 35427, 103, 152, 638, 2293, 84694, 25473, 13289, 7518, 6853, 32662, 1515, 34812, 80497, 48391, 12917, 10090, 10404, 462, 8912, 6476, 3299, 141560, 5364, 340661, 16352, 1647, 19, 25721, 4858, 3416, 62101, 2329, 11835, 8030, 3732, 16370, 43020, 6620, 929, 69, 26746, 17512, 1398, 10902, 688],
-        [11101, 383, 0, 12674, 4366, 74871, 20838, 35464, 7223, 49, 6736, 43210, 35977, 103, 152, 637, 2351, 87937, 26053, 13675, 7705, 7225, 33489, 1565, 35903, 82182, 49582, 13435, 10483, 10594, 462, 9260, 6504, 3382, 142704, 5503, 343051, 16968, 1712, 19, 26357, 4963, 3479, 63105, 2427, 12016, 8189, 3792, 16699, 44480, 6749, 932, 69, 27813, 17773, 1427, 11275, 701],
-        [11373, 388, 0, 13169, 4463, 76693, 21232, 36085, 7373, 49, 6871, 44138, 36772, 103, 154, 638, 2351, 90369, 26656, 14049, 7886, 7444, 33837, 1603, 36986, 83421, 50079, 14240, 10801, 10766, 466, 9610, 6733, 3453, 143984, 5662, 345813, 17494, 1761, 19, 26954, 5087, 3541, 64136, 2542, 12219, 8407, 3887, 16960, 45721, 6913, 933, 69, 28672, 17951, 1447, 11685, 716],
-        [11674, 388, 0, 13666, 4578, 78725, 21633, 36703, 7547, 49, 7042, 44811, 37212, 103, 154, 639, 2419, 92457, 27280, 14328, 7939, 7688, 34117, 1648, 37968, 84933, 50538, 14969, 11123, 10959, 468, 10220, 6813, 3556, 145089, 5847, 348232, 18130, 1848, 21, 27474, 5237, 3612, 65185, 2589, 12434, 8661, 3959, 17263, 47452, 7068, 934, 69, 29683, 18288, 1470, 12187, 741],
-        [11771, 388, 0, 13945, 4759, 80166, 21938, 37419, 7670, 49, 7123, 45588, 37579, 103, 154, 640, 2419, 94191, 27778, 14651, 7953, 7688, 34432, 1687, 38804, 86010, 51142, 15668, 11296, 11108, 468, 10177, 6949, 3596, 146504, 5938, 350121, 18673, 1900, 21, 27923, 5310, 3623, 65700, 2646, 12674, 8816, 3987, 17359, 48396, 7238, 940, 69, 30388, 18433, 1492, 12543, 754],
-        [12086, 388, 0, 14208, 4813, 81457, 22202, 38116, 7869, 49, 7270, 46442, 38283, 103, 154, 640, 2455, 96485, 28255, 14955, 8303, 7935, 34709, 1713, 39762, 87052, 51915, 16372, 11432, 11242, 470, 10625, 7061, 3652, 148240, 6096, 351371, 19207, 1931, 21, 28454, 5398, 3687, 66669, 2710, 12795, 8942, 4027, 18011, 49177, 7384, 940, 69, 31140, 18611, 1502, 12687, 766],
-        [12376, 400, 0, 14576, 4923, 83752, 22482, 38430, 8037, 49, 7434, 46944, 38855, 103, 154, 641, 2455, 98030, 28705, 15296, 8353, 8069, 35038, 1741, 41546, 87925, 52350, 17029, 11704, 11393, 471, 10854, 7096, 3721, 149356, 6192, 352845, 19239, 1994, 21, 28952, 5489, 3726, 67311, 2805, 12951, 9056, 4085, 18412, 50552, 7518, 944, 69, 32145, 18811, 1502, 12885, 776],
-        [13052, 401, 0, 14906, 5003, 85997, 22797, 39017, 8194, 49, 7551, 47471, 39801, 103, 154, 643, 2506, 100418, 29274, 15620, 8507, 8167, 35316, 1819, 42323, 88970, 53009, 17670, 11967, 11528, 478, 11122, 7388, 3868, 150776, 6317, 354370, 20262, 2095, 21, 29436, 5532, 3801, 68126, 2866, 13356, 9175, 4177, 18412, 51673, 7710, 944, 69, 32908, 18971, 1567, 13413, 787],
-        [13288, 401, 0, 15348, 5458, 88031, 23191, 39208, 8386, 49, 7788, 48675, 40663, 103, 165, 647, 2506, 102688, 29936, 16170, 8625, 8286, 36504, 1877, 43531, 90084, 53510, 18200, 12222, 11689, 479, 11427, 7400, 3935, 151586, 6472, 356458, 20512, 2229, 22, 30167, 5680, 3817, 69252, 2913, 13571, 9381, 4177, 18961, 53053, 7874, 950, 69, 34137, 19117, 1593, 13885, 801],
-        [13670, 403, 0, 15624, 5612, 90252, 23487, 39640, 8529, 49, 7893, 49451, 41482, 103, 165, 642, 2595, 105444, 30409, 16492, 8909, 8426, 36925, 1948, 44424, 90889, 53913, 19005, 12625, 11836, 479, 11662, 7525, 4014, 152579, 6625, 358154, 22110, 2317, 22, 30794, 5849, 3864, 70211, 3030, 13736, 9638, 4356, 19394, 53539, 8057, 952, 69, 34950, 19265, 1705, 14396, 803],
-        [14117, 407, 0, 16053, 5775, 92539, 23964, 40022, 8529, 49, 7966, 50127, 42242, 103, 165, 643, 2595, 107796, 30901, 16898, 8946, 8571, 36925, 2013, 45495, 91662, 54365, 19845, 13005, 11966, 479, 11963, 7526, 4089, 153140, 6625, 359926, 22864, 2365, 22, 31408, 5960, 3888, 71009, 3100, 13952, 9895, 4464, 19785, 54776, 8260, 954, 69, 35749, 19265, 1705, 14877, 813],
-        [14478, 407, 0, 16377, 5922, 94020, 24174, 40468, 8809, 49, 8110, 50867, 42902, 103, 166, 643, 2626, 110304, 31376, 17251, 9004, 8571, 37169, 2055, 46313, 92675, 54679, 20573, 13260, 12149, 479, 12134, 7881, 4149, 154154, 6943, 361515, 23365, 2418, 22, 31911, 6037, 3927, 71563, 3189, 14065, 10096, 4563, 20111, 55861, 8392, 956, 69, 36244, 19828, 1759, 15277, 838],
-        [14986, 408, 0, 16575, 6029, 96400, 24256, 40873, 8965, 49, 8225, 51746, 43400, 103, 166, 643, 2626, 112017, 31715, 17557, 9125, 8571, 37809, 2074, 47152, 93271, 54881, 21315, 13458, 12476, 479, 12362, 7956, 4197, 155092, 7026, 362764, 24057, 2457, 22, 32477, 6090, 3949, 71925, 3260, 14065, 10178, 4586, 20535, 56409, 8521, 962, 69, 37727, 20065, 1774, 15584, 843],
-        [15650, 410, 0, 16864, 6180, 99387, 24552, 41303, 9066, 49, 8334, 52255, 43983, 103, 167, 643, 2626, 113195, 32078, 17703, 9199, 8951, 38054, 2109, 47687, 93693, 55104, 21960, 13731, 12579, 479, 12619, 8057, 4231, 155764, 7130, 363836, 24455, 2422, 22, 33006, 6138, 3967, 72778, 3324, 14210, 10416, 4653, 20895, 57230, 8620, 967, 69, 39342, 20181, 1774, 15863, 850],
-        [16032, 411, 0, 17318, 6277, 101050, 24754, 41288, 9096, 49, 8406, 52634, 44638, 103, 170, 644, 2699, 114306, 32437, 18369, 9291, 9077, 38497, 2137, 48423, 94220, 55608, 22464, 14044, 12816, 481, 12984, 8150, 4286, 156628, 7252, 364965, 24916, 2439, 22, 33439, 6229, 4038, 73557, 3397, 14353, 10623, 4710, 21285, 58542, 8706, 971, 69, 40249, 20406, 1899, 16462, 860],
-        [16530, 424, 0, 17877, 6538, 103813, 25107, 41559, 9171, 49, 8492, 53285, 45266, 103, 171, 647, 2770, 115833, 33068, 18586, 9371, 9185, 38802, 2189, 49709, 94895, 56014, 22947, 14372, 12981, 485, 13249, 8248, 4389, 157185, 7364, 366733, 25800, 2481, 22, 33915, 6273, 4086, 74220, 3486, 14494, 10788, 4793, 21679, 60395, 8921, 974, 69, 41401, 20764, 1935, 16974, 876],
-        [17031, 429, 0, 18472, 6777, 106622, 25598, 41762, 9236, 49, 8538, 54497, 45881, 103, 172, 649, 2770, 117455, 33558, 18957, 9662, 9464, 38802, 2226, 50988, 95512, 56621, 23531, 14793, 13084, 493, 13648, 8376, 4492, 158844, 7493, 368284, 26885, 2520, 22, 34566, 6338, 4131, 74984, 3647, 14635, 11131, 4866, 22063, 60901, 9264, 975, 69, 42533, 21071, 1951, 17707, 891],
-        [17359, 433, 0, 19258, 7013, 109895, 26084, 42022, 9422, 49, 8717, 55424, 46331, 103, 172, 651, 2803, 118917, 34211, 19244, 9690, 9704, 39577, 2282, 52015, 96301, 56969, 24190, 15229, 13298, 505, 13905, 8517, 4492, 159608, 7624, 369660, 27794, 2554, 22, 35033, 6418, 4185, 75697, 3718, 14819, 11394, 4960, 22566, 62675, 9533, 977, 69, 43611, 21349, 1989, 18230, 898],
-        [17952, 459, 0, 19936, 7253, 111951, 26364, 42201, 9498, 49, 8801, 56163, 47063, 103, 172, 652, 2839, 120260, 34574, 19552, 9700, 9704, 39916, 2325, 52778, 96965, 57397, 24850, 15523, 13438, 515, 14101, 8628, 4651, 160445, 7689, 370770, 28785, 2577, 22, 35513, 6418, 4243, 76129, 3776, 14928, 11861, 4993, 22566, 64652, 9797, 981, 69, 44607, 21702, 2010, 18403, 903],
-        [18630, 466, 0, 20129, 7443, 114733, 26563, 42740, 9605, 49, 8857, 56830, 47902, 103, 175, 652, 2839, 121234, 34830, 19699, 9920, 10046, 40341, 2349, 53327, 100805, 57532, 25208, 15752, 13724, 519, 14345, 8702, 4685, 160918, 7800, 371711, 29592, 2625, 22, 35984, 6573, 4302, 76646, 3873, 14991, 12148, 5034, 22566, 65593, 9999, 983, 70, 45398, 21977, 2028, 18543, 910],
-        [18766, 486, 0, 21264, 7818, 117215, 26774, 42979, 9685, 49, 8886, 57447, 48207, 103, 175, 653, 2933, 122848, 35237, 20019, 9965, 10185, 40746, 2377, 54175, 101163, 57731, 25508, 16041, 14015, 523, 14616, 8858, 4749, 161545, 8024, 373040, 30023, 2646, 23, 36350, 6692, 4335, 77225, 3935, 15112, 12415, 5067, 24342, 67310, 10202, 988, 70, 46239, 22157, 2056, 18917, 912],
-        [18851, 504, 0, 22356, 8067, 119348, 27046, 43091, 9712, 49, 9016, 58764, 48894, 103, 177, 653, 2933, 123830, 35712, 20300, 10092, 10410, 41133, 2418, 54982, 101592, 58035, 25870, 16322, 14189, 525, 14885, 8951, 4795, 162068, 8140, 374085, 31276, 2679, 24, 36792, 6805, 4399, 77780, 4023, 15219, 12415, 5162, 24833, 68877, 10497, 990, 70, 46905, 22484, 2077, 19400, 915],
-        [19072, 512, 0, 22886, 8425, 122168, 27346, 43239, 9746, 49, 9120, 60183, 49859, 103, 179, 655, 2990, 124759, 36096, 20806, 10167, 10705, 41562, 2446, 55858, 102063, 58241, 26273, 16560, 14438, 539, 15139, 9129, 4876, 162530, 8353, 375133, 32075, 2706, 26, 37282, 6907, 4474, 78335, 4508, 15325, 12415, 5247, 25190, 70555, 10813, 1026, 71, 47856, 22729, 2102, 19892, 921],
-        [19387, 523, 0, 24439, 8651, 125738, 27601, 43460, 9773, 49, 9199, 61488, 50621, 103, 179, 664, 3111, 125915, 36578, 21154, 10306, 10977, 41989, 2482, 56770, 102557, 63777, 26980, 16769, 14572, 541, 15406, 9309, 4953, 163336, 8672, 376208, 33295, 2745, 26, 37758, 7007, 4570, 78815, 4620, 15441, 13453, 5277, 25664, 72548, 11252, 1027, 71, 48532, 22993, 2119, 20249, 933],
-        [20043, 535, 0, 25451, 9101, 128593, 27834, 43818, 9845, 49, 9269, 62758, 51359, 103, 179, 673, 3139, 126890, 36997, 21478, 10361, 11287, 42486, 2524, 57482, 103132, 64229, 27501, 17039, 14951, 540, 15572, 9491, 5019, 163893, 8800, 377316, 34718, 2816, 26, 38111, 7059, 4570, 79505, 4915, 15441, 13453, 5367, 26177, 74470, 11798, 1046, 71, 49397, 23442, 2136, 20571, 939],
-        [20500, 543, 0, 26989, 9426, 130615, 27987, 43968, 9942, 49, 9332, 63938, 51898, 103, 179, 675, 3139, 127757, 37397, 21712, 10406, 11287, 42816, 2570, 57973, 103436, 64648, 27886, 17270, 15023, 545, 15664, 9669, 5043, 164164, 8940, 378097, 35625, 2861, 27, 38476, 7150, 4662, 79908, 4985, 15441, 14286, 5438, 26493, 75408, 12066, 1063, 71, 50679, 23729, 2144, 20835, 947],
-        [20925, 562, 0, 27678, 9740, 133816, 28169, 44092, 9972, 49, 9389, 64904, 52497, 103, 179, 676, 3189, 128415, 37623, 22007, 10544, 11476, 43050, 2588, 58404, 103626, 64944, 28224, 17768, 15158, 548, 15786, 9816, 5079, 164497, 9062, 378799, 36517, 2880, 28, 38837, 7205, 4922, 80339, 5046, 15642, 14800, 5471, 27005, 76463, 12322, 1075, 71, 51251, 24041, 2161, 21038, 960],
-        [21422, 572, 0, 28296, 10080, 136641, 28333, 44179, 10020, 49, 9474, 66000, 53249, 103, 180, 682, 3221, 129212, 38033, 22237, 10609, 11707, 43612, 2606, 58904, 103889, 64998, 28523, 18123, 15352, 554, 15918, 10045, 5079, 164796, 9105, 379482, 37227, 2901, 30, 39162, 7363, 4988, 80870, 5185, 15691, 15228, 5523, 27575, 78208, 12559, 1084, 71, 51738, 24354, 2169, 21308, 970],
-        [21989, 592, 0, 29852, 10368, 139715, 28484, 44347, 10056, 49, 9537, 67371, 53980, 103, 180, 685, 3260, 129837, 38337, 22626, 10750, 11883, 44030, 2637, 59465, 104156, 65182, 28869, 18483, 15512, 561, 16058, 10218, 5178, 165346, 9250, 380156, 38473, 2941, 30, 39575, 7483, 5060, 81316, 5329, 15756, 15759, 5604, 27930, 80777, 12864, 1095, 72, 52177, 24354, 2194, 21593, 980],
-        [22845, 609, 0, 31267, 10816, 143377, 28632, 44461, 10106, 49, 9589, 69069, 54973, 103, 183, 692, 3260, 130603, 38748, 22973, 10823, 11945, 44472, 2667, 60197, 104667, 65449, 29316, 18483, 15699, 563, 16315, 10473, 5209, 165816, 9367, 380892, 39584, 2980, 30, 40004, 7626, 5237, 81848, 5352, 15862, 16441, 5665, 28340, 82658, 13252, 1110, 72, 52647, 24779, 2217, 21926, 1009],
-        [23710, 624, 0, 33039, 11547, 146659, 28807, 44689, 10173, 49, 9654, 70971, 55783, 103, 183, 706, 3353, 131198, 39146, 23350, 10973, 12166, 44995, 2721, 60613, 105059, 65672, 29795, 19091, 15997, 573, 16522, 10704, 5251, 166164, 9526, 381714, 41417, 3016, 30, 40424, 7849, 5377, 82481, 5536, 15947, 17170, 5742, 29118, 84927, 13577, 1119, 72, 53211, 25171, 2249, 22246, 1027],
-        [24601, 653, 0, 34660, 12095, 150018, 29002, 44994, 10229, 49, 9709, 73552, 56804, 103, 183, 723, 3353, 131871, 39543, 23717, 11020, 12445, 46283, 2757, 61305, 105395, 65836, 30172, 19348, 16232, 588, 16640, 10997, 5299, 166605, 9621, 382630, 42845, 3058, 30, 40851, 8073, 5377, 82944, 5690, 15947, 17955, 5833, 29549, 86915, 13981, 1125, 72, 53869, 25538, 2274, 22518, 1050],
-        [25615, 660, 0, 35706, 12501, 152300, 29115, 45088, 10264, 49, 9767, 75568, 57681, 103, 183, 728, 3399, 132543, 39909, 23926, 11101, 12445, 46619, 2793, 61701, 105603, 66054, 30471, 19516, 16262, 601, 16730, 11201, 5318, 166881, 9723, 383324, 44264, 3080, 30, 41148, 8231, 5377, 83203, 5811, 15947, 18795, 5898, 30343, 88523, 14313, 1127, 72, 54506, 25834, 2290, 22758, 1060],
-        [26272, 663, 0, 36844, 12917, 155726, 29284, 45235, 10340, 49, 9799, 77326, 58414, 103, 185, 736, 3399, 133016, 40430, 24082, 11319, 12647, 47172, 2810, 62032, 105690, 66085, 30693, 19799, 16611, 609, 16851, 11315, 5345, 167103, 9845, 383944, 45114, 3101, 30, 41576, 8417, 5820, 83589, 5890, 16093, 19378, 5928, 31004, 90211, 14608, 1128, 72, 54886, 26158, 2322, 22932, 1079],
-        [26912, 675, 0, 39185, 13191, 158961, 29427, 45349, 10403, 49, 9818, 80109, 59078, 103, 186, 736, 3462, 133639, 40786, 24179, 11411, 12647, 47706, 2819, 62409, 105885, 66269, 30882, 20152, 16857, 614, 17038, 11683, 5364, 167426, 9933, 384575, 45907, 3124, 30, 42010, 8645, 6098, 83978, 5951, 16164, 19990, 5966, 31751, 93569, 14937, 1131, 72, 55331, 26531, 2341, 23198, 1089],
-        [27312, 695, 0, 40937, 13606, 162798, 29656, 45429, 10444, 49, 9847, 82719, 60030, 103, 188, 744, 3632, 134185, 41013, 24460, 11644, 12995, 48634, 2836, 62969, 106151, 66497, 31296, 20641, 17069, 630, 17231, 11854, 5436, 167703, 10065, 385142, 46934, 3166, 30, 42422, 8904, 6218, 84289, 6003, 16213, 20556, 6050, 32114, 97699, 15344, 1130, 73, 55775, 26784, 2376, 23456, 1114]
-    ];
-
-    var option = {
-        baseOption: {
-            timeline: {
-                axisType: 'category',
-                // realtime: false,
-                // loop: false,
-                autoPlay: true,
-                playInterval: _timelineDuration,
-                symbolSize: 1,
-                left: '5%',
-                right: '5%',
-                bottom: '0%',
-                width: '90%',
-                controlStyle: {
-                    show: false
-                },
-                data: days,
-                tooltip: {
-                    formatter: days
-                }
-            },
-
-            tooltip: {
-                show: true,
-                formatter: function(params) {
-                    return params.name + ':' + params.value
-                },
-            },
-            visualMap: {
-                type: 'piecewise',
-                pieces: [{
-                    min: 100001,
-                    color: '#BB0000'
-                }, {
-                    min: 50001,
-                    max: 100000,
-                    color: '#C62B2B'
-                }, {
-                    min: 25001,
-                    max: 50000,
-                    color: '#D25555'
-                }, {
-                    min: 1001,
-                    max: 25000,
-                    color: '#DD8080'
-                }, {
-                    min: 11,
-                    max: 1000,
-                    color: '#E8AAAA'
-                }, {
-                    min: 1,
-                    max: 10,
-                    color: '#F4D5D5'
-                }, {
-                    value: 0,
-                    color: '#eee'
-                }],
-                orient: 'vertical',
-                itemWidth: 25,
-                itemHeight: 15,
-                showLabel: true,
-                seriesIndex: [0, 1],
-                textStyle: {
-                    color: '#999'
-                },
-                bottom: '10%',
-                left: '5%',
-            },
-            grid: {
-                right: '5%',
-                top: '17%',
-                bottom: '10%',
-                width: '32%'
-            },
-            xAxis: {
-                show: false
-            },
-            yAxis: [{
-                inverse: true,
-                type: 'category',
-                max: 9,
-                nameTextStyle: {
-                    color: '#fff'
-                },
-                animationDurationUpdate: _axisDurationUpdate,
-                axisTick: {
-                    show: false,
-                },
-                axisLabel: {
-                    textStyle: {
-                        fontSize: 14,
-                        color: '#000000',
-                    },
-                    interval: 0
-                },
-                axisLine: {
-                    show: false,
-                    lineStyle: {
-                        color: '#333'
-                    },
-                },
-                splitLine: {
-                    show: false,
-                    lineStyle: {
-                        color: '#333'
-                    }
-                },
-            }],
-            geo: {
-                map: 'USA',
-                top: '28%',
-                right: '50%',
-                left: '5%',
-                emphasis: {
-                    show: false,
-                    itemStyle: {
-                        areaColor: '#90EE90'
-                    }
-                }
-            },
-            series: [{
-                type: 'map',
-                map: 'USA',
-                roam: false,
-                geoIndex: 0,
-                datasetIndex: 0,
-                label: {
-                    show: false,
-                },
-            }, {
-                type: 'bar',
-                realtimeSort: true,
-                barWidth: '40%',
-                datasetIndex: 0,
-                animationDurationUpdate: _barDurationUpdate,
-                animationEasingUpdate: 'linear',
-                label: {
-                    valueAnimation: true,
-                    show: true,
-                    fontSize: 14,
-                    position: 'right',
-                    formatter: '{@[1]}'
-                },
-            }],
-
-        },
-        animationDurationUpdate: 3000,
-        animationEasingUpdate: 'quinticInOut',
-        options: []
-    };
-
-    for (var n = 0; n < days.length; n++) {
-
-        var res = [];
-        for (var j = 0; j < rawData[n].length; j++) {
-            res.push([
-                _country[j],
-                rawData[n][j]
-            ]);
-        }
-
-        option.options.push({
-            dataset: {
-                source: res
-            },
-            title: [{
-                text: '美国疫情地图',
-                textStyle: {
-                    color: '#2D3E53',
-                    fontSize: 28
-                },
-                // https://www.makeapie.com/editor.html?c=x02yMqYpqC
-                subtext: '作品源于社区作者: 电***n',
-                subtextStyle: {
-                    color: '#aaa',
-                    fontSize: 16
-                },
-                left: 20,
-                top: 20,
-            }, {
-                show: true,
-                text: '感染人数前十地区',
-                textStyle: {
-                    color: '#2D3E53',
-                    fontSize: 18
-                },
-                right: '20%',
-                top: '13%'
-            }],
-            series: [{
-                type: 'map',
-                datasetIndex: 0,
-                encode: {
-                    itemName: 0,
-                    value: 1
-                }
-            }, {
-                type: 'bar',
-                datasetIndex: 0,
-                encode: {
-                    x: 1,
-                    y: 0
-                }
-            }]
-        });
-    }
-
-    myChart.setOption(option);
-}
diff --git a/public/data/custom-bar-trend.js b/public/data/custom-bar-trend.js
deleted file mode 100644
index 11b6d75..0000000
--- a/public/data/custom-bar-trend.js
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
-title: Custom Bar Trend
-category: custom
-titleCN: 使用自定义系列添加柱状图趋势
-difficulty: 3
-*/
-
-
-var yearCount = 7;
-var categoryCount = 30;
-
-var xAxisData = [];
-var customData = [];
-var legendData = [];
-var dataList = [];
-
-legendData.push('trend');
-var encodeY = [];
-for (var i = 0; i < yearCount; i++) {
-    legendData.push((2010 + i) + '');
-    dataList.push([]);
-    encodeY.push(1 + i);
-}
-
-for (var i = 0; i < categoryCount; i++) {
-    var val = Math.random() * 1000;
-    xAxisData.push('category' + i);
-    var customVal = [i];
-    customData.push(customVal);
-
-    for (var j = 0; j < dataList.length; j++) {
-        var value = j === 0
-            ? echarts.number.round(val, 2)
-            : echarts.number.round(Math.max(0, dataList[j - 1][i] + (Math.random() - 0.5) * 200), 2);
-        dataList[j].push(value);
-        customVal.push(value);
-    }
-}
-
-function renderItem(params, api) {
-    var xValue = api.value(0);
-    var currentSeriesIndices = api.currentSeriesIndices();
-    var barLayout = api.barLayout({
-        barGap: '30%', barCategoryGap: '20%', count: currentSeriesIndices.length - 1
-    });
-
-    var points = [];
-    for (var i = 0; i < currentSeriesIndices.length; i++) {
-        var seriesIndex = currentSeriesIndices[i];
-        if (seriesIndex !== params.seriesIndex) {
-            var point = api.coord([xValue, api.value(seriesIndex)]);
-            point[0] += barLayout[i - 1].offsetCenter;
-            point[1] -= 20;
-            points.push(point);
-        }
-    }
-    var style = api.style({
-        stroke: api.visual('color'),
-        fill: null
-    });
-
-    return {
-        type: 'polyline',
-        shape: {
-            points: points
-        },
-        style: style
-    };
-}
-
-option = {
-    tooltip: {
-        trigger: 'axis'
-    },
-    legend: {
-        data: legendData
-    },
-    dataZoom: [{
-        type: 'slider',
-        start: 50,
-        end: 70
-    }, {
-        type: 'inside',
-        start: 50,
-        end: 70
-    }],
-    xAxis: {
-        data: xAxisData
-    },
-    yAxis: {},
-    series: [{
-        type: 'custom',
-        name: 'trend',
-        renderItem: renderItem,
-        itemStyle: {
-            borderWidth: 2
-        },
-        encode: {
-            x: 0,
-            y: encodeY
-        },
-        data: customData,
-        z: 100
-    }].concat(dataList.map(function (data, index) {
-        return {
-            type: 'bar',
-            animation: false,
-            name: legendData[index + 1],
-            itemStyle: {
-                opacity: 0.5
-            },
-            data: data
-        };
-    }))
-};
\ No newline at end of file
diff --git a/public/data/custom-calendar-icon.js b/public/data/custom-calendar-icon.js
deleted file mode 100644
index 0841e44..0000000
--- a/public/data/custom-calendar-icon.js
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
-title: Custom Calendar Icon
-category: 'custom, calendar'
-titleCN: 日历图自定义图标
-difficulty: 7
-*/
-
-
-var layouts = [
-    [[0, 0]],
-    [[-0.25, 0], [0.25, 0]],
-    [[0, -0.2], [-0.2, 0.2], [0.2, 0.2]],
-    [[-0.25, -0.25], [-0.25, 0.25], [0.25, -0.25], [0.25, 0.25]]
-];
-var pathes = [
-    'M936.857805 523.431322c0 0-42.065715-68.89513-88.786739-68.89513-46.68416 0-95.732122 71.223091-95.732122 71.223091s-44.28544-72.503296-93.440922-71.152538c-35.565466 0.977306-62.89705 30.882406-79.124275 64.06615L579.773747 790.800797c-3.253248 37.391565-5.677568 50.904371-12.002816 69.63497-6.651802 19.698688-19.544883 35.227341-31.650099 45.909606-14.30231 12.621414-29.59831 22.066586-45.854208 27.424563-16.28969 5.362074-30.098739 6.496973-51.536794 6.496973-19.498906 0-36.95104 [...]
-    'M533.504 268.288q33.792-41.984 71.68-75.776 32.768-27.648 74.24-50.176t86.528-19.456q63.488 5.12 105.984 30.208t67.584 63.488 34.304 87.04 6.144 99.84-17.92 97.792-36.864 87.04-48.64 74.752-53.248 61.952q-40.96 41.984-85.504 78.336t-84.992 62.464-73.728 41.472-51.712 15.36q-20.48 1.024-52.224-14.336t-69.632-41.472-79.872-61.952-82.944-75.776q-26.624-25.6-57.344-59.392t-57.856-74.24-46.592-87.552-21.504-100.352 11.264-99.84 39.936-83.456 65.536-61.952 88.064-35.328q24.576-5.12 49.152 [...]
-    'M741.06368 733.310464c8.075264-29.262438 20.615373-40.632422 14.64105-162.810061C966.089728 361.789952 967.93897 72.37847 967.855002 54.693683c0.279347-0.279347 0.418509-0.419533 0.418509-0.419533s-0.17705-0.00512-0.428749-0.00512c0-0.251699 0-0.428749 0-0.428749s-0.139162 0.14633-0.418509 0.425677c-17.695744-0.083866-307.10784 1.760051-515.833958 212.142592-122.181632-5.984256-133.55305 6.563533-162.815693 14.644531C235.35063 295.798886 103.552614 436.975309 90.630758 486.076621c-1 [...]
-    'M848.794624 939.156685 571.780416 939.156685 571.780416 653.17123l341.897539 0 0 221.100654C913.677926 909.960704 884.482867 939.156685 848.794624 939.156685zM571.780403 318.743552c-11.861606-3.210138-31.443354-8.36864-39.829709-16.176435-0.596582-0.561766-1.016218-1.246413-1.613824-1.841971-0.560845 0.596582-1.016218 1.280205-1.613824 1.841971-8.386355 7.807795-15.96631 12.965274-27.827917 16.176435l0 263.544325L141.030675 582.287877 141.030675 355.202884c0-35.687834 29.195059-64.8 [...]
-];
-var colors = [
-    '#c4332b', '#16B644', '#6862FD', '#FDC763'
-];
-
-function getVirtulData(year) {
-    year = year || '2017';
-    var date = +echarts.number.parseDate(year + '-01-01');
-    var end = +echarts.number.parseDate((+year + 1) + '-01-01');
-    var dayTime = 3600 * 24 * 1000;
-    var data = [];
-    for (var time = date; time < end; time += dayTime) {
-        var items = [];
-        var eventCount = Math.round(Math.random() * pathes.length);
-        for (var i = 0; i < eventCount; i++) {
-            items.push(Math.round(Math.random() * (pathes.length - 1)));
-        }
-        data.push([
-            echarts.format.formatTime('yyyy-MM-dd', time),
-            items.join('|')
-        ]);
-    }
-    return data;
-}
-
-function renderItem(params, api) {
-    var cellPoint = api.coord(api.value(0));
-    var cellWidth = params.coordSys.cellWidth;
-    var cellHeight = params.coordSys.cellHeight;
-
-    var value = api.value(1);
-    var events = value && value.split('|');
-
-    if (isNaN(cellPoint[0]) || isNaN(cellPoint[1])) {
-        return;
-    }
-
-    var group = {
-        type: 'group',
-        children: (layouts[events.length - 1] || []).map(function (itemLayout, index) {
-            return {
-                type: 'path',
-                shape: {
-                    pathData: pathes[events[index]],
-                    x: -8,
-                    y: -8,
-                    width: 16,
-                    height: 16
-                },
-                position: [
-                    cellPoint[0] + echarts.number.linearMap(itemLayout[0], [-0.5, 0.5], [-cellWidth / 2, cellWidth / 2]),
-                    cellPoint[1] + echarts.number.linearMap(itemLayout[1], [-0.5, 0.5], [-cellHeight / 2 + 20, cellHeight / 2])
-                ],
-                style: api.style({
-                    fill: colors[events[index]]
-                })
-            };
-        }) || []
-    };
-
-    group.children.push({
-        type: 'text',
-        style: {
-            x: cellPoint[0],
-            y: cellPoint[1] - cellHeight / 2 + 15,
-            text: echarts.format.formatTime('dd', api.value(0)),
-            fill: '#777',
-            textFont: api.font({fontSize: 14})
-        }
-    });
-
-    return group;
-}
-
-option = {
-    tooltip: {
-    },
-    calendar: [{
-        left: 'center',
-        top: 'middle',
-        cellSize: [70, 70],
-        yearLabel: {show: false},
-        orient: 'vertical',
-        dayLabel: {
-            firstDay: 1,
-            nameMap: 'cn'
-        },
-        monthLabel: {
-            show: false
-        },
-        range: '2017-03'
-    }],
-    series: [{
-        type: 'custom',
-        coordinateSystem: 'calendar',
-        renderItem: renderItem,
-        dimensions: [null, {type: 'ordinal'}],
-        data: getVirtulData(2017)
-    }]
-};
diff --git a/public/data/data-transform-filter.js b/public/data/data-transform-filter.js
deleted file mode 100644
index 219a99f..0000000
--- a/public/data/data-transform-filter.js
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
-title: Data Transform Fitler
-category: line
-titleCN: 数据过滤
-difficulty: 3
-*/
-
-$.get(ROOT_PATH + '/data/asset/data/life-expectancy-table.json', function (_rawData) {
-    run(_rawData);
-});
-
-function run(_rawData) {
-
-    option = {
-        dataset: [{
-            id: 'dataset_raw',
-            source: _rawData
-        }, {
-            id: 'dataset_since_1950_of_germany',
-            fromDatasetId: 'dataset_raw',
-            transform: {
-                type: 'filter',
-                config: {
-                    and: [
-                        { dimension: 'Year', gte: 1950 },
-                        { dimension: 'Country', '=': 'Germany' }
-                    ]
-                }
-            }
-        }, {
-            id: 'dataset_since_1950_of_france',
-            fromDatasetId: 'dataset_raw',
-            transform: {
-                type: 'filter',
-                config: {
-                    and: [
-                        { dimension: 'Year', gte: 1950 },
-                        { dimension: 'Country', '=': 'France' }
-                    ]
-                }
-            }
-        }],
-        title: {
-            text: 'Income of Germany and France since 1950'
-        },
-        tooltip: {
-            trigger: 'axis'
-        },
-        xAxis: {
-            type: 'category',
-            nameLocation: 'middle'
-        },
-        yAxis: {
-            name: 'Income'
-        },
-        series: [{
-            type: 'line',
-            datasetId: 'dataset_since_1950_of_germany',
-            showSymbol: false,
-            encode: {
-                x: 'Year',
-                y: 'Income',
-                itemName: 'Year',
-                tooltip: ['Income'],
-            }
-        }, {
-            type: 'line',
-            datasetId: 'dataset_since_1950_of_france',
-            showSymbol: false,
-            encode: {
-                x: 'Year',
-                y: 'Income',
-                itemName: 'Year',
-                tooltip: ['Income'],
-            }
-        }]
-    };
-
-    myChart.setOption(option);
-
-}
diff --git a/public/data/data-transform-multiple-pie.js b/public/data/data-transform-multiple-pie.js
deleted file mode 100644
index bcf3630..0000000
--- a/public/data/data-transform-multiple-pie.js
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
-title: Partition Data to Pies
-category: dataset, pie, transform
-titleCN: 分割数据到数个饼图
-difficulty: 3
-*/
-
-option = {
-    dataset: [{
-        source: [
-            ['Product', 'Sales', 'Price', 'Year'],
-            ['Cake', 123, 32, 2011],
-            ['Cereal', 231, 14, 2011],
-            ['Tofu', 235, 5, 2011],
-            ['Dumpling', 341, 25, 2011],
-            ['Biscuit', 122, 29, 2011],
-            ['Cake', 143, 30, 2012],
-            ['Cereal', 201, 19, 2012],
-            ['Tofu', 255, 7, 2012],
-            ['Dumpling', 241, 27, 2012],
-            ['Biscuit', 102, 34, 2012],
-            ['Cake', 153, 28, 2013],
-            ['Cereal', 181, 21, 2013],
-            ['Tofu', 395, 4, 2013],
-            ['Dumpling', 281, 31, 2013],
-            ['Biscuit', 92, 39, 2013],
-            ['Cake', 223, 29, 2014],
-            ['Cereal', 211, 17, 2014],
-            ['Tofu', 345, 3, 2014],
-            ['Dumpling', 211, 35, 2014],
-            ['Biscuit', 72, 24, 2014],
-        ],
-    }, {
-        transform: {
-            type: 'filter',
-            config: { dimension: 'Year', value: 2011 }
-        },
-    }, {
-        transform: {
-            type: 'filter',
-            config: { dimension: 'Year', value: 2012 }
-        }
-    }, {
-        transform: {
-            type: 'filter',
-            config: { dimension: 'Year', value: 2013 }
-        }
-    }],
-    series: [{
-        type: 'pie', radius: 50, center: ['50%', '25%'],
-        datasetIndex: 1
-    }, {
-        type: 'pie', radius: 50, center: ['50%', '50%'],
-        datasetIndex: 2
-    }, {
-        type: 'pie', radius: 50, center: ['50%', '75%'],
-        datasetIndex: 3
-    }],
-
-
-    // Optional. Only for responsive layout:
-    media: [{
-        query: { minAspectRatio: 1 },
-        option: {
-            series: [
-                { center: ['25%', '50%'] },
-                { center: ['50%', '50%'] },
-                { center: ['75%', '50%'] }
-            ]
-        }
-    }, {
-        option: {
-            series: [
-                { center: ['50%', '25%'] },
-                { center: ['50%', '50%'] },
-                { center: ['50%', '75%'] }
-            ]
-        }
-    }]
-};
diff --git a/public/data/data-transform-sort-bar.js b/public/data/data-transform-sort-bar.js
deleted file mode 100644
index b62ffee..0000000
--- a/public/data/data-transform-sort-bar.js
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
-title: Sort Data in Bar Chart
-category: dataset, bar, transform
-titleCN: 柱状图排序
-difficulty: 0
-*/
-
-option = {
-    dataset: [{
-        dimensions: ['name', 'age', 'profession', 'score', 'date'],
-        source: [
-            [' Hannah Krause ', 41, 'Engineer', 314, '2011-02-12'],
-            ['Zhao Qian ', 20, 'Teacher', 351, '2011-03-01'],
-            [' Jasmin Krause ', 52, 'Musician', 287, '2011-02-14'],
-            ['Li Lei', 37, 'Teacher', 219, '2011-02-18'],
-            [' Karle Neumann ', 25, 'Engineer', 253, '2011-04-02'],
-            [' Adrian Groß', 19, 'Teacher', null, '2011-01-16'],
-            ['Mia Neumann', 71, 'Engineer', 165, '2011-03-19'],
-            [' Böhm Fuchs', 36, 'Musician', 318, '2011-02-24'],
-            ['Han Meimei ', 67, 'Engineer', 366, '2011-03-12'],
-        ]
-    }, {
-        transform: {
-            type: 'sort',
-            config: { dimension: 'score', order: 'desc' }
-        }
-    }],
-    xAxis: {
-        type: 'category',
-        axisLabel: { interval: 0, rotate: 30 },
-    },
-    yAxis: {},
-    series: {
-        type: 'bar',
-        encode: { x: 'name', y: 'score' },
-        datasetIndex: 1
-    }
-};
diff --git a/public/data/dataset-default.js b/public/data/dataset-default.js
deleted file mode 100644
index 054c50e..0000000
--- a/public/data/dataset-default.js
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
-title: Default arrangement
-category: 'dataset, pie'
-titleCN: 默认 encode 设置
-difficulty: 3
-*/
-
-var option = {
-    legend: {},
-    tooltip: {},
-    dataset: {
-        source: [
-            ['product', '2012', '2013', '2014', '2015', '2016', '2017'],
-            ['Milk Tea', 86.5, 92.1, 85.7, 83.1, 73.4, 55.1],
-            ['Matcha Latte', 41.1, 30.4, 65.1, 53.3, 83.8, 98.7],
-            ['Cheese Cocoa', 24.1, 67.2, 79.5, 86.4, 65.2, 82.5],
-            ['Walnut Brownie', 55.2, 67.1, 69.2, 72.4, 53.9, 39.1]
-        ]
-    },
-    series: [{
-        type: 'pie',
-        radius: '20%',
-        center: ['25%', '30%']
-        // No encode specified, by default, it is '2012'.
-    }, {
-        type: 'pie',
-        radius: '20%',
-        center: ['75%', '30%'],
-        encode: {
-            itemName: 'product',
-            value: '2013'
-        }
-    }, {
-        type: 'pie',
-        radius: '20%',
-        center: ['25%', '75%'],
-        encode: {
-            itemName: 'product',
-            value: '2014'
-        }
-    }, {
-        type: 'pie',
-        radius: '20%',
-        center: ['75%', '75%'],
-        encode: {
-            itemName: 'product',
-            value: '2015'
-        }
-    }]
-};
\ No newline at end of file
diff --git a/public/data/dataset-encode0.js b/public/data/dataset-encode0.js
deleted file mode 100644
index 4bf8921..0000000
--- a/public/data/dataset-encode0.js
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
-title: Simple Encode
-category: 'dataset, bar'
-titleCN: 指定数据到坐标轴的映射
-difficulty: 1
-*/
-
-option = {
-    dataset: {
-        source: [
-            ['score', 'amount', 'product'],
-            [89.3, 58212, 'Matcha Latte'],
-            [57.1, 78254, 'Milk Tea'],
-            [74.4, 41032, 'Cheese Cocoa'],
-            [50.1, 12755, 'Cheese Brownie'],
-            [89.7, 20145, 'Matcha Cocoa'],
-            [68.1, 79146, 'Tea'],
-            [19.6, 91852, 'Orange Juice'],
-            [10.6, 101852, 'Lemon Juice'],
-            [32.7, 20112, 'Walnut Brownie']
-        ]
-    },
-    grid: {containLabel: true},
-    xAxis: {name: 'amount'},
-    yAxis: {type: 'category'},
-    visualMap: {
-        orient: 'horizontal',
-        left: 'center',
-        min: 10,
-        max: 100,
-        text: ['High Score', 'Low Score'],
-        // Map the score column to color
-        dimension: 0,
-        inRange: {
-            color: ['#65B581', '#FFCE34', '#FD665F']
-        }
-    },
-    series: [
-        {
-            type: 'bar',
-            encode: {
-                // Map the "amount" column to X axis.
-                x: 'amount',
-                // Map the "product" column to Y axis
-                y: 'product'
-            }
-        }
-    ]
-};
diff --git a/public/data/dataset-encode1.js b/public/data/dataset-encode1.js
deleted file mode 100644
index 483f771..0000000
--- a/public/data/dataset-encode1.js
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
-title: Encode and Matrix
-category: dataset
-titleCN: 指定数据到坐标轴的映射
-difficulty: 3
-*/
-
-$.get(ROOT_PATH + '/data/asset/data/life-expectancy-table.json', function (data) {
-
-    var sizeValue = '57%';
-    var symbolSize = 2.5;
-    option = {
-        legend: {},
-        tooltip: {},
-        toolbox: {
-            left: 'center',
-            feature: {
-                dataZoom: {}
-            }
-        },
-        grid: [
-            {right: sizeValue, bottom: sizeValue},
-            {left: sizeValue, bottom: sizeValue},
-            {right: sizeValue, top: sizeValue},
-            {left: sizeValue, top: sizeValue}
-        ],
-        xAxis: [
-            {type: 'value', gridIndex: 0, name: 'Income', axisLabel: {rotate: 50, interval: 0}},
-            {type: 'category', gridIndex: 1, name: 'Country', boundaryGap: false, axisLabel: {rotate: 50, interval: 0}},
-            {type: 'value', gridIndex: 2, name: 'Income', axisLabel: {rotate: 50, interval: 0}},
-            {type: 'value', gridIndex: 3, name: 'Life Expectancy', axisLabel: {rotate: 50, interval: 0}}
-        ],
-        yAxis: [
-            {type: 'value', gridIndex: 0, name: 'Life Expectancy'},
-            {type: 'value', gridIndex: 1, name: 'Income'},
-            {type: 'value', gridIndex: 2, name: 'Population'},
-            {type: 'value', gridIndex: 3, name: 'Population'}
-        ],
-        dataset: {
-            dimensions: [
-                'Income',
-                'Life Expectancy',
-                'Population',
-                'Country',
-                {name: 'Year', type: 'ordinal'}
-            ],
-            source: data
-        },
-        series: [
-            {
-                type: 'scatter',
-                symbolSize: symbolSize,
-                xAxisIndex: 0,
-                yAxisIndex: 0,
-                encode: {
-                    x: 'Income',
-                    y: 'Life Expectancy',
-                    tooltip: [0, 1, 2, 3, 4]
-                }
-            },
-            {
-                type: 'scatter',
-                symbolSize: symbolSize,
-                xAxisIndex: 1,
-                yAxisIndex: 1,
-                encode: {
-                    x: 'Country',
-                    y: 'Income',
-                    tooltip: [0, 1, 2, 3, 4]
-                }
-            },
-            {
-                type: 'scatter',
-                symbolSize: symbolSize,
-                xAxisIndex: 2,
-                yAxisIndex: 2,
-                encode: {
-                    x: 'Income',
-                    y: 'Population',
-                    tooltip: [0, 1, 2, 3, 4]
-                }
-            },
-            {
-                type: 'scatter',
-                symbolSize: symbolSize,
-                xAxisIndex: 3,
-                yAxisIndex: 3,
-                encode: {
-                    x: 'Life Expectancy',
-                    y: 'Population',
-                    tooltip: [0, 1, 2, 3, 4]
-                }
-            }
-        ]
-    };
-
-    myChart.setOption(option);
-});
\ No newline at end of file
diff --git a/public/data/dataset-link.js b/public/data/dataset-link.js
deleted file mode 100644
index 029dea2..0000000
--- a/public/data/dataset-link.js
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
-title: Share Dataset
-category: 'dataset, line, pie'
-titleCN: 联动和共享数据集
-difficulty: 5
-*/
-
-
-setTimeout(function () {
-
-    option = {
-        legend: {},
-        tooltip: {
-            trigger: 'axis',
-            showContent: false
-        },
-        dataset: {
-            source: [
-                ['product', '2012', '2013', '2014', '2015', '2016', '2017'],
-                ['Milk Tea', 56.5, 82.1, 88.7, 70.1, 53.4, 85.1],
-                ['Matcha Latte', 51.1, 51.4, 55.1, 53.3, 73.8, 68.7],
-                ['Cheese Cocoa', 40.1, 62.2, 69.5, 36.4, 45.2, 32.5],
-                ['Walnut Brownie', 25.2, 37.1, 41.2, 18, 33.9, 49.1]
-            ]
-        },
-        xAxis: {type: 'category'},
-        yAxis: {gridIndex: 0},
-        grid: {top: '55%'},
-        series: [
-            {type: 'line', smooth: true, seriesLayoutBy: 'row', emphasis: {focus: 'series'}},
-            {type: 'line', smooth: true, seriesLayoutBy: 'row', emphasis: {focus: 'series'}},
-            {type: 'line', smooth: true, seriesLayoutBy: 'row', emphasis: {focus: 'series'}},
-            {type: 'line', smooth: true, seriesLayoutBy: 'row', emphasis: {focus: 'series'}},
-            {
-                type: 'pie',
-                id: 'pie',
-                radius: '30%',
-                center: ['50%', '25%'],
-                emphasis: {focus: 'data'},
-                label: {
-                    formatter: '{b}: {@2012} ({d}%)'
-                },
-                encode: {
-                    itemName: 'product',
-                    value: '2012',
-                    tooltip: '2012'
-                }
-            }
-        ]
-    };
-
-    myChart.on('updateAxisPointer', function (event) {
-        var xAxisInfo = event.axesInfo[0];
-        if (xAxisInfo) {
-            var dimension = xAxisInfo.value + 1;
-            myChart.setOption({
-                series: {
-                    id: 'pie',
-                    label: {
-                        formatter: '{b}: {@[' + dimension + ']} ({d}%)'
-                    },
-                    encode: {
-                        value: dimension,
-                        tooltip: dimension
-                    }
-                }
-            });
-        }
-    });
-
-    myChart.setOption(option);
-
-});
\ No newline at end of file
diff --git a/public/data/dataset-series-layout-by.js b/public/data/dataset-series-layout-by.js
deleted file mode 100644
index 20cbdda..0000000
--- a/public/data/dataset-series-layout-by.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
-title: Series Layout By Column or Row
-category: 'dataset, bar'
-titleCN: 系列按行和按列排布
-difficulty: 5
-*/
-
-option = {
-    legend: {},
-    tooltip: {},
-    dataset: {
-        source: [
-            ['product', '2012', '2013', '2014', '2015'],
-            ['Matcha Latte', 41.1, 30.4, 65.1, 53.3],
-            ['Milk Tea', 86.5, 92.1, 85.7, 83.1],
-            ['Cheese Cocoa', 24.1, 67.2, 79.5, 86.4]
-        ]
-    },
-    xAxis: [
-        {type: 'category', gridIndex: 0},
-        {type: 'category', gridIndex: 1}
-    ],
-    yAxis: [
-        {gridIndex: 0},
-        {gridIndex: 1}
-    ],
-    grid: [
-        {bottom: '55%'},
-        {top: '55%'}
-    ],
-    series: [
-        // These series are in the first grid.
-        {type: 'bar', seriesLayoutBy: 'row'},
-        {type: 'bar', seriesLayoutBy: 'row'},
-        {type: 'bar', seriesLayoutBy: 'row'},
-        // These series are in the second grid.
-        {type: 'bar', xAxisIndex: 1, yAxisIndex: 1},
-        {type: 'bar', xAxisIndex: 1, yAxisIndex: 1},
-        {type: 'bar', xAxisIndex: 1, yAxisIndex: 1},
-        {type: 'bar', xAxisIndex: 1, yAxisIndex: 1}
-    ]
-};
diff --git a/public/data/dataset-simple0.js b/public/data/dataset-simple0.js
deleted file mode 100644
index 5585358..0000000
--- a/public/data/dataset-simple0.js
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
-title: Simple Example of Dataset
-category: 'dataset, bar'
-titleCN: 最简单的数据集(dataset)
-difficulty: 5
-*/
-
-option = {
-    legend: {},
-    tooltip: {},
-    dataset: {
-        source: [
-            ['product', '2015', '2016', '2017'],
-            ['Matcha Latte', 43.3, 85.8, 93.7],
-            ['Milk Tea', 83.1, 73.4, 55.1],
-            ['Cheese Cocoa', 86.4, 65.2, 82.5],
-            ['Walnut Brownie', 72.4, 53.9, 39.1]
-        ]
-    },
-    xAxis: {type: 'category'},
-    yAxis: {},
-    // Declare several bar series, each will be mapped
-    // to a column of dataset.source by default.
-    series: [
-        {type: 'bar'},
-        {type: 'bar'},
-        {type: 'bar'}
-    ]
-};
diff --git a/public/data/dataset-simple1.js b/public/data/dataset-simple1.js
deleted file mode 100644
index 4af4f39..0000000
--- a/public/data/dataset-simple1.js
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
-title: Dataset in Object Array
-category: 'dataset, bar'
-titleCN: 对象数组的输入格式
-difficulty: 5
-*/
-
-option = {
-    legend: {},
-    tooltip: {},
-    dataset: {
-        dimensions: ['product', '2015', '2016', '2017'],
-        source: [
-            {product: 'Matcha Latte', '2015': 43.3, '2016': 85.8, '2017': 93.7},
-            {product: 'Milk Tea', '2015': 83.1, '2016': 73.4, '2017': 55.1},
-            {product: 'Cheese Cocoa', '2015': 86.4, '2016': 65.2, '2017': 82.5},
-            {product: 'Walnut Brownie', '2015': 72.4, '2016': 53.9, '2017': 39.1}
-        ]
-    },
-    xAxis: {type: 'category'},
-    yAxis: {},
-    // Declare several bar series, each will be mapped
-    // to a column of dataset.source by default.
-    series: [
-        {type: 'bar'},
-        {type: 'bar'},
-        {type: 'bar'}
-    ]
-};
diff --git a/public/data/dynamic-data.js b/public/data/dynamic-data.js
deleted file mode 100644
index d7c9e49..0000000
--- a/public/data/dynamic-data.js
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
-title: Dynamic Data
-category: bar
-titleCN: 动态数据
-difficulty: 6
-*/
-
-option = {
-    title: {
-        text: '动态数据',
-        subtext: '纯属虚构'
-    },
-    tooltip: {
-        trigger: 'axis',
-        axisPointer: {
-            type: 'cross',
-            label: {
-                backgroundColor: '#283b56'
-            }
-        }
-    },
-    legend: {
-        data:['最新成交价', '预购队列']
-    },
-    toolbox: {
-        show: true,
-        feature: {
-            dataView: {readOnly: false},
-            restore: {},
-            saveAsImage: {}
-        }
-    },
-    dataZoom: {
-        show: false,
-        start: 0,
-        end: 100
-    },
-    xAxis: [
-        {
-            type: 'category',
-            boundaryGap: true,
-            data: (function (){
-                var now = new Date();
-                var res = [];
-                var len = 10;
-                while (len--) {
-                    res.unshift(now.toLocaleTimeString().replace(/^\D*/,''));
-                    now = new Date(now - 2000);
-                }
-                return res;
-            })()
-        },
-        {
-            type: 'category',
-            boundaryGap: true,
-            data: (function (){
-                var res = [];
-                var len = 10;
-                while (len--) {
-                    res.push(10 - len - 1);
-                }
-                return res;
-            })()
-        }
-    ],
-    yAxis: [
-        {
-            type: 'value',
-            scale: true,
-            name: '价格',
-            max: 30,
-            min: 0,
-            boundaryGap: [0.2, 0.2]
-        },
-        {
-            type: 'value',
-            scale: true,
-            name: '预购量',
-            max: 1200,
-            min: 0,
-            boundaryGap: [0.2, 0.2]
-        }
-    ],
-    series: [
-        {
-            name: '预购队列',
-            type: 'bar',
-            xAxisIndex: 1,
-            yAxisIndex: 1,
-            data: (function (){
-                var res = [];
-                var len = 10;
-                while (len--) {
-                    res.push(Math.round(Math.random() * 1000));
-                }
-                return res;
-            })()
-        },
-        {
-            name: '最新成交价',
-            type: 'line',
-            data: (function (){
-                var res = [];
-                var len = 0;
-                while (len < 10) {
-                    res.push((Math.random()*10 + 5).toFixed(1) - 0);
-                    len++;
-                }
-                return res;
-            })()
-        }
-    ]
-};
-
-app.count = 11;
-setInterval(function (){
-    var axisData = (new Date()).toLocaleTimeString().replace(/^\D*/, '');
-
-    var data0 = option.series[0].data;
-    var data1 = option.series[1].data;
-    data0.shift();
-    data0.push(Math.round(Math.random() * 1000));
-    data1.shift();
-    data1.push((Math.random() * 10 + 5).toFixed(1) - 0);
-
-    option.xAxis[0].data.shift();
-    option.xAxis[0].data.push(axisData);
-    option.xAxis[1].data.shift();
-    option.xAxis[1].data.push(app.count++);
-
-    myChart.setOption(option);
-}, 2100);
diff --git a/public/data/dynamic-data2.js b/public/data/dynamic-data2.js
deleted file mode 100644
index 23ad102..0000000
--- a/public/data/dynamic-data2.js
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
-title: Dynamic Data + Time Axis
-category: line
-titleCN: 动态数据 + 时间坐标轴
-difficulty: 5
-*/
-
-function randomData() {
-    now = new Date(+now + oneDay);
-    value = value + Math.random() * 21 - 10;
-    return {
-        name: now.toString(),
-        value: [
-            [now.getFullYear(), now.getMonth() + 1, now.getDate()].join('/'),
-            Math.round(value)
-        ]
-    };
-}
-
-var data = [];
-var now = +new Date(1997, 9, 3);
-var oneDay = 24 * 3600 * 1000;
-var value = Math.random() * 1000;
-for (var i = 0; i < 1000; i++) {
-    data.push(randomData());
-}
-
-option = {
-    title: {
-        text: '动态数据 + 时间坐标轴'
-    },
-    tooltip: {
-        trigger: 'axis',
-        formatter: function (params) {
-            params = params[0];
-            var date = new Date(params.name);
-            return date.getDate() + '/' + (date.getMonth() + 1) + '/' + date.getFullYear() + ' : ' + params.value[1];
-        },
-        axisPointer: {
-            animation: false
-        }
-    },
-    xAxis: {
-        type: 'time',
-        splitLine: {
-            show: false
-        }
-    },
-    yAxis: {
-        type: 'value',
-        boundaryGap: [0, '100%'],
-        splitLine: {
-            show: false
-        }
-    },
-    series: [{
-        name: '模拟数据',
-        type: 'line',
-        showSymbol: false,
-        hoverAnimation: false,
-        data: data
-    }]
-};
-
-setInterval(function () {
-
-    for (var i = 0; i < 5; i++) {
-        data.shift();
-        data.push(randomData());
-    }
-
-    myChart.setOption({
-        series: [{
-            data: data
-        }]
-    });
-}, 1000);
\ No newline at end of file
diff --git a/public/data/effectScatter-bmap.js b/public/data/effectScatter-bmap.js
deleted file mode 100644
index 850df19..0000000
--- a/public/data/effectScatter-bmap.js
+++ /dev/null
@@ -1,575 +0,0 @@
-/*
-title: Air Quality - Baidu Map
-category: 'scatter, map'
-tags: bmap
-titleCN: 全国主要城市空气质量 - 百度地图
-difficulty: 10
-*/
-
-var data = [
-     {name: '海门', value: 9},
-     {name: '鄂尔多斯', value: 12},
-     {name: '招远', value: 12},
-     {name: '舟山', value: 12},
-     {name: '齐齐哈尔', value: 14},
-     {name: '盐城', value: 15},
-     {name: '赤峰', value: 16},
-     {name: '青岛', value: 18},
-     {name: '乳山', value: 18},
-     {name: '金昌', value: 19},
-     {name: '泉州', value: 21},
-     {name: '莱西', value: 21},
-     {name: '日照', value: 21},
-     {name: '胶南', value: 22},
-     {name: '南通', value: 23},
-     {name: '拉萨', value: 24},
-     {name: '云浮', value: 24},
-     {name: '梅州', value: 25},
-     {name: '文登', value: 25},
-     {name: '上海', value: 25},
-     {name: '攀枝花', value: 25},
-     {name: '威海', value: 25},
-     {name: '承德', value: 25},
-     {name: '厦门', value: 26},
-     {name: '汕尾', value: 26},
-     {name: '潮州', value: 26},
-     {name: '丹东', value: 27},
-     {name: '太仓', value: 27},
-     {name: '曲靖', value: 27},
-     {name: '烟台', value: 28},
-     {name: '福州', value: 29},
-     {name: '瓦房店', value: 30},
-     {name: '即墨', value: 30},
-     {name: '抚顺', value: 31},
-     {name: '玉溪', value: 31},
-     {name: '张家口', value: 31},
-     {name: '阳泉', value: 31},
-     {name: '莱州', value: 32},
-     {name: '湖州', value: 32},
-     {name: '汕头', value: 32},
-     {name: '昆山', value: 33},
-     {name: '宁波', value: 33},
-     {name: '湛江', value: 33},
-     {name: '揭阳', value: 34},
-     {name: '荣成', value: 34},
-     {name: '连云港', value: 35},
-     {name: '葫芦岛', value: 35},
-     {name: '常熟', value: 36},
-     {name: '东莞', value: 36},
-     {name: '河源', value: 36},
-     {name: '淮安', value: 36},
-     {name: '泰州', value: 36},
-     {name: '南宁', value: 37},
-     {name: '营口', value: 37},
-     {name: '惠州', value: 37},
-     {name: '江阴', value: 37},
-     {name: '蓬莱', value: 37},
-     {name: '韶关', value: 38},
-     {name: '嘉峪关', value: 38},
-     {name: '广州', value: 38},
-     {name: '延安', value: 38},
-     {name: '太原', value: 39},
-     {name: '清远', value: 39},
-     {name: '中山', value: 39},
-     {name: '昆明', value: 39},
-     {name: '寿光', value: 40},
-     {name: '盘锦', value: 40},
-     {name: '长治', value: 41},
-     {name: '深圳', value: 41},
-     {name: '珠海', value: 42},
-     {name: '宿迁', value: 43},
-     {name: '咸阳', value: 43},
-     {name: '铜川', value: 44},
-     {name: '平度', value: 44},
-     {name: '佛山', value: 44},
-     {name: '海口', value: 44},
-     {name: '江门', value: 45},
-     {name: '章丘', value: 45},
-     {name: '肇庆', value: 46},
-     {name: '大连', value: 47},
-     {name: '临汾', value: 47},
-     {name: '吴江', value: 47},
-     {name: '石嘴山', value: 49},
-     {name: '沈阳', value: 50},
-     {name: '苏州', value: 50},
-     {name: '茂名', value: 50},
-     {name: '嘉兴', value: 51},
-     {name: '长春', value: 51},
-     {name: '胶州', value: 52},
-     {name: '银川', value: 52},
-     {name: '张家港', value: 52},
-     {name: '三门峡', value: 53},
-     {name: '锦州', value: 54},
-     {name: '南昌', value: 54},
-     {name: '柳州', value: 54},
-     {name: '三亚', value: 54},
-     {name: '自贡', value: 56},
-     {name: '吉林', value: 56},
-     {name: '阳江', value: 57},
-     {name: '泸州', value: 57},
-     {name: '西宁', value: 57},
-     {name: '宜宾', value: 58},
-     {name: '呼和浩特', value: 58},
-     {name: '成都', value: 58},
-     {name: '大同', value: 58},
-     {name: '镇江', value: 59},
-     {name: '桂林', value: 59},
-     {name: '张家界', value: 59},
-     {name: '宜兴', value: 59},
-     {name: '北海', value: 60},
-     {name: '西安', value: 61},
-     {name: '金坛', value: 62},
-     {name: '东营', value: 62},
-     {name: '牡丹江', value: 63},
-     {name: '遵义', value: 63},
-     {name: '绍兴', value: 63},
-     {name: '扬州', value: 64},
-     {name: '常州', value: 64},
-     {name: '潍坊', value: 65},
-     {name: '重庆', value: 66},
-     {name: '台州', value: 67},
-     {name: '南京', value: 67},
-     {name: '滨州', value: 70},
-     {name: '贵阳', value: 71},
-     {name: '无锡', value: 71},
-     {name: '本溪', value: 71},
-     {name: '克拉玛依', value: 72},
-     {name: '渭南', value: 72},
-     {name: '马鞍山', value: 72},
-     {name: '宝鸡', value: 72},
-     {name: '焦作', value: 75},
-     {name: '句容', value: 75},
-     {name: '北京', value: 79},
-     {name: '徐州', value: 79},
-     {name: '衡水', value: 80},
-     {name: '包头', value: 80},
-     {name: '绵阳', value: 80},
-     {name: '乌鲁木齐', value: 84},
-     {name: '枣庄', value: 84},
-     {name: '杭州', value: 84},
-     {name: '淄博', value: 85},
-     {name: '鞍山', value: 86},
-     {name: '溧阳', value: 86},
-     {name: '库尔勒', value: 86},
-     {name: '安阳', value: 90},
-     {name: '开封', value: 90},
-     {name: '济南', value: 92},
-     {name: '德阳', value: 93},
-     {name: '温州', value: 95},
-     {name: '九江', value: 96},
-     {name: '邯郸', value: 98},
-     {name: '临安', value: 99},
-     {name: '兰州', value: 99},
-     {name: '沧州', value: 100},
-     {name: '临沂', value: 103},
-     {name: '南充', value: 104},
-     {name: '天津', value: 105},
-     {name: '富阳', value: 106},
-     {name: '泰安', value: 112},
-     {name: '诸暨', value: 112},
-     {name: '郑州', value: 113},
-     {name: '哈尔滨', value: 114},
-     {name: '聊城', value: 116},
-     {name: '芜湖', value: 117},
-     {name: '唐山', value: 119},
-     {name: '平顶山', value: 119},
-     {name: '邢台', value: 119},
-     {name: '德州', value: 120},
-     {name: '济宁', value: 120},
-     {name: '荆州', value: 127},
-     {name: '宜昌', value: 130},
-     {name: '义乌', value: 132},
-     {name: '丽水', value: 133},
-     {name: '洛阳', value: 134},
-     {name: '秦皇岛', value: 136},
-     {name: '株洲', value: 143},
-     {name: '石家庄', value: 147},
-     {name: '莱芜', value: 148},
-     {name: '常德', value: 152},
-     {name: '保定', value: 153},
-     {name: '湘潭', value: 154},
-     {name: '金华', value: 157},
-     {name: '岳阳', value: 169},
-     {name: '长沙', value: 175},
-     {name: '衢州', value: 177},
-     {name: '廊坊', value: 193},
-     {name: '菏泽', value: 194},
-     {name: '合肥', value: 229},
-     {name: '武汉', value: 273},
-     {name: '大庆', value: 279}
-];
-var geoCoordMap = {
-    '海门':[121.15,31.89],
-    '鄂尔多斯':[109.781327,39.608266],
-    '招远':[120.38,37.35],
-    '舟山':[122.207216,29.985295],
-    '齐齐哈尔':[123.97,47.33],
-    '盐城':[120.13,33.38],
-    '赤峰':[118.87,42.28],
-    '青岛':[120.33,36.07],
-    '乳山':[121.52,36.89],
-    '金昌':[102.188043,38.520089],
-    '泉州':[118.58,24.93],
-    '莱西':[120.53,36.86],
-    '日照':[119.46,35.42],
-    '胶南':[119.97,35.88],
-    '南通':[121.05,32.08],
-    '拉萨':[91.11,29.97],
-    '云浮':[112.02,22.93],
-    '梅州':[116.1,24.55],
-    '文登':[122.05,37.2],
-    '上海':[121.48,31.22],
-    '攀枝花':[101.718637,26.582347],
-    '威海':[122.1,37.5],
-    '承德':[117.93,40.97],
-    '厦门':[118.1,24.46],
-    '汕尾':[115.375279,22.786211],
-    '潮州':[116.63,23.68],
-    '丹东':[124.37,40.13],
-    '太仓':[121.1,31.45],
-    '曲靖':[103.79,25.51],
-    '烟台':[121.39,37.52],
-    '福州':[119.3,26.08],
-    '瓦房店':[121.979603,39.627114],
-    '即墨':[120.45,36.38],
-    '抚顺':[123.97,41.97],
-    '玉溪':[102.52,24.35],
-    '张家口':[114.87,40.82],
-    '阳泉':[113.57,37.85],
-    '莱州':[119.942327,37.177017],
-    '湖州':[120.1,30.86],
-    '汕头':[116.69,23.39],
-    '昆山':[120.95,31.39],
-    '宁波':[121.56,29.86],
-    '湛江':[110.359377,21.270708],
-    '揭阳':[116.35,23.55],
-    '荣成':[122.41,37.16],
-    '连云港':[119.16,34.59],
-    '葫芦岛':[120.836932,40.711052],
-    '常熟':[120.74,31.64],
-    '东莞':[113.75,23.04],
-    '河源':[114.68,23.73],
-    '淮安':[119.15,33.5],
-    '泰州':[119.9,32.49],
-    '南宁':[108.33,22.84],
-    '营口':[122.18,40.65],
-    '惠州':[114.4,23.09],
-    '江阴':[120.26,31.91],
-    '蓬莱':[120.75,37.8],
-    '韶关':[113.62,24.84],
-    '嘉峪关':[98.289152,39.77313],
-    '广州':[113.23,23.16],
-    '延安':[109.47,36.6],
-    '太原':[112.53,37.87],
-    '清远':[113.01,23.7],
-    '中山':[113.38,22.52],
-    '昆明':[102.73,25.04],
-    '寿光':[118.73,36.86],
-    '盘锦':[122.070714,41.119997],
-    '长治':[113.08,36.18],
-    '深圳':[114.07,22.62],
-    '珠海':[113.52,22.3],
-    '宿迁':[118.3,33.96],
-    '咸阳':[108.72,34.36],
-    '铜川':[109.11,35.09],
-    '平度':[119.97,36.77],
-    '佛山':[113.11,23.05],
-    '海口':[110.35,20.02],
-    '江门':[113.06,22.61],
-    '章丘':[117.53,36.72],
-    '肇庆':[112.44,23.05],
-    '大连':[121.62,38.92],
-    '临汾':[111.5,36.08],
-    '吴江':[120.63,31.16],
-    '石嘴山':[106.39,39.04],
-    '沈阳':[123.38,41.8],
-    '苏州':[120.62,31.32],
-    '茂名':[110.88,21.68],
-    '嘉兴':[120.76,30.77],
-    '长春':[125.35,43.88],
-    '胶州':[120.03336,36.264622],
-    '银川':[106.27,38.47],
-    '张家港':[120.555821,31.875428],
-    '三门峡':[111.19,34.76],
-    '锦州':[121.15,41.13],
-    '南昌':[115.89,28.68],
-    '柳州':[109.4,24.33],
-    '三亚':[109.511909,18.252847],
-    '自贡':[104.778442,29.33903],
-    '吉林':[126.57,43.87],
-    '阳江':[111.95,21.85],
-    '泸州':[105.39,28.91],
-    '西宁':[101.74,36.56],
-    '宜宾':[104.56,29.77],
-    '呼和浩特':[111.65,40.82],
-    '成都':[104.06,30.67],
-    '大同':[113.3,40.12],
-    '镇江':[119.44,32.2],
-    '桂林':[110.28,25.29],
-    '张家界':[110.479191,29.117096],
-    '宜兴':[119.82,31.36],
-    '北海':[109.12,21.49],
-    '西安':[108.95,34.27],
-    '金坛':[119.56,31.74],
-    '东营':[118.49,37.46],
-    '牡丹江':[129.58,44.6],
-    '遵义':[106.9,27.7],
-    '绍兴':[120.58,30.01],
-    '扬州':[119.42,32.39],
-    '常州':[119.95,31.79],
-    '潍坊':[119.1,36.62],
-    '重庆':[106.54,29.59],
-    '台州':[121.420757,28.656386],
-    '南京':[118.78,32.04],
-    '滨州':[118.03,37.36],
-    '贵阳':[106.71,26.57],
-    '无锡':[120.29,31.59],
-    '本溪':[123.73,41.3],
-    '克拉玛依':[84.77,45.59],
-    '渭南':[109.5,34.52],
-    '马鞍山':[118.48,31.56],
-    '宝鸡':[107.15,34.38],
-    '焦作':[113.21,35.24],
-    '句容':[119.16,31.95],
-    '北京':[116.46,39.92],
-    '徐州':[117.2,34.26],
-    '衡水':[115.72,37.72],
-    '包头':[110,40.58],
-    '绵阳':[104.73,31.48],
-    '乌鲁木齐':[87.68,43.77],
-    '枣庄':[117.57,34.86],
-    '杭州':[120.19,30.26],
-    '淄博':[118.05,36.78],
-    '鞍山':[122.85,41.12],
-    '溧阳':[119.48,31.43],
-    '库尔勒':[86.06,41.68],
-    '安阳':[114.35,36.1],
-    '开封':[114.35,34.79],
-    '济南':[117,36.65],
-    '德阳':[104.37,31.13],
-    '温州':[120.65,28.01],
-    '九江':[115.97,29.71],
-    '邯郸':[114.47,36.6],
-    '临安':[119.72,30.23],
-    '兰州':[103.73,36.03],
-    '沧州':[116.83,38.33],
-    '临沂':[118.35,35.05],
-    '南充':[106.110698,30.837793],
-    '天津':[117.2,39.13],
-    '富阳':[119.95,30.07],
-    '泰安':[117.13,36.18],
-    '诸暨':[120.23,29.71],
-    '郑州':[113.65,34.76],
-    '哈尔滨':[126.63,45.75],
-    '聊城':[115.97,36.45],
-    '芜湖':[118.38,31.33],
-    '唐山':[118.02,39.63],
-    '平顶山':[113.29,33.75],
-    '邢台':[114.48,37.05],
-    '德州':[116.29,37.45],
-    '济宁':[116.59,35.38],
-    '荆州':[112.239741,30.335165],
-    '宜昌':[111.3,30.7],
-    '义乌':[120.06,29.32],
-    '丽水':[119.92,28.45],
-    '洛阳':[112.44,34.7],
-    '秦皇岛':[119.57,39.95],
-    '株洲':[113.16,27.83],
-    '石家庄':[114.48,38.03],
-    '莱芜':[117.67,36.19],
-    '常德':[111.69,29.05],
-    '保定':[115.48,38.85],
-    '湘潭':[112.91,27.87],
-    '金华':[119.64,29.12],
-    '岳阳':[113.09,29.37],
-    '长沙':[113,28.21],
-    '衢州':[118.88,28.97],
-    '廊坊':[116.7,39.53],
-    '菏泽':[115.480656,35.23375],
-    '合肥':[117.27,31.86],
-    '武汉':[114.31,30.52],
-    '大庆':[125.03,46.58]
-};
-
-var convertData = function (data) {
-    var res = [];
-    for (var i = 0; i < data.length; i++) {
-        var geoCoord = geoCoordMap[data[i].name];
-        if (geoCoord) {
-            res.push({
-                name: data[i].name,
-                value: geoCoord.concat(data[i].value)
-            });
-        }
-    }
-    return res;
-};
-
-option = {
-    title: {
-        text: '全国主要城市空气质量 - 百度地图',
-        subtext: 'data from PM25.in',
-        sublink: 'http://www.pm25.in',
-        left: 'center'
-    },
-    tooltip : {
-        trigger: 'item'
-    },
-    bmap: {
-        center: [104.114129, 37.550339],
-        zoom: 5,
-        roam: true,
-        mapStyle: {
-            styleJson: [{
-                'featureType': 'water',
-                'elementType': 'all',
-                'stylers': {
-                    'color': '#d1d1d1'
-                }
-            }, {
-                'featureType': 'land',
-                'elementType': 'all',
-                'stylers': {
-                    'color': '#f3f3f3'
-                }
-            }, {
-                'featureType': 'railway',
-                'elementType': 'all',
-                'stylers': {
-                    'visibility': 'off'
-                }
-            }, {
-                'featureType': 'highway',
-                'elementType': 'all',
-                'stylers': {
-                    'color': '#fdfdfd'
-                }
-            }, {
-                'featureType': 'highway',
-                'elementType': 'labels',
-                'stylers': {
-                    'visibility': 'off'
-                }
-            }, {
-                'featureType': 'arterial',
-                'elementType': 'geometry',
-                'stylers': {
-                    'color': '#fefefe'
-                }
-            }, {
-                'featureType': 'arterial',
-                'elementType': 'geometry.fill',
-                'stylers': {
-                    'color': '#fefefe'
-                }
-            }, {
-                'featureType': 'poi',
-                'elementType': 'all',
-                'stylers': {
-                    'visibility': 'off'
-                }
-            }, {
-                'featureType': 'green',
-                'elementType': 'all',
-                'stylers': {
-                    'visibility': 'off'
-                }
-            }, {
-                'featureType': 'subway',
-                'elementType': 'all',
-                'stylers': {
-                    'visibility': 'off'
-                }
-            }, {
-                'featureType': 'manmade',
-                'elementType': 'all',
-                'stylers': {
-                    'color': '#d1d1d1'
-                }
-            }, {
-                'featureType': 'local',
-                'elementType': 'all',
-                'stylers': {
-                    'color': '#d1d1d1'
-                }
-            }, {
-                'featureType': 'arterial',
-                'elementType': 'labels',
-                'stylers': {
-                    'visibility': 'off'
-                }
-            }, {
-                'featureType': 'boundary',
-                'elementType': 'all',
-                'stylers': {
-                    'color': '#fefefe'
-                }
-            }, {
-                'featureType': 'building',
-                'elementType': 'all',
-                'stylers': {
-                    'color': '#d1d1d1'
-                }
-            }, {
-                'featureType': 'label',
-                'elementType': 'labels.text.fill',
-                'stylers': {
-                    'color': '#999999'
-                }
-            }]
-        }
-    },
-    series : [
-        {
-            name: 'pm2.5',
-            type: 'scatter',
-            coordinateSystem: 'bmap',
-            data: convertData(data),
-            symbolSize: function (val) {
-                return val[2] / 10;
-            },
-            encode: {
-                value: 2
-            },
-            label: {
-                formatter: '{b}',
-                position: 'right',
-                show: false
-            },
-            emphasis: {
-                label: {
-                    show: true
-                }
-            }
-        },
-        {
-            name: 'Top 5',
-            type: 'effectScatter',
-            coordinateSystem: 'bmap',
-            data: convertData(data.sort(function (a, b) {
-                return b.value - a.value;
-            }).slice(0, 6)),
-            symbolSize: function (val) {
-                return val[2] / 10;
-            },
-            encode: {
-                value: 2
-            },
-            showEffectOn: 'render',
-            rippleEffect: {
-                brushType: 'stroke'
-            },
-            hoverAnimation: true,
-            label: {
-                formatter: '{b}',
-                position: 'right',
-                show: true
-            },
-            itemStyle: {
-                shadowBlur: 10,
-                shadowColor: '#333'
-            },
-            zlevel: 1
-        }
-    ]
-};
\ No newline at end of file
diff --git a/public/data/effectScatter-map.js b/public/data/effectScatter-map.js
deleted file mode 100644
index 8509c87..0000000
--- a/public/data/effectScatter-map.js
+++ /dev/null
@@ -1,503 +0,0 @@
-/*
-title: Air Quality
-category: scatter
-titleCN: 全国主要城市空气质量
-difficulty: 2
-*/
-
-var data = [
-     {name: '海门', value: 9},
-     {name: '鄂尔多斯', value: 12},
-     {name: '招远', value: 12},
-     {name: '舟山', value: 12},
-     {name: '齐齐哈尔', value: 14},
-     {name: '盐城', value: 15},
-     {name: '赤峰', value: 16},
-     {name: '青岛', value: 18},
-     {name: '乳山', value: 18},
-     {name: '金昌', value: 19},
-     {name: '泉州', value: 21},
-     {name: '莱西', value: 21},
-     {name: '日照', value: 21},
-     {name: '胶南', value: 22},
-     {name: '南通', value: 23},
-     {name: '拉萨', value: 24},
-     {name: '云浮', value: 24},
-     {name: '梅州', value: 25},
-     {name: '文登', value: 25},
-     {name: '上海', value: 25},
-     {name: '攀枝花', value: 25},
-     {name: '威海', value: 25},
-     {name: '承德', value: 25},
-     {name: '厦门', value: 26},
-     {name: '汕尾', value: 26},
-     {name: '潮州', value: 26},
-     {name: '丹东', value: 27},
-     {name: '太仓', value: 27},
-     {name: '曲靖', value: 27},
-     {name: '烟台', value: 28},
-     {name: '福州', value: 29},
-     {name: '瓦房店', value: 30},
-     {name: '即墨', value: 30},
-     {name: '抚顺', value: 31},
-     {name: '玉溪', value: 31},
-     {name: '张家口', value: 31},
-     {name: '阳泉', value: 31},
-     {name: '莱州', value: 32},
-     {name: '湖州', value: 32},
-     {name: '汕头', value: 32},
-     {name: '昆山', value: 33},
-     {name: '宁波', value: 33},
-     {name: '湛江', value: 33},
-     {name: '揭阳', value: 34},
-     {name: '荣成', value: 34},
-     {name: '连云港', value: 35},
-     {name: '葫芦岛', value: 35},
-     {name: '常熟', value: 36},
-     {name: '东莞', value: 36},
-     {name: '河源', value: 36},
-     {name: '淮安', value: 36},
-     {name: '泰州', value: 36},
-     {name: '南宁', value: 37},
-     {name: '营口', value: 37},
-     {name: '惠州', value: 37},
-     {name: '江阴', value: 37},
-     {name: '蓬莱', value: 37},
-     {name: '韶关', value: 38},
-     {name: '嘉峪关', value: 38},
-     {name: '广州', value: 38},
-     {name: '延安', value: 38},
-     {name: '太原', value: 39},
-     {name: '清远', value: 39},
-     {name: '中山', value: 39},
-     {name: '昆明', value: 39},
-     {name: '寿光', value: 40},
-     {name: '盘锦', value: 40},
-     {name: '长治', value: 41},
-     {name: '深圳', value: 41},
-     {name: '珠海', value: 42},
-     {name: '宿迁', value: 43},
-     {name: '咸阳', value: 43},
-     {name: '铜川', value: 44},
-     {name: '平度', value: 44},
-     {name: '佛山', value: 44},
-     {name: '海口', value: 44},
-     {name: '江门', value: 45},
-     {name: '章丘', value: 45},
-     {name: '肇庆', value: 46},
-     {name: '大连', value: 47},
-     {name: '临汾', value: 47},
-     {name: '吴江', value: 47},
-     {name: '石嘴山', value: 49},
-     {name: '沈阳', value: 50},
-     {name: '苏州', value: 50},
-     {name: '茂名', value: 50},
-     {name: '嘉兴', value: 51},
-     {name: '长春', value: 51},
-     {name: '胶州', value: 52},
-     {name: '银川', value: 52},
-     {name: '张家港', value: 52},
-     {name: '三门峡', value: 53},
-     {name: '锦州', value: 54},
-     {name: '南昌', value: 54},
-     {name: '柳州', value: 54},
-     {name: '三亚', value: 54},
-     {name: '自贡', value: 56},
-     {name: '吉林', value: 56},
-     {name: '阳江', value: 57},
-     {name: '泸州', value: 57},
-     {name: '西宁', value: 57},
-     {name: '宜宾', value: 58},
-     {name: '呼和浩特', value: 58},
-     {name: '成都', value: 58},
-     {name: '大同', value: 58},
-     {name: '镇江', value: 59},
-     {name: '桂林', value: 59},
-     {name: '张家界', value: 59},
-     {name: '宜兴', value: 59},
-     {name: '北海', value: 60},
-     {name: '西安', value: 61},
-     {name: '金坛', value: 62},
-     {name: '东营', value: 62},
-     {name: '牡丹江', value: 63},
-     {name: '遵义', value: 63},
-     {name: '绍兴', value: 63},
-     {name: '扬州', value: 64},
-     {name: '常州', value: 64},
-     {name: '潍坊', value: 65},
-     {name: '重庆', value: 66},
-     {name: '台州', value: 67},
-     {name: '南京', value: 67},
-     {name: '滨州', value: 70},
-     {name: '贵阳', value: 71},
-     {name: '无锡', value: 71},
-     {name: '本溪', value: 71},
-     {name: '克拉玛依', value: 72},
-     {name: '渭南', value: 72},
-     {name: '马鞍山', value: 72},
-     {name: '宝鸡', value: 72},
-     {name: '焦作', value: 75},
-     {name: '句容', value: 75},
-     {name: '北京', value: 79},
-     {name: '徐州', value: 79},
-     {name: '衡水', value: 80},
-     {name: '包头', value: 80},
-     {name: '绵阳', value: 80},
-     {name: '乌鲁木齐', value: 84},
-     {name: '枣庄', value: 84},
-     {name: '杭州', value: 84},
-     {name: '淄博', value: 85},
-     {name: '鞍山', value: 86},
-     {name: '溧阳', value: 86},
-     {name: '库尔勒', value: 86},
-     {name: '安阳', value: 90},
-     {name: '开封', value: 90},
-     {name: '济南', value: 92},
-     {name: '德阳', value: 93},
-     {name: '温州', value: 95},
-     {name: '九江', value: 96},
-     {name: '邯郸', value: 98},
-     {name: '临安', value: 99},
-     {name: '兰州', value: 99},
-     {name: '沧州', value: 100},
-     {name: '临沂', value: 103},
-     {name: '南充', value: 104},
-     {name: '天津', value: 105},
-     {name: '富阳', value: 106},
-     {name: '泰安', value: 112},
-     {name: '诸暨', value: 112},
-     {name: '郑州', value: 113},
-     {name: '哈尔滨', value: 114},
-     {name: '聊城', value: 116},
-     {name: '芜湖', value: 117},
-     {name: '唐山', value: 119},
-     {name: '平顶山', value: 119},
-     {name: '邢台', value: 119},
-     {name: '德州', value: 120},
-     {name: '济宁', value: 120},
-     {name: '荆州', value: 127},
-     {name: '宜昌', value: 130},
-     {name: '义乌', value: 132},
-     {name: '丽水', value: 133},
-     {name: '洛阳', value: 134},
-     {name: '秦皇岛', value: 136},
-     {name: '株洲', value: 143},
-     {name: '石家庄', value: 147},
-     {name: '莱芜', value: 148},
-     {name: '常德', value: 152},
-     {name: '保定', value: 153},
-     {name: '湘潭', value: 154},
-     {name: '金华', value: 157},
-     {name: '岳阳', value: 169},
-     {name: '长沙', value: 175},
-     {name: '衢州', value: 177},
-     {name: '廊坊', value: 193},
-     {name: '菏泽', value: 194},
-     {name: '合肥', value: 229},
-     {name: '武汉', value: 273},
-     {name: '大庆', value: 279}
-];
-var geoCoordMap = {
-    '海门':[121.15,31.89],
-    '鄂尔多斯':[109.781327,39.608266],
-    '招远':[120.38,37.35],
-    '舟山':[122.207216,29.985295],
-    '齐齐哈尔':[123.97,47.33],
-    '盐城':[120.13,33.38],
-    '赤峰':[118.87,42.28],
-    '青岛':[120.33,36.07],
-    '乳山':[121.52,36.89],
-    '金昌':[102.188043,38.520089],
-    '泉州':[118.58,24.93],
-    '莱西':[120.53,36.86],
-    '日照':[119.46,35.42],
-    '胶南':[119.97,35.88],
-    '南通':[121.05,32.08],
-    '拉萨':[91.11,29.97],
-    '云浮':[112.02,22.93],
-    '梅州':[116.1,24.55],
-    '文登':[122.05,37.2],
-    '上海':[121.48,31.22],
-    '攀枝花':[101.718637,26.582347],
-    '威海':[122.1,37.5],
-    '承德':[117.93,40.97],
-    '厦门':[118.1,24.46],
-    '汕尾':[115.375279,22.786211],
-    '潮州':[116.63,23.68],
-    '丹东':[124.37,40.13],
-    '太仓':[121.1,31.45],
-    '曲靖':[103.79,25.51],
-    '烟台':[121.39,37.52],
-    '福州':[119.3,26.08],
-    '瓦房店':[121.979603,39.627114],
-    '即墨':[120.45,36.38],
-    '抚顺':[123.97,41.97],
-    '玉溪':[102.52,24.35],
-    '张家口':[114.87,40.82],
-    '阳泉':[113.57,37.85],
-    '莱州':[119.942327,37.177017],
-    '湖州':[120.1,30.86],
-    '汕头':[116.69,23.39],
-    '昆山':[120.95,31.39],
-    '宁波':[121.56,29.86],
-    '湛江':[110.359377,21.270708],
-    '揭阳':[116.35,23.55],
-    '荣成':[122.41,37.16],
-    '连云港':[119.16,34.59],
-    '葫芦岛':[120.836932,40.711052],
-    '常熟':[120.74,31.64],
-    '东莞':[113.75,23.04],
-    '河源':[114.68,23.73],
-    '淮安':[119.15,33.5],
-    '泰州':[119.9,32.49],
-    '南宁':[108.33,22.84],
-    '营口':[122.18,40.65],
-    '惠州':[114.4,23.09],
-    '江阴':[120.26,31.91],
-    '蓬莱':[120.75,37.8],
-    '韶关':[113.62,24.84],
-    '嘉峪关':[98.289152,39.77313],
-    '广州':[113.23,23.16],
-    '延安':[109.47,36.6],
-    '太原':[112.53,37.87],
-    '清远':[113.01,23.7],
-    '中山':[113.38,22.52],
-    '昆明':[102.73,25.04],
-    '寿光':[118.73,36.86],
-    '盘锦':[122.070714,41.119997],
-    '长治':[113.08,36.18],
-    '深圳':[114.07,22.62],
-    '珠海':[113.52,22.3],
-    '宿迁':[118.3,33.96],
-    '咸阳':[108.72,34.36],
-    '铜川':[109.11,35.09],
-    '平度':[119.97,36.77],
-    '佛山':[113.11,23.05],
-    '海口':[110.35,20.02],
-    '江门':[113.06,22.61],
-    '章丘':[117.53,36.72],
-    '肇庆':[112.44,23.05],
-    '大连':[121.62,38.92],
-    '临汾':[111.5,36.08],
-    '吴江':[120.63,31.16],
-    '石嘴山':[106.39,39.04],
-    '沈阳':[123.38,41.8],
-    '苏州':[120.62,31.32],
-    '茂名':[110.88,21.68],
-    '嘉兴':[120.76,30.77],
-    '长春':[125.35,43.88],
-    '胶州':[120.03336,36.264622],
-    '银川':[106.27,38.47],
-    '张家港':[120.555821,31.875428],
-    '三门峡':[111.19,34.76],
-    '锦州':[121.15,41.13],
-    '南昌':[115.89,28.68],
-    '柳州':[109.4,24.33],
-    '三亚':[109.511909,18.252847],
-    '自贡':[104.778442,29.33903],
-    '吉林':[126.57,43.87],
-    '阳江':[111.95,21.85],
-    '泸州':[105.39,28.91],
-    '西宁':[101.74,36.56],
-    '宜宾':[104.56,29.77],
-    '呼和浩特':[111.65,40.82],
-    '成都':[104.06,30.67],
-    '大同':[113.3,40.12],
-    '镇江':[119.44,32.2],
-    '桂林':[110.28,25.29],
-    '张家界':[110.479191,29.117096],
-    '宜兴':[119.82,31.36],
-    '北海':[109.12,21.49],
-    '西安':[108.95,34.27],
-    '金坛':[119.56,31.74],
-    '东营':[118.49,37.46],
-    '牡丹江':[129.58,44.6],
-    '遵义':[106.9,27.7],
-    '绍兴':[120.58,30.01],
-    '扬州':[119.42,32.39],
-    '常州':[119.95,31.79],
-    '潍坊':[119.1,36.62],
-    '重庆':[106.54,29.59],
-    '台州':[121.420757,28.656386],
-    '南京':[118.78,32.04],
-    '滨州':[118.03,37.36],
-    '贵阳':[106.71,26.57],
-    '无锡':[120.29,31.59],
-    '本溪':[123.73,41.3],
-    '克拉玛依':[84.77,45.59],
-    '渭南':[109.5,34.52],
-    '马鞍山':[118.48,31.56],
-    '宝鸡':[107.15,34.38],
-    '焦作':[113.21,35.24],
-    '句容':[119.16,31.95],
-    '北京':[116.46,39.92],
-    '徐州':[117.2,34.26],
-    '衡水':[115.72,37.72],
-    '包头':[110,40.58],
-    '绵阳':[104.73,31.48],
-    '乌鲁木齐':[87.68,43.77],
-    '枣庄':[117.57,34.86],
-    '杭州':[120.19,30.26],
-    '淄博':[118.05,36.78],
-    '鞍山':[122.85,41.12],
-    '溧阳':[119.48,31.43],
-    '库尔勒':[86.06,41.68],
-    '安阳':[114.35,36.1],
-    '开封':[114.35,34.79],
-    '济南':[117,36.65],
-    '德阳':[104.37,31.13],
-    '温州':[120.65,28.01],
-    '九江':[115.97,29.71],
-    '邯郸':[114.47,36.6],
-    '临安':[119.72,30.23],
-    '兰州':[103.73,36.03],
-    '沧州':[116.83,38.33],
-    '临沂':[118.35,35.05],
-    '南充':[106.110698,30.837793],
-    '天津':[117.2,39.13],
-    '富阳':[119.95,30.07],
-    '泰安':[117.13,36.18],
-    '诸暨':[120.23,29.71],
-    '郑州':[113.65,34.76],
-    '哈尔滨':[126.63,45.75],
-    '聊城':[115.97,36.45],
-    '芜湖':[118.38,31.33],
-    '唐山':[118.02,39.63],
-    '平顶山':[113.29,33.75],
-    '邢台':[114.48,37.05],
-    '德州':[116.29,37.45],
-    '济宁':[116.59,35.38],
-    '荆州':[112.239741,30.335165],
-    '宜昌':[111.3,30.7],
-    '义乌':[120.06,29.32],
-    '丽水':[119.92,28.45],
-    '洛阳':[112.44,34.7],
-    '秦皇岛':[119.57,39.95],
-    '株洲':[113.16,27.83],
-    '石家庄':[114.48,38.03],
-    '莱芜':[117.67,36.19],
-    '常德':[111.69,29.05],
-    '保定':[115.48,38.85],
-    '湘潭':[112.91,27.87],
-    '金华':[119.64,29.12],
-    '岳阳':[113.09,29.37],
-    '长沙':[113,28.21],
-    '衢州':[118.88,28.97],
-    '廊坊':[116.7,39.53],
-    '菏泽':[115.480656,35.23375],
-    '合肥':[117.27,31.86],
-    '武汉':[114.31,30.52],
-    '大庆':[125.03,46.58]
-};
-
-var convertData = function (data) {
-    var res = [];
-    for (var i = 0; i < data.length; i++) {
-        var geoCoord = geoCoordMap[data[i].name];
-        if (geoCoord) {
-            res.push({
-                name: data[i].name,
-                value: geoCoord.concat(data[i].value)
-            });
-        }
-    }
-    return res;
-};
-
-option = {
-    backgroundColor: '#404a59',
-    title: {
-        text: '全国主要城市空气质量',
-        subtext: 'data from PM25.in',
-        sublink: 'http://www.pm25.in',
-        left: 'center',
-        textStyle: {
-            color: '#fff'
-        }
-    },
-    tooltip : {
-        trigger: 'item'
-    },
-    legend: {
-        orient: 'vertical',
-        top: 'bottom',
-        left: 'right',
-        data:['pm2.5'],
-        textStyle: {
-            color: '#fff'
-        }
-    },
-    geo: {
-        map: 'china',
-        roam: true,
-        label: {
-            show: false
-        },
-        itemStyle: {
-            areaColor: '#323c48',
-            borderColor: '#111'
-        },
-        emphasis: {
-            itemStyle: {
-                areaColor: '#2a333d'
-            }
-        }
-    },
-    series : [
-        {
-            name: 'pm2.5',
-            type: 'scatter',
-            coordinateSystem: 'geo',
-            data: convertData(data),
-            encode: {
-                value: 2
-            },
-            symbolSize: function (val) {
-                return val[2] / 10;
-            },
-            label: {
-                formatter: '{b}',
-                position: 'right',
-                show: false
-            },
-            itemStyle: {
-                color: '#ddb926'
-            },
-            emphasis: {
-                label: {
-                    show: true
-                }
-            }
-        },
-        {
-            name: 'Top 5',
-            type: 'effectScatter',
-            coordinateSystem: 'geo',
-            data: convertData(data.sort(function (a, b) {
-                return b.value - a.value;
-            }).slice(0, 6)),
-            encode: {
-                value: 2
-            },
-            symbolSize: function (val) {
-                return val[2] / 10;
-            },
-            showEffectOn: 'render',
-            rippleEffect: {
-                brushType: 'stroke'
-            },
-            hoverAnimation: true,
-            label: {
-                formatter: '{b}',
-                position: 'right',
-                show: true
-            },
-            itemStyle: {
-                color: '#f4e925',
-                shadowBlur: 10,
-                shadowColor: '#333'
-            },
-            zlevel: 1
-        }
-    ]
-};
\ No newline at end of file
diff --git a/public/data/funnel-align.js b/public/data/funnel-align.js
deleted file mode 100644
index 6c84bf8..0000000
--- a/public/data/funnel-align.js
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
-title: Funnel (align)
-category: funnel
-titleCN: 漏斗图(对比)
-*/
-
-option = {
-    title: {
-        text: '漏斗图(对比)',
-        subtext: '纯属虚构',
-        left: 'left',
-        top: 'bottom'
-    },
-    tooltip: {
-        trigger: 'item',
-        formatter: '{a} <br/>{b} : {c}%'
-    },
-    toolbox: {
-        show: true,
-        orient: 'vertical',
-        top: 'center',
-        feature: {
-            dataView: {readOnly: false},
-            restore: {},
-            saveAsImage: {}
-        }
-    },
-    legend: {
-        orient: 'vertical',
-        left: 'left',
-        data: ['产品A', '产品B', '产品C', '产品D', '产品E']
-    },
-
-    series: [
-        {
-            name: '漏斗图',
-            type: 'funnel',
-            width: '40%',
-            height: '45%',
-            left: '5%',
-            top: '50%',
-            funnelAlign: 'right',
-
-            center: ['25%', '25%'],  // for pie
-
-            data: [
-                {value: 60, name: '产品C'},
-                {value: 30, name: '产品D'},
-                {value: 10, name: '产品E'},
-                {value: 80, name: '产品B'},
-                {value: 100, name: '产品A'}
-            ]
-        },
-        {
-            name: '金字塔',
-            type: 'funnel',
-            width: '40%',
-            height: '45%',
-            left: '5%',
-            top: '5%',
-            sort: 'ascending',
-            funnelAlign: 'right',
-
-            center: ['25%', '75%'],  // for pie
-
-            data: [
-                {value: 60, name: '产品C'},
-                {value: 30, name: '产品D'},
-                {value: 10, name: '产品E'},
-                {value: 80, name: '产品B'},
-                {value: 100, name: '产品A'}
-            ]
-        },
-        {
-            name: '漏斗图',
-            type: 'funnel',
-            width: '40%',
-            height: '45%',
-            left: '55%',
-            top: '5%',
-            funnelAlign: 'left',
-
-            center: ['75%', '25%'],  // for pie
-
-            data: [
-                {value: 60, name: '产品C'},
-                {value: 30, name: '产品D'},
-                {value: 10, name: '产品E'},
-                {value: 80, name: '产品B'},
-                {value: 100, name: '产品A'}
-            ]
-        },
-        {
-            name: '金字塔',
-            type: 'funnel',
-            width: '40%',
-            height: '45%',
-            left: '55%',
-            top: '50%',
-            sort: 'ascending',
-            funnelAlign: 'left',
-
-            center: ['75%', '75%'],  // for pie
-
-            data: [
-                {value: 60, name: '产品C'},
-                {value: 30, name: '产品D'},
-                {value: 10, name: '产品E'},
-                {value: 80, name: '产品B'},
-                {value: 100, name: '产品A'}
-            ]
-        }
-    ]
-};
diff --git a/public/data/funnel-customize.js b/public/data/funnel-customize.js
deleted file mode 100644
index 38d49f9..0000000
--- a/public/data/funnel-customize.js
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
-title: Customized Funnel
-category: funnel
-titleCN: 漏斗图
-*/
-
-option = {
-    title: {
-        text: '漏斗图',
-        subtext: '纯属虚构'
-    },
-    tooltip: {
-        trigger: 'item',
-        formatter: "{a} <br/>{b} : {c}%"
-    },
-    toolbox: {
-        feature: {
-            dataView: {readOnly: false},
-            restore: {},
-            saveAsImage: {}
-        }
-    },
-    legend: {
-        data: ['展现','点击','访问','咨询','订单']
-    },
-    series: [
-        {
-            name: '预期',
-            type: 'funnel',
-            left: '10%',
-            width: '80%',
-            label: {
-                formatter: '{b}预期'
-            },
-            labelLine: {
-                show: false
-            },
-            itemStyle: {
-                opacity: 0.7
-            },
-            emphasis: {
-                label: {
-                    position: 'inside',
-                    formatter: '{b}预期: {c}%'
-                }
-            },
-            data: [
-                {value: 60, name: '访问'},
-                {value: 40, name: '咨询'},
-                {value: 20, name: '订单'},
-                {value: 80, name: '点击'},
-                {value: 100, name: '展现'}
-            ]
-        },
-        {
-            name: '实际',
-            type: 'funnel',
-            left: '10%',
-            width: '80%',
-            maxSize: '80%',
-            label: {
-                position: 'inside',
-                formatter: '{c}%',
-                color: '#fff'
-            },
-            itemStyle: {
-                opacity: 0.5,
-                borderColor: '#fff',
-                borderWidth: 2
-            },
-            emphasis: {
-                label: {
-                    position: 'inside',
-                    formatter: '{b}实际: {c}%'
-                }
-            },
-            data: [
-                {value: 30, name: '访问'},
-                {value: 10, name: '咨询'},
-                {value: 5, name: '订单'},
-                {value: 50, name: '点击'},
-                {value: 80, name: '展现'}
-            ],
-            // Ensure outer shape will not be over inner shape when hover.
-            z: 100
-        }
-    ]
-};
diff --git a/public/data/funnel-mutiple.js b/public/data/funnel-mutiple.js
deleted file mode 100644
index eeb802d..0000000
--- a/public/data/funnel-mutiple.js
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
-title: Multiple Funnels
-category: funnel
-titleCN: 漏斗图
-*/
-
-option = {
-    title: {
-        text: '漏斗图',
-        subtext: '纯属虚构',
-        left: 'left',
-        top: 'bottom'
-    },
-    tooltip: {
-        trigger: 'item',
-        formatter: '{a} <br/>{b} : {c}%'
-    },
-    toolbox: {
-        orient: 'vertical',
-        top: 'center',
-        feature: {
-            dataView: {readOnly: false},
-            restore: {},
-            saveAsImage: {}
-        }
-    },
-    legend: {
-        orient: 'vertical',
-        left: 'left',
-        data: ['展现', '点击', '访问', '咨询', '订单']
-    },
-
-    series: [
-        {
-            name: '漏斗图',
-            type: 'funnel',
-            width: '40%',
-            height: '45%',
-            left: '5%',
-            top: '50%',
-            data: [
-                {value: 60, name: '访问'},
-                {value: 30, name: '咨询'},
-                {value: 10, name: '订单'},
-                {value: 80, name: '点击'},
-                {value: 100, name: '展现'}
-            ]
-        },
-        {
-            name: '金字塔',
-            type: 'funnel',
-            width: '40%',
-            height: '45%',
-            left: '5%',
-            top: '5%',
-            sort: 'ascending',
-            data: [
-                {value: 60, name: '访问'},
-                {value: 30, name: '咨询'},
-                {value: 10, name: '订单'},
... 20132 lines suppressed ...

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@echarts.apache.org
For additional commands, e-mail: commits-help@echarts.apache.org


[echarts-examples] 08/15: add ts flag

Posted by sh...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

shenyi pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/echarts-examples.git

commit 8eb05c1952a88afb23cd1b528e6d53cee53c2698
Author: pissang <bm...@gmail.com>
AuthorDate: Tue Sep 7 16:29:56 2021 +0800

    add ts flag
---
 src/common/i18n.js          |   6 +-
 src/common/store.js         |  17 ++-
 src/data/chart-list-data.js | 327 +++++++++++++++++++++++++++++++++++++++-----
 src/editor/Editor.vue       |  30 +++-
 src/editor/Preview.vue      |  16 +--
 tool/build-example.js       |   9 +-
 6 files changed, 356 insertions(+), 49 deletions(-)

diff --git a/src/common/i18n.js b/src/common/i18n.js
index 8bb0e56..097aa08 100644
--- a/src/common/i18n.js
+++ b/src/common/i18n.js
@@ -25,7 +25,8 @@ export default {
 
       tooltip: {
         jsMode: 'JavaScript',
-        tsMode: 'TypeScript. Provides Better Intelligent'
+        tsMode: 'TypeScript. Provides Better Intelligent',
+        noTs: 'No Available TypeScript Code'
       },
 
       codeChangedConfirm:
@@ -102,7 +103,8 @@ export default {
 
       tooltip: {
         jsMode: 'JavaScript 代码编辑',
-        tsMode: 'TypeScript 代码编辑,提供更好的代码补全和类型检查。'
+        tsMode: 'TypeScript 代码编辑,提供更好的代码补全和类型检查',
+        noTs: '该示例暂无 TypeScript 版本'
       },
 
       codeChangedConfirm: '已经修改过的代码将会丢失,是否确认继续?',
diff --git a/src/common/store.js b/src/common/store.js
index af35246..6dbb3ee 100644
--- a/src/common/store.js
+++ b/src/common/store.js
@@ -1,5 +1,7 @@
 // import * as matter from 'gray-matter';
 import { URL_PARAMS } from '../common/config';
+import CHART_LIST from '../data/chart-list-data';
+import CHART_LIST_GL from '../data/chart-list-data-gl';
 
 export const store = {
   cdnRoot: '',
@@ -10,7 +12,8 @@ export const store = {
   enableDecal: 'decal' in URL_PARAMS,
   renderer: URL_PARAMS.renderer || 'canvas',
 
-  typeCheck: (URL_PARAMS.lang || '').toLowerCase() === 'ts',
+  typeCheck:
+    getExampleConfig().ts && (URL_PARAMS.lang || '').toLowerCase() === 'ts',
   useDirtyRect: 'useDirtyRect' in URL_PARAMS,
 
   runCode: '',
@@ -26,6 +29,18 @@ export const store = {
   }
 };
 
+function findExample(item) {
+  return URL_PARAMS.c === item.id;
+}
+export function getExampleConfig() {
+  const example = CHART_LIST.concat(CHART_LIST_GL).find(findExample);
+  return example;
+}
+
+export function isGLExample() {
+  return CHART_LIST_GL.find(findExample);
+}
+
 export function loadExampleCode() {
   return new Promise((resolve) => {
     const glFolder = URL_PARAMS.gl ? 'gl/' : '';
diff --git a/src/data/chart-list-data.js b/src/data/chart-list-data.js
index 2418a66..3581bc4 100644
--- a/src/data/chart-list-data.js
+++ b/src/data/chart-list-data.js
@@ -7,6 +7,7 @@ export default [
       "bar"
     ],
     "id": "bar-background",
+    "ts": true,
     "tags": [],
     "title": "Bar with Background",
     "titleCN": "带背景色的柱状图",
@@ -17,6 +18,7 @@ export default [
       "custom"
     ],
     "id": "bar-histogram",
+    "ts": true,
     "tags": [],
     "title": "Histogram with Custom Series",
     "titleCN": "直方图(自定义系列)",
@@ -27,6 +29,7 @@ export default [
       "bar"
     ],
     "id": "bar-simple",
+    "ts": true,
     "tags": [],
     "title": "Basic Bar",
     "titleCN": "基础柱状图",
@@ -37,6 +40,7 @@ export default [
       "bar"
     ],
     "id": "bar-tick-align",
+    "ts": true,
     "tags": [],
     "title": "Axis Align with Tick",
     "titleCN": "坐标轴刻度与标签对齐",
@@ -47,6 +51,7 @@ export default [
       "calendar"
     ],
     "id": "calendar-simple",
+    "ts": true,
     "tags": [],
     "title": "Simple Calendar",
     "titleCN": "基础日历图",
@@ -57,6 +62,7 @@ export default [
       "candlestick"
     ],
     "id": "candlestick-simple",
+    "ts": true,
     "tags": [],
     "title": "Basic Candlestick",
     "titleCN": "基础 K 线图",
@@ -69,6 +75,7 @@ export default [
       "transform"
     ],
     "id": "data-transform-sort-bar",
+    "ts": true,
     "tags": [],
     "title": "Sort Data in Bar Chart",
     "titleCN": "柱状图排序",
@@ -79,6 +86,7 @@ export default [
       "heatmap"
     ],
     "id": "heatmap-cartesian",
+    "ts": true,
     "tags": [],
     "title": "Heatmap on Cartesian",
     "titleCN": "笛卡尔坐标系上的热力图",
@@ -89,6 +97,7 @@ export default [
       "line"
     ],
     "id": "line-simple",
+    "ts": true,
     "tags": [],
     "title": "Basic Line Chart",
     "titleCN": "基础折线图",
@@ -99,6 +108,7 @@ export default [
       "line"
     ],
     "id": "line-smooth",
+    "ts": true,
     "tags": [],
     "title": "Smoothed Line Chart",
     "titleCN": "基础平滑折线图",
@@ -109,9 +119,10 @@ export default [
       "pie"
     ],
     "id": "pie-simple",
+    "ts": true,
     "tags": [],
-    "title": "Referer of a website",
-    "titleCN": "某站点用户访问来源",
+    "title": "Referer of a Website",
+    "titleCN": "某站点用户Access From",
     "difficulty": 0
   },
   {
@@ -119,6 +130,7 @@ export default [
       "radar"
     ],
     "id": "radar",
+    "ts": true,
     "tags": [],
     "title": "Basic Radar Chart",
     "titleCN": "基础雷达图",
@@ -129,6 +141,7 @@ export default [
       "sankey"
     ],
     "id": "sankey-simple",
+    "ts": true,
     "tags": [],
     "title": "Basic Sankey",
     "titleCN": "基础桑基图",
@@ -139,6 +152,7 @@ export default [
       "scatter"
     ],
     "id": "scatter-simple",
+    "ts": true,
     "tags": [],
     "title": "Basic Scatter Chart",
     "titleCN": "基础散点图",
@@ -149,6 +163,7 @@ export default [
       "line"
     ],
     "id": "area-basic",
+    "ts": true,
     "tags": [],
     "title": "Basic area chart",
     "titleCN": "基础面积图",
@@ -159,6 +174,7 @@ export default [
       "bar"
     ],
     "id": "bar-data-color",
+    "ts": true,
     "tags": [],
     "title": "Set Style of Single Bar.",
     "titleCN": "自定义单个柱子颜色",
@@ -169,6 +185,7 @@ export default [
       "bar"
     ],
     "id": "bar-waterfall",
+    "ts": true,
     "tags": [],
     "title": "Waterfall Chart",
     "titleCN": "瀑布图(柱状图模拟)",
@@ -180,6 +197,7 @@ export default [
       "heatmap"
     ],
     "id": "calendar-heatmap",
+    "ts": true,
     "tags": [],
     "title": "Calendar Heatmap",
     "titleCN": "日历热力图",
@@ -191,6 +209,7 @@ export default [
       "heatmap"
     ],
     "id": "calendar-vertical",
+    "ts": true,
     "tags": [],
     "title": "Calendar Heatmap Vertical",
     "titleCN": "纵向日历图",
@@ -201,6 +220,7 @@ export default [
       "candlestick"
     ],
     "id": "custom-ohlc",
+    "ts": false,
     "tags": [],
     "title": "OHLC Chart",
     "titleCN": "OHLC 图(使用自定义系列)",
@@ -211,6 +231,7 @@ export default [
       "custom"
     ],
     "id": "custom-profit",
+    "ts": false,
     "tags": [],
     "title": "Profit",
     "titleCN": "利润分布直方图",
@@ -222,6 +243,7 @@ export default [
       "bar"
     ],
     "id": "dataset-encode0",
+    "ts": true,
     "tags": [],
     "title": "Simple Encode",
     "titleCN": "指定数据到坐标轴的映射",
@@ -232,6 +254,7 @@ export default [
       "gauge"
     ],
     "id": "gauge",
+    "ts": true,
     "tags": [],
     "title": "Gauge Basic chart",
     "titleCN": "基础仪表盘",
@@ -242,6 +265,7 @@ export default [
       "gauge"
     ],
     "id": "gauge-simple",
+    "ts": true,
     "tags": [],
     "title": "Simple Gauge",
     "titleCN": "带标签数字动画的基础仪表盘",
@@ -252,6 +276,7 @@ export default [
       "graph"
     ],
     "id": "graph-force2",
+    "ts": true,
     "tags": [],
     "title": "Force Layout",
     "titleCN": "力引导布局",
@@ -262,6 +287,7 @@ export default [
       "line"
     ],
     "id": "line-stack",
+    "ts": true,
     "tags": [],
     "title": "Stacked Line Chart",
     "titleCN": "折线图堆叠",
@@ -272,6 +298,7 @@ export default [
       "parallel"
     ],
     "id": "parallel-simple",
+    "ts": true,
     "tags": [],
     "title": "Basic Parallel",
     "titleCN": "基础平行坐标",
@@ -282,6 +309,7 @@ export default [
       "pie"
     ],
     "id": "pie-borderRadius",
+    "ts": true,
     "tags": [],
     "title": "Doughnut Chart with Rounded Corner",
     "titleCN": "圆角环形图",
@@ -292,6 +320,7 @@ export default [
       "pie"
     ],
     "id": "pie-doughnut",
+    "ts": true,
     "tags": [],
     "title": "Doughnut Chart",
     "titleCN": "环形图",
@@ -302,6 +331,7 @@ export default [
       "radar"
     ],
     "id": "radar-aqi",
+    "ts": true,
     "tags": [],
     "title": "AQI - Radar Chart",
     "titleCN": "AQI - 雷达图",
@@ -312,6 +342,7 @@ export default [
       "sankey"
     ],
     "id": "sankey-vertical",
+    "ts": true,
     "tags": [],
     "title": "Sankey Orient Vertical",
     "titleCN": "垂直方向的桑基图",
@@ -322,6 +353,7 @@ export default [
       "scatter"
     ],
     "id": "scatter-anscombe-quartet",
+    "ts": true,
     "tags": [],
     "title": "Anscomb's quartet",
     "titleCN": "Anscomb's quartet",
@@ -332,6 +364,7 @@ export default [
       "scatter"
     ],
     "id": "scatter-clustering",
+    "ts": true,
     "tags": [],
     "title": "Clustering Process",
     "titleCN": "数据聚合",
@@ -342,6 +375,7 @@ export default [
       "scatter"
     ],
     "id": "scatter-clustering-process",
+    "ts": false,
     "tags": [],
     "title": "Clustering Process",
     "titleCN": "聚合过程可视化",
@@ -352,6 +386,7 @@ export default [
       "scatter"
     ],
     "id": "scatter-exponential-regression",
+    "ts": true,
     "tags": [],
     "title": "Exponential Regression",
     "titleCN": "指数回归(使用统计插件)",
@@ -362,6 +397,7 @@ export default [
       "sunburst"
     ],
     "id": "sunburst-simple",
+    "ts": true,
     "tags": [],
     "title": "Basic Sunburst",
     "titleCN": "基础旭日图",
@@ -372,8 +408,9 @@ export default [
       "line"
     ],
     "id": "area-stack",
+    "ts": true,
     "tags": [],
-    "title": "Stacked area chart",
+    "title": "Stacked Area Chart",
     "titleCN": "堆叠面积图",
     "difficulty": 2
   },
@@ -382,8 +419,9 @@ export default [
       "line"
     ],
     "id": "area-stack-gradient",
+    "ts": true,
     "tags": [],
-    "title": "Gradient Stacked area chart",
+    "title": "Gradient Stacked Area Chart",
     "titleCN": "渐变堆叠面积图",
     "difficulty": 2
   },
@@ -392,6 +430,7 @@ export default [
       "bar"
     ],
     "id": "bar-negative2",
+    "ts": true,
     "tags": [],
     "title": "Bar Chart with Negative Value",
     "titleCN": "交错正负轴标签",
@@ -401,9 +440,32 @@ export default [
     "category": [
       "bar"
     ],
+    "id": "bar-polar-label-radial",
+    "ts": true,
+    "tags": [],
+    "title": "Radial Polar Bar Label Position",
+    "titleCN": "极坐标柱状图标签",
+    "difficulty": 2
+  },
+  {
+    "category": [
+      "bar"
+    ],
+    "id": "bar-polar-label-tangential",
+    "ts": true,
+    "tags": [],
+    "title": "Tangential Polar Bar Label Position",
+    "titleCN": "极坐标柱状图标签",
+    "difficulty": 2
+  },
+  {
+    "category": [
+      "bar"
+    ],
     "id": "bar-y-category",
+    "ts": true,
     "tags": [],
-    "title": "World Total Population",
+    "title": "World Population",
     "titleCN": "世界人口总量 - 条形图",
     "difficulty": 2
   },
@@ -412,6 +474,7 @@ export default [
       "calendar"
     ],
     "id": "calendar-horizontal",
+    "ts": true,
     "tags": [],
     "title": "Calendar Heatmap Horizontal",
     "titleCN": "横向日历图",
@@ -422,6 +485,7 @@ export default [
       "candlestick"
     ],
     "id": "candlestick-sh",
+    "ts": true,
     "tags": [],
     "title": "ShangHai Index",
     "titleCN": "上证指数",
@@ -433,6 +497,7 @@ export default [
       "dataZoom"
     ],
     "id": "custom-error-scatter",
+    "ts": false,
     "tags": [],
     "title": "Error Scatter on Catesian",
     "titleCN": "使用自定系列给散点图添加误差范围",
@@ -443,6 +508,7 @@ export default [
       "scatter"
     ],
     "id": "effectScatter-map",
+    "ts": true,
     "tags": [],
     "title": "Air Quality",
     "titleCN": "全国主要城市空气质量",
@@ -453,6 +519,7 @@ export default [
       "gauge"
     ],
     "id": "gauge-speed",
+    "ts": true,
     "tags": [],
     "title": "Speed Gauge",
     "titleCN": "速度仪表盘",
@@ -463,6 +530,7 @@ export default [
       "graph"
     ],
     "id": "graph-grid",
+    "ts": true,
     "tags": [],
     "title": "Graph on Cartesian",
     "titleCN": "笛卡尔坐标系上的 Graph",
@@ -473,6 +541,7 @@ export default [
       "graph"
     ],
     "id": "graph-simple",
+    "ts": true,
     "tags": [],
     "title": "Simple Graph",
     "titleCN": "Graph 简单示例",
@@ -483,6 +552,7 @@ export default [
       "heatmap"
     ],
     "id": "heatmap-large",
+    "ts": false,
     "tags": [],
     "title": "Heatmap - 2w data",
     "titleCN": "热力图 - 2w 数据",
@@ -493,6 +563,7 @@ export default [
       "heatmap"
     ],
     "id": "heatmap-large-piecewise",
+    "ts": false,
     "tags": [],
     "title": "Heatmap - Discrete Mapping of Color",
     "titleCN": "热力图 - 颜色的离散映射",
@@ -503,8 +574,9 @@ export default [
       "line"
     ],
     "id": "line-marker",
+    "ts": true,
     "tags": [],
-    "title": "Temperature Change in the coming week",
+    "title": "Temperature Change in the Coming Week",
     "titleCN": "未来一周气温变化",
     "difficulty": 2
   },
@@ -513,6 +585,7 @@ export default [
       "parallel"
     ],
     "id": "parallel-aqi",
+    "ts": true,
     "tags": [],
     "title": "Parallel Aqi",
     "titleCN": "AQI 分布(平行坐标)",
@@ -523,6 +596,7 @@ export default [
       "pie"
     ],
     "id": "pie-custom",
+    "ts": true,
     "tags": [],
     "title": "Customized Pie",
     "titleCN": "饼图自定义样式",
@@ -533,6 +607,7 @@ export default [
       "pie"
     ],
     "id": "pie-pattern",
+    "ts": true,
     "tags": [],
     "title": "Texture on Pie Chart",
     "titleCN": "饼图纹理",
@@ -543,8 +618,9 @@ export default [
       "pie"
     ],
     "id": "pie-roseType",
+    "ts": true,
     "tags": [],
-    "title": "Nightingale's Rose Diagram",
+    "title": "Nightingale Chart",
     "titleCN": "南丁格尔玫瑰图",
     "difficulty": 2
   },
@@ -553,8 +629,9 @@ export default [
       "pie"
     ],
     "id": "pie-roseType-simple",
+    "ts": true,
     "tags": [],
-    "title": "Nightingale's Rose Diagram",
+    "title": "Nightingale Chart",
     "titleCN": "基础南丁格尔玫瑰图",
     "difficulty": 2
   },
@@ -563,6 +640,7 @@ export default [
       "radar"
     ],
     "id": "radar-custom",
+    "ts": true,
     "tags": [],
     "title": "Customized Radar Chart",
     "titleCN": "自定义雷达图",
@@ -573,6 +651,7 @@ export default [
       "sankey"
     ],
     "id": "sankey-itemstyle",
+    "ts": true,
     "tags": [],
     "title": "Specify ItemStyle for Each Node in Sankey",
     "titleCN": "桑基图节点自定义样式",
@@ -583,6 +662,7 @@ export default [
       "sankey"
     ],
     "id": "sankey-levels",
+    "ts": true,
     "tags": [],
     "title": "Sankey with Levels Setting",
     "titleCN": "桑基图层级自定义样式",
@@ -593,6 +673,7 @@ export default [
       "scatter"
     ],
     "id": "scatter-effect",
+    "ts": true,
     "tags": [],
     "title": "Effect Scatter Chart",
     "titleCN": "涟漪特效散点图",
@@ -603,6 +684,7 @@ export default [
       "scatter"
     ],
     "id": "scatter-linear-regression",
+    "ts": true,
     "tags": [],
     "title": "Linear Regression",
     "titleCN": "线性回归(使用统计插件)",
@@ -613,6 +695,7 @@ export default [
       "scatter"
     ],
     "id": "scatter-polynomial-regression",
+    "ts": true,
     "tags": [],
     "title": "Polynomial Regression",
     "titleCN": "多项式回归(使用统计插件)",
@@ -623,6 +706,7 @@ export default [
       "sunburst"
     ],
     "id": "sunburst-borderRadius",
+    "ts": true,
     "tags": [],
     "title": "Sunburst with Rounded Corner",
     "titleCN": "圆角旭日图",
@@ -633,6 +717,7 @@ export default [
       "sunburst"
     ],
     "id": "sunburst-label-rotate",
+    "ts": true,
     "tags": [],
     "title": "Sunburst Label Rotate",
     "titleCN": "旭日图标签旋转",
@@ -644,6 +729,7 @@ export default [
       "visualMap"
     ],
     "id": "area-pieces",
+    "ts": true,
     "tags": [],
     "title": "Area Pieces",
     "titleCN": "折线图区域高亮",
@@ -654,6 +740,7 @@ export default [
       "bar"
     ],
     "id": "bar-gradient",
+    "ts": true,
     "tags": [],
     "title": "Clickable Column Chart with Gradient",
     "titleCN": "特性示例:渐变色 阴影 点击缩放",
@@ -664,6 +751,7 @@ export default [
       "bar"
     ],
     "id": "bar-label-rotation",
+    "ts": true,
     "tags": [],
     "title": "Bar Label Rotation",
     "titleCN": "柱状图标签旋转",
@@ -674,6 +762,7 @@ export default [
       "bar"
     ],
     "id": "bar-stack",
+    "ts": true,
     "tags": [],
     "title": "Stacked Column Chart",
     "titleCN": "堆叠柱状图",
@@ -684,6 +773,7 @@ export default [
       "bar"
     ],
     "id": "bar-waterfall2",
+    "ts": true,
     "tags": [],
     "title": "Waterfall Chart",
     "titleCN": "阶梯瀑布图(柱状图模拟)",
@@ -694,6 +784,7 @@ export default [
       "bar"
     ],
     "id": "bar-y-category-stack",
+    "ts": true,
     "tags": [],
     "title": "Stacked Horizontal Bar",
     "titleCN": "堆叠条形图",
@@ -704,6 +795,7 @@ export default [
       "candlestick"
     ],
     "id": "candlestick-large",
+    "ts": true,
     "tags": [],
     "title": "Large Scale Candlestick",
     "titleCN": "大数据量K线图",
@@ -714,6 +806,7 @@ export default [
       "custom"
     ],
     "id": "custom-bar-trend",
+    "ts": true,
     "tags": [],
     "title": "Custom Bar Trend",
     "titleCN": "使用自定义系列添加柱状图趋势",
@@ -724,6 +817,7 @@ export default [
       "custom"
     ],
     "id": "custom-cartesian-polygon",
+    "ts": false,
     "tags": [],
     "title": "Custom Cartesian Polygon",
     "titleCN": "自定义多边形图",
@@ -734,6 +828,7 @@ export default [
       "custom"
     ],
     "id": "custom-error-bar",
+    "ts": false,
     "tags": [],
     "title": "Error Bar on Catesian",
     "titleCN": "使用自定系列给柱状图添加误差范围",
@@ -744,6 +839,7 @@ export default [
       "custom"
     ],
     "id": "custom-profile",
+    "ts": false,
     "tags": [],
     "title": "Profile",
     "titleCN": "性能分析图",
@@ -754,6 +850,7 @@ export default [
       "custom"
     ],
     "id": "cycle-plot",
+    "ts": false,
     "tags": [],
     "title": "Cycle Plot",
     "titleCN": "Cycle Plot",
@@ -764,6 +861,7 @@ export default [
       "line"
     ],
     "id": "data-transform-filter",
+    "ts": true,
     "tags": [],
     "title": "Data Transform Fitler",
     "titleCN": "数据过滤",
@@ -776,6 +874,7 @@ export default [
       "transform"
     ],
     "id": "data-transform-multiple-pie",
+    "ts": true,
     "tags": [],
     "title": "Partition Data to Pies",
     "titleCN": "分割数据到数个饼图",
@@ -787,6 +886,7 @@ export default [
       "pie"
     ],
     "id": "dataset-default",
+    "ts": true,
     "tags": [],
     "title": "Default arrangement",
     "titleCN": "默认 encode 设置",
@@ -797,6 +897,7 @@ export default [
       "dataset"
     ],
     "id": "dataset-encode1",
+    "ts": true,
     "tags": [],
     "title": "Encode and Matrix",
     "titleCN": "指定数据到坐标轴的映射",
@@ -807,6 +908,7 @@ export default [
       "gauge"
     ],
     "id": "gauge-progress",
+    "ts": true,
     "tags": [],
     "title": "Grogress Gauge",
     "titleCN": "进度仪表盘",
@@ -817,6 +919,7 @@ export default [
       "gauge"
     ],
     "id": "gauge-stage",
+    "ts": true,
     "tags": [],
     "title": "Stage Speed Gauge",
     "titleCN": "阶段速度仪表盘",
@@ -827,6 +930,7 @@ export default [
       "graph"
     ],
     "id": "graph-force",
+    "ts": true,
     "tags": [],
     "title": "Force Layout",
     "titleCN": "力引导布局",
@@ -837,6 +941,7 @@ export default [
       "graph"
     ],
     "id": "graph-label-overlap",
+    "ts": true,
     "tags": [],
     "title": "Hide Overlapped Label",
     "titleCN": "关系图自动隐藏重叠标签",
@@ -847,6 +952,7 @@ export default [
       "heatmap"
     ],
     "id": "heatmap-bmap",
+    "ts": false,
     "tags": [
       "bmap"
     ],
@@ -859,6 +965,7 @@ export default [
       "heatmap"
     ],
     "id": "heatmap-map",
+    "ts": false,
     "tags": [],
     "title": "Air Qulity",
     "titleCN": "全国主要城市空气质量",
@@ -869,6 +976,7 @@ export default [
       "line"
     ],
     "id": "line-gradient",
+    "ts": true,
     "tags": [],
     "title": "Line Gradient",
     "titleCN": "折线图的渐变",
@@ -879,6 +987,7 @@ export default [
       "line"
     ],
     "id": "line-sections",
+    "ts": true,
     "tags": [],
     "title": "Distribution of Electricity",
     "titleCN": "一天用电量分布",
@@ -889,6 +998,7 @@ export default [
       "pie"
     ],
     "id": "pie-alignTo",
+    "ts": true,
     "tags": [],
     "title": "Pie Label Align",
     "titleCN": "饼图标签对齐",
@@ -899,6 +1009,7 @@ export default [
       "pie"
     ],
     "id": "pie-labelLine-adjust",
+    "ts": true,
     "tags": [],
     "title": "Label Line Adjust",
     "titleCN": "饼图引导线调整",
@@ -909,6 +1020,7 @@ export default [
       "radar"
     ],
     "id": "radar2",
+    "ts": true,
     "tags": [],
     "title": "Proportion of Browsers",
     "titleCN": "浏览器占比变化",
@@ -919,6 +1031,7 @@ export default [
       "sankey"
     ],
     "id": "sankey-energy",
+    "ts": true,
     "tags": [],
     "title": "Gradient Edge",
     "titleCN": "桑基图渐变色边",
@@ -929,6 +1042,7 @@ export default [
       "sankey"
     ],
     "id": "sankey-nodeAlign-left",
+    "ts": true,
     "tags": [],
     "title": "Node Align Left in Sankey",
     "titleCN": "桑基图左对齐布局",
@@ -939,6 +1053,7 @@ export default [
       "sankey"
     ],
     "id": "sankey-nodeAlign-right",
+    "ts": true,
     "tags": [],
     "title": "Node Align Right in Sankey",
     "titleCN": "桑基图右对齐布局",
@@ -949,6 +1064,7 @@ export default [
       "scatter"
     ],
     "id": "scatter-punchCard",
+    "ts": true,
     "tags": [],
     "title": "Punch Card of Github",
     "titleCN": "GitHub 打卡气泡图",
@@ -959,6 +1075,7 @@ export default [
       "scatter"
     ],
     "id": "scatter-single-axis",
+    "ts": true,
     "tags": [],
     "title": "Scatter on Single Axis",
     "titleCN": "单轴散点图",
@@ -969,6 +1086,7 @@ export default [
       "scatter"
     ],
     "id": "scatter-weight",
+    "ts": true,
     "tags": [],
     "title": "Distribution of Height and Weight",
     "titleCN": "男性女性身高体重分布",
@@ -979,6 +1097,7 @@ export default [
       "sunburst"
     ],
     "id": "sunburst-monochrome",
+    "ts": true,
     "tags": [],
     "title": "Monochrome Sunburst",
     "titleCN": "Monochrome Sunburst",
@@ -990,6 +1109,7 @@ export default [
       "dataZoom"
     ],
     "id": "area-simple",
+    "ts": true,
     "tags": [],
     "title": "Large scale area chart",
     "titleCN": "大数据量面积图",
@@ -1000,6 +1120,7 @@ export default [
       "bar"
     ],
     "id": "bar-brush",
+    "ts": true,
     "tags": [],
     "title": "Brush Select on Column Chart",
     "titleCN": "柱状图框选",
@@ -1010,6 +1131,7 @@ export default [
       "bar"
     ],
     "id": "bar-negative",
+    "ts": true,
     "tags": [],
     "title": "Bar Chart with Negative Value",
     "titleCN": "正负条形图",
@@ -1020,6 +1142,7 @@ export default [
       "bar"
     ],
     "id": "bar1",
+    "ts": true,
     "tags": [],
     "title": "Rainfall and Evaporation",
     "titleCN": "某地区蒸发量和降水量",
@@ -1031,6 +1154,7 @@ export default [
       "graph"
     ],
     "id": "calendar-graph",
+    "ts": true,
     "tags": [],
     "title": "Calendar Graph",
     "titleCN": "日历关系图",
@@ -1041,6 +1165,7 @@ export default [
       "calendar"
     ],
     "id": "calendar-lunar",
+    "ts": true,
     "tags": [],
     "title": "Calendar Lunar",
     "titleCN": "农历日历图",
@@ -1051,6 +1176,7 @@ export default [
       "candlestick"
     ],
     "id": "candlestick-touch",
+    "ts": true,
     "tags": [],
     "title": "Axis Pointer Link and Touch",
     "titleCN": "触屏上的坐标轴指示器",
@@ -1061,6 +1187,7 @@ export default [
       "line"
     ],
     "id": "confidence-band",
+    "ts": true,
     "tags": [],
     "title": "Confidence Band",
     "titleCN": "Confidence Band",
@@ -1073,6 +1200,7 @@ export default [
       "drag"
     ],
     "id": "custom-gantt-flight",
+    "ts": false,
     "tags": [],
     "title": "Gantt Chart of Airport Flights",
     "titleCN": "机场航班甘特图",
@@ -1083,6 +1211,7 @@ export default [
       "custom"
     ],
     "id": "custom-polar-heatmap",
+    "ts": false,
     "tags": [],
     "title": "Polar Heatmap",
     "titleCN": "极坐标热力图(自定义系列)",
@@ -1093,6 +1222,7 @@ export default [
       "boxplot"
     ],
     "id": "data-transform-aggregate",
+    "ts": false,
     "tags": [],
     "title": "Data Transform Simple Aggregate",
     "titleCN": "简单的数据聚合",
@@ -1103,6 +1233,7 @@ export default [
       "gauge"
     ],
     "id": "gauge-grade",
+    "ts": true,
     "tags": [],
     "title": "Grade Gauge",
     "titleCN": "等级仪表盘",
@@ -1113,6 +1244,7 @@ export default [
       "gauge"
     ],
     "id": "gauge-multi-title",
+    "ts": true,
     "tags": [],
     "title": "Multi Title Gauge",
     "titleCN": "多标题仪表盘",
@@ -1123,6 +1255,7 @@ export default [
       "gauge"
     ],
     "id": "gauge-temperature",
+    "ts": true,
     "tags": [],
     "title": "Temperature Gauge chart",
     "titleCN": "气温仪表盘",
@@ -1133,6 +1266,7 @@ export default [
       "graph"
     ],
     "id": "graph",
+    "ts": true,
     "tags": [],
     "title": "Les Miserables",
     "titleCN": "悲惨世界人物关系图",
@@ -1143,9 +1277,10 @@ export default [
       "line"
     ],
     "id": "grid-multiple",
+    "ts": true,
     "tags": [],
-    "title": "Rainfall and Water Flow",
-    "titleCN": "雨量流量关系图",
+    "title": "Rainfall vs Evaporation",
+    "titleCN": "雨量Evaporation关系图",
     "difficulty": 4
   },
   {
@@ -1153,6 +1288,7 @@ export default [
       "line"
     ],
     "id": "line-aqi",
+    "ts": true,
     "tags": [],
     "title": "Beijing AQI",
     "titleCN": "北京 AQI 可视化",
@@ -1163,6 +1299,7 @@ export default [
       "bar"
     ],
     "id": "mix-line-bar",
+    "ts": true,
     "tags": [],
     "title": "Mixed Line and Bar",
     "titleCN": "折柱混合",
@@ -1173,6 +1310,7 @@ export default [
       "bar"
     ],
     "id": "mix-zoom-on-value",
+    "ts": true,
     "tags": [],
     "title": "Mix Zoom On Value",
     "titleCN": "多数值轴轴缩放",
@@ -1183,6 +1321,7 @@ export default [
       "line"
     ],
     "id": "multiple-x-axis",
+    "ts": true,
     "tags": [],
     "title": "Multiple X Axes",
     "titleCN": "多 X 轴",
@@ -1193,6 +1332,7 @@ export default [
       "bar"
     ],
     "id": "multiple-y-axis",
+    "ts": true,
     "tags": [],
     "title": "Multiple Y Axes",
     "titleCN": "多 Y 轴示例",
@@ -1203,6 +1343,7 @@ export default [
       "parallel"
     ],
     "id": "parallel-nutrients",
+    "ts": true,
     "tags": [],
     "title": "Parallel Nutrients",
     "titleCN": "营养结构(平行坐标)",
@@ -1214,6 +1355,7 @@ export default [
       "animation"
     ],
     "id": "pictorialBar-bar-transition",
+    "ts": true,
     "tags": [],
     "title": "Transition between pictorialBar and bar",
     "titleCN": "象形主图变形为柱状图",
@@ -1224,6 +1366,7 @@ export default [
       "pie"
     ],
     "id": "pie-legend",
+    "ts": true,
     "tags": [],
     "title": "Pie with Scrollable Legend",
     "titleCN": "可滚动的图例",
@@ -1235,6 +1378,7 @@ export default [
       "rich"
     ],
     "id": "pie-rich-text",
+    "ts": true,
     "tags": [],
     "title": "Pie Special Label",
     "titleCN": "富文本标签",
@@ -1246,6 +1390,7 @@ export default [
       "animation"
     ],
     "id": "scatter-aggregate-bar",
+    "ts": true,
     "tags": [],
     "title": "Aggregate Scatter to Bar",
     "titleCN": "散点图聚合为柱状图动画",
@@ -1256,6 +1401,7 @@ export default [
       "scatter"
     ],
     "id": "scatter-label-align-right",
+    "ts": true,
     "tags": [],
     "title": "Align Label on the Top",
     "titleCN": "散点图标签顶部对齐",
@@ -1266,6 +1412,7 @@ export default [
       "scatter"
     ],
     "id": "scatter-label-align-top",
+    "ts": true,
     "tags": [],
     "title": "Align Label on the Top",
     "titleCN": "散点图标签顶部对齐",
@@ -1276,6 +1423,7 @@ export default [
       "scatter"
     ],
     "id": "scatter-symbol-morph",
+    "ts": true,
     "tags": [],
     "title": "Symbol Shape Morph",
     "titleCN": "散点图变形动画",
@@ -1286,6 +1434,7 @@ export default [
       "sunburst"
     ],
     "id": "sunburst-visualMap",
+    "ts": true,
     "tags": [],
     "title": "Sunburst VisualMap",
     "titleCN": "旭日图使用视觉编码",
@@ -1296,6 +1445,7 @@ export default [
       "treemap"
     ],
     "id": "treemap-sunburst-transition",
+    "ts": true,
     "tags": [],
     "title": "Transition between Treemap and Sunburst",
     "titleCN": "矩形树图和旭日图的动画过渡",
@@ -1306,6 +1456,7 @@ export default [
       "line"
     ],
     "id": "area-rainfall",
+    "ts": true,
     "tags": [],
     "title": "Rainfall",
     "titleCN": "雨量流量关系图",
@@ -1316,6 +1467,7 @@ export default [
       "line"
     ],
     "id": "area-time-axis",
+    "ts": true,
     "tags": [],
     "title": "Area Chart with Time Axis",
     "titleCN": "时间轴折线图",
@@ -1326,6 +1478,7 @@ export default [
       "bar"
     ],
     "id": "bar-animation-delay",
+    "ts": true,
     "tags": [],
     "title": "Animation Delay",
     "titleCN": "柱状图动画延迟",
@@ -1336,6 +1489,7 @@ export default [
       "bar"
     ],
     "id": "bar-drilldown",
+    "ts": true,
     "tags": [],
     "title": "Bar Chart Drilldown Animation.",
     "titleCN": "柱状图下钻动画",
@@ -1346,6 +1500,7 @@ export default [
       "bar"
     ],
     "id": "bar-large",
+    "ts": true,
     "tags": [],
     "title": "Large Scale Bar Chart",
     "titleCN": "大数据量柱图",
@@ -1356,6 +1511,7 @@ export default [
       "bar"
     ],
     "id": "bar-race",
+    "ts": true,
     "tags": [],
     "title": "Bar Race",
     "titleCN": "动态排序柱状图",
@@ -1368,6 +1524,7 @@ export default [
       "pie"
     ],
     "id": "dataset-link",
+    "ts": true,
     "tags": [],
     "title": "Share Dataset",
     "titleCN": "联动和共享数据集",
@@ -1379,6 +1536,7 @@ export default [
       "bar"
     ],
     "id": "dataset-series-layout-by",
+    "ts": true,
     "tags": [],
     "title": "Series Layout By Column or Row",
     "titleCN": "系列按行和按列排布",
@@ -1390,6 +1548,7 @@ export default [
       "bar"
     ],
     "id": "dataset-simple0",
+    "ts": true,
     "tags": [],
     "title": "Simple Example of Dataset",
     "titleCN": "最简单的数据集(dataset)",
@@ -1401,6 +1560,7 @@ export default [
       "bar"
     ],
     "id": "dataset-simple1",
+    "ts": true,
     "tags": [],
     "title": "Dataset in Object Array",
     "titleCN": "对象数组的输入格式",
@@ -1411,6 +1571,7 @@ export default [
       "line"
     ],
     "id": "dynamic-data2",
+    "ts": true,
     "tags": [],
     "title": "Dynamic Data + Time Axis",
     "titleCN": "动态数据 + 时间坐标轴",
@@ -1421,6 +1582,7 @@ export default [
       "gauge"
     ],
     "id": "gauge-ring",
+    "ts": true,
     "tags": [],
     "title": "Ring Gauge",
     "titleCN": "得分环",
@@ -1431,6 +1593,7 @@ export default [
       "graph"
     ],
     "id": "graph-circular-layout",
+    "ts": true,
     "tags": [],
     "title": "Les Miserables",
     "titleCN": "悲惨世界人物关系图(环形布局)",
@@ -1441,6 +1604,7 @@ export default [
       "line"
     ],
     "id": "line-function",
+    "ts": true,
     "tags": [],
     "title": "Function Plot",
     "titleCN": "函数绘图",
@@ -1451,6 +1615,7 @@ export default [
       "line"
     ],
     "id": "line-race",
+    "ts": true,
     "tags": [],
     "title": "Line Race",
     "titleCN": "动态排序折线图",
@@ -1462,6 +1627,7 @@ export default [
       "rich"
     ],
     "id": "pie-nest",
+    "ts": true,
     "tags": [],
     "title": "Nested Pies",
     "titleCN": "嵌套环形图",
@@ -1472,6 +1638,7 @@ export default [
       "scatter"
     ],
     "id": "scatter-large",
+    "ts": true,
     "tags": [],
     "title": "Large Scatter",
     "titleCN": "大规模散点图",
@@ -1482,6 +1649,7 @@ export default [
       "scatter"
     ],
     "id": "scatter-nebula",
+    "ts": true,
     "tags": [],
     "title": "Scatter Nebula",
     "titleCN": "大规模星云散点图",
@@ -1492,6 +1660,7 @@ export default [
       "scatter"
     ],
     "id": "scatter-stream-visual",
+    "ts": true,
     "tags": [],
     "title": "Visual interaction with stream",
     "titleCN": "流式渲染和视觉映射操作",
@@ -1502,6 +1671,7 @@ export default [
       "sunburst"
     ],
     "id": "sunburst-drink",
+    "ts": true,
     "tags": [],
     "title": "Drink Flavors",
     "titleCN": "Drink Flavors",
@@ -1513,6 +1683,7 @@ export default [
       "dataZoom"
     ],
     "id": "wind-barb",
+    "ts": true,
     "tags": [],
     "title": "Wind Barb",
     "titleCN": "风向图",
@@ -1523,6 +1694,7 @@ export default [
       "bar"
     ],
     "id": "bar-race-country",
+    "ts": true,
     "tags": [],
     "title": "Bar Race",
     "titleCN": "动态排序柱状图 - 人均收入",
@@ -1534,6 +1706,7 @@ export default [
       "rich"
     ],
     "id": "bar-rich-text",
+    "ts": true,
     "tags": [],
     "title": "Wheater Statistics",
     "titleCN": "天气统计(富文本)",
@@ -1544,6 +1717,7 @@ export default [
       "scatter"
     ],
     "id": "bubble-gradient",
+    "ts": true,
     "tags": [],
     "title": "Bubble Chart",
     "titleCN": "气泡图",
@@ -1555,6 +1729,7 @@ export default [
       "pie"
     ],
     "id": "calendar-pie",
+    "ts": true,
     "tags": [],
     "title": "Calendar Pie",
     "titleCN": "日历饼图",
@@ -1566,6 +1741,7 @@ export default [
       "map"
     ],
     "id": "custom-hexbin",
+    "ts": false,
     "tags": [],
     "title": "Hexagonal Binning",
     "titleCN": "六边形分箱图(自定义系列)",
@@ -1576,6 +1752,7 @@ export default [
       "bar"
     ],
     "id": "dynamic-data",
+    "ts": true,
     "tags": [],
     "title": "Dynamic Data",
     "titleCN": "动态数据",
@@ -1586,6 +1763,7 @@ export default [
       "gauge"
     ],
     "id": "gauge-barometer",
+    "ts": true,
     "tags": [],
     "title": "Gauge Barometer chart",
     "titleCN": "气压表",
@@ -1596,6 +1774,7 @@ export default [
       "graph"
     ],
     "id": "graph-force-dynamic",
+    "ts": true,
     "tags": [],
     "title": "Graph Dynamic",
     "titleCN": "动态增加图节点",
@@ -1606,6 +1785,7 @@ export default [
       "line"
     ],
     "id": "line-markline",
+    "ts": true,
     "tags": [],
     "title": "Line with Marklines",
     "titleCN": "折线图的标记线",
@@ -1616,6 +1796,7 @@ export default [
       "line"
     ],
     "id": "line-style",
+    "ts": true,
     "tags": [],
     "title": "Line Style and Item Style",
     "titleCN": "自定义折线图样式",
@@ -1626,6 +1807,7 @@ export default [
       "bar"
     ],
     "id": "mix-timeline-finance",
+    "ts": false,
     "tags": [],
     "title": "Finance Indices 2002",
     "titleCN": "2002全国宏观经济指标",
@@ -1636,6 +1818,7 @@ export default [
       "sunburst"
     ],
     "id": "sunburst-book",
+    "ts": false,
     "tags": [],
     "title": "Book Records",
     "titleCN": "书籍分布",
@@ -1646,6 +1829,7 @@ export default [
       "bar"
     ],
     "id": "watermark",
+    "ts": true,
     "tags": [],
     "title": "Watermark - ECharts Download",
     "titleCN": "水印 - ECharts 下载统计",
@@ -1656,6 +1840,7 @@ export default [
       "bar"
     ],
     "id": "bar-polar-real-estate",
+    "ts": true,
     "tags": [],
     "title": "Bar Chart on Polar",
     "difficulty": 7
@@ -1665,6 +1850,7 @@ export default [
       "bar"
     ],
     "id": "bar-polar-stack",
+    "ts": true,
     "tags": [],
     "title": "Stacked Bar Chart on Polar",
     "titleCN": "极坐标系下的堆叠柱状图",
@@ -1675,6 +1861,7 @@ export default [
       "bar"
     ],
     "id": "bar-polar-stack-radial",
+    "ts": true,
     "tags": [],
     "title": "Stacked Bar Chart on Polar(Radial)",
     "titleCN": "极坐标系下的堆叠柱状图",
@@ -1686,6 +1873,7 @@ export default [
       "calendar"
     ],
     "id": "custom-calendar-icon",
+    "ts": true,
     "tags": [],
     "title": "Custom Calendar Icon",
     "titleCN": "日历图自定义图标",
@@ -1696,6 +1884,7 @@ export default [
       "custom"
     ],
     "id": "custom-wind",
+    "ts": false,
     "tags": [],
     "title": "Use custom series to draw wind vectors",
     "titleCN": "使用自定义系列绘制风场",
@@ -1706,6 +1895,7 @@ export default [
       "gauge"
     ],
     "id": "gauge-clock",
+    "ts": true,
     "tags": [],
     "title": "Clock",
     "titleCN": "时钟仪表盘",
@@ -1716,6 +1906,7 @@ export default [
       "graph"
     ],
     "id": "graph-life-expectancy",
+    "ts": true,
     "tags": [],
     "title": "Graph Life Expectancy",
     "titleCN": "Graph Life Expectancy",
@@ -1726,6 +1917,7 @@ export default [
       "line"
     ],
     "id": "line-in-cartesian-coordinate-system",
+    "ts": true,
     "tags": [],
     "title": "Line Chart in Cartesian Coordinate System",
     "titleCN": "双数值轴折线图",
@@ -1736,6 +1928,7 @@ export default [
       "line"
     ],
     "id": "line-log",
+    "ts": true,
     "tags": [],
     "title": "Log Axis",
     "titleCN": "对数轴示例",
@@ -1746,6 +1939,7 @@ export default [
       "line"
     ],
     "id": "line-step",
+    "ts": true,
     "tags": [],
     "title": "Step Line",
     "titleCN": "阶梯折线图",
@@ -1756,6 +1950,7 @@ export default [
       "bar"
     ],
     "id": "polar-roundCap",
+    "ts": true,
     "tags": [],
     "title": "Rounded Bar on Polar",
     "titleCN": "圆角环形图",
@@ -1766,6 +1961,7 @@ export default [
       "scatter"
     ],
     "id": "scatter-aqi-color",
+    "ts": true,
     "tags": [],
     "title": "Scatter Aqi Color",
     "titleCN": "AQI 气泡图",
@@ -1776,6 +1972,7 @@ export default [
       "scatter"
     ],
     "id": "scatter-nutrients",
+    "ts": true,
     "tags": [],
     "title": "Scatter Nutrients",
     "titleCN": "营养分布散点图",
@@ -1786,6 +1983,7 @@ export default [
       "scatter"
     ],
     "id": "scatter-nutrients-matrix",
+    "ts": true,
     "tags": [],
     "title": "Scatter Nutrients Matrix",
     "titleCN": "营养分布散点矩阵",
@@ -1796,6 +1994,7 @@ export default [
       "gauge"
     ],
     "id": "gauge-car",
+    "ts": true,
     "tags": [],
     "title": "Gauge Car",
     "titleCN": "Gauge Car",
@@ -1806,6 +2005,7 @@ export default [
       "graph"
     ],
     "id": "graph-webkit-dep",
+    "ts": true,
     "tags": [],
     "title": "Graph Webkit Dep",
     "titleCN": "WebKit 模块关系依赖图",
@@ -1816,6 +2016,7 @@ export default [
       "line"
     ],
     "id": "line-easing",
+    "ts": true,
     "tags": [],
     "title": "Line Easing Visualizing",
     "titleCN": "缓动函数可视化",
@@ -1826,6 +2027,7 @@ export default [
       "line"
     ],
     "id": "line-y-category",
+    "ts": true,
     "tags": [],
     "title": "Line Y Category",
     "titleCN": "垂直折线图(Y轴为类目轴)",
@@ -1836,6 +2038,7 @@ export default [
       "scatter"
     ],
     "id": "scatter-polar-punchCard",
+    "ts": true,
     "tags": [],
     "title": "Punch Card of Github",
     "titleCN": "GitHub 打卡气泡图(极坐标)",
@@ -1846,6 +2049,7 @@ export default [
       "custom"
     ],
     "id": "custom-gauge",
+    "ts": false,
     "tags": [],
     "title": "Custom Gauge",
     "titleCN": "自定义仪表",
@@ -1856,6 +2060,7 @@ export default [
       "graph"
     ],
     "id": "graph-npm",
+    "ts": true,
     "tags": [],
     "title": "NPM Dependencies",
     "titleCN": "NPM 依赖关系图",
@@ -1866,6 +2071,7 @@ export default [
       "line"
     ],
     "id": "line-graphic",
+    "ts": true,
     "tags": [],
     "title": "Custom Graphic Component",
     "titleCN": "自定义图形组件",
@@ -1876,6 +2082,7 @@ export default [
       "line"
     ],
     "id": "line-pen",
+    "ts": true,
     "tags": [],
     "title": "Click to Add Points",
     "titleCN": "点击添加折线图拐点",
@@ -1886,6 +2093,7 @@ export default [
       "scatter"
     ],
     "id": "scatter-life-expectancy-timeline",
+    "ts": false,
     "tags": [],
     "title": "Life Expectancy and GDP",
     "titleCN": "各国人均寿命与GDP关系演变",
@@ -1896,28 +2104,18 @@ export default [
       "scatter"
     ],
     "id": "scatter-painter-choice",
+    "ts": true,
     "tags": [],
     "title": "Master Painter Color Choices Throughout History",
     "titleCN": "Master Painter Color Choices Throughout History",
     "difficulty": 9
   },
   {
-    "category": [],
-    "id": "bar-polar-label-radial",
-    "tags": [],
-    "difficulty": 10
-  },
-  {
-    "category": [],
-    "id": "bar-polar-label-tangential",
-    "tags": [],
-    "difficulty": 10
-  },
-  {
     "category": [
       "boxplot"
     ],
     "id": "boxplot-light-velocity",
+    "ts": true,
     "tags": [],
     "title": "Boxplot Light Velocity",
     "titleCN": "基础盒须图",
@@ -1928,6 +2126,7 @@ export default [
       "boxplot"
     ],
     "id": "boxplot-light-velocity2",
+    "ts": true,
     "tags": [],
     "title": "Boxplot Light Velocity2",
     "titleCN": "垂直方向盒须图",
@@ -1938,6 +2137,7 @@ export default [
       "boxplot"
     ],
     "id": "boxplot-multi",
+    "ts": true,
     "tags": [],
     "title": "Multiple Categories",
     "titleCN": "多系列盒须图",
@@ -1946,6 +2146,7 @@ export default [
   {
     "category": [],
     "id": "calendar-effectscatter",
+    "ts": true,
     "tags": [],
     "difficulty": 10
   },
@@ -1954,9 +2155,10 @@ export default [
       "candlestick"
     ],
     "id": "candlestick-brush",
+    "ts": true,
     "tags": [],
     "title": "Candlestick Brush",
-    "titleCN": "日历图刷选",
+    "titleCN": "K 线图刷选",
     "difficulty": 10
   },
   {
@@ -1964,23 +2166,19 @@ export default [
       "candlestick"
     ],
     "id": "candlestick-sh-2015",
+    "ts": true,
     "tags": [],
     "title": "ShangHai Index, 2015",
     "titleCN": "2015 年上证指数",
     "difficulty": 10
   },
   {
-    "category": [],
-    "id": "covid-america",
-    "tags": [],
-    "difficulty": 10
-  },
-  {
     "category": [
       "scatter",
       "map"
     ],
     "id": "effectScatter-bmap",
+    "ts": true,
     "tags": [
       "bmap"
     ],
@@ -1993,6 +2191,7 @@ export default [
       "funnel"
     ],
     "id": "funnel",
+    "ts": true,
     "tags": [],
     "title": "Funnel Chart",
     "titleCN": "漏斗图",
@@ -2003,8 +2202,9 @@ export default [
       "funnel"
     ],
     "id": "funnel-align",
+    "ts": true,
     "tags": [],
-    "title": "Funnel (align)",
+    "title": "Funnel Compare",
     "titleCN": "漏斗图(对比)",
     "difficulty": 10
   },
@@ -2013,6 +2213,7 @@ export default [
       "funnel"
     ],
     "id": "funnel-customize",
+    "ts": true,
     "tags": [],
     "title": "Customized Funnel",
     "titleCN": "漏斗图",
@@ -2023,9 +2224,10 @@ export default [
       "funnel"
     ],
     "id": "funnel-mutiple",
+    "ts": true,
     "tags": [],
     "title": "Multiple Funnels",
-    "titleCN": "漏斗图",
+    "titleCN": "Funnel",
     "difficulty": 10
   },
   {
@@ -2033,6 +2235,7 @@ export default [
       "map"
     ],
     "id": "geo-beef-cuts",
+    "ts": true,
     "tags": [],
     "title": "GEO Beef Cuts",
     "titleCN": "庖丁解牛",
@@ -2043,6 +2246,7 @@ export default [
       "map"
     ],
     "id": "geo-lines",
+    "ts": false,
     "tags": [],
     "title": "Migration",
     "titleCN": "模拟迁徙",
@@ -2053,6 +2257,7 @@ export default [
       "map"
     ],
     "id": "geo-map-scatter",
+    "ts": false,
     "tags": [],
     "title": "map and scatter share a geo",
     "titleCN": "map and scatter share a geo",
@@ -2063,6 +2268,7 @@ export default [
       "map"
     ],
     "id": "geo-organ",
+    "ts": false,
     "tags": [],
     "title": "Organ Data with SVG",
     "titleCN": "内脏数据(SVG)",
@@ -2073,6 +2279,7 @@ export default [
       "map"
     ],
     "id": "geo-seatmap-flight",
+    "ts": true,
     "tags": [],
     "title": "Flight Seatmap with SVG",
     "titleCN": "航班选座(SVG)",
@@ -2083,6 +2290,7 @@ export default [
       "map"
     ],
     "id": "geo-svg-lines",
+    "ts": true,
     "tags": [],
     "title": "GEO SVG Lines",
     "titleCN": "GEO 路径图(SVG)",
@@ -2093,6 +2301,7 @@ export default [
       "map"
     ],
     "id": "geo-svg-map",
+    "ts": true,
     "tags": [],
     "title": "GEO SVG Map",
     "titleCN": "地图(SVG)",
@@ -2103,6 +2312,7 @@ export default [
       "map"
     ],
     "id": "geo-svg-scatter-simple",
+    "ts": true,
     "tags": [],
     "title": "GEO SVG Scatter",
     "titleCN": "散点图(SVG)",
@@ -2113,6 +2323,7 @@ export default [
       "map"
     ],
     "id": "geo-svg-traffic",
+    "ts": true,
     "tags": [],
     "title": "GEO SVG Traffic",
     "titleCN": "交通(SVG)",
@@ -2124,6 +2335,7 @@ export default [
       "drag"
     ],
     "id": "line-draggable",
+    "ts": true,
     "tags": [],
     "title": "Try Dragging these Points",
     "titleCN": "可拖拽点",
@@ -2134,6 +2346,7 @@ export default [
       "line"
     ],
     "id": "line-polar",
+    "ts": true,
     "tags": [],
     "title": "Two Value-Axes in Polar",
     "titleCN": "极坐标双数值轴",
@@ -2144,6 +2357,7 @@ export default [
       "line"
     ],
     "id": "line-polar2",
+    "ts": true,
     "tags": [],
     "title": "Two Value-Axes in Polar",
     "titleCN": "极坐标双数值轴",
@@ -2155,6 +2369,7 @@ export default [
       "dataZoom"
     ],
     "id": "line-tooltip-touch",
+    "ts": true,
     "tags": [],
     "title": "Tooltip and DataZoom on Mobile",
     "titleCN": "移动端上的 dataZoom 和 tooltip",
@@ -2166,6 +2381,7 @@ export default [
       "lines"
     ],
     "id": "lines-airline",
+    "ts": true,
     "tags": [],
     "title": "65k+ Airline",
     "titleCN": "65k+ 飞机航线",
@@ -2177,6 +2393,7 @@ export default [
       "lines"
     ],
     "id": "lines-bmap",
+    "ts": true,
     "tags": [
       "bmap"
     ],
@@ -2190,6 +2407,7 @@ export default [
       "lines"
     ],
     "id": "lines-bmap-bus",
+    "ts": true,
     "tags": [
       "bmap"
     ],
@@ -2203,6 +2421,7 @@ export default [
       "lines"
     ],
     "id": "lines-bmap-effect",
+    "ts": true,
     "tags": [
       "bmap"
     ],
@@ -2216,6 +2435,7 @@ export default [
       "lines"
     ],
     "id": "lines-ny",
+    "ts": true,
     "tags": [],
     "title": "Use lines to draw 1 million ny streets.",
     "titleCN": "使用线图绘制近 100 万的纽约街道数据",
@@ -2227,6 +2447,7 @@ export default [
       "animation"
     ],
     "id": "map-bar-morph",
+    "ts": true,
     "tags": [],
     "title": "Morphing between Map and Bar",
     "titleCN": "地图柱状图变形动画",
@@ -2237,6 +2458,7 @@ export default [
       "map"
     ],
     "id": "map-bin",
+    "ts": false,
     "tags": [
       "bmap"
     ],
@@ -2249,6 +2471,7 @@ export default [
       "map"
     ],
     "id": "map-china",
+    "ts": false,
     "tags": [],
     "title": "Map China",
     "titleCN": "Map China",
@@ -2259,6 +2482,7 @@ export default [
       "map"
     ],
     "id": "map-china-dataRange",
+    "ts": false,
     "tags": [],
     "title": "Sales of iphone",
     "titleCN": "iphone销量",
@@ -2269,6 +2493,7 @@ export default [
       "map"
     ],
     "id": "map-HK",
+    "ts": true,
     "tags": [],
     "title": "Population Density of HongKong (2011)",
     "titleCN": "香港18区人口密度 (2011)",
@@ -2279,6 +2504,7 @@ export default [
       "map"
     ],
     "id": "map-labels",
+    "ts": false,
     "tags": [],
     "title": "Rich Text Labels on Map",
     "titleCN": "地图上的富文本标签",
@@ -2289,6 +2515,7 @@ export default [
       "map"
     ],
     "id": "map-locate",
+    "ts": false,
     "tags": [],
     "title": "Map Locate",
     "titleCN": "Map Locate",
@@ -2299,6 +2526,7 @@ export default [
       "map"
     ],
     "id": "map-polygon",
+    "ts": false,
     "tags": [
       "bmap"
     ],
@@ -2311,6 +2539,7 @@ export default [
       "map"
     ],
     "id": "map-province",
+    "ts": false,
     "tags": [],
     "title": "Switch among 34 Provinces",
     "titleCN": "34 省切换查看",
@@ -2321,6 +2550,7 @@ export default [
       "map"
     ],
     "id": "map-usa",
+    "ts": true,
     "tags": [],
     "title": "USA Population Estimates (2012)",
     "titleCN": "2012 年美国人口统计",
@@ -2331,6 +2561,7 @@ export default [
       "map"
     ],
     "id": "map-world",
+    "ts": false,
     "tags": [],
     "title": "Map World",
     "titleCN": "Map World",
@@ -2341,6 +2572,7 @@ export default [
       "map"
     ],
     "id": "map-world-dataRange",
+    "ts": false,
     "tags": [],
     "title": "World Population (2010)",
     "titleCN": "World Population (2010)",
@@ -2351,6 +2583,7 @@ export default [
       "pictorialBar"
     ],
     "id": "pictorialBar-body-fill",
+    "ts": true,
     "tags": [],
     "title": "Water Content",
     "titleCN": "人体含水量",
@@ -2361,6 +2594,7 @@ export default [
       "pictorialBar"
     ],
     "id": "pictorialBar-dotted",
+    "ts": true,
     "tags": [],
     "title": "Dotted bar",
     "titleCN": "虚线柱状图效果",
@@ -2371,6 +2605,7 @@ export default [
       "pictorialBar"
     ],
     "id": "pictorialBar-forest",
+    "ts": true,
     "tags": [],
     "title": "Expansion of forest",
     "titleCN": "森林的增长",
@@ -2381,6 +2616,7 @@ export default [
       "pictorialBar"
     ],
     "id": "pictorialBar-hill",
+    "ts": true,
     "tags": [],
     "title": "Wish List and Mountain Height",
     "titleCN": "圣诞愿望清单和山峰高度",
@@ -2391,6 +2627,7 @@ export default [
       "pictorialBar"
     ],
     "id": "pictorialBar-spirit",
+    "ts": true,
     "tags": [],
     "title": "Spirits",
     "titleCN": "精灵",
@@ -2401,6 +2638,7 @@ export default [
       "pictorialBar"
     ],
     "id": "pictorialBar-vehicle",
+    "ts": true,
     "tags": [],
     "title": "Vehicles",
     "titleCN": "交通工具",
@@ -2411,6 +2649,7 @@ export default [
       "pictorialBar"
     ],
     "id": "pictorialBar-velocity",
+    "ts": true,
     "tags": [],
     "title": "Velocity of Christmas Reindeers",
     "titleCN": "驯鹿的速度",
@@ -2422,6 +2661,7 @@ export default [
       "animtion"
     ],
     "id": "pie-parliament-transition",
+    "ts": true,
     "tags": [],
     "title": "Transition of Parliament and Pie Chart",
     "titleCN": "自定义议会图与饼图过渡动画",
@@ -2432,6 +2672,7 @@ export default [
       "radar"
     ],
     "id": "radar-multiple",
+    "ts": true,
     "tags": [],
     "title": "Multiple Radar",
     "titleCN": "多雷达图",
@@ -2442,6 +2683,7 @@ export default [
       "scatter"
     ],
     "id": "scatter-map",
+    "ts": false,
     "tags": [],
     "title": "Air Quality",
     "titleCN": "全国主要城市空气质量",
@@ -2452,6 +2694,7 @@ export default [
       "scatter"
     ],
     "id": "scatter-map-brush",
+    "ts": true,
     "tags": [],
     "title": "Scatter Map Brush",
     "titleCN": "Scatter Map Brush",
@@ -2463,6 +2706,7 @@ export default [
       "scatter"
     ],
     "id": "scatter-matrix",
+    "ts": true,
     "tags": [],
     "title": "Scatter Matrix",
     "titleCN": "散点矩阵和平行坐标",
@@ -2473,6 +2717,7 @@ export default [
       "scatter"
     ],
     "id": "scatter-weibo",
+    "ts": true,
     "tags": [],
     "title": "Sign in of weibo",
     "titleCN": "微博签到数据点亮中国",
@@ -2483,6 +2728,7 @@ export default [
       "scatter"
     ],
     "id": "scatter-world-population",
+    "ts": false,
     "tags": [],
     "title": "World Population (2011)",
     "titleCN": "World Population (2011)",
@@ -2493,6 +2739,7 @@ export default [
       "themeRiver"
     ],
     "id": "themeRiver-basic",
+    "ts": true,
     "tags": [],
     "title": "ThemeRiver",
     "titleCN": "主题河流图",
@@ -2503,6 +2750,7 @@ export default [
       "themeRiver"
     ],
     "id": "themeRiver-lastfm",
+    "ts": true,
     "tags": [],
     "title": "ThemeRiver Lastfm",
     "titleCN": "ThemeRiver Lastfm",
@@ -2513,6 +2761,7 @@ export default [
       "tree"
     ],
     "id": "tree-basic",
+    "ts": true,
     "tags": [],
     "title": "From Left to Right Tree",
     "titleCN": "从左到右树状图",
@@ -2523,6 +2772,7 @@ export default [
       "tree"
     ],
     "id": "tree-legend",
+    "ts": true,
     "tags": [],
     "title": "Multiple Trees",
     "titleCN": "多棵树",
@@ -2533,6 +2783,7 @@ export default [
       "tree"
     ],
     "id": "tree-orient-bottom-top",
+    "ts": true,
     "tags": [],
     "title": "From Bottom to Top Tree",
     "titleCN": "从下到上树状图",
@@ -2543,6 +2794,7 @@ export default [
       "tree"
     ],
     "id": "tree-orient-right-left",
+    "ts": true,
     "tags": [],
     "title": "From Right to Left Tree",
     "titleCN": "从右到左树状图",
@@ -2553,6 +2805,7 @@ export default [
       "tree"
     ],
     "id": "tree-polyline",
+    "ts": true,
     "tags": [],
     "title": "Tree with Polyline Edge",
     "titleCN": "折线树图",
@@ -2563,6 +2816,7 @@ export default [
       "tree"
     ],
     "id": "tree-radial",
+    "ts": true,
     "tags": [],
     "title": "Radial Tree",
     "titleCN": "径向树状图",
@@ -2573,6 +2827,7 @@ export default [
       "tree"
     ],
     "id": "tree-vertical",
+    "ts": true,
     "tags": [],
     "title": "From Top to Bottom Tree",
     "titleCN": "从上到下树状图",
@@ -2583,6 +2838,7 @@ export default [
       "treemap"
     ],
     "id": "treemap-disk",
+    "ts": true,
     "tags": [],
     "title": "Disk Usage",
     "titleCN": "磁盘占用",
@@ -2593,6 +2849,7 @@ export default [
       "treemap"
     ],
     "id": "treemap-drill-down",
+    "ts": true,
     "tags": [],
     "title": "ECharts Option Query",
     "titleCN": "ECharts 配置项查询分布",
@@ -2603,6 +2860,7 @@ export default [
       "treemap"
     ],
     "id": "treemap-obama",
+    "ts": true,
     "tags": [],
     "title": "How $3.7 Trillion is Spent",
     "titleCN": "How $3.7 Trillion is Spent",
@@ -2613,6 +2871,7 @@ export default [
       "treemap"
     ],
     "id": "treemap-show-parent",
+    "ts": true,
     "tags": [],
     "title": "Show Parent Labels",
     "titleCN": "显示父层级标签",
@@ -2623,6 +2882,7 @@ export default [
       "treemap"
     ],
     "id": "treemap-simple",
+    "ts": true,
     "tags": [],
     "title": "Basic Treemap",
     "titleCN": "基础矩形树图",
@@ -2633,6 +2893,7 @@ export default [
       "treemap"
     ],
     "id": "treemap-visual",
+    "ts": true,
     "tags": [],
     "title": "Gradient Mapping",
     "titleCN": "映射为渐变色",
@@ -2644,6 +2905,7 @@ export default [
       "scatter"
     ],
     "id": "calendar-charts",
+    "ts": true,
     "tags": [],
     "title": "Calendar Charts",
     "titleCN": "日历图",
@@ -2654,6 +2916,7 @@ export default [
       "custom"
     ],
     "id": "circle-packing-with-d3",
+    "ts": true,
     "tags": [],
     "title": "Circle Packing with d3",
     "titleCN": "Circle Packing with d3",
@@ -2664,6 +2927,7 @@ export default [
       "custom"
     ],
     "id": "custom-spiral-race",
+    "ts": false,
     "tags": [],
     "title": "Custom Spiral Race",
     "titleCN": "自定义螺旋线竞速",
@@ -2674,6 +2938,7 @@ export default [
       "scatter"
     ],
     "id": "scatter-logarithmic-regression",
+    "ts": true,
     "tags": [],
     "title": "Logarithmic Regression",
     "titleCN": "对数回归(使用统计插件)",
diff --git a/src/editor/Editor.vue b/src/editor/Editor.vue
index 2070a26..91c3e7c 100644
--- a/src/editor/Editor.vue
+++ b/src/editor/Editor.vue
@@ -22,12 +22,18 @@
                   >
                 </el-tooltip>
                 <el-tooltip
-                  :content="$t('editor.tooltip.tsMode')"
+                  :content="
+                    $t(`editor.tooltip.${exampleConfig.ts ? 'tsMode' : 'noTs'}`)
+                  "
                   placement="bottom"
                 >
                   <a
-                    @click="changeLang('ts')"
-                    :class="{ ts: true, active: shared.typeCheck }"
+                    @click="exampleConfig.ts && changeLang('ts')"
+                    :class="{
+                      ts: true,
+                      active: shared.typeCheck,
+                      disabled: !exampleConfig.ts
+                    }"
                     >TS</a
                   >
                 </el-tooltip>
@@ -147,7 +153,12 @@ import CodeAce from './CodeAce.vue';
 import CodeMonaco from './CodeMonaco.vue';
 import FullCodePreview from './FullCodePreview.vue';
 import Preview from './Preview.vue';
-import { store, loadExampleCode, parseSourceCode } from '../common/store';
+import {
+  store,
+  loadExampleCode,
+  parseSourceCode,
+  getExampleConfig
+} from '../common/store';
 import { collectDeps, buildExampleCode } from '../../common/buildCode';
 import { goto } from '../common/route';
 import { mount } from '@lang/object-visualizer';
@@ -186,6 +197,8 @@ export default {
 
       fullCode: '',
 
+      exampleConfig: getExampleConfig(),
+
       fullCodeConfig: {
         mimimal: false,
         esm: true,
@@ -514,6 +527,15 @@ $handler-width: 5px;
         color: #3178c6;
       }
 
+      &.ts.disabled {
+        color: #ddd;
+        cursor: default;
+
+        &:hover {
+          text-decoration: none;
+        }
+      }
+
       &.js {
         color: #000;
       }
diff --git a/src/editor/Preview.vue b/src/editor/Preview.vue
index 89518da..68fea47 100644
--- a/src/editor/Preview.vue
+++ b/src/editor/Preview.vue
@@ -102,21 +102,21 @@
 </template>
 
 <script>
-import { store, updateRunHash } from '../common/store';
+import {
+  getExampleConfig,
+  isGLExample,
+  store,
+  updateRunHash
+} from '../common/store';
 import { SCRIPT_URLS, URL_PARAMS } from '../common/config';
 import { loadScriptsAsync } from '../common/helper';
 import { createSandbox } from './sandbox';
 import debounce from 'lodash/debounce';
 import { addListener } from 'resize-detector';
-import CHART_LIST from '../data/chart-list-data';
-import CHART_LIST_GL from '../data/chart-list-data-gl';
 import { download } from './downloadExample';
 
-function findExample(item) {
-  return URL_PARAMS.c === item.id;
-}
-const example = CHART_LIST.concat(CHART_LIST_GL).find(findExample);
-const isGL = CHART_LIST_GL.find(findExample);
+const example = getExampleConfig();
+const isGL = isGLExample();
 
 function addDecalIfNecessary(option) {
   if (store.enableDecal) {
diff --git a/tool/build-example.js b/tool/build-example.js
index b23290b..32a26cc 100644
--- a/tool/build-example.js
+++ b/tool/build-example.js
@@ -264,9 +264,8 @@ async function takeScreenshot(
   // TODO puppeteer will have Navigation Timeout Exceeded: 30000ms exceeded error in these examples.
   const screenshotBlackList = [];
 
-  const files = await globby(
-    `${rootDir}public/examples/js/${isGL ? 'gl/' : ''}*.js`
-  );
+  const examplesRoot = `${rootDir}public/examples`;
+  const files = await globby(`${examplesRoot}/js/${isGL ? 'gl/' : ''}*.js`);
 
   const exampleList = [];
 
@@ -289,6 +288,9 @@ async function takeScreenshot(
         return;
       }
 
+      const tsFile = `${examplesRoot}/ts/${isGL ? 'gl/' : ''}${basename}.ts`;
+      const hasTs = fs.existsSync(tsFile);
+
       let fmResult;
       try {
         const code = fs.readFileSync(fileName, 'utf-8');
@@ -313,6 +315,7 @@ async function takeScreenshot(
           exampleList.push({
             category: category,
             id: basename,
+            ts: hasTs,
             tags: (fmResult.data.tags || '')
               .split(/,/g)
               .map((a) => a.trim())

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@echarts.apache.org
For additional commands, e-mail: commits-help@echarts.apache.org


[echarts-examples] 06/15: add language switch confirm

Posted by sh...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

shenyi pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/echarts-examples.git

commit 91a9f36c6b8c9137b9912923f4d61816aef26400
Author: pissang <bm...@gmail.com>
AuthorDate: Tue Sep 7 15:39:47 2021 +0800

    add language switch confirm
---
 src/common/i18n.js     | 14 ++++++++++++--
 src/editor/Editor.vue  | 24 ++++++++++++++++++++----
 src/editor/Preview.vue |  8 ++++----
 3 files changed, 36 insertions(+), 10 deletions(-)

diff --git a/src/common/i18n.js b/src/common/i18n.js
index 206515a..8bb0e56 100644
--- a/src/common/i18n.js
+++ b/src/common/i18n.js
@@ -26,7 +26,12 @@ export default {
       tooltip: {
         jsMode: 'JavaScript',
         tsMode: 'TypeScript. Provides Better Intelligent'
-      }
+      },
+
+      codeChangedConfirm:
+        "Modified code will be lost. Do you wan't to continue?",
+      confirmButtonText: 'Yes',
+      cancelButtonText: 'No'
     },
 
     chartTypes: {
@@ -98,7 +103,12 @@ export default {
       tooltip: {
         jsMode: 'JavaScript 代码编辑',
         tsMode: 'TypeScript 代码编辑,提供更好的代码补全和类型检查。'
-      }
+      },
+
+      codeChangedConfirm: '已经修改过的代码将会丢失,是否确认继续?',
+
+      confirmButtonText: '确认',
+      cancelButtonText: '取消'
     },
 
     chartTypes: {
diff --git a/src/editor/Editor.vue b/src/editor/Editor.vue
index f0f8abd..2070a26 100644
--- a/src/editor/Editor.vue
+++ b/src/editor/Editor.vue
@@ -292,11 +292,27 @@ export default {
     },
     changeLang(lang) {
       if ((URL_PARAMS.lang || 'js').toLowerCase() !== lang) {
-        goto(
-          Object.assign({}, URL_PARAMS, {
-            lang
+        if (!this.initialCode || store.sourceCode === this.initialCode) {
+          goto(
+            Object.assign({}, URL_PARAMS, {
+              lang
+            })
+          );
+        } else {
+          this.$confirm(this.$t('editor.codeChangedConfirm'), '', {
+            confirmButtonText: this.$t('editor.confirmButtonText'),
+            cancelButtonText: this.$t('editor.cancelButtonText'),
+            type: 'warning'
           })
-        );
+            .then(() => {
+              goto(
+                Object.assign({}, URL_PARAMS, {
+                  lang
+                })
+              );
+            })
+            .catch(() => {});
+        }
       }
     },
     format() {
diff --git a/src/editor/Preview.vue b/src/editor/Preview.vue
index dd573d5..89518da 100644
--- a/src/editor/Preview.vue
+++ b/src/editor/Preview.vue
@@ -57,10 +57,10 @@
               </el-col>
             </el-row>
           </div>
-          <span class="render-config-trigger" slot="reference"
-            ><i class="el-icon-setting el-icon--left"></i
-            >{{ $t('editor.renderCfgTitle') }}</span
-          >
+          <span class="render-config-trigger" slot="reference">
+            <i class="el-icon-setting el-icon--left"></i
+            >{{ $t('editor.renderCfgTitle') }}
+          </span>
         </el-popover>
       </div>
       <template v-if="inEditor">

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@echarts.apache.org
For additional commands, e-mail: commits-help@echarts.apache.org


[echarts-examples] 07/15: fix build example

Posted by sh...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

shenyi pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/echarts-examples.git

commit bfb64a2da816b160843720ecb6742ba00d9a5897
Author: pissang <bm...@gmail.com>
AuthorDate: Tue Sep 7 16:04:17 2021 +0800

    fix build example
---
 package.json                  |  8 ++++----
 public/examples/tsconfig.json | 24 ++++++++++++------------
 src/common/store.js           |  1 +
 tool/build-example.js         | 33 +++++++++++++++++++--------------
 tool/compile-example.js       | 35 +++++++++++++++++++++++++++++++++++
 tool/screenshot.html          |  5 +++--
 6 files changed, 74 insertions(+), 32 deletions(-)

diff --git a/package.json b/package.json
index cbc49e1..90c55fe 100644
--- a/package.json
+++ b/package.json
@@ -5,11 +5,11 @@
   "scripts": {
     "build": "npx webpack --config build/webpack.config.js --mode production",
     "watch": "npx webpack --config build/webpack.config.js --mode development --devtool source-map --watch",
-    "localsite": "npm run build && node build/copyResource.js --env localsite",
-    "release": "npm run build && node build/copyResource.js --env asf",
+    "localsite": "npm run compile:example || npm run build && node build/copyResource.js --env localsite",
+    "release": "npm run compile:example || npm run build && node build/copyResource.js --env asf",
     "dev": "npx concurrently --kill-others \"npm:watch\" \"npm:server\"",
-    "build:example": "node tool/build-example.js && node tool/build-example.js --source data-gl",
-    "compile:example": "tsc --project public/examples/tsconfig.json || prettier --write public/examples/js",
+    "build:example": "npm run compile:example || node tool/build-example.js && node tool/build-example.js --gl",
+    "compile:example": "node tool/compile-example.js",
     "test:e2e": "node e2e/main.js --bundler webpack -m",
     "test:e2e:local": "node e2e/main.js --bundler webpack -m --local",
     "test:e2e:esbuild": "node e2e/main.js --bundler esbuild -m",
diff --git a/public/examples/tsconfig.json b/public/examples/tsconfig.json
index b689d9a..f47c85b 100644
--- a/public/examples/tsconfig.json
+++ b/public/examples/tsconfig.json
@@ -1,13 +1,13 @@
 {
-    "compilerOptions": {
-        "target": "ES6",
-        "strict": true,
-        "moduleResolution": "node",
-        "allowJs": true,
-        "checkJs": false,
-        "pretty": true,
-        "outDir": "./js/",
-        "baseUrl": "./"
-    },
-    "include": ["./ts/**/*.ts", "./ts/**/*.js", "./types/**/*.d.ts"]
-}
\ No newline at end of file
+  "compilerOptions": {
+    "target": "ES6",
+    "strict": true,
+    "moduleResolution": "node",
+    "allowJs": true,
+    "checkJs": false,
+    "pretty": true,
+    "outDir": "./js/",
+    "baseUrl": "./"
+  },
+  "include": ["./ts/**/*.ts", "./ts/**/*.js", "./types/**/*.d.ts"]
+}
diff --git a/src/common/store.js b/src/common/store.js
index f6a56df..af35246 100644
--- a/src/common/store.js
+++ b/src/common/store.js
@@ -49,6 +49,7 @@ export function parseSourceCode(code) {
       .replace(/\/\*[\w\W]*?\*\//, '')
       .trim()
       // ts code needs add `export {}` to be a module. remove it.
+      // FIXME
       .replace(/export\s+\{\s*\}\s*;?$/g, '')
   );
 }
diff --git a/tool/build-example.js b/tool/build-example.js
index ac763da..b23290b 100644
--- a/tool/build-example.js
+++ b/tool/build-example.js
@@ -36,8 +36,8 @@ function codeSize(code) {
 const parser = new argparse.ArgumentParser({
   addHelp: true
 });
-parser.addArgument(['-s', '--source'], {
-  help: 'Source folder'
+parser.addArgument(['--gl'], {
+  help: 'If generating gl'
 });
 parser.addArgument(['-t', '--theme'], {
   help: 'Theme list, default to be all'
@@ -51,7 +51,7 @@ parser.addArgument(['--no-thumb'], {
 });
 
 const args = parser.parseArgs();
-const sourceFolder = args.source || 'data';
+const isGL = args.gl;
 let themeList = args.theme || 'default,dark';
 let matchPattern = args.pattern;
 if (matchPattern) {
@@ -107,7 +107,8 @@ async function takeScreenshot(
 ) {
   const thumbFolder = theme !== 'default' ? 'thumb-' + theme : 'thumb';
   const page = await browser.newPage();
-  const thumbDir = `${rootDir}public/${sourceFolder}/${thumbFolder}`;
+  const dataDir = isGL ? 'data-gl' : 'data';
+  const thumbDir = `${rootDir}public/${dataDir}/${thumbFolder}`;
   const fileBase = `${thumbDir}/${basename}`;
   const webmFile = `${fileBase}.webm`;
 
@@ -138,7 +139,9 @@ async function takeScreenshot(
     width: shotWidth || DEFAULT_PAGE_WIDTH,
     height: (shotWidth || DEFAULT_PAGE_WIDTH) * DEFAULT_PAGE_RATIO
   });
-  let url = `${SCREENSHOT_PAGE_URL}?c=${basename}&t=${theme}&s=${sourceFolder}`;
+  let url = `${SCREENSHOT_PAGE_URL}?c=${basename}&t=${theme}${
+    isGL ? '&gl' : ''
+  }`;
 
   if (hasVideo) {
     url += `&start=${videoStart}&end=${videoEnd}`;
@@ -193,9 +196,9 @@ async function takeScreenshot(
         return _$getEChartsOption();
       });
       const optionStr = optionToJson(option);
-      fse.ensureDirSync(`${rootDir}public/${sourceFolder}/option/`);
+      fse.ensureDirSync(`${rootDir}public/${dataDir}/option/`);
       fs.writeFileSync(
-        `${rootDir}public/${sourceFolder}/option/${basename}.json`,
+        `${rootDir}public/${dataDir}/option/${basename}.json`,
         optionStr,
         'utf-8'
       );
@@ -261,7 +264,9 @@ async function takeScreenshot(
   // TODO puppeteer will have Navigation Timeout Exceeded: 30000ms exceeded error in these examples.
   const screenshotBlackList = [];
 
-  const files = await globby(`${rootDir}public/${sourceFolder}/*.js`);
+  const files = await globby(
+    `${rootDir}public/examples/js/${isGL ? 'gl/' : ''}*.js`
+  );
 
   const exampleList = [];
 
@@ -286,10 +291,7 @@ async function takeScreenshot(
 
       let fmResult;
       try {
-        const code = fs.readFileSync(
-          `${rootDir}public/${sourceFolder}/${basename}.js`,
-          'utf-8'
-        );
+        const code = fs.readFileSync(fileName, 'utf-8');
         fmResult = matter(code, {
           delimiters: ['/*', '*/']
         });
@@ -355,7 +357,10 @@ export default ${JSON.stringify(exampleList, null, 2)}`;
 
   if (!matchPattern) {
     fs.writeFileSync(
-      path.join(__dirname, `../src/data/chart-list-${sourceFolder}.js`),
+      path.join(
+        __dirname,
+        `../src/data/chart-list-data${isGL ? '-gl' : ''}.js`
+      ),
       code,
       'utf-8'
     );
@@ -420,7 +425,7 @@ export default ${JSON.stringify(exampleList, null, 2)}`;
             }
           );
         },
-        sourceFolder === 'data-gl' ? 2 : 16
+        isGL ? 2 : 16
       );
 
       await runTasks(
diff --git a/tool/compile-example.js b/tool/compile-example.js
new file mode 100644
index 0000000..321bf4c
--- /dev/null
+++ b/tool/compile-example.js
@@ -0,0 +1,35 @@
+const globby = require('globby');
+const fs = require('fs');
+const path = require('path');
+const shell = require('shelljs');
+
+const exampleDir = path.join(__dirname, '../public/examples');
+
+async function run() {
+  const hasError =
+    shell.exec(`tsc --project ${path.join(exampleDir, 'tsconfig.json')}`)
+      .code !== 0;
+  shell.exec(`prettier --write ${path.join(exampleDir, 'js')}`);
+
+  const files = await globby(path.join(exampleDir, `js/**/*.js`));
+
+  for (let file of files) {
+    const content =
+      fs
+        .readFileSync(file, 'utf-8')
+        .trim()
+        // ts code needs add `export {}` to be a module. remove it.
+        // FIXME
+        .replace(/export\s+\{\s*\}\s*;?$/g, '')
+        .replace(/^'use strict';/, '')
+        .trim() + '\n';
+
+    fs.writeFileSync(file, content, 'utf-8');
+  }
+
+  if (hasError) {
+    shell.exit(1);
+  }
+}
+
+run();
diff --git a/tool/screenshot.html b/tool/screenshot.html
index ebab89e..271e8cc 100644
--- a/tool/screenshot.html
+++ b/tool/screenshot.html
@@ -141,10 +141,11 @@
           console.error('No ROOT_PATH specified. Use default ROOT_PATH "."');
           window.ROOT_PATH = '.';
         }
-        const sourceFolder = params.s || 'data';
         const scriptTag = document.createElement('script');
         scriptTag.async = false;
-        scriptTag.src = `../public/${sourceFolder}/${params.c}.js`;
+        scriptTag.src = `../public/examples/js${'gl' in params ? '/gl' : ''}/${
+          params.c
+        }.js`;
         document.body.appendChild(scriptTag);
 
         let videoRecorder;

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@echarts.apache.org
For additional commands, e-mail: commits-help@echarts.apache.org


[echarts-examples] 13/15: fix ts tag still show on js only example

Posted by sh...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

shenyi pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/echarts-examples.git

commit bf9114ee91da8cd9686ecc3f4e23cffbcc80bd3f
Author: pissang <bm...@gmail.com>
AuthorDate: Thu Sep 9 13:36:26 2021 +0800

    fix ts tag still show on js only example
---
 src/explore/ExampleCard.vue | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/src/explore/ExampleCard.vue b/src/explore/ExampleCard.vue
index ba6de53..3ac1630 100644
--- a/src/explore/ExampleCard.vue
+++ b/src/explore/ExampleCard.vue
@@ -10,7 +10,13 @@
     <div>
       <div class="example-langs">
         <a class="js" :href="exampleLink" target="_blank">JS</a>
-        <a class="ts" :href="exampleLink + '&lang=ts'" target="_blank">TS</a>
+        <a
+          class="ts"
+          :href="exampleLink + '&lang=ts'"
+          v-if="example.ts"
+          target="_blank"
+          >TS</a
+        >
       </div>
       <div>
         <div class="example-title">{{ title }}</div>

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@echarts.apache.org
For additional commands, e-mail: commits-help@echarts.apache.org


[echarts-examples] 15/15: fix doc link lang

Posted by sh...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

shenyi pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/echarts-examples.git

commit 665dcbd12c9150ec8bd01e7372695c5147115ca9
Author: pissang <bm...@gmail.com>
AuthorDate: Fri Sep 10 10:41:37 2021 +0800

    fix doc link lang
---
 src/editor/Editor.vue | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/editor/Editor.vue b/src/editor/Editor.vue
index 25cd2e3..1c5065a 100644
--- a/src/editor/Editor.vue
+++ b/src/editor/Editor.vue
@@ -281,6 +281,7 @@ export default {
         return;
       }
       const tipTitle = this.$t('editor.tooltip.gotoDoc');
+      const lang = this.$i18n.locale;
       mount(option, this.$el.querySelector('#option-outline'), {
         getKeys(object, path) {
           return Object.keys(object).filter((key) => {
@@ -320,7 +321,7 @@ export default {
           }
 
           const isObjOrArray = typeof obj === 'object' && obj != null;
-          const link = `https://echarts.apache.org/zh/option.html#${hash.join(
+          const link = `https://echarts.apache.org/${lang}/option.html#${hash.join(
             '.'
           )}`;
           return !isObjOrArray

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@echarts.apache.org
For additional commands, e-mail: commits-help@echarts.apache.org


[echarts-examples] 05/15: feat: add ts and js switch. add prettier

Posted by sh...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

shenyi pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/echarts-examples.git

commit 85dfdafbd3a7349dfdacd4c7b060c8d40abcb634
Author: pissang <bm...@gmail.com>
AuthorDate: Tue Sep 7 13:40:05 2021 +0800

    feat: add ts and js switch. add prettier
---
 package.json              |   4 +-
 src/common/config.js      |   4 +-
 src/common/i18n.js        |  21 ++++--
 src/common/route.js       |  30 ++++++++
 src/common/store.js       |   2 +-
 src/editor/CodeMonaco.vue |  25 ++++++-
 src/editor/Editor.vue     | 177 +++++++++++++++++++++++++++++++++++++++++-----
 src/editor/Preview.vue    |  25 +++++--
 8 files changed, 253 insertions(+), 35 deletions(-)

diff --git a/package.json b/package.json
index 26fe6df..cbc49e1 100644
--- a/package.json
+++ b/package.json
@@ -44,7 +44,6 @@
     "open": "^7.1.0",
     "pixelmatch": "^5.2.1",
     "pngjs": "^6.0.0",
-    "prettier": "^2.3.2",
     "sass.js": "^0.11.1",
     "sassjs-loader": "^2.0.0",
     "seedrandom": "^3.0.5",
@@ -67,6 +66,7 @@
     "sucrase": "^3.17.0",
     "vanilla-lazyload": "^12.5.1",
     "vue-i18n": "^8.18.2",
-    "vue-scrollactive": "^0.9.3"
+    "vue-scrollactive": "^0.9.3",
+    "prettier": "^2.3.2"
   }
 }
diff --git a/src/common/config.js b/src/common/config.js
index e46cf9f..472658a 100644
--- a/src/common/config.js
+++ b/src/common/config.js
@@ -134,5 +134,7 @@ export const SCRIPT_URLS = {
   datGUIMinJS:
     'https://cdn.jsdelivr.net/npm/dat.gui@0.6.5/build/dat.gui.min.js',
   monacoDir: 'https://cdn.jsdelivr.net/npm/monaco-editor@0.27.0/min/vs',
-  aceDir: 'https://cdn.jsdelivr.net/npm/ace-builds@1.4.12/src-min-noconflict'
+  aceDir: 'https://cdn.jsdelivr.net/npm/ace-builds@1.4.12/src-min-noconflict',
+
+  prettierDir: 'https://cdn.jsdelivr.net/npm/prettier@2.3.2'
 };
diff --git a/src/common/i18n.js b/src/common/i18n.js
index 88e6493..206515a 100644
--- a/src/common/i18n.js
+++ b/src/common/i18n.js
@@ -2,6 +2,7 @@ export default {
   en: {
     editor: {
       run: 'Run',
+      format: 'Format',
       errorInEditor: 'Errors exist in code!',
       chartOK: 'Chart has been generated successfully, ',
 
@@ -16,12 +17,16 @@ export default {
       download: 'Download',
 
       edit: 'Edit',
-      monacoMode: 'Enable Type Checking',
 
-      tabEditor: 'Edit Example',
+      tabEditor: 'Edit Code',
       tabFullCodePreview: 'Full Code',
       tabOptionPreview: 'Option Preview',
-      minimalBundle: 'Minimal Bundle'
+      minimalBundle: 'Minimal Bundle',
+
+      tooltip: {
+        jsMode: 'JavaScript',
+        tsMode: 'TypeScript. Provides Better Intelligent'
+      }
     },
 
     chartTypes: {
@@ -69,6 +74,7 @@ export default {
   zh: {
     editor: {
       run: '运行',
+      format: '格式化',
       errorInEditor: '编辑器内容有误!',
       chartOK: '图表已生成, ',
 
@@ -84,10 +90,15 @@ export default {
       edit: '编辑',
       monacoMode: '开启类型检查',
 
-      tabEditor: '示例编辑',
+      tabEditor: '代码编辑',
       tabFullCodePreview: '完整代码',
       tabOptionPreview: '配置项',
-      minimalBundle: '按需引入'
+      minimalBundle: '按需引入',
+
+      tooltip: {
+        jsMode: 'JavaScript 代码编辑',
+        tsMode: 'TypeScript 代码编辑,提供更好的代码补全和类型检查。'
+      }
     },
 
     chartTypes: {
diff --git a/src/common/route.js b/src/common/route.js
new file mode 100644
index 0000000..4ede915
--- /dev/null
+++ b/src/common/route.js
@@ -0,0 +1,30 @@
+export function getURL(params) {
+  const searchUrlParts = [];
+  for (let key in params) {
+    if (params.hasOwnProperty(key)) {
+      let part = key;
+      if (params[key] != null) {
+        part += '=' + params[key];
+      }
+      searchUrlParts.push(part);
+    }
+  }
+  const searchUrl = searchUrlParts.join('&');
+
+  return (
+    location.protocol +
+    '//' +
+    location.hostname +
+    (location.port ? ':' + location.port : '') +
+    location.pathname +
+    (searchUrl ? '?' + searchUrl : '')
+  );
+}
+
+export function goto(params, pushHistory) {
+  if (pushHistory) {
+    history.pushState({}, getURL(params));
+  } else {
+    location.href = getURL(params);
+  }
+}
diff --git a/src/common/store.js b/src/common/store.js
index de6d12b..f6a56df 100644
--- a/src/common/store.js
+++ b/src/common/store.js
@@ -10,7 +10,7 @@ export const store = {
   enableDecal: 'decal' in URL_PARAMS,
   renderer: URL_PARAMS.renderer || 'canvas',
 
-  typeCheck: 'ts' in URL_PARAMS,
+  typeCheck: (URL_PARAMS.lang || '').toLowerCase() === 'ts',
   useDirtyRect: 'useDirtyRect' in URL_PARAMS,
 
   runCode: '',
diff --git a/src/editor/CodeMonaco.vue b/src/editor/CodeMonaco.vue
index ab68cb8..85224a7 100644
--- a/src/editor/CodeMonaco.vue
+++ b/src/editor/CodeMonaco.vue
@@ -97,6 +97,9 @@ function ensureMonacoAndTsTransformer() {
         return new Promise((resolve) => {
           window.require(['vs/editor/editor.main'], function () {
             loadTypes().then(() => {
+              // Disable AMD. Which will break other libs.
+              // FIXME
+              window.define.amd = null;
               resolve();
             });
           });
@@ -163,7 +166,27 @@ export default {
   methods: {
     setInitialCode(code) {
       if (this._editor && code) {
-        this._editor.setValue(code || '');
+        // this._editor.setValue(code || '');
+
+        // https://github.com/microsoft/monaco-editor/issues/299#issuecomment-268423927
+        this._editor.executeEdits('replace', [
+          {
+            identifier: 'delete',
+            range: new monaco.Range(1, 1, 10000, 1),
+            text: '',
+            forceMoveMarkers: true
+          }
+        ]);
+        this._editor.executeEdits('replace', [
+          {
+            identifier: 'insert',
+            range: new monaco.Range(1, 1, 1, 1),
+            text: code,
+            forceMoveMarkers: true
+          }
+        ]);
+        this._editor.setSelection(new monaco.Range(0, 0, 0, 0));
+        // this._editor.setPosition(currentPosition);
       }
     }
   },
diff --git a/src/editor/Editor.vue b/src/editor/Editor.vue
index b8162f7..f0f8abd 100644
--- a/src/editor/Editor.vue
+++ b/src/editor/Editor.vue
@@ -10,13 +10,67 @@
           <span slot="label">{{ $t('editor.tabEditor') }}</span>
           <el-container>
             <el-header id="editor-control-panel">
-              <div class="editor-controls">
-                <a
-                  href="javascript:;"
-                  class="btn btn-default btn-sm"
-                  @click="disposeAndRun"
-                  >{{ $t('editor.run') }}</a
+              <div class="languages">
+                <el-tooltip
+                  :content="$t('editor.tooltip.jsMode')"
+                  placement="bottom"
+                >
+                  <a
+                    :class="{ js: true, active: !shared.typeCheck }"
+                    @click="changeLang('js')"
+                    >JS</a
+                  >
+                </el-tooltip>
+                <el-tooltip
+                  :content="$t('editor.tooltip.tsMode')"
+                  placement="bottom"
                 >
+                  <a
+                    @click="changeLang('ts')"
+                    :class="{ ts: true, active: shared.typeCheck }"
+                    >TS</a
+                  >
+                </el-tooltip>
+              </div>
+              <div class="editor-controls">
+                <a class="btn btn-sm format" @click="format">
+                  <svg
+                    xmlns="http://www.w3.org/2000/svg"
+                    fill="none"
+                    viewBox="0 0 24 24"
+                    stroke="currentColor"
+                  >
+                    <path
+                      stroke-linecap="round"
+                      stroke-linejoin="round"
+                      stroke-width="2"
+                      d="M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4"
+                    />
+                  </svg>
+                  <span>{{ $t('editor.format') }}</span>
+                </a>
+                <a class="btn btn-default btn-sm run" @click="disposeAndRun">
+                  <svg
+                    xmlns="http://www.w3.org/2000/svg"
+                    fill="none"
+                    viewBox="0 0 24 24"
+                    stroke="currentColor"
+                  >
+                    <path
+                      stroke-linecap="round"
+                      stroke-linejoin="round"
+                      stroke-width="2"
+                      d="M14.752 11.168l-3.197-2.132A1 1 0 0010 9.87v4.263a1 1 0 001.555.832l3.197-2.132a1 1 0 000-1.664z"
+                    />
+                    <path
+                      stroke-linecap="round"
+                      stroke-linejoin="round"
+                      stroke-width="2"
+                      d="M21 12a9 9 0 11-18 0 9 9 0 0118 0z"
+                    />
+                  </svg>
+                  <span>{{ $t('editor.run') }}</span>
+                </a>
               </div>
             </el-header>
             <el-main>
@@ -51,6 +105,7 @@
               >
               </el-switch>
               <el-switch
+                v-if="!shared.typeCheck"
                 v-model="fullCodeConfig.esm"
                 active-text="ES Modules"
                 :inactive-text="''"
@@ -62,6 +117,7 @@
             </el-main>
           </el-container>
         </el-tab-pane>
+
         <el-tab-pane :label="$t('editor.tabOptionPreview')" name="full-option">
           <div id="option-outline"></div>
         </el-tab-pane>
@@ -93,10 +149,23 @@ import FullCodePreview from './FullCodePreview.vue';
 import Preview from './Preview.vue';
 import { store, loadExampleCode, parseSourceCode } from '../common/store';
 import { collectDeps, buildExampleCode } from '../../common/buildCode';
+import { goto } from '../common/route';
 import { mount } from '@lang/object-visualizer';
 
 import './object-visualizer.css';
-
+import { SCRIPT_URLS, URL_PARAMS } from '../common/config';
+import { loadScriptsAsync } from '../common/helper';
+
+function ensurePrettier() {
+  if (typeof prettier === 'undefined') {
+    return loadScriptsAsync([
+      SCRIPT_URLS.prettierDir + '/standalone.js',
+      SCRIPT_URLS.prettierDir +
+        (store.typeCheck ? '/parser-typescript.js' : '/parser-babel.js')
+    ]).then(([_, parser]) => {});
+  }
+  return Promise.resolve();
+}
 export default {
   components: {
     CodeAce,
@@ -220,15 +289,35 @@ export default {
       } else if (tab === 'full-option') {
         this.updateOptionOutline();
       }
+    },
+    changeLang(lang) {
+      if ((URL_PARAMS.lang || 'js').toLowerCase() !== lang) {
+        goto(
+          Object.assign({}, URL_PARAMS, {
+            lang
+          })
+        );
+      }
+    },
+    format() {
+      ensurePrettier().then(() => {
+        this.initialCode = prettier.format(store.sourceCode, {
+          singleQuote: true,
+          tabWidth: 2,
+          printWidth: 80,
+          semi: true,
+          trailingComma: 'none',
+          // tabWidth: +this.formatCodeSettings.tabSize,
+          // printWidth: +this.formatCodeSettings.maxLineWidth,
+          parser: store.typeCheck ? 'typescript' : 'babel',
+          plugins: prettierPlugins
+        });
+        this.updateFullCode();
+      });
     }
   },
 
   watch: {
-    'shared.typeCheck'(enableTypeCheck) {
-      // Update initialCode to avoid code changed when switching editor
-      this.initialCode = store.sourceCode;
-      this.updateFullCode();
-    },
     currentTab(tab) {
       this.updateTabContent(tab);
     },
@@ -393,6 +482,43 @@ $handler-width: 5px;
     }
   }
 
+  .languages {
+    display: inline-block;
+    padding: 2px 10px;
+    font-weight: bold;
+
+    a {
+      display: inline-block;
+      padding: 3px 10px;
+      margin-left: 5px;
+      vertical-align: middle;
+      cursor: pointer;
+
+      &.ts {
+        color: #3178c6;
+      }
+
+      &.js {
+        color: #000;
+      }
+
+      &.active {
+        font-size: 12px;
+        border-radius: 3px;
+
+        &.js {
+          background: #f7df1e;
+          color: #000;
+        }
+
+        &.ts {
+          background: #3178c6;
+          color: #fff;
+        }
+      }
+    }
+  }
+
   .editor-controls {
     float: right;
 
@@ -404,16 +530,31 @@ $handler-width: 5px;
     }
 
     .btn {
-      color: #fff;
       border-radius: 0;
-      background-color: #409eff;
       margin-left: $pd-basic;
       border: none;
       height: 30px;
-      width: 50px;
-    }
-    .btn:hover {
-      background-color: lighten($color: #409eff, $amount: 5);
+
+      background: none;
+      color: $clr-text;
+
+      & > * {
+        display: inline-block;
+        vertical-align: middle;
+      }
+
+      svg {
+        width: 15px;
+        height: 15px;
+      }
+
+      &.run {
+        color: #fff;
+        background-color: #409eff;
+      }
+      &.run:hover {
+        background-color: lighten($color: #409eff, $amount: 5);
+      }
     }
   }
 }
diff --git a/src/editor/Preview.vue b/src/editor/Preview.vue
index 46d9535..dd573d5 100644
--- a/src/editor/Preview.vue
+++ b/src/editor/Preview.vue
@@ -26,7 +26,6 @@
           :inactive-text="''"
         >
         </el-switch>
-
         <el-popover
           placement="bottom"
           width="450"
@@ -72,9 +71,19 @@
         >
           {{ $t('editor.download') }}
         </button>
-        <a class="screenshot" @click="screenshot" target="_blank"
-          ><i class="el-icon-camera-solid"></i
-        ></a>
+        <a class="screenshot" @click="screenshot" target="_blank">
+          <svg
+            xmlns="http://www.w3.org/2000/svg"
+            viewBox="0 0 20 20"
+            fill="currentColor"
+          >
+            <path
+              fill-rule="evenodd"
+              d="M4 5a2 2 0 00-2 2v8a2 2 0 002 2h12a2 2 0 002-2V7a2 2 0 00-2-2h-1.586a1 1 0 01-.707-.293l-1.121-1.121A2 2 0 0011.172 3H8.828a2 2 0 00-1.414.586L6.293 4.707A1 1 0 015.586 5H4zm6 9a3 3 0 100-6 3 3 0 000 6z"
+              clip-rule="evenodd"
+            />
+          </svg>
+        </a>
       </template>
       <a :href="editLink" target="_blank" v-else class="edit btn btn-sm">{{
         $t('editor.edit')
@@ -98,7 +107,7 @@ import { SCRIPT_URLS, URL_PARAMS } from '../common/config';
 import { loadScriptsAsync } from '../common/helper';
 import { createSandbox } from './sandbox';
 import debounce from 'lodash/debounce';
-import { addListener, removeListener } from 'resize-detector';
+import { addListener } from 'resize-detector';
 import CHART_LIST from '../data/chart-list-data';
 import CHART_LIST_GL from '../data/chart-list-data-gl';
 import { download } from './downloadExample';
@@ -416,8 +425,10 @@ export default {
     cursor: pointer;
   }
   .screenshot {
-    font-size: 22px;
-    margin-right: 10px;
+    margin-right: 5px;
+    width: 25px;
+    height: 25px;
+    margin-top: 2px;
   }
 }
 

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@echarts.apache.org
For additional commands, e-mail: commits-help@echarts.apache.org