From 94c2214b819c4fe75a479f37aaad99e90bfe5b63 Mon Sep 17 00:00:00 2001
From: Marvin Borner
Date: Tue, 7 May 2019 18:59:17 +0200
Subject: Almost completely overridden and overworked project
---
.gitignore | 6 +-
README.md | 15 +-
assets/css/grid.css | 852 --
assets/css/main.css | 35 +
assets/css/main.sass | 68 -
assets/css/normalize.css | 549 +-
assets/js/chart.js | 25149 ++++++++++++++++++++++++++++++----------
assets/js/d3.js | 10554 -----------------
assets/js/heatmap.js | 339 -
assets/js/jQuery.js | 3939 -------
assets/js/main.js | 595 +-
assets/js/moment.js | 1 -
assets/php/getData.php | 46 +
assets/php/getInformation.php | 17 -
assets/php/getNetflixJson.php | 34 -
index.html | 61 +-
16 files changed, 19753 insertions(+), 22507 deletions(-)
mode change 100755 => 100644 .gitignore
delete mode 100644 assets/css/grid.css
create mode 100644 assets/css/main.css
delete mode 100644 assets/css/main.sass
delete mode 100644 assets/js/d3.js
delete mode 100644 assets/js/heatmap.js
delete mode 100755 assets/js/jQuery.js
delete mode 100644 assets/js/moment.js
create mode 100755 assets/php/getData.php
delete mode 100644 assets/php/getInformation.php
delete mode 100755 assets/php/getNetflixJson.php
diff --git a/.gitignore b/.gitignore
old mode 100755
new mode 100644
index cc47d6c..44474c4
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1 @@
-assets/js/ExampleData.js
-assets/css/main.css
-assets/css/main.css.map
-
-min
\ No newline at end of file
+ .idea
diff --git a/README.md b/README.md
index 9f52d8f..dcff592 100755
--- a/README.md
+++ b/README.md
@@ -1,3 +1,14 @@
# NetflixPersonalStats
-This tool uses the unofficial private api of netflix in combination of the users cookie
-to display cool graphs and information about your watching behavior.
\ No newline at end of file
+
+## Instructions
+* Clone the GitHub Repository with `git clone https://github.com/marvinborner/NetFlixPersonalStats`
+* Move into the directory and setup a local PHP Server (eg. with `php -S localhost:8080`)
+* Get your Netflix cookie by
+ * visiting `https://www.netflix.com/WiViewingActivity`
+ * pressing `F12` (Developer Menu)
+ * moving to the `Network` Tab
+ * selecting the first entry in the left sidebar ("WiViewingActivity"")
+ * copying the **complete** String of the "Cookie:" information in the "request headers" part
+ (make sure it looks like `memclid=***; otherNetflixCookie=****:` and so on)
+* Visit `localhost:8080`, paste the cookie into the input field and press enter
+* Get amazed of how long you're using Netflix every day
diff --git a/assets/css/grid.css b/assets/css/grid.css
deleted file mode 100644
index 7e27ea9..0000000
--- a/assets/css/grid.css
+++ /dev/null
@@ -1,852 +0,0 @@
-.container,
-.container-fluid {
- margin-right: auto;
- margin-left: auto
-}
-
-.container-fluid {
- padding-right: 2rem;
- padding-left: 2rem
-}
-
-.row {
- box-sizing: border-box;
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- -webkit-box-flex: 0;
- -ms-flex: 0 1 auto;
- flex: 0 1 auto;
- -webkit-box-orient: horizontal;
- -webkit-box-direction: normal;
- -ms-flex-direction: row;
- flex-direction: row;
- -ms-flex-wrap: wrap;
- flex-wrap: wrap;
- margin-right: -.5rem;
- margin-left: -.5rem
-}
-
-.row.reverse {
- -webkit-box-orient: horizontal;
- -webkit-box-direction: reverse;
- -ms-flex-direction: row-reverse;
- flex-direction: row-reverse
-}
-
-.col.reverse {
- -webkit-box-orient: vertical;
- -webkit-box-direction: reverse;
- -ms-flex-direction: column-reverse;
- flex-direction: column-reverse
-}
-
-.col-xs,
-.col-xs-1,
-.col-xs-10,
-.col-xs-11,
-.col-xs-12,
-.col-xs-2,
-.col-xs-3,
-.col-xs-4,
-.col-xs-5,
-.col-xs-6,
-.col-xs-7,
-.col-xs-8,
-.col-xs-9,
-.col-xs-offset-0,
-.col-xs-offset-1,
-.col-xs-offset-10,
-.col-xs-offset-11,
-.col-xs-offset-12,
-.col-xs-offset-2,
-.col-xs-offset-3,
-.col-xs-offset-4,
-.col-xs-offset-5,
-.col-xs-offset-6,
-.col-xs-offset-7,
-.col-xs-offset-8,
-.col-xs-offset-9 {
- box-sizing: border-box;
- -webkit-box-flex: 0;
- -ms-flex: 0 0 auto;
- flex: 0 0 auto;
- padding-right: .5rem;
- padding-left: .5rem
-}
-
-.col-xs {
- -webkit-box-flex: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -ms-flex-preferred-size: 0;
- flex-basis: 0;
- max-width: 100%
-}
-
-.col-xs-1 {
- -ms-flex-preferred-size: 8.33333333%;
- flex-basis: 8.33333333%;
- max-width: 8.33333333%
-}
-
-.col-xs-2 {
- -ms-flex-preferred-size: 16.66666667%;
- flex-basis: 16.66666667%;
- max-width: 16.66666667%
-}
-
-.col-xs-3 {
- -ms-flex-preferred-size: 25%;
- flex-basis: 25%;
- max-width: 25%
-}
-
-.col-xs-4 {
- -ms-flex-preferred-size: 33.33333333%;
- flex-basis: 33.33333333%;
- max-width: 33.33333333%
-}
-
-.col-xs-5 {
- -ms-flex-preferred-size: 41.66666667%;
- flex-basis: 41.66666667%;
- max-width: 41.66666667%
-}
-
-.col-xs-6 {
- -ms-flex-preferred-size: 50%;
- flex-basis: 50%;
- max-width: 50%
-}
-
-.col-xs-7 {
- -ms-flex-preferred-size: 58.33333333%;
- flex-basis: 58.33333333%;
- max-width: 58.33333333%
-}
-
-.col-xs-8 {
- -ms-flex-preferred-size: 66.66666667%;
- flex-basis: 66.66666667%;
- max-width: 66.66666667%
-}
-
-.col-xs-9 {
- -ms-flex-preferred-size: 75%;
- flex-basis: 75%;
- max-width: 75%
-}
-
-.col-xs-10 {
- -ms-flex-preferred-size: 83.33333333%;
- flex-basis: 83.33333333%;
- max-width: 83.33333333%
-}
-
-.col-xs-11 {
- -ms-flex-preferred-size: 91.66666667%;
- flex-basis: 91.66666667%;
- max-width: 91.66666667%
-}
-
-.col-xs-12 {
- -ms-flex-preferred-size: 100%;
- flex-basis: 100%;
- max-width: 100%
-}
-
-.col-xs-offset-0 {
- margin-left: 0
-}
-
-.col-xs-offset-1 {
- margin-left: 8.33333333%
-}
-
-.col-xs-offset-2 {
- margin-left: 16.66666667%
-}
-
-.col-xs-offset-3 {
- margin-left: 25%
-}
-
-.col-xs-offset-4 {
- margin-left: 33.33333333%
-}
-
-.col-xs-offset-5 {
- margin-left: 41.66666667%
-}
-
-.col-xs-offset-6 {
- margin-left: 50%
-}
-
-.col-xs-offset-7 {
- margin-left: 58.33333333%
-}
-
-.col-xs-offset-8 {
- margin-left: 66.66666667%
-}
-
-.col-xs-offset-9 {
- margin-left: 75%
-}
-
-.col-xs-offset-10 {
- margin-left: 83.33333333%
-}
-
-.col-xs-offset-11 {
- margin-left: 91.66666667%
-}
-
-.start-xs {
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- justify-content: flex-start;
- text-align: start
-}
-
-.center-xs {
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- justify-content: center;
- text-align: center
-}
-
-.end-xs {
- -webkit-box-pack: end;
- -ms-flex-pack: end;
- justify-content: flex-end;
- text-align: end
-}
-
-.top-xs {
- -webkit-box-align: start;
- -ms-flex-align: start;
- align-items: flex-start
-}
-
-.middle-xs {
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center
-}
-
-.bottom-xs {
- -webkit-box-align: end;
- -ms-flex-align: end;
- align-items: flex-end
-}
-
-.around-xs {
- -ms-flex-pack: distribute;
- justify-content: space-around
-}
-
-.between-xs {
- -webkit-box-pack: justify;
- -ms-flex-pack: justify;
- justify-content: space-between
-}
-
-.first-xs {
- -webkit-box-ordinal-group: 0;
- -ms-flex-order: -1;
- order: -1
-}
-
-.last-xs {
- -webkit-box-ordinal-group: 2;
- -ms-flex-order: 1;
- order: 1
-}
-
-@media only screen and (min-width:48em) {
- .container {
- width: 49rem
- }
- .col-sm,
- .col-sm-1,
- .col-sm-10,
- .col-sm-11,
- .col-sm-12,
- .col-sm-2,
- .col-sm-3,
- .col-sm-4,
- .col-sm-5,
- .col-sm-6,
- .col-sm-7,
- .col-sm-8,
- .col-sm-9,
- .col-sm-offset-0,
- .col-sm-offset-1,
- .col-sm-offset-10,
- .col-sm-offset-11,
- .col-sm-offset-12,
- .col-sm-offset-2,
- .col-sm-offset-3,
- .col-sm-offset-4,
- .col-sm-offset-5,
- .col-sm-offset-6,
- .col-sm-offset-7,
- .col-sm-offset-8,
- .col-sm-offset-9 {
- box-sizing: border-box;
- -webkit-box-flex: 0;
- -ms-flex: 0 0 auto;
- flex: 0 0 auto;
- padding-right: .5rem;
- padding-left: .5rem
- }
- .col-sm {
- -webkit-box-flex: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -ms-flex-preferred-size: 0;
- flex-basis: 0;
- max-width: 100%
- }
- .col-sm-1 {
- -ms-flex-preferred-size: 8.33333333%;
- flex-basis: 8.33333333%;
- max-width: 8.33333333%
- }
- .col-sm-2 {
- -ms-flex-preferred-size: 16.66666667%;
- flex-basis: 16.66666667%;
- max-width: 16.66666667%
- }
- .col-sm-3 {
- -ms-flex-preferred-size: 25%;
- flex-basis: 25%;
- max-width: 25%
- }
- .col-sm-4 {
- -ms-flex-preferred-size: 33.33333333%;
- flex-basis: 33.33333333%;
- max-width: 33.33333333%
- }
- .col-sm-5 {
- -ms-flex-preferred-size: 41.66666667%;
- flex-basis: 41.66666667%;
- max-width: 41.66666667%
- }
- .col-sm-6 {
- -ms-flex-preferred-size: 50%;
- flex-basis: 50%;
- max-width: 50%
- }
- .col-sm-7 {
- -ms-flex-preferred-size: 58.33333333%;
- flex-basis: 58.33333333%;
- max-width: 58.33333333%
- }
- .col-sm-8 {
- -ms-flex-preferred-size: 66.66666667%;
- flex-basis: 66.66666667%;
- max-width: 66.66666667%
- }
- .col-sm-9 {
- -ms-flex-preferred-size: 75%;
- flex-basis: 75%;
- max-width: 75%
- }
- .col-sm-10 {
- -ms-flex-preferred-size: 83.33333333%;
- flex-basis: 83.33333333%;
- max-width: 83.33333333%
- }
- .col-sm-11 {
- -ms-flex-preferred-size: 91.66666667%;
- flex-basis: 91.66666667%;
- max-width: 91.66666667%
- }
- .col-sm-12 {
- -ms-flex-preferred-size: 100%;
- flex-basis: 100%;
- max-width: 100%
- }
- .col-sm-offset-0 {
- margin-left: 0
- }
- .col-sm-offset-1 {
- margin-left: 8.33333333%
- }
- .col-sm-offset-2 {
- margin-left: 16.66666667%
- }
- .col-sm-offset-3 {
- margin-left: 25%
- }
- .col-sm-offset-4 {
- margin-left: 33.33333333%
- }
- .col-sm-offset-5 {
- margin-left: 41.66666667%
- }
- .col-sm-offset-6 {
- margin-left: 50%
- }
- .col-sm-offset-7 {
- margin-left: 58.33333333%
- }
- .col-sm-offset-8 {
- margin-left: 66.66666667%
- }
- .col-sm-offset-9 {
- margin-left: 75%
- }
- .col-sm-offset-10 {
- margin-left: 83.33333333%
- }
- .col-sm-offset-11 {
- margin-left: 91.66666667%
- }
- .start-sm {
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- justify-content: flex-start;
- text-align: start
- }
- .center-sm {
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- justify-content: center;
- text-align: center
- }
- .end-sm {
- -webkit-box-pack: end;
- -ms-flex-pack: end;
- justify-content: flex-end;
- text-align: end
- }
- .top-sm {
- -webkit-box-align: start;
- -ms-flex-align: start;
- align-items: flex-start
- }
- .middle-sm {
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center
- }
- .bottom-sm {
- -webkit-box-align: end;
- -ms-flex-align: end;
- align-items: flex-end
- }
- .around-sm {
- -ms-flex-pack: distribute;
- justify-content: space-around
- }
- .between-sm {
- -webkit-box-pack: justify;
- -ms-flex-pack: justify;
- justify-content: space-between
- }
- .first-sm {
- -webkit-box-ordinal-group: 0;
- -ms-flex-order: -1;
- order: -1
- }
- .last-sm {
- -webkit-box-ordinal-group: 2;
- -ms-flex-order: 1;
- order: 1
- }
-}
-
-@media only screen and (min-width:64em) {
- .container {
- width: 65rem
- }
- .col-md,
- .col-md-1,
- .col-md-10,
- .col-md-11,
- .col-md-12,
- .col-md-2,
- .col-md-3,
- .col-md-4,
- .col-md-5,
- .col-md-6,
- .col-md-7,
- .col-md-8,
- .col-md-9,
- .col-md-offset-0,
- .col-md-offset-1,
- .col-md-offset-10,
- .col-md-offset-11,
- .col-md-offset-12,
- .col-md-offset-2,
- .col-md-offset-3,
- .col-md-offset-4,
- .col-md-offset-5,
- .col-md-offset-6,
- .col-md-offset-7,
- .col-md-offset-8,
- .col-md-offset-9 {
- box-sizing: border-box;
- -webkit-box-flex: 0;
- -ms-flex: 0 0 auto;
- flex: 0 0 auto;
- padding-right: .5rem;
- padding-left: .5rem
- }
- .col-md {
- -webkit-box-flex: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -ms-flex-preferred-size: 0;
- flex-basis: 0;
- max-width: 100%
- }
- .col-md-1 {
- -ms-flex-preferred-size: 8.33333333%;
- flex-basis: 8.33333333%;
- max-width: 8.33333333%
- }
- .col-md-2 {
- -ms-flex-preferred-size: 16.66666667%;
- flex-basis: 16.66666667%;
- max-width: 16.66666667%
- }
- .col-md-3 {
- -ms-flex-preferred-size: 25%;
- flex-basis: 25%;
- max-width: 25%
- }
- .col-md-4 {
- -ms-flex-preferred-size: 33.33333333%;
- flex-basis: 33.33333333%;
- max-width: 33.33333333%
- }
- .col-md-5 {
- -ms-flex-preferred-size: 41.66666667%;
- flex-basis: 41.66666667%;
- max-width: 41.66666667%
- }
- .col-md-6 {
- -ms-flex-preferred-size: 50%;
- flex-basis: 50%;
- max-width: 50%
- }
- .col-md-7 {
- -ms-flex-preferred-size: 58.33333333%;
- flex-basis: 58.33333333%;
- max-width: 58.33333333%
- }
- .col-md-8 {
- -ms-flex-preferred-size: 66.66666667%;
- flex-basis: 66.66666667%;
- max-width: 66.66666667%
- }
- .col-md-9 {
- -ms-flex-preferred-size: 75%;
- flex-basis: 75%;
- max-width: 75%
- }
- .col-md-10 {
- -ms-flex-preferred-size: 83.33333333%;
- flex-basis: 83.33333333%;
- max-width: 83.33333333%
- }
- .col-md-11 {
- -ms-flex-preferred-size: 91.66666667%;
- flex-basis: 91.66666667%;
- max-width: 91.66666667%
- }
- .col-md-12 {
- -ms-flex-preferred-size: 100%;
- flex-basis: 100%;
- max-width: 100%
- }
- .col-md-offset-0 {
- margin-left: 0
- }
- .col-md-offset-1 {
- margin-left: 8.33333333%
- }
- .col-md-offset-2 {
- margin-left: 16.66666667%
- }
- .col-md-offset-3 {
- margin-left: 25%
- }
- .col-md-offset-4 {
- margin-left: 33.33333333%
- }
- .col-md-offset-5 {
- margin-left: 41.66666667%
- }
- .col-md-offset-6 {
- margin-left: 50%
- }
- .col-md-offset-7 {
- margin-left: 58.33333333%
- }
- .col-md-offset-8 {
- margin-left: 66.66666667%
- }
- .col-md-offset-9 {
- margin-left: 75%
- }
- .col-md-offset-10 {
- margin-left: 83.33333333%
- }
- .col-md-offset-11 {
- margin-left: 91.66666667%
- }
- .start-md {
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- justify-content: flex-start;
- text-align: start
- }
- .center-md {
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- justify-content: center;
- text-align: center
- }
- .end-md {
- -webkit-box-pack: end;
- -ms-flex-pack: end;
- justify-content: flex-end;
- text-align: end
- }
- .top-md {
- -webkit-box-align: start;
- -ms-flex-align: start;
- align-items: flex-start
- }
- .middle-md {
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center
- }
- .bottom-md {
- -webkit-box-align: end;
- -ms-flex-align: end;
- align-items: flex-end
- }
- .around-md {
- -ms-flex-pack: distribute;
- justify-content: space-around
- }
- .between-md {
- -webkit-box-pack: justify;
- -ms-flex-pack: justify;
- justify-content: space-between
- }
- .first-md {
- -webkit-box-ordinal-group: 0;
- -ms-flex-order: -1;
- order: -1
- }
- .last-md {
- -webkit-box-ordinal-group: 2;
- -ms-flex-order: 1;
- order: 1
- }
-}
-
-@media only screen and (min-width:75em) {
- .container {
- width: 76rem
- }
- .col-lg,
- .col-lg-1,
- .col-lg-10,
- .col-lg-11,
- .col-lg-12,
- .col-lg-2,
- .col-lg-3,
- .col-lg-4,
- .col-lg-5,
- .col-lg-6,
- .col-lg-7,
- .col-lg-8,
- .col-lg-9,
- .col-lg-offset-0,
- .col-lg-offset-1,
- .col-lg-offset-10,
- .col-lg-offset-11,
- .col-lg-offset-12,
- .col-lg-offset-2,
- .col-lg-offset-3,
- .col-lg-offset-4,
- .col-lg-offset-5,
- .col-lg-offset-6,
- .col-lg-offset-7,
- .col-lg-offset-8,
- .col-lg-offset-9 {
- box-sizing: border-box;
- -webkit-box-flex: 0;
- -ms-flex: 0 0 auto;
- flex: 0 0 auto;
- padding-right: .5rem;
- padding-left: .5rem
- }
- .col-lg {
- -webkit-box-flex: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -ms-flex-preferred-size: 0;
- flex-basis: 0;
- max-width: 100%
- }
- .col-lg-1 {
- -ms-flex-preferred-size: 8.33333333%;
- flex-basis: 8.33333333%;
- max-width: 8.33333333%
- }
- .col-lg-2 {
- -ms-flex-preferred-size: 16.66666667%;
- flex-basis: 16.66666667%;
- max-width: 16.66666667%
- }
- .col-lg-3 {
- -ms-flex-preferred-size: 25%;
- flex-basis: 25%;
- max-width: 25%
- }
- .col-lg-4 {
- -ms-flex-preferred-size: 33.33333333%;
- flex-basis: 33.33333333%;
- max-width: 33.33333333%
- }
- .col-lg-5 {
- -ms-flex-preferred-size: 41.66666667%;
- flex-basis: 41.66666667%;
- max-width: 41.66666667%
- }
- .col-lg-6 {
- -ms-flex-preferred-size: 50%;
- flex-basis: 50%;
- max-width: 50%
- }
- .col-lg-7 {
- -ms-flex-preferred-size: 58.33333333%;
- flex-basis: 58.33333333%;
- max-width: 58.33333333%
- }
- .col-lg-8 {
- -ms-flex-preferred-size: 66.66666667%;
- flex-basis: 66.66666667%;
- max-width: 66.66666667%
- }
- .col-lg-9 {
- -ms-flex-preferred-size: 75%;
- flex-basis: 75%;
- max-width: 75%
- }
- .col-lg-10 {
- -ms-flex-preferred-size: 83.33333333%;
- flex-basis: 83.33333333%;
- max-width: 83.33333333%
- }
- .col-lg-11 {
- -ms-flex-preferred-size: 91.66666667%;
- flex-basis: 91.66666667%;
- max-width: 91.66666667%
- }
- .col-lg-12 {
- -ms-flex-preferred-size: 100%;
- flex-basis: 100%;
- max-width: 100%
- }
- .col-lg-offset-0 {
- margin-left: 0
- }
- .col-lg-offset-1 {
- margin-left: 8.33333333%
- }
- .col-lg-offset-2 {
- margin-left: 16.66666667%
- }
- .col-lg-offset-3 {
- margin-left: 25%
- }
- .col-lg-offset-4 {
- margin-left: 33.33333333%
- }
- .col-lg-offset-5 {
- margin-left: 41.66666667%
- }
- .col-lg-offset-6 {
- margin-left: 50%
- }
- .col-lg-offset-7 {
- margin-left: 58.33333333%
- }
- .col-lg-offset-8 {
- margin-left: 66.66666667%
- }
- .col-lg-offset-9 {
- margin-left: 75%
- }
- .col-lg-offset-10 {
- margin-left: 83.33333333%
- }
- .col-lg-offset-11 {
- margin-left: 91.66666667%
- }
- .start-lg {
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- justify-content: flex-start;
- text-align: start
- }
- .center-lg {
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- justify-content: center;
- text-align: center
- }
- .end-lg {
- -webkit-box-pack: end;
- -ms-flex-pack: end;
- justify-content: flex-end;
- text-align: end
- }
- .top-lg {
- -webkit-box-align: start;
- -ms-flex-align: start;
- align-items: flex-start
- }
- .middle-lg {
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center
- }
- .bottom-lg {
- -webkit-box-align: end;
- -ms-flex-align: end;
- align-items: flex-end
- }
- .around-lg {
- -ms-flex-pack: distribute;
- justify-content: space-around
- }
- .between-lg {
- -webkit-box-pack: justify;
- -ms-flex-pack: justify;
- justify-content: space-between
- }
- .first-lg {
- -webkit-box-ordinal-group: 0;
- -ms-flex-order: -1;
- order: -1
- }
- .last-lg {
- -webkit-box-ordinal-group: 2;
- -ms-flex-order: 1;
- order: 1
- }
-}
\ No newline at end of file
diff --git a/assets/css/main.css b/assets/css/main.css
new file mode 100644
index 0000000..805975f
--- /dev/null
+++ b/assets/css/main.css
@@ -0,0 +1,35 @@
+/**
+ * Stylesheet of the Netflix Stats Generator
+ * @author Marvin Borner
+ * @copyright Marvin Borner 2019
+ */
+
+html, body {
+ padding: 8px;
+ font-family: "Varela Round", sans-serif !important;
+ text-rendering: optimizeLegibility !important;
+}
+
+.loading, .stats {
+ display: none;
+}
+
+.stats {
+ text-align: center;
+}
+
+.stats > div {
+ padding: 8px;
+ margin-top: 8px;
+ border: 1px solid black;
+}
+
+.heatMap {
+ border-collapse: collapse;
+}
+
+.heatMap td {
+ width: 2vw;
+ height: 2vw;
+ border: 1px solid black;
+}
diff --git a/assets/css/main.sass b/assets/css/main.sass
deleted file mode 100644
index 65427d3..0000000
--- a/assets/css/main.sass
+++ /dev/null
@@ -1,68 +0,0 @@
-/**
- * Design of the Netflix Stats Generator
- * @author Marvin Borner
- * @copyright Marvin Borner 2018
-
-//// General
-$BlueColor: #1e3264
-
-html, body
- width: 100vw !important
- background-color: #141518
- font-family: "Varela Round", sans-serif !important
- text-rendering: optimizeLegibility !important
- color: #bbb
- box-sizing: border-box !important
- overflow-x: hidden
-
-.Main
- // display: none
- min-height: 100vh
-
-.row:not(.MostWatchedOverview) div
- border: .5px solid #25272a
-
-//// Charts
-.MostWatchedOverview
- .Description
- margin: 20px
- .MostWatchedPoster
- height: 50%
-
-
-/// Heatmap
-.HeatmapWrap
- max-width: 100vw !important
-
-text.month-name,
-text.calendar-heatmap-legend-text,
-text.day-initial
- fill: #bbb
- font-size: 10px
- font-family: Helvetica, arial, 'Open Sans', sans-serif
-
-
-rect.day-cell:hover
- stroke: #555555
- stroke-width: 1px
-
-
-.day-cell-tooltip
- position: absolute
- z-index: 9999
- padding: 5px 9px
- color: #bbbbbb
- font-size: 12px
- background: rgba(0, 0, 0, 0.85)
- border-radius: 3px
- text-align: center
-
-
-.day-cell-tooltip>span
- font-family: Helvetica, arial, 'Open Sans', sans-serif
-
-
-.calendar-heatmap
- overflow: visible
- box-sizing: initial
-
diff --git a/assets/css/normalize.css b/assets/css/normalize.css
index 3c3b6b4..b532f93 100644
--- a/assets/css/normalize.css
+++ b/assets/css/normalize.css
@@ -11,332 +11,331 @@
html {
line-height: 1.15; /* 1 */
-webkit-text-size-adjust: 100%; /* 2 */
- }
-
- /* Sections
- ========================================================================== */
-
- /**
- * Remove the margin in all browsers.
- */
-
- body {
+}
+
+/* Sections
+ ========================================================================== */
+
+/**
+ * Remove the margin in all browsers.
+ */
+
+body {
margin: 0;
- }
-
- /**
- * Correct the font size and margin on `h1` elements within `section` and
- * `article` contexts in Chrome, Firefox, and Safari.
- */
-
- h1 {
+}
+
+/**
+ * Correct the font size and margin on `h1` elements within `section` and
+ * `article` contexts in Chrome, Firefox, and Safari.
+ */
+
+h1 {
font-size: 2em;
margin: 0.67em 0;
- }
-
- /* Grouping content
- ========================================================================== */
-
- /**
- * 1. Add the correct box sizing in Firefox.
- * 2. Show the overflow in Edge and IE.
- */
-
- hr {
+}
+
+/* Grouping content
+ ========================================================================== */
+
+/**
+ * 1. Add the correct box sizing in Firefox.
+ * 2. Show the overflow in Edge and IE.
+ */
+
+hr {
box-sizing: content-box; /* 1 */
height: 0; /* 1 */
overflow: visible; /* 2 */
- }
-
- /**
- * 1. Correct the inheritance and scaling of font size in all browsers.
- * 2. Correct the odd `em` font sizing in all browsers.
- */
-
- pre {
+}
+
+/**
+ * 1. Correct the inheritance and scaling of font size in all browsers.
+ * 2. Correct the odd `em` font sizing in all browsers.
+ */
+
+pre {
font-family: monospace, monospace; /* 1 */
font-size: 1em; /* 2 */
- }
-
- /* Text-level semantics
- ========================================================================== */
-
- /**
- * Remove the gray background on active links in IE 10.
- */
-
- a {
+}
+
+/* Text-level semantics
+ ========================================================================== */
+
+/**
+ * Remove the gray background on active links in IE 10.
+ */
+
+a {
background-color: transparent;
- }
-
- /**
- * 1. Remove the bottom border in Chrome 57-
- * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
- */
-
- abbr[title] {
+}
+
+/**
+ * 1. Remove the bottom border in Chrome 57-
+ * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
+ */
+
+abbr[title] {
border-bottom: none; /* 1 */
text-decoration: underline; /* 2 */
text-decoration: underline dotted; /* 2 */
- }
-
- /**
- * Add the correct font weight in Chrome, Edge, and Safari.
- */
-
- b,
- strong {
+}
+
+/**
+ * Add the correct font weight in Chrome, Edge, and Safari.
+ */
+
+b,
+strong {
font-weight: bolder;
- }
-
- /**
- * 1. Correct the inheritance and scaling of font size in all browsers.
- * 2. Correct the odd `em` font sizing in all browsers.
- */
-
- code,
- kbd,
- samp {
+}
+
+/**
+ * 1. Correct the inheritance and scaling of font size in all browsers.
+ * 2. Correct the odd `em` font sizing in all browsers.
+ */
+
+code,
+kbd,
+samp {
font-family: monospace, monospace; /* 1 */
font-size: 1em; /* 2 */
- }
-
- /**
- * Add the correct font size in all browsers.
- */
-
- small {
+}
+
+/**
+ * Add the correct font size in all browsers.
+ */
+
+small {
font-size: 80%;
- }
-
- /**
- * Prevent `sub` and `sup` elements from affecting the line height in
- * all browsers.
- */
-
- sub,
- sup {
+}
+
+/**
+ * Prevent `sub` and `sup` elements from affecting the line height in
+ * all browsers.
+ */
+
+sub,
+sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
- }
-
- sub {
+}
+
+sub {
bottom: -0.25em;
- }
-
- sup {
+}
+
+sup {
top: -0.5em;
- }
-
- /* Embedded content
- ========================================================================== */
-
- /**
- * Remove the border on images inside links in IE 10.
- */
-
- img {
+}
+
+/* Embedded content
+ ========================================================================== */
+
+/**
+ * Remove the border on images inside links in IE 10.
+ */
+
+img {
border-style: none;
- }
-
- /* Forms
- ========================================================================== */
-
- /**
- * 1. Change the font styles in all browsers.
- * 2. Remove the margin in Firefox and Safari.
- */
-
- button,
- input,
- optgroup,
- select,
- textarea {
+}
+
+/* Forms
+ ========================================================================== */
+
+/**
+ * 1. Change the font styles in all browsers.
+ * 2. Remove the margin in Firefox and Safari.
+ */
+
+button,
+input,
+optgroup,
+select,
+textarea {
font-family: inherit; /* 1 */
font-size: 100%; /* 1 */
line-height: 1.15; /* 1 */
margin: 0; /* 2 */
- }
-
- /**
- * Show the overflow in IE.
- * 1. Show the overflow in Edge.
- */
-
- button,
- input { /* 1 */
+}
+
+/**
+ * Show the overflow in IE.
+ * 1. Show the overflow in Edge.
+ */
+
+button,
+input { /* 1 */
overflow: visible;
- }
-
- /**
- * Remove the inheritance of text transform in Edge, Firefox, and IE.
- * 1. Remove the inheritance of text transform in Firefox.
- */
-
- button,
- select { /* 1 */
+}
+
+/**
+ * Remove the inheritance of text transform in Edge, Firefox, and IE.
+ * 1. Remove the inheritance of text transform in Firefox.
+ */
+
+button,
+select { /* 1 */
text-transform: none;
- }
-
- /**
- * Correct the inability to style clickable types in iOS and Safari.
- */
-
- button,
- [type="button"],
- [type="reset"],
- [type="submit"] {
+}
+
+/**
+ * Correct the inability to style clickable types in iOS and Safari.
+ */
+
+button,
+[type="button"],
+[type="reset"],
+[type="submit"] {
-webkit-appearance: button;
- }
-
- /**
- * Remove the inner border and padding in Firefox.
- */
-
- button::-moz-focus-inner,
- [type="button"]::-moz-focus-inner,
- [type="reset"]::-moz-focus-inner,
- [type="submit"]::-moz-focus-inner {
+}
+
+/**
+ * Remove the inner border and padding in Firefox.
+ */
+
+button::-moz-focus-inner,
+[type="button"]::-moz-focus-inner,
+[type="reset"]::-moz-focus-inner,
+[type="submit"]::-moz-focus-inner {
border-style: none;
padding: 0;
- }
-
- /**
- * Restore the focus styles unset by the previous rule.
- */
-
- button:-moz-focusring,
- [type="button"]:-moz-focusring,
- [type="reset"]:-moz-focusring,
- [type="submit"]:-moz-focusring {
+}
+
+/**
+ * Restore the focus styles unset by the previous rule.
+ */
+
+button:-moz-focusring,
+[type="button"]:-moz-focusring,
+[type="reset"]:-moz-focusring,
+[type="submit"]:-moz-focusring {
outline: 1px dotted ButtonText;
- }
-
- /**
- * Correct the padding in Firefox.
- */
-
- fieldset {
+}
+
+/**
+ * Correct the padding in Firefox.
+ */
+
+fieldset {
padding: 0.35em 0.75em 0.625em;
- }
-
- /**
- * 1. Correct the text wrapping in Edge and IE.
- * 2. Correct the color inheritance from `fieldset` elements in IE.
- * 3. Remove the padding so developers are not caught out when they zero out
- * `fieldset` elements in all browsers.
- */
-
- legend {
+}
+
+/**
+ * 1. Correct the text wrapping in Edge and IE.
+ * 2. Correct the color inheritance from `fieldset` elements in IE.
+ * 3. Remove the padding so developers are not caught out when they zero out
+ * `fieldset` elements in all browsers.
+ */
+
+legend {
box-sizing: border-box; /* 1 */
color: inherit; /* 2 */
display: table; /* 1 */
max-width: 100%; /* 1 */
padding: 0; /* 3 */
white-space: normal; /* 1 */
- }
-
- /**
- * Add the correct vertical alignment in Chrome, Firefox, and Opera.
- */
-
- progress {
+}
+
+/**
+ * Add the correct vertical alignment in Chrome, Firefox, and Opera.
+ */
+
+progress {
vertical-align: baseline;
- }
-
- /**
- * Remove the default vertical scrollbar in IE 10+.
- */
-
- textarea {
+}
+
+/**
+ * Remove the default vertical scrollbar in IE 10+.
+ */
+
+textarea {
overflow: auto;
- }
-
- /**
- * 1. Add the correct box sizing in IE 10.
- * 2. Remove the padding in IE 10.
- */
-
- [type="checkbox"],
- [type="radio"] {
+}
+
+/**
+ * 1. Add the correct box sizing in IE 10.
+ * 2. Remove the padding in IE 10.
+ */
+
+[type="checkbox"],
+[type="radio"] {
box-sizing: border-box; /* 1 */
padding: 0; /* 2 */
- }
-
- /**
- * Correct the cursor style of increment and decrement buttons in Chrome.
- */
-
- [type="number"]::-webkit-inner-spin-button,
- [type="number"]::-webkit-outer-spin-button {
+}
+
+/**
+ * Correct the cursor style of increment and decrement buttons in Chrome.
+ */
+
+[type="number"]::-webkit-inner-spin-button,
+[type="number"]::-webkit-outer-spin-button {
height: auto;
- }
-
- /**
- * 1. Correct the odd appearance in Chrome and Safari.
- * 2. Correct the outline style in Safari.
- */
-
- [type="search"] {
+}
+
+/**
+ * 1. Correct the odd appearance in Chrome and Safari.
+ * 2. Correct the outline style in Safari.
+ */
+
+[type="search"] {
-webkit-appearance: textfield; /* 1 */
outline-offset: -2px; /* 2 */
- }
-
- /**
- * Remove the inner padding in Chrome and Safari on macOS.
- */
-
- [type="search"]::-webkit-search-decoration {
+}
+
+/**
+ * Remove the inner padding in Chrome and Safari on macOS.
+ */
+
+[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
- }
-
- /**
- * 1. Correct the inability to style clickable types in iOS and Safari.
- * 2. Change font properties to `inherit` in Safari.
- */
-
- ::-webkit-file-upload-button {
+}
+
+/**
+ * 1. Correct the inability to style clickable types in iOS and Safari.
+ * 2. Change font properties to `inherit` in Safari.
+ */
+
+::-webkit-file-upload-button {
-webkit-appearance: button; /* 1 */
font: inherit; /* 2 */
- }
-
- /* Interactive
- ========================================================================== */
-
- /*
- * Add the correct display in Edge, IE 10+, and Firefox.
- */
-
- details {
+}
+
+/* Interactive
+ ========================================================================== */
+
+/*
+ * Add the correct display in Edge, IE 10+, and Firefox.
+ */
+
+details {
display: block;
- }
-
- /*
- * Add the correct display in all browsers.
- */
-
- summary {
+}
+
+/*
+ * Add the correct display in all browsers.
+ */
+
+summary {
display: list-item;
- }
-
- /* Misc
- ========================================================================== */
-
- /**
- * Add the correct display in IE 10+.
- */
-
- template {
+}
+
+/* Misc
+ ========================================================================== */
+
+/**
+ * Add the correct display in IE 10+.
+ */
+
+template {
display: none;
- }
-
- /**
- * Add the correct display in IE 10.
- */
-
- [hidden] {
+}
+
+/**
+ * Add the correct display in IE 10.
+ */
+
+[hidden] {
display: none;
- }
-
\ No newline at end of file
+}
diff --git a/assets/js/chart.js b/assets/js/chart.js
index ba06c40..d3c7232 100755
--- a/assets/js/chart.js
+++ b/assets/js/chart.js
@@ -1,6210 +1,19371 @@
/*!
- * Chart.js
- * http://chartjs.org/
- * Version: 2.7.2
- *
- * Copyright 2018 Chart.js Contributors
- * Released under the MIT license
- * https://github.com/chartjs/Chart.js/blob/master/LICENSE.md
+ * Chart.js v2.8.0
+ * https://www.chartjs.org
+ * (c) 2019 Chart.js Contributors
+ * Released under the MIT License
*/
-!function (t) {
- if ("object" == typeof exports && "undefined" != typeof module) module.exports = t(); else if ("function" == typeof define && define.amd) define([], t); else {
- ("undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof self ? self : this).Chart = t()
- }
-}(function () {
- return function t(e, i, n) {
- function a(o, s) {
- if (!i[o]) {
- if (!e[o]) {
- var l = "function" == typeof require && require;
- if (!s && l) return l(o, !0);
- if (r) return r(o, !0);
- var u = new Error("Cannot find module '" + o + "'");
- throw u.code = "MODULE_NOT_FOUND", u
- }
- var d = i[o] = {exports: {}};
- e[o][0].call(d.exports, function (t) {
- var i = e[o][1][t];
- return a(i || t)
- }, d, d.exports, t, e, i, n)
- }
- return i[o].exports
- }
-
- for (var r = "function" == typeof require && require, o = 0; o < n.length; o++) a(n[o]);
- return a
- }({
- 1: [function (t, e, i) {
- var n = t(5);
-
- function a(t) {
- if (t) {
- var e = [0, 0, 0], i = 1, a = t.match(/^#([a-fA-F0-9]{3})$/i);
- if (a) {
- a = a[1];
- for (var r = 0; r < e.length; r++) e[r] = parseInt(a[r] + a[r], 16)
- } else if (a = t.match(/^#([a-fA-F0-9]{6})$/i)) {
- a = a[1];
- for (r = 0; r < e.length; r++) e[r] = parseInt(a.slice(2 * r, 2 * r + 2), 16)
- } else if (a = t.match(/^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i)) {
- for (r = 0; r < e.length; r++) e[r] = parseInt(a[r + 1]);
- i = parseFloat(a[4])
- } else if (a = t.match(/^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i)) {
- for (r = 0; r < e.length; r++) e[r] = Math.round(2.55 * parseFloat(a[r + 1]));
- i = parseFloat(a[4])
- } else if (a = t.match(/(\w+)/)) {
- if ("transparent" == a[1]) return [0, 0, 0, 0];
- if (!(e = n[a[1]])) return
- }
- for (r = 0; r < e.length; r++) e[r] = d(e[r], 0, 255);
- return i = i || 0 == i ? d(i, 0, 1) : 1, e[3] = i, e
- }
- }
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+ typeof define === 'function' && define.amd ? define(factory) :
+ (global.Chart = factory());
+}(this, (function () {
+ 'use strict';
- function r(t) {
- if (t) {
- var e = t.match(/^hsla?\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/);
- if (e) {
- var i = parseFloat(e[4]);
- return [d(parseInt(e[1]), 0, 360), d(parseFloat(e[2]), 0, 100), d(parseFloat(e[3]), 0, 100), d(isNaN(i) ? 1 : i, 0, 1)]
- }
- }
- }
+ /* MIT license */
- function o(t) {
- if (t) {
- var e = t.match(/^hwb\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/);
- if (e) {
- var i = parseFloat(e[4]);
- return [d(parseInt(e[1]), 0, 360), d(parseFloat(e[2]), 0, 100), d(parseFloat(e[3]), 0, 100), d(isNaN(i) ? 1 : i, 0, 1)]
- }
- }
- }
+ var conversions = {
+ rgb2hsl: rgb2hsl,
+ rgb2hsv: rgb2hsv,
+ rgb2hwb: rgb2hwb,
+ rgb2cmyk: rgb2cmyk,
+ rgb2keyword: rgb2keyword,
+ rgb2xyz: rgb2xyz,
+ rgb2lab: rgb2lab,
+ rgb2lch: rgb2lch,
- function s(t, e) {
- return void 0 === e && (e = void 0 !== t[3] ? t[3] : 1), "rgba(" + t[0] + ", " + t[1] + ", " + t[2] + ", " + e + ")"
- }
+ hsl2rgb: hsl2rgb,
+ hsl2hsv: hsl2hsv,
+ hsl2hwb: hsl2hwb,
+ hsl2cmyk: hsl2cmyk,
+ hsl2keyword: hsl2keyword,
- function l(t, e) {
- return "rgba(" + Math.round(t[0] / 255 * 100) + "%, " + Math.round(t[1] / 255 * 100) + "%, " + Math.round(t[2] / 255 * 100) + "%, " + (e || t[3] || 1) + ")"
- }
+ hsv2rgb: hsv2rgb,
+ hsv2hsl: hsv2hsl,
+ hsv2hwb: hsv2hwb,
+ hsv2cmyk: hsv2cmyk,
+ hsv2keyword: hsv2keyword,
- function u(t, e) {
- return void 0 === e && (e = void 0 !== t[3] ? t[3] : 1), "hsla(" + t[0] + ", " + t[1] + "%, " + t[2] + "%, " + e + ")"
- }
+ hwb2rgb: hwb2rgb,
+ hwb2hsl: hwb2hsl,
+ hwb2hsv: hwb2hsv,
+ hwb2cmyk: hwb2cmyk,
+ hwb2keyword: hwb2keyword,
- function d(t, e, i) {
- return Math.min(Math.max(e, t), i)
- }
+ cmyk2rgb: cmyk2rgb,
+ cmyk2hsl: cmyk2hsl,
+ cmyk2hsv: cmyk2hsv,
+ cmyk2hwb: cmyk2hwb,
+ cmyk2keyword: cmyk2keyword,
- function h(t) {
- var e = t.toString(16).toUpperCase();
- return e.length < 2 ? "0" + e : e
- }
+ keyword2rgb: keyword2rgb,
+ keyword2hsl: keyword2hsl,
+ keyword2hsv: keyword2hsv,
+ keyword2hwb: keyword2hwb,
+ keyword2cmyk: keyword2cmyk,
+ keyword2lab: keyword2lab,
+ keyword2xyz: keyword2xyz,
- e.exports = {
- getRgba: a, getHsla: r, getRgb: function (t) {
- var e = a(t);
- return e && e.slice(0, 3)
- }, getHsl: function (t) {
- var e = r(t);
- return e && e.slice(0, 3)
- }, getHwb: o, getAlpha: function (t) {
- var e = a(t);
- {
- if (e) return e[3];
- if (e = r(t)) return e[3];
- if (e = o(t)) return e[3]
- }
- }, hexString: function (t) {
- return "#" + h(t[0]) + h(t[1]) + h(t[2])
- }, rgbString: function (t, e) {
- if (e < 1 || t[3] && t[3] < 1) return s(t, e);
- return "rgb(" + t[0] + ", " + t[1] + ", " + t[2] + ")"
- }, rgbaString: s, percentString: function (t, e) {
- if (e < 1 || t[3] && t[3] < 1) return l(t, e);
- var i = Math.round(t[0] / 255 * 100), n = Math.round(t[1] / 255 * 100),
- a = Math.round(t[2] / 255 * 100);
- return "rgb(" + i + "%, " + n + "%, " + a + "%)"
- }, percentaString: l, hslString: function (t, e) {
- if (e < 1 || t[3] && t[3] < 1) return u(t, e);
- return "hsl(" + t[0] + ", " + t[1] + "%, " + t[2] + "%)"
- }, hslaString: u, hwbString: function (t, e) {
- void 0 === e && (e = void 0 !== t[3] ? t[3] : 1);
- return "hwb(" + t[0] + ", " + t[1] + "%, " + t[2] + "%" + (void 0 !== e && 1 !== e ? ", " + e : "") + ")"
- }, keyword: function (t) {
- return c[t.slice(0, 3)]
- }
- };
- var c = {};
- for (var f in n) c[n[f]] = f
- }, {5: 5}], 2: [function (t, e, i) {
- var n = t(4), a = t(1), r = function (t) {
- return t instanceof r ? t : this instanceof r ? (this.valid = !1, this.values = {
- rgb: [0, 0, 0],
- hsl: [0, 0, 0],
- hsv: [0, 0, 0],
- hwb: [0, 0, 0],
- cmyk: [0, 0, 0, 0],
- alpha: 1
- }, void("string" == typeof t ? (e = a.getRgba(t)) ? this.setValues("rgb", e) : (e = a.getHsla(t)) ? this.setValues("hsl", e) : (e = a.getHwb(t)) && this.setValues("hwb", e) : "object" == typeof t && (void 0 !== (e = t).r || void 0 !== e.red ? this.setValues("rgb", e) : void 0 !== e.l || void 0 !== e.lightness ? this.setValues("hsl", e) : void 0 !== e.v || void 0 !== e.value ? this.setValues("hsv", e) : void 0 !== e.w || void 0 !== e.whiteness ? this.setValues("hwb", e) : void 0 === e.c && void 0 === e.cyan || this.setValues("cmyk", e)))) : new r(t);
- var e
- };
- r.prototype = {
- isValid: function () {
- return this.valid
- }, rgb: function () {
- return this.setSpace("rgb", arguments)
- }, hsl: function () {
- return this.setSpace("hsl", arguments)
- }, hsv: function () {
- return this.setSpace("hsv", arguments)
- }, hwb: function () {
- return this.setSpace("hwb", arguments)
- }, cmyk: function () {
- return this.setSpace("cmyk", arguments)
- }, rgbArray: function () {
- return this.values.rgb
- }, hslArray: function () {
- return this.values.hsl
- }, hsvArray: function () {
- return this.values.hsv
- }, hwbArray: function () {
- var t = this.values;
- return 1 !== t.alpha ? t.hwb.concat([t.alpha]) : t.hwb
- }, cmykArray: function () {
- return this.values.cmyk
- }, rgbaArray: function () {
- var t = this.values;
- return t.rgb.concat([t.alpha])
- }, hslaArray: function () {
- var t = this.values;
- return t.hsl.concat([t.alpha])
- }, alpha: function (t) {
- return void 0 === t ? this.values.alpha : (this.setValues("alpha", t), this)
- }, red: function (t) {
- return this.setChannel("rgb", 0, t)
- }, green: function (t) {
- return this.setChannel("rgb", 1, t)
- }, blue: function (t) {
- return this.setChannel("rgb", 2, t)
- }, hue: function (t) {
- return t && (t = (t %= 360) < 0 ? 360 + t : t), this.setChannel("hsl", 0, t)
- }, saturation: function (t) {
- return this.setChannel("hsl", 1, t)
- }, lightness: function (t) {
- return this.setChannel("hsl", 2, t)
- }, saturationv: function (t) {
- return this.setChannel("hsv", 1, t)
- }, whiteness: function (t) {
- return this.setChannel("hwb", 1, t)
- }, blackness: function (t) {
- return this.setChannel("hwb", 2, t)
- }, value: function (t) {
- return this.setChannel("hsv", 2, t)
- }, cyan: function (t) {
- return this.setChannel("cmyk", 0, t)
- }, magenta: function (t) {
- return this.setChannel("cmyk", 1, t)
- }, yellow: function (t) {
- return this.setChannel("cmyk", 2, t)
- }, black: function (t) {
- return this.setChannel("cmyk", 3, t)
- }, hexString: function () {
- return a.hexString(this.values.rgb)
- }, rgbString: function () {
- return a.rgbString(this.values.rgb, this.values.alpha)
- }, rgbaString: function () {
- return a.rgbaString(this.values.rgb, this.values.alpha)
- }, percentString: function () {
- return a.percentString(this.values.rgb, this.values.alpha)
- }, hslString: function () {
- return a.hslString(this.values.hsl, this.values.alpha)
- }, hslaString: function () {
- return a.hslaString(this.values.hsl, this.values.alpha)
- }, hwbString: function () {
- return a.hwbString(this.values.hwb, this.values.alpha)
- }, keyword: function () {
- return a.keyword(this.values.rgb, this.values.alpha)
- }, rgbNumber: function () {
- var t = this.values.rgb;
- return t[0] << 16 | t[1] << 8 | t[2]
- }, luminosity: function () {
- for (var t = this.values.rgb, e = [], i = 0; i < t.length; i++) {
- var n = t[i] / 255;
- e[i] = n <= .03928 ? n / 12.92 : Math.pow((n + .055) / 1.055, 2.4)
- }
- return .2126 * e[0] + .7152 * e[1] + .0722 * e[2]
- }, contrast: function (t) {
- var e = this.luminosity(), i = t.luminosity();
- return e > i ? (e + .05) / (i + .05) : (i + .05) / (e + .05)
- }, level: function (t) {
- var e = this.contrast(t);
- return e >= 7.1 ? "AAA" : e >= 4.5 ? "AA" : ""
- }, dark: function () {
- var t = this.values.rgb;
- return (299 * t[0] + 587 * t[1] + 114 * t[2]) / 1e3 < 128
- }, light: function () {
- return !this.dark()
- }, negate: function () {
- for (var t = [], e = 0; e < 3; e++) t[e] = 255 - this.values.rgb[e];
- return this.setValues("rgb", t), this
- }, lighten: function (t) {
- var e = this.values.hsl;
- return e[2] += e[2] * t, this.setValues("hsl", e), this
- }, darken: function (t) {
- var e = this.values.hsl;
- return e[2] -= e[2] * t, this.setValues("hsl", e), this
- }, saturate: function (t) {
- var e = this.values.hsl;
- return e[1] += e[1] * t, this.setValues("hsl", e), this
- }, desaturate: function (t) {
- var e = this.values.hsl;
- return e[1] -= e[1] * t, this.setValues("hsl", e), this
- }, whiten: function (t) {
- var e = this.values.hwb;
- return e[1] += e[1] * t, this.setValues("hwb", e), this
- }, blacken: function (t) {
- var e = this.values.hwb;
- return e[2] += e[2] * t, this.setValues("hwb", e), this
- }, greyscale: function () {
- var t = this.values.rgb, e = .3 * t[0] + .59 * t[1] + .11 * t[2];
- return this.setValues("rgb", [e, e, e]), this
- }, clearer: function (t) {
- var e = this.values.alpha;
- return this.setValues("alpha", e - e * t), this
- }, opaquer: function (t) {
- var e = this.values.alpha;
- return this.setValues("alpha", e + e * t), this
- }, rotate: function (t) {
- var e = this.values.hsl, i = (e[0] + t) % 360;
- return e[0] = i < 0 ? 360 + i : i, this.setValues("hsl", e), this
- }, mix: function (t, e) {
- var i = this, n = t, a = void 0 === e ? .5 : e, r = 2 * a - 1, o = i.alpha() - n.alpha(),
- s = ((r * o == -1 ? r : (r + o) / (1 + r * o)) + 1) / 2, l = 1 - s;
- return this.rgb(s * i.red() + l * n.red(), s * i.green() + l * n.green(), s * i.blue() + l * n.blue()).alpha(i.alpha() * a + n.alpha() * (1 - a))
- }, toJSON: function () {
- return this.rgb()
- }, clone: function () {
- var t, e, i = new r, n = this.values, a = i.values;
- for (var o in n) n.hasOwnProperty(o) && (t = n[o], "[object Array]" === (e = {}.toString.call(t)) ? a[o] = t.slice(0) : "[object Number]" === e ? a[o] = t : console.error("unexpected color value:", t));
- return i
- }
- }, r.prototype.spaces = {
- rgb: ["red", "green", "blue"],
- hsl: ["hue", "saturation", "lightness"],
- hsv: ["hue", "saturation", "value"],
- hwb: ["hue", "whiteness", "blackness"],
- cmyk: ["cyan", "magenta", "yellow", "black"]
- }, r.prototype.maxes = {
- rgb: [255, 255, 255],
- hsl: [360, 100, 100],
- hsv: [360, 100, 100],
- hwb: [360, 100, 100],
- cmyk: [100, 100, 100, 100]
- }, r.prototype.getValues = function (t) {
- for (var e = this.values, i = {}, n = 0; n < t.length; n++) i[t.charAt(n)] = e[t][n];
- return 1 !== e.alpha && (i.a = e.alpha), i
- }, r.prototype.setValues = function (t, e) {
- var i, a, r = this.values, o = this.spaces, s = this.maxes, l = 1;
- if (this.valid = !0, "alpha" === t) l = e; else if (e.length) r[t] = e.slice(0, t.length), l = e[t.length]; else if (void 0 !== e[t.charAt(0)]) {
- for (i = 0; i < t.length; i++) r[t][i] = e[t.charAt(i)];
- l = e.a
- } else if (void 0 !== e[o[t][0]]) {
- var u = o[t];
- for (i = 0; i < t.length; i++) r[t][i] = e[u[i]];
- l = e.alpha
- }
- if (r.alpha = Math.max(0, Math.min(1, void 0 === l ? r.alpha : l)), "alpha" === t) return !1;
- for (i = 0; i < t.length; i++) a = Math.max(0, Math.min(s[t][i], r[t][i])), r[t][i] = Math.round(a);
- for (var d in o) d !== t && (r[d] = n[t][d](r[t]));
- return !0
- }, r.prototype.setSpace = function (t, e) {
- var i = e[0];
- return void 0 === i ? this.getValues(t) : ("number" == typeof i && (i = Array.prototype.slice.call(e)), this.setValues(t, i), this)
- }, r.prototype.setChannel = function (t, e, i) {
- var n = this.values[t];
- return void 0 === i ? n[e] : i === n[e] ? this : (n[e] = i, this.setValues(t, n), this)
- }, "undefined" != typeof window && (window.Color = r), e.exports = r
- }, {1: 1, 4: 4}], 3: [function (t, e, i) {
- function n(t) {
- var e, i, n = t[0] / 255, a = t[1] / 255, r = t[2] / 255, o = Math.min(n, a, r), s = Math.max(n, a, r),
- l = s - o;
- return s == o ? e = 0 : n == s ? e = (a - r) / l : a == s ? e = 2 + (r - n) / l : r == s && (e = 4 + (n - a) / l), (e = Math.min(60 * e, 360)) < 0 && (e += 360), i = (o + s) / 2, [e, 100 * (s == o ? 0 : i <= .5 ? l / (s + o) : l / (2 - s - o)), 100 * i]
- }
+ xyz2rgb: xyz2rgb,
+ xyz2lab: xyz2lab,
+ xyz2lch: xyz2lch,
- function a(t) {
- var e, i, n = t[0], a = t[1], r = t[2], o = Math.min(n, a, r), s = Math.max(n, a, r), l = s - o;
- return i = 0 == s ? 0 : l / s * 1e3 / 10, s == o ? e = 0 : n == s ? e = (a - r) / l : a == s ? e = 2 + (r - n) / l : r == s && (e = 4 + (n - a) / l), (e = Math.min(60 * e, 360)) < 0 && (e += 360), [e, i, s / 255 * 1e3 / 10]
- }
+ lab2xyz: lab2xyz,
+ lab2rgb: lab2rgb,
+ lab2lch: lab2lch,
- function o(t) {
- var e = t[0], i = t[1], a = t[2];
- return [n(t)[0], 100 * (1 / 255 * Math.min(e, Math.min(i, a))), 100 * (a = 1 - 1 / 255 * Math.max(e, Math.max(i, a)))]
- }
+ lch2lab: lch2lab,
+ lch2xyz: lch2xyz,
+ lch2rgb: lch2rgb
+ };
- function s(t) {
- var e, i = t[0] / 255, n = t[1] / 255, a = t[2] / 255;
- return [100 * ((1 - i - (e = Math.min(1 - i, 1 - n, 1 - a))) / (1 - e) || 0), 100 * ((1 - n - e) / (1 - e) || 0), 100 * ((1 - a - e) / (1 - e) || 0), 100 * e]
- }
- function l(t) {
- return S[JSON.stringify(t)]
- }
+ function rgb2hsl(rgb) {
+ var r = rgb[0] / 255,
+ g = rgb[1] / 255,
+ b = rgb[2] / 255,
+ min = Math.min(r, g, b),
+ max = Math.max(r, g, b),
+ delta = max - min,
+ h, s, l;
- function u(t) {
- var e = t[0] / 255, i = t[1] / 255, n = t[2] / 255;
- return [100 * (.4124 * (e = e > .04045 ? Math.pow((e + .055) / 1.055, 2.4) : e / 12.92) + .3576 * (i = i > .04045 ? Math.pow((i + .055) / 1.055, 2.4) : i / 12.92) + .1805 * (n = n > .04045 ? Math.pow((n + .055) / 1.055, 2.4) : n / 12.92)), 100 * (.2126 * e + .7152 * i + .0722 * n), 100 * (.0193 * e + .1192 * i + .9505 * n)]
- }
+ if (max == min)
+ h = 0;
+ else if (r == max)
+ h = (g - b) / delta;
+ else if (g == max)
+ h = 2 + (b - r) / delta;
+ else if (b == max)
+ h = 4 + (r - g) / delta;
- function d(t) {
- var e = u(t), i = e[0], n = e[1], a = e[2];
- return n /= 100, a /= 108.883, i = (i /= 95.047) > .008856 ? Math.pow(i, 1 / 3) : 7.787 * i + 16 / 116, [116 * (n = n > .008856 ? Math.pow(n, 1 / 3) : 7.787 * n + 16 / 116) - 16, 500 * (i - n), 200 * (n - (a = a > .008856 ? Math.pow(a, 1 / 3) : 7.787 * a + 16 / 116))]
- }
+ h = Math.min(h * 60, 360);
- function h(t) {
- var e, i, n, a, r, o = t[0] / 360, s = t[1] / 100, l = t[2] / 100;
- if (0 == s) return [r = 255 * l, r, r];
- e = 2 * l - (i = l < .5 ? l * (1 + s) : l + s - l * s), a = [0, 0, 0];
- for (var u = 0; u < 3; u++) (n = o + 1 / 3 * -(u - 1)) < 0 && n++, n > 1 && n--, r = 6 * n < 1 ? e + 6 * (i - e) * n : 2 * n < 1 ? i : 3 * n < 2 ? e + (i - e) * (2 / 3 - n) * 6 : e, a[u] = 255 * r;
- return a
- }
+ if (h < 0)
+ h += 360;
- function c(t) {
- var e = t[0] / 60, i = t[1] / 100, n = t[2] / 100, a = Math.floor(e) % 6, r = e - Math.floor(e),
- o = 255 * n * (1 - i), s = 255 * n * (1 - i * r), l = 255 * n * (1 - i * (1 - r));
- n *= 255;
- switch (a) {
- case 0:
- return [n, l, o];
- case 1:
- return [s, n, o];
- case 2:
- return [o, n, l];
- case 3:
- return [o, s, n];
- case 4:
- return [l, o, n];
- case 5:
- return [n, o, s]
- }
- }
+ l = (min + max) / 2;
- function f(t) {
- var e, i, n, a, o = t[0] / 360, s = t[1] / 100, l = t[2] / 100, u = s + l;
- switch (u > 1 && (s /= u, l /= u), n = 6 * o - (e = Math.floor(6 * o)), 0 != (1 & e) && (n = 1 - n), a = s + n * ((i = 1 - l) - s), e) {
- default:
- case 6:
- case 0:
- r = i, g = a, b = s;
- break;
- case 1:
- r = a, g = i, b = s;
- break;
- case 2:
- r = s, g = i, b = a;
- break;
- case 3:
- r = s, g = a, b = i;
- break;
- case 4:
- r = a, g = s, b = i;
- break;
- case 5:
- r = i, g = s, b = a
- }
- return [255 * r, 255 * g, 255 * b]
- }
+ if (max == min)
+ s = 0;
+ else if (l <= 0.5)
+ s = delta / (max + min);
+ else
+ s = delta / (2 - max - min);
- function m(t) {
- var e = t[0] / 100, i = t[1] / 100, n = t[2] / 100, a = t[3] / 100;
- return [255 * (1 - Math.min(1, e * (1 - a) + a)), 255 * (1 - Math.min(1, i * (1 - a) + a)), 255 * (1 - Math.min(1, n * (1 - a) + a))]
- }
+ return [h, s * 100, l * 100];
+ }
- function p(t) {
- var e, i, n, a = t[0] / 100, r = t[1] / 100, o = t[2] / 100;
- return i = -.9689 * a + 1.8758 * r + .0415 * o, n = .0557 * a + -.204 * r + 1.057 * o, e = (e = 3.2406 * a + -1.5372 * r + -.4986 * o) > .0031308 ? 1.055 * Math.pow(e, 1 / 2.4) - .055 : e *= 12.92, i = i > .0031308 ? 1.055 * Math.pow(i, 1 / 2.4) - .055 : i *= 12.92, n = n > .0031308 ? 1.055 * Math.pow(n, 1 / 2.4) - .055 : n *= 12.92, [255 * (e = Math.min(Math.max(0, e), 1)), 255 * (i = Math.min(Math.max(0, i), 1)), 255 * (n = Math.min(Math.max(0, n), 1))]
- }
+ function rgb2hsv(rgb) {
+ var r = rgb[0],
+ g = rgb[1],
+ b = rgb[2],
+ min = Math.min(r, g, b),
+ max = Math.max(r, g, b),
+ delta = max - min,
+ h, s, v;
- function v(t) {
- var e = t[0], i = t[1], n = t[2];
- return i /= 100, n /= 108.883, e = (e /= 95.047) > .008856 ? Math.pow(e, 1 / 3) : 7.787 * e + 16 / 116, [116 * (i = i > .008856 ? Math.pow(i, 1 / 3) : 7.787 * i + 16 / 116) - 16, 500 * (e - i), 200 * (i - (n = n > .008856 ? Math.pow(n, 1 / 3) : 7.787 * n + 16 / 116))]
- }
+ if (max == 0)
+ s = 0;
+ else
+ s = (delta / max * 1000) / 10;
- function y(t) {
- var e, i, n, a, r = t[0], o = t[1], s = t[2];
- return r <= 8 ? a = (i = 100 * r / 903.3) / 100 * 7.787 + 16 / 116 : (i = 100 * Math.pow((r + 16) / 116, 3), a = Math.pow(i / 100, 1 / 3)), [e = e / 95.047 <= .008856 ? e = 95.047 * (o / 500 + a - 16 / 116) / 7.787 : 95.047 * Math.pow(o / 500 + a, 3), i, n = n / 108.883 <= .008859 ? n = 108.883 * (a - s / 200 - 16 / 116) / 7.787 : 108.883 * Math.pow(a - s / 200, 3)]
- }
+ if (max == min)
+ h = 0;
+ else if (r == max)
+ h = (g - b) / delta;
+ else if (g == max)
+ h = 2 + (b - r) / delta;
+ else if (b == max)
+ h = 4 + (r - g) / delta;
- function x(t) {
- var e, i = t[0], n = t[1], a = t[2];
- return (e = 360 * Math.atan2(a, n) / 2 / Math.PI) < 0 && (e += 360), [i, Math.sqrt(n * n + a * a), e]
- }
+ h = Math.min(h * 60, 360);
- function _(t) {
- return p(y(t))
- }
+ if (h < 0)
+ h += 360;
- function k(t) {
- var e, i = t[0], n = t[1];
- return e = t[2] / 360 * 2 * Math.PI, [i, n * Math.cos(e), n * Math.sin(e)]
- }
+ v = ((max / 255) * 1000) / 10;
- function w(t) {
- return M[t]
- }
+ return [h, s, v];
+ }
- e.exports = {
- rgb2hsl: n,
- rgb2hsv: a,
- rgb2hwb: o,
- rgb2cmyk: s,
- rgb2keyword: l,
- rgb2xyz: u,
- rgb2lab: d,
- rgb2lch: function (t) {
- return x(d(t))
- },
- hsl2rgb: h,
- hsl2hsv: function (t) {
- var e = t[0], i = t[1] / 100, n = t[2] / 100;
- if (0 === n) return [0, 0, 0];
- return [e, 100 * (2 * (i *= (n *= 2) <= 1 ? n : 2 - n) / (n + i)), 100 * ((n + i) / 2)]
- },
- hsl2hwb: function (t) {
- return o(h(t))
- },
- hsl2cmyk: function (t) {
- return s(h(t))
- },
- hsl2keyword: function (t) {
- return l(h(t))
- },
- hsv2rgb: c,
- hsv2hsl: function (t) {
- var e, i, n = t[0], a = t[1] / 100, r = t[2] / 100;
- return e = a * r, [n, 100 * (e = (e /= (i = (2 - a) * r) <= 1 ? i : 2 - i) || 0), 100 * (i /= 2)]
- },
- hsv2hwb: function (t) {
- return o(c(t))
- },
- hsv2cmyk: function (t) {
- return s(c(t))
- },
- hsv2keyword: function (t) {
- return l(c(t))
- },
- hwb2rgb: f,
- hwb2hsl: function (t) {
- return n(f(t))
- },
- hwb2hsv: function (t) {
- return a(f(t))
- },
- hwb2cmyk: function (t) {
- return s(f(t))
- },
- hwb2keyword: function (t) {
- return l(f(t))
- },
- cmyk2rgb: m,
- cmyk2hsl: function (t) {
- return n(m(t))
- },
- cmyk2hsv: function (t) {
- return a(m(t))
- },
- cmyk2hwb: function (t) {
- return o(m(t))
- },
- cmyk2keyword: function (t) {
- return l(m(t))
- },
- keyword2rgb: w,
- keyword2hsl: function (t) {
- return n(w(t))
- },
- keyword2hsv: function (t) {
- return a(w(t))
- },
- keyword2hwb: function (t) {
- return o(w(t))
- },
- keyword2cmyk: function (t) {
- return s(w(t))
- },
- keyword2lab: function (t) {
- return d(w(t))
- },
- keyword2xyz: function (t) {
- return u(w(t))
- },
- xyz2rgb: p,
- xyz2lab: v,
- xyz2lch: function (t) {
- return x(v(t))
- },
- lab2xyz: y,
- lab2rgb: _,
- lab2lch: x,
- lch2lab: k,
- lch2xyz: function (t) {
- return y(k(t))
- },
- lch2rgb: function (t) {
- return _(k(t))
- }
- };
- var M = {
- aliceblue: [240, 248, 255],
- antiquewhite: [250, 235, 215],
- aqua: [0, 255, 255],
- aquamarine: [127, 255, 212],
- azure: [240, 255, 255],
- beige: [245, 245, 220],
- bisque: [255, 228, 196],
- black: [0, 0, 0],
- blanchedalmond: [255, 235, 205],
- blue: [0, 0, 255],
- blueviolet: [138, 43, 226],
- brown: [165, 42, 42],
- burlywood: [222, 184, 135],
- cadetblue: [95, 158, 160],
- chartreuse: [127, 255, 0],
- chocolate: [210, 105, 30],
- coral: [255, 127, 80],
- cornflowerblue: [100, 149, 237],
- cornsilk: [255, 248, 220],
- crimson: [220, 20, 60],
- cyan: [0, 255, 255],
- darkblue: [0, 0, 139],
- darkcyan: [0, 139, 139],
- darkgoldenrod: [184, 134, 11],
- darkgray: [169, 169, 169],
- darkgreen: [0, 100, 0],
- darkgrey: [169, 169, 169],
- darkkhaki: [189, 183, 107],
- darkmagenta: [139, 0, 139],
- darkolivegreen: [85, 107, 47],
- darkorange: [255, 140, 0],
- darkorchid: [153, 50, 204],
- darkred: [139, 0, 0],
- darksalmon: [233, 150, 122],
- darkseagreen: [143, 188, 143],
- darkslateblue: [72, 61, 139],
- darkslategray: [47, 79, 79],
- darkslategrey: [47, 79, 79],
- darkturquoise: [0, 206, 209],
- darkviolet: [148, 0, 211],
- deeppink: [255, 20, 147],
- deepskyblue: [0, 191, 255],
- dimgray: [105, 105, 105],
- dimgrey: [105, 105, 105],
- dodgerblue: [30, 144, 255],
- firebrick: [178, 34, 34],
- floralwhite: [255, 250, 240],
- forestgreen: [34, 139, 34],
- fuchsia: [255, 0, 255],
- gainsboro: [220, 220, 220],
- ghostwhite: [248, 248, 255],
- gold: [255, 215, 0],
- goldenrod: [218, 165, 32],
- gray: [128, 128, 128],
- green: [0, 128, 0],
- greenyellow: [173, 255, 47],
- grey: [128, 128, 128],
- honeydew: [240, 255, 240],
- hotpink: [255, 105, 180],
- indianred: [205, 92, 92],
- indigo: [75, 0, 130],
- ivory: [255, 255, 240],
- khaki: [240, 230, 140],
- lavender: [230, 230, 250],
- lavenderblush: [255, 240, 245],
- lawngreen: [124, 252, 0],
- lemonchiffon: [255, 250, 205],
- lightblue: [173, 216, 230],
- lightcoral: [240, 128, 128],
- lightcyan: [224, 255, 255],
- lightgoldenrodyellow: [250, 250, 210],
- lightgray: [211, 211, 211],
- lightgreen: [144, 238, 144],
- lightgrey: [211, 211, 211],
- lightpink: [255, 182, 193],
- lightsalmon: [255, 160, 122],
- lightseagreen: [32, 178, 170],
- lightskyblue: [135, 206, 250],
- lightslategray: [119, 136, 153],
- lightslategrey: [119, 136, 153],
- lightsteelblue: [176, 196, 222],
- lightyellow: [255, 255, 224],
- lime: [0, 255, 0],
- limegreen: [50, 205, 50],
- linen: [250, 240, 230],
- magenta: [255, 0, 255],
- maroon: [128, 0, 0],
- mediumaquamarine: [102, 205, 170],
- mediumblue: [0, 0, 205],
- mediumorchid: [186, 85, 211],
- mediumpurple: [147, 112, 219],
- mediumseagreen: [60, 179, 113],
- mediumslateblue: [123, 104, 238],
- mediumspringgreen: [0, 250, 154],
- mediumturquoise: [72, 209, 204],
- mediumvioletred: [199, 21, 133],
- midnightblue: [25, 25, 112],
- mintcream: [245, 255, 250],
- mistyrose: [255, 228, 225],
- moccasin: [255, 228, 181],
- navajowhite: [255, 222, 173],
- navy: [0, 0, 128],
- oldlace: [253, 245, 230],
- olive: [128, 128, 0],
- olivedrab: [107, 142, 35],
- orange: [255, 165, 0],
- orangered: [255, 69, 0],
- orchid: [218, 112, 214],
- palegoldenrod: [238, 232, 170],
- palegreen: [152, 251, 152],
- paleturquoise: [175, 238, 238],
- palevioletred: [219, 112, 147],
- papayawhip: [255, 239, 213],
- peachpuff: [255, 218, 185],
- peru: [205, 133, 63],
- pink: [255, 192, 203],
- plum: [221, 160, 221],
- powderblue: [176, 224, 230],
- purple: [128, 0, 128],
- rebeccapurple: [102, 51, 153],
- red: [255, 0, 0],
- rosybrown: [188, 143, 143],
- royalblue: [65, 105, 225],
- saddlebrown: [139, 69, 19],
- salmon: [250, 128, 114],
- sandybrown: [244, 164, 96],
- seagreen: [46, 139, 87],
- seashell: [255, 245, 238],
- sienna: [160, 82, 45],
- silver: [192, 192, 192],
- skyblue: [135, 206, 235],
- slateblue: [106, 90, 205],
- slategray: [112, 128, 144],
- slategrey: [112, 128, 144],
- snow: [255, 250, 250],
- springgreen: [0, 255, 127],
- steelblue: [70, 130, 180],
- tan: [210, 180, 140],
- teal: [0, 128, 128],
- thistle: [216, 191, 216],
- tomato: [255, 99, 71],
- turquoise: [64, 224, 208],
- violet: [238, 130, 238],
- wheat: [245, 222, 179],
- white: [255, 255, 255],
- whitesmoke: [245, 245, 245],
- yellow: [255, 255, 0],
- yellowgreen: [154, 205, 50]
- }, S = {};
- for (var D in M) S[JSON.stringify(M[D])] = D
- }, {}], 4: [function (t, e, i) {
- var n = t(3), a = function () {
- return new u
- };
- for (var r in n) {
- a[r + "Raw"] = function (t) {
- return function (e) {
- return "number" == typeof e && (e = Array.prototype.slice.call(arguments)), n[t](e)
- }
- }(r);
- var o = /(\w+)2(\w+)/.exec(r), s = o[1], l = o[2];
- (a[s] = a[s] || {})[l] = a[r] = function (t) {
- return function (e) {
- "number" == typeof e && (e = Array.prototype.slice.call(arguments));
- var i = n[t](e);
- if ("string" == typeof i || void 0 === i) return i;
- for (var a = 0; a < i.length; a++) i[a] = Math.round(i[a]);
- return i
- }
- }(r)
- }
- var u = function () {
- this.convs = {}
- };
- u.prototype.routeSpace = function (t, e) {
- var i = e[0];
- return void 0 === i ? this.getValues(t) : ("number" == typeof i && (i = Array.prototype.slice.call(e)), this.setValues(t, i))
- }, u.prototype.setValues = function (t, e) {
- return this.space = t, this.convs = {}, this.convs[t] = e, this
- }, u.prototype.getValues = function (t) {
- var e = this.convs[t];
- if (!e) {
- var i = this.space, n = this.convs[i];
- e = a[i][t](n), this.convs[t] = e
- }
- return e
- }, ["rgb", "hsl", "hsv", "cmyk", "keyword"].forEach(function (t) {
- u.prototype[t] = function (e) {
- return this.routeSpace(t, arguments)
- }
- }), e.exports = a
- }, {3: 3}], 5: [function (t, e, i) {
- "use strict";
- e.exports = {
- aliceblue: [240, 248, 255],
- antiquewhite: [250, 235, 215],
- aqua: [0, 255, 255],
- aquamarine: [127, 255, 212],
- azure: [240, 255, 255],
- beige: [245, 245, 220],
- bisque: [255, 228, 196],
- black: [0, 0, 0],
- blanchedalmond: [255, 235, 205],
- blue: [0, 0, 255],
- blueviolet: [138, 43, 226],
- brown: [165, 42, 42],
- burlywood: [222, 184, 135],
- cadetblue: [95, 158, 160],
- chartreuse: [127, 255, 0],
- chocolate: [210, 105, 30],
- coral: [255, 127, 80],
- cornflowerblue: [100, 149, 237],
- cornsilk: [255, 248, 220],
- crimson: [220, 20, 60],
- cyan: [0, 255, 255],
- darkblue: [0, 0, 139],
- darkcyan: [0, 139, 139],
- darkgoldenrod: [184, 134, 11],
- darkgray: [169, 169, 169],
- darkgreen: [0, 100, 0],
- darkgrey: [169, 169, 169],
- darkkhaki: [189, 183, 107],
- darkmagenta: [139, 0, 139],
- darkolivegreen: [85, 107, 47],
- darkorange: [255, 140, 0],
- darkorchid: [153, 50, 204],
- darkred: [139, 0, 0],
- darksalmon: [233, 150, 122],
- darkseagreen: [143, 188, 143],
- darkslateblue: [72, 61, 139],
- darkslategray: [47, 79, 79],
- darkslategrey: [47, 79, 79],
- darkturquoise: [0, 206, 209],
- darkviolet: [148, 0, 211],
- deeppink: [255, 20, 147],
- deepskyblue: [0, 191, 255],
- dimgray: [105, 105, 105],
- dimgrey: [105, 105, 105],
- dodgerblue: [30, 144, 255],
- firebrick: [178, 34, 34],
- floralwhite: [255, 250, 240],
- forestgreen: [34, 139, 34],
- fuchsia: [255, 0, 255],
- gainsboro: [220, 220, 220],
- ghostwhite: [248, 248, 255],
- gold: [255, 215, 0],
- goldenrod: [218, 165, 32],
- gray: [128, 128, 128],
- green: [0, 128, 0],
- greenyellow: [173, 255, 47],
- grey: [128, 128, 128],
- honeydew: [240, 255, 240],
- hotpink: [255, 105, 180],
- indianred: [205, 92, 92],
- indigo: [75, 0, 130],
- ivory: [255, 255, 240],
- khaki: [240, 230, 140],
- lavender: [230, 230, 250],
- lavenderblush: [255, 240, 245],
- lawngreen: [124, 252, 0],
- lemonchiffon: [255, 250, 205],
- lightblue: [173, 216, 230],
- lightcoral: [240, 128, 128],
- lightcyan: [224, 255, 255],
- lightgoldenrodyellow: [250, 250, 210],
- lightgray: [211, 211, 211],
- lightgreen: [144, 238, 144],
- lightgrey: [211, 211, 211],
- lightpink: [255, 182, 193],
- lightsalmon: [255, 160, 122],
- lightseagreen: [32, 178, 170],
- lightskyblue: [135, 206, 250],
- lightslategray: [119, 136, 153],
- lightslategrey: [119, 136, 153],
- lightsteelblue: [176, 196, 222],
- lightyellow: [255, 255, 224],
- lime: [0, 255, 0],
- limegreen: [50, 205, 50],
- linen: [250, 240, 230],
- magenta: [255, 0, 255],
- maroon: [128, 0, 0],
- mediumaquamarine: [102, 205, 170],
- mediumblue: [0, 0, 205],
- mediumorchid: [186, 85, 211],
- mediumpurple: [147, 112, 219],
- mediumseagreen: [60, 179, 113],
- mediumslateblue: [123, 104, 238],
- mediumspringgreen: [0, 250, 154],
- mediumturquoise: [72, 209, 204],
- mediumvioletred: [199, 21, 133],
- midnightblue: [25, 25, 112],
- mintcream: [245, 255, 250],
- mistyrose: [255, 228, 225],
- moccasin: [255, 228, 181],
- navajowhite: [255, 222, 173],
- navy: [0, 0, 128],
- oldlace: [253, 245, 230],
- olive: [128, 128, 0],
- olivedrab: [107, 142, 35],
- orange: [255, 165, 0],
- orangered: [255, 69, 0],
- orchid: [218, 112, 214],
- palegoldenrod: [238, 232, 170],
- palegreen: [152, 251, 152],
- paleturquoise: [175, 238, 238],
- palevioletred: [219, 112, 147],
- papayawhip: [255, 239, 213],
- peachpuff: [255, 218, 185],
- peru: [205, 133, 63],
- pink: [255, 192, 203],
- plum: [221, 160, 221],
- powderblue: [176, 224, 230],
- purple: [128, 0, 128],
- rebeccapurple: [102, 51, 153],
- red: [255, 0, 0],
- rosybrown: [188, 143, 143],
- royalblue: [65, 105, 225],
- saddlebrown: [139, 69, 19],
- salmon: [250, 128, 114],
- sandybrown: [244, 164, 96],
- seagreen: [46, 139, 87],
- seashell: [255, 245, 238],
- sienna: [160, 82, 45],
- silver: [192, 192, 192],
- skyblue: [135, 206, 235],
- slateblue: [106, 90, 205],
- slategray: [112, 128, 144],
- slategrey: [112, 128, 144],
- snow: [255, 250, 250],
- springgreen: [0, 255, 127],
- steelblue: [70, 130, 180],
- tan: [210, 180, 140],
- teal: [0, 128, 128],
- thistle: [216, 191, 216],
- tomato: [255, 99, 71],
- turquoise: [64, 224, 208],
- violet: [238, 130, 238],
- wheat: [245, 222, 179],
- white: [255, 255, 255],
- whitesmoke: [245, 245, 245],
- yellow: [255, 255, 0],
- yellowgreen: [154, 205, 50]
- }
- }, {}], 6: [function (t, e, i) {
- var n, a;
- n = this, a = function () {
- "use strict";
- var i, n;
-
- function a() {
- return i.apply(null, arguments)
- }
+ function rgb2hwb(rgb) {
+ var r = rgb[0],
+ g = rgb[1],
+ b = rgb[2],
+ h = rgb2hsl(rgb)[0],
+ w = 1 / 255 * Math.min(r, Math.min(g, b)),
+ b = 1 - 1 / 255 * Math.max(r, Math.max(g, b));
- function r(t) {
- return t instanceof Array || "[object Array]" === Object.prototype.toString.call(t)
- }
+ return [h, w * 100, b * 100];
+ }
- function o(t) {
- return null != t && "[object Object]" === Object.prototype.toString.call(t)
- }
+ function rgb2cmyk(rgb) {
+ var r = rgb[0] / 255,
+ g = rgb[1] / 255,
+ b = rgb[2] / 255,
+ c, m, y, k;
- function s(t) {
- return void 0 === t
- }
+ k = Math.min(1 - r, 1 - g, 1 - b);
+ c = (1 - r - k) / (1 - k) || 0;
+ m = (1 - g - k) / (1 - k) || 0;
+ y = (1 - b - k) / (1 - k) || 0;
+ return [c * 100, m * 100, y * 100, k * 100];
+ }
- function l(t) {
- return "number" == typeof t || "[object Number]" === Object.prototype.toString.call(t)
- }
+ function rgb2keyword(rgb) {
+ return reverseKeywords[JSON.stringify(rgb)];
+ }
- function u(t) {
- return t instanceof Date || "[object Date]" === Object.prototype.toString.call(t)
- }
+ function rgb2xyz(rgb) {
+ var r = rgb[0] / 255,
+ g = rgb[1] / 255,
+ b = rgb[2] / 255;
- function d(t, e) {
- var i, n = [];
- for (i = 0; i < t.length; ++i) n.push(e(t[i], i));
- return n
- }
+ // assume sRGB
+ r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92);
+ g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92);
+ b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92);
- function h(t, e) {
- return Object.prototype.hasOwnProperty.call(t, e)
- }
+ var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);
+ var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);
+ var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);
- function c(t, e) {
- for (var i in e) h(e, i) && (t[i] = e[i]);
- return h(e, "toString") && (t.toString = e.toString), h(e, "valueOf") && (t.valueOf = e.valueOf), t
- }
+ return [x * 100, y * 100, z * 100];
+ }
- function f(t, e, i, n) {
- return Pe(t, e, i, n, !0).utc()
- }
+ function rgb2lab(rgb) {
+ var xyz = rgb2xyz(rgb),
+ x = xyz[0],
+ y = xyz[1],
+ z = xyz[2],
+ l, a, b;
- function g(t) {
- return null == t._pf && (t._pf = {
- empty: !1,
- unusedTokens: [],
- unusedInput: [],
- overflow: -2,
- charsLeftOver: 0,
- nullInput: !1,
- invalidMonth: null,
- invalidFormat: !1,
- userInvalidated: !1,
- iso: !1,
- parsedDateParts: [],
- meridiem: null,
- rfc2822: !1,
- weekdayMismatch: !1
- }), t._pf
- }
+ x /= 95.047;
+ y /= 100;
+ z /= 108.883;
- function m(t) {
- if (null == t._isValid) {
- var e = g(t), i = n.call(e.parsedDateParts, function (t) {
- return null != t
- }),
- a = !isNaN(t._d.getTime()) && e.overflow < 0 && !e.empty && !e.invalidMonth && !e.invalidWeekday && !e.weekdayMismatch && !e.nullInput && !e.invalidFormat && !e.userInvalidated && (!e.meridiem || e.meridiem && i);
- if (t._strict && (a = a && 0 === e.charsLeftOver && 0 === e.unusedTokens.length && void 0 === e.bigHour), null != Object.isFrozen && Object.isFrozen(t)) return a;
- t._isValid = a
- }
- return t._isValid
- }
+ x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);
+ y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);
+ z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);
- function p(t) {
- var e = f(NaN);
- return null != t ? c(g(e), t) : g(e).userInvalidated = !0, e
- }
+ l = (116 * y) - 16;
+ a = 500 * (x - y);
+ b = 200 * (y - z);
- n = Array.prototype.some ? Array.prototype.some : function (t) {
- for (var e = Object(this), i = e.length >>> 0, n = 0; n < i; n++) if (n in e && t.call(this, e[n], n, e)) return !0;
- return !1
- };
- var v = a.momentProperties = [];
+ return [l, a, b];
+ }
- function y(t, e) {
- var i, n, a;
- if (s(e._isAMomentObject) || (t._isAMomentObject = e._isAMomentObject), s(e._i) || (t._i = e._i), s(e._f) || (t._f = e._f), s(e._l) || (t._l = e._l), s(e._strict) || (t._strict = e._strict), s(e._tzm) || (t._tzm = e._tzm), s(e._isUTC) || (t._isUTC = e._isUTC), s(e._offset) || (t._offset = e._offset), s(e._pf) || (t._pf = g(e)), s(e._locale) || (t._locale = e._locale), v.length > 0) for (i = 0; i < v.length; i++) s(a = e[n = v[i]]) || (t[n] = a);
- return t
- }
+ function rgb2lch(args) {
+ return lab2lch(rgb2lab(args));
+ }
- var b = !1;
+ function hsl2rgb(hsl) {
+ var h = hsl[0] / 360,
+ s = hsl[1] / 100,
+ l = hsl[2] / 100,
+ t1, t2, t3, rgb, val;
- function x(t) {
- y(this, t), this._d = new Date(null != t._d ? t._d.getTime() : NaN), this.isValid() || (this._d = new Date(NaN)), !1 === b && (b = !0, a.updateOffset(this), b = !1)
- }
+ if (s == 0) {
+ val = l * 255;
+ return [val, val, val];
+ }
- function _(t) {
- return t instanceof x || null != t && null != t._isAMomentObject
- }
+ if (l < 0.5)
+ t2 = l * (1 + s);
+ else
+ t2 = l + s - l * s;
+ t1 = 2 * l - t2;
- function k(t) {
- return t < 0 ? Math.ceil(t) || 0 : Math.floor(t)
- }
+ rgb = [0, 0, 0];
+ for (var i = 0; i < 3; i++) {
+ t3 = h + 1 / 3 * -(i - 1);
+ t3 < 0 && t3++;
+ t3 > 1 && t3--;
- function w(t) {
- var e = +t, i = 0;
- return 0 !== e && isFinite(e) && (i = k(e)), i
- }
+ if (6 * t3 < 1)
+ val = t1 + (t2 - t1) * 6 * t3;
+ else if (2 * t3 < 1)
+ val = t2;
+ else if (3 * t3 < 2)
+ val = t1 + (t2 - t1) * (2 / 3 - t3) * 6;
+ else
+ val = t1;
- function M(t, e, i) {
- var n, a = Math.min(t.length, e.length), r = Math.abs(t.length - e.length), o = 0;
- for (n = 0; n < a; n++) (i && t[n] !== e[n] || !i && w(t[n]) !== w(e[n])) && o++;
- return o + r
- }
+ rgb[i] = val * 255;
+ }
- function S(t) {
- !1 === a.suppressDeprecationWarnings && "undefined" != typeof console && console.warn && console.warn("Deprecation warning: " + t)
- }
+ return rgb;
+ }
- function D(t, e) {
- var i = !0;
- return c(function () {
- if (null != a.deprecationHandler && a.deprecationHandler(null, t), i) {
- for (var n, r = [], o = 0; o < arguments.length; o++) {
- if (n = "", "object" == typeof arguments[o]) {
- for (var s in n += "\n[" + o + "] ", arguments[0]) n += s + ": " + arguments[0][s] + ", ";
- n = n.slice(0, -2)
- } else n = arguments[o];
- r.push(n)
- }
- S(t + "\nArguments: " + Array.prototype.slice.call(r).join("") + "\n" + (new Error).stack), i = !1
- }
- return e.apply(this, arguments)
- }, e)
- }
+ function hsl2hsv(hsl) {
+ var h = hsl[0],
+ s = hsl[1] / 100,
+ l = hsl[2] / 100,
+ sv, v;
- var C, P = {};
+ if (l === 0) {
+ // no need to do calc on black
+ // also avoids divide by 0 error
+ return [0, 0, 0];
+ }
- function T(t, e) {
- null != a.deprecationHandler && a.deprecationHandler(t, e), P[t] || (S(e), P[t] = !0)
- }
+ l *= 2;
+ s *= (l <= 1) ? l : 2 - l;
+ v = (l + s) / 2;
+ sv = (2 * s) / (l + s);
+ return [h, sv * 100, v * 100];
+ }
- function O(t) {
- return t instanceof Function || "[object Function]" === Object.prototype.toString.call(t)
- }
+ function hsl2hwb(args) {
+ return rgb2hwb(hsl2rgb(args));
+ }
- function I(t, e) {
- var i, n = c({}, t);
- for (i in e) h(e, i) && (o(t[i]) && o(e[i]) ? (n[i] = {}, c(n[i], t[i]), c(n[i], e[i])) : null != e[i] ? n[i] = e[i] : delete n[i]);
- for (i in t) h(t, i) && !h(e, i) && o(t[i]) && (n[i] = c({}, n[i]));
- return n
- }
+ function hsl2cmyk(args) {
+ return rgb2cmyk(hsl2rgb(args));
+ }
- function A(t) {
- null != t && this.set(t)
- }
+ function hsl2keyword(args) {
+ return rgb2keyword(hsl2rgb(args));
+ }
- a.suppressDeprecationWarnings = !1, a.deprecationHandler = null, C = Object.keys ? Object.keys : function (t) {
- var e, i = [];
- for (e in t) h(t, e) && i.push(e);
- return i
- };
- var F = {};
- function R(t, e) {
- var i = t.toLowerCase();
- F[i] = F[i + "s"] = F[e] = t
- }
+ function hsv2rgb(hsv) {
+ var h = hsv[0] / 60,
+ s = hsv[1] / 100,
+ v = hsv[2] / 100,
+ hi = Math.floor(h) % 6;
- function L(t) {
- return "string" == typeof t ? F[t] || F[t.toLowerCase()] : void 0
- }
+ var f = h - Math.floor(h),
+ p = 255 * v * (1 - s),
+ q = 255 * v * (1 - (s * f)),
+ t = 255 * v * (1 - (s * (1 - f))),
+ v = 255 * v;
- function W(t) {
- var e, i, n = {};
- for (i in t) h(t, i) && (e = L(i)) && (n[e] = t[i]);
- return n
- }
+ switch (hi) {
+ case 0:
+ return [v, t, p];
+ case 1:
+ return [q, v, p];
+ case 2:
+ return [p, v, t];
+ case 3:
+ return [p, q, v];
+ case 4:
+ return [t, p, v];
+ case 5:
+ return [v, p, q];
+ }
+ }
- var Y = {};
+ function hsv2hsl(hsv) {
+ var h = hsv[0],
+ s = hsv[1] / 100,
+ v = hsv[2] / 100,
+ sl, l;
- function N(t, e) {
- Y[t] = e
- }
+ l = (2 - s) * v;
+ sl = s * v;
+ sl /= (l <= 1) ? l : 2 - l;
+ sl = sl || 0;
+ l /= 2;
+ return [h, sl * 100, l * 100];
+ }
- function z(t, e, i) {
- var n = "" + Math.abs(t), a = e - n.length;
- return (t >= 0 ? i ? "+" : "" : "-") + Math.pow(10, Math.max(0, a)).toString().substr(1) + n
- }
+ function hsv2hwb(args) {
+ return rgb2hwb(hsv2rgb(args))
+ }
- var H = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,
- V = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g, B = {}, E = {};
-
- function j(t, e, i, n) {
- var a = n;
- "string" == typeof n && (a = function () {
- return this[n]()
- }), t && (E[t] = a), e && (E[e[0]] = function () {
- return z(a.apply(this, arguments), e[1], e[2])
- }), i && (E[i] = function () {
- return this.localeData().ordinal(a.apply(this, arguments), t)
- })
- }
+ function hsv2cmyk(args) {
+ return rgb2cmyk(hsv2rgb(args));
+ }
- function U(t, e) {
- return t.isValid() ? (e = q(e, t.localeData()), B[e] = B[e] || function (t) {
- var e, i, n, a = t.match(H);
- for (e = 0, i = a.length; e < i; e++) E[a[e]] ? a[e] = E[a[e]] : a[e] = (n = a[e]).match(/\[[\s\S]/) ? n.replace(/^\[|\]$/g, "") : n.replace(/\\/g, "");
- return function (e) {
- var n, r = "";
- for (n = 0; n < i; n++) r += O(a[n]) ? a[n].call(e, t) : a[n];
- return r
- }
- }(e), B[e](t)) : t.localeData().invalidDate()
- }
+ function hsv2keyword(args) {
+ return rgb2keyword(hsv2rgb(args));
+ }
- function q(t, e) {
- var i = 5;
+// http://dev.w3.org/csswg/css-color/#hwb-to-rgb
+ function hwb2rgb(hwb) {
+ var h = hwb[0] / 360,
+ wh = hwb[1] / 100,
+ bl = hwb[2] / 100,
+ ratio = wh + bl,
+ i, v, f, n;
- function n(t) {
- return e.longDateFormat(t) || t
- }
+ // wh + bl cant be > 1
+ if (ratio > 1) {
+ wh /= ratio;
+ bl /= ratio;
+ }
- for (V.lastIndex = 0; i >= 0 && V.test(t);) t = t.replace(V, n), V.lastIndex = 0, i -= 1;
- return t
- }
+ i = Math.floor(6 * h);
+ v = 1 - bl;
+ f = 6 * h - i;
+ if ((i & 0x01) != 0) {
+ f = 1 - f;
+ }
+ n = wh + f * (v - wh); // linear interpolation
- var G = /\d/, Z = /\d\d/, X = /\d{3}/, J = /\d{4}/, K = /[+-]?\d{6}/, $ = /\d\d?/, Q = /\d\d\d\d?/,
- tt = /\d\d\d\d\d\d?/, et = /\d{1,3}/, it = /\d{1,4}/, nt = /[+-]?\d{1,6}/, at = /\d+/,
- rt = /[+-]?\d+/, ot = /Z|[+-]\d\d:?\d\d/gi, st = /Z|[+-]\d\d(?::?\d\d)?/gi,
- lt = /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i,
- ut = {};
+ switch (i) {
+ default:
+ case 6:
+ case 0:
+ r = v;
+ g = n;
+ b = wh;
+ break;
+ case 1:
+ r = n;
+ g = v;
+ b = wh;
+ break;
+ case 2:
+ r = wh;
+ g = v;
+ b = n;
+ break;
+ case 3:
+ r = wh;
+ g = n;
+ b = v;
+ break;
+ case 4:
+ r = n;
+ g = wh;
+ b = v;
+ break;
+ case 5:
+ r = v;
+ g = wh;
+ b = n;
+ break;
+ }
- function dt(t, e, i) {
- ut[t] = O(e) ? e : function (t, n) {
- return t && i ? i : e
- }
- }
+ return [r * 255, g * 255, b * 255];
+ }
- function ht(t, e) {
- return h(ut, t) ? ut[t](e._strict, e._locale) : new RegExp(ct(t.replace("\\", "").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (t, e, i, n, a) {
- return e || i || n || a
- })))
- }
+ function hwb2hsl(args) {
+ return rgb2hsl(hwb2rgb(args));
+ }
- function ct(t) {
- return t.replace(/[-\/\\^$*+?.()|[\]{}]/g, "\\$&")
- }
+ function hwb2hsv(args) {
+ return rgb2hsv(hwb2rgb(args));
+ }
- var ft = {};
+ function hwb2cmyk(args) {
+ return rgb2cmyk(hwb2rgb(args));
+ }
- function gt(t, e) {
- var i, n = e;
- for ("string" == typeof t && (t = [t]), l(e) && (n = function (t, i) {
- i[e] = w(t)
- }), i = 0; i < t.length; i++) ft[t[i]] = n
- }
+ function hwb2keyword(args) {
+ return rgb2keyword(hwb2rgb(args));
+ }
- function mt(t, e) {
- gt(t, function (t, i, n, a) {
- n._w = n._w || {}, e(t, n._w, n, a)
- })
- }
+ function cmyk2rgb(cmyk) {
+ var c = cmyk[0] / 100,
+ m = cmyk[1] / 100,
+ y = cmyk[2] / 100,
+ k = cmyk[3] / 100,
+ r, g, b;
- var pt = 0, vt = 1, yt = 2, bt = 3, xt = 4, _t = 5, kt = 6, wt = 7, Mt = 8;
+ r = 1 - Math.min(1, c * (1 - k) + k);
+ g = 1 - Math.min(1, m * (1 - k) + k);
+ b = 1 - Math.min(1, y * (1 - k) + k);
+ return [r * 255, g * 255, b * 255];
+ }
- function St(t) {
- return Dt(t) ? 366 : 365
- }
+ function cmyk2hsl(args) {
+ return rgb2hsl(cmyk2rgb(args));
+ }
- function Dt(t) {
- return t % 4 == 0 && t % 100 != 0 || t % 400 == 0
- }
+ function cmyk2hsv(args) {
+ return rgb2hsv(cmyk2rgb(args));
+ }
- j("Y", 0, 0, function () {
- var t = this.year();
- return t <= 9999 ? "" + t : "+" + t
- }), j(0, ["YY", 2], 0, function () {
- return this.year() % 100
- }), j(0, ["YYYY", 4], 0, "year"), j(0, ["YYYYY", 5], 0, "year"), j(0, ["YYYYYY", 6, !0], 0, "year"), R("year", "y"), N("year", 1), dt("Y", rt), dt("YY", $, Z), dt("YYYY", it, J), dt("YYYYY", nt, K), dt("YYYYYY", nt, K), gt(["YYYYY", "YYYYYY"], pt), gt("YYYY", function (t, e) {
- e[pt] = 2 === t.length ? a.parseTwoDigitYear(t) : w(t)
- }), gt("YY", function (t, e) {
- e[pt] = a.parseTwoDigitYear(t)
- }), gt("Y", function (t, e) {
- e[pt] = parseInt(t, 10)
- }), a.parseTwoDigitYear = function (t) {
- return w(t) + (w(t) > 68 ? 1900 : 2e3)
- };
- var Ct, Pt = Tt("FullYear", !0);
-
- function Tt(t, e) {
- return function (i) {
- return null != i ? (It(this, t, i), a.updateOffset(this, e), this) : Ot(this, t)
- }
- }
+ function cmyk2hwb(args) {
+ return rgb2hwb(cmyk2rgb(args));
+ }
- function Ot(t, e) {
- return t.isValid() ? t._d["get" + (t._isUTC ? "UTC" : "") + e]() : NaN
- }
+ function cmyk2keyword(args) {
+ return rgb2keyword(cmyk2rgb(args));
+ }
- function It(t, e, i) {
- t.isValid() && !isNaN(i) && ("FullYear" === e && Dt(t.year()) && 1 === t.month() && 29 === t.date() ? t._d["set" + (t._isUTC ? "UTC" : "") + e](i, t.month(), At(i, t.month())) : t._d["set" + (t._isUTC ? "UTC" : "") + e](i))
- }
- function At(t, e) {
- if (isNaN(t) || isNaN(e)) return NaN;
- var i, n = (e % (i = 12) + i) % i;
- return t += (e - n) / 12, 1 === n ? Dt(t) ? 29 : 28 : 31 - n % 7 % 2
- }
+ function xyz2rgb(xyz) {
+ var x = xyz[0] / 100,
+ y = xyz[1] / 100,
+ z = xyz[2] / 100,
+ r, g, b;
- Ct = Array.prototype.indexOf ? Array.prototype.indexOf : function (t) {
- var e;
- for (e = 0; e < this.length; ++e) if (this[e] === t) return e;
- return -1
- }, j("M", ["MM", 2], "Mo", function () {
- return this.month() + 1
- }), j("MMM", 0, 0, function (t) {
- return this.localeData().monthsShort(this, t)
- }), j("MMMM", 0, 0, function (t) {
- return this.localeData().months(this, t)
- }), R("month", "M"), N("month", 8), dt("M", $), dt("MM", $, Z), dt("MMM", function (t, e) {
- return e.monthsShortRegex(t)
- }), dt("MMMM", function (t, e) {
- return e.monthsRegex(t)
- }), gt(["M", "MM"], function (t, e) {
- e[vt] = w(t) - 1
- }), gt(["MMM", "MMMM"], function (t, e, i, n) {
- var a = i._locale.monthsParse(t, n, i._strict);
- null != a ? e[vt] = a : g(i).invalidMonth = t
- });
- var Ft = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/,
- Rt = "January_February_March_April_May_June_July_August_September_October_November_December".split("_");
- var Lt = "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_");
-
- function Wt(t, e) {
- var i;
- if (!t.isValid()) return t;
- if ("string" == typeof e) if (/^\d+$/.test(e)) e = w(e); else if (!l(e = t.localeData().monthsParse(e))) return t;
- return i = Math.min(t.date(), At(t.year(), e)), t._d["set" + (t._isUTC ? "UTC" : "") + "Month"](e, i), t
- }
+ r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);
+ g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);
+ b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);
- function Yt(t) {
- return null != t ? (Wt(this, t), a.updateOffset(this, !0), this) : Ot(this, "Month")
- }
+ // assume sRGB
+ r = r > 0.0031308 ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055)
+ : r = (r * 12.92);
- var Nt = lt;
- var zt = lt;
+ g = g > 0.0031308 ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055)
+ : g = (g * 12.92);
- function Ht() {
- function t(t, e) {
- return e.length - t.length
- }
+ b = b > 0.0031308 ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055)
+ : b = (b * 12.92);
- var e, i, n = [], a = [], r = [];
- for (e = 0; e < 12; e++) i = f([2e3, e]), n.push(this.monthsShort(i, "")), a.push(this.months(i, "")), r.push(this.months(i, "")), r.push(this.monthsShort(i, ""));
- for (n.sort(t), a.sort(t), r.sort(t), e = 0; e < 12; e++) n[e] = ct(n[e]), a[e] = ct(a[e]);
- for (e = 0; e < 24; e++) r[e] = ct(r[e]);
- this._monthsRegex = new RegExp("^(" + r.join("|") + ")", "i"), this._monthsShortRegex = this._monthsRegex, this._monthsStrictRegex = new RegExp("^(" + a.join("|") + ")", "i"), this._monthsShortStrictRegex = new RegExp("^(" + n.join("|") + ")", "i")
- }
+ r = Math.min(Math.max(0, r), 1);
+ g = Math.min(Math.max(0, g), 1);
+ b = Math.min(Math.max(0, b), 1);
- function Vt(t) {
- var e = new Date(Date.UTC.apply(null, arguments));
- return t < 100 && t >= 0 && isFinite(e.getUTCFullYear()) && e.setUTCFullYear(t), e
- }
+ return [r * 255, g * 255, b * 255];
+ }
- function Bt(t, e, i) {
- var n = 7 + e - i;
- return -((7 + Vt(t, 0, n).getUTCDay() - e) % 7) + n - 1
- }
+ function xyz2lab(xyz) {
+ var x = xyz[0],
+ y = xyz[1],
+ z = xyz[2],
+ l, a, b;
- function Et(t, e, i, n, a) {
- var r, o, s = 1 + 7 * (e - 1) + (7 + i - n) % 7 + Bt(t, n, a);
- return s <= 0 ? o = St(r = t - 1) + s : s > St(t) ? (r = t + 1, o = s - St(t)) : (r = t, o = s), {
- year: r,
- dayOfYear: o
- }
- }
+ x /= 95.047;
+ y /= 100;
+ z /= 108.883;
- function jt(t, e, i) {
- var n, a, r = Bt(t.year(), e, i), o = Math.floor((t.dayOfYear() - r - 1) / 7) + 1;
- return o < 1 ? n = o + Ut(a = t.year() - 1, e, i) : o > Ut(t.year(), e, i) ? (n = o - Ut(t.year(), e, i), a = t.year() + 1) : (a = t.year(), n = o), {
- week: n,
- year: a
- }
- }
+ x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);
+ y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);
+ z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);
- function Ut(t, e, i) {
- var n = Bt(t, e, i), a = Bt(t + 1, e, i);
- return (St(t) - n + a) / 7
- }
+ l = (116 * y) - 16;
+ a = 500 * (x - y);
+ b = 200 * (y - z);
- j("w", ["ww", 2], "wo", "week"), j("W", ["WW", 2], "Wo", "isoWeek"), R("week", "w"), R("isoWeek", "W"), N("week", 5), N("isoWeek", 5), dt("w", $), dt("ww", $, Z), dt("W", $), dt("WW", $, Z), mt(["w", "ww", "W", "WW"], function (t, e, i, n) {
- e[n.substr(0, 1)] = w(t)
- });
- j("d", 0, "do", "day"), j("dd", 0, 0, function (t) {
- return this.localeData().weekdaysMin(this, t)
- }), j("ddd", 0, 0, function (t) {
- return this.localeData().weekdaysShort(this, t)
- }), j("dddd", 0, 0, function (t) {
- return this.localeData().weekdays(this, t)
- }), j("e", 0, 0, "weekday"), j("E", 0, 0, "isoWeekday"), R("day", "d"), R("weekday", "e"), R("isoWeekday", "E"), N("day", 11), N("weekday", 11), N("isoWeekday", 11), dt("d", $), dt("e", $), dt("E", $), dt("dd", function (t, e) {
- return e.weekdaysMinRegex(t)
- }), dt("ddd", function (t, e) {
- return e.weekdaysShortRegex(t)
- }), dt("dddd", function (t, e) {
- return e.weekdaysRegex(t)
- }), mt(["dd", "ddd", "dddd"], function (t, e, i, n) {
- var a = i._locale.weekdaysParse(t, n, i._strict);
- null != a ? e.d = a : g(i).invalidWeekday = t
- }), mt(["d", "e", "E"], function (t, e, i, n) {
- e[n] = w(t)
- });
- var qt = "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_");
- var Gt = "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_");
- var Zt = "Su_Mo_Tu_We_Th_Fr_Sa".split("_");
- var Xt = lt;
- var Jt = lt;
- var Kt = lt;
-
- function $t() {
- function t(t, e) {
- return e.length - t.length
- }
-
- var e, i, n, a, r, o = [], s = [], l = [], u = [];
- for (e = 0; e < 7; e++) i = f([2e3, 1]).day(e), n = this.weekdaysMin(i, ""), a = this.weekdaysShort(i, ""), r = this.weekdays(i, ""), o.push(n), s.push(a), l.push(r), u.push(n), u.push(a), u.push(r);
- for (o.sort(t), s.sort(t), l.sort(t), u.sort(t), e = 0; e < 7; e++) s[e] = ct(s[e]), l[e] = ct(l[e]), u[e] = ct(u[e]);
- this._weekdaysRegex = new RegExp("^(" + u.join("|") + ")", "i"), this._weekdaysShortRegex = this._weekdaysRegex, this._weekdaysMinRegex = this._weekdaysRegex, this._weekdaysStrictRegex = new RegExp("^(" + l.join("|") + ")", "i"), this._weekdaysShortStrictRegex = new RegExp("^(" + s.join("|") + ")", "i"), this._weekdaysMinStrictRegex = new RegExp("^(" + o.join("|") + ")", "i")
- }
+ return [l, a, b];
+ }
- function Qt() {
- return this.hours() % 12 || 12
- }
+ function xyz2lch(args) {
+ return lab2lch(xyz2lab(args));
+ }
- function te(t, e) {
- j(t, 0, 0, function () {
- return this.localeData().meridiem(this.hours(), this.minutes(), e)
- })
- }
+ function lab2xyz(lab) {
+ var l = lab[0],
+ a = lab[1],
+ b = lab[2],
+ x, y, z, y2;
- function ee(t, e) {
- return e._meridiemParse
- }
+ if (l <= 8) {
+ y = (l * 100) / 903.3;
+ y2 = (7.787 * (y / 100)) + (16 / 116);
+ } else {
+ y = 100 * Math.pow((l + 16) / 116, 3);
+ y2 = Math.pow(y / 100, 1 / 3);
+ }
- j("H", ["HH", 2], 0, "hour"), j("h", ["hh", 2], 0, Qt), j("k", ["kk", 2], 0, function () {
- return this.hours() || 24
- }), j("hmm", 0, 0, function () {
- return "" + Qt.apply(this) + z(this.minutes(), 2)
- }), j("hmmss", 0, 0, function () {
- return "" + Qt.apply(this) + z(this.minutes(), 2) + z(this.seconds(), 2)
- }), j("Hmm", 0, 0, function () {
- return "" + this.hours() + z(this.minutes(), 2)
- }), j("Hmmss", 0, 0, function () {
- return "" + this.hours() + z(this.minutes(), 2) + z(this.seconds(), 2)
- }), te("a", !0), te("A", !1), R("hour", "h"), N("hour", 13), dt("a", ee), dt("A", ee), dt("H", $), dt("h", $), dt("k", $), dt("HH", $, Z), dt("hh", $, Z), dt("kk", $, Z), dt("hmm", Q), dt("hmmss", tt), dt("Hmm", Q), dt("Hmmss", tt), gt(["H", "HH"], bt), gt(["k", "kk"], function (t, e, i) {
- var n = w(t);
- e[bt] = 24 === n ? 0 : n
- }), gt(["a", "A"], function (t, e, i) {
- i._isPm = i._locale.isPM(t), i._meridiem = t
- }), gt(["h", "hh"], function (t, e, i) {
- e[bt] = w(t), g(i).bigHour = !0
- }), gt("hmm", function (t, e, i) {
- var n = t.length - 2;
- e[bt] = w(t.substr(0, n)), e[xt] = w(t.substr(n)), g(i).bigHour = !0
- }), gt("hmmss", function (t, e, i) {
- var n = t.length - 4, a = t.length - 2;
- e[bt] = w(t.substr(0, n)), e[xt] = w(t.substr(n, 2)), e[_t] = w(t.substr(a)), g(i).bigHour = !0
- }), gt("Hmm", function (t, e, i) {
- var n = t.length - 2;
- e[bt] = w(t.substr(0, n)), e[xt] = w(t.substr(n))
- }), gt("Hmmss", function (t, e, i) {
- var n = t.length - 4, a = t.length - 2;
- e[bt] = w(t.substr(0, n)), e[xt] = w(t.substr(n, 2)), e[_t] = w(t.substr(a))
- });
- var ie, ne = Tt("Hours", !0), ae = {
- calendar: {
- sameDay: "[Today at] LT",
- nextDay: "[Tomorrow at] LT",
- nextWeek: "dddd [at] LT",
- lastDay: "[Yesterday at] LT",
- lastWeek: "[Last] dddd [at] LT",
- sameElse: "L"
- },
- longDateFormat: {
- LTS: "h:mm:ss A",
- LT: "h:mm A",
- L: "MM/DD/YYYY",
- LL: "MMMM D, YYYY",
- LLL: "MMMM D, YYYY h:mm A",
- LLLL: "dddd, MMMM D, YYYY h:mm A"
- },
- invalidDate: "Invalid date",
- ordinal: "%d",
- dayOfMonthOrdinalParse: /\d{1,2}/,
- relativeTime: {
- future: "in %s",
- past: "%s ago",
- s: "a few seconds",
- ss: "%d seconds",
- m: "a minute",
- mm: "%d minutes",
- h: "an hour",
- hh: "%d hours",
- d: "a day",
- dd: "%d days",
- M: "a month",
- MM: "%d months",
- y: "a year",
- yy: "%d years"
- },
- months: Rt,
- monthsShort: Lt,
- week: {dow: 0, doy: 6},
- weekdays: qt,
- weekdaysMin: Zt,
- weekdaysShort: Gt,
- meridiemParse: /[ap]\.?m?\.?/i
- }, re = {}, oe = {};
-
- function se(t) {
- return t ? t.toLowerCase().replace("_", "-") : t
- }
+ x = x / 95.047 <= 0.008856 ? x = (95.047 * ((a / 500) + y2 - (16 / 116))) / 7.787 : 95.047 * Math.pow((a / 500) + y2, 3);
- function le(i) {
- var n = null;
- if (!re[i] && void 0 !== e && e && e.exports) try {
- n = ie._abbr, t("./locale/" + i), ue(n)
- } catch (t) {
- }
- return re[i]
- }
+ z = z / 108.883 <= 0.008859 ? z = (108.883 * (y2 - (b / 200) - (16 / 116))) / 7.787 : 108.883 * Math.pow(y2 - (b / 200), 3);
- function ue(t, e) {
- var i;
- return t && (i = s(e) ? he(t) : de(t, e)) && (ie = i), ie._abbr
- }
+ return [x, y, z];
+ }
- function de(t, e) {
- if (null !== e) {
- var i = ae;
- if (e.abbr = t, null != re[t]) T("defineLocaleOverride", "use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."), i = re[t]._config; else if (null != e.parentLocale) {
- if (null == re[e.parentLocale]) return oe[e.parentLocale] || (oe[e.parentLocale] = []), oe[e.parentLocale].push({
- name: t,
- config: e
- }), null;
- i = re[e.parentLocale]._config
- }
- return re[t] = new A(I(i, e)), oe[t] && oe[t].forEach(function (t) {
- de(t.name, t.config)
- }), ue(t), re[t]
- }
- return delete re[t], null
- }
+ function lab2lch(lab) {
+ var l = lab[0],
+ a = lab[1],
+ b = lab[2],
+ hr, h, c;
- function he(t) {
- var e;
- if (t && t._locale && t._locale._abbr && (t = t._locale._abbr), !t) return ie;
- if (!r(t)) {
- if (e = le(t)) return e;
- t = [t]
- }
- return function (t) {
- for (var e, i, n, a, r = 0; r < t.length;) {
- for (e = (a = se(t[r]).split("-")).length, i = (i = se(t[r + 1])) ? i.split("-") : null; e > 0;) {
- if (n = le(a.slice(0, e).join("-"))) return n;
- if (i && i.length >= e && M(a, i, !0) >= e - 1) break;
- e--
- }
- r++
- }
- return null
- }(t)
- }
+ hr = Math.atan2(b, a);
+ h = hr * 360 / 2 / Math.PI;
+ if (h < 0) {
+ h += 360;
+ }
+ c = Math.sqrt(a * a + b * b);
+ return [l, c, h];
+ }
- function ce(t) {
- var e, i = t._a;
- return i && -2 === g(t).overflow && (e = i[vt] < 0 || i[vt] > 11 ? vt : i[yt] < 1 || i[yt] > At(i[pt], i[vt]) ? yt : i[bt] < 0 || i[bt] > 24 || 24 === i[bt] && (0 !== i[xt] || 0 !== i[_t] || 0 !== i[kt]) ? bt : i[xt] < 0 || i[xt] > 59 ? xt : i[_t] < 0 || i[_t] > 59 ? _t : i[kt] < 0 || i[kt] > 999 ? kt : -1, g(t)._overflowDayOfYear && (e < pt || e > yt) && (e = yt), g(t)._overflowWeeks && -1 === e && (e = wt), g(t)._overflowWeekday && -1 === e && (e = Mt), g(t).overflow = e), t
- }
+ function lab2rgb(args) {
+ return xyz2rgb(lab2xyz(args));
+ }
- function fe(t, e, i) {
- return null != t ? t : null != e ? e : i
- }
+ function lch2lab(lch) {
+ var l = lch[0],
+ c = lch[1],
+ h = lch[2],
+ a, b, hr;
- function ge(t) {
- var e, i, n, r, o, s = [];
- if (!t._d) {
- var l, u;
- for (l = t, u = new Date(a.now()), n = l._useUTC ? [u.getUTCFullYear(), u.getUTCMonth(), u.getUTCDate()] : [u.getFullYear(), u.getMonth(), u.getDate()], t._w && null == t._a[yt] && null == t._a[vt] && function (t) {
- var e, i, n, a, r, o, s, l;
- if (null != (e = t._w).GG || null != e.W || null != e.E) r = 1, o = 4, i = fe(e.GG, t._a[pt], jt(Te(), 1, 4).year), n = fe(e.W, 1), ((a = fe(e.E, 1)) < 1 || a > 7) && (l = !0); else {
- r = t._locale._week.dow, o = t._locale._week.doy;
- var u = jt(Te(), r, o);
- i = fe(e.gg, t._a[pt], u.year), n = fe(e.w, u.week), null != e.d ? ((a = e.d) < 0 || a > 6) && (l = !0) : null != e.e ? (a = e.e + r, (e.e < 0 || e.e > 6) && (l = !0)) : a = r
- }
- n < 1 || n > Ut(i, r, o) ? g(t)._overflowWeeks = !0 : null != l ? g(t)._overflowWeekday = !0 : (s = Et(i, n, a, r, o), t._a[pt] = s.year, t._dayOfYear = s.dayOfYear)
- }(t), null != t._dayOfYear && (o = fe(t._a[pt], n[pt]), (t._dayOfYear > St(o) || 0 === t._dayOfYear) && (g(t)._overflowDayOfYear = !0), i = Vt(o, 0, t._dayOfYear), t._a[vt] = i.getUTCMonth(), t._a[yt] = i.getUTCDate()), e = 0; e < 3 && null == t._a[e]; ++e) t._a[e] = s[e] = n[e];
- for (; e < 7; e++) t._a[e] = s[e] = null == t._a[e] ? 2 === e ? 1 : 0 : t._a[e];
- 24 === t._a[bt] && 0 === t._a[xt] && 0 === t._a[_t] && 0 === t._a[kt] && (t._nextDay = !0, t._a[bt] = 0), t._d = (t._useUTC ? Vt : function (t, e, i, n, a, r, o) {
- var s = new Date(t, e, i, n, a, r, o);
- return t < 100 && t >= 0 && isFinite(s.getFullYear()) && s.setFullYear(t), s
- }).apply(null, s), r = t._useUTC ? t._d.getUTCDay() : t._d.getDay(), null != t._tzm && t._d.setUTCMinutes(t._d.getUTCMinutes() - t._tzm), t._nextDay && (t._a[bt] = 24), t._w && void 0 !== t._w.d && t._w.d !== r && (g(t).weekdayMismatch = !0)
- }
- }
+ hr = h / 360 * 2 * Math.PI;
+ a = c * Math.cos(hr);
+ b = c * Math.sin(hr);
+ return [l, a, b];
+ }
- var me = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,
- pe = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,
- ve = /Z|[+-]\d\d(?::?\d\d)?/,
- ye = [["YYYYYY-MM-DD", /[+-]\d{6}-\d\d-\d\d/], ["YYYY-MM-DD", /\d{4}-\d\d-\d\d/], ["GGGG-[W]WW-E", /\d{4}-W\d\d-\d/], ["GGGG-[W]WW", /\d{4}-W\d\d/, !1], ["YYYY-DDD", /\d{4}-\d{3}/], ["YYYY-MM", /\d{4}-\d\d/, !1], ["YYYYYYMMDD", /[+-]\d{10}/], ["YYYYMMDD", /\d{8}/], ["GGGG[W]WWE", /\d{4}W\d{3}/], ["GGGG[W]WW", /\d{4}W\d{2}/, !1], ["YYYYDDD", /\d{7}/]],
- be = [["HH:mm:ss.SSSS", /\d\d:\d\d:\d\d\.\d+/], ["HH:mm:ss,SSSS", /\d\d:\d\d:\d\d,\d+/], ["HH:mm:ss", /\d\d:\d\d:\d\d/], ["HH:mm", /\d\d:\d\d/], ["HHmmss.SSSS", /\d\d\d\d\d\d\.\d+/], ["HHmmss,SSSS", /\d\d\d\d\d\d,\d+/], ["HHmmss", /\d\d\d\d\d\d/], ["HHmm", /\d\d\d\d/], ["HH", /\d\d/]],
- xe = /^\/?Date\((\-?\d+)/i;
-
- function _e(t) {
- var e, i, n, a, r, o, s = t._i, l = me.exec(s) || pe.exec(s);
- if (l) {
- for (g(t).iso = !0, e = 0, i = ye.length; e < i; e++) if (ye[e][1].exec(l[1])) {
- a = ye[e][0], n = !1 !== ye[e][2];
- break
- }
- if (null == a) return void(t._isValid = !1);
- if (l[3]) {
- for (e = 0, i = be.length; e < i; e++) if (be[e][1].exec(l[3])) {
- r = (l[2] || " ") + be[e][0];
- break
- }
- if (null == r) return void(t._isValid = !1)
- }
- if (!n && null != r) return void(t._isValid = !1);
- if (l[4]) {
- if (!ve.exec(l[4])) return void(t._isValid = !1);
- o = "Z"
- }
- t._f = a + (r || "") + (o || ""), De(t)
- } else t._isValid = !1
- }
+ function lch2xyz(args) {
+ return lab2xyz(lch2lab(args));
+ }
- var ke = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/;
-
- function we(t, e, i, n, a, r) {
- var o = [function (t) {
- var e = parseInt(t, 10);
- {
- if (e <= 49) return 2e3 + e;
- if (e <= 999) return 1900 + e
- }
- return e
- }(t), Lt.indexOf(e), parseInt(i, 10), parseInt(n, 10), parseInt(a, 10)];
- return r && o.push(parseInt(r, 10)), o
- }
+ function lch2rgb(args) {
+ return lab2rgb(lch2lab(args));
+ }
- var Me = {
- UT: 0,
- GMT: 0,
- EDT: -240,
- EST: -300,
- CDT: -300,
- CST: -360,
- MDT: -360,
- MST: -420,
- PDT: -420,
- PST: -480
- };
-
- function Se(t) {
- var e, i, n, a = ke.exec(t._i.replace(/\([^)]*\)|[\n\t]/g, " ").replace(/(\s\s+)/g, " ").trim());
- if (a) {
- var r = we(a[4], a[3], a[2], a[5], a[6], a[7]);
- if (e = a[1], i = r, n = t, e && Gt.indexOf(e) !== new Date(i[0], i[1], i[2]).getDay() && (g(n).weekdayMismatch = !0, n._isValid = !1, 1)) return;
- t._a = r, t._tzm = function (t, e, i) {
- if (t) return Me[t];
- if (e) return 0;
- var n = parseInt(i, 10), a = n % 100;
- return (n - a) / 100 * 60 + a
- }(a[8], a[9], a[10]), t._d = Vt.apply(null, t._a), t._d.setUTCMinutes(t._d.getUTCMinutes() - t._tzm), g(t).rfc2822 = !0
- } else t._isValid = !1
- }
+ function keyword2rgb(keyword) {
+ return cssKeywords[keyword];
+ }
- function De(t) {
- if (t._f !== a.ISO_8601) if (t._f !== a.RFC_2822) {
- t._a = [], g(t).empty = !0;
- var e, i, n, r, o, s, l, u, d = "" + t._i, c = d.length, f = 0;
- for (n = q(t._f, t._locale).match(H) || [], e = 0; e < n.length; e++) r = n[e], (i = (d.match(ht(r, t)) || [])[0]) && ((o = d.substr(0, d.indexOf(i))).length > 0 && g(t).unusedInput.push(o), d = d.slice(d.indexOf(i) + i.length), f += i.length), E[r] ? (i ? g(t).empty = !1 : g(t).unusedTokens.push(r), s = r, u = t, null != (l = i) && h(ft, s) && ft[s](l, u._a, u, s)) : t._strict && !i && g(t).unusedTokens.push(r);
- g(t).charsLeftOver = c - f, d.length > 0 && g(t).unusedInput.push(d), t._a[bt] <= 12 && !0 === g(t).bigHour && t._a[bt] > 0 && (g(t).bigHour = void 0), g(t).parsedDateParts = t._a.slice(0), g(t).meridiem = t._meridiem, t._a[bt] = function (t, e, i) {
- var n;
- if (null == i) return e;
- return null != t.meridiemHour ? t.meridiemHour(e, i) : null != t.isPM ? ((n = t.isPM(i)) && e < 12 && (e += 12), n || 12 !== e || (e = 0), e) : e
- }(t._locale, t._a[bt], t._meridiem), ge(t), ce(t)
- } else Se(t); else _e(t)
- }
+ function keyword2hsl(args) {
+ return rgb2hsl(keyword2rgb(args));
+ }
- function Ce(t) {
- var e, i, n, h, f = t._i, v = t._f;
- return t._locale = t._locale || he(t._l), null === f || void 0 === v && "" === f ? p({nullInput: !0}) : ("string" == typeof f && (t._i = f = t._locale.preparse(f)), _(f) ? new x(ce(f)) : (u(f) ? t._d = f : r(v) ? function (t) {
- var e, i, n, a, r;
- if (0 === t._f.length) return g(t).invalidFormat = !0, void(t._d = new Date(NaN));
- for (a = 0; a < t._f.length; a++) r = 0, e = y({}, t), null != t._useUTC && (e._useUTC = t._useUTC), e._f = t._f[a], De(e), m(e) && (r += g(e).charsLeftOver, r += 10 * g(e).unusedTokens.length, g(e).score = r, (null == n || r < n) && (n = r, i = e));
- c(t, i || e)
- }(t) : v ? De(t) : s(i = (e = t)._i) ? e._d = new Date(a.now()) : u(i) ? e._d = new Date(i.valueOf()) : "string" == typeof i ? (n = e, null === (h = xe.exec(n._i)) ? (_e(n), !1 === n._isValid && (delete n._isValid, Se(n), !1 === n._isValid && (delete n._isValid, a.createFromInputFallback(n)))) : n._d = new Date(+h[1])) : r(i) ? (e._a = d(i.slice(0), function (t) {
- return parseInt(t, 10)
- }), ge(e)) : o(i) ? function (t) {
- if (!t._d) {
- var e = W(t._i);
- t._a = d([e.year, e.month, e.day || e.date, e.hour, e.minute, e.second, e.millisecond], function (t) {
- return t && parseInt(t, 10)
- }), ge(t)
- }
- }(e) : l(i) ? e._d = new Date(i) : a.createFromInputFallback(e), m(t) || (t._d = null), t))
- }
+ function keyword2hsv(args) {
+ return rgb2hsv(keyword2rgb(args));
+ }
- function Pe(t, e, i, n, a) {
- var s, l = {};
- return !0 !== i && !1 !== i || (n = i, i = void 0), (o(t) && function (t) {
- if (Object.getOwnPropertyNames) return 0 === Object.getOwnPropertyNames(t).length;
- var e;
- for (e in t) if (t.hasOwnProperty(e)) return !1;
- return !0
- }(t) || r(t) && 0 === t.length) && (t = void 0), l._isAMomentObject = !0, l._useUTC = l._isUTC = a, l._l = i, l._i = t, l._f = e, l._strict = n, (s = new x(ce(Ce(l))))._nextDay && (s.add(1, "d"), s._nextDay = void 0), s
- }
+ function keyword2hwb(args) {
+ return rgb2hwb(keyword2rgb(args));
+ }
- function Te(t, e, i, n) {
- return Pe(t, e, i, n, !1)
- }
+ function keyword2cmyk(args) {
+ return rgb2cmyk(keyword2rgb(args));
+ }
- a.createFromInputFallback = D("value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are discouraged and will be removed in an upcoming major release. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.", function (t) {
- t._d = new Date(t._i + (t._useUTC ? " UTC" : ""))
- }), a.ISO_8601 = function () {
- }, a.RFC_2822 = function () {
- };
- var Oe = D("moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/", function () {
- var t = Te.apply(null, arguments);
- return this.isValid() && t.isValid() ? t < this ? this : t : p()
- }),
- Ie = D("moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/", function () {
- var t = Te.apply(null, arguments);
- return this.isValid() && t.isValid() ? t > this ? this : t : p()
- });
-
- function Ae(t, e) {
- var i, n;
- if (1 === e.length && r(e[0]) && (e = e[0]), !e.length) return Te();
- for (i = e[0], n = 1; n < e.length; ++n) e[n].isValid() && !e[n][t](i) || (i = e[n]);
- return i
- }
+ function keyword2lab(args) {
+ return rgb2lab(keyword2rgb(args));
+ }
- var Fe = ["year", "quarter", "month", "week", "day", "hour", "minute", "second", "millisecond"];
-
- function Re(t) {
- var e = W(t), i = e.year || 0, n = e.quarter || 0, a = e.month || 0, r = e.week || 0,
- o = e.day || 0, s = e.hour || 0, l = e.minute || 0, u = e.second || 0, d = e.millisecond || 0;
- this._isValid = function (t) {
- for (var e in t) if (-1 === Ct.call(Fe, e) || null != t[e] && isNaN(t[e])) return !1;
- for (var i = !1, n = 0; n < Fe.length; ++n) if (t[Fe[n]]) {
- if (i) return !1;
- parseFloat(t[Fe[n]]) !== w(t[Fe[n]]) && (i = !0)
- }
- return !0
- }(e), this._milliseconds = +d + 1e3 * u + 6e4 * l + 1e3 * s * 60 * 60, this._days = +o + 7 * r, this._months = +a + 3 * n + 12 * i, this._data = {}, this._locale = he(), this._bubble()
- }
+ function keyword2xyz(args) {
+ return rgb2xyz(keyword2rgb(args));
+ }
- function Le(t) {
- return t instanceof Re
- }
+ var cssKeywords = {
+ aliceblue: [240, 248, 255],
+ antiquewhite: [250, 235, 215],
+ aqua: [0, 255, 255],
+ aquamarine: [127, 255, 212],
+ azure: [240, 255, 255],
+ beige: [245, 245, 220],
+ bisque: [255, 228, 196],
+ black: [0, 0, 0],
+ blanchedalmond: [255, 235, 205],
+ blue: [0, 0, 255],
+ blueviolet: [138, 43, 226],
+ brown: [165, 42, 42],
+ burlywood: [222, 184, 135],
+ cadetblue: [95, 158, 160],
+ chartreuse: [127, 255, 0],
+ chocolate: [210, 105, 30],
+ coral: [255, 127, 80],
+ cornflowerblue: [100, 149, 237],
+ cornsilk: [255, 248, 220],
+ crimson: [220, 20, 60],
+ cyan: [0, 255, 255],
+ darkblue: [0, 0, 139],
+ darkcyan: [0, 139, 139],
+ darkgoldenrod: [184, 134, 11],
+ darkgray: [169, 169, 169],
+ darkgreen: [0, 100, 0],
+ darkgrey: [169, 169, 169],
+ darkkhaki: [189, 183, 107],
+ darkmagenta: [139, 0, 139],
+ darkolivegreen: [85, 107, 47],
+ darkorange: [255, 140, 0],
+ darkorchid: [153, 50, 204],
+ darkred: [139, 0, 0],
+ darksalmon: [233, 150, 122],
+ darkseagreen: [143, 188, 143],
+ darkslateblue: [72, 61, 139],
+ darkslategray: [47, 79, 79],
+ darkslategrey: [47, 79, 79],
+ darkturquoise: [0, 206, 209],
+ darkviolet: [148, 0, 211],
+ deeppink: [255, 20, 147],
+ deepskyblue: [0, 191, 255],
+ dimgray: [105, 105, 105],
+ dimgrey: [105, 105, 105],
+ dodgerblue: [30, 144, 255],
+ firebrick: [178, 34, 34],
+ floralwhite: [255, 250, 240],
+ forestgreen: [34, 139, 34],
+ fuchsia: [255, 0, 255],
+ gainsboro: [220, 220, 220],
+ ghostwhite: [248, 248, 255],
+ gold: [255, 215, 0],
+ goldenrod: [218, 165, 32],
+ gray: [128, 128, 128],
+ green: [0, 128, 0],
+ greenyellow: [173, 255, 47],
+ grey: [128, 128, 128],
+ honeydew: [240, 255, 240],
+ hotpink: [255, 105, 180],
+ indianred: [205, 92, 92],
+ indigo: [75, 0, 130],
+ ivory: [255, 255, 240],
+ khaki: [240, 230, 140],
+ lavender: [230, 230, 250],
+ lavenderblush: [255, 240, 245],
+ lawngreen: [124, 252, 0],
+ lemonchiffon: [255, 250, 205],
+ lightblue: [173, 216, 230],
+ lightcoral: [240, 128, 128],
+ lightcyan: [224, 255, 255],
+ lightgoldenrodyellow: [250, 250, 210],
+ lightgray: [211, 211, 211],
+ lightgreen: [144, 238, 144],
+ lightgrey: [211, 211, 211],
+ lightpink: [255, 182, 193],
+ lightsalmon: [255, 160, 122],
+ lightseagreen: [32, 178, 170],
+ lightskyblue: [135, 206, 250],
+ lightslategray: [119, 136, 153],
+ lightslategrey: [119, 136, 153],
+ lightsteelblue: [176, 196, 222],
+ lightyellow: [255, 255, 224],
+ lime: [0, 255, 0],
+ limegreen: [50, 205, 50],
+ linen: [250, 240, 230],
+ magenta: [255, 0, 255],
+ maroon: [128, 0, 0],
+ mediumaquamarine: [102, 205, 170],
+ mediumblue: [0, 0, 205],
+ mediumorchid: [186, 85, 211],
+ mediumpurple: [147, 112, 219],
+ mediumseagreen: [60, 179, 113],
+ mediumslateblue: [123, 104, 238],
+ mediumspringgreen: [0, 250, 154],
+ mediumturquoise: [72, 209, 204],
+ mediumvioletred: [199, 21, 133],
+ midnightblue: [25, 25, 112],
+ mintcream: [245, 255, 250],
+ mistyrose: [255, 228, 225],
+ moccasin: [255, 228, 181],
+ navajowhite: [255, 222, 173],
+ navy: [0, 0, 128],
+ oldlace: [253, 245, 230],
+ olive: [128, 128, 0],
+ olivedrab: [107, 142, 35],
+ orange: [255, 165, 0],
+ orangered: [255, 69, 0],
+ orchid: [218, 112, 214],
+ palegoldenrod: [238, 232, 170],
+ palegreen: [152, 251, 152],
+ paleturquoise: [175, 238, 238],
+ palevioletred: [219, 112, 147],
+ papayawhip: [255, 239, 213],
+ peachpuff: [255, 218, 185],
+ peru: [205, 133, 63],
+ pink: [255, 192, 203],
+ plum: [221, 160, 221],
+ powderblue: [176, 224, 230],
+ purple: [128, 0, 128],
+ rebeccapurple: [102, 51, 153],
+ red: [255, 0, 0],
+ rosybrown: [188, 143, 143],
+ royalblue: [65, 105, 225],
+ saddlebrown: [139, 69, 19],
+ salmon: [250, 128, 114],
+ sandybrown: [244, 164, 96],
+ seagreen: [46, 139, 87],
+ seashell: [255, 245, 238],
+ sienna: [160, 82, 45],
+ silver: [192, 192, 192],
+ skyblue: [135, 206, 235],
+ slateblue: [106, 90, 205],
+ slategray: [112, 128, 144],
+ slategrey: [112, 128, 144],
+ snow: [255, 250, 250],
+ springgreen: [0, 255, 127],
+ steelblue: [70, 130, 180],
+ tan: [210, 180, 140],
+ teal: [0, 128, 128],
+ thistle: [216, 191, 216],
+ tomato: [255, 99, 71],
+ turquoise: [64, 224, 208],
+ violet: [238, 130, 238],
+ wheat: [245, 222, 179],
+ white: [255, 255, 255],
+ whitesmoke: [245, 245, 245],
+ yellow: [255, 255, 0],
+ yellowgreen: [154, 205, 50]
+ };
- function We(t) {
- return t < 0 ? -1 * Math.round(-1 * t) : Math.round(t)
- }
+ var reverseKeywords = {};
+ for (var key in cssKeywords) {
+ reverseKeywords[JSON.stringify(cssKeywords[key])] = key;
+ }
- function Ye(t, e) {
- j(t, 0, 0, function () {
- var t = this.utcOffset(), i = "+";
- return t < 0 && (t = -t, i = "-"), i + z(~~(t / 60), 2) + e + z(~~t % 60, 2)
- })
- }
+ var convert = function () {
+ return new Converter();
+ };
- Ye("Z", ":"), Ye("ZZ", ""), dt("Z", st), dt("ZZ", st), gt(["Z", "ZZ"], function (t, e, i) {
- i._useUTC = !0, i._tzm = ze(st, t)
- });
- var Ne = /([\+\-]|\d\d)/gi;
+ for (var func in conversions) {
+ // export Raw versions
+ convert[func + "Raw"] = (function (func) {
+ // accept array or plain args
+ return function (arg) {
+ if (typeof arg == "number")
+ arg = Array.prototype.slice.call(arguments);
+ return conversions[func](arg);
+ }
+ })(func);
- function ze(t, e) {
- var i = (e || "").match(t);
- if (null === i) return null;
- var n = ((i[i.length - 1] || []) + "").match(Ne) || ["-", 0, 0], a = 60 * n[1] + w(n[2]);
- return 0 === a ? 0 : "+" === n[0] ? a : -a
- }
+ var pair = /(\w+)2(\w+)/.exec(func),
+ from = pair[1],
+ to = pair[2];
- function He(t, e) {
- var i, n;
- return e._isUTC ? (i = e.clone(), n = (_(t) || u(t) ? t.valueOf() : Te(t).valueOf()) - i.valueOf(), i._d.setTime(i._d.valueOf() + n), a.updateOffset(i, !1), i) : Te(t).local()
- }
+ // export rgb2hsl and ["rgb"]["hsl"]
+ convert[from] = convert[from] || {};
- function Ve(t) {
- return 15 * -Math.round(t._d.getTimezoneOffset() / 15)
- }
+ convert[from][to] = convert[func] = (function (func) {
+ return function (arg) {
+ if (typeof arg == "number")
+ arg = Array.prototype.slice.call(arguments);
- function Be() {
- return !!this.isValid() && (this._isUTC && 0 === this._offset)
- }
+ var val = conversions[func](arg);
+ if (typeof val == "string" || val === undefined)
+ return val; // keyword
- a.updateOffset = function () {
- };
- var Ee = /^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/,
- je = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;
-
- function Ue(t, e) {
- var i, n, a, r = t, o = null;
- return Le(t) ? r = {
- ms: t._milliseconds,
- d: t._days,
- M: t._months
- } : l(t) ? (r = {}, e ? r[e] = t : r.milliseconds = t) : (o = Ee.exec(t)) ? (i = "-" === o[1] ? -1 : 1, r = {
- y: 0,
- d: w(o[yt]) * i,
- h: w(o[bt]) * i,
- m: w(o[xt]) * i,
- s: w(o[_t]) * i,
- ms: w(We(1e3 * o[kt])) * i
- }) : (o = je.exec(t)) ? (i = "-" === o[1] ? -1 : (o[1], 1), r = {
- y: qe(o[2], i),
- M: qe(o[3], i),
- w: qe(o[4], i),
- d: qe(o[5], i),
- h: qe(o[6], i),
- m: qe(o[7], i),
- s: qe(o[8], i)
- }) : null == r ? r = {} : "object" == typeof r && ("from" in r || "to" in r) && (a = function (t, e) {
- var i;
- if (!t.isValid() || !e.isValid()) return {milliseconds: 0, months: 0};
- e = He(e, t), t.isBefore(e) ? i = Ge(t, e) : ((i = Ge(e, t)).milliseconds = -i.milliseconds, i.months = -i.months);
- return i
- }(Te(r.from), Te(r.to)), (r = {}).ms = a.milliseconds, r.M = a.months), n = new Re(r), Le(t) && h(t, "_locale") && (n._locale = t._locale), n
- }
+ for (var i = 0; i < val.length; i++)
+ val[i] = Math.round(val[i]);
+ return val;
+ }
+ })(func);
+ }
- function qe(t, e) {
- var i = t && parseFloat(t.replace(",", "."));
- return (isNaN(i) ? 0 : i) * e
- }
- function Ge(t, e) {
- var i = {milliseconds: 0, months: 0};
- return i.months = e.month() - t.month() + 12 * (e.year() - t.year()), t.clone().add(i.months, "M").isAfter(e) && --i.months, i.milliseconds = +e - +t.clone().add(i.months, "M"), i
- }
+ /* Converter does lazy conversion and caching */
+ var Converter = function () {
+ this.convs = {};
+ };
- function Ze(t, e) {
- return function (i, n) {
- var a;
- return null === n || isNaN(+n) || (T(e, "moment()." + e + "(period, number) is deprecated. Please use moment()." + e + "(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."), a = i, i = n, n = a), Xe(this, Ue(i = "string" == typeof i ? +i : i, n), t), this
- }
- }
+ /* Either get the values for a space or
+ set the values for a space, depending on args */
+ Converter.prototype.routeSpace = function (space, args) {
+ var values = args[0];
+ if (values === undefined) {
+ // color.rgb()
+ return this.getValues(space);
+ }
+ // color.rgb(10, 10, 10)
+ if (typeof values == "number") {
+ values = Array.prototype.slice.call(args);
+ }
- function Xe(t, e, i, n) {
- var r = e._milliseconds, o = We(e._days), s = We(e._months);
- t.isValid() && (n = null == n || n, s && Wt(t, Ot(t, "Month") + s * i), o && It(t, "Date", Ot(t, "Date") + o * i), r && t._d.setTime(t._d.valueOf() + r * i), n && a.updateOffset(t, o || s))
- }
+ return this.setValues(space, values);
+ };
- Ue.fn = Re.prototype, Ue.invalid = function () {
- return Ue(NaN)
- };
- var Je = Ze(1, "add"), Ke = Ze(-1, "subtract");
+ /* Set the values for a space, invalidating cache */
+ Converter.prototype.setValues = function (space, values) {
+ this.space = space;
+ this.convs = {};
+ this.convs[space] = values;
+ return this;
+ };
- function $e(t, e) {
- var i = 12 * (e.year() - t.year()) + (e.month() - t.month()), n = t.clone().add(i, "months");
- return -(i + (e - n < 0 ? (e - n) / (n - t.clone().add(i - 1, "months")) : (e - n) / (t.clone().add(i + 1, "months") - n))) || 0
- }
+ /* Get the values for a space. If there's already
+ a conversion for the space, fetch it, otherwise
+ compute it */
+ Converter.prototype.getValues = function (space) {
+ var vals = this.convs[space];
+ if (!vals) {
+ var fspace = this.space,
+ from = this.convs[fspace];
+ vals = convert[fspace][space](from);
- function Qe(t) {
- var e;
- return void 0 === t ? this._locale._abbr : (null != (e = he(t)) && (this._locale = e), this)
- }
+ this.convs[space] = vals;
+ }
+ return vals;
+ };
- a.defaultFormat = "YYYY-MM-DDTHH:mm:ssZ", a.defaultFormatUtc = "YYYY-MM-DDTHH:mm:ss[Z]";
- var ti = D("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.", function (t) {
- return void 0 === t ? this.localeData() : this.locale(t)
- });
+ ["rgb", "hsl", "hsv", "cmyk", "keyword"].forEach(function (space) {
+ Converter.prototype[space] = function (vals) {
+ return this.routeSpace(space, arguments);
+ };
+ });
- function ei() {
- return this._locale
- }
+ var colorConvert = convert;
- function ii(t, e) {
- j(0, [t, t.length], 0, e)
- }
+ var colorName = {
+ "aliceblue": [240, 248, 255],
+ "antiquewhite": [250, 235, 215],
+ "aqua": [0, 255, 255],
+ "aquamarine": [127, 255, 212],
+ "azure": [240, 255, 255],
+ "beige": [245, 245, 220],
+ "bisque": [255, 228, 196],
+ "black": [0, 0, 0],
+ "blanchedalmond": [255, 235, 205],
+ "blue": [0, 0, 255],
+ "blueviolet": [138, 43, 226],
+ "brown": [165, 42, 42],
+ "burlywood": [222, 184, 135],
+ "cadetblue": [95, 158, 160],
+ "chartreuse": [127, 255, 0],
+ "chocolate": [210, 105, 30],
+ "coral": [255, 127, 80],
+ "cornflowerblue": [100, 149, 237],
+ "cornsilk": [255, 248, 220],
+ "crimson": [220, 20, 60],
+ "cyan": [0, 255, 255],
+ "darkblue": [0, 0, 139],
+ "darkcyan": [0, 139, 139],
+ "darkgoldenrod": [184, 134, 11],
+ "darkgray": [169, 169, 169],
+ "darkgreen": [0, 100, 0],
+ "darkgrey": [169, 169, 169],
+ "darkkhaki": [189, 183, 107],
+ "darkmagenta": [139, 0, 139],
+ "darkolivegreen": [85, 107, 47],
+ "darkorange": [255, 140, 0],
+ "darkorchid": [153, 50, 204],
+ "darkred": [139, 0, 0],
+ "darksalmon": [233, 150, 122],
+ "darkseagreen": [143, 188, 143],
+ "darkslateblue": [72, 61, 139],
+ "darkslategray": [47, 79, 79],
+ "darkslategrey": [47, 79, 79],
+ "darkturquoise": [0, 206, 209],
+ "darkviolet": [148, 0, 211],
+ "deeppink": [255, 20, 147],
+ "deepskyblue": [0, 191, 255],
+ "dimgray": [105, 105, 105],
+ "dimgrey": [105, 105, 105],
+ "dodgerblue": [30, 144, 255],
+ "firebrick": [178, 34, 34],
+ "floralwhite": [255, 250, 240],
+ "forestgreen": [34, 139, 34],
+ "fuchsia": [255, 0, 255],
+ "gainsboro": [220, 220, 220],
+ "ghostwhite": [248, 248, 255],
+ "gold": [255, 215, 0],
+ "goldenrod": [218, 165, 32],
+ "gray": [128, 128, 128],
+ "green": [0, 128, 0],
+ "greenyellow": [173, 255, 47],
+ "grey": [128, 128, 128],
+ "honeydew": [240, 255, 240],
+ "hotpink": [255, 105, 180],
+ "indianred": [205, 92, 92],
+ "indigo": [75, 0, 130],
+ "ivory": [255, 255, 240],
+ "khaki": [240, 230, 140],
+ "lavender": [230, 230, 250],
+ "lavenderblush": [255, 240, 245],
+ "lawngreen": [124, 252, 0],
+ "lemonchiffon": [255, 250, 205],
+ "lightblue": [173, 216, 230],
+ "lightcoral": [240, 128, 128],
+ "lightcyan": [224, 255, 255],
+ "lightgoldenrodyellow": [250, 250, 210],
+ "lightgray": [211, 211, 211],
+ "lightgreen": [144, 238, 144],
+ "lightgrey": [211, 211, 211],
+ "lightpink": [255, 182, 193],
+ "lightsalmon": [255, 160, 122],
+ "lightseagreen": [32, 178, 170],
+ "lightskyblue": [135, 206, 250],
+ "lightslategray": [119, 136, 153],
+ "lightslategrey": [119, 136, 153],
+ "lightsteelblue": [176, 196, 222],
+ "lightyellow": [255, 255, 224],
+ "lime": [0, 255, 0],
+ "limegreen": [50, 205, 50],
+ "linen": [250, 240, 230],
+ "magenta": [255, 0, 255],
+ "maroon": [128, 0, 0],
+ "mediumaquamarine": [102, 205, 170],
+ "mediumblue": [0, 0, 205],
+ "mediumorchid": [186, 85, 211],
+ "mediumpurple": [147, 112, 219],
+ "mediumseagreen": [60, 179, 113],
+ "mediumslateblue": [123, 104, 238],
+ "mediumspringgreen": [0, 250, 154],
+ "mediumturquoise": [72, 209, 204],
+ "mediumvioletred": [199, 21, 133],
+ "midnightblue": [25, 25, 112],
+ "mintcream": [245, 255, 250],
+ "mistyrose": [255, 228, 225],
+ "moccasin": [255, 228, 181],
+ "navajowhite": [255, 222, 173],
+ "navy": [0, 0, 128],
+ "oldlace": [253, 245, 230],
+ "olive": [128, 128, 0],
+ "olivedrab": [107, 142, 35],
+ "orange": [255, 165, 0],
+ "orangered": [255, 69, 0],
+ "orchid": [218, 112, 214],
+ "palegoldenrod": [238, 232, 170],
+ "palegreen": [152, 251, 152],
+ "paleturquoise": [175, 238, 238],
+ "palevioletred": [219, 112, 147],
+ "papayawhip": [255, 239, 213],
+ "peachpuff": [255, 218, 185],
+ "peru": [205, 133, 63],
+ "pink": [255, 192, 203],
+ "plum": [221, 160, 221],
+ "powderblue": [176, 224, 230],
+ "purple": [128, 0, 128],
+ "rebeccapurple": [102, 51, 153],
+ "red": [255, 0, 0],
+ "rosybrown": [188, 143, 143],
+ "royalblue": [65, 105, 225],
+ "saddlebrown": [139, 69, 19],
+ "salmon": [250, 128, 114],
+ "sandybrown": [244, 164, 96],
+ "seagreen": [46, 139, 87],
+ "seashell": [255, 245, 238],
+ "sienna": [160, 82, 45],
+ "silver": [192, 192, 192],
+ "skyblue": [135, 206, 235],
+ "slateblue": [106, 90, 205],
+ "slategray": [112, 128, 144],
+ "slategrey": [112, 128, 144],
+ "snow": [255, 250, 250],
+ "springgreen": [0, 255, 127],
+ "steelblue": [70, 130, 180],
+ "tan": [210, 180, 140],
+ "teal": [0, 128, 128],
+ "thistle": [216, 191, 216],
+ "tomato": [255, 99, 71],
+ "turquoise": [64, 224, 208],
+ "violet": [238, 130, 238],
+ "wheat": [245, 222, 179],
+ "white": [255, 255, 255],
+ "whitesmoke": [245, 245, 245],
+ "yellow": [255, 255, 0],
+ "yellowgreen": [154, 205, 50]
+ };
- function ni(t, e, i, n, a) {
- var r;
- return null == t ? jt(this, n, a).year : (e > (r = Ut(t, n, a)) && (e = r), function (t, e, i, n, a) {
- var r = Et(t, e, i, n, a), o = Vt(r.year, 0, r.dayOfYear);
- return this.year(o.getUTCFullYear()), this.month(o.getUTCMonth()), this.date(o.getUTCDate()), this
- }.call(this, t, e, i, n, a))
- }
+ /* MIT license */
- j(0, ["gg", 2], 0, function () {
- return this.weekYear() % 100
- }), j(0, ["GG", 2], 0, function () {
- return this.isoWeekYear() % 100
- }), ii("gggg", "weekYear"), ii("ggggg", "weekYear"), ii("GGGG", "isoWeekYear"), ii("GGGGG", "isoWeekYear"), R("weekYear", "gg"), R("isoWeekYear", "GG"), N("weekYear", 1), N("isoWeekYear", 1), dt("G", rt), dt("g", rt), dt("GG", $, Z), dt("gg", $, Z), dt("GGGG", it, J), dt("gggg", it, J), dt("GGGGG", nt, K), dt("ggggg", nt, K), mt(["gggg", "ggggg", "GGGG", "GGGGG"], function (t, e, i, n) {
- e[n.substr(0, 2)] = w(t)
- }), mt(["gg", "GG"], function (t, e, i, n) {
- e[n] = a.parseTwoDigitYear(t)
- }), j("Q", 0, "Qo", "quarter"), R("quarter", "Q"), N("quarter", 7), dt("Q", G), gt("Q", function (t, e) {
- e[vt] = 3 * (w(t) - 1)
- }), j("D", ["DD", 2], "Do", "date"), R("date", "D"), N("date", 9), dt("D", $), dt("DD", $, Z), dt("Do", function (t, e) {
- return t ? e._dayOfMonthOrdinalParse || e._ordinalParse : e._dayOfMonthOrdinalParseLenient
- }), gt(["D", "DD"], yt), gt("Do", function (t, e) {
- e[yt] = w(t.match($)[0])
- });
- var ai = Tt("Date", !0);
- j("DDD", ["DDDD", 3], "DDDo", "dayOfYear"), R("dayOfYear", "DDD"), N("dayOfYear", 4), dt("DDD", et), dt("DDDD", X), gt(["DDD", "DDDD"], function (t, e, i) {
- i._dayOfYear = w(t)
- }), j("m", ["mm", 2], 0, "minute"), R("minute", "m"), N("minute", 14), dt("m", $), dt("mm", $, Z), gt(["m", "mm"], xt);
- var ri = Tt("Minutes", !1);
- j("s", ["ss", 2], 0, "second"), R("second", "s"), N("second", 15), dt("s", $), dt("ss", $, Z), gt(["s", "ss"], _t);
- var oi, si = Tt("Seconds", !1);
- for (j("S", 0, 0, function () {
- return ~~(this.millisecond() / 100)
- }), j(0, ["SS", 2], 0, function () {
- return ~~(this.millisecond() / 10)
- }), j(0, ["SSS", 3], 0, "millisecond"), j(0, ["SSSS", 4], 0, function () {
- return 10 * this.millisecond()
- }), j(0, ["SSSSS", 5], 0, function () {
- return 100 * this.millisecond()
- }), j(0, ["SSSSSS", 6], 0, function () {
- return 1e3 * this.millisecond()
- }), j(0, ["SSSSSSS", 7], 0, function () {
- return 1e4 * this.millisecond()
- }), j(0, ["SSSSSSSS", 8], 0, function () {
- return 1e5 * this.millisecond()
- }), j(0, ["SSSSSSSSS", 9], 0, function () {
- return 1e6 * this.millisecond()
- }), R("millisecond", "ms"), N("millisecond", 16), dt("S", et, G), dt("SS", et, Z), dt("SSS", et, X), oi = "SSSS"; oi.length <= 9; oi += "S") dt(oi, at);
-
- function li(t, e) {
- e[kt] = w(1e3 * ("0." + t))
- }
- for (oi = "S"; oi.length <= 9; oi += "S") gt(oi, li);
- var ui = Tt("Milliseconds", !1);
- j("z", 0, 0, "zoneAbbr"), j("zz", 0, 0, "zoneName");
- var di = x.prototype;
+ var colorString = {
+ getRgba: getRgba,
+ getHsla: getHsla,
+ getRgb: getRgb,
+ getHsl: getHsl,
+ getHwb: getHwb,
+ getAlpha: getAlpha,
- function hi(t) {
- return t
- }
+ hexString: hexString,
+ rgbString: rgbString,
+ rgbaString: rgbaString,
+ percentString: percentString,
+ percentaString: percentaString,
+ hslString: hslString,
+ hslaString: hslaString,
+ hwbString: hwbString,
+ keyword: keyword
+ };
- di.add = Je, di.calendar = function (t, e) {
- var i = t || Te(), n = He(i, this).startOf("day"), r = a.calendarFormat(this, n) || "sameElse",
- o = e && (O(e[r]) ? e[r].call(this, i) : e[r]);
- return this.format(o || this.localeData().calendar(r, this, Te(i)))
- }, di.clone = function () {
- return new x(this)
- }, di.diff = function (t, e, i) {
- var n, a, r;
- if (!this.isValid()) return NaN;
- if (!(n = He(t, this)).isValid()) return NaN;
- switch (a = 6e4 * (n.utcOffset() - this.utcOffset()), e = L(e)) {
- case"year":
- r = $e(this, n) / 12;
- break;
- case"month":
- r = $e(this, n);
- break;
- case"quarter":
- r = $e(this, n) / 3;
- break;
- case"second":
- r = (this - n) / 1e3;
- break;
- case"minute":
- r = (this - n) / 6e4;
- break;
- case"hour":
- r = (this - n) / 36e5;
- break;
- case"day":
- r = (this - n - a) / 864e5;
- break;
- case"week":
- r = (this - n - a) / 6048e5;
- break;
- default:
- r = this - n
- }
- return i ? r : k(r)
- }, di.endOf = function (t) {
- return void 0 === (t = L(t)) || "millisecond" === t ? this : ("date" === t && (t = "day"), this.startOf(t).add(1, "isoWeek" === t ? "week" : t).subtract(1, "ms"))
- }, di.format = function (t) {
- t || (t = this.isUtc() ? a.defaultFormatUtc : a.defaultFormat);
- var e = U(this, t);
- return this.localeData().postformat(e)
- }, di.from = function (t, e) {
- return this.isValid() && (_(t) && t.isValid() || Te(t).isValid()) ? Ue({
- to: this,
- from: t
- }).locale(this.locale()).humanize(!e) : this.localeData().invalidDate()
- }, di.fromNow = function (t) {
- return this.from(Te(), t)
- }, di.to = function (t, e) {
- return this.isValid() && (_(t) && t.isValid() || Te(t).isValid()) ? Ue({
- from: this,
- to: t
- }).locale(this.locale()).humanize(!e) : this.localeData().invalidDate()
- }, di.toNow = function (t) {
- return this.to(Te(), t)
- }, di.get = function (t) {
- return O(this[t = L(t)]) ? this[t]() : this
- }, di.invalidAt = function () {
- return g(this).overflow
- }, di.isAfter = function (t, e) {
- var i = _(t) ? t : Te(t);
- return !(!this.isValid() || !i.isValid()) && ("millisecond" === (e = L(s(e) ? "millisecond" : e)) ? this.valueOf() > i.valueOf() : i.valueOf() < this.clone().startOf(e).valueOf())
- }, di.isBefore = function (t, e) {
- var i = _(t) ? t : Te(t);
- return !(!this.isValid() || !i.isValid()) && ("millisecond" === (e = L(s(e) ? "millisecond" : e)) ? this.valueOf() < i.valueOf() : this.clone().endOf(e).valueOf() < i.valueOf())
- }, di.isBetween = function (t, e, i, n) {
- return ("(" === (n = n || "()")[0] ? this.isAfter(t, i) : !this.isBefore(t, i)) && (")" === n[1] ? this.isBefore(e, i) : !this.isAfter(e, i))
- }, di.isSame = function (t, e) {
- var i, n = _(t) ? t : Te(t);
- return !(!this.isValid() || !n.isValid()) && ("millisecond" === (e = L(e || "millisecond")) ? this.valueOf() === n.valueOf() : (i = n.valueOf(), this.clone().startOf(e).valueOf() <= i && i <= this.clone().endOf(e).valueOf()))
- }, di.isSameOrAfter = function (t, e) {
- return this.isSame(t, e) || this.isAfter(t, e)
- }, di.isSameOrBefore = function (t, e) {
- return this.isSame(t, e) || this.isBefore(t, e)
- }, di.isValid = function () {
- return m(this)
- }, di.lang = ti, di.locale = Qe, di.localeData = ei, di.max = Ie, di.min = Oe, di.parsingFlags = function () {
- return c({}, g(this))
- }, di.set = function (t, e) {
- if ("object" == typeof t) for (var i = function (t) {
- var e = [];
- for (var i in t) e.push({unit: i, priority: Y[i]});
- return e.sort(function (t, e) {
- return t.priority - e.priority
- }), e
- }(t = W(t)), n = 0; n < i.length; n++) this[i[n].unit](t[i[n].unit]); else if (O(this[t = L(t)])) return this[t](e);
- return this
- }, di.startOf = function (t) {
- switch (t = L(t)) {
- case"year":
- this.month(0);
- case"quarter":
- case"month":
- this.date(1);
- case"week":
- case"isoWeek":
- case"day":
- case"date":
- this.hours(0);
- case"hour":
- this.minutes(0);
- case"minute":
- this.seconds(0);
- case"second":
- this.milliseconds(0)
- }
- return "week" === t && this.weekday(0), "isoWeek" === t && this.isoWeekday(1), "quarter" === t && this.month(3 * Math.floor(this.month() / 3)), this
- }, di.subtract = Ke, di.toArray = function () {
- var t = this;
- return [t.year(), t.month(), t.date(), t.hour(), t.minute(), t.second(), t.millisecond()]
- }, di.toObject = function () {
- var t = this;
- return {
- years: t.year(),
- months: t.month(),
- date: t.date(),
- hours: t.hours(),
- minutes: t.minutes(),
- seconds: t.seconds(),
- milliseconds: t.milliseconds()
- }
- }, di.toDate = function () {
- return new Date(this.valueOf())
- }, di.toISOString = function (t) {
- if (!this.isValid()) return null;
- var e = !0 !== t, i = e ? this.clone().utc() : this;
- return i.year() < 0 || i.year() > 9999 ? U(i, e ? "YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]" : "YYYYYY-MM-DD[T]HH:mm:ss.SSSZ") : O(Date.prototype.toISOString) ? e ? this.toDate().toISOString() : new Date(this._d.valueOf()).toISOString().replace("Z", U(i, "Z")) : U(i, e ? "YYYY-MM-DD[T]HH:mm:ss.SSS[Z]" : "YYYY-MM-DD[T]HH:mm:ss.SSSZ")
- }, di.inspect = function () {
- if (!this.isValid()) return "moment.invalid(/* " + this._i + " */)";
- var t = "moment", e = "";
- this.isLocal() || (t = 0 === this.utcOffset() ? "moment.utc" : "moment.parseZone", e = "Z");
- var i = "[" + t + '("]', n = 0 <= this.year() && this.year() <= 9999 ? "YYYY" : "YYYYYY",
- a = e + '[")]';
- return this.format(i + n + "-MM-DD[T]HH:mm:ss.SSS" + a)
- }, di.toJSON = function () {
- return this.isValid() ? this.toISOString() : null
- }, di.toString = function () {
- return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")
- }, di.unix = function () {
- return Math.floor(this.valueOf() / 1e3)
- }, di.valueOf = function () {
- return this._d.valueOf() - 6e4 * (this._offset || 0)
- }, di.creationData = function () {
- return {
- input: this._i,
- format: this._f,
- locale: this._locale,
- isUTC: this._isUTC,
- strict: this._strict
- }
- }, di.year = Pt, di.isLeapYear = function () {
- return Dt(this.year())
- }, di.weekYear = function (t) {
- return ni.call(this, t, this.week(), this.weekday(), this.localeData()._week.dow, this.localeData()._week.doy)
- }, di.isoWeekYear = function (t) {
- return ni.call(this, t, this.isoWeek(), this.isoWeekday(), 1, 4)
- }, di.quarter = di.quarters = function (t) {
- return null == t ? Math.ceil((this.month() + 1) / 3) : this.month(3 * (t - 1) + this.month() % 3)
- }, di.month = Yt, di.daysInMonth = function () {
- return At(this.year(), this.month())
- }, di.week = di.weeks = function (t) {
- var e = this.localeData().week(this);
- return null == t ? e : this.add(7 * (t - e), "d")
- }, di.isoWeek = di.isoWeeks = function (t) {
- var e = jt(this, 1, 4).week;
- return null == t ? e : this.add(7 * (t - e), "d")
- }, di.weeksInYear = function () {
- var t = this.localeData()._week;
- return Ut(this.year(), t.dow, t.doy)
- }, di.isoWeeksInYear = function () {
- return Ut(this.year(), 1, 4)
- }, di.date = ai, di.day = di.days = function (t) {
- if (!this.isValid()) return null != t ? this : NaN;
- var e, i, n = this._isUTC ? this._d.getUTCDay() : this._d.getDay();
- return null != t ? (e = t, i = this.localeData(), t = "string" != typeof e ? e : isNaN(e) ? "number" == typeof(e = i.weekdaysParse(e)) ? e : null : parseInt(e, 10), this.add(t - n, "d")) : n
- }, di.weekday = function (t) {
- if (!this.isValid()) return null != t ? this : NaN;
- var e = (this.day() + 7 - this.localeData()._week.dow) % 7;
- return null == t ? e : this.add(t - e, "d")
- }, di.isoWeekday = function (t) {
- if (!this.isValid()) return null != t ? this : NaN;
- if (null != t) {
- var e = (i = t, n = this.localeData(), "string" == typeof i ? n.weekdaysParse(i) % 7 || 7 : isNaN(i) ? null : i);
- return this.day(this.day() % 7 ? e : e - 7)
- }
- return this.day() || 7;
- var i, n
- }, di.dayOfYear = function (t) {
- var e = Math.round((this.clone().startOf("day") - this.clone().startOf("year")) / 864e5) + 1;
- return null == t ? e : this.add(t - e, "d")
- }, di.hour = di.hours = ne, di.minute = di.minutes = ri, di.second = di.seconds = si, di.millisecond = di.milliseconds = ui, di.utcOffset = function (t, e, i) {
- var n, r = this._offset || 0;
- if (!this.isValid()) return null != t ? this : NaN;
- if (null != t) {
- if ("string" == typeof t) {
- if (null === (t = ze(st, t))) return this
- } else Math.abs(t) < 16 && !i && (t *= 60);
- return !this._isUTC && e && (n = Ve(this)), this._offset = t, this._isUTC = !0, null != n && this.add(n, "m"), r !== t && (!e || this._changeInProgress ? Xe(this, Ue(t - r, "m"), 1, !1) : this._changeInProgress || (this._changeInProgress = !0, a.updateOffset(this, !0), this._changeInProgress = null)), this
- }
- return this._isUTC ? r : Ve(this)
- }, di.utc = function (t) {
- return this.utcOffset(0, t)
- }, di.local = function (t) {
- return this._isUTC && (this.utcOffset(0, t), this._isUTC = !1, t && this.subtract(Ve(this), "m")), this
- }, di.parseZone = function () {
- if (null != this._tzm) this.utcOffset(this._tzm, !1, !0); else if ("string" == typeof this._i) {
- var t = ze(ot, this._i);
- null != t ? this.utcOffset(t) : this.utcOffset(0, !0)
- }
- return this
- }, di.hasAlignedHourOffset = function (t) {
- return !!this.isValid() && (t = t ? Te(t).utcOffset() : 0, (this.utcOffset() - t) % 60 == 0)
- }, di.isDST = function () {
- return this.utcOffset() > this.clone().month(0).utcOffset() || this.utcOffset() > this.clone().month(5).utcOffset()
- }, di.isLocal = function () {
- return !!this.isValid() && !this._isUTC
- }, di.isUtcOffset = function () {
- return !!this.isValid() && this._isUTC
- }, di.isUtc = Be, di.isUTC = Be, di.zoneAbbr = function () {
- return this._isUTC ? "UTC" : ""
- }, di.zoneName = function () {
- return this._isUTC ? "Coordinated Universal Time" : ""
- }, di.dates = D("dates accessor is deprecated. Use date instead.", ai), di.months = D("months accessor is deprecated. Use month instead", Yt), di.years = D("years accessor is deprecated. Use year instead", Pt), di.zone = D("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/", function (t, e) {
- return null != t ? ("string" != typeof t && (t = -t), this.utcOffset(t, e), this) : -this.utcOffset()
- }), di.isDSTShifted = D("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information", function () {
- if (!s(this._isDSTShifted)) return this._isDSTShifted;
- var t = {};
- if (y(t, this), (t = Ce(t))._a) {
- var e = t._isUTC ? f(t._a) : Te(t._a);
- this._isDSTShifted = this.isValid() && M(t._a, e.toArray()) > 0
- } else this._isDSTShifted = !1;
- return this._isDSTShifted
- });
- var ci = A.prototype;
+ function getRgba(string) {
+ if (!string) {
+ return;
+ }
+ var abbr = /^#([a-fA-F0-9]{3,4})$/i,
+ hex = /^#([a-fA-F0-9]{6}([a-fA-F0-9]{2})?)$/i,
+ rgba = /^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i,
+ per = /^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i,
+ keyword = /(\w+)/;
- function fi(t, e, i, n) {
- var a = he(), r = f().set(n, e);
- return a[i](r, t)
- }
+ var rgb = [0, 0, 0],
+ a = 1,
+ match = string.match(abbr),
+ hexAlpha = "";
+ if (match) {
+ match = match[1];
+ hexAlpha = match[3];
+ for (var i = 0; i < rgb.length; i++) {
+ rgb[i] = parseInt(match[i] + match[i], 16);
+ }
+ if (hexAlpha) {
+ a = Math.round((parseInt(hexAlpha + hexAlpha, 16) / 255) * 100) / 100;
+ }
+ } else if (match = string.match(hex)) {
+ hexAlpha = match[2];
+ match = match[1];
+ for (var i = 0; i < rgb.length; i++) {
+ rgb[i] = parseInt(match.slice(i * 2, i * 2 + 2), 16);
+ }
+ if (hexAlpha) {
+ a = Math.round((parseInt(hexAlpha, 16) / 255) * 100) / 100;
+ }
+ } else if (match = string.match(rgba)) {
+ for (var i = 0; i < rgb.length; i++) {
+ rgb[i] = parseInt(match[i + 1]);
+ }
+ a = parseFloat(match[4]);
+ } else if (match = string.match(per)) {
+ for (var i = 0; i < rgb.length; i++) {
+ rgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55);
+ }
+ a = parseFloat(match[4]);
+ } else if (match = string.match(keyword)) {
+ if (match[1] == "transparent") {
+ return [0, 0, 0, 0];
+ }
+ rgb = colorName[match[1]];
+ if (!rgb) {
+ return;
+ }
+ }
- function gi(t, e, i) {
- if (l(t) && (e = t, t = void 0), t = t || "", null != e) return fi(t, e, i, "month");
- var n, a = [];
- for (n = 0; n < 12; n++) a[n] = fi(t, n, i, "month");
- return a
- }
+ for (var i = 0; i < rgb.length; i++) {
+ rgb[i] = scale(rgb[i], 0, 255);
+ }
+ if (!a && a != 0) {
+ a = 1;
+ } else {
+ a = scale(a, 0, 1);
+ }
+ rgb[3] = a;
+ return rgb;
+ }
- function mi(t, e, i, n) {
- "boolean" == typeof t ? (l(e) && (i = e, e = void 0), e = e || "") : (i = e = t, t = !1, l(e) && (i = e, e = void 0), e = e || "");
- var a, r = he(), o = t ? r._week.dow : 0;
- if (null != i) return fi(e, (i + o) % 7, n, "day");
- var s = [];
- for (a = 0; a < 7; a++) s[a] = fi(e, (a + o) % 7, n, "day");
- return s
- }
+ function getHsla(string) {
+ if (!string) {
+ return;
+ }
+ var hsl = /^hsla?\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/;
+ var match = string.match(hsl);
+ if (match) {
+ var alpha = parseFloat(match[4]);
+ var h = scale(parseInt(match[1]), 0, 360),
+ s = scale(parseFloat(match[2]), 0, 100),
+ l = scale(parseFloat(match[3]), 0, 100),
+ a = scale(isNaN(alpha) ? 1 : alpha, 0, 1);
+ return [h, s, l, a];
+ }
+ }
- ci.calendar = function (t, e, i) {
- var n = this._calendar[t] || this._calendar.sameElse;
- return O(n) ? n.call(e, i) : n
- }, ci.longDateFormat = function (t) {
- var e = this._longDateFormat[t], i = this._longDateFormat[t.toUpperCase()];
- return e || !i ? e : (this._longDateFormat[t] = i.replace(/MMMM|MM|DD|dddd/g, function (t) {
- return t.slice(1)
- }), this._longDateFormat[t])
- }, ci.invalidDate = function () {
- return this._invalidDate
- }, ci.ordinal = function (t) {
- return this._ordinal.replace("%d", t)
- }, ci.preparse = hi, ci.postformat = hi, ci.relativeTime = function (t, e, i, n) {
- var a = this._relativeTime[i];
- return O(a) ? a(t, e, i, n) : a.replace(/%d/i, t)
- }, ci.pastFuture = function (t, e) {
- var i = this._relativeTime[t > 0 ? "future" : "past"];
- return O(i) ? i(e) : i.replace(/%s/i, e)
- }, ci.set = function (t) {
- var e, i;
- for (i in t) O(e = t[i]) ? this[i] = e : this["_" + i] = e;
- this._config = t, this._dayOfMonthOrdinalParseLenient = new RegExp((this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) + "|" + /\d{1,2}/.source)
- }, ci.months = function (t, e) {
- return t ? r(this._months) ? this._months[t.month()] : this._months[(this._months.isFormat || Ft).test(e) ? "format" : "standalone"][t.month()] : r(this._months) ? this._months : this._months.standalone
- }, ci.monthsShort = function (t, e) {
- return t ? r(this._monthsShort) ? this._monthsShort[t.month()] : this._monthsShort[Ft.test(e) ? "format" : "standalone"][t.month()] : r(this._monthsShort) ? this._monthsShort : this._monthsShort.standalone
- }, ci.monthsParse = function (t, e, i) {
- var n, a, r;
- if (this._monthsParseExact) return function (t, e, i) {
- var n, a, r, o = t.toLocaleLowerCase();
- if (!this._monthsParse) for (this._monthsParse = [], this._longMonthsParse = [], this._shortMonthsParse = [], n = 0; n < 12; ++n) r = f([2e3, n]), this._shortMonthsParse[n] = this.monthsShort(r, "").toLocaleLowerCase(), this._longMonthsParse[n] = this.months(r, "").toLocaleLowerCase();
- return i ? "MMM" === e ? -1 !== (a = Ct.call(this._shortMonthsParse, o)) ? a : null : -1 !== (a = Ct.call(this._longMonthsParse, o)) ? a : null : "MMM" === e ? -1 !== (a = Ct.call(this._shortMonthsParse, o)) ? a : -1 !== (a = Ct.call(this._longMonthsParse, o)) ? a : null : -1 !== (a = Ct.call(this._longMonthsParse, o)) ? a : -1 !== (a = Ct.call(this._shortMonthsParse, o)) ? a : null
- }.call(this, t, e, i);
- for (this._monthsParse || (this._monthsParse = [], this._longMonthsParse = [], this._shortMonthsParse = []), n = 0; n < 12; n++) {
- if (a = f([2e3, n]), i && !this._longMonthsParse[n] && (this._longMonthsParse[n] = new RegExp("^" + this.months(a, "").replace(".", "") + "$", "i"), this._shortMonthsParse[n] = new RegExp("^" + this.monthsShort(a, "").replace(".", "") + "$", "i")), i || this._monthsParse[n] || (r = "^" + this.months(a, "") + "|^" + this.monthsShort(a, ""), this._monthsParse[n] = new RegExp(r.replace(".", ""), "i")), i && "MMMM" === e && this._longMonthsParse[n].test(t)) return n;
- if (i && "MMM" === e && this._shortMonthsParse[n].test(t)) return n;
- if (!i && this._monthsParse[n].test(t)) return n
- }
- }, ci.monthsRegex = function (t) {
- return this._monthsParseExact ? (h(this, "_monthsRegex") || Ht.call(this), t ? this._monthsStrictRegex : this._monthsRegex) : (h(this, "_monthsRegex") || (this._monthsRegex = zt), this._monthsStrictRegex && t ? this._monthsStrictRegex : this._monthsRegex)
- }, ci.monthsShortRegex = function (t) {
- return this._monthsParseExact ? (h(this, "_monthsRegex") || Ht.call(this), t ? this._monthsShortStrictRegex : this._monthsShortRegex) : (h(this, "_monthsShortRegex") || (this._monthsShortRegex = Nt), this._monthsShortStrictRegex && t ? this._monthsShortStrictRegex : this._monthsShortRegex)
- }, ci.week = function (t) {
- return jt(t, this._week.dow, this._week.doy).week
- }, ci.firstDayOfYear = function () {
- return this._week.doy
- }, ci.firstDayOfWeek = function () {
- return this._week.dow
- }, ci.weekdays = function (t, e) {
- return t ? r(this._weekdays) ? this._weekdays[t.day()] : this._weekdays[this._weekdays.isFormat.test(e) ? "format" : "standalone"][t.day()] : r(this._weekdays) ? this._weekdays : this._weekdays.standalone
- }, ci.weekdaysMin = function (t) {
- return t ? this._weekdaysMin[t.day()] : this._weekdaysMin
- }, ci.weekdaysShort = function (t) {
- return t ? this._weekdaysShort[t.day()] : this._weekdaysShort
- }, ci.weekdaysParse = function (t, e, i) {
- var n, a, r;
- if (this._weekdaysParseExact) return function (t, e, i) {
- var n, a, r, o = t.toLocaleLowerCase();
- if (!this._weekdaysParse) for (this._weekdaysParse = [], this._shortWeekdaysParse = [], this._minWeekdaysParse = [], n = 0; n < 7; ++n) r = f([2e3, 1]).day(n), this._minWeekdaysParse[n] = this.weekdaysMin(r, "").toLocaleLowerCase(), this._shortWeekdaysParse[n] = this.weekdaysShort(r, "").toLocaleLowerCase(), this._weekdaysParse[n] = this.weekdays(r, "").toLocaleLowerCase();
- return i ? "dddd" === e ? -1 !== (a = Ct.call(this._weekdaysParse, o)) ? a : null : "ddd" === e ? -1 !== (a = Ct.call(this._shortWeekdaysParse, o)) ? a : null : -1 !== (a = Ct.call(this._minWeekdaysParse, o)) ? a : null : "dddd" === e ? -1 !== (a = Ct.call(this._weekdaysParse, o)) ? a : -1 !== (a = Ct.call(this._shortWeekdaysParse, o)) ? a : -1 !== (a = Ct.call(this._minWeekdaysParse, o)) ? a : null : "ddd" === e ? -1 !== (a = Ct.call(this._shortWeekdaysParse, o)) ? a : -1 !== (a = Ct.call(this._weekdaysParse, o)) ? a : -1 !== (a = Ct.call(this._minWeekdaysParse, o)) ? a : null : -1 !== (a = Ct.call(this._minWeekdaysParse, o)) ? a : -1 !== (a = Ct.call(this._weekdaysParse, o)) ? a : -1 !== (a = Ct.call(this._shortWeekdaysParse, o)) ? a : null
- }.call(this, t, e, i);
- for (this._weekdaysParse || (this._weekdaysParse = [], this._minWeekdaysParse = [], this._shortWeekdaysParse = [], this._fullWeekdaysParse = []), n = 0; n < 7; n++) {
- if (a = f([2e3, 1]).day(n), i && !this._fullWeekdaysParse[n] && (this._fullWeekdaysParse[n] = new RegExp("^" + this.weekdays(a, "").replace(".", ".?") + "$", "i"), this._shortWeekdaysParse[n] = new RegExp("^" + this.weekdaysShort(a, "").replace(".", ".?") + "$", "i"), this._minWeekdaysParse[n] = new RegExp("^" + this.weekdaysMin(a, "").replace(".", ".?") + "$", "i")), this._weekdaysParse[n] || (r = "^" + this.weekdays(a, "") + "|^" + this.weekdaysShort(a, "") + "|^" + this.weekdaysMin(a, ""), this._weekdaysParse[n] = new RegExp(r.replace(".", ""), "i")), i && "dddd" === e && this._fullWeekdaysParse[n].test(t)) return n;
- if (i && "ddd" === e && this._shortWeekdaysParse[n].test(t)) return n;
- if (i && "dd" === e && this._minWeekdaysParse[n].test(t)) return n;
- if (!i && this._weekdaysParse[n].test(t)) return n
- }
- }, ci.weekdaysRegex = function (t) {
- return this._weekdaysParseExact ? (h(this, "_weekdaysRegex") || $t.call(this), t ? this._weekdaysStrictRegex : this._weekdaysRegex) : (h(this, "_weekdaysRegex") || (this._weekdaysRegex = Xt), this._weekdaysStrictRegex && t ? this._weekdaysStrictRegex : this._weekdaysRegex)
- }, ci.weekdaysShortRegex = function (t) {
- return this._weekdaysParseExact ? (h(this, "_weekdaysRegex") || $t.call(this), t ? this._weekdaysShortStrictRegex : this._weekdaysShortRegex) : (h(this, "_weekdaysShortRegex") || (this._weekdaysShortRegex = Jt), this._weekdaysShortStrictRegex && t ? this._weekdaysShortStrictRegex : this._weekdaysShortRegex)
- }, ci.weekdaysMinRegex = function (t) {
- return this._weekdaysParseExact ? (h(this, "_weekdaysRegex") || $t.call(this), t ? this._weekdaysMinStrictRegex : this._weekdaysMinRegex) : (h(this, "_weekdaysMinRegex") || (this._weekdaysMinRegex = Kt), this._weekdaysMinStrictRegex && t ? this._weekdaysMinStrictRegex : this._weekdaysMinRegex)
- }, ci.isPM = function (t) {
- return "p" === (t + "").toLowerCase().charAt(0)
- }, ci.meridiem = function (t, e, i) {
- return t > 11 ? i ? "pm" : "PM" : i ? "am" : "AM"
- }, ue("en", {
- dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/, ordinal: function (t) {
- var e = t % 10;
- return t + (1 === w(t % 100 / 10) ? "th" : 1 === e ? "st" : 2 === e ? "nd" : 3 === e ? "rd" : "th")
- }
- }), a.lang = D("moment.lang is deprecated. Use moment.locale instead.", ue), a.langData = D("moment.langData is deprecated. Use moment.localeData instead.", he);
- var pi = Math.abs;
-
- function vi(t, e, i, n) {
- var a = Ue(e, i);
- return t._milliseconds += n * a._milliseconds, t._days += n * a._days, t._months += n * a._months, t._bubble()
- }
+ function getHwb(string) {
+ if (!string) {
+ return;
+ }
+ var hwb = /^hwb\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/;
+ var match = string.match(hwb);
+ if (match) {
+ var alpha = parseFloat(match[4]);
+ var h = scale(parseInt(match[1]), 0, 360),
+ w = scale(parseFloat(match[2]), 0, 100),
+ b = scale(parseFloat(match[3]), 0, 100),
+ a = scale(isNaN(alpha) ? 1 : alpha, 0, 1);
+ return [h, w, b, a];
+ }
+ }
- function yi(t) {
- return t < 0 ? Math.floor(t) : Math.ceil(t)
- }
+ function getRgb(string) {
+ var rgba = getRgba(string);
+ return rgba && rgba.slice(0, 3);
+ }
- function bi(t) {
- return 4800 * t / 146097
- }
+ function getHsl(string) {
+ var hsla = getHsla(string);
+ return hsla && hsla.slice(0, 3);
+ }
- function xi(t) {
- return 146097 * t / 4800
- }
+ function getAlpha(string) {
+ var vals = getRgba(string);
+ if (vals) {
+ return vals[3];
+ } else if (vals = getHsla(string)) {
+ return vals[3];
+ } else if (vals = getHwb(string)) {
+ return vals[3];
+ }
+ }
- function _i(t) {
- return function () {
- return this.as(t)
- }
- }
+// generators
+ function hexString(rgba, a) {
+ var a = (a !== undefined && rgba.length === 3) ? a : rgba[3];
+ return "#" + hexDouble(rgba[0])
+ + hexDouble(rgba[1])
+ + hexDouble(rgba[2])
+ + (
+ (a >= 0 && a < 1)
+ ? hexDouble(Math.round(a * 255))
+ : ""
+ );
+ }
- var ki = _i("ms"), wi = _i("s"), Mi = _i("m"), Si = _i("h"), Di = _i("d"), Ci = _i("w"), Pi = _i("M"),
- Ti = _i("y");
+ function rgbString(rgba, alpha) {
+ if (alpha < 1 || (rgba[3] && rgba[3] < 1)) {
+ return rgbaString(rgba, alpha);
+ }
+ return "rgb(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2] + ")";
+ }
- function Oi(t) {
- return function () {
- return this.isValid() ? this._data[t] : NaN
- }
- }
+ function rgbaString(rgba, alpha) {
+ if (alpha === undefined) {
+ alpha = (rgba[3] !== undefined ? rgba[3] : 1);
+ }
+ return "rgba(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2]
+ + ", " + alpha + ")";
+ }
- var Ii = Oi("milliseconds"), Ai = Oi("seconds"), Fi = Oi("minutes"), Ri = Oi("hours"), Li = Oi("days"),
- Wi = Oi("months"), Yi = Oi("years");
- var Ni = Math.round, zi = {ss: 44, s: 45, m: 45, h: 22, d: 26, M: 11};
- var Hi = Math.abs;
+ function percentString(rgba, alpha) {
+ if (alpha < 1 || (rgba[3] && rgba[3] < 1)) {
+ return percentaString(rgba, alpha);
+ }
+ var r = Math.round(rgba[0] / 255 * 100),
+ g = Math.round(rgba[1] / 255 * 100),
+ b = Math.round(rgba[2] / 255 * 100);
- function Vi(t) {
- return (t > 0) - (t < 0) || +t
- }
+ return "rgb(" + r + "%, " + g + "%, " + b + "%)";
+ }
- function Bi() {
- if (!this.isValid()) return this.localeData().invalidDate();
- var t, e, i = Hi(this._milliseconds) / 1e3, n = Hi(this._days), a = Hi(this._months);
- e = k((t = k(i / 60)) / 60), i %= 60, t %= 60;
- var r = k(a / 12), o = a %= 12, s = n, l = e, u = t,
- d = i ? i.toFixed(3).replace(/\.?0+$/, "") : "", h = this.asSeconds();
- if (!h) return "P0D";
- var c = h < 0 ? "-" : "", f = Vi(this._months) !== Vi(h) ? "-" : "",
- g = Vi(this._days) !== Vi(h) ? "-" : "", m = Vi(this._milliseconds) !== Vi(h) ? "-" : "";
- return c + "P" + (r ? f + r + "Y" : "") + (o ? f + o + "M" : "") + (s ? g + s + "D" : "") + (l || u || d ? "T" : "") + (l ? m + l + "H" : "") + (u ? m + u + "M" : "") + (d ? m + d + "S" : "")
- }
+ function percentaString(rgba, alpha) {
+ var r = Math.round(rgba[0] / 255 * 100),
+ g = Math.round(rgba[1] / 255 * 100),
+ b = Math.round(rgba[2] / 255 * 100);
+ return "rgba(" + r + "%, " + g + "%, " + b + "%, " + (alpha || rgba[3] || 1) + ")";
+ }
- var Ei = Re.prototype;
- return Ei.isValid = function () {
- return this._isValid
- }, Ei.abs = function () {
- var t = this._data;
- return this._milliseconds = pi(this._milliseconds), this._days = pi(this._days), this._months = pi(this._months), t.milliseconds = pi(t.milliseconds), t.seconds = pi(t.seconds), t.minutes = pi(t.minutes), t.hours = pi(t.hours), t.months = pi(t.months), t.years = pi(t.years), this
- }, Ei.add = function (t, e) {
- return vi(this, t, e, 1)
- }, Ei.subtract = function (t, e) {
- return vi(this, t, e, -1)
- }, Ei.as = function (t) {
- if (!this.isValid()) return NaN;
- var e, i, n = this._milliseconds;
- if ("month" === (t = L(t)) || "year" === t) return e = this._days + n / 864e5, i = this._months + bi(e), "month" === t ? i : i / 12;
- switch (e = this._days + Math.round(xi(this._months)), t) {
- case"week":
- return e / 7 + n / 6048e5;
- case"day":
- return e + n / 864e5;
- case"hour":
- return 24 * e + n / 36e5;
- case"minute":
- return 1440 * e + n / 6e4;
- case"second":
- return 86400 * e + n / 1e3;
- case"millisecond":
- return Math.floor(864e5 * e) + n;
- default:
- throw new Error("Unknown unit " + t)
- }
- }, Ei.asMilliseconds = ki, Ei.asSeconds = wi, Ei.asMinutes = Mi, Ei.asHours = Si, Ei.asDays = Di, Ei.asWeeks = Ci, Ei.asMonths = Pi, Ei.asYears = Ti, Ei.valueOf = function () {
- return this.isValid() ? this._milliseconds + 864e5 * this._days + this._months % 12 * 2592e6 + 31536e6 * w(this._months / 12) : NaN
- }, Ei._bubble = function () {
- var t, e, i, n, a, r = this._milliseconds, o = this._days, s = this._months, l = this._data;
- return r >= 0 && o >= 0 && s >= 0 || r <= 0 && o <= 0 && s <= 0 || (r += 864e5 * yi(xi(s) + o), o = 0, s = 0), l.milliseconds = r % 1e3, t = k(r / 1e3), l.seconds = t % 60, e = k(t / 60), l.minutes = e % 60, i = k(e / 60), l.hours = i % 24, s += a = k(bi(o += k(i / 24))), o -= yi(xi(a)), n = k(s / 12), s %= 12, l.days = o, l.months = s, l.years = n, this
- }, Ei.clone = function () {
- return Ue(this)
- }, Ei.get = function (t) {
- return t = L(t), this.isValid() ? this[t + "s"]() : NaN
- }, Ei.milliseconds = Ii, Ei.seconds = Ai, Ei.minutes = Fi, Ei.hours = Ri, Ei.days = Li, Ei.weeks = function () {
- return k(this.days() / 7)
- }, Ei.months = Wi, Ei.years = Yi, Ei.humanize = function (t) {
- if (!this.isValid()) return this.localeData().invalidDate();
- var e, i, n, a, r, o, s, l, u, d, h, c = this.localeData(),
- f = (i = !t, n = c, a = Ue(e = this).abs(), r = Ni(a.as("s")), o = Ni(a.as("m")), s = Ni(a.as("h")), l = Ni(a.as("d")), u = Ni(a.as("M")), d = Ni(a.as("y")), (h = r <= zi.ss && ["s", r] || r < zi.s && ["ss", r] || o <= 1 && ["m"] || o < zi.m && ["mm", o] || s <= 1 && ["h"] || s < zi.h && ["hh", s] || l <= 1 && ["d"] || l < zi.d && ["dd", l] || u <= 1 && ["M"] || u < zi.M && ["MM", u] || d <= 1 && ["y"] || ["yy", d])[2] = i, h[3] = +e > 0, h[4] = n, function (t, e, i, n, a) {
- return a.relativeTime(e || 1, !!i, t, n)
- }.apply(null, h));
- return t && (f = c.pastFuture(+this, f)), c.postformat(f)
- }, Ei.toISOString = Bi, Ei.toString = Bi, Ei.toJSON = Bi, Ei.locale = Qe, Ei.localeData = ei, Ei.toIsoString = D("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)", Bi), Ei.lang = ti, j("X", 0, 0, "unix"), j("x", 0, 0, "valueOf"), dt("x", rt), dt("X", /[+-]?\d+(\.\d{1,3})?/), gt("X", function (t, e, i) {
- i._d = new Date(1e3 * parseFloat(t, 10))
- }), gt("x", function (t, e, i) {
- i._d = new Date(w(t))
- }), a.version = "2.20.1", i = Te, a.fn = di, a.min = function () {
- return Ae("isBefore", [].slice.call(arguments, 0))
- }, a.max = function () {
- return Ae("isAfter", [].slice.call(arguments, 0))
- }, a.now = function () {
- return Date.now ? Date.now() : +new Date
- }, a.utc = f, a.unix = function (t) {
- return Te(1e3 * t)
- }, a.months = function (t, e) {
- return gi(t, e, "months")
- }, a.isDate = u, a.locale = ue, a.invalid = p, a.duration = Ue, a.isMoment = _, a.weekdays = function (t, e, i) {
- return mi(t, e, i, "weekdays")
- }, a.parseZone = function () {
- return Te.apply(null, arguments).parseZone()
- }, a.localeData = he, a.isDuration = Le, a.monthsShort = function (t, e) {
- return gi(t, e, "monthsShort")
- }, a.weekdaysMin = function (t, e, i) {
- return mi(t, e, i, "weekdaysMin")
- }, a.defineLocale = de, a.updateLocale = function (t, e) {
- if (null != e) {
- var i, n, a = ae;
- null != (n = le(t)) && (a = n._config), (i = new A(e = I(a, e))).parentLocale = re[t], re[t] = i, ue(t)
- } else null != re[t] && (null != re[t].parentLocale ? re[t] = re[t].parentLocale : null != re[t] && delete re[t]);
- return re[t]
- }, a.locales = function () {
- return C(re)
- }, a.weekdaysShort = function (t, e, i) {
- return mi(t, e, i, "weekdaysShort")
- }, a.normalizeUnits = L, a.relativeTimeRounding = function (t) {
- return void 0 === t ? Ni : "function" == typeof t && (Ni = t, !0)
- }, a.relativeTimeThreshold = function (t, e) {
- return void 0 !== zi[t] && (void 0 === e ? zi[t] : (zi[t] = e, "s" === t && (zi.ss = e - 1), !0))
- }, a.calendarFormat = function (t, e) {
- var i = t.diff(e, "days", !0);
- return i < -6 ? "sameElse" : i < -1 ? "lastWeek" : i < 0 ? "lastDay" : i < 1 ? "sameDay" : i < 2 ? "nextDay" : i < 7 ? "nextWeek" : "sameElse"
- }, a.prototype = di, a.HTML5_FMT = {
- DATETIME_LOCAL: "YYYY-MM-DDTHH:mm",
- DATETIME_LOCAL_SECONDS: "YYYY-MM-DDTHH:mm:ss",
- DATETIME_LOCAL_MS: "YYYY-MM-DDTHH:mm:ss.SSS",
- DATE: "YYYY-MM-DD",
- TIME: "HH:mm",
- TIME_SECONDS: "HH:mm:ss",
- TIME_MS: "HH:mm:ss.SSS",
- WEEK: "YYYY-[W]WW",
- MONTH: "YYYY-MM"
- }, a
- }, "object" == typeof i && void 0 !== e ? e.exports = a() : n.moment = a()
- }, {}], 7: [function (t, e, i) {
- var n = t(29)();
- n.helpers = t(45), t(27)(n), n.defaults = t(25), n.Element = t(26), n.elements = t(40), n.Interaction = t(28), n.layouts = t(30), n.platform = t(48), n.plugins = t(31), n.Ticks = t(34), t(22)(n), t(23)(n), t(24)(n), t(33)(n), t(32)(n), t(35)(n), t(55)(n), t(53)(n), t(54)(n), t(56)(n), t(57)(n), t(58)(n), t(15)(n), t(16)(n), t(17)(n), t(18)(n), t(19)(n), t(20)(n), t(21)(n), t(8)(n), t(9)(n), t(10)(n), t(11)(n), t(12)(n), t(13)(n), t(14)(n);
- var a = t(49);
- for (var r in a) a.hasOwnProperty(r) && n.plugins.register(a[r]);
- n.platform.initialize(), e.exports = n, "undefined" != typeof window && (window.Chart = n), n.Legend = a.legend._element, n.Title = a.title._element, n.pluginService = n.plugins, n.PluginBase = n.Element.extend({}), n.canvasHelpers = n.helpers.canvas, n.layoutService = n.layouts
- }, {
- 10: 10,
- 11: 11,
- 12: 12,
- 13: 13,
- 14: 14,
- 15: 15,
- 16: 16,
- 17: 17,
- 18: 18,
- 19: 19,
- 20: 20,
- 21: 21,
- 22: 22,
- 23: 23,
- 24: 24,
- 25: 25,
- 26: 26,
- 27: 27,
- 28: 28,
- 29: 29,
- 30: 30,
- 31: 31,
- 32: 32,
- 33: 33,
- 34: 34,
- 35: 35,
- 40: 40,
- 45: 45,
- 48: 48,
- 49: 49,
- 53: 53,
- 54: 54,
- 55: 55,
- 56: 56,
- 57: 57,
- 58: 58,
- 8: 8,
- 9: 9
- }], 8: [function (t, e, i) {
- "use strict";
- e.exports = function (t) {
- t.Bar = function (e, i) {
- return i.type = "bar", new t(e, i)
- }
- }
- }, {}], 9: [function (t, e, i) {
- "use strict";
- e.exports = function (t) {
- t.Bubble = function (e, i) {
- return i.type = "bubble", new t(e, i)
- }
- }
- }, {}], 10: [function (t, e, i) {
- "use strict";
- e.exports = function (t) {
- t.Doughnut = function (e, i) {
- return i.type = "doughnut", new t(e, i)
- }
- }
- }, {}], 11: [function (t, e, i) {
- "use strict";
- e.exports = function (t) {
- t.Line = function (e, i) {
- return i.type = "line", new t(e, i)
- }
- }
- }, {}], 12: [function (t, e, i) {
- "use strict";
- e.exports = function (t) {
- t.PolarArea = function (e, i) {
- return i.type = "polarArea", new t(e, i)
- }
- }
- }, {}], 13: [function (t, e, i) {
- "use strict";
- e.exports = function (t) {
- t.Radar = function (e, i) {
- return i.type = "radar", new t(e, i)
- }
- }
- }, {}], 14: [function (t, e, i) {
- "use strict";
- e.exports = function (t) {
- t.Scatter = function (e, i) {
- return i.type = "scatter", new t(e, i)
- }
- }
- }, {}], 15: [function (t, e, i) {
- "use strict";
- var n = t(25), a = t(40), r = t(45);
- n._set("bar", {
- hover: {mode: "label"},
- scales: {
- xAxes: [{
- type: "category",
- categoryPercentage: .8,
- barPercentage: .9,
- offset: !0,
- gridLines: {offsetGridLines: !0}
- }], yAxes: [{type: "linear"}]
- }
- }), n._set("horizontalBar", {
- hover: {mode: "index", axis: "y"},
- scales: {
- xAxes: [{type: "linear", position: "bottom"}],
- yAxes: [{
- position: "left",
- type: "category",
- categoryPercentage: .8,
- barPercentage: .9,
- offset: !0,
- gridLines: {offsetGridLines: !0}
- }]
- },
- elements: {rectangle: {borderSkipped: "left"}},
- tooltips: {
- callbacks: {
- title: function (t, e) {
- var i = "";
- return t.length > 0 && (t[0].yLabel ? i = t[0].yLabel : e.labels.length > 0 && t[0].index < e.labels.length && (i = e.labels[t[0].index])), i
- }, label: function (t, e) {
- return (e.datasets[t.datasetIndex].label || "") + ": " + t.xLabel
- }
- }, mode: "index", axis: "y"
- }
- }), e.exports = function (t) {
- t.controllers.bar = t.DatasetController.extend({
- dataElementType: a.Rectangle, initialize: function () {
- var e;
- t.DatasetController.prototype.initialize.apply(this, arguments), (e = this.getMeta()).stack = this.getDataset().stack, e.bar = !0
- }, update: function (t) {
- var e, i, n = this.getMeta().data;
- for (this._ruler = this.getRuler(), e = 0, i = n.length; e < i; ++e) this.updateElement(n[e], e, t)
- }, updateElement: function (t, e, i) {
- var n = this, a = n.chart, o = n.getMeta(), s = n.getDataset(), l = t.custom || {},
- u = a.options.elements.rectangle;
- t._xScale = n.getScaleForId(o.xAxisID), t._yScale = n.getScaleForId(o.yAxisID), t._datasetIndex = n.index, t._index = e, t._model = {
- datasetLabel: s.label,
- label: a.data.labels[e],
- borderSkipped: l.borderSkipped ? l.borderSkipped : u.borderSkipped,
- backgroundColor: l.backgroundColor ? l.backgroundColor : r.valueAtIndexOrDefault(s.backgroundColor, e, u.backgroundColor),
- borderColor: l.borderColor ? l.borderColor : r.valueAtIndexOrDefault(s.borderColor, e, u.borderColor),
- borderWidth: l.borderWidth ? l.borderWidth : r.valueAtIndexOrDefault(s.borderWidth, e, u.borderWidth)
- }, n.updateElementGeometry(t, e, i), t.pivot()
- }, updateElementGeometry: function (t, e, i) {
- var n = this, a = t._model, r = n.getValueScale(), o = r.getBasePixel(), s = r.isHorizontal(),
- l = n._ruler || n.getRuler(), u = n.calculateBarValuePixels(n.index, e),
- d = n.calculateBarIndexPixels(n.index, e, l);
- a.horizontal = s, a.base = i ? o : u.base, a.x = s ? i ? o : u.head : d.center, a.y = s ? d.center : i ? o : u.head, a.height = s ? d.size : void 0, a.width = s ? void 0 : d.size
- }, getValueScaleId: function () {
- return this.getMeta().yAxisID
- }, getIndexScaleId: function () {
- return this.getMeta().xAxisID
- }, getValueScale: function () {
- return this.getScaleForId(this.getValueScaleId())
- }, getIndexScale: function () {
- return this.getScaleForId(this.getIndexScaleId())
- }, _getStacks: function (t) {
- var e, i, n = this.chart, a = this.getIndexScale().options.stacked,
- r = void 0 === t ? n.data.datasets.length : t + 1, o = [];
- for (e = 0; e < r; ++e) (i = n.getDatasetMeta(e)).bar && n.isDatasetVisible(e) && (!1 === a || !0 === a && -1 === o.indexOf(i.stack) || void 0 === a && (void 0 === i.stack || -1 === o.indexOf(i.stack))) && o.push(i.stack);
- return o
- }, getStackCount: function () {
- return this._getStacks().length
- }, getStackIndex: function (t, e) {
- var i = this._getStacks(t), n = void 0 !== e ? i.indexOf(e) : -1;
- return -1 === n ? i.length - 1 : n
- }, getRuler: function () {
- var t, e, i = this.getIndexScale(), n = this.getStackCount(), a = this.index,
- o = i.isHorizontal(), s = o ? i.left : i.top, l = s + (o ? i.width : i.height), u = [];
- for (t = 0, e = this.getMeta().data.length; t < e; ++t) u.push(i.getPixelForValue(null, t, a));
- return {
- min: r.isNullOrUndef(i.options.barThickness) ? function (t, e) {
- var i, n, a, r, o = t.isHorizontal() ? t.width : t.height, s = t.getTicks();
- for (a = 1, r = e.length; a < r; ++a) o = Math.min(o, e[a] - e[a - 1]);
- for (a = 0, r = s.length; a < r; ++a) n = t.getPixelForTick(a), o = a > 0 ? Math.min(o, n - i) : o, i = n;
- return o
- }(i, u) : -1, pixels: u, start: s, end: l, stackCount: n, scale: i
- }
- }, calculateBarValuePixels: function (t, e) {
- var i, n, a, r, o, s, l = this.chart, u = this.getMeta(), d = this.getValueScale(),
- h = l.data.datasets, c = d.getRightValue(h[t].data[e]), f = d.options.stacked, g = u.stack,
- m = 0;
- if (f || void 0 === f && void 0 !== g) for (i = 0; i < t; ++i) (n = l.getDatasetMeta(i)).bar && n.stack === g && n.controller.getValueScaleId() === d.id && l.isDatasetVisible(i) && (a = d.getRightValue(h[i].data[e]), (c < 0 && a < 0 || c >= 0 && a > 0) && (m += a));
- return r = d.getPixelForValue(m), {
- size: s = ((o = d.getPixelForValue(m + c)) - r) / 2,
- base: r,
- head: o,
- center: o + s / 2
- }
- }, calculateBarIndexPixels: function (t, e, i) {
- var n, a, o, s, l, u, d, h, c, f, g, m, p, v, y, b, x, _ = i.scale.options,
- k = "flex" === _.barThickness ? (c = e, g = _, p = (f = i).pixels, v = p[c], y = c > 0 ? p[c - 1] : null, b = c < p.length - 1 ? p[c + 1] : null, x = g.categoryPercentage, null === y && (y = v - (null === b ? f.end - v : b - v)), null === b && (b = v + v - y), m = v - (v - y) / 2 * x, {
- chunk: (b - y) / 2 * x / f.stackCount,
- ratio: g.barPercentage,
- start: m
- }) : (n = e, a = i, u = (o = _).barThickness, d = a.stackCount, h = a.pixels[n], r.isNullOrUndef(u) ? (s = a.min * o.categoryPercentage, l = o.barPercentage) : (s = u * d, l = 1), {
- chunk: s / d,
- ratio: l,
- start: h - s / 2
- }), w = this.getStackIndex(t, this.getMeta().stack),
- M = k.start + k.chunk * w + k.chunk / 2,
- S = Math.min(r.valueOrDefault(_.maxBarThickness, 1 / 0), k.chunk * k.ratio);
- return {base: M - S / 2, head: M + S / 2, center: M, size: S}
- }, draw: function () {
- var t = this.chart, e = this.getValueScale(), i = this.getMeta().data, n = this.getDataset(),
- a = i.length, o = 0;
- for (r.canvas.clipArea(t.ctx, t.chartArea); o < a; ++o) isNaN(e.getRightValue(n.data[o])) || i[o].draw();
- r.canvas.unclipArea(t.ctx)
- }, setHoverStyle: function (t) {
- var e = this.chart.data.datasets[t._datasetIndex], i = t._index, n = t.custom || {},
- a = t._model;
- a.backgroundColor = n.hoverBackgroundColor ? n.hoverBackgroundColor : r.valueAtIndexOrDefault(e.hoverBackgroundColor, i, r.getHoverColor(a.backgroundColor)), a.borderColor = n.hoverBorderColor ? n.hoverBorderColor : r.valueAtIndexOrDefault(e.hoverBorderColor, i, r.getHoverColor(a.borderColor)), a.borderWidth = n.hoverBorderWidth ? n.hoverBorderWidth : r.valueAtIndexOrDefault(e.hoverBorderWidth, i, a.borderWidth)
- }, removeHoverStyle: function (t) {
- var e = this.chart.data.datasets[t._datasetIndex], i = t._index, n = t.custom || {},
- a = t._model, o = this.chart.options.elements.rectangle;
- a.backgroundColor = n.backgroundColor ? n.backgroundColor : r.valueAtIndexOrDefault(e.backgroundColor, i, o.backgroundColor), a.borderColor = n.borderColor ? n.borderColor : r.valueAtIndexOrDefault(e.borderColor, i, o.borderColor), a.borderWidth = n.borderWidth ? n.borderWidth : r.valueAtIndexOrDefault(e.borderWidth, i, o.borderWidth)
- }
- }), t.controllers.horizontalBar = t.controllers.bar.extend({
- getValueScaleId: function () {
- return this.getMeta().xAxisID
- }, getIndexScaleId: function () {
- return this.getMeta().yAxisID
- }
- })
- }
- }, {25: 25, 40: 40, 45: 45}], 16: [function (t, e, i) {
- "use strict";
- var n = t(25), a = t(40), r = t(45);
- n._set("bubble", {
- hover: {mode: "single"},
- scales: {
- xAxes: [{type: "linear", position: "bottom", id: "x-axis-0"}],
- yAxes: [{type: "linear", position: "left", id: "y-axis-0"}]
- },
- tooltips: {
- callbacks: {
- title: function () {
- return ""
- }, label: function (t, e) {
- var i = e.datasets[t.datasetIndex].label || "",
- n = e.datasets[t.datasetIndex].data[t.index];
- return i + ": (" + t.xLabel + ", " + t.yLabel + ", " + n.r + ")"
- }
- }
- }
- }), e.exports = function (t) {
- t.controllers.bubble = t.DatasetController.extend({
- dataElementType: a.Point, update: function (t) {
- var e = this, i = e.getMeta().data;
- r.each(i, function (i, n) {
- e.updateElement(i, n, t)
- })
- }, updateElement: function (t, e, i) {
- var n = this, a = n.getMeta(), r = t.custom || {}, o = n.getScaleForId(a.xAxisID),
- s = n.getScaleForId(a.yAxisID), l = n._resolveElementOptions(t, e),
- u = n.getDataset().data[e], d = n.index,
- h = i ? o.getPixelForDecimal(.5) : o.getPixelForValue("object" == typeof u ? u : NaN, e, d),
- c = i ? s.getBasePixel() : s.getPixelForValue(u, e, d);
- t._xScale = o, t._yScale = s, t._options = l, t._datasetIndex = d, t._index = e, t._model = {
- backgroundColor: l.backgroundColor,
- borderColor: l.borderColor,
- borderWidth: l.borderWidth,
- hitRadius: l.hitRadius,
- pointStyle: l.pointStyle,
- radius: i ? 0 : l.radius,
- skip: r.skip || isNaN(h) || isNaN(c),
- x: h,
- y: c
- }, t.pivot()
- }, setHoverStyle: function (t) {
- var e = t._model, i = t._options;
- e.backgroundColor = r.valueOrDefault(i.hoverBackgroundColor, r.getHoverColor(i.backgroundColor)), e.borderColor = r.valueOrDefault(i.hoverBorderColor, r.getHoverColor(i.borderColor)), e.borderWidth = r.valueOrDefault(i.hoverBorderWidth, i.borderWidth), e.radius = i.radius + i.hoverRadius
- }, removeHoverStyle: function (t) {
- var e = t._model, i = t._options;
- e.backgroundColor = i.backgroundColor, e.borderColor = i.borderColor, e.borderWidth = i.borderWidth, e.radius = i.radius
- }, _resolveElementOptions: function (t, e) {
- var i, n, a, o = this.chart, s = o.data.datasets[this.index], l = t.custom || {},
- u = o.options.elements.point, d = r.options.resolve, h = s.data[e], c = {},
- f = {chart: o, dataIndex: e, dataset: s, datasetIndex: this.index},
- g = ["backgroundColor", "borderColor", "borderWidth", "hoverBackgroundColor", "hoverBorderColor", "hoverBorderWidth", "hoverRadius", "hitRadius", "pointStyle"];
- for (i = 0, n = g.length; i < n; ++i) c[a = g[i]] = d([l[a], s[a], u[a]], f, e);
- return c.radius = d([l.radius, h ? h.r : void 0, s.radius, u.radius], f, e), c
- }
- })
- }
- }, {25: 25, 40: 40, 45: 45}], 17: [function (t, e, i) {
- "use strict";
- var n = t(25), a = t(40), r = t(45);
- n._set("doughnut", {
- animation: {animateRotate: !0, animateScale: !1},
- hover: {mode: "single"},
- legendCallback: function (t) {
- var e = [];
- e.push('
');
- var i = t.data, n = i.datasets, a = i.labels;
- if (n.length) for (var r = 0; r < n[0].data.length; ++r) e.push('
'), a[r] && e.push(a[r]), e.push("
");
- return e.push("
"), e.join("")
- },
- legend: {
- labels: {
- generateLabels: function (t) {
- var e = t.data;
- return e.labels.length && e.datasets.length ? e.labels.map(function (i, n) {
- var a = t.getDatasetMeta(0), o = e.datasets[0], s = a.data[n], l = s && s.custom || {},
- u = r.valueAtIndexOrDefault, d = t.options.elements.arc;
- return {
- text: i,
- fillStyle: l.backgroundColor ? l.backgroundColor : u(o.backgroundColor, n, d.backgroundColor),
- strokeStyle: l.borderColor ? l.borderColor : u(o.borderColor, n, d.borderColor),
- lineWidth: l.borderWidth ? l.borderWidth : u(o.borderWidth, n, d.borderWidth),
- hidden: isNaN(o.data[n]) || a.data[n].hidden,
- index: n
- }
- }) : []
- }
- }, onClick: function (t, e) {
- var i, n, a, r = e.index, o = this.chart;
- for (i = 0, n = (o.data.datasets || []).length; i < n; ++i) (a = o.getDatasetMeta(i)).data[r] && (a.data[r].hidden = !a.data[r].hidden);
- o.update()
- }
- },
- cutoutPercentage: 50,
- rotation: -.5 * Math.PI,
- circumference: 2 * Math.PI,
- tooltips: {
- callbacks: {
- title: function () {
- return ""
- }, label: function (t, e) {
- var i = e.labels[t.index], n = ": " + e.datasets[t.datasetIndex].data[t.index];
- return r.isArray(i) ? (i = i.slice())[0] += n : i += n, i
- }
- }
- }
- }), n._set("pie", r.clone(n.doughnut)), n._set("pie", {cutoutPercentage: 0}), e.exports = function (t) {
- t.controllers.doughnut = t.controllers.pie = t.DatasetController.extend({
- dataElementType: a.Arc,
- linkScales: r.noop,
- getRingIndex: function (t) {
- for (var e = 0, i = 0; i < t; ++i) this.chart.isDatasetVisible(i) && ++e;
- return e
- },
- update: function (t) {
- var e = this, i = e.chart, n = i.chartArea, a = i.options, o = a.elements.arc,
- s = n.right - n.left - o.borderWidth, l = n.bottom - n.top - o.borderWidth,
- u = Math.min(s, l), d = {x: 0, y: 0}, h = e.getMeta(), c = a.cutoutPercentage,
- f = a.circumference;
- if (f < 2 * Math.PI) {
- var g = a.rotation % (2 * Math.PI),
- m = (g += 2 * Math.PI * (g >= Math.PI ? -1 : g < -Math.PI ? 1 : 0)) + f,
- p = Math.cos(g), v = Math.sin(g), y = Math.cos(m), b = Math.sin(m),
- x = g <= 0 && m >= 0 || g <= 2 * Math.PI && 2 * Math.PI <= m,
- _ = g <= .5 * Math.PI && .5 * Math.PI <= m || g <= 2.5 * Math.PI && 2.5 * Math.PI <= m,
- k = g <= -Math.PI && -Math.PI <= m || g <= Math.PI && Math.PI <= m,
- w = g <= .5 * -Math.PI && .5 * -Math.PI <= m || g <= 1.5 * Math.PI && 1.5 * Math.PI <= m,
- M = c / 100, S = k ? -1 : Math.min(p * (p < 0 ? 1 : M), y * (y < 0 ? 1 : M)),
- D = w ? -1 : Math.min(v * (v < 0 ? 1 : M), b * (b < 0 ? 1 : M)),
- C = x ? 1 : Math.max(p * (p > 0 ? 1 : M), y * (y > 0 ? 1 : M)),
- P = _ ? 1 : Math.max(v * (v > 0 ? 1 : M), b * (b > 0 ? 1 : M)), T = .5 * (C - S),
- O = .5 * (P - D);
- u = Math.min(s / T, l / O), d = {x: -.5 * (C + S), y: -.5 * (P + D)}
- }
- i.borderWidth = e.getMaxBorderWidth(h.data), i.outerRadius = Math.max((u - i.borderWidth) / 2, 0), i.innerRadius = Math.max(c ? i.outerRadius / 100 * c : 0, 0), i.radiusLength = (i.outerRadius - i.innerRadius) / i.getVisibleDatasetCount(), i.offsetX = d.x * i.outerRadius, i.offsetY = d.y * i.outerRadius, h.total = e.calculateTotal(), e.outerRadius = i.outerRadius - i.radiusLength * e.getRingIndex(e.index), e.innerRadius = Math.max(e.outerRadius - i.radiusLength, 0), r.each(h.data, function (i, n) {
- e.updateElement(i, n, t)
- })
- },
- updateElement: function (t, e, i) {
- var n = this, a = n.chart, o = a.chartArea, s = a.options, l = s.animation,
- u = (o.left + o.right) / 2, d = (o.top + o.bottom) / 2, h = s.rotation, c = s.rotation,
- f = n.getDataset(),
- g = i && l.animateRotate ? 0 : t.hidden ? 0 : n.calculateCircumference(f.data[e]) * (s.circumference / (2 * Math.PI)),
- m = i && l.animateScale ? 0 : n.innerRadius, p = i && l.animateScale ? 0 : n.outerRadius,
- v = r.valueAtIndexOrDefault;
- r.extend(t, {
- _datasetIndex: n.index,
- _index: e,
- _model: {
- x: u + a.offsetX,
- y: d + a.offsetY,
- startAngle: h,
- endAngle: c,
- circumference: g,
- outerRadius: p,
- innerRadius: m,
- label: v(f.label, e, a.data.labels[e])
- }
- });
- var y = t._model;
- this.removeHoverStyle(t), i && l.animateRotate || (y.startAngle = 0 === e ? s.rotation : n.getMeta().data[e - 1]._model.endAngle, y.endAngle = y.startAngle + y.circumference), t.pivot()
- },
- removeHoverStyle: function (e) {
- t.DatasetController.prototype.removeHoverStyle.call(this, e, this.chart.options.elements.arc)
- },
- calculateTotal: function () {
- var t, e = this.getDataset(), i = this.getMeta(), n = 0;
- return r.each(i.data, function (i, a) {
- t = e.data[a], isNaN(t) || i.hidden || (n += Math.abs(t))
- }), n
- },
- calculateCircumference: function (t) {
- var e = this.getMeta().total;
- return e > 0 && !isNaN(t) ? 2 * Math.PI * (Math.abs(t) / e) : 0
- },
- getMaxBorderWidth: function (t) {
- for (var e, i, n = 0, a = this.index, r = t.length, o = 0; o < r; o++) e = t[o]._model ? t[o]._model.borderWidth : 0, n = (i = t[o]._chart ? t[o]._chart.config.data.datasets[a].hoverBorderWidth : 0) > (n = e > n ? e : n) ? i : n;
- return n
- }
- })
- }
- }, {25: 25, 40: 40, 45: 45}], 18: [function (t, e, i) {
- "use strict";
- var n = t(25), a = t(40), r = t(45);
- n._set("line", {
- showLines: !0,
- spanGaps: !1,
- hover: {mode: "label"},
- scales: {xAxes: [{type: "category", id: "x-axis-0"}], yAxes: [{type: "linear", id: "y-axis-0"}]}
- }), e.exports = function (t) {
- function e(t, e) {
- return r.valueOrDefault(t.showLine, e.showLines)
- }
+ function hslString(hsla, alpha) {
+ if (alpha < 1 || (hsla[3] && hsla[3] < 1)) {
+ return hslaString(hsla, alpha);
+ }
+ return "hsl(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%)";
+ }
- t.controllers.line = t.DatasetController.extend({
- datasetElementType: a.Line,
- dataElementType: a.Point,
- update: function (t) {
- var i, n, a, o = this, s = o.getMeta(), l = s.dataset, u = s.data || [], d = o.chart.options,
- h = d.elements.line, c = o.getScaleForId(s.yAxisID), f = o.getDataset(), g = e(f, d);
- for (g && (a = l.custom || {}, void 0 !== f.tension && void 0 === f.lineTension && (f.lineTension = f.tension), l._scale = c, l._datasetIndex = o.index, l._children = u, l._model = {
- spanGaps: f.spanGaps ? f.spanGaps : d.spanGaps,
- tension: a.tension ? a.tension : r.valueOrDefault(f.lineTension, h.tension),
- backgroundColor: a.backgroundColor ? a.backgroundColor : f.backgroundColor || h.backgroundColor,
- borderWidth: a.borderWidth ? a.borderWidth : f.borderWidth || h.borderWidth,
- borderColor: a.borderColor ? a.borderColor : f.borderColor || h.borderColor,
- borderCapStyle: a.borderCapStyle ? a.borderCapStyle : f.borderCapStyle || h.borderCapStyle,
- borderDash: a.borderDash ? a.borderDash : f.borderDash || h.borderDash,
- borderDashOffset: a.borderDashOffset ? a.borderDashOffset : f.borderDashOffset || h.borderDashOffset,
- borderJoinStyle: a.borderJoinStyle ? a.borderJoinStyle : f.borderJoinStyle || h.borderJoinStyle,
- fill: a.fill ? a.fill : void 0 !== f.fill ? f.fill : h.fill,
- steppedLine: a.steppedLine ? a.steppedLine : r.valueOrDefault(f.steppedLine, h.stepped),
- cubicInterpolationMode: a.cubicInterpolationMode ? a.cubicInterpolationMode : r.valueOrDefault(f.cubicInterpolationMode, h.cubicInterpolationMode)
- }, l.pivot()), i = 0, n = u.length; i < n; ++i) o.updateElement(u[i], i, t);
- for (g && 0 !== l._model.tension && o.updateBezierControlPoints(), i = 0, n = u.length; i < n; ++i) u[i].pivot()
- },
- getPointBackgroundColor: function (t, e) {
- var i = this.chart.options.elements.point.backgroundColor, n = this.getDataset(),
- a = t.custom || {};
- return a.backgroundColor ? i = a.backgroundColor : n.pointBackgroundColor ? i = r.valueAtIndexOrDefault(n.pointBackgroundColor, e, i) : n.backgroundColor && (i = n.backgroundColor), i
- },
- getPointBorderColor: function (t, e) {
- var i = this.chart.options.elements.point.borderColor, n = this.getDataset(),
- a = t.custom || {};
- return a.borderColor ? i = a.borderColor : n.pointBorderColor ? i = r.valueAtIndexOrDefault(n.pointBorderColor, e, i) : n.borderColor && (i = n.borderColor), i
- },
- getPointBorderWidth: function (t, e) {
- var i = this.chart.options.elements.point.borderWidth, n = this.getDataset(),
- a = t.custom || {};
- return isNaN(a.borderWidth) ? !isNaN(n.pointBorderWidth) || r.isArray(n.pointBorderWidth) ? i = r.valueAtIndexOrDefault(n.pointBorderWidth, e, i) : isNaN(n.borderWidth) || (i = n.borderWidth) : i = a.borderWidth, i
- },
- updateElement: function (t, e, i) {
- var n, a, o = this, s = o.getMeta(), l = t.custom || {}, u = o.getDataset(), d = o.index,
- h = u.data[e], c = o.getScaleForId(s.yAxisID), f = o.getScaleForId(s.xAxisID),
- g = o.chart.options.elements.point;
- void 0 !== u.radius && void 0 === u.pointRadius && (u.pointRadius = u.radius), void 0 !== u.hitRadius && void 0 === u.pointHitRadius && (u.pointHitRadius = u.hitRadius), n = f.getPixelForValue("object" == typeof h ? h : NaN, e, d), a = i ? c.getBasePixel() : o.calculatePointY(h, e, d), t._xScale = f, t._yScale = c, t._datasetIndex = d, t._index = e, t._model = {
- x: n,
- y: a,
- skip: l.skip || isNaN(n) || isNaN(a),
- radius: l.radius || r.valueAtIndexOrDefault(u.pointRadius, e, g.radius),
- pointStyle: l.pointStyle || r.valueAtIndexOrDefault(u.pointStyle, e, g.pointStyle),
- backgroundColor: o.getPointBackgroundColor(t, e),
- borderColor: o.getPointBorderColor(t, e),
- borderWidth: o.getPointBorderWidth(t, e),
- tension: s.dataset._model ? s.dataset._model.tension : 0,
- steppedLine: !!s.dataset._model && s.dataset._model.steppedLine,
- hitRadius: l.hitRadius || r.valueAtIndexOrDefault(u.pointHitRadius, e, g.hitRadius)
- }
- },
- calculatePointY: function (t, e, i) {
- var n, a, r, o = this.chart, s = this.getMeta(), l = this.getScaleForId(s.yAxisID), u = 0,
- d = 0;
- if (l.options.stacked) {
- for (n = 0; n < i; n++) if (a = o.data.datasets[n], "line" === (r = o.getDatasetMeta(n)).type && r.yAxisID === l.id && o.isDatasetVisible(n)) {
- var h = Number(l.getRightValue(a.data[e]));
- h < 0 ? d += h || 0 : u += h || 0
- }
- var c = Number(l.getRightValue(t));
- return c < 0 ? l.getPixelForValue(d + c) : l.getPixelForValue(u + c)
- }
- return l.getPixelForValue(t)
- },
- updateBezierControlPoints: function () {
- var t, e, i, n, a = this.getMeta(), o = this.chart.chartArea, s = a.data || [];
-
- function l(t, e, i) {
- return Math.max(Math.min(t, i), e)
- }
-
- if (a.dataset._model.spanGaps && (s = s.filter(function (t) {
- return !t._model.skip
- })), "monotone" === a.dataset._model.cubicInterpolationMode) r.splineCurveMonotone(s); else for (t = 0, e = s.length; t < e; ++t) i = s[t]._model, n = r.splineCurve(r.previousItem(s, t)._model, i, r.nextItem(s, t)._model, a.dataset._model.tension), i.controlPointPreviousX = n.previous.x, i.controlPointPreviousY = n.previous.y, i.controlPointNextX = n.next.x, i.controlPointNextY = n.next.y;
- if (this.chart.options.elements.line.capBezierPoints) for (t = 0, e = s.length; t < e; ++t) (i = s[t]._model).controlPointPreviousX = l(i.controlPointPreviousX, o.left, o.right), i.controlPointPreviousY = l(i.controlPointPreviousY, o.top, o.bottom), i.controlPointNextX = l(i.controlPointNextX, o.left, o.right), i.controlPointNextY = l(i.controlPointNextY, o.top, o.bottom)
- },
- draw: function () {
- var t = this.chart, i = this.getMeta(), n = i.data || [], a = t.chartArea, o = n.length, s = 0;
- for (r.canvas.clipArea(t.ctx, a), e(this.getDataset(), t.options) && i.dataset.draw(), r.canvas.unclipArea(t.ctx); s < o; ++s) n[s].draw(a)
- },
- setHoverStyle: function (t) {
- var e = this.chart.data.datasets[t._datasetIndex], i = t._index, n = t.custom || {},
- a = t._model;
- a.radius = n.hoverRadius || r.valueAtIndexOrDefault(e.pointHoverRadius, i, this.chart.options.elements.point.hoverRadius), a.backgroundColor = n.hoverBackgroundColor || r.valueAtIndexOrDefault(e.pointHoverBackgroundColor, i, r.getHoverColor(a.backgroundColor)), a.borderColor = n.hoverBorderColor || r.valueAtIndexOrDefault(e.pointHoverBorderColor, i, r.getHoverColor(a.borderColor)), a.borderWidth = n.hoverBorderWidth || r.valueAtIndexOrDefault(e.pointHoverBorderWidth, i, a.borderWidth)
- },
- removeHoverStyle: function (t) {
- var e = this, i = e.chart.data.datasets[t._datasetIndex], n = t._index, a = t.custom || {},
- o = t._model;
- void 0 !== i.radius && void 0 === i.pointRadius && (i.pointRadius = i.radius), o.radius = a.radius || r.valueAtIndexOrDefault(i.pointRadius, n, e.chart.options.elements.point.radius), o.backgroundColor = e.getPointBackgroundColor(t, n), o.borderColor = e.getPointBorderColor(t, n), o.borderWidth = e.getPointBorderWidth(t, n)
- }
- })
- }
- }, {25: 25, 40: 40, 45: 45}], 19: [function (t, e, i) {
- "use strict";
- var n = t(25), a = t(40), r = t(45);
- n._set("polarArea", {
- scale: {
- type: "radialLinear",
- angleLines: {display: !1},
- gridLines: {circular: !0},
- pointLabels: {display: !1},
- ticks: {beginAtZero: !0}
- },
- animation: {animateRotate: !0, animateScale: !0},
- startAngle: -.5 * Math.PI,
- legendCallback: function (t) {
- var e = [];
- e.push('
');
- var i = t.data, n = i.datasets, a = i.labels;
- if (n.length) for (var r = 0; r < n[0].data.length; ++r) e.push('
'), a[r] && e.push(a[r]), e.push("
");
- return e.push("
"), e.join("")
- },
- legend: {
- labels: {
- generateLabels: function (t) {
- var e = t.data;
- return e.labels.length && e.datasets.length ? e.labels.map(function (i, n) {
- var a = t.getDatasetMeta(0), o = e.datasets[0], s = a.data[n].custom || {},
- l = r.valueAtIndexOrDefault, u = t.options.elements.arc;
- return {
- text: i,
- fillStyle: s.backgroundColor ? s.backgroundColor : l(o.backgroundColor, n, u.backgroundColor),
- strokeStyle: s.borderColor ? s.borderColor : l(o.borderColor, n, u.borderColor),
- lineWidth: s.borderWidth ? s.borderWidth : l(o.borderWidth, n, u.borderWidth),
- hidden: isNaN(o.data[n]) || a.data[n].hidden,
- index: n
- }
- }) : []
- }
- }, onClick: function (t, e) {
- var i, n, a, r = e.index, o = this.chart;
- for (i = 0, n = (o.data.datasets || []).length; i < n; ++i) (a = o.getDatasetMeta(i)).data[r].hidden = !a.data[r].hidden;
- o.update()
- }
- },
- tooltips: {
- callbacks: {
- title: function () {
- return ""
- }, label: function (t, e) {
- return e.labels[t.index] + ": " + t.yLabel
- }
- }
- }
- }), e.exports = function (t) {
- t.controllers.polarArea = t.DatasetController.extend({
- dataElementType: a.Arc,
- linkScales: r.noop,
- update: function (t) {
- var e = this, i = e.chart, n = i.chartArea, a = e.getMeta(), o = i.options, s = o.elements.arc,
- l = Math.min(n.right - n.left, n.bottom - n.top);
- i.outerRadius = Math.max((l - s.borderWidth / 2) / 2, 0), i.innerRadius = Math.max(o.cutoutPercentage ? i.outerRadius / 100 * o.cutoutPercentage : 1, 0), i.radiusLength = (i.outerRadius - i.innerRadius) / i.getVisibleDatasetCount(), e.outerRadius = i.outerRadius - i.radiusLength * e.index, e.innerRadius = e.outerRadius - i.radiusLength, a.count = e.countVisibleElements(), r.each(a.data, function (i, n) {
- e.updateElement(i, n, t)
- })
- },
- updateElement: function (t, e, i) {
- for (var n = this, a = n.chart, o = n.getDataset(), s = a.options, l = s.animation, u = a.scale, d = a.data.labels, h = n.calculateCircumference(o.data[e]), c = u.xCenter, f = u.yCenter, g = 0, m = n.getMeta(), p = 0; p < e; ++p) isNaN(o.data[p]) || m.data[p].hidden || ++g;
- var v = s.startAngle, y = t.hidden ? 0 : u.getDistanceFromCenterForValue(o.data[e]),
- b = v + h * g, x = b + (t.hidden ? 0 : h),
- _ = l.animateScale ? 0 : u.getDistanceFromCenterForValue(o.data[e]);
- r.extend(t, {
- _datasetIndex: n.index,
- _index: e,
- _scale: u,
- _model: {
- x: c,
- y: f,
- innerRadius: 0,
- outerRadius: i ? _ : y,
- startAngle: i && l.animateRotate ? v : b,
- endAngle: i && l.animateRotate ? v : x,
- label: r.valueAtIndexOrDefault(d, e, d[e])
- }
- }), n.removeHoverStyle(t), t.pivot()
- },
- removeHoverStyle: function (e) {
- t.DatasetController.prototype.removeHoverStyle.call(this, e, this.chart.options.elements.arc)
- },
- countVisibleElements: function () {
- var t = this.getDataset(), e = this.getMeta(), i = 0;
- return r.each(e.data, function (e, n) {
- isNaN(t.data[n]) || e.hidden || i++
- }), i
- },
- calculateCircumference: function (t) {
- var e = this.getMeta().count;
- return e > 0 && !isNaN(t) ? 2 * Math.PI / e : 0
- }
- })
- }
- }, {25: 25, 40: 40, 45: 45}], 20: [function (t, e, i) {
- "use strict";
- var n = t(25), a = t(40), r = t(45);
- n._set("radar", {scale: {type: "radialLinear"}, elements: {line: {tension: 0}}}), e.exports = function (t) {
- t.controllers.radar = t.DatasetController.extend({
- datasetElementType: a.Line,
- dataElementType: a.Point,
- linkScales: r.noop,
- update: function (t) {
- var e = this, i = e.getMeta(), n = i.dataset, a = i.data, o = n.custom || {},
- s = e.getDataset(), l = e.chart.options.elements.line, u = e.chart.scale;
- void 0 !== s.tension && void 0 === s.lineTension && (s.lineTension = s.tension), r.extend(i.dataset, {
- _datasetIndex: e.index,
- _scale: u,
- _children: a,
- _loop: !0,
- _model: {
- tension: o.tension ? o.tension : r.valueOrDefault(s.lineTension, l.tension),
- backgroundColor: o.backgroundColor ? o.backgroundColor : s.backgroundColor || l.backgroundColor,
- borderWidth: o.borderWidth ? o.borderWidth : s.borderWidth || l.borderWidth,
- borderColor: o.borderColor ? o.borderColor : s.borderColor || l.borderColor,
- fill: o.fill ? o.fill : void 0 !== s.fill ? s.fill : l.fill,
- borderCapStyle: o.borderCapStyle ? o.borderCapStyle : s.borderCapStyle || l.borderCapStyle,
- borderDash: o.borderDash ? o.borderDash : s.borderDash || l.borderDash,
- borderDashOffset: o.borderDashOffset ? o.borderDashOffset : s.borderDashOffset || l.borderDashOffset,
- borderJoinStyle: o.borderJoinStyle ? o.borderJoinStyle : s.borderJoinStyle || l.borderJoinStyle
- }
- }), i.dataset.pivot(), r.each(a, function (i, n) {
- e.updateElement(i, n, t)
- }, e), e.updateBezierControlPoints()
- },
- updateElement: function (t, e, i) {
- var n = this, a = t.custom || {}, o = n.getDataset(), s = n.chart.scale,
- l = n.chart.options.elements.point, u = s.getPointPositionForValue(e, o.data[e]);
- void 0 !== o.radius && void 0 === o.pointRadius && (o.pointRadius = o.radius), void 0 !== o.hitRadius && void 0 === o.pointHitRadius && (o.pointHitRadius = o.hitRadius), r.extend(t, {
- _datasetIndex: n.index,
- _index: e,
- _scale: s,
- _model: {
- x: i ? s.xCenter : u.x,
- y: i ? s.yCenter : u.y,
- tension: a.tension ? a.tension : r.valueOrDefault(o.lineTension, n.chart.options.elements.line.tension),
- radius: a.radius ? a.radius : r.valueAtIndexOrDefault(o.pointRadius, e, l.radius),
- backgroundColor: a.backgroundColor ? a.backgroundColor : r.valueAtIndexOrDefault(o.pointBackgroundColor, e, l.backgroundColor),
- borderColor: a.borderColor ? a.borderColor : r.valueAtIndexOrDefault(o.pointBorderColor, e, l.borderColor),
- borderWidth: a.borderWidth ? a.borderWidth : r.valueAtIndexOrDefault(o.pointBorderWidth, e, l.borderWidth),
- pointStyle: a.pointStyle ? a.pointStyle : r.valueAtIndexOrDefault(o.pointStyle, e, l.pointStyle),
- hitRadius: a.hitRadius ? a.hitRadius : r.valueAtIndexOrDefault(o.pointHitRadius, e, l.hitRadius)
- }
- }), t._model.skip = a.skip ? a.skip : isNaN(t._model.x) || isNaN(t._model.y)
- },
- updateBezierControlPoints: function () {
- var t = this.chart.chartArea, e = this.getMeta();
- r.each(e.data, function (i, n) {
- var a = i._model,
- o = r.splineCurve(r.previousItem(e.data, n, !0)._model, a, r.nextItem(e.data, n, !0)._model, a.tension);
- a.controlPointPreviousX = Math.max(Math.min(o.previous.x, t.right), t.left), a.controlPointPreviousY = Math.max(Math.min(o.previous.y, t.bottom), t.top), a.controlPointNextX = Math.max(Math.min(o.next.x, t.right), t.left), a.controlPointNextY = Math.max(Math.min(o.next.y, t.bottom), t.top), i.pivot()
- })
- },
- setHoverStyle: function (t) {
- var e = this.chart.data.datasets[t._datasetIndex], i = t.custom || {}, n = t._index,
- a = t._model;
- a.radius = i.hoverRadius ? i.hoverRadius : r.valueAtIndexOrDefault(e.pointHoverRadius, n, this.chart.options.elements.point.hoverRadius), a.backgroundColor = i.hoverBackgroundColor ? i.hoverBackgroundColor : r.valueAtIndexOrDefault(e.pointHoverBackgroundColor, n, r.getHoverColor(a.backgroundColor)), a.borderColor = i.hoverBorderColor ? i.hoverBorderColor : r.valueAtIndexOrDefault(e.pointHoverBorderColor, n, r.getHoverColor(a.borderColor)), a.borderWidth = i.hoverBorderWidth ? i.hoverBorderWidth : r.valueAtIndexOrDefault(e.pointHoverBorderWidth, n, a.borderWidth)
- },
- removeHoverStyle: function (t) {
- var e = this.chart.data.datasets[t._datasetIndex], i = t.custom || {}, n = t._index,
- a = t._model, o = this.chart.options.elements.point;
- a.radius = i.radius ? i.radius : r.valueAtIndexOrDefault(e.pointRadius, n, o.radius), a.backgroundColor = i.backgroundColor ? i.backgroundColor : r.valueAtIndexOrDefault(e.pointBackgroundColor, n, o.backgroundColor), a.borderColor = i.borderColor ? i.borderColor : r.valueAtIndexOrDefault(e.pointBorderColor, n, o.borderColor), a.borderWidth = i.borderWidth ? i.borderWidth : r.valueAtIndexOrDefault(e.pointBorderWidth, n, o.borderWidth)
- }
- })
- }
- }, {25: 25, 40: 40, 45: 45}], 21: [function (t, e, i) {
- "use strict";
- t(25)._set("scatter", {
- hover: {mode: "single"},
- scales: {
- xAxes: [{id: "x-axis-1", type: "linear", position: "bottom"}],
- yAxes: [{id: "y-axis-1", type: "linear", position: "left"}]
- },
- showLines: !1,
- tooltips: {
- callbacks: {
- title: function () {
- return ""
- }, label: function (t) {
- return "(" + t.xLabel + ", " + t.yLabel + ")"
- }
- }
- }
- }), e.exports = function (t) {
- t.controllers.scatter = t.controllers.line
- }
- }, {25: 25}], 22: [function (t, e, i) {
- "use strict";
- var n = t(25), a = t(26), r = t(45);
- n._set("global", {
- animation: {
- duration: 1e3,
- easing: "easeOutQuart",
- onProgress: r.noop,
- onComplete: r.noop
- }
- }), e.exports = function (t) {
- t.Animation = a.extend({
- chart: null,
- currentStep: 0,
- numSteps: 60,
- easing: "",
- render: null,
- onAnimationProgress: null,
- onAnimationComplete: null
- }), t.animationService = {
- frameDuration: 17,
- animations: [],
- dropFrames: 0,
- request: null,
- addAnimation: function (t, e, i, n) {
- var a, r, o = this.animations;
- for (e.chart = t, n || (t.animating = !0), a = 0, r = o.length; a < r; ++a) if (o[a].chart === t) return void(o[a] = e);
- o.push(e), 1 === o.length && this.requestAnimationFrame()
- },
- cancelAnimation: function (t) {
- var e = r.findIndex(this.animations, function (e) {
- return e.chart === t
- });
- -1 !== e && (this.animations.splice(e, 1), t.animating = !1)
- },
- requestAnimationFrame: function () {
- var t = this;
- null === t.request && (t.request = r.requestAnimFrame.call(window, function () {
- t.request = null, t.startDigest()
- }))
- },
- startDigest: function () {
- var t = this, e = Date.now(), i = 0;
- t.dropFrames > 1 && (i = Math.floor(t.dropFrames), t.dropFrames = t.dropFrames % 1), t.advance(1 + i);
- var n = Date.now();
- t.dropFrames += (n - e) / t.frameDuration, t.animations.length > 0 && t.requestAnimationFrame()
- },
- advance: function (t) {
- for (var e, i, n = this.animations, a = 0; a < n.length;) i = (e = n[a]).chart, e.currentStep = (e.currentStep || 0) + t, e.currentStep = Math.min(e.currentStep, e.numSteps), r.callback(e.render, [i, e], i), r.callback(e.onAnimationProgress, [e], i), e.currentStep >= e.numSteps ? (r.callback(e.onAnimationComplete, [e], i), i.animating = !1, n.splice(a, 1)) : ++a
- }
- }, Object.defineProperty(t.Animation.prototype, "animationObject", {
- get: function () {
- return this
- }
- }), Object.defineProperty(t.Animation.prototype, "chartInstance", {
- get: function () {
- return this.chart
- }, set: function (t) {
- this.chart = t
- }
- })
- }
- }, {25: 25, 26: 26, 45: 45}], 23: [function (t, e, i) {
- "use strict";
- var n = t(25), a = t(45), r = t(28), o = t(30), s = t(48), l = t(31);
- e.exports = function (t) {
- function e(t) {
- return "top" === t || "bottom" === t
- }
+ function hslaString(hsla, alpha) {
+ if (alpha === undefined) {
+ alpha = (hsla[3] !== undefined ? hsla[3] : 1);
+ }
+ return "hsla(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%, "
+ + alpha + ")";
+ }
- t.types = {}, t.instances = {}, t.controllers = {}, a.extend(t.prototype, {
- construct: function (e, i) {
- var r, o, l = this;
- (o = (r = (r = i) || {}).data = r.data || {}).datasets = o.datasets || [], o.labels = o.labels || [], r.options = a.configMerge(n.global, n[r.type], r.options || {}), i = r;
- var u = s.acquireContext(e, i), d = u && u.canvas, h = d && d.height, c = d && d.width;
- l.id = a.uid(), l.ctx = u, l.canvas = d, l.config = i, l.width = c, l.height = h, l.aspectRatio = h ? c / h : null, l.options = i.options, l._bufferedRender = !1, l.chart = l, l.controller = l, t.instances[l.id] = l, Object.defineProperty(l, "data", {
- get: function () {
- return l.config.data
- }, set: function (t) {
- l.config.data = t
- }
- }), u && d ? (l.initialize(), l.update()) : console.error("Failed to create chart: can't acquire context from the given item")
- }, initialize: function () {
- var t = this;
- return l.notify(t, "beforeInit"), a.retinaScale(t, t.options.devicePixelRatio), t.bindEvents(), t.options.responsive && t.resize(!0), t.ensureScalesHaveIDs(), t.buildOrUpdateScales(), t.initToolTip(), l.notify(t, "afterInit"), t
- }, clear: function () {
- return a.canvas.clear(this), this
- }, stop: function () {
- return t.animationService.cancelAnimation(this), this
- }, resize: function (t) {
- var e = this, i = e.options, n = e.canvas, r = i.maintainAspectRatio && e.aspectRatio || null,
- o = Math.max(0, Math.floor(a.getMaximumWidth(n))),
- s = Math.max(0, Math.floor(r ? o / r : a.getMaximumHeight(n)));
- if ((e.width !== o || e.height !== s) && (n.width = e.width = o, n.height = e.height = s, n.style.width = o + "px", n.style.height = s + "px", a.retinaScale(e, i.devicePixelRatio), !t)) {
- var u = {width: o, height: s};
- l.notify(e, "resize", [u]), e.options.onResize && e.options.onResize(e, u), e.stop(), e.update(e.options.responsiveAnimationDuration)
- }
- }, ensureScalesHaveIDs: function () {
- var t = this.options, e = t.scales || {}, i = t.scale;
- a.each(e.xAxes, function (t, e) {
- t.id = t.id || "x-axis-" + e
- }), a.each(e.yAxes, function (t, e) {
- t.id = t.id || "y-axis-" + e
- }), i && (i.id = i.id || "scale")
- }, buildOrUpdateScales: function () {
- var i = this, n = i.options, r = i.scales || {}, o = [],
- s = Object.keys(r).reduce(function (t, e) {
- return t[e] = !1, t
- }, {});
- n.scales && (o = o.concat((n.scales.xAxes || []).map(function (t) {
- return {options: t, dtype: "category", dposition: "bottom"}
- }), (n.scales.yAxes || []).map(function (t) {
- return {options: t, dtype: "linear", dposition: "left"}
- }))), n.scale && o.push({
- options: n.scale,
- dtype: "radialLinear",
- isDefault: !0,
- dposition: "chartArea"
- }), a.each(o, function (n) {
- var o = n.options, l = o.id, u = a.valueOrDefault(o.type, n.dtype);
- e(o.position) !== e(n.dposition) && (o.position = n.dposition), s[l] = !0;
- var d = null;
- if (l in r && r[l].type === u) (d = r[l]).options = o, d.ctx = i.ctx, d.chart = i; else {
- var h = t.scaleService.getScaleConstructor(u);
- if (!h) return;
- d = new h({id: l, type: u, options: o, ctx: i.ctx, chart: i}), r[d.id] = d
- }
- d.mergeTicksOptions(), n.isDefault && (i.scale = d)
- }), a.each(s, function (t, e) {
- t || delete r[e]
- }), i.scales = r, t.scaleService.addScalesToLayout(this)
- }, buildOrUpdateControllers: function () {
- var e = this, i = [], n = [];
- return a.each(e.data.datasets, function (a, r) {
- var o = e.getDatasetMeta(r), s = a.type || e.config.type;
- if (o.type && o.type !== s && (e.destroyDatasetMeta(r), o = e.getDatasetMeta(r)), o.type = s, i.push(o.type), o.controller) o.controller.updateIndex(r), o.controller.linkScales(); else {
- var l = t.controllers[o.type];
- if (void 0 === l) throw new Error('"' + o.type + '" is not a chart type.');
- o.controller = new l(e, r), n.push(o.controller)
- }
- }, e), n
- }, resetElements: function () {
- var t = this;
- a.each(t.data.datasets, function (e, i) {
- t.getDatasetMeta(i).controller.reset()
- }, t)
- }, reset: function () {
- this.resetElements(), this.tooltip.initialize()
- }, update: function (e) {
- var i, n, r = this;
- if (e && "object" == typeof e || (e = {
- duration: e,
- lazy: arguments[1]
- }), n = (i = r).options, a.each(i.scales, function (t) {
- o.removeBox(i, t)
- }), n = a.configMerge(t.defaults.global, t.defaults[i.config.type], n), i.options = i.config.options = n, i.ensureScalesHaveIDs(), i.buildOrUpdateScales(), i.tooltip._options = n.tooltips, i.tooltip.initialize(), l._invalidate(r), !1 !== l.notify(r, "beforeUpdate")) {
- r.tooltip._data = r.data;
- var s = r.buildOrUpdateControllers();
- a.each(r.data.datasets, function (t, e) {
- r.getDatasetMeta(e).controller.buildOrUpdateElements()
- }, r), r.updateLayout(), r.options.animation && r.options.animation.duration && a.each(s, function (t) {
- t.reset()
- }), r.updateDatasets(), r.tooltip.initialize(), r.lastActive = [], l.notify(r, "afterUpdate"), r._bufferedRender ? r._bufferedRequest = {
- duration: e.duration,
- easing: e.easing,
- lazy: e.lazy
- } : r.render(e)
- }
- }, updateLayout: function () {
- !1 !== l.notify(this, "beforeLayout") && (o.update(this, this.width, this.height), l.notify(this, "afterScaleUpdate"), l.notify(this, "afterLayout"))
- }, updateDatasets: function () {
- if (!1 !== l.notify(this, "beforeDatasetsUpdate")) {
- for (var t = 0, e = this.data.datasets.length; t < e; ++t) this.updateDataset(t);
- l.notify(this, "afterDatasetsUpdate")
- }
- }, updateDataset: function (t) {
- var e = this.getDatasetMeta(t), i = {meta: e, index: t};
- !1 !== l.notify(this, "beforeDatasetUpdate", [i]) && (e.controller.update(), l.notify(this, "afterDatasetUpdate", [i]))
- }, render: function (e) {
- var i = this;
- e && "object" == typeof e || (e = {duration: e, lazy: arguments[1]});
- var n = e.duration, r = e.lazy;
- if (!1 !== l.notify(i, "beforeRender")) {
- var o = i.options.animation, s = function (t) {
- l.notify(i, "afterRender"), a.callback(o && o.onComplete, [t], i)
- };
- if (o && (void 0 !== n && 0 !== n || void 0 === n && 0 !== o.duration)) {
- var u = new t.Animation({
- numSteps: (n || o.duration) / 16.66,
- easing: e.easing || o.easing,
- render: function (t, e) {
- var i = a.easing.effects[e.easing], n = e.currentStep, r = n / e.numSteps;
- t.draw(i(r), r, n)
- },
- onAnimationProgress: o.onProgress,
- onAnimationComplete: s
- });
- t.animationService.addAnimation(i, u, n, r)
- } else i.draw(), s(new t.Animation({numSteps: 0, chart: i}));
- return i
- }
- }, draw: function (t) {
- var e = this;
- e.clear(), a.isNullOrUndef(t) && (t = 1), e.transition(t), !1 !== l.notify(e, "beforeDraw", [t]) && (a.each(e.boxes, function (t) {
- t.draw(e.chartArea)
- }, e), e.scale && e.scale.draw(), e.drawDatasets(t), e._drawTooltip(t), l.notify(e, "afterDraw", [t]))
- }, transition: function (t) {
- for (var e = 0, i = (this.data.datasets || []).length; e < i; ++e) this.isDatasetVisible(e) && this.getDatasetMeta(e).controller.transition(t);
- this.tooltip.transition(t)
- }, drawDatasets: function (t) {
- var e = this;
- if (!1 !== l.notify(e, "beforeDatasetsDraw", [t])) {
- for (var i = (e.data.datasets || []).length - 1; i >= 0; --i) e.isDatasetVisible(i) && e.drawDataset(i, t);
- l.notify(e, "afterDatasetsDraw", [t])
- }
- }, drawDataset: function (t, e) {
- var i = this.getDatasetMeta(t), n = {meta: i, index: t, easingValue: e};
- !1 !== l.notify(this, "beforeDatasetDraw", [n]) && (i.controller.draw(e), l.notify(this, "afterDatasetDraw", [n]))
- }, _drawTooltip: function (t) {
- var e = this.tooltip, i = {tooltip: e, easingValue: t};
- !1 !== l.notify(this, "beforeTooltipDraw", [i]) && (e.draw(), l.notify(this, "afterTooltipDraw", [i]))
- }, getElementAtEvent: function (t) {
- return r.modes.single(this, t)
- }, getElementsAtEvent: function (t) {
- return r.modes.label(this, t, {intersect: !0})
- }, getElementsAtXAxis: function (t) {
- return r.modes["x-axis"](this, t, {intersect: !0})
- }, getElementsAtEventForMode: function (t, e, i) {
- var n = r.modes[e];
- return "function" == typeof n ? n(this, t, i) : []
- }, getDatasetAtEvent: function (t) {
- return r.modes.dataset(this, t, {intersect: !0})
- }, getDatasetMeta: function (t) {
- var e = this.data.datasets[t];
- e._meta || (e._meta = {});
- var i = e._meta[this.id];
- return i || (i = e._meta[this.id] = {
- type: null,
- data: [],
- dataset: null,
- controller: null,
- hidden: null,
- xAxisID: null,
- yAxisID: null
- }), i
- }, getVisibleDatasetCount: function () {
- for (var t = 0, e = 0, i = this.data.datasets.length; e < i; ++e) this.isDatasetVisible(e) && t++;
- return t
- }, isDatasetVisible: function (t) {
- var e = this.getDatasetMeta(t);
- return "boolean" == typeof e.hidden ? !e.hidden : !this.data.datasets[t].hidden
- }, generateLegend: function () {
- return this.options.legendCallback(this)
- }, destroyDatasetMeta: function (t) {
- var e = this.id, i = this.data.datasets[t], n = i._meta && i._meta[e];
- n && (n.controller.destroy(), delete i._meta[e])
- }, destroy: function () {
- var e, i, n = this, r = n.canvas;
- for (n.stop(), e = 0, i = n.data.datasets.length; e < i; ++e) n.destroyDatasetMeta(e);
- r && (n.unbindEvents(), a.canvas.clear(n), s.releaseContext(n.ctx), n.canvas = null, n.ctx = null), l.notify(n, "destroy"), delete t.instances[n.id]
- }, toBase64Image: function () {
- return this.canvas.toDataURL.apply(this.canvas, arguments)
- }, initToolTip: function () {
- var e = this;
- e.tooltip = new t.Tooltip({
- _chart: e,
- _chartInstance: e,
- _data: e.data,
- _options: e.options.tooltips
- }, e)
- }, bindEvents: function () {
- var t = this, e = t._listeners = {}, i = function () {
- t.eventHandler.apply(t, arguments)
- };
- a.each(t.options.events, function (n) {
- s.addEventListener(t, n, i), e[n] = i
- }), t.options.responsive && (i = function () {
- t.resize()
- }, s.addEventListener(t, "resize", i), e.resize = i)
- }, unbindEvents: function () {
- var t = this, e = t._listeners;
- e && (delete t._listeners, a.each(e, function (e, i) {
- s.removeEventListener(t, i, e)
- }))
- }, updateHoverStyle: function (t, e, i) {
- var n, a, r, o = i ? "setHoverStyle" : "removeHoverStyle";
- for (a = 0, r = t.length; a < r; ++a) (n = t[a]) && this.getDatasetMeta(n._datasetIndex).controller[o](n)
- }, eventHandler: function (t) {
- var e = this, i = e.tooltip;
- if (!1 !== l.notify(e, "beforeEvent", [t])) {
- e._bufferedRender = !0, e._bufferedRequest = null;
- var n = e.handleEvent(t);
- i && (n = i._start ? i.handleEvent(t) : n | i.handleEvent(t)), l.notify(e, "afterEvent", [t]);
- var a = e._bufferedRequest;
- return a ? e.render(a) : n && !e.animating && (e.stop(), e.render(e.options.hover.animationDuration, !0)), e._bufferedRender = !1, e._bufferedRequest = null, e
- }
- }, handleEvent: function (t) {
- var e, i = this, n = i.options || {}, r = n.hover;
- return i.lastActive = i.lastActive || [], "mouseout" === t.type ? i.active = [] : i.active = i.getElementsAtEventForMode(t, r.mode, r), a.callback(n.onHover || n.hover.onHover, [t.native, i.active], i), "mouseup" !== t.type && "click" !== t.type || n.onClick && n.onClick.call(i, t.native, i.active), i.lastActive.length && i.updateHoverStyle(i.lastActive, r.mode, !1), i.active.length && r.mode && i.updateHoverStyle(i.active, r.mode, !0), e = !a.arrayEquals(i.active, i.lastActive), i.lastActive = i.active, e
- }
- }), t.Controller = t
- }
- }, {25: 25, 28: 28, 30: 30, 31: 31, 45: 45, 48: 48}], 24: [function (t, e, i) {
- "use strict";
- var n = t(45);
- e.exports = function (t) {
- var e = ["push", "pop", "shift", "splice", "unshift"];
-
- function i(t, i) {
- var n = t._chartjs;
- if (n) {
- var a = n.listeners, r = a.indexOf(i);
- -1 !== r && a.splice(r, 1), a.length > 0 || (e.forEach(function (e) {
- delete t[e]
- }), delete t._chartjs)
- }
- }
+// hwb is a bit different than rgb(a) & hsl(a) since there is no alpha specific syntax
+// (hwb have alpha optional & 1 is default value)
+ function hwbString(hwb, alpha) {
+ if (alpha === undefined) {
+ alpha = (hwb[3] !== undefined ? hwb[3] : 1);
+ }
+ return "hwb(" + hwb[0] + ", " + hwb[1] + "%, " + hwb[2] + "%"
+ + (alpha !== undefined && alpha !== 1 ? ", " + alpha : "") + ")";
+ }
- t.DatasetController = function (t, e) {
- this.initialize(t, e)
- }, n.extend(t.DatasetController.prototype, {
- datasetElementType: null,
- dataElementType: null,
- initialize: function (t, e) {
- this.chart = t, this.index = e, this.linkScales(), this.addElements()
- },
- updateIndex: function (t) {
- this.index = t
- },
- linkScales: function () {
- var t = this, e = t.getMeta(), i = t.getDataset();
- null !== e.xAxisID && e.xAxisID in t.chart.scales || (e.xAxisID = i.xAxisID || t.chart.options.scales.xAxes[0].id), null !== e.yAxisID && e.yAxisID in t.chart.scales || (e.yAxisID = i.yAxisID || t.chart.options.scales.yAxes[0].id)
- },
- getDataset: function () {
- return this.chart.data.datasets[this.index]
- },
- getMeta: function () {
- return this.chart.getDatasetMeta(this.index)
- },
- getScaleForId: function (t) {
- return this.chart.scales[t]
- },
- reset: function () {
- this.update(!0)
- },
- destroy: function () {
- this._data && i(this._data, this)
- },
- createMetaDataset: function () {
- var t = this.datasetElementType;
- return t && new t({_chart: this.chart, _datasetIndex: this.index})
- },
- createMetaData: function (t) {
- var e = this.dataElementType;
- return e && new e({_chart: this.chart, _datasetIndex: this.index, _index: t})
- },
- addElements: function () {
- var t, e, i = this.getMeta(), n = this.getDataset().data || [], a = i.data;
- for (t = 0, e = n.length; t < e; ++t) a[t] = a[t] || this.createMetaData(t);
- i.dataset = i.dataset || this.createMetaDataset()
- },
- addElementAndReset: function (t) {
- var e = this.createMetaData(t);
- this.getMeta().data.splice(t, 0, e), this.updateElement(e, t, !0)
- },
- buildOrUpdateElements: function () {
- var t, a, r = this, o = r.getDataset(), s = o.data || (o.data = []);
- r._data !== s && (r._data && i(r._data, r), a = r, (t = s)._chartjs ? t._chartjs.listeners.push(a) : (Object.defineProperty(t, "_chartjs", {
- configurable: !0,
- enumerable: !1,
- value: {listeners: [a]}
- }), e.forEach(function (e) {
- var i = "onData" + e.charAt(0).toUpperCase() + e.slice(1), a = t[e];
- Object.defineProperty(t, e, {
- configurable: !0, enumerable: !1, value: function () {
- var e = Array.prototype.slice.call(arguments), r = a.apply(this, e);
- return n.each(t._chartjs.listeners, function (t) {
- "function" == typeof t[i] && t[i].apply(t, e)
- }), r
- }
- })
- })), r._data = s), r.resyncElements()
- },
- update: n.noop,
- transition: function (t) {
- for (var e = this.getMeta(), i = e.data || [], n = i.length, a = 0; a < n; ++a) i[a].transition(t);
- e.dataset && e.dataset.transition(t)
- },
- draw: function () {
- var t = this.getMeta(), e = t.data || [], i = e.length, n = 0;
- for (t.dataset && t.dataset.draw(); n < i; ++n) e[n].draw()
- },
- removeHoverStyle: function (t, e) {
- var i = this.chart.data.datasets[t._datasetIndex], a = t._index, r = t.custom || {},
- o = n.valueAtIndexOrDefault, s = t._model;
- s.backgroundColor = r.backgroundColor ? r.backgroundColor : o(i.backgroundColor, a, e.backgroundColor), s.borderColor = r.borderColor ? r.borderColor : o(i.borderColor, a, e.borderColor), s.borderWidth = r.borderWidth ? r.borderWidth : o(i.borderWidth, a, e.borderWidth)
- },
- setHoverStyle: function (t) {
- var e = this.chart.data.datasets[t._datasetIndex], i = t._index, a = t.custom || {},
- r = n.valueAtIndexOrDefault, o = n.getHoverColor, s = t._model;
- s.backgroundColor = a.hoverBackgroundColor ? a.hoverBackgroundColor : r(e.hoverBackgroundColor, i, o(s.backgroundColor)), s.borderColor = a.hoverBorderColor ? a.hoverBorderColor : r(e.hoverBorderColor, i, o(s.borderColor)), s.borderWidth = a.hoverBorderWidth ? a.hoverBorderWidth : r(e.hoverBorderWidth, i, s.borderWidth)
- },
- resyncElements: function () {
- var t = this.getMeta(), e = this.getDataset().data, i = t.data.length, n = e.length;
- n < i ? t.data.splice(n, i - n) : n > i && this.insertElements(i, n - i)
- },
- insertElements: function (t, e) {
- for (var i = 0; i < e; ++i) this.addElementAndReset(t + i)
- },
- onDataPush: function () {
- this.insertElements(this.getDataset().data.length - 1, arguments.length)
- },
- onDataPop: function () {
- this.getMeta().data.pop()
- },
- onDataShift: function () {
- this.getMeta().data.shift()
- },
- onDataSplice: function (t, e) {
- this.getMeta().data.splice(t, e), this.insertElements(t, arguments.length - 2)
- },
- onDataUnshift: function () {
- this.insertElements(0, arguments.length)
- }
- }), t.DatasetController.extend = n.inherits
- }
- }, {45: 45}], 25: [function (t, e, i) {
- "use strict";
- var n = t(45);
- e.exports = {
- _set: function (t, e) {
- return n.merge(this[t] || (this[t] = {}), e)
- }
- }
- }, {45: 45}], 26: [function (t, e, i) {
- "use strict";
- var n = t(2), a = t(45);
- var r = function (t) {
- a.extend(this, t), this.initialize.apply(this, arguments)
- };
- a.extend(r.prototype, {
- initialize: function () {
- this.hidden = !1
- }, pivot: function () {
- var t = this;
- return t._view || (t._view = a.clone(t._model)), t._start = {}, t
- }, transition: function (t) {
- var e = this, i = e._model, a = e._start, r = e._view;
- return i && 1 !== t ? (r || (r = e._view = {}), a || (a = e._start = {}), function (t, e, i, a) {
- var r, o, s, l, u, d, h, c, f, g = Object.keys(i);
- for (r = 0, o = g.length; r < o; ++r) if (d = i[s = g[r]], e.hasOwnProperty(s) || (e[s] = d), (l = e[s]) !== d && "_" !== s[0]) {
- if (t.hasOwnProperty(s) || (t[s] = l), (h = typeof d) == typeof(u = t[s])) if ("string" === h) {
- if ((c = n(u)).valid && (f = n(d)).valid) {
- e[s] = f.mix(c, a).rgbString();
- continue
- }
- } else if ("number" === h && isFinite(u) && isFinite(d)) {
- e[s] = u + (d - u) * a;
- continue
- }
- e[s] = d
- }
- }(a, r, i, t), e) : (e._view = i, e._start = null, e)
- }, tooltipPosition: function () {
- return {x: this._model.x, y: this._model.y}
- }, hasValue: function () {
- return a.isNumber(this._model.x) && a.isNumber(this._model.y)
- }
- }), r.extend = a.inherits, e.exports = r
- }, {2: 2, 45: 45}], 27: [function (t, e, i) {
- "use strict";
- var n = t(2), a = t(25), r = t(45);
- e.exports = function (t) {
- function e(t, e, i) {
- var n;
- return "string" == typeof t ? (n = parseInt(t, 10), -1 !== t.indexOf("%") && (n = n / 100 * e.parentNode[i])) : n = t, n
- }
+ function keyword(rgb) {
+ return reverseNames[rgb.slice(0, 3)];
+ }
- function i(t) {
- return null != t && "none" !== t
- }
+// helpers
+ function scale(num, min, max) {
+ return Math.min(Math.max(min, num), max);
+ }
- function o(t, n, a) {
- var r = document.defaultView, o = t.parentNode, s = r.getComputedStyle(t)[n],
- l = r.getComputedStyle(o)[n], u = i(s), d = i(l), h = Number.POSITIVE_INFINITY;
- return u || d ? Math.min(u ? e(s, t, a) : h, d ? e(l, o, a) : h) : "none"
- }
+ function hexDouble(num) {
+ var str = num.toString(16).toUpperCase();
+ return (str.length < 2) ? "0" + str : str;
+ }
- r.configMerge = function () {
- return r.merge(r.clone(arguments[0]), [].slice.call(arguments, 1), {
- merger: function (e, i, n, a) {
- var o = i[e] || {}, s = n[e];
- "scales" === e ? i[e] = r.scaleMerge(o, s) : "scale" === e ? i[e] = r.merge(o, [t.scaleService.getScaleDefaults(s.type), s]) : r._merger(e, i, n, a)
- }
- })
- }, r.scaleMerge = function () {
- return r.merge(r.clone(arguments[0]), [].slice.call(arguments, 1), {
- merger: function (e, i, n, a) {
- if ("xAxes" === e || "yAxes" === e) {
- var o, s, l, u = n[e].length;
- for (i[e] || (i[e] = []), o = 0; o < u; ++o) l = n[e][o], s = r.valueOrDefault(l.type, "xAxes" === e ? "category" : "linear"), o >= i[e].length && i[e].push({}), !i[e][o].type || l.type && l.type !== i[e][o].type ? r.merge(i[e][o], [t.scaleService.getScaleDefaults(s), l]) : r.merge(i[e][o], l)
- } else r._merger(e, i, n, a)
- }
- })
- }, r.where = function (t, e) {
- if (r.isArray(t) && Array.prototype.filter) return t.filter(e);
- var i = [];
- return r.each(t, function (t) {
- e(t) && i.push(t)
- }), i
- }, r.findIndex = Array.prototype.findIndex ? function (t, e, i) {
- return t.findIndex(e, i)
- } : function (t, e, i) {
- i = void 0 === i ? t : i;
- for (var n = 0, a = t.length; n < a; ++n) if (e.call(i, t[n], n, t)) return n;
- return -1
- }, r.findNextWhere = function (t, e, i) {
- r.isNullOrUndef(i) && (i = -1);
- for (var n = i + 1; n < t.length; n++) {
- var a = t[n];
- if (e(a)) return a
- }
- }, r.findPreviousWhere = function (t, e, i) {
- r.isNullOrUndef(i) && (i = t.length);
- for (var n = i - 1; n >= 0; n--) {
- var a = t[n];
- if (e(a)) return a
- }
- }, r.isNumber = function (t) {
- return !isNaN(parseFloat(t)) && isFinite(t)
- }, r.almostEquals = function (t, e, i) {
- return Math.abs(t - e) < i
- }, r.almostWhole = function (t, e) {
- var i = Math.round(t);
- return i - e < t && i + e > t
- }, r.max = function (t) {
- return t.reduce(function (t, e) {
- return isNaN(e) ? t : Math.max(t, e)
- }, Number.NEGATIVE_INFINITY)
- }, r.min = function (t) {
- return t.reduce(function (t, e) {
- return isNaN(e) ? t : Math.min(t, e)
- }, Number.POSITIVE_INFINITY)
- }, r.sign = Math.sign ? function (t) {
- return Math.sign(t)
- } : function (t) {
- return 0 === (t = +t) || isNaN(t) ? t : t > 0 ? 1 : -1
- }, r.log10 = Math.log10 ? function (t) {
- return Math.log10(t)
- } : function (t) {
- var e = Math.log(t) * Math.LOG10E, i = Math.round(e);
- return t === Math.pow(10, i) ? i : e
- }, r.toRadians = function (t) {
- return t * (Math.PI / 180)
- }, r.toDegrees = function (t) {
- return t * (180 / Math.PI)
- }, r.getAngleFromPoint = function (t, e) {
- var i = e.x - t.x, n = e.y - t.y, a = Math.sqrt(i * i + n * n), r = Math.atan2(n, i);
- return r < -.5 * Math.PI && (r += 2 * Math.PI), {angle: r, distance: a}
- }, r.distanceBetweenPoints = function (t, e) {
- return Math.sqrt(Math.pow(e.x - t.x, 2) + Math.pow(e.y - t.y, 2))
- }, r.aliasPixel = function (t) {
- return t % 2 == 0 ? 0 : .5
- }, r.splineCurve = function (t, e, i, n) {
- var a = t.skip ? e : t, r = e, o = i.skip ? e : i,
- s = Math.sqrt(Math.pow(r.x - a.x, 2) + Math.pow(r.y - a.y, 2)),
- l = Math.sqrt(Math.pow(o.x - r.x, 2) + Math.pow(o.y - r.y, 2)), u = s / (s + l),
- d = l / (s + l), h = n * (u = isNaN(u) ? 0 : u), c = n * (d = isNaN(d) ? 0 : d);
- return {
- previous: {x: r.x - h * (o.x - a.x), y: r.y - h * (o.y - a.y)},
- next: {x: r.x + c * (o.x - a.x), y: r.y + c * (o.y - a.y)}
- }
- }, r.EPSILON = Number.EPSILON || 1e-14, r.splineCurveMonotone = function (t) {
- var e, i, n, a, o, s, l, u, d, h = (t || []).map(function (t) {
- return {model: t._model, deltaK: 0, mK: 0}
- }), c = h.length;
- for (e = 0; e < c; ++e) if (!(n = h[e]).model.skip) {
- if (i = e > 0 ? h[e - 1] : null, (a = e < c - 1 ? h[e + 1] : null) && !a.model.skip) {
- var f = a.model.x - n.model.x;
- n.deltaK = 0 !== f ? (a.model.y - n.model.y) / f : 0
- }
- !i || i.model.skip ? n.mK = n.deltaK : !a || a.model.skip ? n.mK = i.deltaK : this.sign(i.deltaK) !== this.sign(n.deltaK) ? n.mK = 0 : n.mK = (i.deltaK + n.deltaK) / 2
- }
- for (e = 0; e < c - 1; ++e) n = h[e], a = h[e + 1], n.model.skip || a.model.skip || (r.almostEquals(n.deltaK, 0, this.EPSILON) ? n.mK = a.mK = 0 : (o = n.mK / n.deltaK, s = a.mK / n.deltaK, (u = Math.pow(o, 2) + Math.pow(s, 2)) <= 9 || (l = 3 / Math.sqrt(u), n.mK = o * l * n.deltaK, a.mK = s * l * n.deltaK)));
- for (e = 0; e < c; ++e) (n = h[e]).model.skip || (i = e > 0 ? h[e - 1] : null, a = e < c - 1 ? h[e + 1] : null, i && !i.model.skip && (d = (n.model.x - i.model.x) / 3, n.model.controlPointPreviousX = n.model.x - d, n.model.controlPointPreviousY = n.model.y - d * n.mK), a && !a.model.skip && (d = (a.model.x - n.model.x) / 3, n.model.controlPointNextX = n.model.x + d, n.model.controlPointNextY = n.model.y + d * n.mK))
- }, r.nextItem = function (t, e, i) {
- return i ? e >= t.length - 1 ? t[0] : t[e + 1] : e >= t.length - 1 ? t[t.length - 1] : t[e + 1]
- }, r.previousItem = function (t, e, i) {
- return i ? e <= 0 ? t[t.length - 1] : t[e - 1] : e <= 0 ? t[0] : t[e - 1]
- }, r.niceNum = function (t, e) {
- var i = Math.floor(r.log10(t)), n = t / Math.pow(10, i);
- return (e ? n < 1.5 ? 1 : n < 3 ? 2 : n < 7 ? 5 : 10 : n <= 1 ? 1 : n <= 2 ? 2 : n <= 5 ? 5 : 10) * Math.pow(10, i)
- }, r.requestAnimFrame = "undefined" == typeof window ? function (t) {
- t()
- } : window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function (t) {
- return window.setTimeout(t, 1e3 / 60)
- }, r.getRelativePosition = function (t, e) {
- var i, n, a = t.originalEvent || t, o = t.currentTarget || t.srcElement,
- s = o.getBoundingClientRect(), l = a.touches;
- l && l.length > 0 ? (i = l[0].clientX, n = l[0].clientY) : (i = a.clientX, n = a.clientY);
- var u = parseFloat(r.getStyle(o, "padding-left")), d = parseFloat(r.getStyle(o, "padding-top")),
- h = parseFloat(r.getStyle(o, "padding-right")), c = parseFloat(r.getStyle(o, "padding-bottom")),
- f = s.right - s.left - u - h, g = s.bottom - s.top - d - c;
- return {
- x: i = Math.round((i - s.left - u) / f * o.width / e.currentDevicePixelRatio),
- y: n = Math.round((n - s.top - d) / g * o.height / e.currentDevicePixelRatio)
- }
- }, r.getConstraintWidth = function (t) {
- return o(t, "max-width", "clientWidth")
- }, r.getConstraintHeight = function (t) {
- return o(t, "max-height", "clientHeight")
- }, r.getMaximumWidth = function (t) {
- var e = t.parentNode;
- if (!e) return t.clientWidth;
- var i = parseInt(r.getStyle(e, "padding-left"), 10),
- n = parseInt(r.getStyle(e, "padding-right"), 10), a = e.clientWidth - i - n,
- o = r.getConstraintWidth(t);
- return isNaN(o) ? a : Math.min(a, o)
- }, r.getMaximumHeight = function (t) {
- var e = t.parentNode;
- if (!e) return t.clientHeight;
- var i = parseInt(r.getStyle(e, "padding-top"), 10),
- n = parseInt(r.getStyle(e, "padding-bottom"), 10), a = e.clientHeight - i - n,
- o = r.getConstraintHeight(t);
- return isNaN(o) ? a : Math.min(a, o)
- }, r.getStyle = function (t, e) {
- return t.currentStyle ? t.currentStyle[e] : document.defaultView.getComputedStyle(t, null).getPropertyValue(e)
- }, r.retinaScale = function (t, e) {
- var i = t.currentDevicePixelRatio = e || window.devicePixelRatio || 1;
- if (1 !== i) {
- var n = t.canvas, a = t.height, r = t.width;
- n.height = a * i, n.width = r * i, t.ctx.scale(i, i), n.style.height || n.style.width || (n.style.height = a + "px", n.style.width = r + "px")
- }
- }, r.fontString = function (t, e, i) {
- return e + " " + t + "px " + i
- }, r.longestText = function (t, e, i, n) {
- var a = (n = n || {}).data = n.data || {}, o = n.garbageCollect = n.garbageCollect || [];
- n.font !== e && (a = n.data = {}, o = n.garbageCollect = [], n.font = e), t.font = e;
- var s = 0;
- r.each(i, function (e) {
- null != e && !0 !== r.isArray(e) ? s = r.measureText(t, a, o, s, e) : r.isArray(e) && r.each(e, function (e) {
- null == e || r.isArray(e) || (s = r.measureText(t, a, o, s, e))
- })
- });
- var l = o.length / 2;
- if (l > i.length) {
- for (var u = 0; u < l; u++) delete a[o[u]];
- o.splice(0, l)
- }
- return s
- }, r.measureText = function (t, e, i, n, a) {
- var r = e[a];
- return r || (r = e[a] = t.measureText(a).width, i.push(a)), r > n && (n = r), n
- }, r.numberOfLabelLines = function (t) {
- var e = 1;
- return r.each(t, function (t) {
- r.isArray(t) && t.length > e && (e = t.length)
- }), e
- }, r.color = n ? function (t) {
- return t instanceof CanvasGradient && (t = a.global.defaultColor), n(t)
- } : function (t) {
- return console.error("Color.js not found!"), t
- }, r.getHoverColor = function (t) {
- return t instanceof CanvasPattern ? t : r.color(t).saturate(.5).darken(.1).rgbString()
- }
- }
- }, {2: 2, 25: 25, 45: 45}], 28: [function (t, e, i) {
- "use strict";
- var n = t(45);
- function a(t, e) {
- return t.native ? {x: t.x, y: t.y} : n.getRelativePosition(t, e)
- }
+//create a list of reverse color names
+ var reverseNames = {};
+ for (var name in colorName) {
+ reverseNames[colorName[name]] = name;
+ }
- function r(t, e) {
- var i, n, a, r, o;
- for (n = 0, r = t.data.datasets.length; n < r; ++n) if (t.isDatasetVisible(n)) for (a = 0, o = (i = t.getDatasetMeta(n)).data.length; a < o; ++a) {
- var s = i.data[a];
- s._view.skip || e(s)
- }
- }
+ /* MIT license */
- function o(t, e) {
- var i = [];
- return r(t, function (t) {
- t.inRange(e.x, e.y) && i.push(t)
- }), i
- }
- function s(t, e, i, n) {
- var a = Number.POSITIVE_INFINITY, o = [];
- return r(t, function (t) {
- if (!i || t.inRange(e.x, e.y)) {
- var r = t.getCenterPoint(), s = n(e, r);
- s < a ? (o = [t], a = s) : s === a && o.push(t)
- }
- }), o
- }
+ var Color = function (obj) {
+ if (obj instanceof Color) {
+ return obj;
+ }
+ if (!(this instanceof Color)) {
+ return new Color(obj);
+ }
- function l(t) {
- var e = -1 !== t.indexOf("x"), i = -1 !== t.indexOf("y");
- return function (t, n) {
- var a = e ? Math.abs(t.x - n.x) : 0, r = i ? Math.abs(t.y - n.y) : 0;
- return Math.sqrt(Math.pow(a, 2) + Math.pow(r, 2))
- }
- }
+ this.valid = false;
+ this.values = {
+ rgb: [0, 0, 0],
+ hsl: [0, 0, 0],
+ hsv: [0, 0, 0],
+ hwb: [0, 0, 0],
+ cmyk: [0, 0, 0, 0],
+ alpha: 1
+ };
- function u(t, e, i) {
- var n = a(e, t);
- i.axis = i.axis || "x";
- var r = l(i.axis), u = i.intersect ? o(t, n) : s(t, n, !1, r), d = [];
- return u.length ? (t.data.datasets.forEach(function (e, i) {
- if (t.isDatasetVisible(i)) {
- var n = t.getDatasetMeta(i).data[u[0]._index];
- n && !n._view.skip && d.push(n)
- }
- }), d) : []
- }
+ // parse Color() argument
+ var vals;
+ if (typeof obj === 'string') {
+ vals = colorString.getRgba(obj);
+ if (vals) {
+ this.setValues('rgb', vals);
+ } else if (vals = colorString.getHsla(obj)) {
+ this.setValues('hsl', vals);
+ } else if (vals = colorString.getHwb(obj)) {
+ this.setValues('hwb', vals);
+ }
+ } else if (typeof obj === 'object') {
+ vals = obj;
+ if (vals.r !== undefined || vals.red !== undefined) {
+ this.setValues('rgb', vals);
+ } else if (vals.l !== undefined || vals.lightness !== undefined) {
+ this.setValues('hsl', vals);
+ } else if (vals.v !== undefined || vals.value !== undefined) {
+ this.setValues('hsv', vals);
+ } else if (vals.w !== undefined || vals.whiteness !== undefined) {
+ this.setValues('hwb', vals);
+ } else if (vals.c !== undefined || vals.cyan !== undefined) {
+ this.setValues('cmyk', vals);
+ }
+ }
+ };
- e.exports = {
- modes: {
- single: function (t, e) {
- var i = a(e, t), n = [];
- return r(t, function (t) {
- if (t.inRange(i.x, i.y)) return n.push(t), n
- }), n.slice(0, 1)
- }, label: u, index: u, dataset: function (t, e, i) {
- var n = a(e, t);
- i.axis = i.axis || "xy";
- var r = l(i.axis), u = i.intersect ? o(t, n) : s(t, n, !1, r);
- return u.length > 0 && (u = t.getDatasetMeta(u[0]._datasetIndex).data), u
- }, "x-axis": function (t, e) {
- return u(t, e, {intersect: !1})
- }, point: function (t, e) {
- return o(t, a(e, t))
- }, nearest: function (t, e, i) {
- var n = a(e, t);
- i.axis = i.axis || "xy";
- var r = l(i.axis), o = s(t, n, i.intersect, r);
- return o.length > 1 && o.sort(function (t, e) {
- var i = t.getArea() - e.getArea();
- return 0 === i && (i = t._datasetIndex - e._datasetIndex), i
- }), o.slice(0, 1)
- }, x: function (t, e, i) {
- var n = a(e, t), o = [], s = !1;
- return r(t, function (t) {
- t.inXRange(n.x) && o.push(t), t.inRange(n.x, n.y) && (s = !0)
- }), i.intersect && !s && (o = []), o
- }, y: function (t, e, i) {
- var n = a(e, t), o = [], s = !1;
- return r(t, function (t) {
- t.inYRange(n.y) && o.push(t), t.inRange(n.x, n.y) && (s = !0)
- }), i.intersect && !s && (o = []), o
- }
- }
- }
- }, {45: 45}], 29: [function (t, e, i) {
- "use strict";
- t(25)._set("global", {
- responsive: !0,
- responsiveAnimationDuration: 0,
- maintainAspectRatio: !0,
- events: ["mousemove", "mouseout", "click", "touchstart", "touchmove"],
- hover: {onHover: null, mode: "nearest", intersect: !0, animationDuration: 400},
- onClick: null,
- defaultColor: "rgba(0,0,0,0.1)",
- defaultFontColor: "#666",
- defaultFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",
- defaultFontSize: 12,
- defaultFontStyle: "normal",
- showLines: !0,
- elements: {},
- layout: {padding: {top: 0, right: 0, bottom: 0, left: 0}}
- }), e.exports = function () {
- var t = function (t, e) {
- return this.construct(t, e), this
- };
- return t.Chart = t, t
- }
- }, {25: 25}], 30: [function (t, e, i) {
- "use strict";
- var n = t(45);
-
- function a(t, e) {
- return n.where(t, function (t) {
- return t.position === e
- })
- }
+ Color.prototype = {
+ isValid: function () {
+ return this.valid;
+ },
+ rgb: function () {
+ return this.setSpace('rgb', arguments);
+ },
+ hsl: function () {
+ return this.setSpace('hsl', arguments);
+ },
+ hsv: function () {
+ return this.setSpace('hsv', arguments);
+ },
+ hwb: function () {
+ return this.setSpace('hwb', arguments);
+ },
+ cmyk: function () {
+ return this.setSpace('cmyk', arguments);
+ },
- function r(t, e) {
- t.forEach(function (t, e) {
- return t._tmpIndex_ = e, t
- }), t.sort(function (t, i) {
- var n = e ? i : t, a = e ? t : i;
- return n.weight === a.weight ? n._tmpIndex_ - a._tmpIndex_ : n.weight - a.weight
- }), t.forEach(function (t) {
- delete t._tmpIndex_
- })
- }
+ rgbArray: function () {
+ return this.values.rgb;
+ },
+ hslArray: function () {
+ return this.values.hsl;
+ },
+ hsvArray: function () {
+ return this.values.hsv;
+ },
+ hwbArray: function () {
+ var values = this.values;
+ if (values.alpha !== 1) {
+ return values.hwb.concat([values.alpha]);
+ }
+ return values.hwb;
+ },
+ cmykArray: function () {
+ return this.values.cmyk;
+ },
+ rgbaArray: function () {
+ var values = this.values;
+ return values.rgb.concat([values.alpha]);
+ },
+ hslaArray: function () {
+ var values = this.values;
+ return values.hsl.concat([values.alpha]);
+ },
+ alpha: function (val) {
+ if (val === undefined) {
+ return this.values.alpha;
+ }
+ this.setValues('alpha', val);
+ return this;
+ },
- e.exports = {
- defaults: {}, addBox: function (t, e) {
- t.boxes || (t.boxes = []), e.fullWidth = e.fullWidth || !1, e.position = e.position || "top", e.weight = e.weight || 0, t.boxes.push(e)
- }, removeBox: function (t, e) {
- var i = t.boxes ? t.boxes.indexOf(e) : -1;
- -1 !== i && t.boxes.splice(i, 1)
- }, configure: function (t, e, i) {
- for (var n, a = ["fullWidth", "position", "weight"], r = a.length, o = 0; o < r; ++o) n = a[o], i.hasOwnProperty(n) && (e[n] = i[n])
- }, update: function (t, e, i) {
- if (t) {
- var o = t.options.layout || {}, s = n.options.toPadding(o.padding), l = s.left, u = s.right,
- d = s.top, h = s.bottom, c = a(t.boxes, "left"), f = a(t.boxes, "right"),
- g = a(t.boxes, "top"), m = a(t.boxes, "bottom"), p = a(t.boxes, "chartArea");
- r(c, !0), r(f, !1), r(g, !0), r(m, !1);
- var v = e - l - u, y = i - d - h, b = y / 2, x = (e - v / 2) / (c.length + f.length),
- _ = (i - b) / (g.length + m.length), k = v, w = y, M = [];
- n.each(c.concat(f, g, m), function (t) {
- var e, i = t.isHorizontal();
- i ? (e = t.update(t.fullWidth ? v : k, _), w -= e.height) : (e = t.update(x, w), k -= e.width), M.push({
- horizontal: i,
- minSize: e,
- box: t
- })
- });
- var S = 0, D = 0, C = 0, P = 0;
- n.each(g.concat(m), function (t) {
- if (t.getPadding) {
- var e = t.getPadding();
- S = Math.max(S, e.left), D = Math.max(D, e.right)
- }
- }), n.each(c.concat(f), function (t) {
- if (t.getPadding) {
- var e = t.getPadding();
- C = Math.max(C, e.top), P = Math.max(P, e.bottom)
- }
- });
- var T = l, O = u, I = d, A = h;
- n.each(c.concat(f), z), n.each(c, function (t) {
- T += t.width
- }), n.each(f, function (t) {
- O += t.width
- }), n.each(g.concat(m), z), n.each(g, function (t) {
- I += t.height
- }), n.each(m, function (t) {
- A += t.height
- }), n.each(c.concat(f), function (t) {
- var e = n.findNextWhere(M, function (e) {
- return e.box === t
- }), i = {left: 0, right: 0, top: I, bottom: A};
- e && t.update(e.minSize.width, w, i)
- }), T = l, O = u, I = d, A = h, n.each(c, function (t) {
- T += t.width
- }), n.each(f, function (t) {
- O += t.width
- }), n.each(g, function (t) {
- I += t.height
- }), n.each(m, function (t) {
- A += t.height
- });
- var F = Math.max(S - T, 0);
- T += F, O += Math.max(D - O, 0);
- var R = Math.max(C - I, 0);
- I += R, A += Math.max(P - A, 0);
- var L = i - I - A, W = e - T - O;
- W === k && L === w || (n.each(c, function (t) {
- t.height = L
- }), n.each(f, function (t) {
- t.height = L
- }), n.each(g, function (t) {
- t.fullWidth || (t.width = W)
- }), n.each(m, function (t) {
- t.fullWidth || (t.width = W)
- }), w = L, k = W);
- var Y = l + F, N = d + R;
- n.each(c.concat(g), H), Y += k, N += w, n.each(f, H), n.each(m, H), t.chartArea = {
- left: T,
- top: I,
- right: T + k,
- bottom: I + w
- }, n.each(p, function (e) {
- e.left = t.chartArea.left, e.top = t.chartArea.top, e.right = t.chartArea.right, e.bottom = t.chartArea.bottom, e.update(k, w)
- })
- }
-
- function z(t) {
- var e = n.findNextWhere(M, function (e) {
- return e.box === t
- });
- if (e) if (t.isHorizontal()) {
- var i = {left: Math.max(T, S), right: Math.max(O, D), top: 0, bottom: 0};
- t.update(t.fullWidth ? v : k, y / 2, i)
- } else t.update(e.minSize.width, w)
- }
-
- function H(t) {
- t.isHorizontal() ? (t.left = t.fullWidth ? l : T, t.right = t.fullWidth ? e - u : T + k, t.top = N, t.bottom = N + t.height, N = t.bottom) : (t.left = Y, t.right = Y + t.width, t.top = I, t.bottom = I + w, Y = t.right)
- }
- }
- }
- }, {45: 45}], 31: [function (t, e, i) {
- "use strict";
- var n = t(25), a = t(45);
- n._set("global", {plugins: {}}), e.exports = {
- _plugins: [], _cacheId: 0, register: function (t) {
- var e = this._plugins;
- [].concat(t).forEach(function (t) {
- -1 === e.indexOf(t) && e.push(t)
- }), this._cacheId++
- }, unregister: function (t) {
- var e = this._plugins;
- [].concat(t).forEach(function (t) {
- var i = e.indexOf(t);
- -1 !== i && e.splice(i, 1)
- }), this._cacheId++
- }, clear: function () {
- this._plugins = [], this._cacheId++
- }, count: function () {
- return this._plugins.length
- }, getAll: function () {
- return this._plugins
- }, notify: function (t, e, i) {
- var n, a, r, o, s, l = this.descriptors(t), u = l.length;
- for (n = 0; n < u; ++n) if ("function" == typeof(s = (r = (a = l[n]).plugin)[e]) && ((o = [t].concat(i || [])).push(a.options), !1 === s.apply(r, o))) return !1;
- return !0
- }, descriptors: function (t) {
- var e = t.$plugins || (t.$plugins = {});
- if (e.id === this._cacheId) return e.descriptors;
- var i = [], r = [], o = t && t.config || {}, s = o.options && o.options.plugins || {};
- return this._plugins.concat(o.plugins || []).forEach(function (t) {
- if (-1 === i.indexOf(t)) {
- var e = t.id, o = s[e];
- !1 !== o && (!0 === o && (o = a.clone(n.global.plugins[e])), i.push(t), r.push({
- plugin: t,
- options: o || {}
- }))
- }
- }), e.descriptors = r, e.id = this._cacheId, r
- }, _invalidate: function (t) {
- delete t.$plugins
- }
- }
- }, {25: 25, 45: 45}], 32: [function (t, e, i) {
- "use strict";
- var n = t(25), a = t(26), r = t(45), o = t(34);
-
- function s(t) {
- var e, i, n = [];
- for (e = 0, i = t.length; e < i; ++e) n.push(t[e].label);
- return n
- }
+ red: function (val) {
+ return this.setChannel('rgb', 0, val);
+ },
+ green: function (val) {
+ return this.setChannel('rgb', 1, val);
+ },
+ blue: function (val) {
+ return this.setChannel('rgb', 2, val);
+ },
+ hue: function (val) {
+ if (val) {
+ val %= 360;
+ val = val < 0 ? 360 + val : val;
+ }
+ return this.setChannel('hsl', 0, val);
+ },
+ saturation: function (val) {
+ return this.setChannel('hsl', 1, val);
+ },
+ lightness: function (val) {
+ return this.setChannel('hsl', 2, val);
+ },
+ saturationv: function (val) {
+ return this.setChannel('hsv', 1, val);
+ },
+ whiteness: function (val) {
+ return this.setChannel('hwb', 1, val);
+ },
+ blackness: function (val) {
+ return this.setChannel('hwb', 2, val);
+ },
+ value: function (val) {
+ return this.setChannel('hsv', 2, val);
+ },
+ cyan: function (val) {
+ return this.setChannel('cmyk', 0, val);
+ },
+ magenta: function (val) {
+ return this.setChannel('cmyk', 1, val);
+ },
+ yellow: function (val) {
+ return this.setChannel('cmyk', 2, val);
+ },
+ black: function (val) {
+ return this.setChannel('cmyk', 3, val);
+ },
- function l(t, e, i) {
- var n = t.getPixelForTick(e);
- return i && (n -= 0 === e ? (t.getPixelForTick(1) - n) / 2 : (n - t.getPixelForTick(e - 1)) / 2), n
- }
+ hexString: function () {
+ return colorString.hexString(this.values.rgb);
+ },
+ rgbString: function () {
+ return colorString.rgbString(this.values.rgb, this.values.alpha);
+ },
+ rgbaString: function () {
+ return colorString.rgbaString(this.values.rgb, this.values.alpha);
+ },
+ percentString: function () {
+ return colorString.percentString(this.values.rgb, this.values.alpha);
+ },
+ hslString: function () {
+ return colorString.hslString(this.values.hsl, this.values.alpha);
+ },
+ hslaString: function () {
+ return colorString.hslaString(this.values.hsl, this.values.alpha);
+ },
+ hwbString: function () {
+ return colorString.hwbString(this.values.hwb, this.values.alpha);
+ },
+ keyword: function () {
+ return colorString.keyword(this.values.rgb, this.values.alpha);
+ },
- n._set("scale", {
- display: !0,
- position: "left",
- offset: !1,
- gridLines: {
- display: !0,
- color: "rgba(0, 0, 0, 0.1)",
- lineWidth: 1,
- drawBorder: !0,
- drawOnChartArea: !0,
- drawTicks: !0,
- tickMarkLength: 10,
- zeroLineWidth: 1,
- zeroLineColor: "rgba(0,0,0,0.25)",
- zeroLineBorderDash: [],
- zeroLineBorderDashOffset: 0,
- offsetGridLines: !1,
- borderDash: [],
- borderDashOffset: 0
- },
- scaleLabel: {display: !1, labelString: "", lineHeight: 1.2, padding: {top: 4, bottom: 4}},
- ticks: {
- beginAtZero: !1,
- minRotation: 0,
- maxRotation: 50,
- mirror: !1,
- padding: 0,
- reverse: !1,
- display: !0,
- autoSkip: !0,
- autoSkipPadding: 0,
- labelOffset: 0,
- callback: o.formatters.values,
- minor: {},
- major: {}
- }
- }), e.exports = function (t) {
- function e(t, e, i) {
- return r.isArray(e) ? r.longestText(t, i, e) : t.measureText(e).width
- }
+ rgbNumber: function () {
+ var rgb = this.values.rgb;
+ return (rgb[0] << 16) | (rgb[1] << 8) | rgb[2];
+ },
- function i(t) {
- var e = r.valueOrDefault, i = n.global, a = e(t.fontSize, i.defaultFontSize),
- o = e(t.fontStyle, i.defaultFontStyle), s = e(t.fontFamily, i.defaultFontFamily);
- return {size: a, style: o, family: s, font: r.fontString(a, o, s)}
- }
+ luminosity: function () {
+ // http://www.w3.org/TR/WCAG20/#relativeluminancedef
+ var rgb = this.values.rgb;
+ var lum = [];
+ for (var i = 0; i < rgb.length; i++) {
+ var chan = rgb[i] / 255;
+ lum[i] = (chan <= 0.03928) ? chan / 12.92 : Math.pow(((chan + 0.055) / 1.055), 2.4);
+ }
+ return 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2];
+ },
- function o(t) {
- return r.options.toLineHeight(r.valueOrDefault(t.lineHeight, 1.2), r.valueOrDefault(t.fontSize, n.global.defaultFontSize))
- }
+ contrast: function (color2) {
+ // http://www.w3.org/TR/WCAG20/#contrast-ratiodef
+ var lum1 = this.luminosity();
+ var lum2 = color2.luminosity();
+ if (lum1 > lum2) {
+ return (lum1 + 0.05) / (lum2 + 0.05);
+ }
+ return (lum2 + 0.05) / (lum1 + 0.05);
+ },
- t.Scale = a.extend({
- getPadding: function () {
- return {
- left: this.paddingLeft || 0,
- top: this.paddingTop || 0,
- right: this.paddingRight || 0,
- bottom: this.paddingBottom || 0
- }
- },
- getTicks: function () {
- return this._ticks
- },
- mergeTicksOptions: function () {
- var t = this.options.ticks;
- for (var e in!1 === t.minor && (t.minor = {display: !1}), !1 === t.major && (t.major = {display: !1}), t) "major" !== e && "minor" !== e && (void 0 === t.minor[e] && (t.minor[e] = t[e]), void 0 === t.major[e] && (t.major[e] = t[e]))
- },
- beforeUpdate: function () {
- r.callback(this.options.beforeUpdate, [this])
- },
- update: function (t, e, i) {
- var n, a, o, s, l, u, d = this;
- for (d.beforeUpdate(), d.maxWidth = t, d.maxHeight = e, d.margins = r.extend({
- left: 0,
- right: 0,
- top: 0,
- bottom: 0
- }, i), d.longestTextCache = d.longestTextCache || {}, d.beforeSetDimensions(), d.setDimensions(), d.afterSetDimensions(), d.beforeDataLimits(), d.determineDataLimits(), d.afterDataLimits(), d.beforeBuildTicks(), l = d.buildTicks() || [], d.afterBuildTicks(), d.beforeTickToLabelConversion(), o = d.convertTicksToLabels(l) || d.ticks, d.afterTickToLabelConversion(), d.ticks = o, n = 0, a = o.length; n < a; ++n) s = o[n], (u = l[n]) ? u.label = s : l.push(u = {
- label: s,
- major: !1
- });
- return d._ticks = l, d.beforeCalculateTickRotation(), d.calculateTickRotation(), d.afterCalculateTickRotation(), d.beforeFit(), d.fit(), d.afterFit(), d.afterUpdate(), d.minSize
- },
- afterUpdate: function () {
- r.callback(this.options.afterUpdate, [this])
- },
- beforeSetDimensions: function () {
- r.callback(this.options.beforeSetDimensions, [this])
- },
- setDimensions: function () {
- var t = this;
- t.isHorizontal() ? (t.width = t.maxWidth, t.left = 0, t.right = t.width) : (t.height = t.maxHeight, t.top = 0, t.bottom = t.height), t.paddingLeft = 0, t.paddingTop = 0, t.paddingRight = 0, t.paddingBottom = 0
- },
- afterSetDimensions: function () {
- r.callback(this.options.afterSetDimensions, [this])
- },
- beforeDataLimits: function () {
- r.callback(this.options.beforeDataLimits, [this])
- },
- determineDataLimits: r.noop,
- afterDataLimits: function () {
- r.callback(this.options.afterDataLimits, [this])
- },
- beforeBuildTicks: function () {
- r.callback(this.options.beforeBuildTicks, [this])
- },
- buildTicks: r.noop,
- afterBuildTicks: function () {
- r.callback(this.options.afterBuildTicks, [this])
- },
- beforeTickToLabelConversion: function () {
- r.callback(this.options.beforeTickToLabelConversion, [this])
- },
- convertTicksToLabels: function () {
- var t = this.options.ticks;
- this.ticks = this.ticks.map(t.userCallback || t.callback, this)
- },
- afterTickToLabelConversion: function () {
- r.callback(this.options.afterTickToLabelConversion, [this])
- },
- beforeCalculateTickRotation: function () {
- r.callback(this.options.beforeCalculateTickRotation, [this])
- },
- calculateTickRotation: function () {
- var t = this, e = t.ctx, n = t.options.ticks, a = s(t._ticks), o = i(n);
- e.font = o.font;
- var l = n.minRotation || 0;
- if (a.length && t.options.display && t.isHorizontal()) for (var u, d = r.longestText(e, o.font, a, t.longestTextCache), h = d, c = t.getPixelForTick(1) - t.getPixelForTick(0) - 6; h > c && l < n.maxRotation;) {
- var f = r.toRadians(l);
- if (u = Math.cos(f), Math.sin(f) * d > t.maxHeight) {
- l--;
- break
- }
- l++, h = u * d
- }
- t.labelRotation = l
- },
- afterCalculateTickRotation: function () {
- r.callback(this.options.afterCalculateTickRotation, [this])
- },
- beforeFit: function () {
- r.callback(this.options.beforeFit, [this])
- },
- fit: function () {
- var t = this, n = t.minSize = {width: 0, height: 0}, a = s(t._ticks), l = t.options,
- u = l.ticks, d = l.scaleLabel, h = l.gridLines, c = l.display, f = t.isHorizontal(),
- g = i(u), m = l.gridLines.tickMarkLength;
- if (n.width = f ? t.isFullWidth() ? t.maxWidth - t.margins.left - t.margins.right : t.maxWidth : c && h.drawTicks ? m : 0, n.height = f ? c && h.drawTicks ? m : 0 : t.maxHeight, d.display && c) {
- var p = o(d) + r.options.toPadding(d.padding).height;
- f ? n.height += p : n.width += p
- }
- if (u.display && c) {
- var v = r.longestText(t.ctx, g.font, a, t.longestTextCache), y = r.numberOfLabelLines(a),
- b = .5 * g.size, x = t.options.ticks.padding;
- if (f) {
- t.longestLabelWidth = v;
- var _ = r.toRadians(t.labelRotation), k = Math.cos(_),
- w = Math.sin(_) * v + g.size * y + b * (y - 1) + b;
- n.height = Math.min(t.maxHeight, n.height + w + x), t.ctx.font = g.font;
- var M = e(t.ctx, a[0], g.font), S = e(t.ctx, a[a.length - 1], g.font);
- 0 !== t.labelRotation ? (t.paddingLeft = "bottom" === l.position ? k * M + 3 : k * b + 3, t.paddingRight = "bottom" === l.position ? k * b + 3 : k * S + 3) : (t.paddingLeft = M / 2 + 3, t.paddingRight = S / 2 + 3)
- } else u.mirror ? v = 0 : v += x + b, n.width = Math.min(t.maxWidth, n.width + v), t.paddingTop = g.size / 2, t.paddingBottom = g.size / 2
- }
- t.handleMargins(), t.width = n.width, t.height = n.height
- },
- handleMargins: function () {
- var t = this;
- t.margins && (t.paddingLeft = Math.max(t.paddingLeft - t.margins.left, 0), t.paddingTop = Math.max(t.paddingTop - t.margins.top, 0), t.paddingRight = Math.max(t.paddingRight - t.margins.right, 0), t.paddingBottom = Math.max(t.paddingBottom - t.margins.bottom, 0))
- },
- afterFit: function () {
- r.callback(this.options.afterFit, [this])
- },
- isHorizontal: function () {
- return "top" === this.options.position || "bottom" === this.options.position
- },
- isFullWidth: function () {
- return this.options.fullWidth
- },
- getRightValue: function (t) {
- if (r.isNullOrUndef(t)) return NaN;
- if ("number" == typeof t && !isFinite(t)) return NaN;
- if (t) if (this.isHorizontal()) {
- if (void 0 !== t.x) return this.getRightValue(t.x)
- } else if (void 0 !== t.y) return this.getRightValue(t.y);
- return t
- },
- getLabelForIndex: r.noop,
- getPixelForValue: r.noop,
- getValueForPixel: r.noop,
- getPixelForTick: function (t) {
- var e = this, i = e.options.offset;
- if (e.isHorizontal()) {
- var n = (e.width - (e.paddingLeft + e.paddingRight)) / Math.max(e._ticks.length - (i ? 0 : 1), 1),
- a = n * t + e.paddingLeft;
- i && (a += n / 2);
- var r = e.left + Math.round(a);
- return r += e.isFullWidth() ? e.margins.left : 0
- }
- var o = e.height - (e.paddingTop + e.paddingBottom);
- return e.top + t * (o / (e._ticks.length - 1))
- },
- getPixelForDecimal: function (t) {
- var e = this;
- if (e.isHorizontal()) {
- var i = (e.width - (e.paddingLeft + e.paddingRight)) * t + e.paddingLeft,
- n = e.left + Math.round(i);
- return n += e.isFullWidth() ? e.margins.left : 0
- }
- return e.top + t * e.height
- },
- getBasePixel: function () {
- return this.getPixelForValue(this.getBaseValue())
- },
- getBaseValue: function () {
- var t = this.min, e = this.max;
- return this.beginAtZero ? 0 : t < 0 && e < 0 ? e : t > 0 && e > 0 ? t : 0
- },
- _autoSkip: function (t) {
- var e, i, n, a, o = this, s = o.isHorizontal(), l = o.options.ticks.minor, u = t.length,
- d = r.toRadians(o.labelRotation), h = Math.cos(d), c = o.longestLabelWidth * h, f = [];
- for (l.maxTicksLimit && (a = l.maxTicksLimit), s && (e = !1, (c + l.autoSkipPadding) * u > o.width - (o.paddingLeft + o.paddingRight) && (e = 1 + Math.floor((c + l.autoSkipPadding) * u / (o.width - (o.paddingLeft + o.paddingRight)))), a && u > a && (e = Math.max(e, Math.floor(u / a)))), i = 0; i < u; i++) n = t[i], (e > 1 && i % e > 0 || i % e == 0 && i + e >= u) && i !== u - 1 && delete n.label, f.push(n);
- return f
- },
- draw: function (t) {
- var e = this, a = e.options;
- if (a.display) {
- var s = e.ctx, u = n.global, d = a.ticks.minor, h = a.ticks.major || d, c = a.gridLines,
- f = a.scaleLabel, g = 0 !== e.labelRotation, m = e.isHorizontal(),
- p = d.autoSkip ? e._autoSkip(e.getTicks()) : e.getTicks(),
- v = r.valueOrDefault(d.fontColor, u.defaultFontColor), y = i(d),
- b = r.valueOrDefault(h.fontColor, u.defaultFontColor), x = i(h),
- _ = c.drawTicks ? c.tickMarkLength : 0,
- k = r.valueOrDefault(f.fontColor, u.defaultFontColor), w = i(f),
- M = r.options.toPadding(f.padding), S = r.toRadians(e.labelRotation), D = [],
- C = e.options.gridLines.lineWidth,
- P = "right" === a.position ? e.right : e.right - C - _,
- T = "right" === a.position ? e.right + _ : e.right,
- O = "bottom" === a.position ? e.top + C : e.bottom - _ - C,
- I = "bottom" === a.position ? e.top + C + _ : e.bottom + C;
- if (r.each(p, function (i, n) {
- if (!r.isNullOrUndef(i.label)) {
- var o, s, h, f, v, y, b, x, k, w, M, A, F, R, L = i.label;
- n === e.zeroLineIndex && a.offset === c.offsetGridLines ? (o = c.zeroLineWidth, s = c.zeroLineColor, h = c.zeroLineBorderDash, f = c.zeroLineBorderDashOffset) : (o = r.valueAtIndexOrDefault(c.lineWidth, n), s = r.valueAtIndexOrDefault(c.color, n), h = r.valueOrDefault(c.borderDash, u.borderDash), f = r.valueOrDefault(c.borderDashOffset, u.borderDashOffset));
- var W = "middle", Y = "middle", N = d.padding;
- if (m) {
- var z = _ + N;
- "bottom" === a.position ? (Y = g ? "middle" : "top", W = g ? "right" : "center", R = e.top + z) : (Y = g ? "middle" : "bottom", W = g ? "left" : "center", R = e.bottom - z);
- var H = l(e, n, c.offsetGridLines && p.length > 1);
- H < e.left && (s = "rgba(0,0,0,0)"), H += r.aliasPixel(o), F = e.getPixelForTick(n) + d.labelOffset, v = b = k = M = H, y = O, x = I, w = t.top, A = t.bottom + C
- } else {
- var V, B = "left" === a.position;
- d.mirror ? (W = B ? "left" : "right", V = N) : (W = B ? "right" : "left", V = _ + N), F = B ? e.right - V : e.left + V;
- var E = l(e, n, c.offsetGridLines && p.length > 1);
- E < e.top && (s = "rgba(0,0,0,0)"), E += r.aliasPixel(o), R = e.getPixelForTick(n) + d.labelOffset, v = P, b = T, k = t.left, M = t.right + C, y = x = w = A = E
- }
- D.push({
- tx1: v,
- ty1: y,
- tx2: b,
- ty2: x,
- x1: k,
- y1: w,
- x2: M,
- y2: A,
- labelX: F,
- labelY: R,
- glWidth: o,
- glColor: s,
- glBorderDash: h,
- glBorderDashOffset: f,
- rotation: -1 * S,
- label: L,
- major: i.major,
- textBaseline: Y,
- textAlign: W
- })
- }
- }), r.each(D, function (t) {
- if (c.display && (s.save(), s.lineWidth = t.glWidth, s.strokeStyle = t.glColor, s.setLineDash && (s.setLineDash(t.glBorderDash), s.lineDashOffset = t.glBorderDashOffset), s.beginPath(), c.drawTicks && (s.moveTo(t.tx1, t.ty1), s.lineTo(t.tx2, t.ty2)), c.drawOnChartArea && (s.moveTo(t.x1, t.y1), s.lineTo(t.x2, t.y2)), s.stroke(), s.restore()), d.display) {
- s.save(), s.translate(t.labelX, t.labelY), s.rotate(t.rotation), s.font = t.major ? x.font : y.font, s.fillStyle = t.major ? b : v, s.textBaseline = t.textBaseline, s.textAlign = t.textAlign;
- var i = t.label;
- if (r.isArray(i)) for (var n = i.length, a = 1.5 * y.size, o = e.isHorizontal() ? 0 : -a * (n - 1) / 2, l = 0; l < n; ++l) s.fillText("" + i[l], 0, o), o += a; else s.fillText(i, 0, 0);
- s.restore()
- }
- }), f.display) {
- var A, F, R = 0, L = o(f) / 2;
- if (m) A = e.left + (e.right - e.left) / 2, F = "bottom" === a.position ? e.bottom - L - M.bottom : e.top + L + M.top; else {
- var W = "left" === a.position;
- A = W ? e.left + L + M.top : e.right - L - M.top, F = e.top + (e.bottom - e.top) / 2, R = W ? -.5 * Math.PI : .5 * Math.PI
- }
- s.save(), s.translate(A, F), s.rotate(R), s.textAlign = "center", s.textBaseline = "middle", s.fillStyle = k, s.font = w.font, s.fillText(f.labelString, 0, 0), s.restore()
- }
- if (c.drawBorder) {
- s.lineWidth = r.valueAtIndexOrDefault(c.lineWidth, 0), s.strokeStyle = r.valueAtIndexOrDefault(c.color, 0);
- var Y = e.left, N = e.right + C, z = e.top, H = e.bottom + C,
- V = r.aliasPixel(s.lineWidth);
- m ? (z = H = "top" === a.position ? e.bottom : e.top, z += V, H += V) : (Y = N = "left" === a.position ? e.right : e.left, Y += V, N += V), s.beginPath(), s.moveTo(Y, z), s.lineTo(N, H), s.stroke()
- }
- }
- }
- })
- }
- }, {25: 25, 26: 26, 34: 34, 45: 45}], 33: [function (t, e, i) {
- "use strict";
- var n = t(25), a = t(45), r = t(30);
- e.exports = function (t) {
- t.scaleService = {
- constructors: {}, defaults: {}, registerScaleType: function (t, e, i) {
- this.constructors[t] = e, this.defaults[t] = a.clone(i)
- }, getScaleConstructor: function (t) {
- return this.constructors.hasOwnProperty(t) ? this.constructors[t] : void 0
- }, getScaleDefaults: function (t) {
- return this.defaults.hasOwnProperty(t) ? a.merge({}, [n.scale, this.defaults[t]]) : {}
- }, updateScaleDefaults: function (t, e) {
- this.defaults.hasOwnProperty(t) && (this.defaults[t] = a.extend(this.defaults[t], e))
- }, addScalesToLayout: function (t) {
- a.each(t.scales, function (e) {
- e.fullWidth = e.options.fullWidth, e.position = e.options.position, e.weight = e.options.weight, r.addBox(t, e)
- })
- }
- }
- }
- }, {25: 25, 30: 30, 45: 45}], 34: [function (t, e, i) {
- "use strict";
- var n = t(45);
- e.exports = {
- formatters: {
- values: function (t) {
- return n.isArray(t) ? t : "" + t
- }, linear: function (t, e, i) {
- var a = i.length > 3 ? i[2] - i[1] : i[1] - i[0];
- Math.abs(a) > 1 && t !== Math.floor(t) && (a = t - Math.floor(t));
- var r = n.log10(Math.abs(a)), o = "";
- if (0 !== t) {
- var s = -1 * Math.floor(r);
- s = Math.max(Math.min(s, 20), 0), o = t.toFixed(s)
- } else o = "0";
- return o
- }, logarithmic: function (t, e, i) {
- var a = t / Math.pow(10, Math.floor(n.log10(t)));
- return 0 === t ? "0" : 1 === a || 2 === a || 5 === a || 0 === e || e === i.length - 1 ? t.toExponential() : ""
- }
- }
+ level: function (color2) {
+ var contrastRatio = this.contrast(color2);
+ if (contrastRatio >= 7.1) {
+ return 'AAA';
+ }
+
+ return (contrastRatio >= 4.5) ? 'AA' : '';
+ },
+
+ dark: function () {
+ // YIQ equation from http://24ways.org/2010/calculating-color-contrast
+ var rgb = this.values.rgb;
+ var yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000;
+ return yiq < 128;
+ },
+
+ light: function () {
+ return !this.dark();
+ },
+
+ negate: function () {
+ var rgb = [];
+ for (var i = 0; i < 3; i++) {
+ rgb[i] = 255 - this.values.rgb[i];
+ }
+ this.setValues('rgb', rgb);
+ return this;
+ },
+
+ lighten: function (ratio) {
+ var hsl = this.values.hsl;
+ hsl[2] += hsl[2] * ratio;
+ this.setValues('hsl', hsl);
+ return this;
+ },
+
+ darken: function (ratio) {
+ var hsl = this.values.hsl;
+ hsl[2] -= hsl[2] * ratio;
+ this.setValues('hsl', hsl);
+ return this;
+ },
+
+ saturate: function (ratio) {
+ var hsl = this.values.hsl;
+ hsl[1] += hsl[1] * ratio;
+ this.setValues('hsl', hsl);
+ return this;
+ },
+
+ desaturate: function (ratio) {
+ var hsl = this.values.hsl;
+ hsl[1] -= hsl[1] * ratio;
+ this.setValues('hsl', hsl);
+ return this;
+ },
+
+ whiten: function (ratio) {
+ var hwb = this.values.hwb;
+ hwb[1] += hwb[1] * ratio;
+ this.setValues('hwb', hwb);
+ return this;
+ },
+
+ blacken: function (ratio) {
+ var hwb = this.values.hwb;
+ hwb[2] += hwb[2] * ratio;
+ this.setValues('hwb', hwb);
+ return this;
+ },
+
+ greyscale: function () {
+ var rgb = this.values.rgb;
+ // http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale
+ var val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11;
+ this.setValues('rgb', [val, val, val]);
+ return this;
+ },
+
+ clearer: function (ratio) {
+ var alpha = this.values.alpha;
+ this.setValues('alpha', alpha - (alpha * ratio));
+ return this;
+ },
+
+ opaquer: function (ratio) {
+ var alpha = this.values.alpha;
+ this.setValues('alpha', alpha + (alpha * ratio));
+ return this;
+ },
+
+ rotate: function (degrees) {
+ var hsl = this.values.hsl;
+ var hue = (hsl[0] + degrees) % 360;
+ hsl[0] = hue < 0 ? 360 + hue : hue;
+ this.setValues('hsl', hsl);
+ return this;
+ },
+
+ /**
+ * Ported from sass implementation in C
+ * https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209
+ */
+ mix: function (mixinColor, weight) {
+ var color1 = this;
+ var color2 = mixinColor;
+ var p = weight === undefined ? 0.5 : weight;
+
+ var w = 2 * p - 1;
+ var a = color1.alpha() - color2.alpha();
+
+ var w1 = (((w * a === -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0;
+ var w2 = 1 - w1;
+
+ return this
+ .rgb(
+ w1 * color1.red() + w2 * color2.red(),
+ w1 * color1.green() + w2 * color2.green(),
+ w1 * color1.blue() + w2 * color2.blue()
+ )
+ .alpha(color1.alpha() * p + color2.alpha() * (1 - p));
+ },
+
+ toJSON: function () {
+ return this.rgb();
+ },
+
+ clone: function () {
+ // NOTE(SB): using node-clone creates a dependency to Buffer when using browserify,
+ // making the final build way to big to embed in Chart.js. So let's do it manually,
+ // assuming that values to clone are 1 dimension arrays containing only numbers,
+ // except 'alpha' which is a number.
+ var result = new Color();
+ var source = this.values;
+ var target = result.values;
+ var value, type;
+
+ for (var prop in source) {
+ if (source.hasOwnProperty(prop)) {
+ value = source[prop];
+ type = ({}).toString.call(value);
+ if (type === '[object Array]') {
+ target[prop] = value.slice(0);
+ } else if (type === '[object Number]') {
+ target[prop] = value;
+ } else {
+ console.error('unexpected color value:', value);
+ }
+ }
+ }
+
+ return result;
+ }
+ };
+
+ Color.prototype.spaces = {
+ rgb: ['red', 'green', 'blue'],
+ hsl: ['hue', 'saturation', 'lightness'],
+ hsv: ['hue', 'saturation', 'value'],
+ hwb: ['hue', 'whiteness', 'blackness'],
+ cmyk: ['cyan', 'magenta', 'yellow', 'black']
+ };
+
+ Color.prototype.maxes = {
+ rgb: [255, 255, 255],
+ hsl: [360, 100, 100],
+ hsv: [360, 100, 100],
+ hwb: [360, 100, 100],
+ cmyk: [100, 100, 100, 100]
+ };
+
+ Color.prototype.getValues = function (space) {
+ var values = this.values;
+ var vals = {};
+
+ for (var i = 0; i < space.length; i++) {
+ vals[space.charAt(i)] = values[space][i];
+ }
+
+ if (values.alpha !== 1) {
+ vals.a = values.alpha;
+ }
+
+ // {r: 255, g: 255, b: 255, a: 0.4}
+ return vals;
+ };
+
+ Color.prototype.setValues = function (space, vals) {
+ var values = this.values;
+ var spaces = this.spaces;
+ var maxes = this.maxes;
+ var alpha = 1;
+ var i;
+
+ this.valid = true;
+
+ if (space === 'alpha') {
+ alpha = vals;
+ } else if (vals.length) {
+ // [10, 10, 10]
+ values[space] = vals.slice(0, space.length);
+ alpha = vals[space.length];
+ } else if (vals[space.charAt(0)] !== undefined) {
+ // {r: 10, g: 10, b: 10}
+ for (i = 0; i < space.length; i++) {
+ values[space][i] = vals[space.charAt(i)];
+ }
+
+ alpha = vals.a;
+ } else if (vals[spaces[space][0]] !== undefined) {
+ // {red: 10, green: 10, blue: 10}
+ var chans = spaces[space];
+
+ for (i = 0; i < space.length; i++) {
+ values[space][i] = vals[chans[i]];
+ }
+
+ alpha = vals.alpha;
+ }
+
+ values.alpha = Math.max(0, Math.min(1, (alpha === undefined ? values.alpha : alpha)));
+
+ if (space === 'alpha') {
+ return false;
+ }
+
+ var capped;
+
+ // cap values of the space prior converting all values
+ for (i = 0; i < space.length; i++) {
+ capped = Math.max(0, Math.min(maxes[space][i], values[space][i]));
+ values[space][i] = Math.round(capped);
+ }
+
+ // convert to all the other color spaces
+ for (var sname in spaces) {
+ if (sname !== space) {
+ values[sname] = colorConvert[space][sname](values[space]);
+ }
+ }
+
+ return true;
+ };
+
+ Color.prototype.setSpace = function (space, args) {
+ var vals = args[0];
+
+ if (vals === undefined) {
+ // color.rgb()
+ return this.getValues(space);
+ }
+
+ // color.rgb(10, 10, 10)
+ if (typeof vals === 'number') {
+ vals = Array.prototype.slice.call(args);
+ }
+
+ this.setValues(space, vals);
+ return this;
+ };
+
+ Color.prototype.setChannel = function (space, index, val) {
+ var svalues = this.values[space];
+ if (val === undefined) {
+ // color.red()
+ return svalues[index];
+ } else if (val === svalues[index]) {
+ // color.red(color.red())
+ return this;
+ }
+
+ // color.red(100)
+ svalues[index] = val;
+ this.setValues(space, svalues);
+
+ return this;
+ };
+
+ if (typeof window !== 'undefined') {
+ window.Color = Color;
+ }
+
+ var chartjsColor = Color;
+
+ /**
+ * @namespace Chart.helpers
+ */
+ var helpers = {
+ /**
+ * An empty function that can be used, for example, for optional callback.
+ */
+ noop: function () {
+ },
+
+ /**
+ * Returns a unique id, sequentially generated from a global variable.
+ * @returns {number}
+ * @function
+ */
+ uid: (function () {
+ var id = 0;
+ return function () {
+ return id++;
+ };
+ }()),
+
+ /**
+ * Returns true if `value` is neither null nor undefined, else returns false.
+ * @param {*} value - The value to test.
+ * @returns {boolean}
+ * @since 2.7.0
+ */
+ isNullOrUndef: function (value) {
+ return value === null || typeof value === 'undefined';
+ },
+
+ /**
+ * Returns true if `value` is an array (including typed arrays), else returns false.
+ * @param {*} value - The value to test.
+ * @returns {boolean}
+ * @function
+ */
+ isArray: function (value) {
+ if (Array.isArray && Array.isArray(value)) {
+ return true;
+ }
+ var type = Object.prototype.toString.call(value);
+ if (type.substr(0, 7) === '[object' && type.substr(-6) === 'Array]') {
+ return true;
+ }
+ return false;
+ },
+
+ /**
+ * Returns true if `value` is an object (excluding null), else returns false.
+ * @param {*} value - The value to test.
+ * @returns {boolean}
+ * @since 2.7.0
+ */
+ isObject: function (value) {
+ return value !== null && Object.prototype.toString.call(value) === '[object Object]';
+ },
+
+ /**
+ * Returns true if `value` is a finite number, else returns false
+ * @param {*} value - The value to test.
+ * @returns {boolean}
+ */
+ isFinite: function (value) {
+ return (typeof value === 'number' || value instanceof Number) && isFinite(value);
+ },
+
+ /**
+ * Returns `value` if defined, else returns `defaultValue`.
+ * @param {*} value - The value to return if defined.
+ * @param {*} defaultValue - The value to return if `value` is undefined.
+ * @returns {*}
+ */
+ valueOrDefault: function (value, defaultValue) {
+ return typeof value === 'undefined' ? defaultValue : value;
+ },
+
+ /**
+ * Returns value at the given `index` in array if defined, else returns `defaultValue`.
+ * @param {Array} value - The array to lookup for value at `index`.
+ * @param {number} index - The index in `value` to lookup for value.
+ * @param {*} defaultValue - The value to return if `value[index]` is undefined.
+ * @returns {*}
+ */
+ valueAtIndexOrDefault: function (value, index, defaultValue) {
+ return helpers.valueOrDefault(helpers.isArray(value) ? value[index] : value, defaultValue);
+ },
+
+ /**
+ * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the
+ * value returned by `fn`. If `fn` is not a function, this method returns undefined.
+ * @param {function} fn - The function to call.
+ * @param {Array|undefined|null} args - The arguments with which `fn` should be called.
+ * @param {object} [thisArg] - The value of `this` provided for the call to `fn`.
+ * @returns {*}
+ */
+ callback: function (fn, args, thisArg) {
+ if (fn && typeof fn.call === 'function') {
+ return fn.apply(thisArg, args);
+ }
+ },
+
+ /**
+ * Note(SB) for performance sake, this method should only be used when loopable type
+ * is unknown or in none intensive code (not called often and small loopable). Else
+ * it's preferable to use a regular for() loop and save extra function calls.
+ * @param {object|Array} loopable - The object or array to be iterated.
+ * @param {function} fn - The function to call for each item.
+ * @param {object} [thisArg] - The value of `this` provided for the call to `fn`.
+ * @param {boolean} [reverse] - If true, iterates backward on the loopable.
+ */
+ each: function (loopable, fn, thisArg, reverse) {
+ var i, len, keys;
+ if (helpers.isArray(loopable)) {
+ len = loopable.length;
+ if (reverse) {
+ for (i = len - 1; i >= 0; i--) {
+ fn.call(thisArg, loopable[i], i);
+ }
+ } else {
+ for (i = 0; i < len; i++) {
+ fn.call(thisArg, loopable[i], i);
+ }
+ }
+ } else if (helpers.isObject(loopable)) {
+ keys = Object.keys(loopable);
+ len = keys.length;
+ for (i = 0; i < len; i++) {
+ fn.call(thisArg, loopable[keys[i]], keys[i]);
+ }
+ }
+ },
+
+ /**
+ * Returns true if the `a0` and `a1` arrays have the same content, else returns false.
+ * @see https://stackoverflow.com/a/14853974
+ * @param {Array} a0 - The array to compare
+ * @param {Array} a1 - The array to compare
+ * @returns {boolean}
+ */
+ arrayEquals: function (a0, a1) {
+ var i, ilen, v0, v1;
+
+ if (!a0 || !a1 || a0.length !== a1.length) {
+ return false;
+ }
+
+ for (i = 0, ilen = a0.length; i < ilen; ++i) {
+ v0 = a0[i];
+ v1 = a1[i];
+
+ if (v0 instanceof Array && v1 instanceof Array) {
+ if (!helpers.arrayEquals(v0, v1)) {
+ return false;
+ }
+ } else if (v0 !== v1) {
+ // NOTE: two different object instances will never be equal: {x:20} != {x:20}
+ return false;
+ }
+ }
+
+ return true;
+ },
+
+ /**
+ * Returns a deep copy of `source` without keeping references on objects and arrays.
+ * @param {*} source - The value to clone.
+ * @returns {*}
+ */
+ clone: function (source) {
+ if (helpers.isArray(source)) {
+ return source.map(helpers.clone);
+ }
+
+ if (helpers.isObject(source)) {
+ var target = {};
+ var keys = Object.keys(source);
+ var klen = keys.length;
+ var k = 0;
+
+ for (; k < klen; ++k) {
+ target[keys[k]] = helpers.clone(source[keys[k]]);
+ }
+
+ return target;
+ }
+
+ return source;
+ },
+
+ /**
+ * The default merger when Chart.helpers.merge is called without merger option.
+ * Note(SB): also used by mergeConfig and mergeScaleConfig as fallback.
+ * @private
+ */
+ _merger: function (key, target, source, options) {
+ var tval = target[key];
+ var sval = source[key];
+
+ if (helpers.isObject(tval) && helpers.isObject(sval)) {
+ helpers.merge(tval, sval, options);
+ } else {
+ target[key] = helpers.clone(sval);
+ }
+ },
+
+ /**
+ * Merges source[key] in target[key] only if target[key] is undefined.
+ * @private
+ */
+ _mergerIf: function (key, target, source) {
+ var tval = target[key];
+ var sval = source[key];
+
+ if (helpers.isObject(tval) && helpers.isObject(sval)) {
+ helpers.mergeIf(tval, sval);
+ } else if (!target.hasOwnProperty(key)) {
+ target[key] = helpers.clone(sval);
+ }
+ },
+
+ /**
+ * Recursively deep copies `source` properties into `target` with the given `options`.
+ * IMPORTANT: `target` is not cloned and will be updated with `source` properties.
+ * @param {object} target - The target object in which all sources are merged into.
+ * @param {object|object[]} source - Object(s) to merge into `target`.
+ * @param {object} [options] - Merging options:
+ * @param {function} [options.merger] - The merge method (key, target, source, options)
+ * @returns {object} The `target` object.
+ */
+ merge: function (target, source, options) {
+ var sources = helpers.isArray(source) ? source : [source];
+ var ilen = sources.length;
+ var merge, i, keys, klen, k;
+
+ if (!helpers.isObject(target)) {
+ return target;
+ }
+
+ options = options || {};
+ merge = options.merger || helpers._merger;
+
+ for (i = 0; i < ilen; ++i) {
+ source = sources[i];
+ if (!helpers.isObject(source)) {
+ continue;
+ }
+
+ keys = Object.keys(source);
+ for (k = 0, klen = keys.length; k < klen; ++k) {
+ merge(keys[k], target, source, options);
+ }
+ }
+
+ return target;
+ },
+
+ /**
+ * Recursively deep copies `source` properties into `target` *only* if not defined in target.
+ * IMPORTANT: `target` is not cloned and will be updated with `source` properties.
+ * @param {object} target - The target object in which all sources are merged into.
+ * @param {object|object[]} source - Object(s) to merge into `target`.
+ * @returns {object} The `target` object.
+ */
+ mergeIf: function (target, source) {
+ return helpers.merge(target, source, {merger: helpers._mergerIf});
+ },
+
+ /**
+ * Applies the contents of two or more objects together into the first object.
+ * @param {object} target - The target object in which all objects are merged into.
+ * @param {object} arg1 - Object containing additional properties to merge in target.
+ * @param {object} argN - Additional objects containing properties to merge in target.
+ * @returns {object} The `target` object.
+ */
+ extend: function (target) {
+ var setFn = function (value, key) {
+ target[key] = value;
+ };
+ for (var i = 1, ilen = arguments.length; i < ilen; ++i) {
+ helpers.each(arguments[i], setFn);
+ }
+ return target;
+ },
+
+ /**
+ * Basic javascript inheritance based on the model created in Backbone.js
+ */
+ inherits: function (extensions) {
+ var me = this;
+ var ChartElement = (extensions && extensions.hasOwnProperty('constructor')) ? extensions.constructor : function () {
+ return me.apply(this, arguments);
+ };
+
+ var Surrogate = function () {
+ this.constructor = ChartElement;
+ };
+
+ Surrogate.prototype = me.prototype;
+ ChartElement.prototype = new Surrogate();
+ ChartElement.extend = helpers.inherits;
+
+ if (extensions) {
+ helpers.extend(ChartElement.prototype, extensions);
+ }
+
+ ChartElement.__super__ = me.prototype;
+ return ChartElement;
+ }
+ };
+
+ var helpers_core = helpers;
+
+// DEPRECATIONS
+
+ /**
+ * Provided for backward compatibility, use Chart.helpers.callback instead.
+ * @function Chart.helpers.callCallback
+ * @deprecated since version 2.6.0
+ * @todo remove at version 3
+ * @private
+ */
+ helpers.callCallback = helpers.callback;
+
+ /**
+ * Provided for backward compatibility, use Array.prototype.indexOf instead.
+ * Array.prototype.indexOf compatibility: Chrome, Opera, Safari, FF1.5+, IE9+
+ * @function Chart.helpers.indexOf
+ * @deprecated since version 2.7.0
+ * @todo remove at version 3
+ * @private
+ */
+ helpers.indexOf = function (array, item, fromIndex) {
+ return Array.prototype.indexOf.call(array, item, fromIndex);
+ };
+
+ /**
+ * Provided for backward compatibility, use Chart.helpers.valueOrDefault instead.
+ * @function Chart.helpers.getValueOrDefault
+ * @deprecated since version 2.7.0
+ * @todo remove at version 3
+ * @private
+ */
+ helpers.getValueOrDefault = helpers.valueOrDefault;
+
+ /**
+ * Provided for backward compatibility, use Chart.helpers.valueAtIndexOrDefault instead.
+ * @function Chart.helpers.getValueAtIndexOrDefault
+ * @deprecated since version 2.7.0
+ * @todo remove at version 3
+ * @private
+ */
+ helpers.getValueAtIndexOrDefault = helpers.valueAtIndexOrDefault;
+
+ /**
+ * Easing functions adapted from Robert Penner's easing equations.
+ * @namespace Chart.helpers.easingEffects
+ * @see http://www.robertpenner.com/easing/
+ */
+ var effects = {
+ linear: function (t) {
+ return t;
+ },
+
+ easeInQuad: function (t) {
+ return t * t;
+ },
+
+ easeOutQuad: function (t) {
+ return -t * (t - 2);
+ },
+
+ easeInOutQuad: function (t) {
+ if ((t /= 0.5) < 1) {
+ return 0.5 * t * t;
+ }
+ return -0.5 * ((--t) * (t - 2) - 1);
+ },
+
+ easeInCubic: function (t) {
+ return t * t * t;
+ },
+
+ easeOutCubic: function (t) {
+ return (t = t - 1) * t * t + 1;
+ },
+
+ easeInOutCubic: function (t) {
+ if ((t /= 0.5) < 1) {
+ return 0.5 * t * t * t;
+ }
+ return 0.5 * ((t -= 2) * t * t + 2);
+ },
+
+ easeInQuart: function (t) {
+ return t * t * t * t;
+ },
+
+ easeOutQuart: function (t) {
+ return -((t = t - 1) * t * t * t - 1);
+ },
+
+ easeInOutQuart: function (t) {
+ if ((t /= 0.5) < 1) {
+ return 0.5 * t * t * t * t;
+ }
+ return -0.5 * ((t -= 2) * t * t * t - 2);
+ },
+
+ easeInQuint: function (t) {
+ return t * t * t * t * t;
+ },
+
+ easeOutQuint: function (t) {
+ return (t = t - 1) * t * t * t * t + 1;
+ },
+
+ easeInOutQuint: function (t) {
+ if ((t /= 0.5) < 1) {
+ return 0.5 * t * t * t * t * t;
+ }
+ return 0.5 * ((t -= 2) * t * t * t * t + 2);
+ },
+
+ easeInSine: function (t) {
+ return -Math.cos(t * (Math.PI / 2)) + 1;
+ },
+
+ easeOutSine: function (t) {
+ return Math.sin(t * (Math.PI / 2));
+ },
+
+ easeInOutSine: function (t) {
+ return -0.5 * (Math.cos(Math.PI * t) - 1);
+ },
+
+ easeInExpo: function (t) {
+ return (t === 0) ? 0 : Math.pow(2, 10 * (t - 1));
+ },
+
+ easeOutExpo: function (t) {
+ return (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1;
+ },
+
+ easeInOutExpo: function (t) {
+ if (t === 0) {
+ return 0;
+ }
+ if (t === 1) {
+ return 1;
+ }
+ if ((t /= 0.5) < 1) {
+ return 0.5 * Math.pow(2, 10 * (t - 1));
+ }
+ return 0.5 * (-Math.pow(2, -10 * --t) + 2);
+ },
+
+ easeInCirc: function (t) {
+ if (t >= 1) {
+ return t;
+ }
+ return -(Math.sqrt(1 - t * t) - 1);
+ },
+
+ easeOutCirc: function (t) {
+ return Math.sqrt(1 - (t = t - 1) * t);
+ },
+
+ easeInOutCirc: function (t) {
+ if ((t /= 0.5) < 1) {
+ return -0.5 * (Math.sqrt(1 - t * t) - 1);
+ }
+ return 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1);
+ },
+
+ easeInElastic: function (t) {
+ var s = 1.70158;
+ var p = 0;
+ var a = 1;
+ if (t === 0) {
+ return 0;
+ }
+ if (t === 1) {
+ return 1;
+ }
+ if (!p) {
+ p = 0.3;
+ }
+ if (a < 1) {
+ a = 1;
+ s = p / 4;
+ } else {
+ s = p / (2 * Math.PI) * Math.asin(1 / a);
+ }
+ return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p));
+ },
+
+ easeOutElastic: function (t) {
+ var s = 1.70158;
+ var p = 0;
+ var a = 1;
+ if (t === 0) {
+ return 0;
+ }
+ if (t === 1) {
+ return 1;
+ }
+ if (!p) {
+ p = 0.3;
+ }
+ if (a < 1) {
+ a = 1;
+ s = p / 4;
+ } else {
+ s = p / (2 * Math.PI) * Math.asin(1 / a);
+ }
+ return a * Math.pow(2, -10 * t) * Math.sin((t - s) * (2 * Math.PI) / p) + 1;
+ },
+
+ easeInOutElastic: function (t) {
+ var s = 1.70158;
+ var p = 0;
+ var a = 1;
+ if (t === 0) {
+ return 0;
+ }
+ if ((t /= 0.5) === 2) {
+ return 1;
+ }
+ if (!p) {
+ p = 0.45;
+ }
+ if (a < 1) {
+ a = 1;
+ s = p / 4;
+ } else {
+ s = p / (2 * Math.PI) * Math.asin(1 / a);
+ }
+ if (t < 1) {
+ return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p));
+ }
+ return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p) * 0.5 + 1;
+ },
+ easeInBack: function (t) {
+ var s = 1.70158;
+ return t * t * ((s + 1) * t - s);
+ },
+
+ easeOutBack: function (t) {
+ var s = 1.70158;
+ return (t = t - 1) * t * ((s + 1) * t + s) + 1;
+ },
+
+ easeInOutBack: function (t) {
+ var s = 1.70158;
+ if ((t /= 0.5) < 1) {
+ return 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s));
+ }
+ return 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2);
+ },
+
+ easeInBounce: function (t) {
+ return 1 - effects.easeOutBounce(1 - t);
+ },
+
+ easeOutBounce: function (t) {
+ if (t < (1 / 2.75)) {
+ return 7.5625 * t * t;
+ }
+ if (t < (2 / 2.75)) {
+ return 7.5625 * (t -= (1.5 / 2.75)) * t + 0.75;
+ }
+ if (t < (2.5 / 2.75)) {
+ return 7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375;
+ }
+ return 7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375;
+ },
+
+ easeInOutBounce: function (t) {
+ if (t < 0.5) {
+ return effects.easeInBounce(t * 2) * 0.5;
+ }
+ return effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5;
+ }
+ };
+
+ var helpers_easing = {
+ effects: effects
+ };
+
+// DEPRECATIONS
+
+ /**
+ * Provided for backward compatibility, use Chart.helpers.easing.effects instead.
+ * @function Chart.helpers.easingEffects
+ * @deprecated since version 2.7.0
+ * @todo remove at version 3
+ * @private
+ */
+ helpers_core.easingEffects = effects;
+
+ var PI = Math.PI;
+ var RAD_PER_DEG = PI / 180;
+ var DOUBLE_PI = PI * 2;
+ var HALF_PI = PI / 2;
+ var QUARTER_PI = PI / 4;
+ var TWO_THIRDS_PI = PI * 2 / 3;
+
+ /**
+ * @namespace Chart.helpers.canvas
+ */
+ var exports$1 = {
+ /**
+ * Clears the entire canvas associated to the given `chart`.
+ * @param {Chart} chart - The chart for which to clear the canvas.
+ */
+ clear: function (chart) {
+ chart.ctx.clearRect(0, 0, chart.width, chart.height);
+ },
+
+ /**
+ * Creates a "path" for a rectangle with rounded corners at position (x, y) with a
+ * given size (width, height) and the same `radius` for all corners.
+ * @param {CanvasRenderingContext2D} ctx - The canvas 2D Context.
+ * @param {number} x - The x axis of the coordinate for the rectangle starting point.
+ * @param {number} y - The y axis of the coordinate for the rectangle starting point.
+ * @param {number} width - The rectangle's width.
+ * @param {number} height - The rectangle's height.
+ * @param {number} radius - The rounded amount (in pixels) for the four corners.
+ * @todo handle `radius` as top-left, top-right, bottom-right, bottom-left array/object?
+ */
+ roundedRect: function (ctx, x, y, width, height, radius) {
+ if (radius) {
+ var r = Math.min(radius, height / 2, width / 2);
+ var left = x + r;
+ var top = y + r;
+ var right = x + width - r;
+ var bottom = y + height - r;
+
+ ctx.moveTo(x, top);
+ if (left < right && top < bottom) {
+ ctx.arc(left, top, r, -PI, -HALF_PI);
+ ctx.arc(right, top, r, -HALF_PI, 0);
+ ctx.arc(right, bottom, r, 0, HALF_PI);
+ ctx.arc(left, bottom, r, HALF_PI, PI);
+ } else if (left < right) {
+ ctx.moveTo(left, y);
+ ctx.arc(right, top, r, -HALF_PI, HALF_PI);
+ ctx.arc(left, top, r, HALF_PI, PI + HALF_PI);
+ } else if (top < bottom) {
+ ctx.arc(left, top, r, -PI, 0);
+ ctx.arc(left, bottom, r, 0, PI);
+ } else {
+ ctx.arc(left, top, r, -PI, PI);
+ }
+ ctx.closePath();
+ ctx.moveTo(x, y);
+ } else {
+ ctx.rect(x, y, width, height);
+ }
+ },
+
+ drawPoint: function (ctx, style, radius, x, y, rotation) {
+ var type, xOffset, yOffset, size, cornerRadius;
+ var rad = (rotation || 0) * RAD_PER_DEG;
+
+ if (style && typeof style === 'object') {
+ type = style.toString();
+ if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {
+ ctx.drawImage(style, x - style.width / 2, y - style.height / 2, style.width, style.height);
+ return;
+ }
+ }
+
+ if (isNaN(radius) || radius <= 0) {
+ return;
+ }
+
+ ctx.beginPath();
+
+ switch (style) {
+ // Default includes circle
+ default:
+ ctx.arc(x, y, radius, 0, DOUBLE_PI);
+ ctx.closePath();
+ break;
+ case 'triangle':
+ ctx.moveTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);
+ rad += TWO_THIRDS_PI;
+ ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);
+ rad += TWO_THIRDS_PI;
+ ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);
+ ctx.closePath();
+ break;
+ case 'rectRounded':
+ // NOTE: the rounded rect implementation changed to use `arc` instead of
+ // `quadraticCurveTo` since it generates better results when rect is
+ // almost a circle. 0.516 (instead of 0.5) produces results with visually
+ // closer proportion to the previous impl and it is inscribed in the
+ // circle with `radius`. For more details, see the following PRs:
+ // https://github.com/chartjs/Chart.js/issues/5597
+ // https://github.com/chartjs/Chart.js/issues/5858
+ cornerRadius = radius * 0.516;
+ size = radius - cornerRadius;
+ xOffset = Math.cos(rad + QUARTER_PI) * size;
+ yOffset = Math.sin(rad + QUARTER_PI) * size;
+ ctx.arc(x - xOffset, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI);
+ ctx.arc(x + yOffset, y - xOffset, cornerRadius, rad - HALF_PI, rad);
+ ctx.arc(x + xOffset, y + yOffset, cornerRadius, rad, rad + HALF_PI);
+ ctx.arc(x - yOffset, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI);
+ ctx.closePath();
+ break;
+ case 'rect':
+ if (!rotation) {
+ size = Math.SQRT1_2 * radius;
+ ctx.rect(x - size, y - size, 2 * size, 2 * size);
+ break;
+ }
+ rad += QUARTER_PI;
+ /* falls through */
+ case 'rectRot':
+ xOffset = Math.cos(rad) * radius;
+ yOffset = Math.sin(rad) * radius;
+ ctx.moveTo(x - xOffset, y - yOffset);
+ ctx.lineTo(x + yOffset, y - xOffset);
+ ctx.lineTo(x + xOffset, y + yOffset);
+ ctx.lineTo(x - yOffset, y + xOffset);
+ ctx.closePath();
+ break;
+ case 'crossRot':
+ rad += QUARTER_PI;
+ /* falls through */
+ case 'cross':
+ xOffset = Math.cos(rad) * radius;
+ yOffset = Math.sin(rad) * radius;
+ ctx.moveTo(x - xOffset, y - yOffset);
+ ctx.lineTo(x + xOffset, y + yOffset);
+ ctx.moveTo(x + yOffset, y - xOffset);
+ ctx.lineTo(x - yOffset, y + xOffset);
+ break;
+ case 'star':
+ xOffset = Math.cos(rad) * radius;
+ yOffset = Math.sin(rad) * radius;
+ ctx.moveTo(x - xOffset, y - yOffset);
+ ctx.lineTo(x + xOffset, y + yOffset);
+ ctx.moveTo(x + yOffset, y - xOffset);
+ ctx.lineTo(x - yOffset, y + xOffset);
+ rad += QUARTER_PI;
+ xOffset = Math.cos(rad) * radius;
+ yOffset = Math.sin(rad) * radius;
+ ctx.moveTo(x - xOffset, y - yOffset);
+ ctx.lineTo(x + xOffset, y + yOffset);
+ ctx.moveTo(x + yOffset, y - xOffset);
+ ctx.lineTo(x - yOffset, y + xOffset);
+ break;
+ case 'line':
+ xOffset = Math.cos(rad) * radius;
+ yOffset = Math.sin(rad) * radius;
+ ctx.moveTo(x - xOffset, y - yOffset);
+ ctx.lineTo(x + xOffset, y + yOffset);
+ break;
+ case 'dash':
+ ctx.moveTo(x, y);
+ ctx.lineTo(x + Math.cos(rad) * radius, y + Math.sin(rad) * radius);
+ break;
+ }
+
+ ctx.fill();
+ ctx.stroke();
+ },
+
+ /**
+ * Returns true if the point is inside the rectangle
+ * @param {object} point - The point to test
+ * @param {object} area - The rectangle
+ * @returns {boolean}
+ * @private
+ */
+ _isPointInArea: function (point, area) {
+ var epsilon = 1e-6; // 1e-6 is margin in pixels for accumulated error.
+
+ return point.x > area.left - epsilon && point.x < area.right + epsilon &&
+ point.y > area.top - epsilon && point.y < area.bottom + epsilon;
+ },
+
+ clipArea: function (ctx, area) {
+ ctx.save();
+ ctx.beginPath();
+ ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top);
+ ctx.clip();
+ },
+
+ unclipArea: function (ctx) {
+ ctx.restore();
+ },
+
+ lineTo: function (ctx, previous, target, flip) {
+ var stepped = target.steppedLine;
+ if (stepped) {
+ if (stepped === 'middle') {
+ var midpoint = (previous.x + target.x) / 2.0;
+ ctx.lineTo(midpoint, flip ? target.y : previous.y);
+ ctx.lineTo(midpoint, flip ? previous.y : target.y);
+ } else if ((stepped === 'after' && !flip) || (stepped !== 'after' && flip)) {
+ ctx.lineTo(previous.x, target.y);
+ } else {
+ ctx.lineTo(target.x, previous.y);
+ }
+ ctx.lineTo(target.x, target.y);
+ return;
+ }
+
+ if (!target.tension) {
+ ctx.lineTo(target.x, target.y);
+ return;
+ }
+
+ ctx.bezierCurveTo(
+ flip ? previous.controlPointPreviousX : previous.controlPointNextX,
+ flip ? previous.controlPointPreviousY : previous.controlPointNextY,
+ flip ? target.controlPointNextX : target.controlPointPreviousX,
+ flip ? target.controlPointNextY : target.controlPointPreviousY,
+ target.x,
+ target.y);
+ }
+ };
+
+ var helpers_canvas = exports$1;
+
+// DEPRECATIONS
+
+ /**
+ * Provided for backward compatibility, use Chart.helpers.canvas.clear instead.
+ * @namespace Chart.helpers.clear
+ * @deprecated since version 2.7.0
+ * @todo remove at version 3
+ * @private
+ */
+ helpers_core.clear = exports$1.clear;
+
+ /**
+ * Provided for backward compatibility, use Chart.helpers.canvas.roundedRect instead.
+ * @namespace Chart.helpers.drawRoundedRectangle
+ * @deprecated since version 2.7.0
+ * @todo remove at version 3
+ * @private
+ */
+ helpers_core.drawRoundedRectangle = function (ctx) {
+ ctx.beginPath();
+ exports$1.roundedRect.apply(exports$1, arguments);
+ };
+
+ var defaults = {
+ /**
+ * @private
+ */
+ _set: function (scope, values) {
+ return helpers_core.merge(this[scope] || (this[scope] = {}), values);
+ }
+ };
+
+ defaults._set('global', {
+ defaultColor: 'rgba(0,0,0,0.1)',
+ defaultFontColor: '#666',
+ defaultFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",
+ defaultFontSize: 12,
+ defaultFontStyle: 'normal',
+ defaultLineHeight: 1.2,
+ showLines: true
+ });
+
+ var core_defaults = defaults;
+
+ var valueOrDefault = helpers_core.valueOrDefault;
+
+ /**
+ * Converts the given font object into a CSS font string.
+ * @param {object} font - A font object.
+ * @return {string} The CSS font string. See https://developer.mozilla.org/en-US/docs/Web/CSS/font
+ * @private
+ */
+ function toFontString(font) {
+ if (!font || helpers_core.isNullOrUndef(font.size) || helpers_core.isNullOrUndef(font.family)) {
+ return null;
+ }
+
+ return (font.style ? font.style + ' ' : '')
+ + (font.weight ? font.weight + ' ' : '')
+ + font.size + 'px '
+ + font.family;
+ }
+
+ /**
+ * @alias Chart.helpers.options
+ * @namespace
+ */
+ var helpers_options = {
+ /**
+ * Converts the given line height `value` in pixels for a specific font `size`.
+ * @param {number|string} value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em').
+ * @param {number} size - The font size (in pixels) used to resolve relative `value`.
+ * @returns {number} The effective line height in pixels (size * 1.2 if value is invalid).
+ * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height
+ * @since 2.7.0
+ */
+ toLineHeight: function (value, size) {
+ var matches = ('' + value).match(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/);
+ if (!matches || matches[1] === 'normal') {
+ return size * 1.2;
+ }
+
+ value = +matches[2];
+
+ switch (matches[3]) {
+ case 'px':
+ return value;
+ case '%':
+ value /= 100;
+ break;
+ default:
+ break;
+ }
+
+ return size * value;
+ },
+
+ /**
+ * Converts the given value into a padding object with pre-computed width/height.
+ * @param {number|object} value - If a number, set the value to all TRBL component,
+ * else, if and object, use defined properties and sets undefined ones to 0.
+ * @returns {object} The padding values (top, right, bottom, left, width, height)
+ * @since 2.7.0
+ */
+ toPadding: function (value) {
+ var t, r, b, l;
+
+ if (helpers_core.isObject(value)) {
+ t = +value.top || 0;
+ r = +value.right || 0;
+ b = +value.bottom || 0;
+ l = +value.left || 0;
+ } else {
+ t = r = b = l = +value || 0;
+ }
+
+ return {
+ top: t,
+ right: r,
+ bottom: b,
+ left: l,
+ height: t + b,
+ width: l + r
+ };
+ },
+
+ /**
+ * Parses font options and returns the font object.
+ * @param {object} options - A object that contains font options to be parsed.
+ * @return {object} The font object.
+ * @todo Support font.* options and renamed to toFont().
+ * @private
+ */
+ _parseFont: function (options) {
+ var globalDefaults = core_defaults.global;
+ var size = valueOrDefault(options.fontSize, globalDefaults.defaultFontSize);
+ var font = {
+ family: valueOrDefault(options.fontFamily, globalDefaults.defaultFontFamily),
+ lineHeight: helpers_core.options.toLineHeight(valueOrDefault(options.lineHeight, globalDefaults.defaultLineHeight), size),
+ size: size,
+ style: valueOrDefault(options.fontStyle, globalDefaults.defaultFontStyle),
+ weight: null,
+ string: ''
+ };
+
+ font.string = toFontString(font);
+ return font;
+ },
+
+ /**
+ * Evaluates the given `inputs` sequentially and returns the first defined value.
+ * @param {Array} inputs - An array of values, falling back to the last value.
+ * @param {object} [context] - If defined and the current value is a function, the value
+ * is called with `context` as first argument and the result becomes the new input.
+ * @param {number} [index] - If defined and the current value is an array, the value
+ * at `index` become the new input.
+ * @since 2.7.0
+ */
+ resolve: function (inputs, context, index) {
+ var i, ilen, value;
+
+ for (i = 0, ilen = inputs.length; i < ilen; ++i) {
+ value = inputs[i];
+ if (value === undefined) {
+ continue;
+ }
+ if (context !== undefined && typeof value === 'function') {
+ value = value(context);
+ }
+ if (index !== undefined && helpers_core.isArray(value)) {
+ value = value[index];
+ }
+ if (value !== undefined) {
+ return value;
+ }
+ }
+ }
+ };
+
+ var helpers$1 = helpers_core;
+ var easing = helpers_easing;
+ var canvas = helpers_canvas;
+ var options = helpers_options;
+ helpers$1.easing = easing;
+ helpers$1.canvas = canvas;
+ helpers$1.options = options;
+
+ function interpolate(start, view, model, ease) {
+ var keys = Object.keys(model);
+ var i, ilen, key, actual, origin, target, type, c0, c1;
+
+ for (i = 0, ilen = keys.length; i < ilen; ++i) {
+ key = keys[i];
+
+ target = model[key];
+
+ // if a value is added to the model after pivot() has been called, the view
+ // doesn't contain it, so let's initialize the view to the target value.
+ if (!view.hasOwnProperty(key)) {
+ view[key] = target;
+ }
+
+ actual = view[key];
+
+ if (actual === target || key[0] === '_') {
+ continue;
+ }
+
+ if (!start.hasOwnProperty(key)) {
+ start[key] = actual;
+ }
+
+ origin = start[key];
+
+ type = typeof target;
+
+ if (type === typeof origin) {
+ if (type === 'string') {
+ c0 = chartjsColor(origin);
+ if (c0.valid) {
+ c1 = chartjsColor(target);
+ if (c1.valid) {
+ view[key] = c1.mix(c0, ease).rgbString();
+ continue;
}
- }, {45: 45}], 35: [function (t, e, i) {
- "use strict";
- var n = t(25), a = t(26), r = t(45);
- n._set("global", {
- tooltips: {
- enabled: !0,
- custom: null,
- mode: "nearest",
- position: "average",
- intersect: !0,
- backgroundColor: "rgba(0,0,0,0.8)",
- titleFontStyle: "bold",
- titleSpacing: 2,
- titleMarginBottom: 6,
- titleFontColor: "#fff",
- titleAlign: "left",
- bodySpacing: 2,
- bodyFontColor: "#fff",
- bodyAlign: "left",
- footerFontStyle: "bold",
- footerSpacing: 2,
- footerMarginTop: 6,
- footerFontColor: "#fff",
- footerAlign: "left",
- yPadding: 6,
- xPadding: 6,
- caretPadding: 2,
- caretSize: 5,
- cornerRadius: 6,
- multiKeyBackground: "#fff",
- displayColors: !0,
- borderColor: "rgba(0,0,0,0)",
- borderWidth: 0,
- callbacks: {
- beforeTitle: r.noop,
- title: function (t, e) {
- var i = "", n = e.labels, a = n ? n.length : 0;
- if (t.length > 0) {
- var r = t[0];
- r.xLabel ? i = r.xLabel : a > 0 && r.index < a && (i = n[r.index])
- }
- return i
- },
- afterTitle: r.noop,
- beforeBody: r.noop,
- beforeLabel: r.noop,
- label: function (t, e) {
- var i = e.datasets[t.datasetIndex].label || "";
- return i && (i += ": "), i += t.yLabel
- },
- labelColor: function (t, e) {
- var i = e.getDatasetMeta(t.datasetIndex).data[t.index]._view;
- return {borderColor: i.borderColor, backgroundColor: i.backgroundColor}
- },
- labelTextColor: function () {
- return this._options.bodyFontColor
- },
- afterLabel: r.noop,
- afterBody: r.noop,
- beforeFooter: r.noop,
- footer: r.noop,
- afterFooter: r.noop
- }
- }
- }), e.exports = function (t) {
- function e(t, e) {
- var i = r.color(t);
- return i.alpha(e * i.alpha()).rgbaString()
- }
+ }
+ } else if (helpers$1.isFinite(origin) && helpers$1.isFinite(target)) {
+ view[key] = origin + (target - origin) * ease;
+ continue;
+ }
+ }
+
+ view[key] = target;
+ }
+ }
+
+ var Element = function (configuration) {
+ helpers$1.extend(this, configuration);
+ this.initialize.apply(this, arguments);
+ };
+
+ helpers$1.extend(Element.prototype, {
+
+ initialize: function () {
+ this.hidden = false;
+ },
+
+ pivot: function () {
+ var me = this;
+ if (!me._view) {
+ me._view = helpers$1.clone(me._model);
+ }
+ me._start = {};
+ return me;
+ },
+
+ transition: function (ease) {
+ var me = this;
+ var model = me._model;
+ var start = me._start;
+ var view = me._view;
+
+ // No animation -> No Transition
+ if (!model || ease === 1) {
+ me._view = model;
+ me._start = null;
+ return me;
+ }
+
+ if (!view) {
+ view = me._view = {};
+ }
+
+ if (!start) {
+ start = me._start = {};
+ }
+
+ interpolate(start, view, model, ease);
+
+ return me;
+ },
+
+ tooltipPosition: function () {
+ return {
+ x: this._model.x,
+ y: this._model.y
+ };
+ },
+
+ hasValue: function () {
+ return helpers$1.isNumber(this._model.x) && helpers$1.isNumber(this._model.y);
+ }
+ });
+
+ Element.extend = helpers$1.inherits;
+
+ var core_element = Element;
+
+ var exports$2 = core_element.extend({
+ chart: null, // the animation associated chart instance
+ currentStep: 0, // the current animation step
+ numSteps: 60, // default number of steps
+ easing: '', // the easing to use for this animation
+ render: null, // render function used by the animation service
+
+ onAnimationProgress: null, // user specified callback to fire on each step of the animation
+ onAnimationComplete: null, // user specified callback to fire when the animation finishes
+ });
+
+ var core_animation = exports$2;
+
+// DEPRECATIONS
+
+ /**
+ * Provided for backward compatibility, use Chart.Animation instead
+ * @prop Chart.Animation#animationObject
+ * @deprecated since version 2.6.0
+ * @todo remove at version 3
+ */
+ Object.defineProperty(exports$2.prototype, 'animationObject', {
+ get: function () {
+ return this;
+ }
+ });
+
+ /**
+ * Provided for backward compatibility, use Chart.Animation#chart instead
+ * @prop Chart.Animation#chartInstance
+ * @deprecated since version 2.6.0
+ * @todo remove at version 3
+ */
+ Object.defineProperty(exports$2.prototype, 'chartInstance', {
+ get: function () {
+ return this.chart;
+ },
+ set: function (value) {
+ this.chart = value;
+ }
+ });
+
+ core_defaults._set('global', {
+ animation: {
+ duration: 1000,
+ easing: 'easeOutQuart',
+ onProgress: helpers$1.noop,
+ onComplete: helpers$1.noop
+ }
+ });
+
+ var core_animations = {
+ animations: [],
+ request: null,
+
+ /**
+ * @param {Chart} chart - The chart to animate.
+ * @param {Chart.Animation} animation - The animation that we will animate.
+ * @param {number} duration - The animation duration in ms.
+ * @param {boolean} lazy - if true, the chart is not marked as animating to enable more responsive interactions
+ */
+ addAnimation: function (chart, animation, duration, lazy) {
+ var animations = this.animations;
+ var i, ilen;
+
+ animation.chart = chart;
+ animation.startTime = Date.now();
+ animation.duration = duration;
+
+ if (!lazy) {
+ chart.animating = true;
+ }
+
+ for (i = 0, ilen = animations.length; i < ilen; ++i) {
+ if (animations[i].chart === chart) {
+ animations[i] = animation;
+ return;
+ }
+ }
+
+ animations.push(animation);
+
+ // If there are no animations queued, manually kickstart a digest, for lack of a better word
+ if (animations.length === 1) {
+ this.requestAnimationFrame();
+ }
+ },
+
+ cancelAnimation: function (chart) {
+ var index = helpers$1.findIndex(this.animations, function (animation) {
+ return animation.chart === chart;
+ });
+
+ if (index !== -1) {
+ this.animations.splice(index, 1);
+ chart.animating = false;
+ }
+ },
+
+ requestAnimationFrame: function () {
+ var me = this;
+ if (me.request === null) {
+ // Skip animation frame requests until the active one is executed.
+ // This can happen when processing mouse events, e.g. 'mousemove'
+ // and 'mouseout' events will trigger multiple renders.
+ me.request = helpers$1.requestAnimFrame.call(window, function () {
+ me.request = null;
+ me.startDigest();
+ });
+ }
+ },
+
+ /**
+ * @private
+ */
+ startDigest: function () {
+ var me = this;
+
+ me.advance();
+
+ // Do we have more stuff to animate?
+ if (me.animations.length > 0) {
+ me.requestAnimationFrame();
+ }
+ },
+
+ /**
+ * @private
+ */
+ advance: function () {
+ var animations = this.animations;
+ var animation, chart, numSteps, nextStep;
+ var i = 0;
+
+ // 1 animation per chart, so we are looping charts here
+ while (i < animations.length) {
+ animation = animations[i];
+ chart = animation.chart;
+ numSteps = animation.numSteps;
+
+ // Make sure that currentStep starts at 1
+ // https://github.com/chartjs/Chart.js/issues/6104
+ nextStep = Math.floor((Date.now() - animation.startTime) / animation.duration * numSteps) + 1;
+ animation.currentStep = Math.min(nextStep, numSteps);
+
+ helpers$1.callback(animation.render, [chart, animation], chart);
+ helpers$1.callback(animation.onAnimationProgress, [animation], chart);
+
+ if (animation.currentStep >= numSteps) {
+ helpers$1.callback(animation.onAnimationComplete, [animation], chart);
+ chart.animating = false;
+ animations.splice(i, 1);
+ } else {
+ ++i;
+ }
+ }
+ }
+ };
+
+ var resolve = helpers$1.options.resolve;
+
+ var arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift'];
+
+ /**
+ * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice',
+ * 'unshift') and notify the listener AFTER the array has been altered. Listeners are
+ * called on the 'onData*' callbacks (e.g. onDataPush, etc.) with same arguments.
+ */
+ function listenArrayEvents(array, listener) {
+ if (array._chartjs) {
+ array._chartjs.listeners.push(listener);
+ return;
+ }
+
+ Object.defineProperty(array, '_chartjs', {
+ configurable: true,
+ enumerable: false,
+ value: {
+ listeners: [listener]
+ }
+ });
+
+ arrayEvents.forEach(function (key) {
+ var method = 'onData' + key.charAt(0).toUpperCase() + key.slice(1);
+ var base = array[key];
+
+ Object.defineProperty(array, key, {
+ configurable: true,
+ enumerable: false,
+ value: function () {
+ var args = Array.prototype.slice.call(arguments);
+ var res = base.apply(this, args);
+
+ helpers$1.each(array._chartjs.listeners, function (object) {
+ if (typeof object[method] === 'function') {
+ object[method].apply(object, args);
+ }
+ });
+
+ return res;
+ }
+ });
+ });
+ }
+
+ /**
+ * Removes the given array event listener and cleanup extra attached properties (such as
+ * the _chartjs stub and overridden methods) if array doesn't have any more listeners.
+ */
+ function unlistenArrayEvents(array, listener) {
+ var stub = array._chartjs;
+ if (!stub) {
+ return;
+ }
+
+ var listeners = stub.listeners;
+ var index = listeners.indexOf(listener);
+ if (index !== -1) {
+ listeners.splice(index, 1);
+ }
+
+ if (listeners.length > 0) {
+ return;
+ }
+
+ arrayEvents.forEach(function (key) {
+ delete array[key];
+ });
+
+ delete array._chartjs;
+ }
+
+// Base class for all dataset controllers (line, bar, etc)
+ var DatasetController = function (chart, datasetIndex) {
+ this.initialize(chart, datasetIndex);
+ };
+
+ helpers$1.extend(DatasetController.prototype, {
+
+ /**
+ * Element type used to generate a meta dataset (e.g. Chart.element.Line).
+ * @type {Chart.core.element}
+ */
+ datasetElementType: null,
+
+ /**
+ * Element type used to generate a meta data (e.g. Chart.element.Point).
+ * @type {Chart.core.element}
+ */
+ dataElementType: null,
+
+ initialize: function (chart, datasetIndex) {
+ var me = this;
+ me.chart = chart;
+ me.index = datasetIndex;
+ me.linkScales();
+ me.addElements();
+ },
+
+ updateIndex: function (datasetIndex) {
+ this.index = datasetIndex;
+ },
+
+ linkScales: function () {
+ var me = this;
+ var meta = me.getMeta();
+ var dataset = me.getDataset();
+
+ if (meta.xAxisID === null || !(meta.xAxisID in me.chart.scales)) {
+ meta.xAxisID = dataset.xAxisID || me.chart.options.scales.xAxes[0].id;
+ }
+ if (meta.yAxisID === null || !(meta.yAxisID in me.chart.scales)) {
+ meta.yAxisID = dataset.yAxisID || me.chart.options.scales.yAxes[0].id;
+ }
+ },
+
+ getDataset: function () {
+ return this.chart.data.datasets[this.index];
+ },
+
+ getMeta: function () {
+ return this.chart.getDatasetMeta(this.index);
+ },
+
+ getScaleForId: function (scaleID) {
+ return this.chart.scales[scaleID];
+ },
+
+ /**
+ * @private
+ */
+ _getValueScaleId: function () {
+ return this.getMeta().yAxisID;
+ },
+
+ /**
+ * @private
+ */
+ _getIndexScaleId: function () {
+ return this.getMeta().xAxisID;
+ },
+
+ /**
+ * @private
+ */
+ _getValueScale: function () {
+ return this.getScaleForId(this._getValueScaleId());
+ },
+
+ /**
+ * @private
+ */
+ _getIndexScale: function () {
+ return this.getScaleForId(this._getIndexScaleId());
+ },
+
+ reset: function () {
+ this.update(true);
+ },
+
+ /**
+ * @private
+ */
+ destroy: function () {
+ if (this._data) {
+ unlistenArrayEvents(this._data, this);
+ }
+ },
+
+ createMetaDataset: function () {
+ var me = this;
+ var type = me.datasetElementType;
+ return type && new type({
+ _chart: me.chart,
+ _datasetIndex: me.index
+ });
+ },
+
+ createMetaData: function (index) {
+ var me = this;
+ var type = me.dataElementType;
+ return type && new type({
+ _chart: me.chart,
+ _datasetIndex: me.index,
+ _index: index
+ });
+ },
+
+ addElements: function () {
+ var me = this;
+ var meta = me.getMeta();
+ var data = me.getDataset().data || [];
+ var metaData = meta.data;
+ var i, ilen;
+
+ for (i = 0, ilen = data.length; i < ilen; ++i) {
+ metaData[i] = metaData[i] || me.createMetaData(i);
+ }
+
+ meta.dataset = meta.dataset || me.createMetaDataset();
+ },
+
+ addElementAndReset: function (index) {
+ var element = this.createMetaData(index);
+ this.getMeta().data.splice(index, 0, element);
+ this.updateElement(element, index, true);
+ },
+
+ buildOrUpdateElements: function () {
+ var me = this;
+ var dataset = me.getDataset();
+ var data = dataset.data || (dataset.data = []);
+
+ // In order to correctly handle data addition/deletion animation (an thus simulate
+ // real-time charts), we need to monitor these data modifications and synchronize
+ // the internal meta data accordingly.
+ if (me._data !== data) {
+ if (me._data) {
+ // This case happens when the user replaced the data array instance.
+ unlistenArrayEvents(me._data, me);
+ }
+
+ if (data && Object.isExtensible(data)) {
+ listenArrayEvents(data, me);
+ }
+ me._data = data;
+ }
+
+ // Re-sync meta data in case the user replaced the data array or if we missed
+ // any updates and so make sure that we handle number of datapoints changing.
+ me.resyncElements();
+ },
+
+ update: helpers$1.noop,
+
+ transition: function (easingValue) {
+ var meta = this.getMeta();
+ var elements = meta.data || [];
+ var ilen = elements.length;
+ var i = 0;
+
+ for (; i < ilen; ++i) {
+ elements[i].transition(easingValue);
+ }
+
+ if (meta.dataset) {
+ meta.dataset.transition(easingValue);
+ }
+ },
+
+ draw: function () {
+ var meta = this.getMeta();
+ var elements = meta.data || [];
+ var ilen = elements.length;
+ var i = 0;
+
+ if (meta.dataset) {
+ meta.dataset.draw();
+ }
+
+ for (; i < ilen; ++i) {
+ elements[i].draw();
+ }
+ },
+
+ removeHoverStyle: function (element) {
+ helpers$1.merge(element._model, element.$previousStyle || {});
+ delete element.$previousStyle;
+ },
+
+ setHoverStyle: function (element) {
+ var dataset = this.chart.data.datasets[element._datasetIndex];
+ var index = element._index;
+ var custom = element.custom || {};
+ var model = element._model;
+ var getHoverColor = helpers$1.getHoverColor;
+
+ element.$previousStyle = {
+ backgroundColor: model.backgroundColor,
+ borderColor: model.borderColor,
+ borderWidth: model.borderWidth
+ };
+
+ model.backgroundColor = resolve([custom.hoverBackgroundColor, dataset.hoverBackgroundColor, getHoverColor(model.backgroundColor)], undefined, index);
+ model.borderColor = resolve([custom.hoverBorderColor, dataset.hoverBorderColor, getHoverColor(model.borderColor)], undefined, index);
+ model.borderWidth = resolve([custom.hoverBorderWidth, dataset.hoverBorderWidth, model.borderWidth], undefined, index);
+ },
+
+ /**
+ * @private
+ */
+ resyncElements: function () {
+ var me = this;
+ var meta = me.getMeta();
+ var data = me.getDataset().data;
+ var numMeta = meta.data.length;
+ var numData = data.length;
+
+ if (numData < numMeta) {
+ meta.data.splice(numData, numMeta - numData);
+ } else if (numData > numMeta) {
+ me.insertElements(numMeta, numData - numMeta);
+ }
+ },
+
+ /**
+ * @private
+ */
+ insertElements: function (start, count) {
+ for (var i = 0; i < count; ++i) {
+ this.addElementAndReset(start + i);
+ }
+ },
+
+ /**
+ * @private
+ */
+ onDataPush: function () {
+ var count = arguments.length;
+ this.insertElements(this.getDataset().data.length - count, count);
+ },
+
+ /**
+ * @private
+ */
+ onDataPop: function () {
+ this.getMeta().data.pop();
+ },
+
+ /**
+ * @private
+ */
+ onDataShift: function () {
+ this.getMeta().data.shift();
+ },
+
+ /**
+ * @private
+ */
+ onDataSplice: function (start, count) {
+ this.getMeta().data.splice(start, count);
+ this.insertElements(start, arguments.length - 2);
+ },
+
+ /**
+ * @private
+ */
+ onDataUnshift: function () {
+ this.insertElements(0, arguments.length);
+ }
+ });
+
+ DatasetController.extend = helpers$1.inherits;
+
+ var core_datasetController = DatasetController;
+
+ core_defaults._set('global', {
+ elements: {
+ arc: {
+ backgroundColor: core_defaults.global.defaultColor,
+ borderColor: '#fff',
+ borderWidth: 2,
+ borderAlign: 'center'
+ }
+ }
+ });
+
+ var element_arc = core_element.extend({
+ inLabelRange: function (mouseX) {
+ var vm = this._view;
+
+ if (vm) {
+ return (Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hoverRadius, 2));
+ }
+ return false;
+ },
+
+ inRange: function (chartX, chartY) {
+ var vm = this._view;
+
+ if (vm) {
+ var pointRelativePosition = helpers$1.getAngleFromPoint(vm, {x: chartX, y: chartY});
+ var angle = pointRelativePosition.angle;
+ var distance = pointRelativePosition.distance;
+
+ // Sanitise angle range
+ var startAngle = vm.startAngle;
+ var endAngle = vm.endAngle;
+ while (endAngle < startAngle) {
+ endAngle += 2.0 * Math.PI;
+ }
+ while (angle > endAngle) {
+ angle -= 2.0 * Math.PI;
+ }
+ while (angle < startAngle) {
+ angle += 2.0 * Math.PI;
+ }
+
+ // Check if within the range of the open/close angle
+ var betweenAngles = (angle >= startAngle && angle <= endAngle);
+ var withinRadius = (distance >= vm.innerRadius && distance <= vm.outerRadius);
+
+ return (betweenAngles && withinRadius);
+ }
+ return false;
+ },
+
+ getCenterPoint: function () {
+ var vm = this._view;
+ var halfAngle = (vm.startAngle + vm.endAngle) / 2;
+ var halfRadius = (vm.innerRadius + vm.outerRadius) / 2;
+ return {
+ x: vm.x + Math.cos(halfAngle) * halfRadius,
+ y: vm.y + Math.sin(halfAngle) * halfRadius
+ };
+ },
+
+ getArea: function () {
+ var vm = this._view;
+ return Math.PI * ((vm.endAngle - vm.startAngle) / (2 * Math.PI)) * (Math.pow(vm.outerRadius, 2) - Math.pow(vm.innerRadius, 2));
+ },
+
+ tooltipPosition: function () {
+ var vm = this._view;
+ var centreAngle = vm.startAngle + ((vm.endAngle - vm.startAngle) / 2);
+ var rangeFromCentre = (vm.outerRadius - vm.innerRadius) / 2 + vm.innerRadius;
+
+ return {
+ x: vm.x + (Math.cos(centreAngle) * rangeFromCentre),
+ y: vm.y + (Math.sin(centreAngle) * rangeFromCentre)
+ };
+ },
+
+ draw: function () {
+ var ctx = this._chart.ctx;
+ var vm = this._view;
+ var sA = vm.startAngle;
+ var eA = vm.endAngle;
+ var pixelMargin = (vm.borderAlign === 'inner') ? 0.33 : 0;
+ var angleMargin;
+
+ ctx.save();
+
+ ctx.beginPath();
+ ctx.arc(vm.x, vm.y, Math.max(vm.outerRadius - pixelMargin, 0), sA, eA);
+ ctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true);
+ ctx.closePath();
+
+ ctx.fillStyle = vm.backgroundColor;
+ ctx.fill();
+
+ if (vm.borderWidth) {
+ if (vm.borderAlign === 'inner') {
+ // Draw an inner border by cliping the arc and drawing a double-width border
+ // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders
+ ctx.beginPath();
+ angleMargin = pixelMargin / vm.outerRadius;
+ ctx.arc(vm.x, vm.y, vm.outerRadius, sA - angleMargin, eA + angleMargin);
+ if (vm.innerRadius > pixelMargin) {
+ angleMargin = pixelMargin / vm.innerRadius;
+ ctx.arc(vm.x, vm.y, vm.innerRadius - pixelMargin, eA + angleMargin, sA - angleMargin, true);
+ } else {
+ ctx.arc(vm.x, vm.y, pixelMargin, eA + Math.PI / 2, sA - Math.PI / 2);
+ }
+ ctx.closePath();
+ ctx.clip();
+
+ ctx.beginPath();
+ ctx.arc(vm.x, vm.y, vm.outerRadius, sA, eA);
+ ctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true);
+ ctx.closePath();
+
+ ctx.lineWidth = vm.borderWidth * 2;
+ ctx.lineJoin = 'round';
+ } else {
+ ctx.lineWidth = vm.borderWidth;
+ ctx.lineJoin = 'bevel';
+ }
+
+ ctx.strokeStyle = vm.borderColor;
+ ctx.stroke();
+ }
+
+ ctx.restore();
+ }
+ });
+
+ var valueOrDefault$1 = helpers$1.valueOrDefault;
+
+ var defaultColor = core_defaults.global.defaultColor;
+
+ core_defaults._set('global', {
+ elements: {
+ line: {
+ tension: 0.4,
+ backgroundColor: defaultColor,
+ borderWidth: 3,
+ borderColor: defaultColor,
+ borderCapStyle: 'butt',
+ borderDash: [],
+ borderDashOffset: 0.0,
+ borderJoinStyle: 'miter',
+ capBezierPoints: true,
+ fill: true, // do we fill in the area between the line and its base axis
+ }
+ }
+ });
+
+ var element_line = core_element.extend({
+ draw: function () {
+ var me = this;
+ var vm = me._view;
+ var ctx = me._chart.ctx;
+ var spanGaps = vm.spanGaps;
+ var points = me._children.slice(); // clone array
+ var globalDefaults = core_defaults.global;
+ var globalOptionLineElements = globalDefaults.elements.line;
+ var lastDrawnIndex = -1;
+ var index, current, previous, currentVM;
+
+ // If we are looping, adding the first point again
+ if (me._loop && points.length) {
+ points.push(points[0]);
+ }
+
+ ctx.save();
+
+ // Stroke Line Options
+ ctx.lineCap = vm.borderCapStyle || globalOptionLineElements.borderCapStyle;
+
+ // IE 9 and 10 do not support line dash
+ if (ctx.setLineDash) {
+ ctx.setLineDash(vm.borderDash || globalOptionLineElements.borderDash);
+ }
+
+ ctx.lineDashOffset = valueOrDefault$1(vm.borderDashOffset, globalOptionLineElements.borderDashOffset);
+ ctx.lineJoin = vm.borderJoinStyle || globalOptionLineElements.borderJoinStyle;
+ ctx.lineWidth = valueOrDefault$1(vm.borderWidth, globalOptionLineElements.borderWidth);
+ ctx.strokeStyle = vm.borderColor || globalDefaults.defaultColor;
+
+ // Stroke Line
+ ctx.beginPath();
+ lastDrawnIndex = -1;
+
+ for (index = 0; index < points.length; ++index) {
+ current = points[index];
+ previous = helpers$1.previousItem(points, index);
+ currentVM = current._view;
+
+ // First point moves to it's starting position no matter what
+ if (index === 0) {
+ if (!currentVM.skip) {
+ ctx.moveTo(currentVM.x, currentVM.y);
+ lastDrawnIndex = index;
+ }
+ } else {
+ previous = lastDrawnIndex === -1 ? previous : points[lastDrawnIndex];
+
+ if (!currentVM.skip) {
+ if ((lastDrawnIndex !== (index - 1) && !spanGaps) || lastDrawnIndex === -1) {
+ // There was a gap and this is the first point after the gap
+ ctx.moveTo(currentVM.x, currentVM.y);
+ } else {
+ // Line to next point
+ helpers$1.canvas.lineTo(ctx, previous._view, current._view);
+ }
+ lastDrawnIndex = index;
+ }
+ }
+ }
+
+ ctx.stroke();
+ ctx.restore();
+ }
+ });
+
+ var valueOrDefault$2 = helpers$1.valueOrDefault;
+
+ var defaultColor$1 = core_defaults.global.defaultColor;
+
+ core_defaults._set('global', {
+ elements: {
+ point: {
+ radius: 3,
+ pointStyle: 'circle',
+ backgroundColor: defaultColor$1,
+ borderColor: defaultColor$1,
+ borderWidth: 1,
+ // Hover
+ hitRadius: 1,
+ hoverRadius: 4,
+ hoverBorderWidth: 1
+ }
+ }
+ });
+
+ function xRange(mouseX) {
+ var vm = this._view;
+ return vm ? (Math.abs(mouseX - vm.x) < vm.radius + vm.hitRadius) : false;
+ }
+
+ function yRange(mouseY) {
+ var vm = this._view;
+ return vm ? (Math.abs(mouseY - vm.y) < vm.radius + vm.hitRadius) : false;
+ }
+
+ var element_point = core_element.extend({
+ inRange: function (mouseX, mouseY) {
+ var vm = this._view;
+ return vm ? ((Math.pow(mouseX - vm.x, 2) + Math.pow(mouseY - vm.y, 2)) < Math.pow(vm.hitRadius + vm.radius, 2)) : false;
+ },
+
+ inLabelRange: xRange,
+ inXRange: xRange,
+ inYRange: yRange,
+
+ getCenterPoint: function () {
+ var vm = this._view;
+ return {
+ x: vm.x,
+ y: vm.y
+ };
+ },
+
+ getArea: function () {
+ return Math.PI * Math.pow(this._view.radius, 2);
+ },
+
+ tooltipPosition: function () {
+ var vm = this._view;
+ return {
+ x: vm.x,
+ y: vm.y,
+ padding: vm.radius + vm.borderWidth
+ };
+ },
+
+ draw: function (chartArea) {
+ var vm = this._view;
+ var ctx = this._chart.ctx;
+ var pointStyle = vm.pointStyle;
+ var rotation = vm.rotation;
+ var radius = vm.radius;
+ var x = vm.x;
+ var y = vm.y;
+ var globalDefaults = core_defaults.global;
+ var defaultColor = globalDefaults.defaultColor; // eslint-disable-line no-shadow
+
+ if (vm.skip) {
+ return;
+ }
+
+ // Clipping for Points.
+ if (chartArea === undefined || helpers$1.canvas._isPointInArea(vm, chartArea)) {
+ ctx.strokeStyle = vm.borderColor || defaultColor;
+ ctx.lineWidth = valueOrDefault$2(vm.borderWidth, globalDefaults.elements.point.borderWidth);
+ ctx.fillStyle = vm.backgroundColor || defaultColor;
+ helpers$1.canvas.drawPoint(ctx, pointStyle, radius, x, y, rotation);
+ }
+ }
+ });
+
+ var defaultColor$2 = core_defaults.global.defaultColor;
+
+ core_defaults._set('global', {
+ elements: {
+ rectangle: {
+ backgroundColor: defaultColor$2,
+ borderColor: defaultColor$2,
+ borderSkipped: 'bottom',
+ borderWidth: 0
+ }
+ }
+ });
+
+ function isVertical(vm) {
+ return vm && vm.width !== undefined;
+ }
+
+ /**
+ * Helper function to get the bounds of the bar regardless of the orientation
+ * @param bar {Chart.Element.Rectangle} the bar
+ * @return {Bounds} bounds of the bar
+ * @private
+ */
+ function getBarBounds(vm) {
+ var x1, x2, y1, y2, half;
+
+ if (isVertical(vm)) {
+ half = vm.width / 2;
+ x1 = vm.x - half;
+ x2 = vm.x + half;
+ y1 = Math.min(vm.y, vm.base);
+ y2 = Math.max(vm.y, vm.base);
+ } else {
+ half = vm.height / 2;
+ x1 = Math.min(vm.x, vm.base);
+ x2 = Math.max(vm.x, vm.base);
+ y1 = vm.y - half;
+ y2 = vm.y + half;
+ }
+
+ return {
+ left: x1,
+ top: y1,
+ right: x2,
+ bottom: y2
+ };
+ }
+
+ function swap(orig, v1, v2) {
+ return orig === v1 ? v2 : orig === v2 ? v1 : orig;
+ }
+
+ function parseBorderSkipped(vm) {
+ var edge = vm.borderSkipped;
+ var res = {};
+
+ if (!edge) {
+ return res;
+ }
+
+ if (vm.horizontal) {
+ if (vm.base > vm.x) {
+ edge = swap(edge, 'left', 'right');
+ }
+ } else if (vm.base < vm.y) {
+ edge = swap(edge, 'bottom', 'top');
+ }
+
+ res[edge] = true;
+ return res;
+ }
+
+ function parseBorderWidth(vm, maxW, maxH) {
+ var value = vm.borderWidth;
+ var skip = parseBorderSkipped(vm);
+ var t, r, b, l;
+
+ if (helpers$1.isObject(value)) {
+ t = +value.top || 0;
+ r = +value.right || 0;
+ b = +value.bottom || 0;
+ l = +value.left || 0;
+ } else {
+ t = r = b = l = +value || 0;
+ }
+
+ return {
+ t: skip.top || (t < 0) ? 0 : t > maxH ? maxH : t,
+ r: skip.right || (r < 0) ? 0 : r > maxW ? maxW : r,
+ b: skip.bottom || (b < 0) ? 0 : b > maxH ? maxH : b,
+ l: skip.left || (l < 0) ? 0 : l > maxW ? maxW : l
+ };
+ }
+
+ function boundingRects(vm) {
+ var bounds = getBarBounds(vm);
+ var width = bounds.right - bounds.left;
+ var height = bounds.bottom - bounds.top;
+ var border = parseBorderWidth(vm, width / 2, height / 2);
+
+ return {
+ outer: {
+ x: bounds.left,
+ y: bounds.top,
+ w: width,
+ h: height
+ },
+ inner: {
+ x: bounds.left + border.l,
+ y: bounds.top + border.t,
+ w: width - border.l - border.r,
+ h: height - border.t - border.b
+ }
+ };
+ }
+
+ function inRange(vm, x, y) {
+ var skipX = x === null;
+ var skipY = y === null;
+ var bounds = !vm || (skipX && skipY) ? false : getBarBounds(vm);
+
+ return bounds
+ && (skipX || x >= bounds.left && x <= bounds.right)
+ && (skipY || y >= bounds.top && y <= bounds.bottom);
+ }
+
+ var element_rectangle = core_element.extend({
+ draw: function () {
+ var ctx = this._chart.ctx;
+ var vm = this._view;
+ var rects = boundingRects(vm);
+ var outer = rects.outer;
+ var inner = rects.inner;
+
+ ctx.fillStyle = vm.backgroundColor;
+ ctx.fillRect(outer.x, outer.y, outer.w, outer.h);
+
+ if (outer.w === inner.w && outer.h === inner.h) {
+ return;
+ }
+
+ ctx.save();
+ ctx.beginPath();
+ ctx.rect(outer.x, outer.y, outer.w, outer.h);
+ ctx.clip();
+ ctx.fillStyle = vm.borderColor;
+ ctx.rect(inner.x, inner.y, inner.w, inner.h);
+ ctx.fill('evenodd');
+ ctx.restore();
+ },
+
+ height: function () {
+ var vm = this._view;
+ return vm.base - vm.y;
+ },
+
+ inRange: function (mouseX, mouseY) {
+ return inRange(this._view, mouseX, mouseY);
+ },
+
+ inLabelRange: function (mouseX, mouseY) {
+ var vm = this._view;
+ return isVertical(vm)
+ ? inRange(vm, mouseX, null)
+ : inRange(vm, null, mouseY);
+ },
+
+ inXRange: function (mouseX) {
+ return inRange(this._view, mouseX, null);
+ },
+
+ inYRange: function (mouseY) {
+ return inRange(this._view, null, mouseY);
+ },
+
+ getCenterPoint: function () {
+ var vm = this._view;
+ var x, y;
+ if (isVertical(vm)) {
+ x = vm.x;
+ y = (vm.y + vm.base) / 2;
+ } else {
+ x = (vm.x + vm.base) / 2;
+ y = vm.y;
+ }
+
+ return {x: x, y: y};
+ },
+
+ getArea: function () {
+ var vm = this._view;
+
+ return isVertical(vm)
+ ? vm.width * Math.abs(vm.y - vm.base)
+ : vm.height * Math.abs(vm.x - vm.base);
+ },
+
+ tooltipPosition: function () {
+ var vm = this._view;
+ return {
+ x: vm.x,
+ y: vm.y
+ };
+ }
+ });
+
+ var elements = {};
+ var Arc = element_arc;
+ var Line = element_line;
+ var Point = element_point;
+ var Rectangle = element_rectangle;
+ elements.Arc = Arc;
+ elements.Line = Line;
+ elements.Point = Point;
+ elements.Rectangle = Rectangle;
+
+ var resolve$1 = helpers$1.options.resolve;
+
+ core_defaults._set('bar', {
+ hover: {
+ mode: 'label'
+ },
+
+ scales: {
+ xAxes: [{
+ type: 'category',
+ categoryPercentage: 0.8,
+ barPercentage: 0.9,
+ offset: true,
+ gridLines: {
+ offsetGridLines: true
+ }
+ }],
+
+ yAxes: [{
+ type: 'linear'
+ }]
+ }
+ });
+
+ /**
+ * Computes the "optimal" sample size to maintain bars equally sized while preventing overlap.
+ * @private
+ */
+ function computeMinSampleSize(scale, pixels) {
+ var min = scale.isHorizontal() ? scale.width : scale.height;
+ var ticks = scale.getTicks();
+ var prev, curr, i, ilen;
+
+ for (i = 1, ilen = pixels.length; i < ilen; ++i) {
+ min = Math.min(min, Math.abs(pixels[i] - pixels[i - 1]));
+ }
+
+ for (i = 0, ilen = ticks.length; i < ilen; ++i) {
+ curr = scale.getPixelForTick(i);
+ min = i > 0 ? Math.min(min, curr - prev) : min;
+ prev = curr;
+ }
+
+ return min;
+ }
+
+ /**
+ * Computes an "ideal" category based on the absolute bar thickness or, if undefined or null,
+ * uses the smallest interval (see computeMinSampleSize) that prevents bar overlapping. This
+ * mode currently always generates bars equally sized (until we introduce scriptable options?).
+ * @private
+ */
+ function computeFitCategoryTraits(index, ruler, options) {
+ var thickness = options.barThickness;
+ var count = ruler.stackCount;
+ var curr = ruler.pixels[index];
+ var size, ratio;
+
+ if (helpers$1.isNullOrUndef(thickness)) {
+ size = ruler.min * options.categoryPercentage;
+ ratio = options.barPercentage;
+ } else {
+ // When bar thickness is enforced, category and bar percentages are ignored.
+ // Note(SB): we could add support for relative bar thickness (e.g. barThickness: '50%')
+ // and deprecate barPercentage since this value is ignored when thickness is absolute.
+ size = thickness * count;
+ ratio = 1;
+ }
+
+ return {
+ chunk: size / count,
+ ratio: ratio,
+ start: curr - (size / 2)
+ };
+ }
+
+ /**
+ * Computes an "optimal" category that globally arranges bars side by side (no gap when
+ * percentage options are 1), based on the previous and following categories. This mode
+ * generates bars with different widths when data are not evenly spaced.
+ * @private
+ */
+ function computeFlexCategoryTraits(index, ruler, options) {
+ var pixels = ruler.pixels;
+ var curr = pixels[index];
+ var prev = index > 0 ? pixels[index - 1] : null;
+ var next = index < pixels.length - 1 ? pixels[index + 1] : null;
+ var percent = options.categoryPercentage;
+ var start, size;
+
+ if (prev === null) {
+ // first data: its size is double based on the next point or,
+ // if it's also the last data, we use the scale size.
+ prev = curr - (next === null ? ruler.end - ruler.start : next - curr);
+ }
+
+ if (next === null) {
+ // last data: its size is also double based on the previous point.
+ next = curr + curr - prev;
+ }
+
+ start = curr - (curr - Math.min(prev, next)) / 2 * percent;
+ size = Math.abs(next - prev) / 2 * percent;
+
+ return {
+ chunk: size / ruler.stackCount,
+ ratio: options.barPercentage,
+ start: start
+ };
+ }
+
+ var controller_bar = core_datasetController.extend({
+
+ dataElementType: elements.Rectangle,
+
+ initialize: function () {
+ var me = this;
+ var meta;
+
+ core_datasetController.prototype.initialize.apply(me, arguments);
+
+ meta = me.getMeta();
+ meta.stack = me.getDataset().stack;
+ meta.bar = true;
+ },
+
+ update: function (reset) {
+ var me = this;
+ var rects = me.getMeta().data;
+ var i, ilen;
+
+ me._ruler = me.getRuler();
+
+ for (i = 0, ilen = rects.length; i < ilen; ++i) {
+ me.updateElement(rects[i], i, reset);
+ }
+ },
+
+ updateElement: function (rectangle, index, reset) {
+ var me = this;
+ var meta = me.getMeta();
+ var dataset = me.getDataset();
+ var options = me._resolveElementOptions(rectangle, index);
+
+ rectangle._xScale = me.getScaleForId(meta.xAxisID);
+ rectangle._yScale = me.getScaleForId(meta.yAxisID);
+ rectangle._datasetIndex = me.index;
+ rectangle._index = index;
+ rectangle._model = {
+ backgroundColor: options.backgroundColor,
+ borderColor: options.borderColor,
+ borderSkipped: options.borderSkipped,
+ borderWidth: options.borderWidth,
+ datasetLabel: dataset.label,
+ label: me.chart.data.labels[index]
+ };
+
+ me._updateElementGeometry(rectangle, index, reset);
+
+ rectangle.pivot();
+ },
+
+ /**
+ * @private
+ */
+ _updateElementGeometry: function (rectangle, index, reset) {
+ var me = this;
+ var model = rectangle._model;
+ var vscale = me._getValueScale();
+ var base = vscale.getBasePixel();
+ var horizontal = vscale.isHorizontal();
+ var ruler = me._ruler || me.getRuler();
+ var vpixels = me.calculateBarValuePixels(me.index, index);
+ var ipixels = me.calculateBarIndexPixels(me.index, index, ruler);
+
+ model.horizontal = horizontal;
+ model.base = reset ? base : vpixels.base;
+ model.x = horizontal ? reset ? base : vpixels.head : ipixels.center;
+ model.y = horizontal ? ipixels.center : reset ? base : vpixels.head;
+ model.height = horizontal ? ipixels.size : undefined;
+ model.width = horizontal ? undefined : ipixels.size;
+ },
+
+ /**
+ * Returns the stacks based on groups and bar visibility.
+ * @param {number} [last] - The dataset index
+ * @returns {string[]} The list of stack IDs
+ * @private
+ */
+ _getStacks: function (last) {
+ var me = this;
+ var chart = me.chart;
+ var scale = me._getIndexScale();
+ var stacked = scale.options.stacked;
+ var ilen = last === undefined ? chart.data.datasets.length : last + 1;
+ var stacks = [];
+ var i, meta;
+
+ for (i = 0; i < ilen; ++i) {
+ meta = chart.getDatasetMeta(i);
+ if (meta.bar && chart.isDatasetVisible(i) &&
+ (stacked === false ||
+ (stacked === true && stacks.indexOf(meta.stack) === -1) ||
+ (stacked === undefined && (meta.stack === undefined || stacks.indexOf(meta.stack) === -1)))) {
+ stacks.push(meta.stack);
+ }
+ }
+
+ return stacks;
+ },
+
+ /**
+ * Returns the effective number of stacks based on groups and bar visibility.
+ * @private
+ */
+ getStackCount: function () {
+ return this._getStacks().length;
+ },
+
+ /**
+ * Returns the stack index for the given dataset based on groups and bar visibility.
+ * @param {number} [datasetIndex] - The dataset index
+ * @param {string} [name] - The stack name to find
+ * @returns {number} The stack index
+ * @private
+ */
+ getStackIndex: function (datasetIndex, name) {
+ var stacks = this._getStacks(datasetIndex);
+ var index = (name !== undefined)
+ ? stacks.indexOf(name)
+ : -1; // indexOf returns -1 if element is not present
+
+ return (index === -1)
+ ? stacks.length - 1
+ : index;
+ },
+
+ /**
+ * @private
+ */
+ getRuler: function () {
+ var me = this;
+ var scale = me._getIndexScale();
+ var stackCount = me.getStackCount();
+ var datasetIndex = me.index;
+ var isHorizontal = scale.isHorizontal();
+ var start = isHorizontal ? scale.left : scale.top;
+ var end = start + (isHorizontal ? scale.width : scale.height);
+ var pixels = [];
+ var i, ilen, min;
+
+ for (i = 0, ilen = me.getMeta().data.length; i < ilen; ++i) {
+ pixels.push(scale.getPixelForValue(null, i, datasetIndex));
+ }
+
+ min = helpers$1.isNullOrUndef(scale.options.barThickness)
+ ? computeMinSampleSize(scale, pixels)
+ : -1;
+
+ return {
+ min: min,
+ pixels: pixels,
+ start: start,
+ end: end,
+ stackCount: stackCount,
+ scale: scale
+ };
+ },
+
+ /**
+ * Note: pixel values are not clamped to the scale area.
+ * @private
+ */
+ calculateBarValuePixels: function (datasetIndex, index) {
+ var me = this;
+ var chart = me.chart;
+ var meta = me.getMeta();
+ var scale = me._getValueScale();
+ var isHorizontal = scale.isHorizontal();
+ var datasets = chart.data.datasets;
+ var value = +scale.getRightValue(datasets[datasetIndex].data[index]);
+ var minBarLength = scale.options.minBarLength;
+ var stacked = scale.options.stacked;
+ var stack = meta.stack;
+ var start = 0;
+ var i, imeta, ivalue, base, head, size;
+
+ if (stacked || (stacked === undefined && stack !== undefined)) {
+ for (i = 0; i < datasetIndex; ++i) {
+ imeta = chart.getDatasetMeta(i);
+
+ if (imeta.bar &&
+ imeta.stack === stack &&
+ imeta.controller._getValueScaleId() === scale.id &&
+ chart.isDatasetVisible(i)) {
+
+ ivalue = +scale.getRightValue(datasets[i].data[index]);
+ if ((value < 0 && ivalue < 0) || (value >= 0 && ivalue > 0)) {
+ start += ivalue;
+ }
+ }
+ }
+ }
+
+ base = scale.getPixelForValue(start);
+ head = scale.getPixelForValue(start + value);
+ size = head - base;
+
+ if (minBarLength !== undefined && Math.abs(size) < minBarLength) {
+ size = minBarLength;
+ if (value >= 0 && !isHorizontal || value < 0 && isHorizontal) {
+ head = base - minBarLength;
+ } else {
+ head = base + minBarLength;
+ }
+ }
+
+ return {
+ size: size,
+ base: base,
+ head: head,
+ center: head + size / 2
+ };
+ },
+
+ /**
+ * @private
+ */
+ calculateBarIndexPixels: function (datasetIndex, index, ruler) {
+ var me = this;
+ var options = ruler.scale.options;
+ var range = options.barThickness === 'flex'
+ ? computeFlexCategoryTraits(index, ruler, options)
+ : computeFitCategoryTraits(index, ruler, options);
+
+ var stackIndex = me.getStackIndex(datasetIndex, me.getMeta().stack);
+ var center = range.start + (range.chunk * stackIndex) + (range.chunk / 2);
+ var size = Math.min(
+ helpers$1.valueOrDefault(options.maxBarThickness, Infinity),
+ range.chunk * range.ratio);
+
+ return {
+ base: center - size / 2,
+ head: center + size / 2,
+ center: center,
+ size: size
+ };
+ },
+
+ draw: function () {
+ var me = this;
+ var chart = me.chart;
+ var scale = me._getValueScale();
+ var rects = me.getMeta().data;
+ var dataset = me.getDataset();
+ var ilen = rects.length;
+ var i = 0;
+
+ helpers$1.canvas.clipArea(chart.ctx, chart.chartArea);
+
+ for (; i < ilen; ++i) {
+ if (!isNaN(scale.getRightValue(dataset.data[i]))) {
+ rects[i].draw();
+ }
+ }
+
+ helpers$1.canvas.unclipArea(chart.ctx);
+ },
+
+ /**
+ * @private
+ */
+ _resolveElementOptions: function (rectangle, index) {
+ var me = this;
+ var chart = me.chart;
+ var datasets = chart.data.datasets;
+ var dataset = datasets[me.index];
+ var custom = rectangle.custom || {};
+ var options = chart.options.elements.rectangle;
+ var values = {};
+ var i, ilen, key;
+
+ // Scriptable options
+ var context = {
+ chart: chart,
+ dataIndex: index,
+ dataset: dataset,
+ datasetIndex: me.index
+ };
+
+ var keys = [
+ 'backgroundColor',
+ 'borderColor',
+ 'borderSkipped',
+ 'borderWidth'
+ ];
+
+ for (i = 0, ilen = keys.length; i < ilen; ++i) {
+ key = keys[i];
+ values[key] = resolve$1([
+ custom[key],
+ dataset[key],
+ options[key]
+ ], context, index);
+ }
+
+ return values;
+ }
+ });
+
+ var valueOrDefault$3 = helpers$1.valueOrDefault;
+ var resolve$2 = helpers$1.options.resolve;
+
+ core_defaults._set('bubble', {
+ hover: {
+ mode: 'single'
+ },
+
+ scales: {
+ xAxes: [{
+ type: 'linear', // bubble should probably use a linear scale by default
+ position: 'bottom',
+ id: 'x-axis-0' // need an ID so datasets can reference the scale
+ }],
+ yAxes: [{
+ type: 'linear',
+ position: 'left',
+ id: 'y-axis-0'
+ }]
+ },
+
+ tooltips: {
+ callbacks: {
+ title: function () {
+ // Title doesn't make sense for scatter since we format the data as a point
+ return '';
+ },
+ label: function (item, data) {
+ var datasetLabel = data.datasets[item.datasetIndex].label || '';
+ var dataPoint = data.datasets[item.datasetIndex].data[item.index];
+ return datasetLabel + ': (' + item.xLabel + ', ' + item.yLabel + ', ' + dataPoint.r + ')';
+ }
+ }
+ }
+ });
+
+ var controller_bubble = core_datasetController.extend({
+ /**
+ * @protected
+ */
+ dataElementType: elements.Point,
+
+ /**
+ * @protected
+ */
+ update: function (reset) {
+ var me = this;
+ var meta = me.getMeta();
+ var points = meta.data;
+
+ // Update Points
+ helpers$1.each(points, function (point, index) {
+ me.updateElement(point, index, reset);
+ });
+ },
+
+ /**
+ * @protected
+ */
+ updateElement: function (point, index, reset) {
+ var me = this;
+ var meta = me.getMeta();
+ var custom = point.custom || {};
+ var xScale = me.getScaleForId(meta.xAxisID);
+ var yScale = me.getScaleForId(meta.yAxisID);
+ var options = me._resolveElementOptions(point, index);
+ var data = me.getDataset().data[index];
+ var dsIndex = me.index;
+
+ var x = reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue(typeof data === 'object' ? data : NaN, index, dsIndex);
+ var y = reset ? yScale.getBasePixel() : yScale.getPixelForValue(data, index, dsIndex);
+
+ point._xScale = xScale;
+ point._yScale = yScale;
+ point._options = options;
+ point._datasetIndex = dsIndex;
+ point._index = index;
+ point._model = {
+ backgroundColor: options.backgroundColor,
+ borderColor: options.borderColor,
+ borderWidth: options.borderWidth,
+ hitRadius: options.hitRadius,
+ pointStyle: options.pointStyle,
+ rotation: options.rotation,
+ radius: reset ? 0 : options.radius,
+ skip: custom.skip || isNaN(x) || isNaN(y),
+ x: x,
+ y: y,
+ };
+
+ point.pivot();
+ },
+
+ /**
+ * @protected
+ */
+ setHoverStyle: function (point) {
+ var model = point._model;
+ var options = point._options;
+ var getHoverColor = helpers$1.getHoverColor;
+
+ point.$previousStyle = {
+ backgroundColor: model.backgroundColor,
+ borderColor: model.borderColor,
+ borderWidth: model.borderWidth,
+ radius: model.radius
+ };
+
+ model.backgroundColor = valueOrDefault$3(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));
+ model.borderColor = valueOrDefault$3(options.hoverBorderColor, getHoverColor(options.borderColor));
+ model.borderWidth = valueOrDefault$3(options.hoverBorderWidth, options.borderWidth);
+ model.radius = options.radius + options.hoverRadius;
+ },
+
+ /**
+ * @private
+ */
+ _resolveElementOptions: function (point, index) {
+ var me = this;
+ var chart = me.chart;
+ var datasets = chart.data.datasets;
+ var dataset = datasets[me.index];
+ var custom = point.custom || {};
+ var options = chart.options.elements.point;
+ var data = dataset.data[index];
+ var values = {};
+ var i, ilen, key;
+
+ // Scriptable options
+ var context = {
+ chart: chart,
+ dataIndex: index,
+ dataset: dataset,
+ datasetIndex: me.index
+ };
+
+ var keys = [
+ 'backgroundColor',
+ 'borderColor',
+ 'borderWidth',
+ 'hoverBackgroundColor',
+ 'hoverBorderColor',
+ 'hoverBorderWidth',
+ 'hoverRadius',
+ 'hitRadius',
+ 'pointStyle',
+ 'rotation'
+ ];
+
+ for (i = 0, ilen = keys.length; i < ilen; ++i) {
+ key = keys[i];
+ values[key] = resolve$2([
+ custom[key],
+ dataset[key],
+ options[key]
+ ], context, index);
+ }
+
+ // Custom radius resolution
+ values.radius = resolve$2([
+ custom.radius,
+ data ? data.r : undefined,
+ dataset.radius,
+ options.radius
+ ], context, index);
+
+ return values;
+ }
+ });
+
+ var resolve$3 = helpers$1.options.resolve;
+ var valueOrDefault$4 = helpers$1.valueOrDefault;
+
+ core_defaults._set('doughnut', {
+ animation: {
+ // Boolean - Whether we animate the rotation of the Doughnut
+ animateRotate: true,
+ // Boolean - Whether we animate scaling the Doughnut from the centre
+ animateScale: false
+ },
+ hover: {
+ mode: 'single'
+ },
+ legendCallback: function (chart) {
+ var text = [];
+ text.push('
');
+
+ var data = chart.data;
+ var datasets = data.datasets;
+ var labels = data.labels;
+
+ if (datasets.length) {
+ for (var i = 0; i < datasets[0].data.length; ++i) {
+ text.push('
');
+ return text.join('');
+ },
+ legend: {
+ labels: {
+ generateLabels: function (chart) {
+ var data = chart.data;
+ if (data.labels.length && data.datasets.length) {
+ return data.labels.map(function (label, i) {
+ var meta = chart.getDatasetMeta(0);
+ var ds = data.datasets[0];
+ var arc = meta.data[i];
+ var custom = arc && arc.custom || {};
+ var arcOpts = chart.options.elements.arc;
+ var fill = resolve$3([custom.backgroundColor, ds.backgroundColor, arcOpts.backgroundColor], undefined, i);
+ var stroke = resolve$3([custom.borderColor, ds.borderColor, arcOpts.borderColor], undefined, i);
+ var bw = resolve$3([custom.borderWidth, ds.borderWidth, arcOpts.borderWidth], undefined, i);
+
+ return {
+ text: label,
+ fillStyle: fill,
+ strokeStyle: stroke,
+ lineWidth: bw,
+ hidden: isNaN(ds.data[i]) || meta.data[i].hidden,
+
+ // Extra data used for toggling the correct item
+ index: i
+ };
+ });
+ }
+ return [];
+ }
+ },
+
+ onClick: function (e, legendItem) {
+ var index = legendItem.index;
+ var chart = this.chart;
+ var i, ilen, meta;
+
+ for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {
+ meta = chart.getDatasetMeta(i);
+ // toggle visibility of index if exists
+ if (meta.data[index]) {
+ meta.data[index].hidden = !meta.data[index].hidden;
+ }
+ }
+
+ chart.update();
+ }
+ },
+
+ // The percentage of the chart that we cut out of the middle.
+ cutoutPercentage: 50,
+
+ // The rotation of the chart, where the first data arc begins.
+ rotation: Math.PI * -0.5,
+
+ // The total circumference of the chart.
+ circumference: Math.PI * 2.0,
+
+ // Need to override these to give a nice default
+ tooltips: {
+ callbacks: {
+ title: function () {
+ return '';
+ },
+ label: function (tooltipItem, data) {
+ var dataLabel = data.labels[tooltipItem.index];
+ var value = ': ' + data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index];
+
+ if (helpers$1.isArray(dataLabel)) {
+ // show value on first line of multiline label
+ // need to clone because we are changing the value
+ dataLabel = dataLabel.slice();
+ dataLabel[0] += value;
+ } else {
+ dataLabel += value;
+ }
+
+ return dataLabel;
+ }
+ }
+ }
+ });
+
+ var controller_doughnut = core_datasetController.extend({
+
+ dataElementType: elements.Arc,
+
+ linkScales: helpers$1.noop,
+
+ // Get index of the dataset in relation to the visible datasets. This allows determining the inner and outer radius correctly
+ getRingIndex: function (datasetIndex) {
+ var ringIndex = 0;
+
+ for (var j = 0; j < datasetIndex; ++j) {
+ if (this.chart.isDatasetVisible(j)) {
+ ++ringIndex;
+ }
+ }
+
+ return ringIndex;
+ },
+
+ update: function (reset) {
+ var me = this;
+ var chart = me.chart;
+ var chartArea = chart.chartArea;
+ var opts = chart.options;
+ var availableWidth = chartArea.right - chartArea.left;
+ var availableHeight = chartArea.bottom - chartArea.top;
+ var minSize = Math.min(availableWidth, availableHeight);
+ var offset = {x: 0, y: 0};
+ var meta = me.getMeta();
+ var arcs = meta.data;
+ var cutoutPercentage = opts.cutoutPercentage;
+ var circumference = opts.circumference;
+ var chartWeight = me._getRingWeight(me.index);
+ var i, ilen;
+
+ // If the chart's circumference isn't a full circle, calculate minSize as a ratio of the width/height of the arc
+ if (circumference < Math.PI * 2.0) {
+ var startAngle = opts.rotation % (Math.PI * 2.0);
+ startAngle += Math.PI * 2.0 * (startAngle >= Math.PI ? -1 : startAngle < -Math.PI ? 1 : 0);
+ var endAngle = startAngle + circumference;
+ var start = {x: Math.cos(startAngle), y: Math.sin(startAngle)};
+ var end = {x: Math.cos(endAngle), y: Math.sin(endAngle)};
+ var contains0 = (startAngle <= 0 && endAngle >= 0) || (startAngle <= Math.PI * 2.0 && Math.PI * 2.0 <= endAngle);
+ var contains90 = (startAngle <= Math.PI * 0.5 && Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 2.5 && Math.PI * 2.5 <= endAngle);
+ var contains180 = (startAngle <= -Math.PI && -Math.PI <= endAngle) || (startAngle <= Math.PI && Math.PI <= endAngle);
+ var contains270 = (startAngle <= -Math.PI * 0.5 && -Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 1.5 && Math.PI * 1.5 <= endAngle);
+ var cutout = cutoutPercentage / 100.0;
+ var min = {
+ x: contains180 ? -1 : Math.min(start.x * (start.x < 0 ? 1 : cutout), end.x * (end.x < 0 ? 1 : cutout)),
+ y: contains270 ? -1 : Math.min(start.y * (start.y < 0 ? 1 : cutout), end.y * (end.y < 0 ? 1 : cutout))
+ };
+ var max = {
+ x: contains0 ? 1 : Math.max(start.x * (start.x > 0 ? 1 : cutout), end.x * (end.x > 0 ? 1 : cutout)),
+ y: contains90 ? 1 : Math.max(start.y * (start.y > 0 ? 1 : cutout), end.y * (end.y > 0 ? 1 : cutout))
+ };
+ var size = {width: (max.x - min.x) * 0.5, height: (max.y - min.y) * 0.5};
+ minSize = Math.min(availableWidth / size.width, availableHeight / size.height);
+ offset = {x: (max.x + min.x) * -0.5, y: (max.y + min.y) * -0.5};
+ }
+
+ for (i = 0, ilen = arcs.length; i < ilen; ++i) {
+ arcs[i]._options = me._resolveElementOptions(arcs[i], i);
+ }
+
+ chart.borderWidth = me.getMaxBorderWidth();
+ chart.outerRadius = Math.max((minSize - chart.borderWidth) / 2, 0);
+ chart.innerRadius = Math.max(cutoutPercentage ? (chart.outerRadius / 100) * (cutoutPercentage) : 0, 0);
+ chart.radiusLength = (chart.outerRadius - chart.innerRadius) / (me._getVisibleDatasetWeightTotal() || 1);
+ chart.offsetX = offset.x * chart.outerRadius;
+ chart.offsetY = offset.y * chart.outerRadius;
+
+ meta.total = me.calculateTotal();
+
+ me.outerRadius = chart.outerRadius - chart.radiusLength * me._getRingWeightOffset(me.index);
+ me.innerRadius = Math.max(me.outerRadius - chart.radiusLength * chartWeight, 0);
+
+ for (i = 0, ilen = arcs.length; i < ilen; ++i) {
+ me.updateElement(arcs[i], i, reset);
+ }
+ },
+
+ updateElement: function (arc, index, reset) {
+ var me = this;
+ var chart = me.chart;
+ var chartArea = chart.chartArea;
+ var opts = chart.options;
+ var animationOpts = opts.animation;
+ var centerX = (chartArea.left + chartArea.right) / 2;
+ var centerY = (chartArea.top + chartArea.bottom) / 2;
+ var startAngle = opts.rotation; // non reset case handled later
+ var endAngle = opts.rotation; // non reset case handled later
+ var dataset = me.getDataset();
+ var circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : me.calculateCircumference(dataset.data[index]) * (opts.circumference / (2.0 * Math.PI));
+ var innerRadius = reset && animationOpts.animateScale ? 0 : me.innerRadius;
+ var outerRadius = reset && animationOpts.animateScale ? 0 : me.outerRadius;
+ var options = arc._options || {};
+
+ helpers$1.extend(arc, {
+ // Utility
+ _datasetIndex: me.index,
+ _index: index,
+
+ // Desired view properties
+ _model: {
+ backgroundColor: options.backgroundColor,
+ borderColor: options.borderColor,
+ borderWidth: options.borderWidth,
+ borderAlign: options.borderAlign,
+ x: centerX + chart.offsetX,
+ y: centerY + chart.offsetY,
+ startAngle: startAngle,
+ endAngle: endAngle,
+ circumference: circumference,
+ outerRadius: outerRadius,
+ innerRadius: innerRadius,
+ label: helpers$1.valueAtIndexOrDefault(dataset.label, index, chart.data.labels[index])
+ }
+ });
+
+ var model = arc._model;
+
+ // Set correct angles if not resetting
+ if (!reset || !animationOpts.animateRotate) {
+ if (index === 0) {
+ model.startAngle = opts.rotation;
+ } else {
+ model.startAngle = me.getMeta().data[index - 1]._model.endAngle;
+ }
+
+ model.endAngle = model.startAngle + model.circumference;
+ }
+
+ arc.pivot();
+ },
+
+ calculateTotal: function () {
+ var dataset = this.getDataset();
+ var meta = this.getMeta();
+ var total = 0;
+ var value;
+
+ helpers$1.each(meta.data, function (element, index) {
+ value = dataset.data[index];
+ if (!isNaN(value) && !element.hidden) {
+ total += Math.abs(value);
+ }
+ });
+
+ /* if (total === 0) {
+ total = NaN;
+ }*/
+
+ return total;
+ },
+
+ calculateCircumference: function (value) {
+ var total = this.getMeta().total;
+ if (total > 0 && !isNaN(value)) {
+ return (Math.PI * 2.0) * (Math.abs(value) / total);
+ }
+ return 0;
+ },
+
+ // gets the max border or hover width to properly scale pie charts
+ getMaxBorderWidth: function (arcs) {
+ var me = this;
+ var max = 0;
+ var chart = me.chart;
+ var i, ilen, meta, arc, controller, options, borderWidth, hoverWidth;
+
+ if (!arcs) {
+ // Find the outmost visible dataset
+ for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) {
+ if (chart.isDatasetVisible(i)) {
+ meta = chart.getDatasetMeta(i);
+ arcs = meta.data;
+ if (i !== me.index) {
+ controller = meta.controller;
+ }
+ break;
+ }
+ }
+ }
+
+ if (!arcs) {
+ return 0;
+ }
+
+ for (i = 0, ilen = arcs.length; i < ilen; ++i) {
+ arc = arcs[i];
+ options = controller ? controller._resolveElementOptions(arc, i) : arc._options;
+ if (options.borderAlign !== 'inner') {
+ borderWidth = options.borderWidth;
+ hoverWidth = options.hoverBorderWidth;
+
+ max = borderWidth > max ? borderWidth : max;
+ max = hoverWidth > max ? hoverWidth : max;
+ }
+ }
+ return max;
+ },
+
+ /**
+ * @protected
+ */
+ setHoverStyle: function (arc) {
+ var model = arc._model;
+ var options = arc._options;
+ var getHoverColor = helpers$1.getHoverColor;
+
+ arc.$previousStyle = {
+ backgroundColor: model.backgroundColor,
+ borderColor: model.borderColor,
+ borderWidth: model.borderWidth,
+ };
+
+ model.backgroundColor = valueOrDefault$4(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));
+ model.borderColor = valueOrDefault$4(options.hoverBorderColor, getHoverColor(options.borderColor));
+ model.borderWidth = valueOrDefault$4(options.hoverBorderWidth, options.borderWidth);
+ },
+
+ /**
+ * @private
+ */
+ _resolveElementOptions: function (arc, index) {
+ var me = this;
+ var chart = me.chart;
+ var dataset = me.getDataset();
+ var custom = arc.custom || {};
+ var options = chart.options.elements.arc;
+ var values = {};
+ var i, ilen, key;
+
+ // Scriptable options
+ var context = {
+ chart: chart,
+ dataIndex: index,
+ dataset: dataset,
+ datasetIndex: me.index
+ };
+
+ var keys = [
+ 'backgroundColor',
+ 'borderColor',
+ 'borderWidth',
+ 'borderAlign',
+ 'hoverBackgroundColor',
+ 'hoverBorderColor',
+ 'hoverBorderWidth',
+ ];
+
+ for (i = 0, ilen = keys.length; i < ilen; ++i) {
+ key = keys[i];
+ values[key] = resolve$3([
+ custom[key],
+ dataset[key],
+ options[key]
+ ], context, index);
+ }
+
+ return values;
+ },
+
+ /**
+ * Get radius length offset of the dataset in relation to the visible datasets weights. This allows determining the inner and outer radius correctly
+ * @private
+ */
+ _getRingWeightOffset: function (datasetIndex) {
+ var ringWeightOffset = 0;
+
+ for (var i = 0; i < datasetIndex; ++i) {
+ if (this.chart.isDatasetVisible(i)) {
+ ringWeightOffset += this._getRingWeight(i);
+ }
+ }
+
+ return ringWeightOffset;
+ },
+
+ /**
+ * @private
+ */
+ _getRingWeight: function (dataSetIndex) {
+ return Math.max(valueOrDefault$4(this.chart.data.datasets[dataSetIndex].weight, 1), 0);
+ },
+
+ /**
+ * Returns the sum of all visibile data set weights. This value can be 0.
+ * @private
+ */
+ _getVisibleDatasetWeightTotal: function () {
+ return this._getRingWeightOffset(this.chart.data.datasets.length);
+ }
+ });
+
+ core_defaults._set('horizontalBar', {
+ hover: {
+ mode: 'index',
+ axis: 'y'
+ },
+
+ scales: {
+ xAxes: [{
+ type: 'linear',
+ position: 'bottom'
+ }],
+
+ yAxes: [{
+ type: 'category',
+ position: 'left',
+ categoryPercentage: 0.8,
+ barPercentage: 0.9,
+ offset: true,
+ gridLines: {
+ offsetGridLines: true
+ }
+ }]
+ },
+
+ elements: {
+ rectangle: {
+ borderSkipped: 'left'
+ }
+ },
+
+ tooltips: {
+ mode: 'index',
+ axis: 'y'
+ }
+ });
+
+ var controller_horizontalBar = controller_bar.extend({
+ /**
+ * @private
+ */
+ _getValueScaleId: function () {
+ return this.getMeta().xAxisID;
+ },
+
+ /**
+ * @private
+ */
+ _getIndexScaleId: function () {
+ return this.getMeta().yAxisID;
+ }
+ });
+
+ var valueOrDefault$5 = helpers$1.valueOrDefault;
+ var resolve$4 = helpers$1.options.resolve;
+ var isPointInArea = helpers$1.canvas._isPointInArea;
+
+ core_defaults._set('line', {
+ showLines: true,
+ spanGaps: false,
+
+ hover: {
+ mode: 'label'
+ },
+
+ scales: {
+ xAxes: [{
+ type: 'category',
+ id: 'x-axis-0'
+ }],
+ yAxes: [{
+ type: 'linear',
+ id: 'y-axis-0'
+ }]
+ }
+ });
+
+ function lineEnabled(dataset, options) {
+ return valueOrDefault$5(dataset.showLine, options.showLines);
+ }
+
+ var controller_line = core_datasetController.extend({
+
+ datasetElementType: elements.Line,
+
+ dataElementType: elements.Point,
+
+ update: function (reset) {
+ var me = this;
+ var meta = me.getMeta();
+ var line = meta.dataset;
+ var points = meta.data || [];
+ var scale = me.getScaleForId(meta.yAxisID);
+ var dataset = me.getDataset();
+ var showLine = lineEnabled(dataset, me.chart.options);
+ var i, ilen;
+
+ // Update Line
+ if (showLine) {
+ // Compatibility: If the properties are defined with only the old name, use those values
+ if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) {
+ dataset.lineTension = dataset.tension;
+ }
+
+ // Utility
+ line._scale = scale;
+ line._datasetIndex = me.index;
+ // Data
+ line._children = points;
+ // Model
+ line._model = me._resolveLineOptions(line);
+
+ line.pivot();
+ }
+
+ // Update Points
+ for (i = 0, ilen = points.length; i < ilen; ++i) {
+ me.updateElement(points[i], i, reset);
+ }
+
+ if (showLine && line._model.tension !== 0) {
+ me.updateBezierControlPoints();
+ }
+
+ // Now pivot the point for animation
+ for (i = 0, ilen = points.length; i < ilen; ++i) {
+ points[i].pivot();
+ }
+ },
+
+ updateElement: function (point, index, reset) {
+ var me = this;
+ var meta = me.getMeta();
+ var custom = point.custom || {};
+ var dataset = me.getDataset();
+ var datasetIndex = me.index;
+ var value = dataset.data[index];
+ var yScale = me.getScaleForId(meta.yAxisID);
+ var xScale = me.getScaleForId(meta.xAxisID);
+ var lineModel = meta.dataset._model;
+ var x, y;
+
+ var options = me._resolvePointOptions(point, index);
+
+ x = xScale.getPixelForValue(typeof value === 'object' ? value : NaN, index, datasetIndex);
+ y = reset ? yScale.getBasePixel() : me.calculatePointY(value, index, datasetIndex);
+
+ // Utility
+ point._xScale = xScale;
+ point._yScale = yScale;
+ point._options = options;
+ point._datasetIndex = datasetIndex;
+ point._index = index;
+
+ // Desired view properties
+ point._model = {
+ x: x,
+ y: y,
+ skip: custom.skip || isNaN(x) || isNaN(y),
+ // Appearance
+ radius: options.radius,
+ pointStyle: options.pointStyle,
+ rotation: options.rotation,
+ backgroundColor: options.backgroundColor,
+ borderColor: options.borderColor,
+ borderWidth: options.borderWidth,
+ tension: valueOrDefault$5(custom.tension, lineModel ? lineModel.tension : 0),
+ steppedLine: lineModel ? lineModel.steppedLine : false,
+ // Tooltip
+ hitRadius: options.hitRadius
+ };
+ },
+
+ /**
+ * @private
+ */
+ _resolvePointOptions: function (element, index) {
+ var me = this;
+ var chart = me.chart;
+ var dataset = chart.data.datasets[me.index];
+ var custom = element.custom || {};
+ var options = chart.options.elements.point;
+ var values = {};
+ var i, ilen, key;
+
+ // Scriptable options
+ var context = {
+ chart: chart,
+ dataIndex: index,
+ dataset: dataset,
+ datasetIndex: me.index
+ };
+
+ var ELEMENT_OPTIONS = {
+ backgroundColor: 'pointBackgroundColor',
+ borderColor: 'pointBorderColor',
+ borderWidth: 'pointBorderWidth',
+ hitRadius: 'pointHitRadius',
+ hoverBackgroundColor: 'pointHoverBackgroundColor',
+ hoverBorderColor: 'pointHoverBorderColor',
+ hoverBorderWidth: 'pointHoverBorderWidth',
+ hoverRadius: 'pointHoverRadius',
+ pointStyle: 'pointStyle',
+ radius: 'pointRadius',
+ rotation: 'pointRotation'
+ };
+ var keys = Object.keys(ELEMENT_OPTIONS);
+
+ for (i = 0, ilen = keys.length; i < ilen; ++i) {
+ key = keys[i];
+ values[key] = resolve$4([
+ custom[key],
+ dataset[ELEMENT_OPTIONS[key]],
+ dataset[key],
+ options[key]
+ ], context, index);
+ }
+
+ return values;
+ },
+
+ /**
+ * @private
+ */
+ _resolveLineOptions: function (element) {
+ var me = this;
+ var chart = me.chart;
+ var dataset = chart.data.datasets[me.index];
+ var custom = element.custom || {};
+ var options = chart.options;
+ var elementOptions = options.elements.line;
+ var values = {};
+ var i, ilen, key;
+
+ var keys = [
+ 'backgroundColor',
+ 'borderWidth',
+ 'borderColor',
+ 'borderCapStyle',
+ 'borderDash',
+ 'borderDashOffset',
+ 'borderJoinStyle',
+ 'fill',
+ 'cubicInterpolationMode'
+ ];
+
+ for (i = 0, ilen = keys.length; i < ilen; ++i) {
+ key = keys[i];
+ values[key] = resolve$4([
+ custom[key],
+ dataset[key],
+ elementOptions[key]
+ ]);
+ }
+
+ // The default behavior of lines is to break at null values, according
+ // to https://github.com/chartjs/Chart.js/issues/2435#issuecomment-216718158
+ // This option gives lines the ability to span gaps
+ values.spanGaps = valueOrDefault$5(dataset.spanGaps, options.spanGaps);
+ values.tension = valueOrDefault$5(dataset.lineTension, elementOptions.tension);
+ values.steppedLine = resolve$4([custom.steppedLine, dataset.steppedLine, elementOptions.stepped]);
+
+ return values;
+ },
+
+ calculatePointY: function (value, index, datasetIndex) {
+ var me = this;
+ var chart = me.chart;
+ var meta = me.getMeta();
+ var yScale = me.getScaleForId(meta.yAxisID);
+ var sumPos = 0;
+ var sumNeg = 0;
+ var i, ds, dsMeta;
+
+ if (yScale.options.stacked) {
+ for (i = 0; i < datasetIndex; i++) {
+ ds = chart.data.datasets[i];
+ dsMeta = chart.getDatasetMeta(i);
+ if (dsMeta.type === 'line' && dsMeta.yAxisID === yScale.id && chart.isDatasetVisible(i)) {
+ var stackedRightValue = Number(yScale.getRightValue(ds.data[index]));
+ if (stackedRightValue < 0) {
+ sumNeg += stackedRightValue || 0;
+ } else {
+ sumPos += stackedRightValue || 0;
+ }
+ }
+ }
+
+ var rightValue = Number(yScale.getRightValue(value));
+ if (rightValue < 0) {
+ return yScale.getPixelForValue(sumNeg + rightValue);
+ }
+ return yScale.getPixelForValue(sumPos + rightValue);
+ }
+
+ return yScale.getPixelForValue(value);
+ },
+
+ updateBezierControlPoints: function () {
+ var me = this;
+ var chart = me.chart;
+ var meta = me.getMeta();
+ var lineModel = meta.dataset._model;
+ var area = chart.chartArea;
+ var points = meta.data || [];
+ var i, ilen, model, controlPoints;
+
+ // Only consider points that are drawn in case the spanGaps option is used
+ if (lineModel.spanGaps) {
+ points = points.filter(function (pt) {
+ return !pt._model.skip;
+ });
+ }
+
+ function capControlPoint(pt, min, max) {
+ return Math.max(Math.min(pt, max), min);
+ }
+
+ if (lineModel.cubicInterpolationMode === 'monotone') {
+ helpers$1.splineCurveMonotone(points);
+ } else {
+ for (i = 0, ilen = points.length; i < ilen; ++i) {
+ model = points[i]._model;
+ controlPoints = helpers$1.splineCurve(
+ helpers$1.previousItem(points, i)._model,
+ model,
+ helpers$1.nextItem(points, i)._model,
+ lineModel.tension
+ );
+ model.controlPointPreviousX = controlPoints.previous.x;
+ model.controlPointPreviousY = controlPoints.previous.y;
+ model.controlPointNextX = controlPoints.next.x;
+ model.controlPointNextY = controlPoints.next.y;
+ }
+ }
+
+ if (chart.options.elements.line.capBezierPoints) {
+ for (i = 0, ilen = points.length; i < ilen; ++i) {
+ model = points[i]._model;
+ if (isPointInArea(model, area)) {
+ if (i > 0 && isPointInArea(points[i - 1]._model, area)) {
+ model.controlPointPreviousX = capControlPoint(model.controlPointPreviousX, area.left, area.right);
+ model.controlPointPreviousY = capControlPoint(model.controlPointPreviousY, area.top, area.bottom);
+ }
+ if (i < points.length - 1 && isPointInArea(points[i + 1]._model, area)) {
+ model.controlPointNextX = capControlPoint(model.controlPointNextX, area.left, area.right);
+ model.controlPointNextY = capControlPoint(model.controlPointNextY, area.top, area.bottom);
+ }
+ }
+ }
+ }
+ },
+
+ draw: function () {
+ var me = this;
+ var chart = me.chart;
+ var meta = me.getMeta();
+ var points = meta.data || [];
+ var area = chart.chartArea;
+ var ilen = points.length;
+ var halfBorderWidth;
+ var i = 0;
+
+ if (lineEnabled(me.getDataset(), chart.options)) {
+ halfBorderWidth = (meta.dataset._model.borderWidth || 0) / 2;
+
+ helpers$1.canvas.clipArea(chart.ctx, {
+ left: area.left,
+ right: area.right,
+ top: area.top - halfBorderWidth,
+ bottom: area.bottom + halfBorderWidth
+ });
+
+ meta.dataset.draw();
+
+ helpers$1.canvas.unclipArea(chart.ctx);
+ }
+
+ // Draw the points
+ for (; i < ilen; ++i) {
+ points[i].draw(area);
+ }
+ },
+
+ /**
+ * @protected
+ */
+ setHoverStyle: function (point) {
+ var model = point._model;
+ var options = point._options;
+ var getHoverColor = helpers$1.getHoverColor;
+
+ point.$previousStyle = {
+ backgroundColor: model.backgroundColor,
+ borderColor: model.borderColor,
+ borderWidth: model.borderWidth,
+ radius: model.radius
+ };
+
+ model.backgroundColor = valueOrDefault$5(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));
+ model.borderColor = valueOrDefault$5(options.hoverBorderColor, getHoverColor(options.borderColor));
+ model.borderWidth = valueOrDefault$5(options.hoverBorderWidth, options.borderWidth);
+ model.radius = valueOrDefault$5(options.hoverRadius, options.radius);
+ },
+ });
+
+ var resolve$5 = helpers$1.options.resolve;
+
+ core_defaults._set('polarArea', {
+ scale: {
+ type: 'radialLinear',
+ angleLines: {
+ display: false
+ },
+ gridLines: {
+ circular: true
+ },
+ pointLabels: {
+ display: false
+ },
+ ticks: {
+ beginAtZero: true
+ }
+ },
+
+ // Boolean - Whether to animate the rotation of the chart
+ animation: {
+ animateRotate: true,
+ animateScale: true
+ },
+
+ startAngle: -0.5 * Math.PI,
+ legendCallback: function (chart) {
+ var text = [];
+ text.push('
');
+
+ var data = chart.data;
+ var datasets = data.datasets;
+ var labels = data.labels;
+
+ if (datasets.length) {
+ for (var i = 0; i < datasets[0].data.length; ++i) {
+ text.push('