commit 5a3e22aeb6a285310921f031fe9d54bc017c4a74 Author: vpatuta Date: Sun Nov 19 13:03:35 2023 +0100 backup diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..23db0d8 --- /dev/null +++ b/LICENSE @@ -0,0 +1,28 @@ +BSD 3-Clause License + +Copyright (c) 2023, Martin Hart + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..ba57ca5 --- /dev/null +++ b/README.md @@ -0,0 +1,136 @@ +# Projet IOC + +## Auteurs + +Martin HART + +Volodymyr PATUTA + +## Introduction + +Notre projet est constitué de 3 composants: + +1. Client MQTT esp32 `esp` +2. Client MQTT subscribe (remplissage de la base de donnée) `db_feeder` +3. Serveur Web + client MQTT publish (contrôle du buzzer et de l'écran OLED) `web` + +## Client `esp` + +Le client MQTT `esp` utilise la librairie +[PubSubClient](https://github.com/knolleary/pubsubclient) pour pouvoir +subscribe/publish sur des topics différents. + +Nous avons 5 topics : + +- brightness + + Utilisé pour publish la valeur de la photorésistance. + +- OLED + + Utilisé pour subscribe et afficher le texte sur l'écran OLED. + +- led + + Utilisé pour subscribe et allumer/éteindre la led ou la faire clignoter avec une période. + +- buzzer + + Utilisé pour subscribe et jouer une des musiques prédéfinis. + +- button + + Utilisé pour publish l'appui du bouton poussoir. + +### Setup + +Dans la fonction `setup()` nous initialisons le module WiFi de l'esp32 à l'aide +de la librairie `WiFi.h` et nous gênerons le hash SHA256 de l'adresse MAC du module. +Cela nous permet d'avoir un identifiant unique pour chaque esp. + +Puis, nous initialisons le client MQTT. Nous connectons l'esp32 à notre broker +MQTT et puis souscrivons (subscribe) sur les topics : buzzer, oled et led. + +Enfin, nous initialisons chaque composant de l'esp : photorésistance, buzzer, +led, bouton et écran OLED. + +### Loop + +Dans la fonction loop, nous appelons nos différentes taches qui fonctionnent de +la même manière que cela a été introduit dans le TME4. + +### Publish + +Pour publish nos données issues des composants de l'esp, nous utilisons le +format de sérialization JSON, ce qui nous permet de simplifier la tache de +réception et de gestion de données. + +Pour chaque publish, nous sérialisons l'identifiant unique de l'esp afin de +distinguer les esp utilisés. + +Dans le cas de la tache de la photorésistance, nous envoyons l'identifiant et +la valeur de la photorésistance (converti en pourcentage). + +Pour l'appui de bouton poussoir, nous envoyons seulement l'identifiant. + +### Subscribe + +Nous avons défini un `callback` pour les topics sur lesquels nous sommes souscrits. + +Dans ce `callback`, nous désérialisons les données transmit, nous comparons +l'identifiant afin d'assurer que le message est adressé au bon esp. + +Puis, nous regardons le topic du message reçu. Si le topic correspond au topic +de l'écran OLED, nous affichons le texte reçu. Si c'est le topic du LED, nous +remplissons la `mailbox` de la tache LED. Dans le cas du topic du buzzer, nous +jouons la musique sélectionnée. + +## Client `db_feeder` + +Le client `db_feeder` nous permet de subscribe aux différents topics +relayés par le broker MQTT utilisé dans notre projet : `mosquitto`. Ainsi nous +sommes en mesure de stocker de manière permanente, dans une base de donnée +SQLite, les données reçus depuis différents esp. Les données sont stockées +après avoir été désérialisées par la librairie +[cJSON](https://github.com/DaveGamble/cJSON). + +Pour nous connecter au daemon mosquitto nous faisons usage de la librairie +client `mosquitto`. Nous bloquons le thread principal du programme avec un +sémaphore. Le déblocage se fait via le handler du signal `SIGINT`, qui nous +permet de quitter le programme avec un CTRL + c. + +Le chemin de stockage de la base de donnée peut être spécifié via la variable +d'environnement `IOC_DB`. Si la variable d'environnement `IOC_DB` n'est pas +initialisée, la base de donnée SQLite porte le nom de `data.db` et est située +dans le dossier courant. + +## Serveur `web` + +Le serveur web est un serveur écrit en python en utilisant le framework Flask. + +Le serveur `web` interagit avec la base de données et sert les pages HTML et +les fichiers JavaScript. De plus, ce serveur est également un client MQTT pour +publish sur les topics buzzer, oled et led. +Pour chaque topic nous avons une page dédié. +Pour chaque publish, nous pouvons choisir un esp précis. + +Sur la page d'accueil nous avons 2 chronogrammes. Un pour afficher les valeurs +de la photorésistance au cours de temps et la deuxième pour afficher les appuis +sur le bouton poussoir, au cour du temps. Nous affichons aussi le nombre total +d'appui de bouton poussoir par esp. + +## Utilisation + +Afin d'utiliser notre projet, il faut : + +- Flasher les esp +- Lancer un broker MQTT (`mosquitto`) +- Compiler (`make`) et exécuter le client `db_feeder` +- Lancer le serveur web + Dans le dossier de projet, exécuter : + +```sh +$ flask --app web run +``` + +- Ouvrir la page `localhost:5000` dans un navigateur diff --git a/db_feeder/Makefile b/db_feeder/Makefile new file mode 100644 index 0000000..13801d1 --- /dev/null +++ b/db_feeder/Makefile @@ -0,0 +1,17 @@ +CC := gcc +CFLAG := -Wall -Wextra -std=gnu99 -fanalyzer -I. +CLIB := -lmosquitto -lsqlite3 -lcjson +SRC := main.c db.c serialization.c + +.PHONY: clean + +.DEFAULT_GOAL := db_feeder + +db_feeder: $(SRC:.c=.o) + $(CC) $(CLIB) $? -o $@ + +%.o: %.c + $(CC) $(CFLAG) $(CLIB) -c $< + +clean: + @rm -f *.o* db_feeder diff --git a/db_feeder/data.db b/db_feeder/data.db new file mode 100644 index 0000000..7f0c819 Binary files /dev/null and b/db_feeder/data.db differ diff --git a/db_feeder/db.c b/db_feeder/db.c new file mode 100644 index 0000000..9ee82a7 --- /dev/null +++ b/db_feeder/db.c @@ -0,0 +1,60 @@ +#include +#include +#include + +#include "db.h" + +extern sqlite3 *db; + +static char *get_db_path(void) +{ + char *path; + + path = getenv(IOC_DB); + return !path ? DB_PATH : path; +} + +void create_table(sqlite3 *db) +{ + char *err_msg; + + if (sqlite3_exec(db, QUERY_CREATE_TABLE, 0, 0, &err_msg) != SQLITE_OK) { + fprintf(stderr, "Failed to create table: %s\n", err_msg); + sqlite3_free(err_msg); + exit(1); + } +} + +void clean_db(sqlite3 *db) +{ + sqlite3_close(db); +} + +void init_db(sqlite3 **db) +{ + if (sqlite3_open(get_db_path(), db) != SQLITE_OK) { + fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(*db)); + exit(1); + } + create_table(*db); +} + +void insert_data(char *device_id, char *sensor_type, int data) +{ + sqlite3_stmt *res; + + if (sqlite3_prepare_v2(db, QUERY_INSERT_DATA, -1, &res, 0) != SQLITE_OK) { + fprintf(stderr, "Failed to execute statement: %s\n", sqlite3_errmsg(db)); + exit(1); + } + + sqlite3_bind_text(res, 1, device_id, -1, NULL); + sqlite3_bind_text(res, 2, sensor_type, -1, NULL); + sqlite3_bind_int(res, 3, data); + + if (sqlite3_step(res) != SQLITE_DONE) { + fprintf(stderr, "Failed to execute sqlite3_step\n"); + sqlite3_finalize(res); + exit(1); + } +} diff --git a/db_feeder/db.h b/db_feeder/db.h new file mode 100644 index 0000000..66d08b7 --- /dev/null +++ b/db_feeder/db.h @@ -0,0 +1,22 @@ +#ifndef DB_H +#define DB_H + +#include + +#define IOC_DB "IOC_DB" + +#define DB_PATH "data.db" + +#define QUERY_INSERT_DATA \ + "INSERT INTO data (device_id, sensor_type, data) VALUES (?, ?, ?);" + +#define QUERY_CREATE_TABLE \ + "CREATE TABLE IF NOT EXISTS data (id INTEGER PRIMARY KEY AUTOINCREMENT, created " \ + "TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, device_id TEXT NOT NULL, " \ + "sensor_type TEXT NOT NULL, data INT NOT NULL);" + +void init_db(sqlite3 **db); +void clean_db(sqlite3 *db); +void insert_data(char *device_id, char *sensor_type, int data); + +#endif /* DB_H */ diff --git a/db_feeder/main.c b/db_feeder/main.c new file mode 100644 index 0000000..23979eb --- /dev/null +++ b/db_feeder/main.c @@ -0,0 +1,102 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "db.h" +#include "msg.h" +#include "serialization.h" + +#define BRI "brightness" +#define BTN "button" +#define HOST "localhost" +#define PORT 1883 +#define USERNAME "user" +#define PASSWD "test" + +sem_t lock; +struct mosquitto *mosq = NULL; +sqlite3 *db = NULL; + +void mosquitto_server_callback(__attribute__((unused)) struct mosquitto *mosq, + __attribute__((unused)) void *obj, + const struct mosquitto_message *message) +{ + struct brightness_msg br_msg; + struct button_msg btn_msg; + unsigned char buf[message->payloadlen]; + + memcpy(buf, message->payload, message->payloadlen); + + if (strcmp(message->topic, BRI) == 0) { + bzero(&br_msg, sizeof(struct brightness_msg)); + if (unmarshal_brightness_msg((char *)buf, &br_msg) < 0) + return; + printf("BRI: %s %d\n", br_msg.id, br_msg.val); + insert_data(br_msg.id, BRI, br_msg.val); + } else if (strcmp(message->topic, BTN) == 0) { + bzero(&btn_msg, sizeof(struct button_msg)); + if (unmarshal_button_msg((char *)buf, &btn_msg) < 0) + return; + printf("BTN: %s\n", btn_msg.id); + insert_data(btn_msg.id, BTN, 1); + } +} + +void clean_server(void) +{ + if (mosq != NULL) + mosquitto_destroy(mosq); + mosquitto_lib_cleanup(); + clean_db(db); +} + +void sigint_handler(__attribute__((unused)) int num) +{ + sem_post(&lock); +} + +int main(void) +{ + struct sigaction sa; + + if (mosquitto_lib_init() != MOSQ_ERR_SUCCESS) + errx(EXIT_FAILURE, "libmosquitto failed to initialize"); + + atexit(clean_server); + init_db(&db); + + if (!(mosq = mosquitto_new(NULL, true, NULL))) + errx(EXIT_FAILURE, "mosquitto_new: %s", strerror(errno)); + + mosquitto_username_pw_set(mosq, USERNAME, PASSWD); + + mosquitto_message_callback_set(mosq, mosquitto_server_callback); + + sa.sa_handler = sigint_handler; + sigemptyset(&sa.sa_mask); + sa.sa_flags = SA_RESTART; + sigaction(SIGINT, &sa, NULL); + + if (mosquitto_connect(mosq, HOST, 1883, 5) != MOSQ_ERR_SUCCESS) + errx(EXIT_FAILURE, "mosquitto_connect: %s:%d %s", HOST, PORT, strerror(errno)); + + if (mosquitto_subscribe(mosq, NULL, BRI, 0) != MOSQ_ERR_SUCCESS) + errx(EXIT_FAILURE, "mosquitto_subscribe: %s %s", BRI, strerror(errno)); + if (mosquitto_subscribe(mosq, NULL, BTN, 0) != MOSQ_ERR_SUCCESS) + errx(EXIT_FAILURE, "mosquitto_subscribe: %s %s", BTN, strerror(errno)); + + mosquitto_loop_start(mosq); + sem_wait(&lock); + + if (mosquitto_disconnect(mosq) != MOSQ_ERR_SUCCESS) + warnx("mosquitto_disconnect: %s:%d already disconnected", HOST, PORT); + + return 0; +} diff --git a/db_feeder/msg.h b/db_feeder/msg.h new file mode 100644 index 0000000..9b6d617 --- /dev/null +++ b/db_feeder/msg.h @@ -0,0 +1,13 @@ +#ifndef MSG_H +#define MSG_H + +struct brightness_msg { + char id[65]; + int val; +}; + +struct button_msg { + char id[65]; +}; + +#endif /* BRIGHTNESS_MSG_H */ diff --git a/db_feeder/serialization.c b/db_feeder/serialization.c new file mode 100644 index 0000000..9371e54 --- /dev/null +++ b/db_feeder/serialization.c @@ -0,0 +1,76 @@ +#include +#include +#include +#include +#include + +#include "msg.h" + +int unmarshal_button_msg(const char *str, struct button_msg *msg) +{ + int status; + cJSON *json, *device_id; + + if (!(json = cJSON_ParseWithLength(str, strlen(str)))) { + warnx("error parsing json at char number %d from %s", + (int)(cJSON_GetErrorPtr() - str), str); + status = -1; + goto end; + } + + device_id = cJSON_GetObjectItemCaseSensitive(json, "device_id"); + if (!cJSON_IsString(device_id) || !device_id->valuestring) + goto invalid_data; + + if (strlen(device_id->valuestring) != 64) + goto invalid_data; + + memcpy(msg->id, device_id->valuestring, 65); + + status = 0; + goto end; + +invalid_data: + warnx("error: invalid data"); + status = -1; +end: + cJSON_Delete(json); + return status; +} + +int unmarshal_brightness_msg(const char *str, struct brightness_msg *msg) +{ + int status; + cJSON *json, *device_id, *val; + + if (!(json = cJSON_ParseWithLength(str, strlen(str)))) { + warnx("error parsing json at char number %d from %s", + (int)(cJSON_GetErrorPtr() - str), str); + status = -1; + goto end; + } + + device_id = cJSON_GetObjectItemCaseSensitive(json, "device_id"); + if (!cJSON_IsString(device_id) || !device_id->valuestring) + goto invalid_data; + + val = cJSON_GetObjectItemCaseSensitive(json, "val"); + if (!cJSON_IsNumber(val)) + goto invalid_data; + + if (strlen(device_id->valuestring) != 64) + goto invalid_data; + + memcpy(msg->id, device_id->valuestring, 65); + msg->val = val->valueint; + + status = 0; + goto end; + +invalid_data: + warnx("error: invalid data"); + status = -1; +end: + cJSON_Delete(json); + return status; +} diff --git a/db_feeder/serialization.h b/db_feeder/serialization.h new file mode 100644 index 0000000..82aa137 --- /dev/null +++ b/db_feeder/serialization.h @@ -0,0 +1,9 @@ +#ifndef SERIALIZATION_H +#define SERIALIZATION_H + +#include "msg.h" + +int unmarshal_button_msg(const char *str, struct button_msg *msg); +int unmarshal_brightness_msg(const char *str, struct brightness_msg *msg); + +#endif /* SERIALIZATION_H */ diff --git a/esp/esp.ino b/esp/esp.ino new file mode 100644 index 0000000..3d28feb --- /dev/null +++ b/esp/esp.ino @@ -0,0 +1,412 @@ +#include "Adafruit_MQTT.h" +#include "Adafruit_MQTT_Client.h" +#include "Button2.h" +#include "melodies.h" +#include +#include +#include +#include // src: https://github.com/knolleary/pubsubclient +#include +#include +#include +#include + +// TODO: define topics used to publish/subscribe +#define TOPIC_BR "brightness" +#define TOPIC_OLED "oled" +#define TOPIC_LED "led" +#define TOPIC_BUZZ "buzzer" +#define TOPIC_BTN "button" + +#define HASH_SIZE 32 // TODO: is this needed? + +#define SCREEN_WIDTH 128 // OLED display width, in pixels +#define SCREEN_HEIGHT 64 // OLED display height, in pixels +#define MAX_WAIT_FOR_TIMER 3 +#define SCREEN_ADDRESS 0x3C // See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32 +#define OLED_RESET 16 // Reset pin # (or -1 if sharing Arduino reset pin) + +Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); + +const char *ssid = "Segfault_2.4"; +const char *password = "i3mlpgdOPLVwXeC"; +const char *server = "192.168.1.153"; // TODO: server IP +const int port = 1883; +const char *mqtt_name = "user"; // TODO: username +const char *mqtt_pass = "test"; // TODO: password +char id[65]; +/* + * by default, the max msg size is 256 bytes including header + * configurable with MQTT_MAX_PACKET_SIZE or PubSubClient::setBufferSize(size) + */ +char msg[256]; +WiFiClient wclient; +PubSubClient client(wclient); + +/* + * structures + */ +enum { EMPTY, FULL }; + +struct mailbox_s { + int state; + int val; + bool periodic; +}; + +struct Led_s { + int timer; // numéro du timer pour cette tâche utilisé par WaitFor + unsigned long period; // periode de clignotement + int pin; // numéro de la broche sur laquelle est la LED + int etat; // etat interne de la led +}; + +struct Oled_s { + int timer; + unsigned long period; + int i; +}; + +struct Lum_s { + int timer; // numéro de timer utilisé par WaitFor + unsigned long period; // periode d'affichage + uint val; +}; + +struct Buz_s { + int timer; + unsigned long period; + int n; + int pause; + int size; + int *melody; + int duration; + int tempo; + bool play; +}; + +/* + * structure initialisation + */ +struct Led_s Led1; +struct Oled_s Oled1; +struct Lum_s Lum1; +struct Buz_s Buz1; +Button2 button; +struct mailbox_s mb_led_state = {.state = EMPTY}; + +// -------------------------------------------------------------------------------------------------------------------- +// Multi-tâches cooperatives : solution basique mais efficace :-) +// -------------------------------------------------------------------------------------------------------------------- + +// -------------------------------------------------------------------------------------------------------------------- +// unsigned int waitFor(timer, period) +// Timer pour taches périodiques +// configuration : +// - MAX_WAIT_FOR_TIMER : nombre maximum de timers utilisés +// arguments : +// - timer : numéro de timer entre 0 et MAX_WAIT_FOR_TIMER-1 +// - period : période souhaitée +// retour : +// - nombre de périodes écoulées depuis le dernier appel +// -------------------------------------------------------------------------------------------------------------------- +unsigned int waitFor(int timer, unsigned long period) +{ + static unsigned long waitForTimer[MAX_WAIT_FOR_TIMER]; // il y a autant de timers que de tâches périodiques + unsigned long newTime = micros() / period; // numéro de la période modulo 2^32 + int delta = newTime - waitForTimer[timer]; // delta entre la période courante et celle enregistrée + if (delta < 0) + delta = 1 + newTime; // en cas de dépassement du nombre de périodes possibles sur 2^32 + if (delta) + waitForTimer[timer] = newTime; // enregistrement du nouveau numéro de période + return delta; +} + +/* + * setup functions + */ + +void setup_Led(struct Led_s *ctx, int timer, unsigned long period, byte pin) +{ + ctx->timer = timer; + ctx->period = period; + ctx->pin = pin; + ctx->etat = 1; + pinMode(pin, OUTPUT); + digitalWrite(pin, ctx->etat); +} + +void setup_Oled() +{ + Wire.begin(4, 15); + Serial.begin(115200); + // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally + if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) { + Serial.println(F("SSD1306 allocation failed")); + for (;;) + ; // Don't proceed, loop forever + } + display.setTextColor(SSD1306_WHITE); // Draw white text + display.setCursor(0, 0); // Start at top-left corner + display.cp437(true); // Use full 256 char 'Code Page 437' font + display.clearDisplay(); + display.setTextSize(1); + display.setCursor(1, 1); + display.write("Hello, World!"); + display.display(); +} + +void setup_Lum(struct Lum_s *ctx, int timer, unsigned long period) +{ + ctx->timer = timer; + ctx->period = period; + pinMode(36, INPUT); +} + +void setup_Buz(struct Buz_s *ctx, int timer) +{ + ctx->timer = timer; + ctx->play = false; + pinMode(17, OUTPUT); + ledcAttachPin(17, 0); +} + +void setup_Btn() +{ + button.begin(23); + // button.setChangedHandler(changed); + // button.setPressedHandler(pressed); + // button.setReleasedHandler(released); + + // setTapHandler() is called by any type of click, longpress or shortpress + button.setTapHandler(tap); +} + +void setup_wifi() +{ + Serial.print("[WiFi] Connecting to "); + Serial.println(ssid); + WiFi.begin(ssid, password); + while (WiFi.status() != WL_CONNECTED) { + delay(300); + Serial.print("."); + } + Serial.println(); + Serial.print("IP @:"); + Serial.println(WiFi.localIP()); + + /* hash mac address and store it is ID */ + byte id_hash[32]; + String mac = WiFi.macAddress(); + Serial.println(mac); + + mbedtls_md_context_t ctx; + mbedtls_md_type_t md_type = MBEDTLS_MD_SHA256; + mbedtls_md_init(&ctx); + mbedtls_md_setup(&ctx, mbedtls_md_info_from_type(md_type), 0); + mbedtls_md_starts(&ctx); + mbedtls_md_update(&ctx, (const unsigned char *)mac.c_str(), mac.length()); + mbedtls_md_finish(&ctx, id_hash); + mbedtls_md_free(&ctx); + + for (int i = 0; i < sizeof(id_hash); i++) { + char tmp[3]; + sprintf(tmp, "%02x", (int)id_hash[i]); + strcat(id, tmp); + } + id[65] = NULL; +} + +void choose_song(int n) +{ + switch (n) { + case 1: + Buz1.melody = hp; + Buz1.size = (sizeof(hp) / sizeof(hp[0]) / 2) * 2; + Buz1.tempo = tempo_hp; + break; + case 2: + Buz1.melody = zelda; + Buz1.size = (sizeof(zelda) / sizeof(zelda[0]) / 2) * 2; + Buz1.tempo = tempo_zelda; + break; + case 3: + Buz1.melody = sw; + Buz1.size = (sizeof(sw) / sizeof(sw[0]) / 2) * 2; + Buz1.tempo = tempo_sw; + break; + case 4: + Buz1.melody = gf; + Buz1.size = (sizeof(gf) / sizeof(gf[0]) / 2) * 2; + Buz1.tempo = tempo_gf; + break; + case 5: + Buz1.melody = rick; + Buz1.size = (sizeof(rick) / sizeof(rick[0]) / 2) * 2; + Buz1.tempo = tempo_rick; + break; + default: + Buz1.play = false; + Buz1.melody = NULL; + Buz1.n = 0; + return; + } + Buz1.n = 0; + Buz1.play = true; +} + +void write_Oled(const char *str) +{ + display.clearDisplay(); + display.setTextSize(1); + display.setCursor(1, 1); + display.write(str); + display.display(); +} + +void callback(const char *topic, byte *payload, unsigned int length) +{ + Serial.print("callback "); + Serial.println(topic); + payload[length] = '\0'; + Serial.println((char *)payload); + DynamicJsonDocument doc(256); + DeserializationError error = deserializeJson(doc, payload); + if (error) + return; + String device_id = doc["device_id"]; + if (strcmp(device_id.c_str(), id) != 0) + return; + + int i; + if (strcmp(topic, TOPIC_OLED) == 0) { + String m = doc["text"]; + Serial.println(m); + write_Oled(m.c_str()); + } else if (strcmp(topic, TOPIC_LED) == 0) { + mb_led_state.val = doc["period"]; + mb_led_state.state = FULL; + mb_led_state.periodic = mb_led_state.val != 0; + } else if (strcmp(topic, TOPIC_BUZZ) == 0) { + int value = doc["song"]; + choose_song(value); + } +} + +void setup_mqtt() +{ + client.setServer(server, port); + client.connect(id, mqtt_name, mqtt_pass); + if (!client.subscribe(TOPIC_BUZZ)) + Serial.println("fail"); + if (!client.subscribe(TOPIC_OLED)) + Serial.println("fail"); + if (!client.subscribe(TOPIC_LED)) + Serial.println("fail"); + client.setCallback(callback); +} + +/* + * Handlers + */ +void tap(Button2 &btn) +{ + DynamicJsonDocument doc(256); + doc["device_id"] = id; + serializeJson(doc, msg); + client.publish(TOPIC_BTN, msg); + Serial.println("tap"); +} + +void loop_Led(struct Led_s *ctx, struct mailbox_s *mb_s) +{ + if (mb_s->state != EMPTY) { + mb_s->state = EMPTY; + if (mb_s->val == 0) { + digitalWrite(ctx->pin, ctx->etat); + ctx->etat = 1 - ctx->etat; + return; + } + } + if (mb_s->periodic) { + int period = mb_s->val < 2 ? ctx->period : ctx->period * (mb_s->val / 2); + if (!waitFor(ctx->timer, period)) + return; + digitalWrite(ctx->pin, ctx->etat); + ctx->etat = 1 - ctx->etat; + } +} + +void loop_Lum(struct Lum_s *ctx) +{ + if (!(waitFor(ctx->timer, ctx->period))) + return; // sort s'il y a moins d'une période écoulée + int perc; + DynamicJsonDocument doc(256); + + ctx->val = analogRead(36); + perc = map(ctx->val, 0, 4095, 100, 0); + itoa(perc, msg, 10); + + doc["device_id"] = id; + doc["val"] = perc; + + serializeJson(doc, msg); + client.publish(TOPIC_BR, msg); + // Serial.println("published"); +} + +void loop_Buz(struct Buz_s *ctx) +{ + if (!ctx->play) { + ledcDetachPin(17); + ctx->n = 0; + return; + } + int wholenote = (60000 * 4) / ctx->tempo; + int divider = ctx->melody[ctx->n + 1]; + if (divider > 0) + ctx->duration = wholenote / divider; + else if (divider < 0) + ctx->duration = (wholenote / abs(divider)) * 1.5; + ctx->period = ctx->duration; + if (!(waitFor(ctx->timer, ctx->period))) + return; + tone(17, ctx->melody[ctx->n], ctx->duration * 0.9); + ctx->n = (ctx->n + 2) % ctx->size; + noTone(17); +} + +void setup() +{ + Serial.begin(115200); + delay(10); + Serial.println(); + setup_wifi(); + + setup_mqtt(); + + setup_Lum(&Lum1, 1, 2000000); + setup_Buz(&Buz1, 0); + setup_Led(&Led1, 2, 100000, LED_BUILTIN); // Led est exécutée toutes les 100ms + setup_Btn(); + setup_Oled(); +} + +void reconnect() +{ + while (!client.connected()) { + Serial.println("Reconnecting"); + setup_mqtt(); + } +} + +void loop() +{ + reconnect(); + loop_Led(&Led1, &mb_led_state); + loop_Buz(&Buz1); + loop_Lum(&Lum1); + client.loop(); + button.loop(); +} diff --git a/esp/melodies.h b/esp/melodies.h new file mode 100644 index 0000000..307d6b6 --- /dev/null +++ b/esp/melodies.h @@ -0,0 +1,271 @@ +#define NOTE_B0 31 +#define NOTE_C1 33 +#define NOTE_CS1 35 +#define NOTE_D1 37 +#define NOTE_DS1 39 +#define NOTE_E1 41 +#define NOTE_F1 44 +#define NOTE_FS1 46 +#define NOTE_G1 49 +#define NOTE_GS1 52 +#define NOTE_A1 55 +#define NOTE_AS1 58 +#define NOTE_B1 62 +#define NOTE_C2 65 +#define NOTE_CS2 69 +#define NOTE_D2 73 +#define NOTE_DS2 78 +#define NOTE_E2 82 +#define NOTE_F2 87 +#define NOTE_FS2 93 +#define NOTE_G2 98 +#define NOTE_GS2 104 +#define NOTE_A2 110 +#define NOTE_AS2 117 +#define NOTE_B2 123 +#define NOTE_C3 131 +#define NOTE_CS3 139 +#define NOTE_D3 147 +#define NOTE_DS3 156 +#define NOTE_E3 165 +#define NOTE_F3 175 +#define NOTE_FS3 185 +#define NOTE_G3 196 +#define NOTE_GS3 208 +#define NOTE_A3 220 +#define NOTE_AS3 233 +#define NOTE_B3 247 +#define NOTE_C4 262 +#define NOTE_CS4 277 +#define NOTE_D4 294 +#define NOTE_DS4 311 +#define NOTE_E4 330 +#define NOTE_F4 349 +#define NOTE_FS4 370 +#define NOTE_G4 392 +#define NOTE_GS4 415 +#define NOTE_A4 440 +#define NOTE_AS4 466 +#define NOTE_B4 494 +#define NOTE_C5 523 +#define NOTE_CS5 554 +#define NOTE_D5 587 +#define NOTE_DS5 622 +#define NOTE_E5 659 +#define NOTE_F5 698 +#define NOTE_FS5 740 +#define NOTE_G5 784 +#define NOTE_GS5 831 +#define NOTE_A5 880 +#define NOTE_AS5 932 +#define NOTE_B5 988 +#define NOTE_C6 1047 +#define NOTE_CS6 1109 +#define NOTE_D6 1175 +#define NOTE_DS6 1245 +#define NOTE_E6 1319 +#define NOTE_F6 1397 +#define NOTE_FS6 1480 +#define NOTE_G6 1568 +#define NOTE_GS6 1661 +#define NOTE_A6 1760 +#define NOTE_AS6 1865 +#define NOTE_B6 1976 +#define NOTE_C7 2093 +#define NOTE_CS7 2217 +#define NOTE_D7 2349 +#define NOTE_DS7 2489 +#define NOTE_E7 2637 +#define NOTE_F7 2794 +#define NOTE_FS7 2960 +#define NOTE_G7 3136 +#define NOTE_GS7 3322 +#define NOTE_A7 3520 +#define NOTE_AS7 3729 +#define NOTE_B7 3951 +#define NOTE_C8 4186 +#define NOTE_CS8 4435 +#define NOTE_D8 4699 +#define NOTE_DS8 4978 + +int mc[] = { + NOTE_E5, NOTE_E5, NOTE_E5, + NOTE_E5, NOTE_E5, NOTE_E5, + NOTE_E5, NOTE_G5, NOTE_C5, NOTE_D5, + NOTE_E5, + NOTE_F5, NOTE_F5, NOTE_F5, NOTE_F5, + NOTE_F5, NOTE_E5, NOTE_E5, NOTE_E5, NOTE_E5, + NOTE_E5, NOTE_D5, NOTE_D5, NOTE_E5, + NOTE_D5, NOTE_G5 +}; +int mc_duration[] = { + 8, 8, 4, + 8, 8, 4, + 8, 8, 8, 8, + 2, + 8, 8, 8, 8, + 8, 8, 8, 16, 16, + 8, 8, 8, 8, + 4, 4 +}; + +int Pirates_note[] = { +NOTE_D4, NOTE_D4, NOTE_D4, NOTE_D4, NOTE_D4, NOTE_D4, NOTE_D4, NOTE_D4, +NOTE_D4, NOTE_D4, NOTE_D4, NOTE_D4, NOTE_D4, NOTE_D4, NOTE_D4, NOTE_D4, +NOTE_D4, NOTE_D4, NOTE_D4, NOTE_D4, NOTE_D4, NOTE_D4, NOTE_D4, NOTE_D4, +NOTE_A3, NOTE_C4, NOTE_D4, NOTE_D4, NOTE_D4, NOTE_E4, NOTE_F4, NOTE_F4, +NOTE_F4, NOTE_G4, NOTE_E4, NOTE_E4, NOTE_D4, NOTE_C4, NOTE_C4, NOTE_D4, +0, NOTE_A3, NOTE_C4, NOTE_B3, NOTE_D4, NOTE_B3, NOTE_E4, NOTE_F4, +NOTE_F4, NOTE_C4, NOTE_C4, NOTE_C4, NOTE_C4, NOTE_D4, NOTE_C4, +NOTE_D4, 0, 0, NOTE_A3, NOTE_C4, NOTE_D4, NOTE_D4, NOTE_D4, NOTE_F4, +NOTE_G4, NOTE_G4, NOTE_G4, NOTE_A4, NOTE_A4, NOTE_A4, NOTE_A4, NOTE_G4, +NOTE_A4, NOTE_D4, 0, NOTE_D4, NOTE_E3, NOTE_F4, NOTE_F4, NOTE_G4, NOTE_A4, +NOTE_D4, 0, NOTE_D4, NOTE_F4, NOTE_E4, NOTE_E4, NOTE_F4, NOTE_D4 +}; +int Pirates_duration[] = { +4,8,4,8,4,8,8,8,8,4,8,4,8,4,8,8,8,8,4,8,4,8, +4,8,8,8,8,4,4,8,8,4,4,8,8,4,4,8,8, +8,4,8,8,8,4,4,8,8,4,4,8,8,4,4,8,4, +4,8,8,8,8,4,4,8,8,4,4,8,8,4,4,8,8, +8,4,8,8,8,4,4,4,8,4,8,8,8,4,4,8,8 +}; + +int river[] = { + NOTE_A5, NOTE_GS5, NOTE_A5, NOTE_GS5, + NOTE_A5, NOTE_E5, NOTE_A5, NOTE_D5, + NOTE_A5, NOTE_GS5, NOTE_A5, NOTE_GS5, + NOTE_A5, NOTE_E5, NOTE_A5, NOTE_D5, + + NOTE_A5, NOTE_GS5, NOTE_A5, NOTE_GS5, NOTE_A5, + NOTE_A4, NOTE_E4, NOTE_A5, NOTE_A4, NOTE_D4, + NOTE_CS4, NOTE_D4, NOTE_E4, NOTE_CS4, NOTE_B3, + + NOTE_A4, NOTE_GS4, NOTE_A4, + NOTE_E3, NOTE_A4, NOTE_B4, NOTE_CS4, + NOTE_CS4, NOTE_D4, NOTE_E4, + NOTE_D4, NOTE_CS4, NOTE_B3, //44 + + NOTE_A4, NOTE_CS4, + NOTE_A5, NOTE_GS5, NOTE_A5, NOTE_GS5, NOTE_A5, + NOTE_A4, NOTE_E4, NOTE_A5, NOTE_A4, NOTE_D4, + NOTE_CS4, NOTE_D4, NOTE_E4, NOTE_CS5, NOTE_B4, //61 + + NOTE_A4, NOTE_GS4, NOTE_A4, + NOTE_E4, NOTE_A4, NOTE_B4, NOTE_CS5, + NOTE_CS5, NOTE_D5, NOTE_E5, + NOTE_D5, NOTE_CS5, NOTE_B4, // 74 + + NOTE_A5, NOTE_B5, NOTE_A5, NOTE_GS5, NOTE_A5, NOTE_A4, NOTE_E4, NOTE_A4, + NOTE_A5, NOTE_B5, NOTE_A5, NOTE_GS5, NOTE_A5, NOTE_A4, NOTE_E4, NOTE_A4, + NOTE_A5, NOTE_B5, NOTE_A5, NOTE_GS5, NOTE_A5, NOTE_B5, NOTE_CS6, NOTE_D6, + NOTE_E6, NOTE_CS6, NOTE_B5, NOTE_A5, NOTE_GS5, NOTE_B4, + + NOTE_A5, NOTE_B5, NOTE_A5, NOTE_GS5, NOTE_A5, NOTE_A4, NOTE_E4, NOTE_A4, + NOTE_A5, NOTE_B5, NOTE_A5, NOTE_GS5, NOTE_A5, NOTE_A4, NOTE_E4, NOTE_A4, + NOTE_A5, NOTE_B5, NOTE_A5, NOTE_GS5, NOTE_A5, NOTE_B5, NOTE_CS6, NOTE_D6, + NOTE_E6, NOTE_CS6, NOTE_B5, NOTE_A5, NOTE_GS5, NOTE_B4, + + NOTE_GS4, NOTE_E4, + NOTE_A4, NOTE_CS4, NOTE_E4, NOTE_A5, 0 + + +}; + +int riverDurations[] = { + 4, 4, 4, 4, + 4, 4, 4, 1, + 4, 4, 4, 4, + 4, 4, 4, 1, + + 4, 8, 4, 8, 4, + 8, 8, 4, 4, 4, + 4, 4, 4, 4, 2, + + 4, 4, 2, + 4, 4, 4, 2, + 4, 4, 2, + 4, 4, 1, //44 + + 10, 10, + 4, 8, 4, 8, 4, + 8, 8, 4, 4, 4, + 4, 4, 4, 4, 2, + + 4, 4, 2, + 4, 4, 4, 2, + 4, 4, 2, + 4, 4, 1, //74 + + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 4, 4, + + + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 4, 4, // 134 + + 2, 2, + 4, 4, 4, 1, 1 //141 + +}; + + + +int elise[] = { + NOTE_E5, NOTE_DS5, NOTE_E5, NOTE_DS5, NOTE_E5, NOTE_B4, NOTE_D5, NOTE_C5, NOTE_A4, + NOTE_C4, NOTE_E4, NOTE_A4, NOTE_B4, + NOTE_E4, NOTE_GS4, NOTE_B4, NOTE_C5, + + NOTE_E4, NOTE_E5, NOTE_DS5, NOTE_E5, NOTE_DS5, NOTE_E5, NOTE_B4, NOTE_D5, NOTE_C5, NOTE_A4, + NOTE_C4, NOTE_E4, NOTE_A4, NOTE_B4, + NOTE_E4, NOTE_C5, NOTE_B4, NOTE_A4, + + NOTE_B4, NOTE_C5, NOTE_D5, NOTE_E5, + NOTE_G4, NOTE_F5, NOTE_E5, NOTE_D5, + NOTE_F4, NOTE_E5, NOTE_D5, NOTE_C5, + NOTE_E4, NOTE_D5, NOTE_C5, NOTE_B4, + + NOTE_E4, NOTE_E5, NOTE_E4, NOTE_E5, NOTE_E6, + + NOTE_E5, NOTE_DS5, NOTE_E5, NOTE_DS5, NOTE_E5, NOTE_B4, NOTE_D5, NOTE_C5, NOTE_A4, + NOTE_C4, NOTE_E4, NOTE_A4, NOTE_B4, + NOTE_E4, NOTE_GS4, NOTE_B4, NOTE_C5, + + NOTE_E4, NOTE_E5, NOTE_DS5, NOTE_E5, NOTE_DS5, NOTE_E5, NOTE_B4, NOTE_D5, NOTE_C5, NOTE_A4, + NOTE_C4, NOTE_E4, NOTE_A4, NOTE_B4, + NOTE_E4, NOTE_C5, NOTE_B4, NOTE_A4, 0 + + +}; + + +int eliseDurations[] = { + 4, 4, 4, 4, 4, 4, 4, 4, 2, + 4, 4, 4, 2, + 4, 4, 4, 2, //17 + + 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, + 4, 4, 4, 2, + 4, 4, 4, 2, // 35 + + 4, 4, 4, 2, + 2, 4, 4, 2, + 2, 4, 4, 2, + 2, 4, 4, 2, //51 + + 4, 4, 4, 4, 2, + + 4, 4, 4, 4, 4, 4, 4, 4, 2, + 4, 4, 4, 2, + 4, 4, 4, 2, + + 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, + 4, 4, 4, 2, + 4, 4, 4, 1, 1 // 93 + +}; + + diff --git a/web/__init__.py b/web/__init__.py new file mode 100644 index 0000000..8146025 --- /dev/null +++ b/web/__init__.py @@ -0,0 +1,35 @@ +import os + +from flask import Flask + +def create_app(): + app = Flask(__name__, instance_relative_config=True) + app.config.from_mapping( + SECRET_KEY=os.urandom(24), + DATABASE=os.path.join(app.instance_path, 'data.db'), + ) + + try: + os.makedirs(app.instance_path) + except OSError: + pass + + from . import db + db.init_app(app) + + from . import controller + app.register_blueprint(controller.bp) + + from .mqttHandler import mqtt, bp as mqtt_bp + app.register_blueprint(mqtt_bp) + + app.config['MQTT_BROKER_URL'] = 'localhost' + app.config['MQTT_BROKER_PORT'] = 1883 + app.config['MQTT_USERNAME'] = 'user' + app.config['MQTT_PASSWORD'] = 'test' + app.config['MQTT_KEEPALIVE'] = 5 + app.config['MQTT_TLS_ENABLED'] = False + + mqtt.init_app(app) + + return app diff --git a/web/controller.py b/web/controller.py new file mode 100644 index 0000000..3e5d886 --- /dev/null +++ b/web/controller.py @@ -0,0 +1,62 @@ +from flask import Blueprint, request, render_template, flash + +from .db import get_db + +bp = Blueprint('data', __name__, url_prefix='/') + +@bp.route('/') +def view_all(): + data = get_db().execute( + 'SELECT * FROM data ORDER BY device_id' + ).fetchall() + ids = get_db().execute( + 'SELECT DISTINCT device_id FROM data ORDER BY device_id' + ).fetchall() + + button_count = {} + for id in ids: + c = get_db().execute( + 'SELECT count(*) FROM data WHERE sensor_type="button" AND device_id="' + id[0] + '"' + ).fetchall() + button_count[str(id[0])] = c[0][0]; + + data2 = [] # an array of data per esp ID + for id in ids: + dd = [] + for d in data: + if id[0] == d[2]: + dd.append(d) + data2.append(dd) + return render_template('data/index.html', data=data2, button_count=button_count) + +@bp.route('/add', methods=('GET', 'POST')) +def add(): + if request.method == 'POST': + device_id = request.form['device_id'] + sensor_type = request.form['sensor_type'] + data = request.form['data'] + + error = '' + if not device_id: + error = 'device_id required' + elif not sensor_type: + error = 'sensor_type required' + elif not data: + error = 'data required' + + if not error: + db = get_db() + try: + db.execute( + 'INSERT INTO data (device_id, sensor_type, data) VALUES (?, ?, ?)', + (device_id, sensor_type, data), + ) + db.commit() + except db.IntegrityError: + return '', 500 + else: + flash(error) + return render_template('data/add.html'), 400 + + flash('Record created successfully') + return render_template('data/add.html') diff --git a/web/db.py b/web/db.py new file mode 100644 index 0000000..48a483d --- /dev/null +++ b/web/db.py @@ -0,0 +1,32 @@ +import sqlite3 + +import click +from flask import current_app, g + +def get_db(): + if 'db' not in g: + g.db = sqlite3.connect( + current_app.config['DATABASE'], + detect_types=sqlite3.PARSE_DECLTYPES + ) + g.db.row_factory = sqlite3.Row + return g.db + +def close_db(e=None): + db = g.pop('db', None) + if db is not None: + db.close() + +def init_db(): + db = get_db() + with current_app.open_resource('schema.sql') as f: + db.executescript(f.read().decode('utf8')) + +@click.command('init-db') +def init_db_command(): + init_db() + click.echo('Database successfully initialized') + +def init_app(app): + app.teardown_appcontext(close_db) + app.cli.add_command(init_db_command) diff --git a/web/mqttHandler.py b/web/mqttHandler.py new file mode 100644 index 0000000..61ae9df --- /dev/null +++ b/web/mqttHandler.py @@ -0,0 +1,86 @@ +from flask_mqtt import Mqtt +from flask import Blueprint, request, render_template, flash +import json + +mqtt = Mqtt() + +bp = Blueprint("mqtt", __name__, url_prefix="/") + +from .db import get_db + + +@bp.route("/song", methods=("GET", "POST")) +def song(): + db = get_db() + ids = db.cursor().execute("SELECT DISTINCT device_id FROM data").fetchall() + + if request.method == "POST": + device_id = request.form["device_id"] + data = request.form["song"] + + error = "" + if not device_id: + error = "device_id required" + if error: + flash(error) + return render_template("data/song.html", data=enumerate(ids)) + + j = {"device_id": device_id, "song": data} + msg = json.dumps(j) + mqtt.publish("buzzer", str.encode(msg)) + print(msg) + flash("Song is playing") + return render_template("data/song.html", data=enumerate(ids)) + return render_template("data/song.html", data=enumerate(ids)) + + +@bp.route("/oled", methods=("GET", "POST")) +def oled(): + db = get_db() + ids = db.cursor().execute("SELECT DISTINCT device_id FROM data").fetchall() + + if request.method == "POST": + device_id = request.form["device_id"] + data = request.form["text"] + + error = "" + if not device_id: + error = "device_id required" + if error: + flash(error) + return render_template("data/oled.html", data=enumerate(ids)), 400 + + j = {"device_id": device_id, "text": data} + msg = json.dumps(j) + mqtt.publish("oled", str.encode(msg)) + print(msg) + flash("OK") + return render_template("data/oled.html", data=enumerate(ids)) + + return render_template("data/oled.html", data=enumerate(ids)) + + +@bp.route("/led", methods=("GET", "POST")) +def led(): + db = get_db() + ids = db.cursor().execute("SELECT DISTINCT device_id FROM data").fetchall() + + if request.method == "POST": + device_id = request.form["device_id"] + data = request.form["period"] + + error = "" + if not device_id: + error = "device_id required" + if error: + flash(error) + return render_template("data/led.html", data=enumerate(ids)), 400 + + j = {"device_id": device_id, "period": data} + msg = json.dumps(j) + mqtt.publish("led", str.encode(msg)) + print(msg) + flash("OK") + return render_template("data/led.html", data=enumerate(ids)) + + return render_template("data/led.html", data=enumerate(ids)) diff --git a/web/schema.sql b/web/schema.sql new file mode 100644 index 0000000..83e0e8e --- /dev/null +++ b/web/schema.sql @@ -0,0 +1,7 @@ +CREATE TABLE IF NOT EXISTS data ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + device_id TEXT NOT NULL, + sensor_type TEXT NOT NULL, + data INT NOT NULL +); diff --git a/web/static/exporting.js b/web/static/exporting.js new file mode 100644 index 0000000..b1be292 --- /dev/null +++ b/web/static/exporting.js @@ -0,0 +1,48 @@ +/* + Highcharts JS v11.0.1 (2023-05-08) + + Exporting module + + (c) 2010-2021 Torstein Honsi + + License: www.highcharts.com/license +*/ +'use strict';(function(a){"object"===typeof module&&module.exports?(a["default"]=a,module.exports=a):"function"===typeof define&&define.amd?define("highcharts/modules/exporting",["highcharts"],function(e){a(e);a.Highcharts=e;return a}):a("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(a){function e(a,l,y,F){a.hasOwnProperty(l)||(a[l]=F.apply(null,y),"function"===typeof CustomEvent&&window.dispatchEvent(new CustomEvent("HighchartsModuleLoaded",{detail:{path:l,module:a[l]}})))}a=a?a._modules: +{};e(a,"Core/Chart/ChartNavigationComposition.js",[],function(){var a;(function(a){a.compose=function(a){a.navigation||(a.navigation=new b(a));return a};class b{constructor(a){this.updates=[];this.chart=a}addUpdate(a){this.chart.navigation.updates.push(a)}update(a,b){this.updates.forEach(A=>{A.call(this.chart,a,b)})}}a.Additions=b})(a||(a={}));return a});e(a,"Extensions/Exporting/ExportingDefaults.js",[a["Core/Globals.js"]],function(a){({isTouchDevice:a}=a);return{exporting:{allowTableSorting:!0, +type:"image/png",url:"https://export.highcharts.com/",pdfFont:{normal:void 0,bold:void 0,bolditalic:void 0,italic:void 0},printMaxWidth:780,scale:2,buttons:{contextButton:{className:"highcharts-contextbutton",menuClassName:"highcharts-contextmenu",symbol:"menu",titleKey:"contextButtonTitle",menuItems:"viewFullscreen printChart separator downloadPNG downloadJPEG downloadPDF downloadSVG".split(" ")}},menuItemDefinitions:{viewFullscreen:{textKey:"viewFullscreen",onclick:function(){this.fullscreen&&this.fullscreen.toggle()}}, +printChart:{textKey:"printChart",onclick:function(){this.print()}},separator:{separator:!0},downloadPNG:{textKey:"downloadPNG",onclick:function(){this.exportChart()}},downloadJPEG:{textKey:"downloadJPEG",onclick:function(){this.exportChart({type:"image/jpeg"})}},downloadPDF:{textKey:"downloadPDF",onclick:function(){this.exportChart({type:"application/pdf"})}},downloadSVG:{textKey:"downloadSVG",onclick:function(){this.exportChart({type:"image/svg+xml"})}}}},lang:{viewFullscreen:"View in full screen", +exitFullscreen:"Exit from full screen",printChart:"Print chart",downloadPNG:"Download PNG image",downloadJPEG:"Download JPEG image",downloadPDF:"Download PDF document",downloadSVG:"Download SVG vector image",contextButtonTitle:"Chart context menu"},navigation:{buttonOptions:{symbolSize:14,symbolX:14.5,symbolY:13.5,align:"right",buttonSpacing:3,height:28,verticalAlign:"top",width:28,symbolFill:"#666666",symbolStroke:"#666666",symbolStrokeWidth:3,theme:{padding:5}},menuStyle:{border:"none",borderRadius:"3px", +background:"#ffffff",padding:"0.5em"},menuItemStyle:{background:"none",borderRadius:"3px",color:"#333333",padding:"0.5em",fontSize:a?"0.9em":"0.8em",transition:"background 250ms, color 250ms"},menuItemHoverStyle:{background:"#f2f2f2"}}}});e(a,"Extensions/Exporting/ExportingSymbols.js",[],function(){var a;(function(a){function b(a,b,g,c){return[["M",a,b+2.5],["L",a+g,b+2.5],["M",a,b+c/2+.5],["L",a+g,b+c/2+.5],["M",a,b+c-1.5],["L",a+g,b+c-1.5]]}function l(a,b,g,c){a=c/3-2;c=[];return c=c.concat(this.circle(g- +a,b,a,a),this.circle(g-a,b+a+4,a,a),this.circle(g-a,b+2*(a+4),a,a))}const p=[];a.compose=function(a){-1===p.indexOf(a)&&(p.push(a),a=a.prototype.symbols,a.menu=b,a.menuball=l.bind(a))}})(a||(a={}));return a});e(a,"Extensions/Exporting/Fullscreen.js",[a["Core/Renderer/HTML/AST.js"],a["Core/Utilities.js"]],function(a,l){function b(){this.fullscreen=new B(this)}const {addEvent:e,fireEvent:p}=l,A=[];class B{static compose(a){l.pushUnique(A,a)&&e(a,"beforeRender",b)}constructor(a){this.chart=a;this.isOpen= +!1;a=a.renderTo;this.browserProps||("function"===typeof a.requestFullscreen?this.browserProps={fullscreenChange:"fullscreenchange",requestFullscreen:"requestFullscreen",exitFullscreen:"exitFullscreen"}:a.mozRequestFullScreen?this.browserProps={fullscreenChange:"mozfullscreenchange",requestFullscreen:"mozRequestFullScreen",exitFullscreen:"mozCancelFullScreen"}:a.webkitRequestFullScreen?this.browserProps={fullscreenChange:"webkitfullscreenchange",requestFullscreen:"webkitRequestFullScreen",exitFullscreen:"webkitExitFullscreen"}: +a.msRequestFullscreen&&(this.browserProps={fullscreenChange:"MSFullscreenChange",requestFullscreen:"msRequestFullscreen",exitFullscreen:"msExitFullscreen"}))}close(){const a=this,c=a.chart,b=c.options.chart;p(c,"fullscreenClose",null,function(){if(a.isOpen&&a.browserProps&&c.container.ownerDocument instanceof Document)c.container.ownerDocument[a.browserProps.exitFullscreen]();a.unbindFullscreenEvent&&(a.unbindFullscreenEvent=a.unbindFullscreenEvent());c.setSize(a.origWidth,a.origHeight,!1);a.origWidth= +void 0;a.origHeight=void 0;b.width=a.origWidthOption;b.height=a.origHeightOption;a.origWidthOption=void 0;a.origHeightOption=void 0;a.isOpen=!1;a.setButtonText()})}open(){const a=this,c=a.chart,b=c.options.chart;p(c,"fullscreenOpen",null,function(){b&&(a.origWidthOption=b.width,a.origHeightOption=b.height);a.origWidth=c.chartWidth;a.origHeight=c.chartHeight;if(a.browserProps){const b=e(c.container.ownerDocument,a.browserProps.fullscreenChange,function(){a.isOpen?(a.isOpen=!1,a.close()):(c.setSize(null, +null,!1),a.isOpen=!0,a.setButtonText())}),g=e(c,"destroy",b);a.unbindFullscreenEvent=()=>{b();g()};const m=c.renderTo[a.browserProps.requestFullscreen]();if(m)m["catch"](function(){alert("Full screen is not supported inside a frame.")})}})}setButtonText(){var b=this.chart,c=b.exportDivElements;const m=b.options.exporting,M=m&&m.buttons&&m.buttons.contextButton.menuItems;b=b.options.lang;m&&m.menuItemDefinitions&&b&&b.exitFullscreen&&b.viewFullscreen&&M&&c&&(c=c[M.indexOf("viewFullscreen")])&&a.setElementHTML(c, +this.isOpen?b.exitFullscreen:m.menuItemDefinitions.viewFullscreen.text||b.viewFullscreen)}toggle(){this.isOpen?this.close():this.open()}}"";"";return B});e(a,"Core/HttpUtilities.js",[a["Core/Globals.js"],a["Core/Utilities.js"]],function(a,e){const {doc:b}=a,{createElement:l,discardElement:p,merge:A,objectEach:B}=e,g={ajax:function(a){const b={json:"application/json",xml:"application/xml",text:"text/plain",octet:"application/octet-stream"},c=new XMLHttpRequest;if(!a.url)return!1;c.open((a.type||"get").toUpperCase(), +a.url,!0);a.headers&&a.headers["Content-Type"]||c.setRequestHeader("Content-Type",b[a.dataType||"json"]||b.text);B(a.headers,function(a,b){c.setRequestHeader(b,a)});a.responseType&&(c.responseType=a.responseType);c.onreadystatechange=function(){let b;if(4===c.readyState){if(200===c.status){if("blob"!==a.responseType&&(b=c.responseText,"json"===a.dataType))try{b=JSON.parse(b)}catch(z){if(z instanceof Error){a.error&&a.error(c,z);return}}return a.success&&a.success(b,c)}a.error&&a.error(c,c.responseText)}}; +a.data&&"string"!==typeof a.data&&(a.data=JSON.stringify(a.data));c.send(a.data)},getJSON:function(a,b){g.ajax({url:a,success:b,dataType:"json",headers:{"Content-Type":"text/plain"}})},post:function(a,g,e){const c=l("form",A({method:"post",action:a,enctype:"multipart/form-data"},e),{display:"none"},b.body);B(g,function(a,b){l("input",{type:"hidden",name:b,value:a},void 0,c)});c.submit();p(c)}};"";return g});e(a,"Extensions/Exporting/Exporting.js",[a["Core/Renderer/HTML/AST.js"],a["Core/Chart/Chart.js"], +a["Core/Chart/ChartNavigationComposition.js"],a["Core/Defaults.js"],a["Extensions/Exporting/ExportingDefaults.js"],a["Extensions/Exporting/ExportingSymbols.js"],a["Extensions/Exporting/Fullscreen.js"],a["Core/Globals.js"],a["Core/HttpUtilities.js"],a["Core/Utilities.js"]],function(a,e,y,F,p,A,B,g,c,m){const {defaultOptions:b,setOptions:l}=F,{doc:z,SVG_NS:R,win:D}=g,{addEvent:C,css:w,createElement:G,discardElement:N,extend:H,find:S,fireEvent:I,isObject:T,merge:k,objectEach:U,pick:q,removeEvent:V,uniqueKey:W}= +m;var J;(function(e){function F(a){const f=this,d=f.renderer,b=k(f.options.navigation.buttonOptions,a),c=b.onclick,E=b.menuItems,n=b.symbolSize||12;let x;f.btnCount||(f.btnCount=0);f.exportDivElements||(f.exportDivElements=[],f.exportSVGElements=[]);if(!1!==b.enabled&&b.theme){var v=b.theme,e;f.styledMode||(v.fill=q(v.fill,"#ffffff"),v.stroke=q(v.stroke,"none"));c?e=function(a){a&&a.stopPropagation();c.call(f,a)}:E&&(e=function(a){a&&a.stopPropagation();f.contextMenu(r.menuClassName,E,r.translateX, +r.translateY,r.width,r.height,r);r.setState(2)});b.text&&b.symbol?v.paddingLeft=q(v.paddingLeft,30):b.text||H(v,{width:b.width,height:b.height,padding:0});f.styledMode||(v["stroke-linecap"]="round",v.fill=q(v.fill,"#ffffff"),v.stroke=q(v.stroke,"none"));var r=d.button(b.text,0,0,e,v,void 0,void 0,void 0,void 0,b.useHTML).addClass(a.className).attr({title:q(f.options.lang[b._titleKey||b.titleKey],"")});r.menuClassName=a.menuClassName||"highcharts-menu-"+f.btnCount++;b.symbol&&(x=d.symbol(b.symbol, +b.symbolX-n/2,b.symbolY-n/2,n,n,{width:n,height:n}).addClass("highcharts-button-symbol").attr({zIndex:1}).add(r),f.styledMode||x.attr({stroke:b.symbolStroke,fill:b.symbolFill,"stroke-width":b.symbolStrokeWidth||1}));r.add(f.exportingGroup).align(H(b,{width:r.width,x:q(b.x,f.buttonOffset)}),!0,"spacingBox");f.buttonOffset+=(r.width+b.buttonSpacing)*("right"===b.align?-1:1);f.exportSVGElements.push(r,x)}}function J(){if(this.printReverseInfo){var {childNodes:a,origDisplay:f,resetParams:b}=this.printReverseInfo; +this.moveContainers(this.renderTo);[].forEach.call(a,function(a,b){1===a.nodeType&&(a.style.display=f[b]||"")});this.isPrinting=!1;b&&this.setSize.apply(this,b);delete this.printReverseInfo;L=void 0;I(this,"afterPrint")}}function M(){const a=z.body,b=this.options.exporting.printMaxWidth,c={childNodes:a.childNodes,origDisplay:[],resetParams:void 0};this.isPrinting=!0;this.pointer.reset(null,0);I(this,"beforePrint");b&&this.chartWidth>b&&(c.resetParams=[this.options.chart.width,void 0,!1],this.setSize(b, +void 0,!1));[].forEach.call(c.childNodes,function(a,b){1===a.nodeType&&(c.origDisplay[b]=a.style.display,a.style.display="none")});this.moveContainers(a);this.printReverseInfo=c}function X(a){a.renderExporting();C(a,"redraw",a.renderExporting);C(a,"destroy",a.destroyExport)}function Y(b,f,c,e,g,E,n){const d=this,t=d.options.navigation,O=d.chartWidth,r=d.chartHeight,l="cache-"+b,K=Math.max(g,E);let u,h=d[l];h||(d.exportContextMenu=d[l]=h=G("div",{className:b},{position:"absolute",zIndex:1E3,padding:K+ +"px",pointerEvents:"auto"},d.fixedDiv||d.container),u=G("ul",{className:"highcharts-menu"},d.styledMode?{}:{listStyle:"none",margin:0,padding:0},h),d.styledMode||w(u,H({MozBoxShadow:"3px 3px 10px #888",WebkitBoxShadow:"3px 3px 10px #888",boxShadow:"3px 3px 10px #888"},t.menuStyle)),h.hideMenu=function(){w(h,{display:"none"});n&&n.setState(0);d.openMenu=!1;w(d.renderTo,{overflow:"hidden"});w(d.container,{overflow:"hidden"});m.clearTimeout(h.hideTimer);I(d,"exportMenuHidden")},d.exportEvents.push(C(h, +"mouseleave",function(){h.hideTimer=D.setTimeout(h.hideMenu,500)}),C(h,"mouseenter",function(){m.clearTimeout(h.hideTimer)}),C(z,"mouseup",function(a){d.pointer.inClass(a.target,b)||h.hideMenu()}),C(h,"click",function(){d.openMenu&&h.hideMenu()})),f.forEach(function(b){"string"===typeof b&&(b=d.options.exporting.menuItemDefinitions[b]);if(T(b,!0)){let f;b.separator?f=G("hr",void 0,void 0,u):("viewData"===b.textKey&&d.isDataTableVisible&&(b.textKey="hideData"),f=G("li",{className:"highcharts-menu-item", +onclick:function(a){a&&a.stopPropagation();h.hideMenu();b.onclick&&b.onclick.apply(d,arguments)}},void 0,u),a.setElementHTML(f,b.text||d.options.lang[b.textKey]),d.styledMode||(f.onmouseover=function(){w(this,t.menuItemHoverStyle)},f.onmouseout=function(){w(this,t.menuItemStyle)},w(f,H({cursor:"pointer"},t.menuItemStyle||{}))));d.exportDivElements.push(f)}}),d.exportDivElements.push(u,h),d.exportMenuWidth=h.offsetWidth,d.exportMenuHeight=h.offsetHeight);f={display:"block"};c+d.exportMenuWidth>O?f.right= +O-c-g-K+"px":f.left=c-K+"px";e+E+d.exportMenuHeight>r&&"top"!==n.alignOptions.verticalAlign?f.bottom=r-e-K+"px":f.top=e+E-K+"px";w(h,f);w(d.renderTo,{overflow:""});w(d.container,{overflow:""});d.openMenu=!0;I(d,"exportMenuShown")}function Z(a){const b=a?a.target:this,d=b.exportSVGElements,c=b.exportDivElements;a=b.exportEvents;let e;d&&(d.forEach((a,f)=>{a&&(a.onclick=a.ontouchstart=null,e="cache-"+a.menuClassName,b[e]&&delete b[e],d[f]=a.destroy())}),d.length=0);b.exportingGroup&&(b.exportingGroup.destroy(), +delete b.exportingGroup);c&&(c.forEach(function(a,b){a&&(m.clearTimeout(a.hideTimer),V(a,"mouseleave"),c[b]=a.onmouseout=a.onmouseover=a.ontouchstart=a.onclick=null,N(a))}),c.length=0);a&&(a.forEach(function(a){a()}),a.length=0)}function aa(a,b){b=this.getSVGForExport(a,b);a=k(this.options.exporting,a);c.post(a.url,{filename:a.filename?a.filename.replace(/\//g,"-"):this.getFilename(),type:a.type,width:a.width,scale:a.scale,svg:b},a.formAttributes)}function ba(){this.styledMode&&this.inlineStyles(); +return this.container.innerHTML}function ca(){const a=this.userOptions.title&&this.userOptions.title.text;let b=this.options.exporting.filename;if(b)return b.replace(/\//g,"-");"string"===typeof a&&(b=a.toLowerCase().replace(/<\/?[^>]+(>|$)/g,"").replace(/[\s_]+/g,"-").replace(/[^a-z0-9\-]/g,"").replace(/^[\-]+/g,"").replace(/[\-]+/g,"-").substr(0,24).replace(/[\-]+$/g,""));if(!b||5>b.length)b="chart";return b}function da(a){let b,d=k(this.options,a);d.plotOptions=k(this.userOptions.plotOptions,a&& +a.plotOptions);d.time=k(this.userOptions.time,a&&a.time);const c=G("div",null,{position:"absolute",top:"-9999em",width:this.chartWidth+"px",height:this.chartHeight+"px"},z.body);var e=this.renderTo.style.width;var g=this.renderTo.style.height;e=d.exporting.sourceWidth||d.chart.width||/px$/.test(e)&&parseInt(e,10)||(d.isGantt?800:600);g=d.exporting.sourceHeight||d.chart.height||/px$/.test(g)&&parseInt(g,10)||400;H(d.chart,{animation:!1,renderTo:c,forExport:!0,renderer:"SVGRenderer",width:e,height:g}); +d.exporting.enabled=!1;delete d.data;d.series=[];this.series.forEach(function(a){b=k(a.userOptions,{animation:!1,enableMouseTracking:!1,showCheckbox:!1,visible:a.visible});b.isInternal||d.series.push(b)});const n={};this.axes.forEach(function(a){a.userOptions.internalKey||(a.userOptions.internalKey=W());a.options.isInternal||(n[a.coll]||(n[a.coll]=!0,d[a.coll]=[]),d[a.coll].push(k(a.userOptions,{visible:a.visible})))});const x=new this.constructor(d,this.callback);a&&["xAxis","yAxis","series"].forEach(function(b){const d= +{};a[b]&&(d[b]=a[b],x.update(d))});this.axes.forEach(function(a){const b=S(x.axes,function(b){return b.options.internalKey===a.userOptions.internalKey});var d=a.getExtremes();const f=d.userMin;d=d.userMax;b&&("undefined"!==typeof f&&f!==b.min||"undefined"!==typeof d&&d!==b.max)&&b.setExtremes(f,d,!0,!1)});g=x.getChartHTML();I(this,"getSVG",{chartCopy:x});g=this.sanitizeSVG(g,d);d=null;x.destroy();N(c);return g}function ea(a,b){const d=this.options.exporting;return this.getSVG(k({chart:{borderRadius:0}}, +d.chartOptions,b,{exporting:{sourceWidth:a&&a.sourceWidth||d.sourceWidth,sourceHeight:a&&a.sourceHeight||d.sourceHeight}}))}function fa(a){return a.replace(/([A-Z])/g,function(a,b){return"-"+b.toLowerCase()})}function ha(){function a(d){const f={};let e,k;if(n&&1===d.nodeType&&-1===ia.indexOf(d.nodeName)){e=D.getComputedStyle(d,null);k="svg"===d.nodeName?{}:D.getComputedStyle(d.parentNode,null);if(!l[d.nodeName]){m=n.getElementsByTagName("svg")[0];var t=n.createElementNS(d.namespaceURI,d.nodeName); +m.appendChild(t);var p=D.getComputedStyle(t,null);var u={};for(var h in p)"string"!==typeof p[h]||/^[0-9]+$/.test(h)||(u[h]=p[h]);l[d.nodeName]=u;"text"===d.nodeName&&delete l.text.fill;m.removeChild(t)}for(const a in e)if(g.isFirefox||g.isMS||g.isSafari||Object.hasOwnProperty.call(e,a)){h=e[a];var q=a;t=p=!1;if(c.length){for(u=c.length;u--&&!p;)p=c[u].test(q);t=!p}"transform"===q&&"none"===h&&(t=!0);for(u=b.length;u--&&!t;)t=b[u].test(q)||"function"===typeof h;t||k[q]===h&&"svg"!==d.nodeName||l[d.nodeName][q]=== +h||(P&&-1===P.indexOf(q)?f[q]=h:h&&d.setAttribute(fa(q),h))}w(d,f);"svg"===d.nodeName&&d.setAttribute("stroke-width","1px");"text"!==d.nodeName&&[].forEach.call(d.children||d.childNodes,a)}}const b=ja,c=e.inlineAllowlist,l={};let m;const k=z.createElement("iframe");w(k,{width:"1px",height:"1px",visibility:"hidden"});z.body.appendChild(k);const n=k.contentWindow&&k.contentWindow.document;n&&n.body.appendChild(n.createElementNS(R,"svg"));a(this.container.querySelector("svg"));m.parentNode.removeChild(m); +k.parentNode.removeChild(k)}function ka(a){(this.fixedDiv?[this.fixedDiv,this.scrollingContainer]:[this.container]).forEach(function(b){a.appendChild(b)})}function la(){const a=this;a.exporting={update:function(b,d){a.isDirtyExporting=!0;k(!0,a.options.exporting,b);q(d,!0)&&a.redraw()}};y.compose(a).navigation.addUpdate((b,d)=>{a.isDirtyExporting=!0;k(!0,a.options.navigation,b);q(d,!0)&&a.redraw()})}function ma(){const a=this;a.isPrinting||(L=a,g.isSafari||a.beforePrint(),setTimeout(()=>{D.focus(); +D.print();g.isSafari||setTimeout(()=>{a.afterPrint()},1E3)},1))}function na(){const a=this,b=a.options.exporting,c=b.buttons,e=a.isDirtyExporting||!a.exportSVGElements;a.buttonOffset=0;a.isDirtyExporting&&a.destroyExport();e&&!1!==b.enabled&&(a.exportEvents=[],a.exportingGroup=a.exportingGroup||a.renderer.g("exporting-group").attr({zIndex:3}).add(),U(c,function(b){a.addButton(b)}),a.isDirtyExporting=!1)}function oa(a,b){const d=a.indexOf("")+6;let c=a.substr(d);a=a.substr(0,d);b&&b.exporting&& +b.exporting.allowHTML&&c&&(c=''+c.replace(/(<(?:img|br).*?(?=>))>/g,"$1 />")+"",a=a.replace("",c+""));return a=a.replace(/zIndex="[^"]+"/g,"").replace(/symbolName="[^"]+"/g,"").replace(/jQuery[0-9]+="[^"]+"/g,"").replace(/url\(("|")(.*?)("|");?\)/g,"url($2)").replace(/url\([^#]+#/g,"url(#").replace(/parseInt(a.userAgent.split("Firefox/")[1],10);a.hasTouch=!!a.win.TouchEvent;a.marginNames=["plotTop","marginRight","marginBottom","plotLeft"];a.noop=function(){};a.supportsPassiveEvents=function(){let u=!1;if(!a.isMS){const A=Object.defineProperty({},"passive",{get:function(){u= +!0}});a.win.addEventListener&&a.win.removeEventListener&&(a.win.addEventListener("testPassive",a.noop,A),a.win.removeEventListener("testPassive",a.noop,A))}return u}();a.charts=[];a.dateFormats={};a.seriesTypes={};a.symbolSizes={};a.chartCount=0})(a||(a={}));"";return a});M(a,"Core/Utilities.js",[a["Core/Globals.js"]],function(a){function u(c,b,g,J){const f=b?"Highcharts error":"Highcharts warning";32===c&&(c=`${f}: Deprecated member`);const x=r(c);let q=x?`${f} #${c}: www.highcharts.com/errors/${c}/`: +c.toString();if("undefined"!==typeof J){let c="";x&&(q+="?");L(J,function(b,f){c+=`\n - ${f}: ${b}`;x&&(q+=encodeURI(f)+"="+encodeURI(b))});q+=c}e(a,"displayError",{chart:g,code:c,message:q,params:J},function(){if(b)throw Error(q);l.console&&-1===u.messages.indexOf(q)&&console.warn(q)});u.messages.push(q)}function H(c,b){const f={};L(c,function(g,z){if(C(c[z],!0)&&!c.nodeType&&b[z])g=H(c[z],b[z]),Object.keys(g).length&&(f[z]=g);else if(C(c[z])||c[z]!==b[z]||z in c&&!(z in b))f[z]=c[z]});return f} +function I(c,b){return parseInt(c,b||10)}function F(c){return"string"===typeof c}function G(c){c=Object.prototype.toString.call(c);return"[object Array]"===c||"[object Array Iterator]"===c}function C(c,b){return!!c&&"object"===typeof c&&(!b||!G(c))}function B(c){return C(c)&&"number"===typeof c.nodeType}function t(c){const b=c&&c.constructor;return!(!C(c,!0)||B(c)||!b||!b.name||"Object"===b.name)}function r(c){return"number"===typeof c&&!isNaN(c)&&Infinity>c&&-Infinity{d(b)?c.setAttribute(g,b):f?(z=c.getAttribute(g))||"class"!==g||(z=c.getAttribute(g+"Name")):c.removeAttribute(g)};F(b)?x(g,b):L(b,x);return z}function m(c,b){let f;c||(c={});for(f in b)c[f]=b[f];return c}function k(){const c=arguments,b=c.length;for(let f=0;f=b-1&&(b=Math.floor(g)),Math.max(0,b-(D(c,"padding-left",!0)||0)-(D(c,"padding-right",!0)||0));if("height"===b)return Math.max(0,Math.min(c.offsetHeight,c.scrollHeight)-(D(c,"padding-top",!0)||0)-(D(c,"padding-bottom", +!0)||0));if(c=l.getComputedStyle(c,void 0))f=c.getPropertyValue(b),k(g,"opacity"!==b)&&(f=I(f));return f}function L(c,b,g){for(const f in c)Object.hasOwnProperty.call(c,f)&&b.call(g||c[f],c[f],f,c)}function E(c,b,g){function f(b,f){const g=c.removeEventListener;g&&g.call(c,b,f,!1)}function z(g){let z,N;c.nodeName&&(b?(z={},z[b]=!0):z=g,L(z,function(c,b){if(g[b])for(N=g[b].length;N--;)f(b,g[b][N].fn)}))}var l="function"===typeof c&&c.prototype||c;if(Object.hasOwnProperty.call(l,"hcEvents")){const c= +l.hcEvents;b?(l=c[b]||[],g?(c[b]=l.filter(function(c){return g!==c.fn}),f(b,g)):(z(c),c[b]=[])):(z(c),delete l.hcEvents)}}function e(c,b,g,l){g=g||{};if(y.createEvent&&(c.dispatchEvent||c.fireEvent&&c!==a)){var f=y.createEvent("Events");f.initEvent(b,!0,!0);g=m(f,g);c.dispatchEvent?c.dispatchEvent(g):c.fireEvent(b,g)}else if(c.hcEvents){g.target||m(g,{preventDefault:function(){g.defaultPrevented=!0},target:c,type:b});f=[];let z=c,l=!1;for(;z.hcEvents;)Object.hasOwnProperty.call(z,"hcEvents")&&z.hcEvents[b]&& +(f.length&&(l=!0),f.unshift.apply(f,z.hcEvents[b])),z=Object.getPrototypeOf(z);l&&f.sort((c,b)=>c.order-b.order);f.forEach(b=>{!1===b.fn.call(c,g)&&g.preventDefault()})}l&&!g.defaultPrevented&&l.call(c,g)}const {charts:q,doc:y,win:l}=a;(u||(u={})).messages=[];Math.easeInOutSine=function(c){return-.5*(Math.cos(Math.PI*c)-1)};var w=Array.prototype.find?function(c,b){return c.find(b)}:function(c,b){let f;const g=c.length;for(f=0;fc.order-b.order); +return function(){E(c,b,g)}},arrayMax:function(c){let b=c.length,g=c[0];for(;b--;)c[b]>g&&(g=c[b]);return g},arrayMin:function(b){let c=b.length,g=b[0];for(;c--;)b[c]f?b=g&&(f=[1/g])));for(l=0;l=b||!z&&e<=(f[l]+(f[l+1]||f[l]))/ +2);l++);return c=h(c*g,-Math.round(Math.log(.001)/Math.LN10))},objectEach:L,offset:function(b){const c=y.documentElement;b=b.parentElement||b.parentNode?b.getBoundingClientRect():{top:0,left:0,width:0,height:0};return{top:b.top+(l.pageYOffset||c.scrollTop)-(c.clientTop||0),left:b.left+(l.pageXOffset||c.scrollLeft)-(c.clientLeft||0),width:b.width,height:b.height}},pad:function(b,f,g){return Array((f||2)+1-String(b).replace("-","").length).join(g||"0")+b},pick:k,pInt:I,pushUnique:function(b,f){return 0> +b.indexOf(f)&&!!b.push(f)},relativeLength:function(b,f,g){return/%$/.test(b)?f*parseFloat(b)/100+(g||0):parseFloat(b)},removeEvent:E,splat:function(b){return G(b)?b:[b]},stableSort:function(b,f){const c=b.length;let g,z;for(z=0;znew G(d[1]));else if("string"===typeof a){this.input=a=G.names[a.toLowerCase()]||a;if("#"===a.charAt(0)){var r=a.length;var d=parseInt(a.substr(1),16);7===r?B=[(d&16711680)>>16,(d&65280)>>8,d&255,1]:4===r&&(B=[(d&3840)>>4|(d&3840)>>8,(d&240)>>4|d&240,(d&15)<<4|d&15,1])}if(!B)for(d=G.parsers.length;d--&&!B;)t=G.parsers[d], +(r=t.regex.exec(a))&&(B=t.parse(r))}B&&(this.rgba=B)}get(a){const B=this.input,t=this.rgba;if("object"===typeof B&&"undefined"!==typeof this.stops){const r=I(B);r.stops=[].slice.call(r.stops);this.stops.forEach((d,p)=>{r.stops[p]=[r.stops[p][0],d.get(a)]});return r}return t&&u(t[0])?"rgb"===a||!a&&1===t[3]?"rgb("+t[0]+","+t[1]+","+t[2]+")":"a"===a?`${t[3]}`:"rgba("+t.join(",")+")":B}brighten(a){const B=this.rgba;if(this.stops)this.stops.forEach(function(t){t.brighten(a)});else if(u(a)&&0!==a)for(let t= +0;3>t;t++)B[t]+=F(255*a),0>B[t]&&(B[t]=0),255q?"AM":"PM",P:12>q?"am":"pm",S:r(e.getSeconds()),L:r(Math.floor(n%1E3),3)},a.dateFormats);t(e,function(b, +c){for(;-1!==h.indexOf("%"+c);)h=h.replace("%"+c,"function"===typeof b?b.call(m,n):b)});return k?h.substr(0,1).toUpperCase()+h.substr(1):h}resolveDTLFormat(h){return C(h,!0)?h:(h=p(h),{main:h[0],from:h[1],to:h[2]})}getTimeTicks(h,n,k,a){const e=this,q=[],y={};var l=new e.Date(n);const w=h.unitRange,g=h.count||1;let b;a=d(a,1);if(I(n)){e.set("Milliseconds",l,w>=m.second?0:g*Math.floor(e.get("Milliseconds",l)/g));w>=m.second&&e.set("Seconds",l,w>=m.minute?0:g*Math.floor(e.get("Seconds",l)/g));w>=m.minute&& +e.set("Minutes",l,w>=m.hour?0:g*Math.floor(e.get("Minutes",l)/g));w>=m.hour&&e.set("Hours",l,w>=m.day?0:g*Math.floor(e.get("Hours",l)/g));w>=m.day&&e.set("Date",l,w>=m.month?1:Math.max(1,g*Math.floor(e.get("Date",l)/g)));if(w>=m.month){e.set("Month",l,w>=m.year?0:g*Math.floor(e.get("Month",l)/g));var c=e.get("FullYear",l)}w>=m.year&&e.set("FullYear",l,c-c%g);w===m.week&&(c=e.get("Day",l),e.set("Date",l,e.get("Date",l)-c+a+(c4*m.month||e.getTimezoneOffset(n)!==e.getTimezoneOffset(k));n=l.getTime();for(l=1;nq.length&&q.forEach(function(b){0===b%18E5&&"000000000"===e.dateFormat("%H%M%S%L",b)&&(y[b]="day")})}q.info=G(h,{higherRanks:y, +totalRange:w*g});return q}getDateFormat(h,n,k,d){const e=this.dateFormat("%m-%d %H:%M:%S.%L",n),q={millisecond:15,second:12,minute:9,hour:6,day:3};let y,l="millisecond";for(y in m){if(h===m.week&&+this.dateFormat("%w",n)===k&&"00:00:00.000"===e.substr(6)){y="week";break}if(m[y]>h){y=l;break}if(q[y]&&e.substr(q[y])!=="01-01 00:00:00.000".substr(q[y]))break;"week"!==y&&(l=y)}return this.resolveDTLFormat(d[y]).main}}"";return n});M(a,"Core/Defaults.js",[a["Core/Chart/ChartDefaults.js"],a["Core/Color/Color.js"], +a["Core/Globals.js"],a["Core/Color/Palettes.js"],a["Core/Time.js"],a["Core/Utilities.js"]],function(a,A,H,I,F,G){const {isTouchDevice:u,svg:B}=H,{merge:t}=G,r={colors:I.colors,symbols:["circle","diamond","square","triangle","triangle-down"],lang:{loading:"Loading...",months:"January February March April May June July August September October November December".split(" "),shortMonths:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),weekdays:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "), +decimalPoint:".",numericSymbols:"kMGTPE".split(""),resetZoom:"Reset zoom",resetZoomTitle:"Reset zoom level 1:1",thousandsSep:" "},global:{},time:{Date:void 0,getTimezoneOffset:void 0,timezone:void 0,timezoneOffset:0,useUTC:!0},chart:a,title:{text:"Chart title",align:"center",margin:15,widthAdjust:-44},subtitle:{text:"",align:"center",widthAdjust:-44},caption:{margin:15,text:"",align:"left",verticalAlign:"bottom"},plotOptions:{},legend:{enabled:!0,align:"center",alignColumns:!0,className:"highcharts-no-tooltip", +layout:"horizontal",itemMarginBottom:2,itemMarginTop:2,labelFormatter:function(){return this.name},borderColor:"#999999",borderRadius:0,navigation:{style:{fontSize:"0.8em"},activeColor:"#0022ff",inactiveColor:"#cccccc"},itemStyle:{color:"#333333",cursor:"pointer",fontSize:"0.8em",textDecoration:"none",textOverflow:"ellipsis"},itemHoverStyle:{color:"#000000"},itemHiddenStyle:{color:"#666666",textDecoration:"line-through"},shadow:!1,itemCheckboxStyle:{position:"absolute",width:"13px",height:"13px"}, +squareSymbol:!0,symbolPadding:5,verticalAlign:"bottom",x:0,y:0,title:{style:{fontSize:"0.8em",fontWeight:"bold"}}},loading:{labelStyle:{fontWeight:"bold",position:"relative",top:"45%"},style:{position:"absolute",backgroundColor:"#ffffff",opacity:.5,textAlign:"center"}},tooltip:{enabled:!0,animation:B,borderRadius:3,dateTimeLabelFormats:{millisecond:"%A, %e %b, %H:%M:%S.%L",second:"%A, %e %b, %H:%M:%S",minute:"%A, %e %b, %H:%M",hour:"%A, %e %b, %H:%M",day:"%A, %e %b %Y",week:"Week from %A, %e %b %Y", +month:"%B %Y",year:"%Y"},footerFormat:"",headerShape:"callout",hideDelay:500,padding:8,shape:"callout",shared:!1,snap:u?25:10,headerFormat:'{point.key}
',pointFormat:'\u25cf {series.name}: {point.y}
',backgroundColor:"#ffffff",borderWidth:void 0,shadow:!0,stickOnContact:!1,style:{color:"#333333",cursor:"default",fontSize:"0.8em"},useHTML:!1},credits:{enabled:!0,href:"https://www.highcharts.com?credits",position:{align:"right", +x:-10,verticalAlign:"bottom",y:-5},style:{cursor:"pointer",color:"#999999",fontSize:"0.6em"},text:"Highcharts.com"}};r.chart.styledMode=!1;"";const d=new F(r.time);a={defaultOptions:r,defaultTime:d,getOptions:function(){return r},setOptions:function(a){t(!0,r,a);if(a.time||a.global)H.time?H.time.update(t(r.global,r.time,a.global,a.time)):H.time=d;return r}};"";return a});M(a,"Core/Animation/Fx.js",[a["Core/Color/Color.js"],a["Core/Globals.js"],a["Core/Utilities.js"]],function(a,A,H){const {parse:u}= +a,{win:F}=A,{isNumber:G,objectEach:C}=H;class B{constructor(a,r,d){this.pos=NaN;this.options=r;this.elem=a;this.prop=d}dSetter(){var a=this.paths;const r=a&&a[0];a=a&&a[1];const d=this.now||0;let p=[];if(1!==d&&r&&a)if(r.length===a.length&&1>d)for(let m=0;m=k+this.startTime?(this.now=this.end,this.pos=1,this.update(),n=v[this.prop]=!0,C(v,function(h){!0!==h&&(n=!1)}),n&&m&&m.call(p),a=!1):(this.pos=d.easing((r-this.startTime)/ +k),this.now=this.start+(this.end-this.start)*this.pos,this.update(),a=!0);return a}initPath(a,r,d){function p(e,q){for(;e.length{a=u(a.options.animation);h=k&&F(k.defer)?n.defer:Math.max(h,a.duration+a.defer);m=Math.min(n.duration,a.duration)});a.renderer.forExport&&(h=0);return{defer:Math.max(0,h-m),duration:Math.min(h,m)}},setAnimation:function(a,k){k.renderer.globalAnimation=p(a,k.options.chart.animation,!0)},stop:I}});M(a,"Core/Renderer/HTML/AST.js",[a["Core/Globals.js"],a["Core/Utilities.js"]],function(a,A){const {SVG_NS:u,win:I}=a,{attr:F,createElement:G,css:C, +error:B,isFunction:t,isString:r,objectEach:d,splat:p}=A;({trustedTypes:A}=I);const m=A&&t(A.createPolicy)&&A.createPolicy("highcharts",{createHTML:h=>h});A=m?m.createHTML(""):"";try{var k=!!(new DOMParser).parseFromString(A,"text/html")}catch(h){k=!1}const v=k;class n{static filterUserAttributes(h){d(h,(a,k)=>{let d=!0;-1===n.allowedAttributes.indexOf(k)&&(d=!1);-1!==["background","dynsrc","href","lowsrc","src"].indexOf(k)&&(d=r(a)&&n.allowedReferences.some(e=>0===a.indexOf(e)));d||(B(33,!1,void 0, +{"Invalid attribute in config":`${k}`}),delete h[k]);r(a)&&h[k]&&(h[k]=a.replace(/{n=n.split(":").map(e=>e.trim());const k=n.shift();k&&n.length&&(h[k.replace(/-([a-z])/g,e=>e[1].toUpperCase())]=n.join(":"));return h},{})}static setElementHTML(h,k){h.innerHTML=n.emptyHTML;k&&(new n(k)).addToDOM(h)}constructor(h){this.nodes="string"===typeof h?this.parseMarkup(h):h}addToDOM(h){function k(h,m){let e;p(h).forEach(function(q){var h= +q.tagName;const l=q.textContent?a.doc.createTextNode(q.textContent):void 0,w=n.bypassHTMLFiltering;let g;if(h)if("#text"===h)g=l;else if(-1!==n.allowedTags.indexOf(h)||w){h=a.doc.createElementNS("svg"===h?u:m.namespaceURI||u,h);const b=q.attributes||{};d(q,function(c,f){"tagName"!==f&&"attributes"!==f&&"children"!==f&&"style"!==f&&"textContent"!==f&&(b[f]=c)});F(h,w?b:n.filterUserAttributes(b));q.style&&C(h,q.style);l&&h.appendChild(l);k(q.children||[],h);g=h}else B(33,!1,void 0,{"Invalid tagName in config":h}); +g&&m.appendChild(g);e=g});return e}return k(this.nodes,h)}parseMarkup(h){const k=[];h=h.trim().replace(/ style=(["'])/g," data-style=$1");if(v)h=(new DOMParser).parseFromString(m?m.createHTML(h):h,"text/html");else{const n=G("div");n.innerHTML=h;h={body:n}}const a=(h,e)=>{var q=h.nodeName.toLowerCase();const k={tagName:q};"#text"===q&&(k.textContent=h.textContent||"");if(q=h.attributes){const l={};[].forEach.call(q,e=>{"data-style"===e.name?k.style=n.parseStyle(e.value):l[e.name]=e.value});k.attributes= +l}if(h.childNodes.length){const l=[];[].forEach.call(h.childNodes,e=>{a(e,l)});l.length&&(k.children=l)}e.push(k)};[].forEach.call(h.body.childNodes,h=>a(h,k));return k}}n.allowedAttributes="alt aria-controls aria-describedby aria-expanded aria-haspopup aria-hidden aria-label aria-labelledby aria-live aria-pressed aria-readonly aria-roledescription aria-selected class clip-path color colspan cx cy d dx dy disabled fill flood-color flood-opacity height href id in markerHeight markerWidth offset opacity orient padding paddingLeft paddingRight patternUnits r refX refY role scope slope src startOffset stdDeviation stroke stroke-linecap stroke-width style tableValues result rowspan summary target tabindex text-align text-anchor textAnchor textLength title type valign width x x1 x2 xlink:href y y1 y2 zIndex".split(" "); +n.allowedReferences="https:// http:// mailto: / ../ ./ #".split(" ");n.allowedTags="a abbr b br button caption circle clipPath code dd defs div dl dt em feComponentTransfer feDropShadow feFuncA feFuncB feFuncG feFuncR feGaussianBlur feOffset feMerge feMergeNode filter h1 h2 h3 h4 h5 h6 hr i img li linearGradient marker ol p path pattern pre rect small span stop strong style sub sup svg table text textPath thead title tbody tspan td th tr u ul #text".split(" ");n.emptyHTML=A;n.bypassHTMLFiltering= +!1;"";return n});M(a,"Core/FormatUtilities.js",[a["Core/Defaults.js"],a["Core/Utilities.js"]],function(a,A){function u(a,d,p,m){a=+a||0;d=+d;const k=I.lang;var v=(a.toString().split(".")[1]||"").split("e")[0].length;const n=a.toString().split("e"),h=d;if(-1===d)d=Math.min(v,20);else if(!C(d))d=2;else if(d&&n[1]&&0>n[1]){var r=d+ +n[1];0<=r?(n[0]=(+n[0]).toExponential(r).split("e")[0],d=r):(n[0]=n[0].split(".")[0]||0,a=20>d?(n[0]*Math.pow(10,n[1])).toFixed(d):0,n[1]=0)}r=(Math.abs(n[1]?n[0]:a)+Math.pow(10, +-Math.max(d,v)-1)).toFixed(d);v=String(t(r));const L=3a?"-":"")+(L?v.substr(0,L)+m:"");a=0>+n[1]&&!h?"0":a+v.substr(L).replace(/(\d{3})(?=\d)/g,"$1"+m);d&&(a+=p+r.slice(-d));n[1]&&0!==+a&&(a+="e"+n[1]);return a}const {defaultOptions:I,defaultTime:F}=a,{getNestedProperty:G,isNumber:C,pick:B,pInt:t}=A;return{dateFormat:function(a,d,p){return F.dateFormat(a,d,p)},format:function(a,d,p){var m="{";let k=!1;let v;const n=/f$/,h=/\.([0-9])/, +r=I.lang,L=p&&p.time||F;p=p&&p.numberFormatter||u;const E=[];for(;a;){v=a.indexOf(m);if(-1===v)break;var e=a.slice(0,v);if(k){e=e.split(":");m=G(e.shift()||"",d);if(e.length&&"number"===typeof m)if(e=e.join(":"),n.test(e)){const q=parseInt((e.match(h)||["","-1"])[1],10);null!==m&&(m=p(m,q,r.decimalPoint,-1(h.rank||0)-(a.rank||0);const k=(a,h)=>a.target-h.target;let v,n=!0,h=[],D=0;for(v=a.length;v--;)D+=a[v].size;if(D>p){I(a,m);for(D=v=0;D<=p;)D+=a[v].size,v++;h=a.splice(v-1,a.length)}I(a,k);for(a=a.map(a=>({size:a.size,targets:[a.target],align:H(a.align,.5)}));n;){for(v=a.length;v--;)p=a[v],m=(Math.min.apply(0,p.targets)+Math.max.apply(0,p.targets))/ +2,p.pos=u(m-p.size*p.align,0,t-p.size);v=a.length;for(n=!1;v--;)0a[v].pos&&(a[v-1].size+=a[v].size,a[v-1].targets=a[v-1].targets.concat(a[v].targets),a[v-1].align=.5,a[v-1].pos+a[v-1].size>t&&(a[v-1].pos=t-a[v-1].size),a.splice(v,1),n=!0)}d.push.apply(d,h);v=0;a.some(a=>{let h=0;return(a.targets||[]).some(()=>{d[v].pos=a.pos+h;if("undefined"!==typeof r&&Math.abs(d[v].pos-d[v].target)>r)return d.slice(0,v+1).forEach(e=>delete e.pos),d.reducedLen=(d.reducedLen||t)-.1*t,d.reducedLen> +.1*t&&A(d,t,r),!0;h+=d[v].size;v++;return!1})});I(d,k);return d}a.distribute=A})(F||(F={}));return F});M(a,"Core/Renderer/SVG/SVGElement.js",[a["Core/Animation/AnimationUtilities.js"],a["Core/Color/Color.js"],a["Core/Globals.js"],a["Core/Utilities.js"]],function(a,A,H,I){const {animate:u,animObject:G,stop:C}=a,{deg2rad:B,doc:t,svg:r,SVG_NS:d,win:p}=H,{addEvent:m,attr:k,createElement:v,css:n,defined:h,erase:D,extend:L,fireEvent:E,isArray:e,isFunction:q,isObject:y,isString:l,merge:w,objectEach:g,pick:b, +pInt:c,syncTimeout:f,uniqueKey:x}=I;class J{constructor(){this.element=void 0;this.onEvents={};this.opacity=1;this.renderer=void 0;this.SVG_NS=d}_defaultGetter(c){c=b(this[c+"Value"],this[c],this.element?this.element.getAttribute(c):null,0);/^[\-0-9\.]+$/.test(c)&&(c=parseFloat(c));return c}_defaultSetter(b,c,f){f.setAttribute(c,b)}add(b){const c=this.renderer,f=this.element;let g;b&&(this.parentGroup=b);"undefined"!==typeof this.textStr&&"text"===this.element.nodeName&&c.buildText(this);this.added= +!0;if(!b||b.handleZ||this.zIndex)g=this.zIndexSetter();g||(b?b.element:c.box).appendChild(f);if(this.onAdd)this.onAdd();return this}addClass(b,c){const f=c?"":this.attr("class")||"";b=(b||"").split(/ /g).reduce(function(b,c){-1===f.indexOf(c)&&b.push(c);return b},f?[f]:[]).join(" ");b!==f&&this.attr("class",b);return this}afterSetters(){this.doTransform&&(this.updateTransform(),this.doTransform=!1)}align(c,f,g){const z={};var N=this.renderer,e=N.alignedObjects,q;let x,a;if(c){if(this.alignOptions= +c,this.alignByTranslate=f,!g||l(g))this.alignTo=q=g||"renderer",D(e,this),e.push(this),g=void 0}else c=this.alignOptions,f=this.alignByTranslate,q=this.alignTo;g=b(g,N[q],"scrollablePlotBox"===q?N.plotBox:void 0,N);q=c.align;const K=c.verticalAlign;N=(g.x||0)+(c.x||0);e=(g.y||0)+(c.y||0);"right"===q?x=1:"center"===q&&(x=2);x&&(N+=(g.width-(c.width||0))/x);z[f?"translateX":"x"]=Math.round(N);"bottom"===K?a=1:"middle"===K&&(a=2);a&&(e+=(g.height-(c.height||0))/a);z[f?"translateY":"y"]=Math.round(e); +this[this.placed?"animate":"attr"](z);this.placed=!0;this.alignAttr=z;return this}alignSetter(b){const c={left:"start",center:"middle",right:"end"};c[b]&&(this.alignValue=b,this.element.setAttribute("text-anchor",c[b]))}animate(c,l,e){const z=G(b(l,this.renderer.globalAnimation,!0));l=z.defer;t.hidden&&(z.duration=0);0!==z.duration?(e&&(z.complete=e),f(()=>{this.element&&u(this,c,z)},l)):(this.attr(c,void 0,e||z.complete),g(c,function(b,c){z.step&&z.step.call(this,b,{prop:c,pos:1,elem:this})},this)); +return this}applyTextOutline(b){const c=this.element;-1!==b.indexOf("contrast")&&(b=b.replace(/contrast/g,this.renderer.getContrast(c.style.fill)));var f=b.split(" ");b=f[f.length-1];if((f=f[0])&&"none"!==f&&H.svg){this.fakeTS=!0;f=f.replace(/(^[\d\.]+)(.*?)$/g,function(b,c,f){return 2*Number(c)+f});this.removeTextOutline();const g=t.createElementNS(d,"tspan");k(g,{"class":"highcharts-text-outline",fill:b,stroke:b,"stroke-width":f,"stroke-linejoin":"round"});b=c.querySelector("textPath")||c;[].forEach.call(b.childNodes, +b=>{const c=b.cloneNode(!0);c.removeAttribute&&["fill","stroke","stroke-width","stroke"].forEach(b=>c.removeAttribute(b));g.appendChild(c)});let z=0;[].forEach.call(b.querySelectorAll("text tspan"),b=>{z+=Number(b.getAttribute("dy"))});f=t.createElementNS(d,"tspan");f.textContent="\u200b";k(f,{x:Number(c.getAttribute("x")),dy:-z});g.appendChild(f);b.insertBefore(g,b.firstChild)}}attr(b,c,f,l){const z=this.element,e=J.symbolCustomAttribs;let q,x,a=this,K,w;"string"===typeof b&&"undefined"!==typeof c&& +(q=b,b={},b[q]=c);"string"===typeof b?a=(this[b+"Getter"]||this._defaultGetter).call(this,b,z):(g(b,function(c,f){K=!1;l||C(this,f);this.symbolName&&-1!==e.indexOf(f)&&(x||(this.symbolAttr(b),x=!0),K=!0);!this.rotation||"x"!==f&&"y"!==f||(this.doTransform=!0);K||(w=this[f+"Setter"]||this._defaultSetter,w.call(this,c,f,z))},this),this.afterSetters());f&&f.call(this);return a}clip(b){return this.attr("clip-path",b?"url("+this.renderer.url+"#"+b.id+")":"none")}crisp(b,c){c=c||b.strokeWidth||0;const f= +Math.round(c)%2/2;b.x=Math.floor(b.x||this.x||0)+f;b.y=Math.floor(b.y||this.y||0)+f;b.width=Math.floor((b.width||this.width||0)-2*f);b.height=Math.floor((b.height||this.height||0)-2*f);h(b.strokeWidth)&&(b.strokeWidth=c);return b}complexColor(b,c,f){const l=this.renderer;let z,O,q,a,J,K,n,k,d,y,m=[],p;E(this.renderer,"complexColor",{args:arguments},function(){b.radialGradient?O="radialGradient":b.linearGradient&&(O="linearGradient");if(O){q=b[O];J=l.gradients;K=b.stops;d=f.radialReference;e(q)&&(b[O]= +q={x1:q[0],y1:q[1],x2:q[2],y2:q[3],gradientUnits:"userSpaceOnUse"});"radialGradient"===O&&d&&!h(q.gradientUnits)&&(a=q,q=w(q,l.getRadialAttr(d,a),{gradientUnits:"userSpaceOnUse"}));g(q,function(b,c){"id"!==c&&m.push(c,b)});g(K,function(b){m.push(b)});m=m.join(",");if(J[m])y=J[m].attr("id");else{q.id=y=x();const b=J[m]=l.createElement(O).attr(q).add(l.defs);b.radAttr=a;b.stops=[];K.forEach(function(c){0===c[1].indexOf("rgba")?(z=A.parse(c[1]),n=z.get("rgb"),k=z.get("a")):(n=c[1],k=1);c=l.createElement("stop").attr({offset:c[0], +"stop-color":n,"stop-opacity":k}).add(b);b.stops.push(c)})}p="url("+l.url+"#"+y+")";f.setAttribute(c,p);f.gradient=m;b.toString=function(){return p}}})}css(b){const f=this.styles,l={},e=this.element;let z,q=!f;b.color&&(b.fill=b.color);f&&g(b,function(b,c){f&&f[c]!==b&&(l[c]=b,q=!0)});if(q){f&&(b=L(f,l));null===b.width||"auto"===b.width?delete this.textWidth:"text"===e.nodeName.toLowerCase()&&b.width&&(z=this.textWidth=c(b.width));this.styles=b;z&&!r&&this.renderer.forExport&&delete b.width;const g= +w(b);e.namespaceURI===this.SVG_NS&&["textOutline","textOverflow","width"].forEach(b=>g&&delete g[b]);n(e,g)}this.added&&("text"===this.element.nodeName&&this.renderer.buildText(this),b.textOutline&&this.applyTextOutline(b.textOutline));return this}dashstyleSetter(f){let g=this["stroke-width"];"inherit"===g&&(g=1);if(f=f&&f.toLowerCase()){const l=f.replace("shortdashdotdot","3,1,1,1,1,1,").replace("shortdashdot","3,1,1,1").replace("shortdot","1,1,").replace("shortdash","3,1,").replace("longdash","8,3,").replace(/dot/g, +"1,3,").replace("dash","4,3,").replace(/,$/,"").split(",");for(f=l.length;f--;)l[f]=""+c(l[f])*b(g,NaN);f=l.join(",").replace(/NaN/g,"none");this.element.setAttribute("stroke-dasharray",f)}}destroy(){const b=this;var c=b.element||{};const f=b.renderer;var l=c.ownerSVGElement;let e="SPAN"===c.nodeName&&b.parentGroup||void 0;c.onclick=c.onmouseout=c.onmouseover=c.onmousemove=c.point=null;C(b);if(b.clipPath&&l){const c=b.clipPath;[].forEach.call(l.querySelectorAll("[clip-path],[CLIP-PATH]"),function(b){-1< +b.getAttribute("clip-path").indexOf(c.element.id)&&b.removeAttribute("clip-path")});b.clipPath=c.destroy()}if(b.stops){for(l=0;lc&&c.join?(f?b+" ":"")+c.join(" "):(c||"").toString(),""));/(NaN| {2}|^$)/.test(b)&&(b="M 0 0");this[c]!==b&&(f.setAttribute(c,b),this[c]=b)}fadeOut(c){const f=this;f.animate({opacity:0},{duration:b(c,150),complete:function(){f.hide()}})}fillSetter(b,c,f){"string"===typeof b?f.setAttribute(c,b):b&&this.complexColor(b,c,f)}getBBox(c,f){const {alignValue:g,element:l,renderer:e,styles:z,textStr:x}=this,{cache:a,cacheKeys:w}=e;var K=l.namespaceURI===this.SVG_NS;f= +b(f,this.rotation,0);var k=e.styledMode?l&&J.prototype.getStyle.call(l,"font-size"):z&&z.fontSize;let d;let y;h(x)&&(y=x.toString(),-1===y.indexOf("<")&&(y=y.replace(/[0-9]/g,"0")),y+=["",e.rootFontSize,k,f,this.textWidth,g,z&&z.textOverflow,z&&z.fontWeight].join());y&&!c&&(d=a[y]);if(!d){if(K||e.forExport){try{var m=this.fakeTS&&function(b){const c=l.querySelector(".highcharts-text-outline");c&&n(c,{display:b})};q(m)&&m("none");d=l.getBBox?L({},l.getBBox()):{width:l.offsetWidth,height:l.offsetHeight, +x:0,y:0};q(m)&&m("")}catch(fa){""}if(!d||0>d.width)d={x:0,y:0,width:0,height:0}}else d=this.htmlGetBBox();m=d.width;c=d.height;K&&(d.height=c={"11px,17":14,"13px,20":16}[`${k||""},${Math.round(c)}`]||c);if(f){K=Number(l.getAttribute("y")||0)-d.y;k={right:1,center:.5}[g||0]||0;var p=f*B,r=(f-90)*B,v=m*Math.cos(p);f=m*Math.sin(p);var D=Math.cos(r);p=Math.sin(r);m=d.x+k*(m-v)+K*D;r=m+v;D=r-c*D;v=D-v;K=d.y+K-k*f+K*p;k=K+f;c=k-c*p;f=c-f;d.x=Math.min(m,r,D,v);d.y=Math.min(K,k,c,f);d.width=Math.max(m,r, +D,v)-d.x;d.height=Math.max(K,k,c,f)-d.y}}if(y&&(""===x||0{if(b&&q){let N=b.attr("id");N||b.attr("id",N=x());var l={x:0,y:0};h(e.dx)&&(l.dx=e.dx,delete e.dx);h(e.dy)&& +(l.dy=e.dy,delete e.dy);g.attr(l);this.attr({transform:""});this.box&&(this.box=this.box.destroy());l=c.nodes.slice(0);c.nodes.length=0;c.nodes[0]={tagName:"textPath",attributes:L(e,{"text-anchor":e.textAnchor,href:`${f}#${N}`}),children:l}}}),g.textPath={path:b,undo:c}):(g.attr({dx:0,dy:0}),delete g.textPath);this.added&&(g.textCache="",this.renderer.buildText(g));return this}shadow(b){var c;const {renderer:f}=this,g=w(90===(null===(c=this.parentGroup)||void 0===c?void 0:c.rotation)?{offsetX:-1, +offsetY:-1}:{},y(b)?b:{});c=f.shadowDefinition(g);return this.attr({filter:b?`url(${f.url}#${c})`:"none"})}show(b=!0){return this.attr({visibility:b?"inherit":"visible"})}["stroke-widthSetter"](b,c,f){this[c]=b;f.setAttribute(c,b)}strokeWidth(){if(!this.renderer.styledMode)return this["stroke-width"]||0;const b=this.getStyle("stroke-width");let f=0,g;b.indexOf("px")===b.length-2?f=c(b):""!==b&&(g=t.createElementNS(d,"rect"),k(g,{width:b,"stroke-width":0}),this.element.parentNode.appendChild(g),f= +g.getBBox().width,g.parentNode.removeChild(g));return f}symbolAttr(c){const f=this;J.symbolCustomAttribs.forEach(function(g){f[g]=b(c[g],f[g])});f.attr({d:f.renderer.symbols[f.symbolName](f.x,f.y,f.width,f.height,f)})}textSetter(b){b!==this.textStr&&(delete this.textPxLength,this.textStr=b,this.added&&this.renderer.buildText(this))}titleSetter(c){const f=this.element,g=f.getElementsByTagName("title")[0]||t.createElementNS(this.SVG_NS,"title");f.insertBefore?f.insertBefore(g,f.firstChild):f.appendChild(g); +g.textContent=String(b(c,"")).replace(/<[^>]*>/g,"").replace(/</g,"<").replace(/>/g,">")}toFront(){const b=this.element;b.parentNode.appendChild(b);return this}translate(b,c){return this.attr({translateX:b,translateY:c})}updateTransform(){const {element:c,matrix:f,rotation:g=0,scaleX:l,scaleY:e,translateX:q=0,translateY:x=0}=this,a=["translate("+q+","+x+")"];h(f)&&a.push("matrix("+f.join(",")+")");g&&a.push("rotate("+g+" "+b(this.rotationOriginX,c.getAttribute("x"),0)+" "+b(this.rotationOriginY, +c.getAttribute("y")||0)+")");(h(l)||h(e))&&a.push("scale("+b(l,1)+" "+b(e,1)+")");a.length&&!(this.text||this).textPath&&c.setAttribute("transform",a.join(" "))}visibilitySetter(b,c,f){"inherit"===b?f.removeAttribute(c):this[c]!==b&&f.setAttribute(c,b);this[c]=b}xGetter(b){"circle"===this.element.nodeName&&("x"===b?b="cx":"y"===b&&(b="cy"));return this._defaultGetter(b)}zIndexSetter(b,f){var g=this.renderer,l=this.parentGroup;const e=(l||g).element||g.box,q=this.element;g=e===g.box;let a=!1,x;var w= +this.added;let K;h(b)?(q.setAttribute("data-z-index",b),b=+b,this[f]===b&&(w=!1)):h(this[f])&&q.removeAttribute("data-z-index");this[f]=b;if(w){(b=this.zIndex)&&l&&(l.handleZ=!0);f=e.childNodes;for(K=f.length-1;0<=K&&!a;K--)if(l=f[K],w=l.getAttribute("data-z-index"),x=!h(w),l!==q)if(0>b&&x&&!g&&!K)e.insertBefore(q,f[K]),a=!0;else if(c(w)<=b||x&&(!h(b)||0<=b))e.insertBefore(q,f[K+1]),a=!0;a||(e.insertBefore(q,f[g?3:0]),a=!0)}return a}}J.symbolCustomAttribs="anchorX anchorY clockwise end height innerR r start width x y".split(" "); +J.prototype.strokeSetter=J.prototype.fillSetter;J.prototype.yGetter=J.prototype.xGetter;J.prototype.matrixSetter=J.prototype.rotationOriginXSetter=J.prototype.rotationOriginYSetter=J.prototype.rotationSetter=J.prototype.scaleXSetter=J.prototype.scaleYSetter=J.prototype.translateXSetter=J.prototype.translateYSetter=J.prototype.verticalAlignSetter=function(b,c){this[c]=b;this.doTransform=!0};"";return J});M(a,"Core/Renderer/RendererRegistry.js",[a["Core/Globals.js"]],function(a){var u;(function(u){u.rendererTypes= +{};let A;u.getRendererType=function(a=A){return u.rendererTypes[a]||u.rendererTypes[A]};u.registerRendererType=function(F,G,C){u.rendererTypes[F]=G;if(!A||C)A=F,a.Renderer=G}})(u||(u={}));return u});M(a,"Core/Renderer/SVG/SVGLabel.js",[a["Core/Renderer/SVG/SVGElement.js"],a["Core/Utilities.js"]],function(a,A){const {defined:u,extend:I,isNumber:F,merge:G,pick:C,removeEvent:B}=A;class t extends a{constructor(a,d,p,m,k,v,n,h,D,L){super();this.paddingRightSetter=this.paddingLeftSetter=this.paddingSetter; +this.init(a,"g");this.textStr=d;this.x=p;this.y=m;this.anchorX=v;this.anchorY=n;this.baseline=D;this.className=L;this.addClass("button"===L?"highcharts-no-tooltip":"highcharts-label");L&&this.addClass("highcharts-"+L);this.text=a.text(void 0,0,0,h).attr({zIndex:1});let r;"string"===typeof k&&((r=/^url\((.*?)\)$/.test(k))||this.renderer.symbols[k])&&(this.symbolKey=k);this.bBox=t.emptyBBox;this.padding=3;this.baselineOffset=0;this.needsBox=a.styledMode||r;this.deferredAttr={};this.alignFactor=0}alignSetter(a){a= +{left:0,center:.5,right:1}[a];a!==this.alignFactor&&(this.alignFactor=a,this.bBox&&F(this.xSetting)&&this.attr({x:this.xSetting}))}anchorXSetter(a,d){this.anchorX=a;this.boxAttr(d,Math.round(a)-this.getCrispAdjust()-this.xSetting)}anchorYSetter(a,d){this.anchorY=a;this.boxAttr(d,a-this.ySetting)}boxAttr(a,d){this.box?this.box.attr(a,d):this.deferredAttr[a]=d}css(r){if(r){const a={};r=G(r);t.textProps.forEach(d=>{"undefined"!==typeof r[d]&&(a[d]=r[d],delete r[d])});this.text.css(a);"fontSize"in a|| +"fontWeight"in a?this.updateTextPadding():("width"in a||"textOverflow"in a)&&this.updateBoxSize()}return a.prototype.css.call(this,r)}destroy(){B(this.element,"mouseenter");B(this.element,"mouseleave");this.text&&this.text.destroy();this.box&&(this.box=this.box.destroy());a.prototype.destroy.call(this)}fillSetter(a,d){a&&(this.needsBox=!0);this.fill=a;this.boxAttr(d,a)}getBBox(){this.textStr&&0===this.bBox.width&&0===this.bBox.height&&this.updateBoxSize();const a=this.padding,d=C(this.paddingLeft, +a);return{width:this.width,height:this.height,x:this.bBox.x-d,y:this.bBox.y-a}}getCrispAdjust(){return this.renderer.styledMode&&this.box?this.box.strokeWidth()%2/2:(this["stroke-width"]?parseInt(this["stroke-width"],10):0)%2/2}heightSetter(a){this.heightSetting=a}onAdd(){this.text.add(this);this.attr({text:C(this.textStr,""),x:this.x||0,y:this.y||0});this.box&&u(this.anchorX)&&this.attr({anchorX:this.anchorX,anchorY:this.anchorY})}paddingSetter(a,d){F(a)?a!==this[d]&&(this[d]=a,this.updateTextPadding()): +this[d]=void 0}rSetter(a,d){this.boxAttr(d,a)}strokeSetter(a,d){this.stroke=a;this.boxAttr(d,a)}["stroke-widthSetter"](a,d){a&&(this.needsBox=!0);this["stroke-width"]=a;this.boxAttr(d,a)}["text-alignSetter"](a){this.textAlign=a}textSetter(a){"undefined"!==typeof a&&this.text.attr({text:a});this.updateTextPadding()}updateBoxSize(){var a=this.text;const d={},p=this.padding,m=this.bBox=F(this.widthSetting)&&F(this.heightSetting)&&!this.textAlign||!u(a.textStr)?t.emptyBBox:a.getBBox();this.width=this.getPaddedWidth(); +this.height=(this.heightSetting||m.height||0)+2*p;const k=this.renderer.fontMetrics(a);this.baselineOffset=p+Math.min((this.text.firstLineMetrics||k).b,m.height||Infinity);this.heightSetting&&(this.baselineOffset+=(this.heightSetting-k.h)/2);this.needsBox&&!a.textPath&&(this.box||(a=this.box=this.symbolKey?this.renderer.symbol(this.symbolKey):this.renderer.rect(),a.addClass(("button"===this.className?"":"highcharts-label-box")+(this.className?" highcharts-"+this.className+"-box":"")),a.add(this)), +a=this.getCrispAdjust(),d.x=a,d.y=(this.baseline?-this.baselineOffset:0)+a,d.width=Math.round(this.width),d.height=Math.round(this.height),this.box.attr(I(d,this.deferredAttr)),this.deferredAttr={})}updateTextPadding(){const a=this.text;if(!a.textPath){this.updateBoxSize();const d=this.baseline?0:this.baselineOffset;let p=C(this.paddingLeft,this.padding);u(this.widthSetting)&&this.bBox&&("center"===this.textAlign||"right"===this.textAlign)&&(p+={center:.5,right:1}[this.textAlign]*(this.widthSetting- +this.bBox.width));if(p!==a.x||d!==a.y)a.attr("x",p),a.hasBoxWidthChanged&&(this.bBox=a.getBBox(!0)),"undefined"!==typeof d&&a.attr("y",d);a.x=p;a.y=d}}widthSetter(a){this.widthSetting=F(a)?a:void 0}getPaddedWidth(){var a=this.padding;const d=C(this.paddingLeft,a);a=C(this.paddingRight,a);return(this.widthSetting||this.bBox.width||0)+d+a}xSetter(a){this.x=a;this.alignFactor&&(a-=this.alignFactor*this.getPaddedWidth(),this["forceAnimate:x"]=!0);this.xSetting=Math.round(a);this.attr("translateX",this.xSetting)}ySetter(a){this.ySetting= +this.y=Math.round(a);this.attr("translateY",this.ySetting)}}t.emptyBBox={width:0,height:0,x:0,y:0};t.textProps="color direction fontFamily fontSize fontStyle fontWeight lineHeight textAlign textDecoration textOutline textOverflow whiteSpace width".split(" ");return t});M(a,"Core/Renderer/SVG/Symbols.js",[a["Core/Utilities.js"]],function(a){function u(a,t,r,d,p){const m=[];if(p){const k=p.start||0,v=C(p.r,r);r=C(p.r,d||r);d=(p.end||0)-.001;const n=p.innerR,h=C(p.open,.001>Math.abs((p.end||0)-k-2*Math.PI)), +D=Math.cos(k),L=Math.sin(k),E=Math.cos(d),e=Math.sin(d),q=C(p.longArc,.001>d-k-Math.PI?0:1);let y=["A",v,r,0,q,C(p.clockwise,1),a+v*E,t+r*e];y.params={start:k,end:d,cx:a,cy:t};m.push(["M",a+v*D,t+r*L],y);F(n)&&(y=["A",n,n,0,q,F(p.clockwise)?1-p.clockwise:0,a+n*D,t+n*L],y.params={start:d,end:k,cx:a,cy:t},m.push(h?["M",a+n*E,t+n*e]:["L",a+n*E,t+n*e],y));h||m.push(["Z"])}return m}function H(a,t,r,d,p){return p&&p.r?I(a,t,r,d,p):[["M",a,t],["L",a+r,t],["L",a+r,t+d],["L",a,t+d],["Z"]]}function I(a,t,r, +d,p){p=(null===p||void 0===p?void 0:p.r)||0;return[["M",a+p,t],["L",a+r-p,t],["A",p,p,0,0,1,a+r,t+p],["L",a+r,t+d-p],["A",p,p,0,0,1,a+r-p,t+d],["L",a+p,t+d],["A",p,p,0,0,1,a,t+d-p],["L",a,t+p],["A",p,p,0,0,1,a+p,t],["Z"]]}const {defined:F,isNumber:G,pick:C}=a;return{arc:u,callout:function(a,t,r,d,p){const m=Math.min(p&&p.r||0,r,d),k=m+6,v=p&&p.anchorX;p=p&&p.anchorY||0;const n=I(a,t,r,d,{r:m});if(!G(v))return n;a+v>=r?p>t+k&&p=a+v?p>t+k&&pd&&v>a+k&&vp&&v>a+k&&v/g;var e=[h,this.ellipsis,this.noWrap,this.textLineHeight, +this.textOutline,k.getStyle("font-size"),this.width].join();if(e!==k.textCache){k.textCache=e;delete k.actualWidth;for(e=L.length;e--;)d.removeChild(L[e]);m||this.ellipsis||this.width||k.textPath||-1!==h.indexOf(" ")&&(!this.noWrap||E.test(h))?""!==h&&(n&&n.appendChild(d),h=new a(h),this.modifyTree(h.nodes),h.addToDOM(d),this.modifyDOM(),this.ellipsis&&-1!==(d.textContent||"").indexOf("\u2026")&&k.attr("title",this.unescapeEntities(k.textStr||"",["<",">"])),n&&n.removeChild(d)):d.appendChild(u.createTextNode(this.unescapeEntities(h))); +r(this.textOutline)&&k.applyTextOutline&&k.applyTextOutline(this.textOutline)}}modifyDOM(){const a=this.svgElement,d=C(a.element,"x");a.firstLineMetrics=void 0;let n;for(;n=a.element.firstChild;)if(/^[\s\u200B]*$/.test(n.textContent||" "))a.element.removeChild(n);else break;[].forEach.call(a.element.querySelectorAll("tspan.highcharts-br"),(h,e)=>{h.nextSibling&&h.previousSibling&&(0===e&&1===h.previousSibling.nodeType&&(a.firstLineMetrics=a.renderer.fontMetrics(h.previousSibling)),C(h,{dy:this.getLineHeight(h.nextSibling), +x:d}))});const h=this.width||0;if(h){var m=(n,e)=>{var q=n.textContent||"";const k=q.replace(/([^\^])-/g,"$1- ").split(" ");var l=!this.noWrap&&(1b.substring(0,f)+"\u2026");else if(l){q=[];for(l=[];e.firstChild&&e.firstChild!==n;)l.push(e.firstChild),e.removeChild(e.firstChild);for(;k.length;)k.length&&!this.noWrap&&0k.slice(0,f).join(" ").replace(/- /g,"-")),b=a.actualWidth,g++;l.forEach(b=>{e.insertBefore(b,n)});q.forEach(b=>{e.insertBefore(u.createTextNode(b),n);b=u.createElementNS(F,"tspan");b.textContent="\u200b";C(b,{dy:w,x:d});e.insertBefore(b,n)})}},p=h=>{[].slice.call(h.childNodes).forEach(e=>{e.nodeType===G.Node.TEXT_NODE?m(e,h):(-1!==e.className.baseVal.indexOf("highcharts-br")&&(a.actualWidth=0),p(e))})}; +p(a.element)}}getLineHeight(a){a=a.nodeType===G.Node.TEXT_NODE?a.parentElement:a;return this.textLineHeight?parseInt(this.textLineHeight.toString(),10):this.renderer.fontMetrics(a||this.svgElement.element).h}modifyTree(a){const k=(n,h)=>{const {attributes:d={},children:m,style:p={},tagName:e}=n,q=this.renderer.styledMode;if("b"===e||"strong"===e)q?d["class"]="highcharts-strong":p.fontWeight="bold";else if("i"===e||"em"===e)q?d["class"]="highcharts-emphasized":p.fontStyle="italic";p&&p.color&&(p.fill= +p.color);"br"===e?(d["class"]="highcharts-br",n.textContent="\u200b",(h=a[h+1])&&h.textContent&&(h.textContent=h.textContent.replace(/^ +/gm,""))):"a"===e&&m&&m.some(a=>"#text"===a.tagName)&&(n.children=[{children:m,tagName:"tspan"}]);"#text"!==e&&"a"!==e&&(n.tagName="tspan");B(n,{attributes:d,style:p});m&&m.filter(a=>"#text"!==a.tagName).forEach(k)};a.forEach(k);t(this.svgElement,"afterModifyTree",{nodes:a})}truncate(a,d,n,h,m,p){const k=this.svgElement,{rotation:e}=k,q=[];let y=n?1:0,l=(d||n||"").length, +w=l,g,b;const c=function(b,c){b=c||b;if((c=a.parentNode)&&"undefined"===typeof q[b]&&c.getSubStringLength)try{q[b]=h+c.getSubStringLength(0,n?b+1:b)}catch(J){""}return q[b]};k.rotation=0;b=c(a.textContent.length);if(h+b>m){for(;y<=l;)w=Math.ceil((y+l)/2),n&&(g=p(n,w)),b=c(w,g&&g.length-1),y===l?y=l+1:b>m?l=w-1:y=w;0===l?a.textContent="":d&&l===d.length-1||(a.textContent=g||p(d||n,w))}n&&n.splice(0,w);k.actualWidth=b;k.rotation=e}unescapeEntities(a,m){d(this.renderer.escapes,function(n,h){m&&-1!== +m.indexOf(n)||(a=a.toString().replace(new RegExp(n,"g"),h))});return a}}return m});M(a,"Core/Renderer/SVG/SVGRenderer.js",[a["Core/Renderer/HTML/AST.js"],a["Core/Color/Color.js"],a["Core/Globals.js"],a["Core/Renderer/RendererRegistry.js"],a["Core/Renderer/SVG/SVGElement.js"],a["Core/Renderer/SVG/SVGLabel.js"],a["Core/Renderer/SVG/Symbols.js"],a["Core/Renderer/SVG/TextBuilder.js"],a["Core/Utilities.js"]],function(a,A,H,I,F,G,C,B,t){const {charts:r,deg2rad:d,doc:p,isFirefox:m,isMS:k,isWebKit:v,noop:n, +SVG_NS:h,symbolSizes:D,win:L}=H,{addEvent:E,attr:e,createElement:q,css:y,defined:l,destroyObjectProperties:w,extend:g,isArray:b,isNumber:c,isObject:f,isString:x,merge:J,pick:z,pInt:Q,uniqueKey:S}=t;let R;class N{constructor(b,c,f,g,a,l,e){this.width=this.url=this.style=this.imgCount=this.height=this.gradients=this.globalAnimation=this.defs=this.chartIndex=this.cacheKeys=this.cache=this.boxWrapper=this.box=this.alignedObjects=void 0;this.init(b,c,f,g,a,l,e)}init(b,c,f,g,a,l,N){const q=this.createElement("svg").attr({version:"1.1", +"class":"highcharts-root"}),K=q.element;N||q.css(this.getStyle(g));b.appendChild(K);e(b,"dir","ltr");-1===b.innerHTML.indexOf("xmlns")&&e(K,"xmlns",this.SVG_NS);this.box=K;this.boxWrapper=q;this.alignedObjects=[];this.url=this.getReferenceURL();this.createElement("desc").add().element.appendChild(p.createTextNode("Created with Highcharts 11.0.1"));this.defs=this.createElement("defs").add();this.allowHTML=l;this.forExport=a;this.styledMode=N;this.gradients={};this.cache={};this.cacheKeys=[];this.imgCount= +0;this.rootFontSize=q.getStyle("font-size");this.setSize(c,f,!1);let x;m&&b.getBoundingClientRect&&(c=function(){y(b,{left:0,top:0});x=b.getBoundingClientRect();y(b,{left:Math.ceil(x.left)-x.left+"px",top:Math.ceil(x.top)-x.top+"px"})},c(),this.unSubPixelFix=E(L,"resize",c))}definition(b){return(new a([b])).addToDOM(this.defs.element)}getReferenceURL(){if((m||v)&&p.getElementsByTagName("base").length){if(!l(R)){var b=S();b=(new a([{tagName:"svg",attributes:{width:8,height:8},children:[{tagName:"defs", +children:[{tagName:"clipPath",attributes:{id:b},children:[{tagName:"rect",attributes:{width:4,height:4}}]}]},{tagName:"rect",attributes:{id:"hitme",width:8,height:8,"clip-path":`url(#${b})`,fill:"rgba(0,0,0,0.001)"}}]}])).addToDOM(p.body);y(b,{position:"fixed",top:0,left:0,zIndex:9E5});const c=p.elementFromPoint(6,6);R="hitme"===(c&&c.id);p.body.removeChild(b)}if(R)return L.location.href.split("#")[0].replace(/<[^>]*>/g,"").replace(/([\('\)])/g,"\\$1").replace(/ /g,"%20")}return""}getStyle(b){return this.style= +g({fontFamily:"Helvetica, Arial, sans-serif",fontSize:"1rem"},b)}setStyle(b){this.boxWrapper.css(this.getStyle(b))}isHidden(){return!this.boxWrapper.getBBox().width}destroy(){const b=this.defs;this.box=null;this.boxWrapper=this.boxWrapper.destroy();w(this.gradients||{});this.gradients=null;this.defs=b.destroy();this.unSubPixelFix&&this.unSubPixelFix();return this.alignedObjects=null}createElement(b){const c=new this.Element;c.init(this,b);return c}getRadialAttr(b,c){return{cx:b[0]-b[2]/2+(c.cx||0)* +b[2],cy:b[1]-b[2]/2+(c.cy||0)*b[2],r:(c.r||0)*b[2]}}shadowDefinition(b){const c=[`highcharts-drop-shadow-${this.chartIndex}`,...Object.keys(b).map(c=>b[c])].join("-").replace(/[^a-z0-9\-]/g,""),f=J({color:"#000000",offsetX:1,offsetY:1,opacity:.15,width:5},b);this.defs.element.querySelector(`#${c}`)||this.definition({tagName:"filter",attributes:{id:c},children:[{tagName:"feDropShadow",attributes:{dx:f.offsetX,dy:f.offsetY,"flood-color":f.color,"flood-opacity":Math.min(5*f.opacity,1),stdDeviation:f.width/ +2}}]});return c}buildText(b){(new B(b)).buildSVG()}getContrast(b){b=A.parse(b).rgba.map(b=>{b/=255;return.03928>=b?b/12.92:Math.pow((b+.055)/1.055,2.4)});b=.2126*b[0]+.7152*b[1]+.0722*b[2];return 1.05/(b+.05)>(b+.05)/.05?"#FFFFFF":"#000000"}button(b,c,l,e,N={},q,x,w,h,z){const K=this.label(b,c,l,h,void 0,void 0,z,void 0,"button"),n=this.styledMode;b=N.states||{};let d=0;N=J(N);delete N.states;const O=J({color:"#333333",cursor:"pointer",fontSize:"0.8em",fontWeight:"normal"},N.style);delete N.style; +let y=a.filterUserAttributes(N);K.attr(J({padding:8,r:2},y));let m,P,p;n||(y=J({fill:"#f7f7f7",stroke:"#cccccc","stroke-width":1},y),q=J(y,{fill:"#e6e6e6"},a.filterUserAttributes(q||b.hover||{})),m=q.style,delete q.style,x=J(y,{fill:"#e6e9ff",style:{color:"#000000",fontWeight:"bold"}},a.filterUserAttributes(x||b.select||{})),P=x.style,delete x.style,w=J(y,{style:{color:"#cccccc"}},a.filterUserAttributes(w||b.disabled||{})),p=w.style,delete w.style);E(K.element,k?"mouseover":"mouseenter",function(){3!== +d&&K.setState(1)});E(K.element,k?"mouseout":"mouseleave",function(){3!==d&&K.setState(d)});K.setState=function(b){1!==b&&(K.state=d=b);K.removeClass(/highcharts-button-(normal|hover|pressed|disabled)/).addClass("highcharts-button-"+["normal","hover","pressed","disabled"][b||0]);n||(K.attr([y,q,x,w][b||0]),b=[O,m,P,p][b||0],f(b)&&K.css(b))};n||(K.attr(y).css(g({cursor:"default"},O)),z&&K.text.css({pointerEvents:"none"}));return K.on("touchstart",b=>b.stopPropagation()).on("click",function(b){3!==d&& +e.call(K,b)})}crispLine(b,c,f="round"){const g=b[0],a=b[1];l(g[1])&&g[1]===a[1]&&(g[1]=a[1]=Math[f](g[1])-c%2/2);l(g[2])&&g[2]===a[2]&&(g[2]=a[2]=Math[f](g[2])+c%2/2);return b}path(c){const a=this.styledMode?{}:{fill:"none"};b(c)?a.d=c:f(c)&&g(a,c);return this.createElement("path").attr(a)}circle(b,c,g){b=f(b)?b:"undefined"===typeof b?{}:{x:b,y:c,r:g};c=this.createElement("circle");c.xSetter=c.ySetter=function(b,c,f){f.setAttribute("c"+c,b)};return c.attr(b)}arc(b,c,g,a,l,e){f(b)?(a=b,c=a.y,g=a.r, +b=a.x):a={innerR:a,start:l,end:e};b=this.symbol("arc",b,c,g,g,a);b.r=g;return b}rect(b,c,a,l,N,q){b=f(b)?b:"undefined"===typeof b?{}:{x:b,y:c,r:N,width:Math.max(a||0,0),height:Math.max(l||0,0)};const x=this.createElement("rect");this.styledMode||("undefined"!==typeof q&&(b["stroke-width"]=q,g(b,x.crisp(b))),b.fill="none");x.rSetter=function(b,c,f){x.r=b;e(f,{rx:b,ry:b})};x.rGetter=function(){return x.r||0};return x.attr(b)}roundedRect(b){return this.symbol("roundedRect").attr(b)}setSize(b,c,f){this.width= +b;this.height=c;this.boxWrapper.animate({width:b,height:c},{step:function(){this.attr({viewBox:"0 0 "+this.attr("width")+" "+this.attr("height")})},duration:z(f,!0)?void 0:0});this.alignElements()}g(b){const c=this.createElement("g");return b?c.attr({"class":"highcharts-"+b}):c}image(b,f,g,a,l,e){const N={preserveAspectRatio:"none"},q=function(b,c){b.setAttributeNS?b.setAttributeNS("http://www.w3.org/1999/xlink","href",c):b.setAttribute("hc-svg-href",c)};c(f)&&(N.x=f);c(g)&&(N.y=g);c(a)&&(N.width= +a);c(l)&&(N.height=l);const x=this.createElement("image").attr(N);f=function(c){q(x.element,b);e.call(x,c)};e?(q(x.element,"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="),g=new L.Image,E(g,"load",f),g.src=b,g.complete&&f({})):q(x.element,b);return x}symbol(b,c,f,a,N,x){const K=this,w=/^url\((.*?)\)$/,h=w.test(b),n=!h&&(this.symbols[b]?b:"circle"),d=n&&this.symbols[n];let J,k,m,O;if(d)"number"===typeof c&&(k=d.call(this.symbols,Math.round(c||0),Math.round(f||0),a||0,N|| +0,x)),J=this.path(k),K.styledMode||J.attr("fill","none"),g(J,{symbolName:n||void 0,x:c,y:f,width:a,height:N}),x&&g(J,x);else if(h){m=b.match(w)[1];const g=J=this.image(m);g.imgwidth=z(x&&x.width,D[m]&&D[m].width);g.imgheight=z(x&&x.height,D[m]&&D[m].height);O=b=>b.attr({width:b.width,height:b.height});["width","height"].forEach(function(b){g[b+"Setter"]=function(b,c){this[c]=b;const {alignByTranslate:f,element:g,width:a,height:N,imgwidth:q,imgheight:K}=this;b=this["img"+c];if(l(b)){let l=1;x&&"within"=== +x.backgroundSize&&a&&N?(l=Math.min(a/q,N/K),e(g,{width:Math.round(q*l),height:Math.round(K*l)})):g&&g.setAttribute(c,b);f||this.translate(((a||0)-q*l)/2,((N||0)-K*l)/2)}}});l(c)&&g.attr({x:c,y:f});g.isImg=!0;l(g.imgwidth)&&l(g.imgheight)?O(g):(g.attr({width:0,height:0}),q("img",{onload:function(){const b=r[K.chartIndex];0===this.width&&(y(this,{position:"absolute",top:"-999em"}),p.body.appendChild(this));D[m]={width:this.width,height:this.height};g.imgwidth=this.width;g.imgheight=this.height;g.element&& +O(g);this.parentNode&&this.parentNode.removeChild(this);K.imgCount--;if(!K.imgCount&&b&&!b.hasLoaded)b.onload()},src:m}),this.imgCount++)}return J}clipRect(b,c,f,g){const a=S()+"-",l=this.createElement("clipPath").attr({id:a}).add(this.defs);b=this.rect(b,c,f,g,0).add(l);b.id=a;b.clipPath=l;b.count=0;return b}text(b,c,f,g){const a={};if(g&&(this.allowHTML||!this.forExport))return this.html(b,c,f);a.x=Math.round(c||0);f&&(a.y=Math.round(f));l(b)&&(a.text=b);b=this.createElement("text").attr(a);if(!g|| +this.forExport&&!this.allowHTML)b.xSetter=function(b,c,f){const g=f.getElementsByTagName("tspan"),a=f.getAttribute(c);for(let f=0,l;fb?b+3:Math.round(1.2*b);return{h:c,b:Math.round(.8*c),f:b}}rotCorr(b,c,f){let g=b;c&&f&&(g=Math.max(g*Math.cos(c*d),4));return{x:-b/3*Math.sin(c*d),y:g}}pathToSegments(b){const f=[],g=[],a={A:8,C:7,H:2, +L:3,M:3,Q:5,S:5,T:3,V:2};for(let l=0;lb.align())}}g(N.prototype,{Element:F,SVG_NS:h,escapes:{"&":"&","<":"<",">":">","'":"'",'"':"""},symbols:C,draw:n}); +I.registerRendererType("svg",N,!0);"";return N});M(a,"Core/Renderer/HTML/HTMLElement.js",[a["Core/Globals.js"],a["Core/Renderer/SVG/SVGElement.js"],a["Core/Utilities.js"]],function(a,A,H){const {isFirefox:u,isMS:F,isWebKit:G,win:C}=a,{css:B,defined:t,extend:r,pick:d,pInt:p}=H,m=[];class k extends A{static compose(a){if(H.pushUnique(m,a)){const n=k.prototype,h=a.prototype;h.getSpanCorrection=n.getSpanCorrection;h.htmlCss=n.htmlCss;h.htmlGetBBox=n.htmlGetBBox;h.htmlUpdateTransform=n.htmlUpdateTransform; +h.setSpanRotation=n.setSpanRotation}return a}getSpanCorrection(a,n,h){this.xCorr=-a*h;this.yCorr=-n}htmlCss(a){const n="SPAN"===this.element.tagName&&a&&"width"in a,h=d(n&&a.width,void 0);let k;n&&(delete a.width,this.textWidth=h,k=!0);a&&"ellipsis"===a.textOverflow&&(a.whiteSpace="nowrap",a.overflow="hidden");this.styles=r(this.styles,a);B(this.element,a);k&&this.htmlUpdateTransform();return this}htmlGetBBox(){const a=this.element;return{x:a.offsetLeft,y:a.offsetTop,width:a.offsetWidth,height:a.offsetHeight}}htmlUpdateTransform(){if(this.added){var a= +this.renderer,n=this.element,h=this.x||0,d=this.y||0,k=this.textAlign||"left",m={left:0,center:.5,right:1}[k],e=this.styles,q=e&&e.whiteSpace;B(n,{marginLeft:this.translateX||0,marginTop:this.translateY||0});if("SPAN"===n.tagName){e=this.rotation;const l=this.textWidth&&p(this.textWidth),w=[e,k,n.innerHTML,this.textWidth,this.textAlign].join();let g=!1;if(l!==this.oldTextWidth){if(this.textPxLength)var y=this.textPxLength;else B(n,{width:"",whiteSpace:q||"nowrap"}),y=n.offsetWidth;(l>this.oldTextWidth|| +y>l)&&(/[ \-]/.test(n.textContent||n.innerText)||"ellipsis"===n.style.textOverflow)&&(B(n,{width:y>l||e?l+"px":"auto",display:"block",whiteSpace:q||"normal"}),this.oldTextWidth=l,g=!0)}this.hasBoxWidthChanged=g;w!==this.cTT&&(a=a.fontMetrics(n).b,!t(e)||e===(this.oldRotation||0)&&k===this.oldAlign||this.setSpanRotation(e,m,a),this.getSpanCorrection(!t(e)&&this.textPxLength||n.offsetWidth,a,m,e,k));B(n,{left:h+(this.xCorr||0)+"px",top:d+(this.yCorr||0)+"px"});this.cTT=w;this.oldRotation=e;this.oldAlign= +k}}else this.alignOnAdd=!0}setSpanRotation(a,n,h){const d={},k=F&&!/Edge/.test(C.navigator.userAgent)?"-ms-transform":G?"-webkit-transform":u?"MozTransform":C.opera?"-o-transform":void 0;k&&(d[k]=d.transform="rotate("+a+"deg)",d[k+(u?"Origin":"-origin")]=d.transformOrigin=100*n+"% "+h+"px",B(this.element,d))}}return k});M(a,"Core/Renderer/HTML/HTMLRenderer.js",[a["Core/Renderer/HTML/AST.js"],a["Core/Renderer/SVG/SVGElement.js"],a["Core/Renderer/SVG/SVGRenderer.js"],a["Core/Utilities.js"]],function(a, +A,H,I){const {attr:u,createElement:G,extend:C,pick:B}=I,t=[];class r extends H{static compose(a){I.pushUnique(t,a)&&(a.prototype.html=r.prototype.html);return a}html(d,p,m){const k=this.createElement("span"),v=k.element,n=k.renderer,h=function(a,h){["opacity","visibility"].forEach(function(n){a[n+"Setter"]=function(e,q,d){const l=a.div?a.div.style:h;A.prototype[n+"Setter"].call(this,e,q,d);l&&(l[q]=e)}});a.addedSetters=!0};k.textSetter=function(h){h!==this.textStr&&(delete this.bBox,delete this.oldTextWidth, +a.setElementHTML(this.element,B(h,"")),this.textStr=h,k.doTransform=!0)};h(k,k.element.style);k.xSetter=k.ySetter=k.alignSetter=k.rotationSetter=function(a,h){"align"===h?k.alignValue=k.textAlign=a:k[h]=a;k.doTransform=!0};k.afterSetters=function(){this.doTransform&&(this.htmlUpdateTransform(),this.doTransform=!1)};k.attr({text:d,x:Math.round(p),y:Math.round(m)}).css({position:"absolute"});n.styledMode||k.css({fontFamily:this.style.fontFamily,fontSize:this.style.fontSize});v.style.whiteSpace="nowrap"; +k.css=k.htmlCss;k.add=function(a){const d=n.box.parentNode,m=[];let e;if(this.parentGroup=a){if(e=a.div,!e){for(;a;)m.push(a),a=a.parentGroup;m.reverse().forEach(function(a){function q(b,c){a[c]=b;"translateX"===c?g.left=b+"px":g.top=b+"px";a.doTransform=!0}const l=u(a.element,"class"),w=a.styles||{};e=a.div=a.div||G("div",l?{className:l}:void 0,{position:"absolute",left:(a.translateX||0)+"px",top:(a.translateY||0)+"px",display:a.display,opacity:a.opacity,visibility:a.visibility},e||d);const g=e.style; +C(a,{classSetter:function(b){return function(c){this.element.setAttribute("class",c);b.className=c}}(e),css:function(b){k.css.call(a,b);["cursor","pointerEvents"].forEach(c=>{b[c]&&(g[c]=b[c])});return a},on:function(){m[0].div&&k.on.apply({element:m[0].div,onEvents:a.onEvents},arguments);return a},translateXSetter:q,translateYSetter:q});a.addedSetters||h(a);a.css(w)})}}else e=d;e.appendChild(v);k.added=!0;k.alignOnAdd&&k.htmlUpdateTransform();return k};return k}}return r});M(a,"Core/Axis/AxisDefaults.js", +[],function(){var a;(function(a){a.defaultXAxisOptions={alignTicks:!0,allowDecimals:void 0,panningEnabled:!0,zIndex:2,zoomEnabled:!0,dateTimeLabelFormats:{millisecond:{main:"%H:%M:%S.%L",range:!1},second:{main:"%H:%M:%S",range:!1},minute:{main:"%H:%M",range:!1},hour:{main:"%H:%M",range:!1},day:{main:"%e %b"},week:{main:"%e %b"},month:{main:"%b '%y"},year:{main:"%Y"}},endOnTick:!1,gridLineDashStyle:"Solid",gridZIndex:1,labels:{autoRotation:void 0,autoRotationLimit:80,distance:15,enabled:!0,indentation:10, +overflow:"justify",padding:5,reserveSpace:void 0,rotation:void 0,staggerLines:0,step:0,useHTML:!1,zIndex:7,style:{color:"#333333",cursor:"default",fontSize:"0.8em"}},maxPadding:.01,minorGridLineDashStyle:"Solid",minorTickLength:2,minorTickPosition:"outside",minorTicksPerMajor:5,minPadding:.01,offset:void 0,opposite:!1,reversed:void 0,reversedStacks:!1,showEmpty:!0,showFirstLabel:!0,showLastLabel:!0,startOfWeek:1,startOnTick:!1,tickLength:10,tickPixelInterval:100,tickmarkPlacement:"between",tickPosition:"outside", +title:{align:"middle",rotation:0,useHTML:!1,x:0,y:0,style:{color:"#666666",fontSize:"0.8em"}},type:"linear",uniqueNames:!0,visible:!0,minorGridLineColor:"#f2f2f2",minorGridLineWidth:1,minorTickColor:"#999999",lineColor:"#333333",lineWidth:1,gridLineColor:"#e6e6e6",gridLineWidth:void 0,tickColor:"#333333"};a.defaultYAxisOptions={reversedStacks:!0,endOnTick:!0,maxPadding:.05,minPadding:.05,tickPixelInterval:72,showLastLabel:!0,labels:{x:void 0},startOnTick:!0,title:{rotation:270,text:"Values"},stackLabels:{animation:{}, +allowOverlap:!1,enabled:!1,crop:!0,overflow:"justify",formatter:function(){const {numberFormatter:a}=this.axis.chart;return a(this.total||0,-1)},style:{color:"#000000",fontSize:"0.7em",fontWeight:"bold",textOutline:"1px contrast"}},gridLineWidth:1,lineWidth:0};a.defaultLeftAxisOptions={title:{rotation:270}};a.defaultRightAxisOptions={title:{rotation:90}};a.defaultBottomAxisOptions={labels:{autoRotation:[-45]},margin:15,title:{rotation:0}};a.defaultTopAxisOptions={labels:{autoRotation:[-45]},margin:15, +title:{rotation:0}}})(a||(a={}));return a});M(a,"Core/Foundation.js",[a["Core/Utilities.js"]],function(a){const {addEvent:u,isFunction:H,objectEach:I,removeEvent:F}=a;var G;(function(a){a.registerEventOptions=function(a,t){a.eventOptions=a.eventOptions||{};I(t.events,function(r,d){a.eventOptions[d]!==r&&(a.eventOptions[d]&&(F(a,d,a.eventOptions[d]),delete a.eventOptions[d]),H(r)&&(a.eventOptions[d]=r,u(a,d,r,{order:0})))})}})(G||(G={}));return G});M(a,"Core/Axis/Tick.js",[a["Core/FormatUtilities.js"], +a["Core/Globals.js"],a["Core/Utilities.js"]],function(a,A,H){const {deg2rad:u}=A,{clamp:F,correctFloat:G,defined:C,destroyObjectProperties:B,extend:t,fireEvent:r,isNumber:d,merge:p,objectEach:m,pick:k}=H;class v{constructor(a,h,d,k,m){this.isNewLabel=this.isNew=!0;this.axis=a;this.pos=h;this.type=d||"";this.parameters=m||{};this.tickmarkOffset=this.parameters.tickmarkOffset;this.options=this.parameters.options;r(this,"init");d||k||this.addLabel()}addLabel(){const n=this,h=n.axis;var m=h.options;const p= +h.chart;var v=h.categories;const e=h.logarithmic,q=h.names,y=n.pos,l=k(n.options&&n.options.labels,m.labels);var w=h.tickPositions;const g=y===w[0],b=y===w[w.length-1],c=(!l.step||1===l.step)&&1===h.tickInterval;w=w.info;let f=n.label,x,J,z;v=this.parameters.category||(v?k(v[y],q[y],y):y);e&&d(v)&&(v=G(e.lin2log(v)));h.dateTime&&(w?(J=p.time.resolveDTLFormat(m.dateTimeLabelFormats[!m.grid&&w.higherRanks[y]||w.unitName]),x=J.main):d(v)&&(x=h.dateTime.getXDateFormat(v,m.dateTimeLabelFormats||{}))); +n.isFirst=g;n.isLast=b;const Q={axis:h,chart:p,dateTimeLabelFormat:x,isFirst:g,isLast:b,pos:y,tick:n,tickPositionInfo:w,value:v};r(this,"labelFormat",Q);const S=b=>l.formatter?l.formatter.call(b,b):l.format?(b.text=h.defaultLabelFormatter.call(b,b),a.format(l.format,b,p)):h.defaultLabelFormatter.call(b,b);m=S.call(Q,Q);const R=J&&J.list;n.shortenLabel=R?function(){for(z=0;zl&&n-w*ge&&(J=Math.round((m-n)/Math.cos(l*u)));else if(m=n+(1-w)*g,n-w*ge&&(f=e-a.x+f*w,x=-1),f=Math.min(b,f),ff||h.autoRotation&&(y.styles||{}).width)J=f;J&&(this.shortenLabel?this.shortenLabel():(c.width=Math.floor(J)+"px",(d.style||{}).textOverflow||(c.textOverflow="ellipsis"),y.css(c)))}moveLabel(a, +h){const d=this;var k=d.label;const n=d.axis;let e=!1;k&&k.textStr===a?(d.movedLabel=k,e=!0,delete d.label):m(n.ticks,function(q){e||q.isNew||q===d||!q.label||q.label.textStr!==a||(d.movedLabel=q.label,e=!0,q.labelPos=d.movedLabel.xy,delete q.label)});e||!d.labelPos&&!k||(k=d.labelPos||k.xy,d.movedLabel=d.createLabel(k,a,h),d.movedLabel&&d.movedLabel.attr({opacity:0}))}render(a,h,d){var n=this.axis,m=n.horiz,e=this.pos,q=k(this.tickmarkOffset,n.tickmarkOffset);e=this.getPosition(m,e,q,h);q=e.x;const y= +e.y;n=m&&q===n.pos+n.len||!m&&y===n.pos?-1:1;m=k(d,this.label&&this.label.newOpacity,1);d=k(d,1);this.isActive=!0;this.renderGridLine(h,d,n);this.renderMark(e,d,n);this.renderLabel(e,h,m,a);this.isNew=!1;r(this,"afterRender")}renderGridLine(a,d,m){const h=this.axis,n=h.options,e={},q=this.pos,y=this.type,l=k(this.tickmarkOffset,h.tickmarkOffset),w=h.chart.renderer;let g=this.gridLine,b=n.gridLineWidth,c=n.gridLineColor,f=n.gridLineDashStyle;"minor"===this.type&&(b=n.minorGridLineWidth,c=n.minorGridLineColor, +f=n.minorGridLineDashStyle);g||(h.chart.styledMode||(e.stroke=c,e["stroke-width"]=b||0,e.dashstyle=f),y||(e.zIndex=1),a&&(d=0),this.gridLine=g=w.path().attr(e).addClass("highcharts-"+(y?y+"-":"")+"grid-line").add(h.gridGroup));if(g&&(m=h.getPlotLinePath({value:q+l,lineWidth:g.strokeWidth()*m,force:"pass",old:a,acrossPanes:!1})))g[a||this.isNew?"attr":"animate"]({d:m,opacity:d})}renderMark(a,d,m){const h=this.axis;var n=h.options;const e=h.chart.renderer,q=this.type,y=h.tickSize(q?q+"Tick":"tick"), +l=a.x;a=a.y;const w=k(n["minor"!==q?"tickWidth":"minorTickWidth"],!q&&h.isXAxis?1:0);n=n["minor"!==q?"tickColor":"minorTickColor"];let g=this.mark;const b=!g;y&&(h.opposite&&(y[0]=-y[0]),g||(this.mark=g=e.path().addClass("highcharts-"+(q?q+"-":"")+"tick").add(h.axisGroup),h.chart.styledMode||g.attr({stroke:n,"stroke-width":w})),g[b?"attr":"animate"]({d:this.getMarkPath(l,a,y[0],g.strokeWidth()*m,h.horiz,e),opacity:d}))}renderLabel(a,h,m,p){var n=this.axis;const e=n.horiz,q=n.options,y=this.label, +l=q.labels,w=l.step;n=k(this.tickmarkOffset,n.tickmarkOffset);const g=a.x;a=a.y;let b=!0;y&&d(g)&&(y.xy=a=this.getLabelPosition(g,a,y,e,l,n,p,w),this.isFirst&&!this.isLast&&!q.showFirstLabel||this.isLast&&!this.isFirst&&!q.showLastLabel?b=!1:!e||l.step||l.rotation||h||0===m||this.handleOverflow(a),w&&p%w&&(b=!1),b&&d(a.y)?(a.opacity=m,y[this.isNewLabel?"attr":"animate"](a).show(!0),this.isNewLabel=!1):(y.hide(),this.isNewLabel=!0))}replaceMovedLabel(){const a=this.label,h=this.axis;a&&!this.isNew&& +(a.animate({opacity:0},void 0,a.destroy),delete this.label);h.isDirty=!0;this.label=this.movedLabel;delete this.movedLabel}}"";return v});M(a,"Core/Axis/Axis.js",[a["Core/Animation/AnimationUtilities.js"],a["Core/Axis/AxisDefaults.js"],a["Core/Color/Color.js"],a["Core/Defaults.js"],a["Core/Foundation.js"],a["Core/Globals.js"],a["Core/Axis/Tick.js"],a["Core/Utilities.js"]],function(a,A,H,I,F,G,C,B){const {animObject:t}=a,{defaultOptions:r}=I,{registerEventOptions:d}=F,{deg2rad:p}=G,{arrayMax:m,arrayMin:k, +clamp:v,correctFloat:n,defined:h,destroyObjectProperties:D,erase:u,error:E,extend:e,fireEvent:q,isArray:y,isNumber:l,isString:w,merge:g,normalizeTickInterval:b,objectEach:c,pick:f,relativeLength:x,removeEvent:J,splat:z,syncTimeout:Q}=B,S=(c,g)=>b(g,void 0,void 0,f(c.options.allowDecimals,.5>g||void 0!==c.tickAmount),!!c.tickAmount);class R{constructor(b,c){this.zoomEnabled=this.width=this.visible=this.userOptions=this.translationSlope=this.transB=this.transA=this.top=this.ticks=this.tickRotCorr=this.tickPositions= +this.tickmarkOffset=this.tickInterval=this.tickAmount=this.side=this.series=this.right=this.positiveValuesOnly=this.pos=this.pointRangePadding=this.pointRange=this.plotLinesAndBandsGroups=this.plotLinesAndBands=this.paddedTicks=this.overlap=this.options=this.offset=this.names=this.minPixelPadding=this.minorTicks=this.minorTickInterval=this.min=this.maxLabelLength=this.max=this.len=this.left=this.labelFormatter=this.labelEdge=this.isLinked=this.height=this.hasVisibleSeries=this.hasNames=this.eventOptions= +this.coll=this.closestPointRange=this.chart=this.bottom=this.alternateBands=void 0;this.init(b,c)}init(b,c){const g=c.isX;this.chart=b;this.horiz=b.inverted&&!this.isZAxis?!g:g;this.isXAxis=g;this.coll=this.coll||(g?"xAxis":"yAxis");q(this,"init",{userOptions:c});this.opposite=f(c.opposite,this.opposite);this.side=f(c.side,this.side,this.horiz?this.opposite?0:2:this.opposite?1:3);this.setOptions(c);const a=this.options,e=a.labels,N=a.type;this.userOptions=c;this.minPixelPadding=0;this.reversed=f(a.reversed, +this.reversed);this.visible=a.visible;this.zoomEnabled=a.zoomEnabled;this.hasNames="category"===N||!0===a.categories;this.categories=a.categories||(this.hasNames?[]:void 0);this.names||(this.names=[],this.names.keys={});this.plotLinesAndBandsGroups={};this.positiveValuesOnly=!!this.logarithmic;this.isLinked=h(a.linkedTo);this.ticks={};this.labelEdge=[];this.minorTicks={};this.plotLinesAndBands=[];this.alternateBands={};this.len=0;this.minRange=this.userMinRange=a.minRange||a.maxZoom;this.range=a.range; +this.offset=a.offset||0;this.min=this.max=null;c=f(a.crosshair,z(b.options.tooltip.crosshairs)[g?0:1]);this.crosshair=!0===c?{}:c;-1===b.axes.indexOf(this)&&(g?b.axes.splice(b.xAxis.length,0,this):b.axes.push(this),b[this.coll].push(this));this.series=this.series||[];b.inverted&&!this.isZAxis&&g&&"undefined"===typeof this.reversed&&(this.reversed=!0);this.labelRotation=l(e.rotation)?e.rotation:void 0;d(this,a);q(this,"afterInit")}setOptions(b){this.options=g(A.defaultXAxisOptions,"yAxis"===this.coll&& +A.defaultYAxisOptions,[A.defaultTopAxisOptions,A.defaultRightAxisOptions,A.defaultBottomAxisOptions,A.defaultLeftAxisOptions][this.side],g(r[this.coll],b));q(this,"afterSetOptions",{userOptions:b})}defaultLabelFormatter(b){var c=this.axis;({numberFormatter:b}=this.chart);const f=l(this.value)?this.value:NaN,g=c.chart.time,a=this.dateTimeLabelFormat;var e=r.lang;const N=e.numericSymbols;e=e.numericSymbolMagnitude||1E3;const q=c.logarithmic?Math.abs(f):c.tickInterval;let x=N&&N.length,h;if(c.categories)h= +`${this.value}`;else if(a)h=g.dateFormat(a,f);else if(x&&1E3<=q)for(;x--&&"undefined"===typeof h;)c=Math.pow(e,x+1),q>=c&&0===10*f%c&&null!==N[x]&&0!==f&&(h=b(f/c,-1)+N[x]);"undefined"===typeof h&&(h=1E4<=Math.abs(f)?b(f,-1):b(f,-1,void 0,""));return h}getSeriesExtremes(){const b=this,c=b.chart;let g;q(this,"getSeriesExtremes",null,function(){b.hasVisibleSeries=!1;b.dataMin=b.dataMax=b.threshold=null;b.softThreshold=!b.isXAxis;b.series.forEach(function(a){if(a.visible||!c.options.chart.ignoreHiddenSeries){var e= +a.options;let c=e.threshold,q,x;b.hasVisibleSeries=!0;b.positiveValuesOnly&&0>=c&&(c=null);if(b.isXAxis)(e=a.xData)&&e.length&&(e=b.logarithmic?e.filter(b=>0f)&&(m?b=v(b,c,f):D=!0);return b}const g=this,a=g.chart,e=g.left,x=g.top,h=b.old,N=b.value,d=b.lineWidth,w=h&&a.oldChartHeight||a.chartHeight,k=h&&a.oldChartWidth||a.chartWidth,n=g.transB;let z=b.translatedValue, +m=b.force,J,y,p,r,D;b={value:N,lineWidth:d,old:h,force:m,acrossPanes:b.acrossPanes,translatedValue:z};q(this,"getPlotLinePath",b,function(b){z=f(z,g.translate(N,void 0,void 0,h));z=v(z,-1E5,1E5);J=p=Math.round(z+n);y=r=Math.round(w-z-n);l(z)?g.horiz?(y=x,r=w-g.bottom,J=p=c(J,e,e+g.width)):(J=e,p=k-g.right,y=r=c(y,x,x+g.height)):(D=!0,m=!1);b.path=D&&!m?null:a.renderer.crispLine([["M",J,y],["L",p,r]],d||1)});return b.path}getLinearTickPositions(b,c,f){const g=n(Math.floor(c/b)*b);f=n(Math.ceil(f/b)* +b);const a=[];let l,e;n(g+b)===g&&(e=20);if(this.single)return[c];for(c=g;c<=f;){a.push(c);c=n(c+b,e);if(c===l)break;l=c}return a}getMinorTickInterval(){const b=this.options;return!0===b.minorTicks?f(b.minorTickInterval,"auto"):!1===b.minorTicks?null:b.minorTickInterval}getMinorTickPositions(){var b=this.options;const c=this.tickPositions,f=this.minorTickInterval;var g=this.pointRangePadding||0;const a=this.min-g;g=this.max+g;const l=g-a;let e=[];if(l&&l/f=this.minRange;z=this.minRange;var n=(z-a+g)/2;n=[g-n,f(b.min,g-n)];l&&(n[2]=this.logarithmic?this.logarithmic.log2lin(this.dataMin):this.dataMin);g=m(n);a=[g+z,f(b.max,g+z)];l&&(a[2]=c?c.log2lin(this.dataMax):this.dataMax);a=k(a); +a-g=N?(r=N,m=0):this.dataMax<=N&&(y=N,k=0)),this.min=f(p,r,this.dataMin),this.max=f(v,y,this.dataMax);g&&(this.positiveValuesOnly&&!b&&0>=Math.min(this.min,f(this.dataMin,this.min))&&E(10,1,c),this.min=n(g.log2lin(this.min),16),this.max=n(g.log2lin(this.max),16));this.range&&h(this.max)&&(this.userMin=this.min=p=Math.max(this.dataMin,this.minFromRange()),this.userMax=v=this.max,this.range=null);q(this,"foundExtremes");this.beforePadding&&this.beforePadding();this.adjustForMinRange();!(w|| +this.axisPointRange||this.stacking&&this.stacking.usePercentage||x)&&h(this.min)&&h(this.max)&&(c=this.max-this.min)&&(!h(p)&&m&&(this.min-=c*m),!h(v)&&k&&(this.max+=c*k));l(this.userMin)||(l(a.softMin)&&a.softMinthis.max&&(this.max=v=a.softMax),l(a.ceiling)&&(this.max=Math.min(this.max,a.ceiling)));z&&h(this.dataMin)&&(N=N||0,!h(p)&&this.min=N?this.min=this.options.minRange? +Math.min(N,this.max-this.minRange):N:!h(v)&&this.max>N&&this.dataMax<=N&&(this.max=this.options.minRange?Math.max(N,this.min+this.minRange):N));l(this.min)&&l(this.max)&&!this.chart.polar&&this.min>this.max&&(h(this.options.min)?this.max=this.min:h(this.options.max)&&(this.min=this.max));this.tickInterval=this.min===this.max||"undefined"===typeof this.min||"undefined"===typeof this.max?1:x&&this.linkedParent&&!J&&d===this.linkedParent.options.tickPixelInterval?J=this.linkedParent.tickInterval:f(J, +this.tickAmount?(this.max-this.min)/Math.max(this.tickAmount-1,1):void 0,w?1:(this.max-this.min)*d/Math.max(this.len,d));if(e&&!b){const b=this.min!==(this.old&&this.old.min)||this.max!==(this.old&&this.old.max);this.series.forEach(function(c){c.forceCrop=c.forceCropping&&c.forceCropping();c.processData(b)});q(this,"postProcessData",{hasExtremesChanged:b})}this.setAxisTranslation();q(this,"initialAxisTranslation");this.pointRange&&!J&&(this.tickInterval=Math.max(this.pointRange,this.tickInterval)); +b=f(a.minTickInterval,this.dateTime&&!this.series.some(b=>b.noSharedTooltip)?this.closestPointRange:0);!J&&this.tickIntervalMath.max(2*this.len,200)))if(this.dateTime)e= +this.getTimeTicks(this.dateTime.normalizeTimeTickInterval(this.tickInterval,b.units),this.min,this.max,b.startOfWeek,this.ordinal&&this.ordinal.positions,this.closestPointRange,!0);else if(this.logarithmic)e=this.logarithmic.getLogTickPositions(this.tickInterval,this.min,this.max);else for(g=b=this.tickInterval;g<=2*b;)if(e=this.getLinearTickPositions(this.tickInterval,this.min,this.max),this.tickAmount&&e.length>this.tickAmount)this.tickInterval=S(this,g*=1.1);else break;else e=[this.min,this.max], +E(19,!1,this.chart);e.length>this.len&&(e=[e[0],e[e.length-1]],e[0]===e[1]&&(e.length=1));f&&(this.tickPositions=e,(d=f.apply(this,[this.min,this.max]))&&(e=d))}this.tickPositions=e;this.paddedTicks=e.slice(0);this.trimTicks(e,x,a);!this.isLinked&&l(this.min)&&l(this.max)&&(this.single&&2>e.length&&!this.categories&&!this.series.some(b=>b.is("heatmap")&&"between"===b.options.pointPlacement)&&(this.min-=.5,this.max+=.5),c||d||this.adjustTickAmount());q(this,"afterSetTickPositions")}trimTicks(b,c,f){const g= +b[0],a=b[b.length-1],l=!this.isOrdinal&&this.minPointOffset||0;q(this,"trimTicks");if(!this.isLinked){if(c&&-Infinity!==g)this.min=g;else for(;this.min-l>b[0];)b.shift();if(f)this.max=a;else for(;this.max+l{const {horiz:c,options:f}=b;return[c?f.left:f.top,f.width,f.height,f.pane].join()},g=f(this);this.chart[this.coll].forEach(function(a){const {series:l}=a;l.length&&l.some(b=>b.visible)&&a!==b&&f(a)===g&&(e=!0,c.push(a))})}if(e&&g){c.forEach(c=>{c=c.getThresholdAlignment(b);l(c)&&a.push(c)});const f=1b+c,0)/a.length:void 0;c.forEach(b=>{b.thresholdAlignment=f})}return e}getThresholdAlignment(b){(!l(this.dataMin)|| +this!==b&&this.series.some(b=>b.isDirty||b.isDirtyData))&&this.getSeriesExtremes();if(l(this.threshold))return b=v((this.threshold-(this.dataMin||0))/((this.dataMax||0)-(this.dataMin||0)),0,1),this.options.reversed&&(b=1-b),b}getTickAmount(){const b=this.options,c=b.tickPixelInterval;let f=b.tickAmount;!h(b.tickInterval)&&!f&&this.lenf&&(this.finalTickAmt=f,f=5);this.tickAmount= +f}adjustTickAmount(){const b=this,{finalTickAmt:c,max:g,min:a,options:e,tickPositions:q,tickAmount:x,thresholdAlignment:d}=b,w=q&&q.length;var z=f(b.threshold,b.softThreshold?0:null);var k=b.tickInterval;let m;l(d)&&(m=.5>d?Math.ceil(d*(x-1)):Math.floor(d*(x-1)),e.reversed&&(m=x-1-m));if(b.hasData()&&l(a)&&l(g)){const f=()=>{b.transA*=(w-1)/(x-1);b.min=e.startOnTick?q[0]:Math.min(a,q[0]);b.max=e.endOnTick?q[q.length-1]:Math.max(g,q[q.length-1])};if(l(m)&&l(b.threshold)){for(;q[m]!==z||q.length!== +x||q[0]>a||q[q.length-1]b.threshold?q.unshift(n(q[0]-k)):q.push(n(q[q.length-1]+k));if(k>8*b.tickInterval)break;k*=2}f()}else if(w=c&&0d&&(c=d)),h(l)&&(fd&&(f=d))),g.displayBtn="undefined"!==typeof c||"undefined"!==typeof f,g.setExtremes(c,f,!1,void 0,{trigger:"zoom"});b.zoomed=!0});return b.zoomed}setAxisSize(){const b=this.chart;var c=this.options;const g=c.offsets||[0,0,0,0],a=this.horiz,l=this.width=Math.round(x(f(c.width,b.plotWidth-g[3]+g[1]),b.plotWidth)),e=this.height=Math.round(x(f(c.height,b.plotHeight-g[0]+g[2]),b.plotHeight)), +q=this.top=Math.round(x(f(c.top,b.plotTop+g[0]),b.plotHeight,b.plotTop));c=this.left=Math.round(x(f(c.left,b.plotLeft+g[3]),b.plotWidth,b.plotLeft));this.bottom=b.chartHeight-e-q;this.right=b.chartWidth-l-c;this.len=Math.max(a?l:e,0);this.pos=a?c:q}getExtremes(){const b=this.logarithmic;return{min:b?n(b.lin2log(this.min)):this.min,max:b?n(b.lin2log(this.max)):this.max,dataMin:this.dataMin,dataMax:this.dataMax,userMin:this.userMin,userMax:this.userMax}}getThreshold(b){var c=this.logarithmic;const f= +c?c.lin2log(this.min):this.min;c=c?c.lin2log(this.max):this.max;null===b||-Infinity===b?b=f:Infinity===b?b=c:f>b?b=f:cc?b.align="right":195c&&(b.align="left")});return b.align}tickSize(b){const c=this.options,g=f(c["tick"===b?"tickWidth":"minorTickWidth"],"tick"===b&&this.isXAxis&&!this.categories?1:0);let a=c["tick"===b?"tickLength": +"minorTickLength"],l;g&&a&&("inside"===c[b+"Position"]&&(a=-a),l=[a,g]);b={tickSize:l};q(this,"afterTickSize",b);return b.tickSize}labelMetrics(){const b=this.chart.renderer;var c=this.ticks;c=c[Object.keys(c)[0]]||{};return this.chart.renderer.fontMetrics(c.label||c.movedLabel||b.box)}unsquish(){const b=this.options.labels;var c=this.horiz;const g=this.tickInterval,a=this.len/(((this.categories?1:0)+this.max-this.min)/g),e=b.rotation,q=.75*this.labelMetrics().h,x=Math.max(this.max-this.min,0),d= +function(b){let c=b/(a||1);c=1x&&Infinity!==b&&Infinity!==a&&x&&(c=Math.ceil(x/g));return n(c*g)};let h=g,w,k=Number.MAX_VALUE,z;if(c){if(b.staggerLines||(l(e)?z=[e]:a=f)c=d(Math.abs(q/Math.sin(p*f))),b=c+Math.abs(f/360),bg.step)return g.rotation?0:(this.staggerLines||1)*this.len/a;if(!f){b=g.style.width;if(void 0!==b)return parseInt(String(b),10);if(e)return e-c.spacing[3]}return.33*c.chartWidth}renderUnsquish(){const b=this.chart,c=b.renderer,f=this.tickPositions,g=this.ticks,a=this.options.labels,l=a.style,e=this.horiz,q=this.getSlotWidth();var x=Math.max(1,Math.round(q-2*a.padding));const d= +{},h=this.labelMetrics(),z=l.textOverflow;let k,m,n=0;w(a.rotation)||(d.rotation=a.rotation||0);f.forEach(function(b){b=g[b];b.movedLabel&&b.replaceMovedLabel();b&&b.label&&b.label.textPxLength>n&&(n=b.label.textPxLength)});this.maxLabelLength=n;if(this.autoRotation)n>x&&n>h.h?d.rotation=this.labelRotation:this.labelRotation=0;else if(q&&(k=x,!z))for(m="clip",x=f.length;!e&&x--;){var J=f[x];if(J=g[J].label)J.styles&&"ellipsis"===J.styles.textOverflow?J.css({textOverflow:"clip"}):J.textPxLength>q&& +J.css({width:q+"px"}),J.getBBox().height>this.len/f.length-(h.h-h.f)&&(J.specificTextOverflow="ellipsis")}d.rotation&&(k=n>.5*b.chartHeight?.33*b.chartHeight:n,z||(m="ellipsis"));if(this.labelAlign=a.align||this.autoLabelAlign(this.labelRotation))d.align=this.labelAlign;f.forEach(function(b){const c=(b=g[b])&&b.label,f=l.width,a={};c&&(c.attr(d),b.shortenLabel?b.shortenLabel():k&&!f&&"nowrap"!==l.whiteSpace&&(kn.g(b).attr({zIndex:f}).addClass(`highcharts-${z.toLowerCase()}${c} `+(this.isRadial? +`highcharts-radial-axis${c} `:"")+(t||"")).add(k);b.gridGroup=c("grid","-grid",e.gridZIndex);b.axisGroup=c("axis","",e.zIndex);b.labelGroup=c("axis-labels","-labels",p.zIndex)}J||b.isLinked?(w.forEach(function(c){b.generateTick(c)}),b.renderUnsquish(),b.reserveSpaceDefault=0===x||2===x||{1:"left",3:"right"}[x]===b.labelAlign,f(p.reserveSpace,v?!1:null,"center"===b.labelAlign?!0:null,b.reserveSpaceDefault)&&w.forEach(function(b){L=Math.max(d[b].getLabelSize(),L)}),b.staggerLines&&(L*=b.staggerLines), +b.labelOffset=L*(b.opposite?-1:1)):c(d,function(b,c){b.destroy();delete d[c]});y&&y.text&&!1!==y.enabled&&(b.addTitle(S),S&&!v&&!1!==y.reserveSpace&&(b.titleOffset=R=b.axisTitle.getBBox()[a?"height":"width"],E=y.offset,u=h(E)?0:f(y.margin,a?5:10)));b.renderLine();b.offset=Q*f(e.offset,r[x]?r[x]+(e.margin||0):0);b.tickRotCorr=b.tickRotCorr||{x:0,y:0};J=0===x?-b.labelMetrics().h:2===x?b.tickRotCorr.y:0;u=Math.abs(L)+u;L&&(u=u-J+Q*(a?f(p.y,b.tickRotCorr.y+Q*p.distance):f(p.x,Q*p.distance)));b.axisTitleMargin= +f(E,u);b.getMaxLabelDimensions&&(b.maxLabelDimensions=b.getMaxLabelDimensions(d,w));"colorAxis"!==z&&(p=this.tickSize("tick"),r[x]=Math.max(r[x],(b.axisTitleMargin||0)+R+Q*b.offset,u,w&&w.length&&p?p[0]+Q*b.offset:0),r=!b.axisLine||e.offset?0:2*Math.floor(b.axisLine.strokeWidth()/2),D[m]=Math.max(D[m],r));q(this,"afterGetOffset")}getLinePath(b){const c=this.chart,f=this.opposite;var g=this.offset;const a=this.horiz,l=this.left+(f?this.width:0)+g;g=c.chartHeight-this.bottom-(f?this.height:0)+g;f&& +(b*=-1);return c.renderer.crispLine([["M",a?this.left:l,a?g:this.top],["L",a?c.chartWidth-this.right:l,a?g:c.chartHeight-this.bottom]],b)}renderLine(){this.axisLine||(this.axisLine=this.chart.renderer.path().addClass("highcharts-axis-line").add(this.axisGroup),this.chart.styledMode||this.axisLine.attr({stroke:this.options.lineColor,"stroke-width":this.options.lineWidth,zIndex:7}))}getTitlePosition(b){var c=this.horiz,f=this.left;const g=this.top;var a=this.len;const l=this.options.title,e=c?f:g,x= +this.opposite,d=this.offset,h=l.x,w=l.y,z=this.chart.renderer.fontMetrics(b);b=b?Math.max(b.getBBox(!1,0).height-z.h-1,0):0;a={low:e+(c?0:a),middle:e+a/2,high:e+(c?a:0)}[l.align];f=(c?g+this.height:f)+(c?1:-1)*(x?-1:1)*(this.axisTitleMargin||0)+[-b,b,z.f,-b][this.side];c={x:c?a+h:f+(x?this.width:0)+d+h,y:c?f+w-(x?this.height:0)+d:a+w};q(this,"afterGetTitlePosition",{titlePosition:c});return c}renderMinorTick(b,c){const f=this.minorTicks;f[b]||(f[b]=new C(this,b,"minor"));c&&f[b].isNew&&f[b].render(null, +!0);f[b].render(null,!1,1)}renderTick(b,c,f){const g=this.ticks;if(!this.isLinked||b>=this.min&&b<=this.max||this.grid&&this.grid.isColumn)g[b]||(g[b]=new C(this,b)),f&&g[b].isNew&&g[b].render(c,!0,-1),g[b].render(c)}render(){const b=this,f=b.chart,g=b.logarithmic,a=b.options,e=b.isLinked,x=b.tickPositions,d=b.axisTitle,h=b.ticks,w=b.minorTicks,z=b.alternateBands,k=a.stackLabels,n=a.alternateGridColor,m=a.crossing,J=b.tickmarkOffset,y=b.axisLine,p=b.showAxis,v=t(f.renderer.globalAnimation);let r, +D;b.labelEdge.length=0;b.overlap=!1;[h,w,z].forEach(function(b){c(b,function(b){b.isActive=!1})});if(l(m)){const b=this.isXAxis?f.yAxis[0]:f.xAxis[0],c=[1,-1,-1,1][this.side];b&&(this.offset=c*b.toPixels(m,!0))}if(b.hasData()||e){const c=b.chart.hasRendered&&b.old&&l(b.old.min);b.minorTickInterval&&!b.categories&&b.getMinorTickPositions().forEach(function(f){b.renderMinorTick(f,c)});x.length&&(x.forEach(function(f,g){b.renderTick(f,g,c)}),J&&(0===b.min||b.single)&&(h[-1]||(h[-1]=new C(b,-1,null,!0)), +h[-1].render(-1)));n&&x.forEach(function(c,a){D="undefined"!==typeof x[a+1]?x[a+1]+J:b.max-J;0===a%2&&cp&&(!k||q<=m)&&"undefined"!==typeof q&&r.push(q),q>m&&(y=!0),q=e}else p=this.lin2log(p),m=this.lin2log(m),a=k?d.getMinorTickInterval():h.tickInterval,a=I("auto"===a?null:a,this.minorAutoInterval,h.tickPixelInterval/(k?5:1)*(m-p)/((k?n/d.tickPositions.length: +n)||1)),a=H(a),r=d.getLinearTickPositions(a,p,m).map(this.log2lin),k||(this.minorAutoInterval=a/5);k||(d.tickInterval=a);return r}lin2log(a){return Math.pow(10,a)}log2lin(a){return Math.log(a)/Math.LN10}}A.Additions=r})(F||(F={}));return F});M(a,"Core/Axis/PlotLineOrBand/PlotLineOrBandAxis.js",[a["Core/Utilities.js"]],function(a){const {erase:u,extend:H,isNumber:I}=a;var F;(function(A){function C(a){return this.addPlotBandOrLine(a,"plotBands")}function B(a,d){const h=this.userOptions;let k=new v(this, +a);this.visible&&(k=k.render());if(k){this._addedPlotLB||(this._addedPlotLB=!0,(h.plotLines||[]).concat(h.plotBands||[]).forEach(a=>{this.addPlotBandOrLine(a)}));if(d){const k=h[d]||[];k.push(a);h[d]=k}this.plotLinesAndBands.push(k)}return k}function t(a){return this.addPlotBandOrLine(a,"plotLines")}function r(a,d,k=this.options){const h=this.getPlotLinePath({value:d,force:!0,acrossPanes:k.acrossPanes}),m=[],e=this.horiz;d=!I(this.min)||!I(this.max)||athis.max&&d>this.max; +a=this.getPlotLinePath({value:a,force:!0,acrossPanes:k.acrossPanes});k=1;let q;if(a&&h)for(d&&(q=a.toString()===h.toString(),k=0),d=0;d{const l="x"===f;return[f,l?h:k,l?a:e].concat(q?[l?a*w.scaleX:e*w.scaleY,l?w.left- +c+(g.plotX+b.plotLeft)*w.scaleX:w.top-c+(g.plotY+b.plotTop)*w.scaleY,0,l?h:k]:[l?a:e,l?g.plotX+b.plotLeft:g.plotY+b.plotTop,l?b.plotLeft:b.plotTop,l?b.plotLeft+b.plotWidth:b.plotTop+b.plotHeight])};let m=d("y"),n=d("x"),y;d=!!g.negative;!b.polar&&b.hoverSeries&&b.hoverSeries.yAxis&&b.hoverSeries.yAxis.reversed&&(d=!d);const p=!this.followPointer&&E(g.ttBelow,!b.inverted===d),r=function(b,a,g,e,d,x,h){const k=q?"y"===b?c*w.scaleY:c*w.scaleX:c,z=(g-e)/2,m=eJ-l?J:J-l);else if(n)f[b]=Math.max(x,d+l+g>a?d:d+l);else return!1},K=function(b,a,g,e,l){let d;la-c?d=!1:f[b]=la-e/2?a-e-2:l-g/2;return d},v=function(b){const c=m;m=n;n=c;y=b},P=function(){!1!==r.apply(0,m)?!1!==K.apply(0,n)||y||(v(!0),P()):y?f.x=f.y=0:(v(!0),P())};(b.inverted||1c.isDirectTouch||b.series.shouldShowTooltip(e,q)))d=this.getLabel(),b.style.width&&!w||d.css({width:(this.outside?this.getPlayingField():g.spacingBox).width+"px"}),d.attr({text:h&&h.join?h.join(""):h}),d.addClass(this.getClassName(l),!0),w||d.attr({stroke:b.borderColor||l.color||k.color||"#666666"}),this.updatePosition({plotX:y,plotY:p,negative:l.negative,ttBelow:l.ttBelow, +h:a[2]||0});else{this.hide();return}}this.isHidden&&this.label&&this.label.attr({opacity:1}).show();this.isHidden=!1}v(this,"refresh")}}renderSplit(a,e){function g(c,a,f,g,e=!0){f?(a=X?0:H,c=d(c-g/2,P.left,P.right-g-(b.outside?U:0))):(a-=F,c=e?c-g-u:c+u,c=d(c,e?c:P.left,P.right));return{x:c,y:a}}const b=this,{chart:c,chart:{chartWidth:f,chartHeight:l,plotHeight:q,plotLeft:h,plotTop:m,pointer:w,scrollablePixelsY:n=0,scrollablePixelsX:y,scrollingContainer:{scrollLeft:p,scrollTop:r}={scrollLeft:0,scrollTop:0}, +styledMode:v},distance:u,options:K,options:{positioner:Y}}=b,P=b.outside&&"number"!==typeof y?C.documentElement.getBoundingClientRect():{left:p,right:p+f,top:r,bottom:r+l},L=b.getLabel(),T=this.renderer||c.renderer,X=!(!c.xAxis[0]||!c.xAxis[0].opposite),{left:U,top:A}=w.getChartPosition();let F=m+r,G=0,H=q-n;D(a)&&(a=[!1,a]);a=a.slice(0,e.length+1).reduce(function(c,a,f){if(!1!==a&&""!==a){f=e[f-1]||{isHeader:!0,plotX:e[0].plotX,plotY:q,series:{}};const n=f.isHeader;var l=n?b:f.series,x;{var k=f; +a=a.toString();var w=l.tt;const {isHeader:c,series:g}=k;w||(w={padding:K.padding,r:K.borderRadius},v||(w.fill=K.backgroundColor,w["stroke-width"]=null!==(x=K.borderWidth)&&void 0!==x?x:1),w=T.label("",0,0,K[c?"headerShape":"shape"],void 0,void 0,K.useHTML).addClass(b.getClassName(k,!0,c)).attr(w).add(L));w.isActive=!0;w.attr({text:a});v||w.css(K.style).attr({stroke:K.borderColor||k.color||g.color||"#333333"});x=w}x=l.tt=x;k=x.getBBox();l=k.width+x.strokeWidth();n&&(G=k.height,H+=G,X&&(F-=G));{const {isHeader:b, +plotX:c=0,plotY:g=0,series:e}=f;if(b){a=h+c;var z=m+q/2}else{const {xAxis:b,yAxis:f}=e;a=b.pos+d(c,-u,b.len+u);e.shouldShowTooltip(0,f.pos-m+g,{ignoreX:!0})&&(z=f.pos+g)}a=d(a,P.left-u,P.right+u);z={anchorX:a,anchorY:z}}const {anchorX:J,anchorY:y}=z;"number"===typeof y?(z=k.height+1,k=Y?Y.call(b,l,z,f):g(J,y,n,l),c.push({align:Y?0:void 0,anchorX:J,anchorY:y,boxWidth:l,point:f,rank:E(k.rank,n?1:0),size:z,target:k.y,tt:x,x:k.x})):x.isActive=!1}return c},[]);!Y&&a.some(c=>{var {outside:a}=b;a=(a?U:0)+ +c.anchorX;return aa})&&(a=a.map(b=>{const {x:c,y:a}=g(b.anchorX,b.anchorY,b.point.isHeader,b.boxWidth,!1);return k(b,{target:a,x:c})}));b.cleanSplit();t(a,H);var I=U,ha=U;a.forEach(function(c){const {x:a,boxWidth:f,isHeader:g}=c;g||(b.outside&&U+aha&&(ha=U+a))});a.forEach(function(c){const {x:a,anchorX:f,anchorY:g,pos:e,point:{isHeader:l}}=c,d={visibility:"undefined"===typeof e?"hidden":"inherit",x:a, +y:(e||0)+F,anchorX:f,anchorY:g};if(b.outside&&ag[0]?Math.max(Math.abs(g[0]),c.width-g[0]):Math.max(Math.abs(g[0]),c.width);b.height=0>g[1]?Math.max(Math.abs(g[1]),c.height-Math.abs(g[1])):Math.max(Math.abs(g[1]),c.height);this.tracker?this.tracker.attr(b):(this.tracker=e.renderer.rect(b).addClass("highcharts-tracker").add(e),a.styledMode||this.tracker.attr({fill:"rgba(0,0,0,0)"}))}}else this.tracker&& +(this.tracker=this.tracker.destroy())}styledModeFormat(a){return a.replace('style="font-size: 0.8em"','class="highcharts-header"').replace(/style="color:{(point|series)\.color}"/g,'class="highcharts-color-{$1.colorIndex} {series.options.className} {point.options.className}"')}tooltipFooterHeaderFormatter(a,e){const g=a.series,b=g.tooltipOptions;var c=g.xAxis;const f=c&&c.dateTime;c={isFooter:e,labelConfig:a};let l=b.xDateFormat,d=b[e?"footerFormat":"headerFormat"];v(this,"headerFormatter",c,function(c){f&& +!l&&h(a.key)&&(l=f.getXDateFormat(a.key,b.dateTimeLabelFormats));f&&l&&(a.point&&a.point.tooltipDateKeys||["key"]).forEach(function(b){d=d.replace("{point."+b+"}","{point."+b+":"+l+"}")});g.chart.styledMode&&(d=this.styledModeFormat(d));c.text=u(d,{point:a,series:g},this.chart)});return c.text}update(a){this.destroy();L(!0,this.chart.options.tooltip.userOptions,a);this.init(this.chart,L(!0,this.options,a))}updatePosition(a){const {chart:e,distance:g,options:b}=this;var c=e.pointer;const f=this.getLabel(), +{left:l,top:d,scaleX:q,scaleY:h}=c.getChartPosition();c=(b.positioner||this.getPosition).call(this,f.width,f.height,a);let k=(a.plotX||0)+e.plotLeft;a=(a.plotY||0)+e.plotTop;let m;if(this.outside){b.positioner&&(c.x+=l-g,c.y+=d-g);m=(b.borderWidth||0)+2*g;this.renderer.setSize(f.width+m,f.height+m,!1);if(1!==q||1!==h)p(this.container,{transform:`scale(${q}, ${h})`}),k*=q,a*=h;k+=l-c.x;a+=d-c.y}this.move(Math.round(c.x),Math.round(c.y||0),k,a)}}(function(a){const e=[];a.compose=function(g){F.pushUnique(e, +g)&&r(g,"afterInit",function(){const b=this.chart;b.options.tooltip&&(b.tooltip=new a(b,b.options.tooltip))})}})(y||(y={}));"";return y});M(a,"Core/Series/Point.js",[a["Core/Renderer/HTML/AST.js"],a["Core/Animation/AnimationUtilities.js"],a["Core/Defaults.js"],a["Core/FormatUtilities.js"],a["Core/Utilities.js"]],function(a,A,H,I,F){const {animObject:u}=A,{defaultOptions:C}=H,{format:B}=I,{addEvent:t,defined:r,erase:d,extend:p,fireEvent:m,getNestedProperty:k,isArray:v,isFunction:n,isNumber:h,isObject:D, +merge:L,objectEach:E,pick:e,syncTimeout:q,removeEvent:y,uniqueKey:l}=F;class w{constructor(){this.category=void 0;this.destroyed=!1;this.formatPrefix="point";this.id=void 0;this.isNull=!1;this.percentage=this.options=this.name=void 0;this.selected=!1;this.total=this.shapeArgs=this.series=void 0;this.visible=!0;this.x=void 0}animateBeforeDestroy(){const a=this,b={x:a.startXPos,opacity:0},c=a.getGraphicalProps();c.singular.forEach(function(c){a[c]=a[c].animate("dataLabel"===c?{x:a[c].startXPos,y:a[c].startYPos, +opacity:0}:b)});c.plural.forEach(function(b){a[b].forEach(function(b){b.element&&b.animate(p({x:a.startXPos},b.startYPos?{x:b.startXPos,y:b.startYPos}:{}))})})}applyOptions(a,b){const c=this.series,f=c.options.pointValKey||c.pointValKey;a=w.prototype.optionsToObject.call(this,a);p(this,a);this.options=this.options?p(this.options,a):a;a.group&&delete this.group;a.dataLabels&&delete this.dataLabels;f&&(this.y=w.prototype.getNestedProperty.call(this,f));this.formatPrefix=(this.isNull=this.isValid&&!this.isValid())? +"null":"point";this.selected&&(this.state="select");"name"in this&&"undefined"===typeof b&&c.xAxis&&c.xAxis.hasNames&&(this.x=c.xAxis.nameToX(this));"undefined"===typeof this.x&&c?this.x="undefined"===typeof b?c.autoIncrement():b:h(a.x)&&c.options.relativeXValue&&(this.x=c.autoIncrement(a.x));return this}destroy(){if(!this.destroyed){const b=this;var a=b.series;const c=a.chart;a=a.options.dataSorting;const f=c.hoverPoints,g=u(b.series.chart.renderer.globalAnimation),e=()=>{if(b.graphic||b.graphics|| +b.dataLabel||b.dataLabels)y(b),b.destroyElements();for(const c in b)delete b[c]};b.legendItem&&c.legend.destroyItem(b);f&&(b.setState(),d(f,b),f.length||(c.hoverPoints=null));if(b===c.hoverPoint)b.onMouseOut();a&&a.enabled?(this.animateBeforeDestroy(),q(e,g.duration)):e();c.pointCount--}this.destroyed=!0}destroyElements(a){const b=this;a=b.getGraphicalProps(a);a.singular.forEach(function(c){b[c]=b[c].destroy()});a.plural.forEach(function(c){b[c].forEach(function(b){b&&b.element&&b.destroy()});delete b[c]})}firePointEvent(a, +b,c){const f=this,g=this.series.options;(g.point.events[a]||f.options&&f.options.events&&f.options.events[a])&&f.importEvents();"click"===a&&g.allowPointSelect&&(c=function(b){f.select&&f.select(null,b.ctrlKey||b.metaKey||b.shiftKey)});m(f,a,b,c)}getClassName(){return"highcharts-point"+(this.selected?" highcharts-point-select":"")+(this.negative?" highcharts-negative":"")+(this.isNull?" highcharts-null-point":"")+("undefined"!==typeof this.colorIndex?" highcharts-color-"+this.colorIndex:"")+(this.options.className? +" "+this.options.className:"")+(this.zone&&this.zone.className?" "+this.zone.className.replace("highcharts-negative",""):"")}getGraphicalProps(a){const b=this,c=[],f={singular:[],plural:[]};let g,e;a=a||{graphic:1,dataLabel:1};a.graphic&&c.push("graphic");a.dataLabel&&c.push("dataLabel","dataLabelPath","dataLabelUpper","connector");for(e=c.length;e--;)g=c[e],b[g]&&f.singular.push(g);["graphic","dataLabel","connector"].forEach(function(c){const g=c+"s";a[c]&&b[g]&&f.plural.push(g)});return f}getLabelConfig(){return{x:this.category, +y:this.y,color:this.color,colorIndex:this.colorIndex,key:this.name||this.category,series:this.series,point:this,percentage:this.percentage,total:this.total||this.stackTotal}}getNestedProperty(a){if(a)return 0===a.indexOf("custom.")?k(a,this.options):this[a]}getZone(){var a=this.series;const b=a.zones;a=a.zoneAxis||"y";let c,f=0;for(c=b[f];this[a]>=c.value;)c=b[++f];this.nonZonedColor||(this.nonZonedColor=this.color);this.color=c&&c.color&&!this.options.color?c.color:this.nonZonedColor;return c}hasNewShapeType(){return(this.graphic&& +(this.graphic.symbolName||this.graphic.element.nodeName))!==this.shapeType}init(a,b,c){this.series=a;this.applyOptions(b,c);this.id=r(this.id)?this.id:l();this.resolveColor();a.chart.pointCount++;m(this,"afterInit");return this}isValid(){return null!==this.x&&h(this.y)}optionsToObject(a){var b=this.series;const c=b.options.keys,f=c||b.pointArrayMap||["y"],g=f.length;let e={},l=0,d=0;if(h(a)||null===a)e[f[0]]=a;else if(v(a))for(!c&&a.length>g&&(b=typeof a[0],"string"===b?e.name=a[0]:"number"===b&& +(e.x=a[0]),l++);da());this.eventsToUnbind=[];A.chartCount||(E.unbindDocumentMouseUp&&(E.unbindDocumentMouseUp=E.unbindDocumentMouseUp()),E.unbindDocumentTouchEnd&&(E.unbindDocumentTouchEnd=E.unbindDocumentTouchEnd()));clearInterval(a.tooltipTimeout);n(a,function(e,d){a[d]= +void 0})}getSelectionMarkerAttrs(a,d){const e={args:{chartX:a,chartY:d},attrs:{},shapeType:"rect"};m(this,"getSelectionMarkerAttrs",e,e=>{const {chart:l,mouseDownX:g=0,mouseDownY:b=0,zoomHor:c,zoomVert:f}=this;e=e.attrs;let q;e.x=l.plotLeft;e.y=l.plotTop;e.width=c?1:l.plotWidth;e.height=f?1:l.plotHeight;c&&(q=a-g,e.width=Math.abs(q),e.x=(0l+g&&(m=l+g),nh+b&&(n=h+b),this.hasDragged=Math.sqrt(Math.pow(c-m,2)+Math.pow(f-n,2)),10{e.result={x:a.attr?+a.attr("x"): +a.x,y:a.attr?+a.attr("y"):a.y,width:a.attr?a.attr("width"):a.width,height:a.attr?a.attr("height"):a.height}});return e.result}drop(a){const e=this,h=this.chart,l=this.hasPinched;if(this.selectionMarker){const {x:q,y:g,width:b,height:c}=this.getSelectionBox(this.selectionMarker),f={originalEvent:a,xAxis:[],yAxis:[],x:q,y:g,width:b,height:c};let x=!!h.mapView;if(this.hasDragged||l)h.axes.forEach(function(d){if(d.zoomEnabled&&r(d.min)&&(l||e[{xAxis:"zoomX",yAxis:"zoomY"}[d.coll]])&&k(q)&&k(g)&&k(b)&& +k(c)){var h=d.horiz;const e="touchend"===a.type?d.minPixelPadding:0,l=d.toValue((h?q:g)+e);h=d.toValue((h?q+b:g+c)-e);f[d.coll].push({axis:d,min:Math.min(l,h),max:Math.max(l,h)});x=!0}}),x&&m(h,"selection",f,function(b){h.zoom(d(b,l?{animation:!1}:null))});k(h.index)&&(this.selectionMarker=this.selectionMarker.destroy());l&&this.scaleGroups()}h&&k(h.index)&&(t(h.container,{cursor:h._cursor}),h.cancelClick=10a.options.findNearestPointBy.indexOf("y");a=a.searchPoint(h,g);if((g=v(a,!0)&&a.series)&&!(g=!v(e,!0))){{g=e.distX-a.distX;const b=e.dist-a.dist,c=(a.series.group&&a.series.group.zIndex)-(e.series.group&&e.series.group.zIndex);g=0!==g&&d?g:0!==b?b:0!==c?c:e.series.index>a.series.index?-1:1}g=0b.stickyTracking&&(e.filter||c)(b));const q=l||!g?a:this.findNearestKDPoint(f, +k,g);d=q&&q.series;q&&(k&&!d.noSharedTooltip?(f=h.filter(function(b){return e.filter?e.filter(b):c(b)&&!b.noSharedTooltip}),f.forEach(function(c){let a=p(c.points,function(b){return b.x===q.x&&!b.isNull});v(a)&&(c.boosted&&c.boost&&(a=c.boost.getPoint(a)),b.push(a))})):b.push(q));e={hoverPoint:q};m(this,"afterGetHoverData",e);return{hoverPoint:e.hoverPoint,hoverSeries:d,hoverPoints:b}}getPointFromEvent(a){a=a.target;let e;for(;a&&!e;)e=a.point,a=a.parentNode;return e}onTrackerMouseOut(a){a=a.relatedTarget; +const e=this.chart.hoverSeries;this.isDirectTouch=!1;if(!(!e||!a||e.stickyTracking||this.inClass(a,"highcharts-tooltip")||this.inClass(a,"highcharts-series-"+e.index)&&this.inClass(a,"highcharts-tracker")))e.onMouseOut()}inClass(a,d){let e;for(;a;){if(e=B(a,"class")){if(-1!==e.indexOf(d))return!0;if(-1!==e.indexOf("highcharts-container"))return!1}a=a.parentElement}}init(a,d){this.options=d;this.chart=a;this.runChartClick=!(!d.chart.events||!d.chart.events.click);this.pinchDown=[];this.lastValidTouch= +{};this.setDOMEvents();m(this,"afterInit")}normalize(a,q){var e=a.touches,l=e?e.length?e.item(0):D(e.changedTouches,a.changedTouches)[0]:a;q||(q=this.getChartPosition());e=l.pageX-q.left;l=l.pageY-q.top;e/=q.scaleX;l/=q.scaleY;return d(a,{chartX:Math.round(e),chartY:Math.round(l)})}onContainerClick(a){const e=this.chart,h=e.hoverPoint;a=this.normalize(a);const l=e.plotLeft,k=e.plotTop;e.cancelClick||(h&&this.inClass(a.target,"highcharts-tracker")?(m(h.series,"click",d(a,{point:h})),e.hoverPoint&& +h.firePointEvent("click",a)):(d(a,this.getCoordinates(a)),e.isInsidePlot(a.chartX-l,a.chartY-k,{visiblePlotOnly:!0})&&m(e,"click",a)))}onContainerMouseDown(a){const e=1===((a.buttons||a.button)&1);a=this.normalize(a);if(A.isFirefox&&0!==a.button)this.onContainerMouseMove(a);if("undefined"===typeof a.button||e)this.zoomOption(a),e&&a.preventDefault&&a.preventDefault(),this.dragStart(a)}onContainerMouseLeave(a){const e=F[D(E.hoverChartIndex,-1)];a=this.normalize(a);e&&a.relatedTarget&&!this.inClass(a.relatedTarget, +"highcharts-tooltip")&&(e.pointer.reset(),e.pointer.chartPosition=void 0)}onContainerMouseEnter(a){delete this.chartPosition}onContainerMouseMove(a){const e=this.chart,d=e.tooltip;a=this.normalize(a);this.setHoverChartIndex();("mousedown"===e.mouseIsDown||this.touchSelect(a))&&this.drag(a);e.openMenu||!this.inClass(a.target,"highcharts-tracker")&&!e.isInsidePlot(a.chartX-e.plotLeft,a.chartY-e.plotTop,{visiblePlotOnly:!0})||d&&d.shouldStickOnContact(a)||(this.inClass(a.target,"highcharts-no-tooltip")? +this.reset(!1,0):this.runPointActions(a))}onDocumentTouchEnd(a){const e=F[D(E.hoverChartIndex,-1)];e&&e.pointer.drop(a)}onContainerTouchMove(a){if(this.touchSelect(a))this.onContainerMouseMove(a);else this.touch(a)}onContainerTouchStart(a){if(this.touchSelect(a))this.onContainerMouseDown(a);else this.zoomOption(a),this.touch(a,!0)}onDocumentMouseMove(a){const e=this.chart,d=e.tooltip,l=this.chartPosition;a=this.normalize(a,l);!l||e.isInsidePlot(a.chartX-e.plotLeft,a.chartY-e.plotTop,{visiblePlotOnly:!0})|| +d&&d.shouldStickOnContact(a)||this.inClass(a.target,"highcharts-tracker")||this.reset()}onDocumentMouseUp(a){const e=F[D(E.hoverChartIndex,-1)];e&&e.pointer.drop(a)}pinch(a){const e=this,h=e.chart,l=e.pinchDown,k=a.touches||[],g=k.length,b=e.lastValidTouch,c=e.hasZoom,f={},x=1===g&&(e.inClass(a.target,"highcharts-tracker")&&h.runTrackerClick||e.runChartClick),n={};var z=e.chart.tooltip;z=1===g&&D(z&&z.options.followTouchMove,!0);let p=e.selectionMarker;1{p||(e.selectionMarker=p=d({destroy:G,touch:!0},h.plotBox));e.pinchTranslate(l,k,f,p,n,b);e.hasPinched=c;e.scaleGroups(f,n)}),e.res&&(e.res=!1,this.reset(!1,0)))}pinchTranslate(a,d,h,l,k,g){this.zoomHor&&this.pinchTranslateDirection(!0,a,d,h,l,k,g);this.zoomVert&&this.pinchTranslateDirection(!1,a,d,h,l,k,g)}pinchTranslateDirection(a,d, +h,l,k,g,b,c){const f=this.chart,e=a?"x":"y",q=a?"X":"Y",m="chart"+q,n=a?"width":"height",w=f["plot"+(a?"Left":"Top")],p=f.inverted,y=f.bounds[a?"h":"v"],r=1===d.length,v=d[0][m],D=!r&&d[1][m];d=function(){"number"===typeof E&&20y.max&&(h=y.max-t,L=!0);L?(P-=.8*(P-b[e][0]),"number"===typeof E&&(E-=.8*(E-b[e][1])),d()):b[e]=[P, +E];p||(g[e]=K-w,g[n]=t);g=p?1/u:u;k[n]=t;k[e]=h;l[p?a?"scaleY":"scaleX":"scale"+q]=u;l["translate"+q]=g*w+(P-g*v)}reset(a,d){const e=this.chart,l=e.hoverSeries,h=e.hoverPoint,g=e.hoverPoints,b=e.tooltip,c=b&&b.shared?g:h;a&&c&&L(c).forEach(function(b){b.series.isCartesian&&"undefined"===typeof b.plotX&&(a=!1)});if(a)b&&c&&L(c).length&&(b.refresh(c),b.shared&&g?g.forEach(function(b){b.setState(b.state,!0);b.series.isCartesian&&(b.series.xAxis.crosshair&&b.series.xAxis.drawCrosshair(null,b),b.series.yAxis.crosshair&& +b.series.yAxis.drawCrosshair(null,b))}):h&&(h.setState(h.state,!0),e.axes.forEach(function(b){b.crosshair&&h.series[b.coll]===b&&b.drawCrosshair(null,h)})));else{if(h)h.onMouseOut();g&&g.forEach(function(b){b.setState()});if(l)l.onMouseOut();b&&b.hide(d);this.unDocMouseMove&&(this.unDocMouseMove=this.unDocMouseMove());e.axes.forEach(function(b){b.hideCrosshair()});this.hoverX=e.hoverPoints=e.hoverPoint=null}}runPointActions(a,d,h){const e=this.chart,q=e.tooltip&&e.tooltip.options.enabled?e.tooltip: +void 0,g=q?q.shared:!1;let b=d||e.hoverPoint,c=b&&b.series||e.hoverSeries;d=this.getHoverData(b,c,e.series,(!a||"touchmove"!==a.type)&&(!!d||c&&c.directTouch&&this.isDirectTouch),g,a);b=d.hoverPoint;c=d.hoverSeries;const f=d.hoverPoints;d=c&&c.tooltipOptions.followPointer&&!c.tooltipOptions.split;const k=g&&c&&!c.noSharedTooltip;if(b&&(h||b!==e.hoverPoint||q&&q.isHidden)){(e.hoverPoints||[]).forEach(function(b){-1===f.indexOf(b)&&b.setState()});if(e.hoverSeries!==c)c.onMouseOver();this.applyInactiveState(f); +(f||[]).forEach(function(b){b.setState("hover")});e.hoverPoint&&e.hoverPoint.firePointEvent("mouseOut");if(!b.series)return;e.hoverPoints=f;e.hoverPoint=b;b.firePointEvent("mouseOver",void 0,()=>{q&&b&&q.refresh(k?f:b,a)})}else d&&q&&!q.isHidden&&(h=q.getAnchor([{}],a),e.isInsidePlot(h[0],h[1],{visiblePlotOnly:!0})&&q.updatePosition({plotX:h[0],plotY:h[1]}));this.unDocMouseMove||(this.unDocMouseMove=C(e.container.ownerDocument,"mousemove",function(b){const a=F[E.hoverChartIndex];if(a)a.pointer.onDocumentMouseMove(b)}), +this.eventsToUnbind.push(this.unDocMouseMove));e.axes.forEach(function(b){const c=D((b.crosshair||{}).snap,!0);let g;c&&((g=e.hoverPoint)&&g.series[b.coll]===b||(g=p(f,a=>a.series&&a.series[b.coll]===b)));g||!c?b.drawCrosshair(a,g):b.hideCrosshair()})}scaleGroups(a,d){const e=this.chart;e.series.forEach(function(l){const h=a||l.getPlotBox();l.group&&(l.xAxis&&l.xAxis.zoomEnabled||e.mapView)&&(l.group.attr(h),l.markerGroup&&(l.markerGroup.attr(h),l.markerGroup.clip(d?e.clipRect:null)),l.dataLabelsGroup&& +l.dataLabelsGroup.attr(h))});e.clipRect.attr(d||e.clipBox)}setDOMEvents(){const a=this.chart.container,d=a.ownerDocument;a.onmousedown=this.onContainerMouseDown.bind(this);a.onmousemove=this.onContainerMouseMove.bind(this);a.onclick=this.onContainerClick.bind(this);this.eventsToUnbind.push(C(a,"mouseenter",this.onContainerMouseEnter.bind(this)));this.eventsToUnbind.push(C(a,"mouseleave",this.onContainerMouseLeave.bind(this)));E.unbindDocumentMouseUp||(E.unbindDocumentMouseUp=C(d,"mouseup",this.onDocumentMouseUp.bind(this))); +let h=this.chart.renderTo.parentElement;for(;h&&"BODY"!==h.tagName;)this.eventsToUnbind.push(C(h,"scroll",()=>{delete this.chartPosition})),h=h.parentElement;A.hasTouch&&(this.eventsToUnbind.push(C(a,"touchstart",this.onContainerTouchStart.bind(this),{passive:!1})),this.eventsToUnbind.push(C(a,"touchmove",this.onContainerTouchMove.bind(this),{passive:!1})),E.unbindDocumentTouchEnd||(E.unbindDocumentTouchEnd=C(d,"touchend",this.onDocumentTouchEnd.bind(this),{passive:!1})))}setHoverChartIndex(){const a= +this.chart,d=A.charts[D(E.hoverChartIndex,-1)];if(d&&d!==a)d.pointer.onContainerMouseLeave({relatedTarget:a.container});d&&d.mouseIsDown||(E.hoverChartIndex=a.index)}touch(a,d){const e=this.chart;let l,h;this.setHoverChartIndex();1===a.touches.length?(a=this.normalize(a),(h=e.isInsidePlot(a.chartX-e.plotLeft,a.chartY-e.plotTop,{visiblePlotOnly:!0}))&&!e.openMenu?(d&&this.runPointActions(a),"touchmove"===a.type&&(d=this.pinchDown,l=d[0]?4<=Math.sqrt(Math.pow(d[0].chartX-a.chartX,2)+Math.pow(d[0].chartY- +a.chartY,2)):!1),D(l,!0)&&this.pinch(a)):d&&this.reset()):2===a.touches.length&&this.pinch(a)}touchSelect(a){return!(!this.chart.options.chart.zooming.singleTouch||!a.touches||1!==a.touches.length)}zoomOption(a){var e=this.chart,d=e.options.chart;e=e.inverted;let l=d.zooming.type||"";/touch/.test(a.type)&&(l=D(d.zooming.pinchType,l));this.zoomX=a=/x/.test(l);this.zoomY=d=/y/.test(l);this.zoomHor=a&&!e||d&&e;this.zoomVert=d&&!e||a&&e;this.hasZoom=a||d}}(function(a){const e=[],d=[];a.compose=function(e){H.pushUnique(d, +e)&&C(e,"beforeRender",function(){this.pointer=new a(this,this.options)})};a.dissolve=function(){for(let a=0,d=e.length;a{this.proximate&&(this.proximatePositions(),this.positionItems())}))}setOptions(a){const b=e(a.padding,8);this.options=a;this.chart.styledMode||(this.itemStyle= +a.itemStyle,this.itemHiddenStyle=E(this.itemStyle,a.itemHiddenStyle));this.itemMarginTop=a.itemMarginTop;this.itemMarginBottom=a.itemMarginBottom;this.padding=b;this.initialItemY=b-5;this.symbolWidth=e(a.symbolWidth,16);this.pages=[];this.proximate="proximate"===a.layout&&!this.chart.inverted;this.baseline=void 0}update(a,b){const c=this.chart;this.setOptions(E(!0,this.options,a));this.destroy();c.isDirtyLegend=c.isDirtyBox=!0;e(b,!0)&&c.redraw();D(this,"afterUpdate")}colorizeItem(a,b){const {group:c, +label:f,line:g,symbol:e}=a.legendItem||{};if(c)c[b?"removeClass":"addClass"]("highcharts-legend-item-hidden");if(!this.chart.styledMode){var d=this.options;const c=this.itemHiddenStyle.color;d=b?d.itemStyle.color:c;const l=b?a.color||c:c,h=a.options&&a.options.marker;let k={fill:l};f&&f.css({fill:d});g&&g.attr({stroke:l});e&&(h&&e.isMarker&&(k=a.pointAttribs(),b||(k.stroke=k.fill=c)),e.attr(k))}D(this,"afterColorizeItem",{item:a,visible:b})}positionItems(){this.allItems.forEach(this.positionItem, +this);this.chart.isResizing||this.positionCheckboxes()}positionItem(a){const {group:b,x:c=0,y:f=0}=a.legendItem||{};var g=this.options,e=g.symbolPadding;const d=!g.rtl;g=a.checkbox;b&&b.element&&(e={translateX:d?c:this.legendWidth-c-2*e-4,translateY:f},b[v(b.translateY)?"animate":"attr"](e,void 0,()=>{D(this,"afterPositionItem",{item:a})}));g&&(g.x=c,g.y=f)}destroyItem(a){const b=a.checkbox,c=a.legendItem||{};for(const b of["group","label","line","symbol"])c[b]&&(c[b]=c[b].destroy());b&&n(b);a.legendItem= +void 0}destroy(){for(const a of this.getAllItems())this.destroyItem(a);for(const a of"clipRect up down pager nav box title group".split(" "))this[a]&&(this[a]=this[a].destroy());this.display=null}positionCheckboxes(){const a=this.group&&this.group.alignAttr,b=this.clipHeight||this.legendHeight,c=this.titleHeight;let f;a&&(f=a.translateY,this.allItems.forEach(function(g){const e=g.checkbox;let d;e&&(d=f+c+e.y+(this.scrollOffset||0)+3,k(e,{left:a.translateX+g.checkboxOffset+e.x-20+"px",top:d+"px",display:this.proximate|| +d>f-6&&d1.5*f?c.height:f))}layoutItem(a){var b=this.options;const c=this.padding,f="horizontal"===b.layout,g=a.itemHeight,d=this.itemMarginBottom,l=this.itemMarginTop,h=f?e(b.itemDistance,20):0,k=this.maxLegendWidth; +b=b.alignColumns&&this.totalItemWidth>k?this.maxItemWidth:a.itemWidth;const q=a.legendItem||{};f&&this.itemX-c+b>k&&(this.itemX=c,this.lastLineHeight&&(this.itemY+=l+this.lastLineHeight+d),this.lastLineHeight=0);this.lastItemY=l+this.itemY+d;this.lastLineHeight=Math.max(g,this.lastLineHeight);q.x=this.itemX;q.y=this.itemY;f?this.itemX+=b:(this.itemY+=l+g+d,this.lastLineHeight=g);this.offsetWidth=this.widthOption||Math.max((f?this.itemX-c-(a.checkbox?0:h):b)+c,this.offsetWidth)}getAllItems(){let a= +[];this.chart.series.forEach(function(b){const c=b&&b.options;b&&e(c.showInLegend,v(c.linkedTo)?!1:void 0,!0)&&(a=a.concat((b.legendItem||{}).labels||("point"===c.legendType?b.data:b)))});D(this,"afterGetAllItems",{allItems:a});return a}getAlignment(){const a=this.options;return this.proximate?a.align.charAt(0)+"tv":a.floating?"":a.align.charAt(0)+a.verticalAlign.charAt(0)+a.layout.charAt(0)}adjustMargins(a,b){const c=this.chart,f=this.options,g=this.getAlignment();g&&[/(lth|ct|rth)/,/(rtv|rm|rbv)/, +/(rbh|cb|lbh)/,/(lbv|lm|ltv)/].forEach(function(d,l){d.test(g)&&!v(a[l])&&(c[r[l]]=Math.max(c[r[l]],c.legend[(l+1)%2?"legendHeight":"legendWidth"]+[1,-1,-1,1][l]*f[l%2?"x":"y"]+e(f.margin,12)+b[l]+(c.titleOffset[l]||0)))})}proximatePositions(){const a=this.chart,b=[],c="left"===this.options.align;this.allItems.forEach(function(f){var g;var e=c;let d;f.yAxis&&(f.xAxis.options.reversed&&(e=!e),f.points&&(g=h(e?f.points:f.points.slice(0).reverse(),function(b){return L(b.plotY)})),e=this.itemMarginTop+ +f.legendItem.label.getBBox().height+this.itemMarginBottom,d=f.yAxis.top-a.plotTop,f.visible?(g=g?g.plotY:f.yAxis.height,g+=d-.3*e):g=d+f.yAxis.height,b.push({target:g,size:e,item:f}))},this);let f;for(const c of d(b,a.plotHeight))f=c.item.legendItem||{},L(c.pos)&&(f.y=a.plotTop-a.spacing[0]+c.pos)}render(){const a=this.chart,b=a.renderer,c=this.options,f=this.padding;var e=this.getAllItems();let d,l=this.group,h=this.box;this.itemX=f;this.itemY=this.initialItemY;this.lastItemY=this.offsetWidth=0; +this.widthOption=q(c.width,a.spacingBox.width-f);var k=a.spacingBox.width-2*f-c.x;-1<["rm","lm"].indexOf(this.getAlignment().substring(0,2))&&(k/=2);this.maxLegendWidth=this.widthOption||k;l||(this.group=l=b.g("legend").addClass(c.className||"").attr({zIndex:7}).add(),this.contentGroup=b.g().attr({zIndex:1}).add(l),this.scrollGroup=b.g().add(this.contentGroup));this.renderTitle();y(e,(b,a)=>(b.options&&b.options.legendIndex||0)-(a.options&&a.options.legendIndex||0));c.reversed&&e.reverse();this.allItems= +e;this.display=k=!!e.length;this.itemHeight=this.totalItemWidth=this.maxItemWidth=this.lastLineHeight=0;e.forEach(this.renderItem,this);e.forEach(this.layoutItem,this);e=(this.widthOption||this.offsetWidth)+f;d=this.lastItemY+this.lastLineHeight+this.titleHeight;d=this.handleOverflow(d);d+=f;h||(this.box=h=b.rect().addClass("highcharts-legend-box").attr({r:c.borderRadius}).add(l));a.styledMode||h.attr({stroke:c.borderColor,"stroke-width":c.borderWidth||0,fill:c.backgroundColor||"none"}).shadow(c.shadow); +if(0d&&!1!==q.enabled?(this.clipHeight=v=Math.max(d- +20-this.titleHeight-h,0),this.currentPage=e(this.currentPage,1),this.fullHeight=a,p.forEach((b,a)=>{D=b.legendItem||{};b=D.y||0;const c=Math.round(D.label.getBBox().height);let f=w.length;if(!f||b-w[f-1]>v&&(r||b)!==w[f-1])w.push(r||b),f++;D.pageIx=f-1;r&&((p[a-1].legendItem||{}).pageIx=f-1);a===p.length-1&&b+c-w[f-1]>v&&b>w[f-1]&&(w.push(b),D.pageIx=f);b!==r&&(r=b)}),u||(u=b.clipRect=f.clipRect(0,h-2,9999,0),b.contentGroup.clip(u)),y(v),t||(this.nav=t=f.g().attr({zIndex:1}).add(this.group),this.up= +f.symbol("triangle",0,0,n,n).add(t),K("upTracker").on("click",function(){b.scroll(-1,m)}),this.pager=f.text("",15,10).addClass("highcharts-legend-navigation"),!c.styledMode&&q.style&&this.pager.css(q.style),this.pager.add(t),this.down=f.symbol("triangle-down",0,0,n,n).add(t),K("downTracker").on("click",function(){b.scroll(1,m)})),b.scroll(0),a=d):t&&(y(),this.nav=t.destroy(),this.scrollGroup.attr({translateY:1}),this.clipHeight=0);return a}scroll(a,b){const c=this.chart,f=this.pages,g=f.length,d= +this.clipHeight,h=this.options.navigation,k=this.pager,q=this.padding;let m=this.currentPage+a;m>g&&(m=g);0{D(this,"afterScroll",{currentPage:m})}, +a.duration))}setItemEvents(a,b,c){const f=this,g=a.legendItem||{},e=f.chart.renderer.boxWrapper,d=a instanceof I,l="highcharts-legend-"+(d?"point":"series")+"-active",h=f.chart.styledMode;c=c?[b,g.symbol]:[g.group];const k=b=>{f.allItems.forEach(c=>{a!==c&&[c].concat(c.linkedSeries||[]).forEach(a=>{a.setState(b,!d)})})};for(const g of c)if(g)g.on("mouseover",function(){a.visible&&k("inactive");a.setState("hover");a.visible&&e.addClass(l);h||b.css(f.options.itemHoverStyle)}).on("mouseout",function(){f.chart.styledMode|| +b.css(E(a.visible?f.itemStyle:f.itemHiddenStyle));k("");e.removeClass(l);a.setState()}).on("click",function(b){const c=function(){a.setVisible&&a.setVisible();k(a.visible?"inactive":"")};e.removeClass(l);b={browserEvent:b};a.firePointEvent?a.firePointEvent("legendItemClick",b,c):D(a,"legendItemClick",b,c)})}createCheckboxForItem(a){a.checkbox=m("input",{type:"checkbox",className:"highcharts-legend-checkbox",checked:a.selected,defaultChecked:a.selected},this.options.itemCheckboxStyle,this.chart.container); +p(a.checkbox,"click",function(b){D(a.series||a,"checkboxClick",{checked:b.target.checked,item:a},function(){a.select()})})}}(function(a){const b=[];a.compose=function(c){G.pushUnique(b,c)&&p(c,"beforeMargins",function(){this.legend=new a(this,this.options.legend)})}})(w||(w={}));"";return w});M(a,"Core/Series/SeriesRegistry.js",[a["Core/Globals.js"],a["Core/Defaults.js"],a["Core/Series/Point.js"],a["Core/Utilities.js"]],function(a,A,H,I){const {defaultOptions:u}=A,{extendClass:G,merge:C}=I;var B; +(function(t){function r(a,p){const d=u.plotOptions||{},k=p.defaultOptions,v=p.prototype;v.type=a;v.pointClass||(v.pointClass=H);k&&(d[a]=k);t.seriesTypes[a]=p}t.seriesTypes=a.seriesTypes;t.registerSeriesType=r;t.seriesType=function(a,p,m,k,v){const d=u.plotOptions||{};p=p||"";d[a]=C(d[p],m);r(a,G(t.seriesTypes[p]||function(){},k));t.seriesTypes[a].prototype.type=a;v&&(t.seriesTypes[a].prototype.pointClass=G(H,v));return t.seriesTypes[a]}})(B||(B={}));return B});M(a,"Core/Chart/Chart.js",[a["Core/Animation/AnimationUtilities.js"], +a["Core/Axis/Axis.js"],a["Core/Defaults.js"],a["Core/FormatUtilities.js"],a["Core/Foundation.js"],a["Core/Globals.js"],a["Core/Renderer/RendererRegistry.js"],a["Core/Series/SeriesRegistry.js"],a["Core/Renderer/SVG/SVGRenderer.js"],a["Core/Time.js"],a["Core/Utilities.js"],a["Core/Renderer/HTML/AST.js"]],function(a,A,H,I,F,G,C,B,t,r,d,p){const {animate:m,animObject:k,setAnimation:v}=a,{defaultOptions:n,defaultTime:h}=H,{numberFormat:D}=I,{registerEventOptions:u}=F,{charts:E,doc:e,marginNames:q,svg:y, +win:l}=G,{seriesTypes:w}=B,{addEvent:g,attr:b,cleanRecursively:c,createElement:f,css:x,defined:J,discardElement:z,erase:Q,error:S,extend:R,find:N,fireEvent:O,getStyle:ba,isArray:da,isNumber:W,isObject:K,isString:Y,merge:P,objectEach:ca,pick:T,pInt:X,relativeLength:U,removeEvent:Z,splat:ea,syncTimeout:fa,uniqueKey:M}=d;class aa{static chart(b,a,c){return new aa(b,a,c)}constructor(b,a,c){this.series=this.renderTo=this.renderer=this.pointer=this.pointCount=this.plotWidth=this.plotTop=this.plotLeft=this.plotHeight= +this.plotBox=this.options=this.numberFormatter=this.margin=this.labelCollectors=this.isResizing=this.index=this.eventOptions=this.container=this.colorCounter=this.clipBox=this.chartWidth=this.chartHeight=this.bounds=this.axisOffset=this.axes=void 0;this.sharedClips={};this.yAxis=this.xAxis=this.userOptions=this.titleOffset=this.time=this.symbolCounter=this.spacingBox=this.spacing=void 0;this.getArgs(b,a,c)}getArgs(b,a,c){Y(b)||b.nodeName?(this.renderTo=b,this.init(a,c)):this.init(b,a)}init(b,a){const c= +b.plotOptions||{};O(this,"init",{args:arguments},function(){const f=P(n,b),g=f.chart;ca(f.plotOptions,function(b,a){K(b)&&(b.tooltip=c[a]&&P(c[a].tooltip)||void 0)});f.tooltip.userOptions=b.chart&&b.chart.forExport&&b.tooltip.userOptions||b.tooltip;this.userOptions=b;this.margin=[];this.spacing=[];this.bounds={h:{},v:{}};this.labelCollectors=[];this.callback=a;this.isResizing=0;const e=g.zooming=g.zooming||{};b.chart&&!b.chart.zooming&&(e.resetButton=g.resetZoomButton);e.key=T(e.key,g.zoomKey);e.pinchType= +T(e.pinchType,g.pinchType);e.singleTouch=T(e.singleTouch,g.zoomBySingleTouch);e.type=T(e.type,g.zoomType);this.options=f;this.axes=[];this.series=[];this.time=b.time&&Object.keys(b.time).length?new r(b.time):G.time;this.numberFormatter=g.numberFormatter||D;this.styledMode=g.styledMode;this.hasCartesianSeries=g.showAxes;this.index=E.length;E.push(this);G.chartCount++;u(this,g);this.xAxis=[];this.yAxis=[];this.pointCount=this.colorCounter=this.symbolCounter=0;O(this,"afterInit");this.firstRender()})}initSeries(b){var a= +this.options.chart;a=b.type||a.type;const c=w[a];c||S(17,!0,this,{missingModuleFor:a});a=new c;"function"===typeof a.init&&a.init(this,b);return a}setSeriesData(){this.getSeriesOrderByLinks().forEach(function(b){b.points||b.data||!b.enabledDataSorting||b.setData(b.options.data,!1)})}getSeriesOrderByLinks(){return this.series.concat().sort(function(b,a){return b.linkedSeries.length||a.linkedSeries.length?a.linkedSeries.length-b.linkedSeries.length:0})}orderSeries(b){const a=this.series;for(let c=b|| +0,f=a.length;c=Math.max(h+e,a.pos)&&n<=Math.min(h+e+m.width,a.pos+a.len)||(b.isInsidePlot=!1)}!c.ignoreY&&b.isInsidePlot&&(h=!f&&c.axis&&!c.axis.isXAxis&&c.axis||q&&(f?q.xAxis:q.yAxis)||{pos:d,len:Infinity},c=c.paneCoordinates?h.pos+a:d+a,c>=Math.max(k+d,h.pos)&&c<=Math.min(k+d+m.height,h.pos+h.len)||(b.isInsidePlot=!1));O(this,"afterIsInsidePlot",b);return b.isInsidePlot}redraw(b){O(this,"beforeRedraw");const a=this.hasCartesianSeries?this.axes:this.colorAxis||[],c=this.series,f=this.pointer,g=this.legend, +e=this.userOptions.legend,d=this.renderer,l=d.isHidden(),h=[];let k,q,m=this.isDirtyBox,n=this.isDirtyLegend,x;d.rootFontSize=d.boxWrapper.getStyle("font-size");this.setResponsive&&this.setResponsive(!1);v(this.hasRendered?b:!1,this);l&&this.temporaryDisplay();this.layOutTitles();for(b=c.length;b--;)if(x=c[b],x.options.stacking||x.options.centerInCategory)if(q=!0,x.isDirty){k=!0;break}if(k)for(b=c.length;b--;)x=c[b],x.options.stacking&&(x.isDirty=!0);c.forEach(function(b){b.isDirty&&("point"===b.options.legendType? +("function"===typeof b.updateTotals&&b.updateTotals(),n=!0):e&&(e.labelFormatter||e.labelFormat)&&(n=!0));b.isDirtyData&&O(b,"updatedData")});n&&g&&g.options.enabled&&(g.render(),this.isDirtyLegend=!1);q&&this.getStacks();a.forEach(function(b){b.updateNames();b.setScale()});this.getMargins();a.forEach(function(b){b.isDirty&&(m=!0)});a.forEach(function(b){const a=b.min+","+b.max;b.extKey!==a&&(b.extKey=a,h.push(function(){O(b,"afterSetExtremes",R(b.eventArgs,b.getExtremes()));delete b.eventArgs})); +(m||q)&&b.redraw()});m&&this.drawChartBox();O(this,"predraw");c.forEach(function(b){(m||b.isDirty)&&b.visible&&b.redraw();b.isDirtyData=!1});f&&f.reset(!0);d.draw();O(this,"redraw");O(this,"render");l&&this.temporaryDisplay(!0);h.forEach(function(b){b.call()})}get(b){function a(a){return a.id===b||a.options&&a.options.id===b}const c=this.series;let f=N(this.axes,a)||N(this.series,a);for(let b=0;!f&&b{a.getPointsCollection().forEach(a=>{T(a.selectedStaging,a.selected)&&b.push(a)});return b},[])}getSelectedSeries(){return this.series.filter(function(b){return b.selected})}setTitle(b,a,c){this.applyDescription("title",b);this.applyDescription("subtitle", +a);this.applyDescription("caption",void 0);this.layOutTitles(c)}applyDescription(b,a){const c=this;var f="title"===b?{color:"#333333",fontSize:this.options.isStock?"1em":"1.2em",fontWeight:"bold"}:{color:"#666666",fontSize:"0.8em"};f=this.options[b]=P(!this.styledMode&&{style:f},this.options[b],a);let g=this[b];g&&a&&(this[b]=g=g.destroy());f&&!g&&(g=this.renderer.text(f.text,0,0,f.useHTML).attr({align:f.align,"class":"highcharts-"+b,zIndex:f.zIndex||4}).add(),g.update=function(a){c[{title:"setTitle", +subtitle:"setSubtitle",caption:"setCaption"}[b]](a)},this.styledMode||g.css(f.style),this[b]=g)}layOutTitles(b){const a=[0,0,0],c=this.renderer,f=this.spacingBox;["title","subtitle","caption"].forEach(function(b){const g=this[b],e=this.options[b],d=e.verticalAlign||"top";b="title"===b?"top"===d?-3:0:"top"===d?a[0]+2:0;if(g){g.css({width:(e.width||f.width+(e.widthAdjust||0))+"px"});const l=c.fontMetrics(g).b,h=Math.round(g.getBBox(e.useHTML).height);g.align(R({y:"bottom"===d?l:b+l,height:h},e),!1, +"spacingBox");e.floating||("top"===d?a[0]=Math.ceil(a[0]+h):"bottom"===d&&(a[2]=Math.ceil(a[2]+h)))}},this);a[0]&&"top"===(this.options.title.verticalAlign||"top")&&(a[0]+=this.options.title.margin);a[2]&&"bottom"===this.options.caption.verticalAlign&&(a[2]+=this.options.caption.margin);const g=!this.titleOffset||this.titleOffset.join(",")!==a.join(",");this.titleOffset=a;O(this,"afterLayOutTitles");!this.isDirtyBox&&g&&(this.isDirtyBox=this.isDirtyLegend=g,this.hasRendered&&T(b,!0)&&this.isDirtyBox&& +this.redraw())}getContainerBox(){return{width:ba(this.renderTo,"width",!0)||0,height:ba(this.renderTo,"height",!0)||0}}getChartSize(){var b=this.options.chart;const a=b.width;b=b.height;const c=this.getContainerBox();this.chartWidth=Math.max(0,a||c.width||600);this.chartHeight=Math.max(0,U(b,this.chartWidth)||(1{var c;(null===(c=b.options)||void 0===c?0:c.chart.reflow)&&b.hasLoaded&&b.reflow(a)};"function"===typeof ResizeObserver?(new ResizeObserver(a)).observe(b.renderTo):(a=g(l,"resize",a),g(this,"destroy",a))}setSize(b,a,c){const f=this,g=f.renderer;f.isResizing+=1;v(c,f);c=g.globalAnimation;f.oldChartHeight=f.chartHeight;f.oldChartWidth=f.chartWidth;"undefined"!==typeof b&&(f.options.chart.width= +b);"undefined"!==typeof a&&(f.options.chart.height=a);f.getChartSize();f.styledMode||(c?m:x)(f.container,{width:f.chartWidth+"px",height:f.chartHeight+"px"},c);f.setChartSize(!0);g.setSize(f.chartWidth,f.chartHeight,c);f.axes.forEach(function(b){b.isDirty=!0;b.setScale()});f.isDirtyLegend=!0;f.isDirtyBox=!0;f.layOutTitles();f.getMargins();f.redraw(c);f.oldChartHeight=null;O(f,"resize");fa(function(){f&&O(f,"endResize",null,function(){--f.isResizing})},k(c).duration)}setChartSize(b){var a=this.inverted; +const c=this.renderer;var f=this.chartWidth,g=this.chartHeight;const e=this.options.chart,d=this.spacing,l=this.clipOffset;let h,k,q,m;this.plotLeft=h=Math.round(this.plotLeft);this.plotTop=k=Math.round(this.plotTop);this.plotWidth=q=Math.max(0,Math.round(f-h-this.marginRight));this.plotHeight=m=Math.max(0,Math.round(g-k-this.marginBottom));this.plotSizeX=a?m:q;this.plotSizeY=a?q:m;this.plotBorderWidth=e.plotBorderWidth||0;this.spacingBox=c.spacingBox={x:d[3],y:d[0],width:f-d[3]-d[1],height:g-d[0]- +d[2]};this.plotBox=c.plotBox={x:h,y:k,width:q,height:m};a=2*Math.floor(this.plotBorderWidth/2);f=Math.ceil(Math.max(a,l[3])/2);g=Math.ceil(Math.max(a,l[0])/2);this.clipBox={x:f,y:g,width:Math.floor(this.plotSizeX-Math.max(a,l[1])/2-f),height:Math.max(0,Math.floor(this.plotSizeY-Math.max(a,l[2])/2-g))};b||(this.axes.forEach(function(b){b.setAxisSize();b.setAxisTranslation()}),c.alignElements());O(this,"afterSetChartSize",{skipAxes:b})}resetMargins(){O(this,"resetMargins");const b=this,a=b.options.chart; +["margin","spacing"].forEach(function(c){const f=a[c],g=K(f)?f:[f,f,f,f];["Top","Right","Bottom","Left"].forEach(function(f,e){b[c][e]=T(a[c+f],g[e])})});q.forEach(function(a,c){b[a]=T(b.margin[c],b.spacing[c])});b.axisOffset=[0,0,0,0];b.clipOffset=[0,0,0,0]}drawChartBox(){const b=this.options.chart,a=this.renderer,c=this.chartWidth,f=this.chartHeight,g=this.styledMode,e=this.plotBGImage;var d=b.backgroundColor;const l=b.plotBackgroundColor,h=b.plotBackgroundImage,k=this.plotLeft,q=this.plotTop,m= +this.plotWidth,n=this.plotHeight,x=this.plotBox,w=this.clipRect,p=this.clipBox;let z=this.chartBackground,K=this.plotBackground,y=this.plotBorder,J,v,r="animate";z||(this.chartBackground=z=a.rect().addClass("highcharts-background").add(),r="attr");if(g)J=v=z.strokeWidth();else{J=b.borderWidth||0;v=J+(b.shadow?8:0);d={fill:d||"none"};if(J||z["stroke-width"])d.stroke=b.borderColor,d["stroke-width"]=J;z.attr(d).shadow(b.shadow)}z[r]({x:v/2,y:v/2,width:c-v-J%2,height:f-v-J%2,r:b.borderRadius});r="animate"; +K||(r="attr",this.plotBackground=K=a.rect().addClass("highcharts-plot-background").add());K[r](x);g||(K.attr({fill:l||"none"}).shadow(b.plotShadow),h&&(e?(h!==e.attr("href")&&e.attr("href",h),e.animate(x)):this.plotBGImage=a.image(h,k,q,m,n).add()));w?w.animate({width:p.width,height:p.height}):this.clipRect=a.clipRect(p);r="animate";y||(r="attr",this.plotBorder=y=a.rect().addClass("highcharts-plot-border").attr({zIndex:1}).add());g||y.attr({stroke:b.plotBorderColor,"stroke-width":b.plotBorderWidth|| +0,fill:"none"});y[r](y.crisp({x:k,y:q,width:m,height:n},-y.strokeWidth()));this.isDirtyBox=!1;O(this,"afterDrawChartBox")}propFromSeries(){const b=this,a=b.options.chart,c=b.options.series;let f,g,e;["inverted","angular","polar"].forEach(function(d){g=w[a.type];e=a[d]||g&&g.prototype[d];for(f=c&&c.length;!e&&f--;)(g=w[c[f].type])&&g.prototype[d]&&(e=!0);b[d]=e})}linkSeries(b){const a=this,c=a.series;c.forEach(function(b){b.linkedSeries.length=0});c.forEach(function(b){let c=b.options.linkedTo;Y(c)&& +(c=":previous"===c?a.series[b.index-1]:a.get(c))&&c.linkedParent!==b&&(c.linkedSeries.push(b),b.linkedParent=c,c.enabledDataSorting&&b.setDataSortingOptions(),b.visible=T(b.options.visible,c.options.visible,b.visible))});O(this,"afterLinkSeries",{isUpdating:b})}renderSeries(){this.series.forEach(function(b){b.translate();b.render()})}render(){const b=this.axes,a=this.colorAxis,c=this.renderer,f=function(b){b.forEach(function(b){b.visible&&b.render()})};let g=0;this.setTitle();O(this,"beforeMargins"); +this.getStacks&&this.getStacks();this.getMargins(!0);this.setChartSize();const e=this.plotWidth;b.some(function(b){if(b.horiz&&b.visible&&b.options.labels.enabled&&b.series.length)return g=21,!0});const d=this.plotHeight=Math.max(this.plotHeight-g,0);b.forEach(function(b){b.setScale()});this.getAxisMargins();const l=1.1a.pointCount))}pan(b,a){const c=this,f=c.hoverPoints;a="object"===typeof a?a:{enabled:a,type:"x"};const g=c.options.chart;g&&g.panning&&(g.panning=a);const e=a.type;let d;O(this,"pan",{originalEvent:b},function(){f&&f.forEach(function(b){b.setState()});let a=c.xAxis;"xy"===e?a=a.concat(c.yAxis):"y"===e&&(a=c.yAxis);const g={};a.forEach(function(a){if(a.options.panningEnabled&&!a.options.isInternal){var f=a.horiz,l=b[f?"chartX":"chartY"];f= +f?"mouseDownX":"mouseDownY";var h=c[f],k=a.minPointOffset||0,q=a.reversed&&!c.inverted||!a.reversed&&c.inverted?-1:1,m=a.getExtremes(),n=a.toValue(h-l,!0)+k*q,x=a.toValue(h+a.len-l,!0)-(k*q||a.isXAxis&&a.pointRangePadding||0),w=x=q&&n<=x&&(a.setExtremes(h,n,!1,!1,{trigger:"pan"}),!c.resetZoomButton&& +h!==q&&n!==x&&e.match("y")&&(c.showResetZoom(),a.displayBtn=!1),d=!0),g[f]=l)}});ca(g,(b,a)=>{c[a]=b});d&&c.redraw(!1);x(c.container,{cursor:"move"})})}}R(aa.prototype,{callbacks:[],collectionsWithInit:{xAxis:[aa.prototype.addAxis,[!0]],yAxis:[aa.prototype.addAxis,[!1]],series:[aa.prototype.addSeries]},collectionsWithUpdate:["xAxis","yAxis","series"],propsRequireDirtyBox:"backgroundColor borderColor borderWidth borderRadius plotBackgroundColor plotBackgroundImage plotBorderColor plotBorderWidth plotShadow shadow".split(" "), +propsRequireReflow:"margin marginTop marginRight marginBottom marginLeft spacing spacingTop spacingRight spacingBottom spacingLeft".split(" "),propsRequireUpdateSeries:"chart.inverted chart.polar chart.ignoreHiddenSeries chart.type colors plotOptions time tooltip".split(" ")});"";return aa});M(a,"Core/Legend/LegendSymbol.js",[a["Core/Utilities.js"]],function(a){const {extend:u,merge:H,pick:I}=a;var F;(function(a){a.lineMarker=function(a,B){B=this.legendItem=this.legendItem||{};var t=this.options; +const r=a.symbolWidth,d=a.symbolHeight,p=d/2,m=this.chart.renderer,k=B.group;a=a.baseline-Math.round(.3*a.fontMetrics.b);let v={},n=t.marker,h=0;this.chart.styledMode||(v={"stroke-width":Math.min(t.lineWidth||0,24)},t.dashStyle?v.dashstyle=t.dashStyle:"square"!==t.linecap&&(v["stroke-linecap"]="round"));B.line=m.path().addClass("highcharts-graph").attr(v).add(k);v["stroke-linecap"]&&(h=Math.min(B.line.strokeWidth(),r)/2);r&&B.line.attr({d:[["M",h,a],["L",r-h,a]]});n&&!1!==n.enabled&&r&&(t=Math.min(I(n.radius, +p),p),0===this.symbol.indexOf("url")&&(n=H(n,{width:d,height:d}),t=0),B.symbol=B=m.symbol(this.symbol,r/2-t,a-t,2*t,2*t,u({context:"legend"},n)).addClass("highcharts-point").add(k),B.isMarker=!0)};a.rectangle=function(a,u){u=u.legendItem||{};const t=a.symbolHeight,r=a.options.squareSymbol;u.symbol=this.chart.renderer.rect(r?(a.symbolWidth-t)/2:0,a.baseline-t+1,r?t:a.symbolWidth,t,I(a.options.symbolRadius,t/2)).addClass("highcharts-point").attr({zIndex:3}).add(u.group)}})(F||(F={}));return F});M(a, +"Core/Series/SeriesDefaults.js",[],function(){return{lineWidth:1,allowPointSelect:!1,crisp:!0,showCheckbox:!1,animation:{duration:1E3},events:{},marker:{enabledThreshold:2,lineColor:"#ffffff",lineWidth:0,radius:4,states:{normal:{animation:!0},hover:{animation:{duration:150},enabled:!0,radiusPlus:2,lineWidthPlus:1},select:{fillColor:"#cccccc",lineColor:"#000000",lineWidth:2}}},point:{events:{}},dataLabels:{animation:{},align:"center",borderWidth:0,defer:!0,formatter:function(){const {numberFormatter:a}= +this.series.chart;return"number"!==typeof this.y?"":a(this.y,-1)},padding:5,style:{fontSize:"0.7em",fontWeight:"bold",color:"contrast",textOutline:"1px contrast"},verticalAlign:"bottom",x:0,y:0},cropThreshold:300,opacity:1,pointRange:0,softThreshold:!0,states:{normal:{animation:!0},hover:{animation:{duration:150},lineWidthPlus:1,marker:{},halo:{size:10,opacity:.25}},select:{animation:{duration:0}},inactive:{animation:{duration:150},opacity:.2}},stickyTracking:!0,turboThreshold:1E3,findNearestPointBy:"x"}}); +M(a,"Core/Series/Series.js",[a["Core/Animation/AnimationUtilities.js"],a["Core/Defaults.js"],a["Core/Foundation.js"],a["Core/Globals.js"],a["Core/Legend/LegendSymbol.js"],a["Core/Series/Point.js"],a["Core/Series/SeriesDefaults.js"],a["Core/Series/SeriesRegistry.js"],a["Core/Renderer/SVG/SVGElement.js"],a["Core/Utilities.js"]],function(a,A,H,I,F,G,C,B,t,r){const {animObject:d,setAnimation:p}=a,{defaultOptions:m}=A,{registerEventOptions:k}=H,{hasTouch:v,svg:n,win:h}=I,{seriesTypes:D}=B,{arrayMax:u, +arrayMin:E,clamp:e,cleanRecursively:q,correctFloat:y,defined:l,erase:w,error:g,extend:b,find:c,fireEvent:f,getNestedProperty:x,isArray:J,isNumber:z,isString:Q,merge:S,objectEach:R,pick:N,removeEvent:O,splat:ba,syncTimeout:da}=r;class W{constructor(){this.zones=this.yAxis=this.xAxis=this.userOptions=this.tooltipOptions=this.processedYData=this.processedXData=this.points=this.options=this.linkedSeries=this.index=this.eventsToUnbind=this.eventOptions=this.data=this.chart=this._i=void 0}init(a,c){f(this, +"init",{options:c});const g=this,e=a.series;this.eventsToUnbind=[];g.chart=a;g.options=g.setOptions(c);c=g.options;g.linkedSeries=[];g.bindAxes();b(g,{name:c.name,state:"",visible:!1!==c.visible,selected:!0===c.selected});k(this,c);const d=c.events;if(d&&d.click||c.point&&c.point.events&&c.point.events.click||c.allowPointSelect)a.runTrackerClick=!0;g.getColor();g.getSymbol();g.parallelArrays.forEach(function(b){g[b+"Data"]||(g[b+"Data"]=[])});g.isCartesian&&(a.hasCartesianSeries=!0);let l;e.length&& +(l=e[e.length-1]);g._i=N(l&&l._i,-1)+1;g.opacity=g.options.opacity;a.orderSeries(this.insert(e));c.dataSorting&&c.dataSorting.enabled?g.setDataSortingOptions():g.points||g.data||g.setData(c.data,!1);f(this,"afterInit")}is(b){return D[b]&&this instanceof D[b]}insert(b){const a=this.options.index;let c;if(z(a)){for(c=b.length;c--;)if(a>=N(b[c].options.index,b[c]._i)){b.splice(c+1,0,this);break}-1===c&&b.unshift(this);c+=1}else b.push(this);return N(c,b.length-1)}bindAxes(){const b=this,a=b.options, +c=b.chart;let e;f(this,"bindAxes",null,function(){(b.axisTypes||[]).forEach(function(f){let d=0;c[f].forEach(function(c){e=c.options;if(a[f]===d&&!e.isInternal||"undefined"!==typeof a[f]&&a[f]===e.id||"undefined"===typeof a[f]&&0===e.index)b.insert(c.series),b[f]=c,c.isDirty=!0;e.isInternal||d++});b[f]||b.optionalAxis===f||g(18,!0,c)})});f(this,"afterBindAxes")}updateParallelArrays(b,a,c){const f=b.series,g=z(a)?function(c){const g="y"===c&&f.toYData?f.toYData(b):b[c];f[c+"Data"][a]=g}:function(b){Array.prototype[a].apply(f[b+ +"Data"],c)};f.parallelArrays.forEach(g)}hasData(){return this.visible&&"undefined"!==typeof this.dataMax&&"undefined"!==typeof this.dataMin||this.visible&&this.yData&&0!a.touched&&a.index===b.index,d&&d.matchByName?l=a=>!a.touched&&a.name===b.name:this.options.relativeXValue&&(l=a=>!a.touched&&a.options.x===b.x),l=c(e,l), +!l)return;l&&(k=l&&l.index,"undefined"!==typeof k&&(h=!0));"undefined"===typeof k&&z(g)&&(k=this.xData.indexOf(g,a));-1!==k&&"undefined"!==typeof k&&this.cropped&&(k=k>=this.cropStart?k-this.cropStart:k);!h&&z(k)&&e[k]&&e[k].touched&&(k=void 0);return k}updateData(b,a){const c=this.options,f=c.dataSorting,g=this.points,e=[],d=this.requireSorting,h=b.length===g.length;let k,q,m,n=!0;this.xIncrement=null;b.forEach(function(b,a){var q=l(b)&&this.pointClass.prototype.optionsToObject.call({series:this}, +b)||{};const n=q.x;if(q.id||z(n)){if(q=this.findPointIndex(q,m),-1===q||"undefined"===typeof q?e.push(b):g[q]&&b!==c.data[q]?(g[q].update(b,!1,null,!1),g[q].touched=!0,d&&(m=q+1)):g[q]&&(g[q].touched=!0),!h||a!==q||f&&f.enabled||this.hasDerivedData)k=!0}else e.push(b)},this);if(k)for(b=g.length;b--;)(q=g[b])&&!q.touched&&q.remove&&q.remove(!1,a);else!h||f&&f.enabled?n=!1:(b.forEach(function(b,a){b===g[a].y||g[a].destroyed||g[a].update(b,!1,null,!1)}),e.length=0);g.forEach(function(b){b&&(b.touched= +!1)});if(!n)return!1;e.forEach(function(b){this.addPoint(b,!1,null,null,!1)},this);null===this.xIncrement&&this.xData&&this.xData.length&&(this.xIncrement=u(this.xData),this.autoIncrement());return!0}setData(b,a=!0,c,f){var e;const d=this,l=d.points,h=l&&l.length||0,k=d.options,q=d.chart,n=k.dataSorting,m=d.xAxis,x=k.turboThreshold,w=this.xData,p=this.yData;var y=d.pointArrayMap;y=y&&y.length;const r=k.keys;let v,K=0,D=1,t=null;if(!q.options.chart.allowMutatingData){k.data&&delete d.options.data; +d.userOptions.data&&delete d.userOptions.data;var u=S(!0,b)}b=u||b||[];u=b.length;n&&n.enabled&&(b=this.sortData(b));q.options.chart.allowMutatingData&&!1!==f&&u&&h&&!d.cropped&&!d.hasGroupedData&&d.visible&&!d.boosted&&(v=this.updateData(b,c));if(!v){d.xIncrement=null;d.colorCounter=0;this.parallelArrays.forEach(function(b){d[b+"Data"].length=0});if(x&&u>x)if(t=d.getFirstValidPoint(b),z(t))for(c=0;c{b=x(c,b);a=x(c,a);return ab?1:0}).forEach(function(b,a){b.x= +a},this);a.linkedSeries&&a.linkedSeries.forEach(function(a){const c=a.options,g=c.data;c.dataSorting&&c.dataSorting.enabled||!g||(g.forEach(function(c,e){g[e]=f(a,c);b[e]&&(g[e].x=b[e].x,g[e].index=e)}),a.setData(g,!1))});return b}getProcessedData(b){var a=this.xAxis,c=this.options,f=c.cropThreshold;const e=b||this.getExtremesFromAll||c.getExtremesFromAll,d=this.isCartesian;b=a&&a.val2lin;c=!(!a||!a.logarithmic);let l=0,h;let k,q,m=this.xData,n=this.yData,x=this.requireSorting;var w=!1;const p=m.length; +a&&(w=a.getExtremes(),k=w.min,q=w.max,w=!(!a.categories||a.names.length));if(d&&this.sorted&&!e&&(!f||p>f||this.forceCrop))if(m[p-1]q)m=[],n=[];else if(this.yData&&(m[0]q)){var z=this.cropData(this.xData,this.yData,k,q);m=z.xData;n=z.yData;l=z.start;z=!0}for(f=m.length||1;--f;)a=c?b(m[f])-b(m[f-1]):m[f]-m[f-1],0a&&x&&!w&&(g(15,!1,this.chart),x=!1);return{xData:m,yData:n,cropped:z,cropStart:l,closestPointRange:h}}processData(b){const a=this.xAxis; +if(this.isCartesian&&!this.isDirty&&!a.isDirty&&!this.yAxis.isDirty&&!b)return!1;b=this.getProcessedData();this.cropped=b.cropped;this.cropStart=b.cropStart;this.processedXData=b.xData;this.processedYData=b.yData;this.closestPointRange=this.basePointRange=b.closestPointRange;f(this,"afterProcessData")}cropData(b,a,c,f,g){const e=b.length;let d,l=0,h=e;g=N(g,this.cropShoulder);for(d=0;d=c){l=Math.max(0,d-g);break}for(c=d;cf){h=c+g;break}return{xData:b.slice(l,h),yData:a.slice(l, +h),start:l,end:h}}generatePoints(){var a=this.options;const c=this.processedData||a.data,g=this.processedXData,e=this.processedYData,d=this.pointClass,l=g.length,h=this.cropStart||0,k=this.hasGroupedData,q=a.keys,m=[];a=a.dataGrouping&&a.dataGrouping.groupAll?h:0;let n;let x,w,p=this.data;if(!p&&!k){var z=[];z.length=c.length;p=this.data=z}q&&k&&(this.options.keys=!1);for(w=0;w=k&&(e[h-l]||w)<=q;if(p&&w)if(p=x.length)for(;p--;)z(x[p])&&(d[m++]=x[p]);else d[m++]=x}b={activeYData:d,dataMin:E(d),dataMax:u(d)};f(this,"afterGetExtremes", +{dataExtremes:b});return b}applyExtremes(){const b=this.getExtremes();this.dataMin=b.dataMin;this.dataMax=b.dataMax;return b}getFirstValidPoint(b){const a=b.length;let c=0,f=null;for(;null===f&&c=L&&(L=void 0),f.total=f.stackTotal=N(K.total),f.percentage=l(f.y)&&K.total?f.y/K.total*100:void 0,f.stackY=Q,this.irregularWidths||K.setOffset(this.pointXOffset||0,this.barW||0,void 0,void 0,void 0,this.xAxis)));f.yBottom=l(L)?e(k.translate(L,!1,!0,!1,!0),-1E5,1E5):void 0;this.dataModify&&(Q=this.dataModify.modifyValue(Q,v));let R;z(Q)&&void 0!==f.plotX&&(R=k.translate(Q,!1,!0,!1,!0),R=z(R)?e(R,-1E5,1E5):void 0);f.plotY=R;f.isInside=this.isPointInside(f);f.clientX=x?y(g.translate(m,!1,!1,!1,!0, +n)):D;f.negative=f[r]<(a[r+"Threshold"]||w||0);f.category=N(d&&d[f.x],f.x);f.isNull||!1===f.visible||("undefined"!==typeof t&&(E=Math.min(E,Math.abs(D-t))),t=D);f.zone=this.zones.length?f.getZone():void 0;!f.graphic&&this.group&&h&&(f.isNew=!0)}this.closestPointRangePx=E;f(this,"afterTranslate")}getValidPoints(b,a,c){const f=this.chart;return(b||this.points||[]).filter(function(b){const {plotX:g,plotY:e}=b;return!c&&(b.isNull||!z(e))||a&&!f.isInsidePlot(g,e,{inverted:f.inverted})?!1:!1!==b.visible})}getClipBox(){const {chart:b, +xAxis:a,yAxis:c}=this,f=S(b.clipBox);a&&a.len!==b.plotSizeX&&(f.width=a.len);c&&c.len!==b.plotSizeY&&(f.height=c.len);return f}getSharedClipKey(){return this.sharedClipKey=(this.options.xAxis||0)+","+(this.options.yAxis||0)}setClip(){const {chart:b,group:a,markerGroup:c}=this,f=b.sharedClips,g=b.renderer,e=this.getClipBox(),d=this.getSharedClipKey();let l=f[d];l?l.animate(e):f[d]=l=g.clipRect(e);a&&a.clip(!1===this.options.clip?void 0:l);c&&c.clip()}animate(b){const {chart:a,group:c,markerGroup:f}= +this,g=a.inverted;var e=d(this.options.animation),l=[this.getSharedClipKey(),e.duration,e.easing,e.defer].join();let h=a.sharedClips[l],k=a.sharedClips[l+"m"];if(b&&c)e=this.getClipBox(),h?h.attr("height",e.height):(e.width=0,g&&(e.x=a.plotHeight),h=a.renderer.clipRect(e),a.sharedClips[l]=h,k=a.renderer.clipRect({x:-99,y:-99,width:g?a.plotWidth+199:99,height:g?99:a.plotHeight+199}),a.sharedClips[l+"m"]=k),c.clip(h),f&&f.clip(k);else if(h&&!h.hasClass("highcharts-animating")){l=this.getClipBox();const b= +e.step;f&&f.element.childNodes.length&&(e.step=function(a,c){b&&b.apply(c,arguments);"width"===c.prop&&k&&k.element&&k.attr(g?"height":"width",a+99)});h.addClass("highcharts-animating").animate(l,e)}}afterAnimate(){this.setClip();R(this.chart.sharedClips,(b,a,c)=>{b&&!this.chart.container.querySelector(`[clip-path="url(#${b.id})"]`)&&(b.destroy(),delete c[a])});this.finishedAnimating=!0;f(this,"afterAnimate")}drawPoints(b=this.points){const a=this.chart,c=a.styledMode,{colorAxis:f,options:g}=this, +e=g.marker,d=this[this.specialGroup||"markerGroup"],l=this.xAxis,h=N(e.enabled,!l||l.isRadial?!0:null,this.closestPointRangePx>=e.enabledThreshold*e.radius);let k,q,m,n;let x,w;if(!1!==e.enabled||this._hasPointMarkers)for(k=0;kb.destroy());r.clearTimeout(a.animationTimeout);R(a,function(b,a){b instanceof t&&!b.survive&&(d=g&&"group"===a?"hide":"destroy",b[d]())});c.hoverSeries===a&&(c.hoverSeries=void 0);w(c.series,a);c.orderSeries();R(a,function(c, +f){b&&"hcEvents"===f||delete a[f]})}applyZones(){const b=this,a=this.chart,c=a.renderer,f=this.zones,g=this.clips||[],d=this.graph,l=this.area,h=Math.max(a.plotWidth,a.plotHeight),k=this[(this.zoneAxis||"y")+"Axis"],q=a.inverted;let m,n,x,w,p,z,y,v,r,J,D,t=!1;f.length&&(d||l)&&k&&"undefined"!==typeof k.min?(p=k.reversed,z=k.horiz,d&&!this.showLine&&d.hide(),l&&l.hide(),w=k.getExtremes(),f.forEach(function(f,u){m=p?z?a.plotWidth:0:z?0:k.toPixels(w.min)||0;m=e(N(n,m),0,h);n=e(Math.round(k.toPixels(N(f.value, +w.max),!0)||0),0,h);t&&(m=n=k.toPixels(w.max));y=Math.abs(m-n);v=Math.min(m,n);r=Math.max(m,n);k.isXAxis?(x={x:q?r:v,y:0,width:y,height:h},z||(x.x=a.plotHeight-x.x)):(x={x:0,y:q?r:v,width:h,height:y},z&&(x.y=a.plotWidth-x.y));g[u]?g[u].animate(x):g[u]=c.clipRect(x);J=b["zone-area-"+u];D=b["zone-graph-"+u];d&&D&&D.clip(g[u]);l&&J&&J.clip(g[u]);t=f.value>w.max;b.resetZones&&0===n&&(n=void 0)}),this.clips=g):b.visible&&(d&&d.show(),l&&l.show())}plotGroup(b,a,c,f,g){let e=this[b];const d=!e;c={visibility:c, +zIndex:f||.1};"undefined"===typeof this.opacity||this.chart.styledMode||"inactive"===this.state||(c.opacity=this.opacity);d&&(this[b]=e=this.chart.renderer.g().add(g));e.addClass("highcharts-"+a+" highcharts-series-"+this.index+" highcharts-"+this.type+"-series "+(l(this.colorIndex)?"highcharts-color-"+this.colorIndex+" ":"")+(this.options.className||"")+(e.hasClass("highcharts-tracker")?" highcharts-tracker":""),!0);e.attr(c)[d?"attr":"animate"](this.getPlotBox(a));return e}getPlotBox(b){let a=this.xAxis, +c=this.yAxis;const f=this.chart;b=f.inverted&&!f.polar&&a&&!1!==this.invertible&&"series"===b;f.inverted&&(a=c,c=this.xAxis);return{translateX:a?a.left:f.plotLeft,translateY:c?c.top:f.plotTop,rotation:b?90:0,rotationOriginX:b?(a.len-c.len)/2:0,rotationOriginY:b?(a.len+c.len)/2:0,scaleX:b?-1:1,scaleY:1}}removeEvents(b){b||O(this);this.eventsToUnbind.length&&(this.eventsToUnbind.forEach(function(b){b()}),this.eventsToUnbind.length=0)}render(){const b=this;var a=b.chart;const c=b.options,g=d(c.animation), +e=b.visible?"inherit":"hidden",l=c.zIndex,h=b.hasRendered;a=a.seriesGroup;let k=b.finishedAnimating?0:g.duration;f(this,"render");b.plotGroup("group","series",e,l,a);b.markerGroup=b.plotGroup("markerGroup","markers",e,l,a);!1!==c.clip&&b.setClip();b.animate&&k&&b.animate(!0);b.drawGraph&&(b.drawGraph(),b.applyZones());b.visible&&b.drawPoints();b.drawDataLabels&&b.drawDataLabels();b.redrawPoints&&b.redrawPoints();b.drawTracker&&!1!==b.options.enableMouseTracking&&b.drawTracker();b.animate&&k&&b.animate(); +h||(k&&g.defer&&(k+=g.defer),b.animationTimeout=da(function(){b.afterAnimate()},k||0));b.isDirty=!1;b.hasRendered=!0;f(b,"afterRender")}redraw(){const b=this.isDirty||this.isDirtyData;this.translate();this.render();b&&delete this.kdTree}searchPoint(b,a){const c=this.xAxis,f=this.yAxis,g=this.chart.inverted;return this.searchKDTree({clientX:g?c.len-b.chartY+c.pos:b.chartX-c.pos,plotY:g?f.len-b.chartX+f.pos:b.chartY-f.pos},a,b)}buildKDTree(b){function a(b,f,g){var e=b&&b.length;let d;if(e)return d= +c.kdAxisArray[f%g],b.sort(function(b,a){return b[d]-a[d]}),e=Math.floor(e/2),{point:b[e],left:a(b.slice(0,e),f+1,g),right:a(b.slice(e+1),f+1,g)}}this.buildingKdTree=!0;const c=this,f=-1m?"left":"right";x=0>m?"right":"left";a[w]&&(w=f(b,a[w],c+1,k),n=w[h]p;)x--;this.updateParallelArrays(w,"splice",[x,0,0]);this.updateParallelArrays(w,x);k&&w.name&&(k[p]=w.name);q.splice(x,0,b);if(n||this.processedData)this.data.splice(x,0,null),this.processData();"point"===d.legendType&&this.generatePoints();c&&(l[0]&&l[0].remove?l[0].remove(!1):(l.shift(),this.updateParallelArrays(w,"shift"),q.shift()));!1!==e&&f(this,"addPoint",{point:w});this.isDirtyData=this.isDirty=!0;a&&h.redraw(g)}removePoint(b, +a,c){const f=this,g=f.data,e=g[b],d=f.points,l=f.chart,h=function(){d&&d.length===g.length&&d.splice(b,1);g.splice(b,1);f.options.data.splice(b,1);f.updateParallelArrays(e||{series:f},"splice",[b,1]);e&&e.destroy();f.isDirty=!0;f.isDirtyData=!0;a&&l.redraw()};p(c,l);a=N(a,!0);e?e.firePointEvent("remove",null,h):h()}remove(b,a,c,g){function e(){d.destroy(g);l.isDirtyLegend=l.isDirtyBox=!0;l.linkSeries(g);N(b,!0)&&l.redraw(a)}const d=this,l=d.chart;!1!==c?f(d,"remove",null,e):e()}update(a,c){a=q(a, +this.userOptions);f(this,"update",{options:a});const e=this,d=e.chart;var l=e.userOptions;const h=e.initialType||e.type;var k=d.options.plotOptions;const m=D[h].prototype;var n=e.finishedAnimating&&{animation:!1};const x={};let w,p=["eventOptions","navigatorSeries","baseSeries"],z=a.type||l.type||d.options.chart.type;const y=!(this.hasDerivedData||z&&z!==this.type||"undefined"!==typeof a.pointStart||"undefined"!==typeof a.pointInterval||"undefined"!==typeof a.relativeXValue||a.joinBy||a.mapData|| +e.hasOptionChanged("dataGrouping")||e.hasOptionChanged("pointStart")||e.hasOptionChanged("pointInterval")||e.hasOptionChanged("pointIntervalUnit")||e.hasOptionChanged("keys"));z=z||h;y&&(p.push("data","isDirtyData","points","processedData","processedXData","processedYData","xIncrement","cropped","_hasPointMarkers","_hasPointLabels","clips","nodes","layout","level","mapMap","mapData","minY","maxY","minX","maxX"),!1!==a.visible&&p.push("area","graph"),e.parallelArrays.forEach(function(b){p.push(b+"Data")}), +a.data&&(a.dataSorting&&b(e.options.dataSorting,a.dataSorting),this.setData(a.data,!1)));a=S(l,n,{index:"undefined"===typeof l.index?e.index:l.index,pointStart:N(k&&k.series&&k.series.pointStart,l.pointStart,e.xData[0])},!y&&{data:e.options.data},a);y&&a.data&&(a.data=e.options.data);p=["group","markerGroup","dataLabelsGroup","transformGroup"].concat(p);p.forEach(function(b){p[b]=e[b];delete e[b]});k=!1;if(D[z]){if(k=z!==e.type,e.remove(!1,!1,!1,!0),k)if(Object.setPrototypeOf)Object.setPrototypeOf(e, +D[z].prototype);else{n=Object.hasOwnProperty.call(e,"hcEvents")&&e.hcEvents;for(w in m)e[w]=void 0;b(e,D[z].prototype);n?e.hcEvents=n:delete e.hcEvents}}else g(17,!0,d,{missingModuleFor:z});p.forEach(function(b){e[b]=p[b]});e.init(d,a);if(y&&this.points){a=e.options;if(!1===a.visible)x.graphic=1,x.dataLabel=1;else if(!e._hasPointLabels){const {marker:b,dataLabels:c}=a;l=l.marker||{};!b||!1!==b.enabled&&l.symbol===b.symbol&&l.height===b.height&&l.width===b.width||(x.graphic=1);c&&!1===c.enabled&&(x.dataLabel= +1)}for(const b of this.points)b&&b.series&&(b.resolveColor(),Object.keys(x).length&&b.destroyElements(x),!1===a.showInLegend&&b.legendItem&&d.legend.destroyItem(b))}e.initialType=h;d.linkSeries();k&&e.linkedSeries.length&&(e.isDirtyData=!0);f(this,"afterUpdate");N(c,!0)&&d.redraw(y?void 0:!1)}setName(b){this.name=this.options.name=this.userOptions.name=b;this.chart.isDirtyLegend=!0}hasOptionChanged(b){const a=this.options[b],c=this.chart.options.plotOptions,f=this.userOptions[b];return f?a!==f:a!== +N(c&&c[this.type]&&c[this.type][b],c&&c.series&&c.series[b],a)}onMouseOver(){const b=this.chart,a=b.hoverSeries;b.pointer.setHoverChartIndex();if(a&&a!==this)a.onMouseOut();this.options.events.mouseOver&&f(this,"mouseOver");this.setState("hover");b.hoverSeries=this}onMouseOut(){const b=this.options,a=this.chart,c=a.tooltip,g=a.hoverPoint;a.hoverSeries=null;if(g)g.onMouseOut();this&&b.events.mouseOut&&f(this,"mouseOut");!c||this.stickyTracking||c.shared&&!this.noSharedTooltip||c.hide();a.series.forEach(function(b){b.setState("", +!0)})}setState(b,a){const c=this;var f=c.options;const g=c.graph,e=f.inactiveOtherPoints,d=f.states,l=N(d[b||"normal"]&&d[b||"normal"].animation,c.chart.options.chart.animation);let h=f.lineWidth,k=0,q=f.opacity;b=b||"";if(c.state!==b&&([c.group,c.markerGroup,c.dataLabelsGroup].forEach(function(a){a&&(c.state&&a.removeClass("highcharts-series-"+c.state),b&&a.addClass("highcharts-series-"+b))}),c.state=b,!c.chart.styledMode)){if(d[b]&&!1===d[b].enabled)return;b&&(h=d[b].lineWidth||h+(d[b].lineWidthPlus|| +0),q=N(d[b].opacity,q));if(g&&!g.dashstyle&&z(h))for(f={"stroke-width":h},g.animate(f,l);c["zone-graph-"+k];)c["zone-graph-"+k].animate(f,l),k+=1;e||[c.group,c.markerGroup,c.dataLabelsGroup,c.labelBySeries].forEach(function(b){b&&b.animate({opacity:q},l)})}a&&e&&c.points&&c.setAllPointsToState(b||void 0)}setAllPointsToState(b){this.points.forEach(function(a){a.setState&&a.setState(b)})}setVisible(b,a){const c=this,g=c.chart,e=g.options.chart.ignoreHiddenSeries,d=c.visible,l=(c.visible=b=c.options.visible= +c.userOptions.visible="undefined"===typeof b?!d:b)?"show":"hide";["group","dataLabelsGroup","markerGroup","tracker","tt"].forEach(function(b){if(c[b])c[b][l]()});if(g.hoverSeries===c||(g.hoverPoint&&g.hoverPoint.series)===c)c.onMouseOut();c.legendItem&&g.legend.colorizeItem(c,b);c.isDirty=!0;c.options.stacking&&g.series.forEach(function(b){b.options.stacking&&b.visible&&(b.isDirty=!0)});c.linkedSeries.forEach(function(a){a.setVisible(b,!1)});e&&(g.isDirtyBox=!0);f(c,l);!1!==a&&g.redraw()}show(){this.setVisible(!0)}hide(){this.setVisible(!1)}select(b){this.selected= +b=this.options.selected="undefined"===typeof b?!this.selected:b;this.checkbox&&(this.checkbox.checked=b);f(this,b?"select":"unselect")}shouldShowTooltip(b,a,c={}){c.series=this;c.visiblePlotOnly=!0;return this.chart.isInsidePlot(b,a,c)}drawLegendSymbol(b,a){var c;null===(c=F[this.options.legendSymbol||"rectangle"])||void 0===c?void 0:c.call(this,b,a)}}W.defaultOptions=C;W.types=B.seriesTypes;W.registerType=B.registerSeriesType;b(W.prototype,{axisTypes:["xAxis","yAxis"],coll:"series",colorCounter:0, +cropShoulder:1,directTouch:!1,isCartesian:!0,kdAxisArray:["clientX","plotY"],parallelArrays:["x","y"],pointClass:G,requireSorting:!0,sorted:!0});B.series=W;"";"";return W});M(a,"Extensions/ScrollablePlotArea.js",[a["Core/Animation/AnimationUtilities.js"],a["Core/Axis/Axis.js"],a["Core/Chart/Chart.js"],a["Core/Series/Series.js"],a["Core/Renderer/RendererRegistry.js"],a["Core/Utilities.js"]],function(a,A,H,I,F,G){const {stop:u}=a,{addEvent:B,createElement:t,defined:r,merge:d,pick:p}=G;B(H,"afterSetChartSize", +function(a){var k=this.options.chart.scrollablePlotArea,m=k&&k.minWidth;k=k&&k.minHeight;let n;if(!this.renderer.forExport){if(m){if(this.scrollablePixelsX=m=Math.max(0,m-this.chartWidth))this.scrollablePlotBox=this.renderer.scrollablePlotBox=d(this.plotBox),this.plotBox.width=this.plotWidth+=m,this.inverted?this.clipBox.height+=m:this.clipBox.width+=m,n={1:{name:"right",value:m}}}else k&&(this.scrollablePixelsY=m=Math.max(0,k-this.chartHeight),r(m)&&(this.scrollablePlotBox=this.renderer.scrollablePlotBox= +d(this.plotBox),this.plotBox.height=this.plotHeight+=m,this.inverted?this.clipBox.width+=m:this.clipBox.height+=m,n={2:{name:"bottom",value:m}}));n&&!a.skipAxes&&this.axes.forEach(function(a){n[a.side]?a.getPlotLinePath=function(){let d=n[a.side].name,h=this[d],k;this[d]=h-n[a.side].value;k=A.prototype.getPlotLinePath.apply(this,arguments);this[d]=h;return k}:(a.setAxisSize(),a.setAxisTranslation())})}});B(H,"render",function(){this.scrollablePixelsX||this.scrollablePixelsY?(this.setUpScrolling&& +this.setUpScrolling(),this.applyFixed()):this.fixedDiv&&this.applyFixed()});H.prototype.setUpScrolling=function(){const a={WebkitOverflowScrolling:"touch",overflowX:"hidden",overflowY:"hidden"};this.scrollablePixelsX&&(a.overflowX="auto");this.scrollablePixelsY&&(a.overflowY="auto");this.scrollingParent=t("div",{className:"highcharts-scrolling-parent"},{position:"relative"},this.renderTo);this.scrollingContainer=t("div",{className:"highcharts-scrolling"},a,this.scrollingParent);let d;B(this.scrollingContainer, +"scroll",()=>{this.pointer&&(delete this.pointer.chartPosition,this.hoverPoint&&(d=this.hoverPoint),this.pointer.runPointActions(void 0,d,!0))});this.innerContainer=t("div",{className:"highcharts-inner-container"},null,this.scrollingContainer);this.innerContainer.appendChild(this.container);this.setUpScrolling=null};H.prototype.moveFixedElements=function(){let a=this.container,d=this.fixedRenderer,p=".highcharts-breadcrumbs-group .highcharts-contextbutton .highcharts-credits .highcharts-legend .highcharts-legend-checkbox .highcharts-navigator-series .highcharts-navigator-xaxis .highcharts-navigator-yaxis .highcharts-navigator .highcharts-reset-zoom .highcharts-drillup-button .highcharts-scrollbar .highcharts-subtitle .highcharts-title".split(" "), +n;this.scrollablePixelsX&&!this.inverted?n=".highcharts-yaxis":this.scrollablePixelsX&&this.inverted?n=".highcharts-xaxis":this.scrollablePixelsY&&!this.inverted?n=".highcharts-xaxis":this.scrollablePixelsY&&this.inverted&&(n=".highcharts-yaxis");n&&p.push(`${n}:not(.highcharts-radial-axis)`,`${n}-labels:not(.highcharts-radial-axis-labels)`);p.forEach(function(h){[].forEach.call(a.querySelectorAll(h),function(a){(a.namespaceURI===d.SVG_NS?d.box:d.box.parentNode).appendChild(a);a.style.pointerEvents= +"auto"})})};H.prototype.applyFixed=function(){var a=!this.fixedDiv,d=this.options.chart,r=d.scrollablePlotArea,n=F.getRendererType();a?(this.fixedDiv=t("div",{className:"highcharts-fixed"},{position:"absolute",overflow:"hidden",pointerEvents:"none",zIndex:(d.style&&d.style.zIndex||0)+2,top:0},null,!0),this.scrollingContainer&&this.scrollingContainer.parentNode.insertBefore(this.fixedDiv,this.scrollingContainer),this.renderTo.style.overflow="visible",this.fixedRenderer=d=new n(this.fixedDiv,this.chartWidth, +this.chartHeight,this.options.chart.style),this.scrollableMask=d.path().attr({fill:this.options.chart.backgroundColor||"#fff","fill-opacity":p(r.opacity,.85),zIndex:-1}).addClass("highcharts-scrollable-mask").add(),B(this,"afterShowResetZoom",this.moveFixedElements),B(this,"afterApplyDrilldown",this.moveFixedElements),B(this,"afterLayOutTitles",this.moveFixedElements)):this.fixedRenderer.setSize(this.chartWidth,this.chartHeight);if(this.scrollableDirty||a)this.scrollableDirty=!1,this.moveFixedElements(); +d=this.chartWidth+(this.scrollablePixelsX||0);n=this.chartHeight+(this.scrollablePixelsY||0);u(this.container);this.container.style.width=d+"px";this.container.style.height=n+"px";this.renderer.boxWrapper.attr({width:d,height:n,viewBox:[0,0,d,n].join(" ")});this.chartBackground.attr({width:d,height:n});this.scrollingContainer.style.height=this.chartHeight+"px";a&&(r.scrollPositionX&&(this.scrollingContainer.scrollLeft=this.scrollablePixelsX*r.scrollPositionX),r.scrollPositionY&&(this.scrollingContainer.scrollTop= +this.scrollablePixelsY*r.scrollPositionY));n=this.axisOffset;a=this.plotTop-n[0]-1;r=this.plotLeft-n[3]-1;d=this.plotTop+this.plotHeight+n[2]+1;n=this.plotLeft+this.plotWidth+n[1]+1;let h=this.plotLeft+this.plotWidth-(this.scrollablePixelsX||0),D=this.plotTop+this.plotHeight-(this.scrollablePixelsY||0);a=this.scrollablePixelsX?[["M",0,a],["L",this.plotLeft-1,a],["L",this.plotLeft-1,d],["L",0,d],["Z"],["M",h,a],["L",this.chartWidth,a],["L",this.chartWidth,d],["L",h,d],["Z"]]:this.scrollablePixelsY? +[["M",r,0],["L",r,this.plotTop-1],["L",n,this.plotTop-1],["L",n,0],["Z"],["M",r,D],["L",r,this.chartHeight],["L",n,this.chartHeight],["L",n,D],["Z"]]:[["M",0,0]];"adjustHeight"!==this.redrawTrigger&&this.scrollableMask.attr({d:a})};B(A,"afterInit",function(){this.chart.scrollableDirty=!0});B(I,"show",function(){this.chart.scrollableDirty=!0});""});M(a,"Core/Axis/Stacking/StackItem.js",[a["Core/FormatUtilities.js"],a["Core/Series/SeriesRegistry.js"],a["Core/Utilities.js"]],function(a,A,H){const {format:u}= +a,{series:F}=A,{destroyObjectProperties:G,fireEvent:C,isNumber:B,pick:t}=H;class r{constructor(a,p,m,k,r){const d=a.chart.inverted,h=a.reversed;this.axis=a;a=this.isNegative=!!m!==!!h;this.options=p=p||{};this.x=k;this.cumulative=this.total=null;this.points={};this.hasValidPoints=!1;this.stack=r;this.rightCliff=this.leftCliff=0;this.alignOptions={align:p.align||(d?a?"left":"right":"center"),verticalAlign:p.verticalAlign||(d?"middle":a?"bottom":"top"),y:p.y,x:p.x};this.textAlign=p.textAlign||(d?a? +"right":"left":"center")}destroy(){G(this,this.axis)}render(a){const d=this.axis.chart,m=this.options;var k=m.format;k=k?u(k,this,d):m.formatter.call(this);this.label?this.label.attr({text:k,visibility:"hidden"}):(this.label=d.renderer.label(k,null,void 0,m.shape,void 0,void 0,m.useHTML,!1,"stack-labels"),k={r:m.borderRadius||0,text:k,padding:t(m.padding,5),visibility:"hidden"},d.styledMode||(k.fill=m.backgroundColor,k.stroke=m.borderColor,k["stroke-width"]=m.borderWidth,this.label.css(m.style||{})), +this.label.attr(k),this.label.added||this.label.add(a));this.label.labelrank=d.plotSizeY;C(this,"afterRender")}setOffset(a,p,m,k,r,n){const {alignOptions:d,axis:v,label:u,options:E,textAlign:e}=this,q=v.chart;m=this.getStackBox({xOffset:a,width:p,boxBottom:m,boxTop:k,defaultX:r,xAxis:n});var {verticalAlign:y}=d;if(u&&m){k=u.getBBox();r=u.padding;n="justify"===t(E.overflow,"justify");d.x=E.x||0;d.y=E.y||0;const {x:a,y:h}=this.adjustStackPosition({labelBox:k,verticalAlign:y,textAlign:e});m.x-=a;m.y-= +h;u.align(d,!1,m);(y=q.isInsidePlot(u.alignAttr.x+d.x+a,u.alignAttr.y+d.y+h))||(n=!1);n&&F.prototype.justifyDataLabel.call(v,u,d,u.alignAttr,k,m);u.attr({x:u.alignAttr.x,y:u.alignAttr.y,rotation:E.rotation,rotationOriginX:k.width/2,rotationOriginY:k.height/2});t(!n&&E.crop,!0)&&(y=B(u.x)&&B(u.y)&&q.isInsidePlot(u.x-r+u.width,u.y)&&q.isInsidePlot(u.x+r,u.y));u[y?"show":"hide"]()}C(this,"afterSetOffset",{xOffset:a,width:p})}adjustStackPosition({labelBox:a,verticalAlign:p,textAlign:m}){const d={bottom:0, +middle:1,top:2,right:1,center:0,left:-1};return{x:a.width/2+a.width/2*d[m],y:a.height/2*d[p]}}getStackBox(a){var d=this.axis;const m=d.chart,{boxTop:k,defaultX:r,xOffset:n,width:h,boxBottom:D}=a;var u=d.stacking.usePercentage?100:t(k,this.total,0);u=d.toPixels(u);a=a.xAxis||m.xAxis[0];const E=t(r,a.translate(this.x))+n;d=d.toPixels(D||B(d.min)&&d.logarithmic&&d.logarithmic.lin2log(d.min)||0);d=Math.abs(u-d);const e=this.isNegative;return m.inverted?{x:(e?u:u-d)-m.plotLeft,y:a.height-E-h,width:d,height:h}: +{x:E+a.transB-m.plotLeft,y:(e?u-d:u)-m.plotTop,width:h,height:d}}}"";return r});M(a,"Core/Axis/Stacking/StackingAxis.js",[a["Core/Animation/AnimationUtilities.js"],a["Core/Axis/Axis.js"],a["Core/Series/SeriesRegistry.js"],a["Core/Axis/Stacking/StackItem.js"],a["Core/Utilities.js"]],function(a,A,H,I,F){function u(){const b=this,a=b.inverted;b.yAxis.forEach(b=>{b.stacking&&b.stacking.stacks&&b.hasVisibleSeries&&(b.stacking.oldStacks=b.stacking.stacks)});b.series.forEach(c=>{const f=c.xAxis&&c.xAxis.options|| +{};!c.options.stacking||!0!==c.visible&&!1!==b.options.chart.ignoreHiddenSeries||(c.stackKey=[c.type,l(c.options.stack,""),a?f.top:f.left,a?f.height:f.width].join())})}function C(){const b=this.stacking;if(b){var a=b.stacks;y(a,function(b,c){L(b);a[c]=null});b&&b.stackTotalGroup&&b.stackTotalGroup.destroy()}}function B(){"yAxis"!==this.coll||this.stacking||(this.stacking=new w(this))}function t(b,a,f,g){!D(b)||b.x!==a||g&&b.stackKey!==g?b={x:a,index:0,key:g,stackKey:g}:b.index++;b.key=[f,a,b.index].join(); +return b}function r(){const b=this,a=b.stackKey,f=b.yAxis.stacking.stacks,g=b.processedXData,e=b[b.options.stacking+"Stacker"];let d;e&&[a,"-"+a].forEach(a=>{let c=g.length;let l;for(;c--;){var h=g[c];d=b.getStackIndicator(d,h,b.index,a);(l=(h=f[a]&&f[a][h])&&h.points[d.key])&&e.call(b,l,h,c)}})}function d(b,a,f){a=a.total?100/a.total:0;b[0]=h(b[0]*a);b[1]=h(b[1]*a);this.stackedYData[f]=b[1]}function p(){const b=this.yAxis.stacking;this.options.centerInCategory&&(this.is("column")||this.is("columnrange"))&& +!this.options.stacking&&1{"group"===f.slice(-5)&&(y(a,b=>b.destroy()),delete b.stacks[f])})}function m(b){var a=this.chart;const f=b||this.options.stacking;if(f&&(!0===this.visible||!1===a.options.chart.ignoreHiddenSeries)){var g=this.processedXData,d=this.processedYData,k=[],q=d.length,m=this.options,n=m.threshold,w=l(m.startFromThreshold&&n,0);m=m.stack;b=b?`${this.type},${f}`:this.stackKey;var p="-"+b,y=this.negStacks; +a="group"===f?a.yAxis[0]:this.yAxis;var r=a.stacking.stacks,v=a.stacking.oldStacks,u,t;a.stacking.stacksTouched+=1;for(t=0;t{y(b,(a,f)=>{q(a.touched)&&a.touchedm&&u.shadow));p&&(p.startX=t.xMap,p.isArea=t.isArea)})}getGraphPath(a,B,t){const r= +this,d=r.options,p=[],m=[];let k,v=d.step;a=a||r.points;const n=a.reversed;n&&a.reverse();(v={right:1,center:2}[v]||v&&3)&&n&&(v=4-v);a=this.getValidPoints(a,!1,!(d.connectNulls&&!B&&!t));a.forEach(function(h,n){const D=h.plotX,E=h.plotY,e=a[n-1],q=h.isNull||"number"!==typeof E;(h.leftCliff||e&&e.rightCliff)&&!t&&(k=!0);q&&!u(B)&&0a.visible);k.forEach(function(a,w){let g=0,b,c;if(u[a]&&!u[a].isNull)m.push(u[a]),[-1,1].forEach(function(f){const g=1===f?"rightNull":"leftNull",l=h[k[w+f]];let m=0;if(l){let f=q;for(;0<=f&&fa&&k>d?(k=Math.max(a,d),v=2*d-k):kt&&v>d?(v=Math.max(t,d),k=2*d-v):v=Math.abs(e)&&.5{if("number"===typeof d.x){const e=a[d.x.toString()];e&&(a=e.points[this.index],g?(a&&(c=f),e.hasValidPoints&&(b?f++:f--)):n(a)&&(a=Object.keys(e.points).filter(b=>!b.match(",")&&e.points[b]&&1a-b),c=a.indexOf(this.index),f=a.length))}});a=(d.plotX||0)+((f-1)*h.paddedWidth+e)/2-e-c*h.paddedWidth}return a}translate(){const a=this,e=a.chart,d=a.options;var k=a.dense=2>a.closestPointRange*a.xAxis.transA;k=a.borderWidth=L(d.borderWidth,k?0:1);const g= +a.xAxis,b=a.yAxis,c=d.threshold,f=L(d.minPointLength,5),n=a.getColumnMetrics(),r=n.width,z=a.pointXOffset=n.offset,u=a.dataMin,t=a.dataMax;let D=a.barW=Math.max(r,1+2*k),E=a.translatedThreshold=b.getThreshold(c);e.inverted&&(E-=.5);d.pointPadding&&(D=Math.ceil(D));F.prototype.translate.apply(a);a.points.forEach(function(l){const k=L(l.yBottom,E);var q=999+Math.abs(k),x=l.plotX||0;q=p(l.plotY,-q,b.len+q);let w=Math.min(q,k),y=Math.max(q,k)-w,J=r,v=x+z,N=D;f&&Math.abs(y)f?k-f:E-(x?f:0));m(l.options.pointWidth)&&(J=N=Math.ceil(l.options.pointWidth),v-=Math.round((J-r)/2));d.centerInCategory&&(v=a.adjustForMissingColumns(v,J,l,n));l.barX=v;l.pointWidth=J;l.tooltipPos=e.inverted?[p(b.len+b.pos-e.plotLeft-q,b.pos-e.plotLeft,b.len+b.pos-e.plotLeft),g.len+g.pos-e.plotTop-v-N/2,y]:[g.left-e.plotLeft+v+N/2,p(q+b.pos-e.plotTop,b.pos-e.plotTop,b.len+b.pos-e.plotTop), +y];l.shapeType=a.pointClass.prototype.shapeType||"roundedRect";l.shapeArgs=a.crispCol(v,l.isNull?E:w,N,l.isNull?0:y)});v(this,"afterColumnTranslate")}drawGraph(){this.group[this.dense?"addClass":"removeClass"]("highcharts-dense-data")}pointAttribs(a,e){const d=this.options;var h=this.pointAttrToOptions||{},g=h.stroke||"borderColor";const b=h["stroke-width"]||"borderWidth";let c,f=a&&a.color||this.color,k=a&&a[g]||d[g]||f;h=a&&a.options.dashStyle||d.dashStyle;let m=a&&a[b]||d[b]||this[b]||0,q=L(a&& +a.opacity,d.opacity,1);a&&this.zones.length&&(c=a.getZone(),f=a.options.color||c&&(c.color||a.nonZonedColor)||this.color,c&&(k=c.borderColor||k,h=c.dashStyle||h,m=c.borderWidth||m));e&&a&&(a=D(d.states[e],a.options.states&&a.options.states[e]||{}),e=a.brightness,f=a.color||"undefined"!==typeof e&&t(f).brighten(a.brightness).get()||f,k=a[g]||k,m=a[b]||m,h=a.dashStyle||h,q=L(a.opacity,q));g={fill:f,stroke:k,"stroke-width":m,opacity:q};h&&(g.dashstyle=h);return g}drawPoints(a=this.points){const e=this, +d=this.chart,k=e.options,g=d.renderer,b=k.animationLimit||250;let c;a.forEach(function(a){let f=a.graphic,l=!!f,m=f&&d.pointCount"===b&&a>c||"<"===b&&a="===b&& +a>=c||"<="===b&&a<=c||"=="===b&&a==c||"==="===b&&a===c?!0:!1):!0}function v(){return this.plotGroup("dataLabelsGroup","data-labels",this.hasRendered?"inherit":"hidden",this.options.dataLabels.zIndex||6)}function E(a){const b=this.hasRendered||0,c=this.initDataLabelsGroup().attr({opacity:+b});!b&&c&&(this.visible&&c.show(),this.options.animation?c.animate({opacity:1},a):c.attr({opacity:1}));return c}function e(a=this.points){const b=this,c=b.chart,f=b.options,g=c.renderer,{backgroundColor:e,plotBackgroundColor:d}= +c.options.chart,l=g.getContrast(r(d)&&d||r(e)&&e||"#000000");let h=f.dataLabels,q,w;var v=k(h)[0];const D=v.animation;v=v.defer?u(c,D,b):{defer:0,duration:0};h=y(y(c.options.plotOptions&&c.options.plotOptions.series&&c.options.plotOptions.series.dataLabels,c.options.plotOptions&&c.options.plotOptions[b.type]&&c.options.plotOptions[b.type].dataLabels),h);B(this,"drawDataLabels");if(t(h)||h.enabled||b._hasPointLabels)w=this.initDataLabels(v),a.forEach(a=>{q=k(y(h,a.dlOptions||a.options&&a.options.dataLabels)); +q.forEach((e,d)=>{const h=e.enabled&&(!a.isNull||a.dataLabelOnNull)&&n(a,e),k=a.connectors?a.connectors[d]:a.connector;let q,x,r=a.dataLabels?a.dataLabels[d]:a.dataLabel,z=!r;const y=m(e.distance,a.labelDistance);if(h){var v=a.getLabelConfig();var u=m(e[a.formatPrefix+"Format"],e.format);v=G(u)?F(u,v,c):(e[a.formatPrefix+"Formatter"]||e.formatter).call(v,e);u=e.style;q=e.rotation;c.styledMode||(u.color=m(e.color,u.color,b.color,"#000000"),"contrast"===u.color?(a.contrastColor=g.getContrast(a.color|| +b.color),u.color=!G(y)&&e.inside||0>y||f.stacking?a.contrastColor:l):delete a.contrastColor,f.cursor&&(u.cursor=f.cursor));x={r:e.borderRadius||0,rotation:q,padding:e.padding,zIndex:1};if(!c.styledMode){const {backgroundColor:b,borderColor:c}=e;x.fill="auto"===b?a.color:b;x.stroke="auto"===c?a.color:c;x["stroke-width"]=e.borderWidth}p(x,function(b,a){"undefined"===typeof b&&delete x[a]})}!r||h&&G(v)&&!!r.div===!!e.useHTML&&(r.rotation&&e.rotation||r.rotation===e.rotation)||(z=!0,a.dataLabel=r=a.dataLabel&& +a.dataLabel.destroy(),a.dataLabels&&(1===a.dataLabels.length?delete a.dataLabels:delete a.dataLabels[d]),d||delete a.dataLabel,k&&(a.connector=a.connector.destroy(),a.connectors&&(1===a.connectors.length?delete a.connectors:delete a.connectors[d])));h&&G(v)?(r?x.text=v:(a.dataLabels=a.dataLabels||[],r=a.dataLabels[d]=q?g.text(v,0,0,e.useHTML).addClass("highcharts-data-label"):g.label(v,0,0,e.shape,null,null,e.useHTML,null,"data-label"),d||(a.dataLabel=r),r.addClass(" highcharts-data-label-color-"+ +a.colorIndex+" "+(e.className||"")+(e.useHTML?" highcharts-tracker":""))),r.options=e,r.attr(x),c.styledMode||r.css(u).shadow(e.shadow),(d=e[a.formatPrefix+"TextPath"]||e.textPath)&&!e.useHTML&&(r.setTextPath(a.getDataLabelPath&&a.getDataLabelPath(r)||a.graphic,d),a.dataLabelPath&&!d.enabled&&(a.dataLabelPath=a.dataLabelPath.destroy())),r.added||r.add(w),b.alignDataLabel(a,r,e,null,z)):r&&r.hide()})});B(this,"afterDrawDataLabels")}function q(a,b,c,f,e,d){const g=this.chart,l=b.align,h=b.verticalAlign, +k=a.box?0:a.padding||0;let {x:m=0,y:q=0}=b,n,x;n=(c.x||0)+k;0>n&&("right"===l&&0<=m?(b.align="left",b.inside=!0):m-=n,x=!0);n=(c.x||0)+f.width-k;n>g.plotWidth&&("left"===l&&0>=m?(b.align="right",b.inside=!0):m+=g.plotWidth-n,x=!0);n=c.y+k;0>n&&("bottom"===h&&0<=q?(b.verticalAlign="top",b.inside=!0):q-=n,x=!0);n=(c.y||0)+f.height-k;n>g.plotHeight&&("top"===h&&0>=q?(b.verticalAlign="bottom",b.inside=!0):q+=g.plotHeight-n,x=!0);x&&(b.x=m,b.y=q,a.placed=!d,a.align(b,void 0,e));return x}function y(a,b){let c= +[],f;if(t(a)&&!t(b))c=a.map(function(a){return d(a,b)});else if(t(b)&&!t(a))c=b.map(function(b){return d(a,b)});else if(t(a)||t(b))for(f=Math.max(a.length,b.length);f--;)c[f]=d(a[f],b[f]);else c=d(a,b);return c}function l(a,b,c,f,e){const g=this.chart,d=g.inverted,l=this.xAxis,h=l.reversed,k=d?b.height/2:b.width/2;a=(a=a.pointWidth)?a/2:0;b.startXPos=d?e.x:h?-k-a:l.width-k+a;b.startYPos=d?h?this.yAxis.height-k+a:-k-a:e.y;f?"hidden"===b.visibility&&(b.show(),b.attr({opacity:0}).animate({opacity:1})): +b.attr({opacity:1}).animate({opacity:0},void 0,b.hide);g.hasRendered&&(c&&b.attr({x:b.startXPos,y:b.startYPos}),b.placed=!0)}const w=[];a.compose=function(a){H.pushUnique(w,a)&&(a=a.prototype,a.initDataLabelsGroup=v,a.initDataLabels=E,a.alignDataLabel=h,a.drawDataLabels=e,a.justifyDataLabel=q,a.setDataLabelStartPos=l)}})(v||(v={}));"";return v});M(a,"Series/Column/ColumnDataLabel.js",[a["Core/Series/DataLabel.js"],a["Core/Series/SeriesRegistry.js"],a["Core/Utilities.js"]],function(a,A,H){const {series:u}= +A,{merge:F,pick:G}=H;var C;(function(B){function t(a,p,m,k,r){let d=this.chart.inverted;var h=a.series;let v=(h.xAxis?h.xAxis.len:this.chart.plotSizeX)||0;h=(h.yAxis?h.yAxis.len:this.chart.plotSizeY)||0;var t=a.dlBox||a.shapeArgs;let E=G(a.below,a.plotY>G(this.translatedThreshold,h)),e=G(m.inside,!!this.options.stacking);t&&(k=F(t),0>k.y&&(k.height+=k.y,k.y=0),t=k.y+k.height-h,0\u25cf {series.name}
', +pointFormat:"x: {point.x}
y: {point.y}
"}}});M(a,"Series/Scatter/ScatterSeries.js",[a["Series/Scatter/ScatterSeriesDefaults.js"],a["Core/Series/SeriesRegistry.js"],a["Core/Utilities.js"]],function(a,A,H){const {column:u,line:F}=A.seriesTypes,{addEvent:G,extend:C,merge:B}=H;class t extends F{constructor(){super(...arguments);this.points=this.options=this.data=void 0}applyJitter(){const a=this,d=this.options.jitter,p=this.points.length;d&&this.points.forEach(function(m,k){["x", +"y"].forEach(function(r,n){let h="plot"+r.toUpperCase(),v,u;if(d[r]&&!m.isNull){var t=a[r+"Axis"];u=d[r]*t.transA;t&&!t.isLog&&(v=Math.max(0,m[h]-u),t=Math.min(t.len,m[h]+u),n=1E4*Math.sin(k+n*p),n-=Math.floor(n),m[h]=v+(t-v)*n,"x"===r&&(m.clientX=m.plotX))}})})}drawGraph(){this.options.lineWidth?super.drawGraph():this.graph&&(this.graph=this.graph.destroy())}}t.defaultOptions=B(F.defaultOptions,a);C(t.prototype,{drawTracker:u.prototype.drawTracker,sorted:!1,requireSorting:!1,noSharedTooltip:!0,trackerGroups:["group", +"markerGroup","dataLabelsGroup"],takeOrdinalPosition:!1});G(t,"afterTranslate",function(){this.applyJitter()});A.registerSeriesType("scatter",t);return t});M(a,"Series/CenteredUtilities.js",[a["Core/Globals.js"],a["Core/Series/Series.js"],a["Core/Utilities.js"]],function(a,A,H){const {deg2rad:u}=a,{fireEvent:F,isNumber:G,pick:C,relativeLength:B}=H;var t;(function(a){a.getCenter=function(){var a=this.options,p=this.chart;const m=2*(a.slicedOffset||0),k=p.plotWidth-2*m,r=p.plotHeight-2*m;var n=a.center; +const h=Math.min(k,r),u=a.thickness;var t=a.size;let E=a.innerSize||0;"string"===typeof t&&(t=parseFloat(t));"string"===typeof E&&(E=parseFloat(E));a=[C(n[0],"50%"),C(n[1],"50%"),C(t&&0>t?void 0:a.size,"100%"),C(E&&0>E?void 0:a.innerSize||0,"0%")];!p.angular||this instanceof A||(a[3]=0);for(n=0;4>n;++n)t=a[n],p=2>n||2===n&&/%$/.test(t),a[n]=B(t,[k,r,h,a[2]][n])+(p?m:0);a[3]>a[2]&&(a[3]=a[2]);G(u)&&2*ua&&360>p-a?p:a+360;return{start:u*(a+-90),end:u*(p+-90)}}})(t||(t={}));"";return t});M(a,"Series/Pie/PiePoint.js",[a["Core/Animation/AnimationUtilities.js"],a["Core/Series/Point.js"],a["Core/Utilities.js"]],function(a,A,H){const {setAnimation:u}=a,{addEvent:F,defined:G,extend:C,isNumber:B,pick:t,relativeLength:r}=H;class d extends A{constructor(){super(...arguments);this.series=this.options=this.labelDistance=void 0}getConnectorPath(){const a=this.labelPosition, +d=this.series.options.dataLabels,k=this.connectorShapes;let r=d.connectorShape;k[r]&&(r=k[r]);return r.call(this,{x:a.computed.x,y:a.computed.y,alignment:a.alignment},a.connectorPosition,d)}getTranslate(){return this.sliced?this.slicedTranslation:{translateX:0,translateY:0}}haloPath(a){const d=this.shapeArgs;return this.sliced||!this.visible?[]:this.series.chart.renderer.symbols.arc(d.x,d.y,d.r+a,d.r+a,{innerR:d.r-1,start:d.start,end:d.end,borderRadius:d.borderRadius})}init(){super.init.apply(this, +arguments);this.name=t(this.name,"Slice");const a=a=>{this.slice("select"===a.type)};F(this,"select",a);F(this,"unselect",a);return this}isValid(){return B(this.y)&&0<=this.y}setVisible(a,d){const k=this.series,m=k.chart,n=k.options.ignoreHiddenPoint;d=t(d,n);a!==this.visible&&(this.visible=this.options.visible=a="undefined"===typeof a?!this.visible:a,k.options.data[k.data.indexOf(this)]=this.options,["graphic","dataLabel","connector"].forEach(d=>{if(this[d])this[d][a?"show":"hide"](a)}),this.legendItem&& +m.legend.colorizeItem(this,a),a||"hover"!==this.state||this.setState(""),n&&(k.isDirty=!0),d&&m.redraw())}slice(a,d,k){const m=this.series;u(k,m.chart);t(d,!0);this.sliced=this.options.sliced=G(a)?a:!this.sliced;m.options.data[m.data.indexOf(this)]=this.options;this.graphic&&this.graphic.animate(this.getTranslate())}}C(d.prototype,{connectorShapes:{fixedOffset:function(a,d,k){const m=d.breakAt;d=d.touchingSliceAt;return[["M",a.x,a.y],k.softConnector?["C",a.x+("left"===a.alignment?-5:5),a.y,2*m.x- +d.x,2*m.y-d.y,m.x,m.y]:["L",m.x,m.y],["L",d.x,d.y]]},straight:function(a,d){d=d.touchingSliceAt;return[["M",a.x,a.y],["L",d.x,d.y]]},crookedLine:function(a,d,k){const {breakAt:m,touchingSliceAt:n}=d;({series:d}=this);const [h,p,u]=d.center,t=u/2,e=d.chart.plotWidth,q=d.chart.plotLeft;d="left"===a.alignment;const {x:y,y:l}=a;k.crookDistance?(a=r(k.crookDistance,1),a=d?h+t+(e+q-h-t)*(1-a):q+(h-t)*a):a=h+(p-l)*Math.tan((this.angle||0)-Math.PI/2);k=[["M",y,l]];(d?a<=y&&a>=m.x:a>=y&&a<=m.x)&&k.push(["L", +a,l]);k.push(["L",m.x,m.y],["L",n.x,n.y]);return k}}});return d});M(a,"Series/Pie/PieSeriesDefaults.js",[],function(){"";return{borderRadius:3,center:[null,null],clip:!1,colorByPoint:!0,dataLabels:{allowOverlap:!0,connectorPadding:5,connectorShape:"crookedLine",crookDistance:void 0,distance:30,enabled:!0,formatter:function(){return this.point.isNull?void 0:this.point.name},softConnector:!0,x:0},fillColor:void 0,ignoreHiddenPoint:!0,inactiveOtherPoints:!0,legendType:"point",marker:null,size:null,showInLegend:!1, +slicedOffset:10,stickyTracking:!1,tooltip:{followPointer:!0},borderColor:"#ffffff",borderWidth:1,lineWidth:void 0,states:{hover:{brightness:.1}}}});M(a,"Series/Pie/PieSeries.js",[a["Series/CenteredUtilities.js"],a["Series/Column/ColumnSeries.js"],a["Core/Globals.js"],a["Series/Pie/PiePoint.js"],a["Series/Pie/PieSeriesDefaults.js"],a["Core/Series/Series.js"],a["Core/Series/SeriesRegistry.js"],a["Core/Renderer/SVG/Symbols.js"],a["Core/Utilities.js"]],function(a,A,H,I,F,G,C,B,t){const {getStartAndEndRadians:r}= +a;({noop:H}=H);const {clamp:d,extend:p,fireEvent:m,merge:k,pick:u,relativeLength:n}=t;class h extends G{constructor(){super(...arguments);this.points=this.options=this.maxLabelDistance=this.data=this.center=void 0}animate(a){const d=this,h=d.points,e=d.startAngleRad;a||h.forEach(function(a){const h=a.graphic,l=a.shapeArgs;h&&l&&(h.attr({r:u(a.startR,d.center&&d.center[3]/2),start:e,end:e}),h.animate({r:l.r,start:l.start,end:l.end},d.options.animation))})}drawEmpty(){const a=this.startAngleRad,d=this.endAngleRad, +h=this.options;let e,k;0===this.total&&this.center?(e=this.center[0],k=this.center[1],this.graph||(this.graph=this.chart.renderer.arc(e,k,this.center[1]/2,0,a,d).addClass("highcharts-empty-series").add(this.group)),this.graph.attr({d:B.arc(e,k,this.center[2]/2,0,{start:a,end:d,innerR:this.center[3]/2})}),this.chart.styledMode||this.graph.attr({"stroke-width":h.borderWidth,fill:h.fillColor||"none",stroke:h.color||"#cccccc"})):this.graph&&(this.graph=this.graph.destroy())}drawPoints(){const a=this.chart.renderer; +this.points.forEach(function(d){d.graphic&&d.hasNewShapeType()&&(d.graphic=d.graphic.destroy());d.graphic||(d.graphic=a[d.shapeType](d.shapeArgs).add(d.series.group),d.delayedRendering=!0)})}generatePoints(){super.generatePoints();this.updateTotals()}getX(a,h,k){const e=this.center,n=this.radii?this.radii[k.index]||0:e[2]/2;a=Math.asin(d((a-e[1])/(n+k.labelDistance),-1,1));return e[0]+(h?-1:1)*Math.cos(a)*(n+k.labelDistance)+(01.5*Math.PI?z-=2*Math.PI:z<-Math.PI/2&&(z+=2*Math.PI); +f.slicedTranslation={translateX:Math.round(Math.cos(z)*h),translateY:Math.round(Math.sin(z)*h)};t=Math.cos(z)*a[2]/2;b=Math.sin(z)*a[2]/2;f.tooltipPos=[a[0]+.7*t,a[1]+.7*b];f.half=z<-Math.PI/2||z>Math.PI/2?1:0;f.angle=z;v=Math.min(e,f.labelDistance/5);f.labelPosition={natural:{x:a[0]+t+Math.cos(z)*f.labelDistance,y:a[1]+b+Math.sin(z)*f.labelDistance},computed:{},alignment:0>f.labelDistance?"center":f.half?"right":"left",connectorPosition:{breakAt:{x:a[0]+t+Math.cos(z)*v,y:a[1]+b+Math.sin(z)*v},touchingSliceAt:{x:a[0]+ +t,y:a[1]+b}}}}m(this,"afterTranslate")}updateTotals(){const a=this.points,d=a.length,h=this.options.ignoreHiddenPoint;let e,k,n=0;for(e=0;ek&&(a.dataLabel.css({width:Math.round(.7*k)+"px"}),a.dataLabel.shortened=!0)):(a.dataLabel=a.dataLabel.destroy(),a.dataLabels&&1===a.dataLabels.length&&delete a.dataLabels))}),v.forEach((e,k)=>{const q=e.length,x=[];let w,p=0;if(q){a.sortByAngle(e,k-.5);if(0b-g&&0===k&&(z=Math.round(I+K-b+g),D[1]=Math.max(z,D[1])),0>M-H/2?D[0]=Math.max(Math.round(-M+H/2),D[0]):M+H/2>c&&(D[2]=Math.max(Math.round(M+H/2-c),D[2])),L.sideOverflow=z)}}}),0===t(D)||this.verifyDataLabelOverflow(D))&&(this.placeDataLabels(),this.points.forEach(function(b){Z=p(h,b.options.dataLabels);if(A=m(Z.connectorWidth,1)){let c;F=b.connector;if((L=b.dataLabel)&&L._pos&&b.visible&&0e.bottom-2?h:d,e.half,e)},justify:function(a,e,d){return d[0]+(a.half?-1:1)*(e+a.labelDistance)},alignToPlotEdges:function(a, +e,d,h){a=a.getBBox().width;return e?a+h:d-a-h},alignToConnectors:function(a,e,d,h){let g=0,b;a.forEach(function(a){b=a.dataLabel.getBBox().width;b>g&&(g=b)});return e?g+h:d-g-h}};n.compose=function(d){a.compose(B);F.pushUnique(E,d)&&(d=d.prototype,d.dataLabelPositioners=e,d.alignDataLabel=u,d.drawDataLabels=h,d.placeDataLabels=v,d.verifyDataLabelOverflow=A)}})(v||(v={}));return v});M(a,"Extensions/OverlappingDataLabels.js",[a["Core/Chart/Chart.js"],a["Core/Utilities.js"]],function(a,A){function u(a, +d){let p,m=!1;a&&(p=a.newOpacity,a.oldOpacity!==p&&(a.alignAttr&&a.placed?(a[p?"removeClass":"addClass"]("highcharts-data-label-hidden"),m=!0,a.alignAttr.opacity=p,a[a.isOld?"animate":"attr"](a.alignAttr,null,function(){d.styledMode||a.css({pointerEvents:p?"auto":"none"})}),F(d,"afterHideOverlappingLabel")):a.attr({opacity:p})),a.isOld=!0);return m}const {addEvent:I,fireEvent:F,isArray:G,isNumber:C,objectEach:B,pick:t}=A;I(a,"render",function(){let a=this,d=[];(this.labelCollectors||[]).forEach(function(a){d= +d.concat(a())});(this.yAxis||[]).forEach(function(a){a.stacking&&a.options.stackLabels&&!a.options.stackLabels.allowOverlap&&B(a.stacking.stacks,function(a){B(a,function(a){a.label&&d.push(a.label)})})});(this.series||[]).forEach(function(p){var m=p.options.dataLabels;p.visible&&(!1!==m.enabled||p._hasPointLabels)&&(m=k=>k.forEach(k=>{k.visible&&(G(k.dataLabels)?k.dataLabels:k.dataLabel?[k.dataLabel]:[]).forEach(function(n){const h=n.options;n.labelrank=t(h.labelrank,k.labelrank,k.shapeArgs&&k.shapeArgs.height); +h.allowOverlap?(n.oldOpacity=n.opacity,n.newOpacity=1,u(n,a)):d.push(n)})}),m(p.nodes||[]),m(p.points))});this.hideOverlappingLabels(d)});a.prototype.hideOverlappingLabels=function(a){let d=this,p=a.length,m=d.renderer;var k;let r;let n,h,t,B=!1;var E=function(a){let e,d;var h;let k=a.box?0:a.padding||0,g=h=0,b,c;if(a&&(!a.alignAttr||a.placed))return e=a.alignAttr||{x:a.attr("x"),y:a.attr("y")},d=a.parentGroup,a.width||(h=a.getBBox(),a.width=h.width,a.height=h.height,h=m.fontMetrics(a.element).h), +b=a.width-2*k,(c={left:"0",center:"0.5",right:"1"}[a.alignValue])?g=+c*b:C(a.x)&&Math.round(a.x)!==a.translateX&&(g=a.x-a.translateX),{x:e.x+(d.translateX||0)+k-(g||0),y:e.y+(d.translateY||0)+k-h,width:a.width-2*k,height:a.height-2*k}};for(r=0;r=h.x+h.width||t.x+t.width<=h.x||t.y>=h.y+h.height||t.y+t.height<=h.y||((E.labelrank{r(a)||(a={radius:a||0});return d(m,k,a)};if(-1===I.symbolCustomAttribs.indexOf("borderRadius")){I.symbolCustomAttribs.push("borderRadius","brBoxHeight","brBoxY");const d=F.prototype.symbols.arc;F.prototype.symbols.arc=function(a,k,n,m,e={}){a=d(a,k,n,m,e);const {innerR:h=0,r=n,start:l=0,end:w=0}=e;if(e.open||!e.borderRadius)return a; +n=w-l;k=Math.sin(n/2);e=Math.max(Math.min(p(e.borderRadius||0,r-h),(r-h)/2,r*k/(1+k)),0);n=Math.min(e,n/Math.PI*2*h);for(k=a.length-1;k--;){{let d=void 0,h=void 0,l=void 0;m=a;var g=k,b=1this.borderWidth&&(q="all");q||(q="end");const w=Math.min(p(a.radius,g),g/2,"all"===q?b/2:Infinity)||0;"end"===q&&(f&&(m-=w),e+=w);t(n,{brBoxHeight:e,brBoxY:m,r:w})}}},{order:9})}A={optionsToObject:k};"";return A});M(a,"Core/Responsive.js",[a["Core/Utilities.js"]],function(a){const {extend:u,find:H, +isArray:I,isObject:F,merge:G,objectEach:C,pick:B,splat:t,uniqueKey:r}=a;var d;(function(d){function m(a){function d(a,k,n,l){let e;C(a,function(a,b){if(!l&&-1=B(h.minWidth,0)&&this.chartHeight>=B(h.minHeight,0)}).call(this)&&d.push(a._id)}function p(a,d){const h=this.options.responsive;var k=this.currentResponsive;let e=[];!d&&h&&h.rules&&h.rules.forEach(a=>{"undefined"===typeof a._id&&(a._id=r());this.matchResponsiveRule(a,e)},this);d=G(...e.map(a=>H((h||{}).rules||[],e=>e._id===a)).map(a=>a&&a.chartOptions)); +d.isResponsiveOptions=!0;e=e.toString()||void 0;e!==(k&&k.ruleIds)&&(k&&this.update(k.undoOptions,a,!0),e?(k=this.currentOptions(d),k.isResponsiveOptions=!0,this.currentResponsive={ruleIds:e,mergedOptions:d,undoOptions:k},this.update(d,a,!0)):this.currentResponsive=void 0)}const n=[];d.compose=function(d){a.pushUnique(n,d)&&u(d.prototype,{currentOptions:m,matchResponsiveRule:k,setResponsive:p});return d}})(d||(d={}));"";"";return d});M(a,"masters/highcharts.src.js",[a["Core/Globals.js"],a["Core/Utilities.js"], +a["Core/Defaults.js"],a["Core/Animation/Fx.js"],a["Core/Animation/AnimationUtilities.js"],a["Core/Renderer/HTML/AST.js"],a["Core/FormatUtilities.js"],a["Core/Renderer/RendererUtilities.js"],a["Core/Renderer/SVG/SVGElement.js"],a["Core/Renderer/SVG/SVGRenderer.js"],a["Core/Renderer/HTML/HTMLElement.js"],a["Core/Renderer/HTML/HTMLRenderer.js"],a["Core/Axis/Axis.js"],a["Core/Axis/DateTimeAxis.js"],a["Core/Axis/LogarithmicAxis.js"],a["Core/Axis/PlotLineOrBand/PlotLineOrBand.js"],a["Core/Axis/Tick.js"], +a["Core/Tooltip.js"],a["Core/Series/Point.js"],a["Core/Pointer.js"],a["Core/Legend/Legend.js"],a["Core/Chart/Chart.js"],a["Core/Axis/Stacking/StackingAxis.js"],a["Core/Axis/Stacking/StackItem.js"],a["Core/Series/Series.js"],a["Core/Series/SeriesRegistry.js"],a["Series/Column/ColumnSeries.js"],a["Series/Column/ColumnDataLabel.js"],a["Series/Pie/PieSeries.js"],a["Series/Pie/PieDataLabel.js"],a["Core/Series/DataLabel.js"],a["Core/Responsive.js"],a["Core/Color/Color.js"],a["Core/Time.js"]],function(a, +A,H,I,F,G,C,B,t,r,d,p,m,k,v,n,h,D,L,E,e,q,y,l,w,g,b,c,f,x,J,z,Q,S){a.animate=F.animate;a.animObject=F.animObject;a.getDeferredAnimation=F.getDeferredAnimation;a.setAnimation=F.setAnimation;a.stop=F.stop;a.timers=I.timers;a.AST=G;a.Axis=m;a.Chart=q;a.chart=q.chart;a.Fx=I;a.Legend=e;a.PlotLineOrBand=n;a.Point=L;a.Pointer=E;a.Series=w;a.StackItem=l;a.SVGElement=t;a.SVGRenderer=r;a.Tick=h;a.Time=S;a.Tooltip=D;a.Color=Q;a.color=Q.parse;p.compose(r);d.compose(t);E.compose(q);e.compose(q);a.defaultOptions= +H.defaultOptions;a.getOptions=H.getOptions;a.time=H.defaultTime;a.setOptions=H.setOptions;a.dateFormat=C.dateFormat;a.format=C.format;a.numberFormat=C.numberFormat;a.addEvent=A.addEvent;a.arrayMax=A.arrayMax;a.arrayMin=A.arrayMin;a.attr=A.attr;a.clearTimeout=A.clearTimeout;a.correctFloat=A.correctFloat;a.createElement=A.createElement;a.css=A.css;a.defined=A.defined;a.destroyObjectProperties=A.destroyObjectProperties;a.discardElement=A.discardElement;a.distribute=B.distribute;a.erase=A.erase;a.error= +A.error;a.extend=A.extend;a.extendClass=A.extendClass;a.find=A.find;a.fireEvent=A.fireEvent;a.getMagnitude=A.getMagnitude;a.getStyle=A.getStyle;a.inArray=A.inArray;a.isArray=A.isArray;a.isClass=A.isClass;a.isDOMElement=A.isDOMElement;a.isFunction=A.isFunction;a.isNumber=A.isNumber;a.isObject=A.isObject;a.isString=A.isString;a.keys=A.keys;a.merge=A.merge;a.normalizeTickInterval=A.normalizeTickInterval;a.objectEach=A.objectEach;a.offset=A.offset;a.pad=A.pad;a.pick=A.pick;a.pInt=A.pInt;a.relativeLength= +A.relativeLength;a.removeEvent=A.removeEvent;a.seriesType=g.seriesType;a.splat=A.splat;a.stableSort=A.stableSort;a.syncTimeout=A.syncTimeout;a.timeUnits=A.timeUnits;a.uniqueKey=A.uniqueKey;a.useSerialIds=A.useSerialIds;a.wrap=A.wrap;c.compose(b);J.compose(w);k.compose(m);v.compose(m);x.compose(f);n.compose(m);z.compose(q);y.compose(m,q,w);D.compose(E);return a});M(a,"Core/Axis/BrokenAxis.js",[a["Core/Axis/Stacking/StackItem.js"],a["Core/Utilities.js"]],function(a,A){const {addEvent:u,find:I,fireEvent:F, +isArray:G,isNumber:C,pick:B}=A;var t;(function(r){function d(){"undefined"!==typeof this.brokenAxis&&this.brokenAxis.setBreaks(this.options.breaks,!1)}function p(){this.brokenAxis&&this.brokenAxis.hasBreaks&&(this.options.ordinal=!1)}function m(){const a=this.brokenAxis;if(a&&a.hasBreaks){const e=this.tickPositions,d=this.tickPositions.info,h=[];for(let d=0;de.to||g>e.from&&ce.from&&ce.from&&c>e.to&&cl&&d>=this.basePointRange&&(l=d);k--;)g&&!1!==g.visible||(g=e[k+1]),d=e[k],!1!==g.visible&&!1!==d.visible&&(g.x-d.x>l&&(g=(d.x+g.x)/2,e.splice(k+1,0,{isNull:!0,x:g}),h.stacking&&this.options.stacking&&(g=h.stacking.stacks[this.stackKey][g]=new a(h,h.options.stackLabels,!1,g,this.stack),g.total=0)),g=d);return this.getGraphPath(e)}const H=[];r.compose=function(a,q){A.pushUnique(H,a)&&(a.keepProps.push("brokenAxis"), +u(a,"init",k),u(a,"afterInit",d),u(a,"afterSetTickPositions",m),u(a,"afterSetOptions",p));if(A.pushUnique(H,q)){const a=q.prototype;a.drawBreaks=h;a.gappedPath=D;u(q,"afterGeneratePoints",t);u(q,"afterRender",n)}return a};class E{static isInBreak(a,d){const e=a.repeat||Infinity,h=a.from,k=a.to-a.from;d=d>=h?(d-h)%e:e-(h-d)%e;return a.inclusive?d<=k:d=a);h++)d.to=a)break;else if(E.isInBreak(h,a)){d-=a-h.from;break}return d}constructor(a){this.hasBreaks=!1;this.axis=a}findBreakAt(a,d){return I(d,function(e){return e.fromn;)q-=l;for(;qthis.chart.plotSizeX/p||h&&t.forced)n=!0;return n?p:0}function F(){this.series.forEach(function(a){a.hasProcessed=!1})}function G(a,d){let k;d=r(d,!0);a||(a={forced:!1,units:null});if(this instanceof p)for(k=this.series.length;k--;)this.series[k].update({dataGrouping:a},!1);else this.chart.options.series.forEach(function(d){d.dataGrouping="boolean"===typeof a?a:t(a,d.dataGrouping)}); +this.ordinal&&(this.ordinal.slope=void 0);d&&this.chart.redraw()}const {addEvent:C,extend:B,merge:t,pick:r}=A,d=[];let p;return{compose:function(a){p=a;A.pushUnique(d,a)&&(C(a,"afterSetScale",F),C(a,"postProcessData",u),B(a.prototype,{applyGrouping:u,getGroupPixelWidth:I,setDataGrouping:G}))}}});M(a,"Extensions/DataGrouping/DataGroupingSeriesComposition.js",[a["Extensions/DataGrouping/ApproximationRegistry.js"],a["Extensions/DataGrouping/DataGroupingDefaults.js"],a["Core/Axis/DateTimeAxis.js"],a["Core/Defaults.js"], +a["Core/Series/SeriesRegistry.js"],a["Core/Utilities.js"]],function(a,A,H,I,F,G){function u(a){var d=this.chart,e=this.options.dataGrouping,g=!1!==this.allowDG&&e&&E(e.enabled,d.options.isStock),b=this.visible||!d.options.chart.ignoreHiddenSeries;const c=this.currentDataGrouping;var f=!1;g&&!this.requireSorting&&(this.requireSorting=f=!0);a=!1===!(this.isCartesian&&!this.isDirty&&!this.xAxis.isDirty&&!this.yAxis.isDirty&&!a)||!g;f&&(this.requireSorting=!1);if(!a){this.destroyGroupedData();a=e.groupAll? +this.xData:this.processedXData;g=e.groupAll?this.yData:this.processedYData;var h=d.plotSizeX;f=this.xAxis;var k=f.options.ordinal,q=this.groupPixelWidth,p;let l;if(q&&a&&a.length&&h){this.isDirty=l=!0;this.points=null;var r=f.getExtremes();var t=r.min;r=r.max;k=k&&f.ordinal&&f.ordinal.getGroupIntervalFactor(t,r,this)||1;h=f.getTimeTicks(H.Additions.prototype.normalizeTimeTickInterval(q*(r-t)/h*k,e.units||A.units),Math.min(t,a[0]),Math.max(r,a[a.length-1]),f.options.startOfWeek,a,this.closestPointRange); +q=m.groupData.apply(this,[a,g,h,e.approximation]);a=q.groupedXData;g=q.groupedYData;k=0;e&&e.smoothed&&a.length&&(e.firstAnchor="firstPoint",e.anchor="middle",e.lastAnchor="lastPoint",n(32,!1,d,{"dataGrouping.smoothed":"use dataGrouping.anchor"}));d=a;var u=r,y=this.options.dataGrouping;r=this.currentDataGrouping&&this.currentDataGrouping.gapSize;if(y&&this.xData&&r&&this.groupMap){t=d.length-1;var B=y.anchor;const a=E(y.firstAnchor,B);y=E(y.lastAnchor,B);if(B&&"start"!==B){var C=r*{middle:.5,end:1}[B]; +for(B=d.length-1;B--&&0=d[0]&&(B=this.groupMap[0].start,C=this.groupMap[0].length,D(B)&&D(C)&&(p=B+(C-1)),d[0]={middle:d[0]+.5*r,end:d[0]+r,firstPoint:this.xData[0],lastPoint:p&&this.xData[p]}[a]);y&&"start"!==y&&r&&d[t]>=u-r&&(p=this.groupMap[this.groupMap.length-1].start,d[t]={middle:d[t]+.5*r,end:d[t]+r,firstPoint:p&&this.xData[p],lastPoint:this.xData[this.xData.length-1]}[y])}for(p=1;pb.max){if(!v(b.options.max)&&D(b.dataMax)&&b.max>=b.dataMax||b.max===b.dataMax)b.max=Math.max(p[p.length-1],b.max);b.dataMax=Math.max(p[p.length- +1],b.dataMax)}}e.groupAll&&(this.allGroupedData=g,e=this.cropData(a,g,f.min,f.max,1),a=e.xData,g=e.yData,this.cropStart=e.start);this.processedXData=a;this.processedYData=g}else this.groupMap=null;this.hasGroupedData=l;this.currentDataGrouping=r;this.preventGraphAnimation=(c&&c.totalRange)!==(r&&r.totalRange)}}function B(){this.groupedData&&(this.groupedData.forEach(function(a,d){a&&(this.groupedData[d]=a.destroy?a.destroy():null)},this),this.groupedData.length=0)}function t(){e.apply(this);this.destroyGroupedData(); +this.groupedData=this.hasGroupedData?this.points:null}function r(){return this.is("arearange")?"range":this.is("ohlc")?"ohlc":this.is("hlc")?"hlc":this.is("column")?"sum":"average"}function d(d,e,h,g){const b=this,c=b.data,f=b.options&&b.options.data,k=[],l=[],n=[],m=d.length,q=!!e,p=[],r=b.pointArrayMap,w=r&&r.length,t=["x"].concat(r||["y"]),u=this.options.dataGrouping&&this.options.dataGrouping.groupAll;let y=0,B=0;g="function"===typeof g?g:g&&a[g]?a[g]:a[b.getDGApproximation&&b.getDGApproximation()|| +"average"];if(w)for(var E=r.length;E--;)p.push([]);else p.push([]);E=w||1;for(let a=0;a<=m;a++)if(!(d[a]=h[y+1]||a===m;){var A=h[y];b.dataGroupInfo={start:u?B:b.cropStart+B,length:p[0].length};var C=g.apply(b,p);b.pointClass&&!v(b.dataGroupInfo.options)&&(b.dataGroupInfo.options=L(b.pointClass.prototype.optionsToObject.call({series:b},b.options.data[b.cropStart+B])),t.forEach(function(a){delete b.dataGroupInfo.options[a]}));"undefined"!==typeof C&&(k.push(A), +l.push(C),n.push(b.dataGroupInfo));B=a;for(A=0;A{delete a.change}):this.dataModify.initCompare(a)}function q(){if(this.xAxis&&this.processedYData&&this.dataModify){const a=this.processedXData,b=this.processedYData,d=b.length,e=!0===this.options.compareStart?0:1;let g=-1,h;this.pointArrayMap&&(g=this.pointArrayMap.indexOf(this.options.pointValKey|| +this.pointValKey||"y"));for(h=0;h=(this.xAxis.min||0)){this.dataModify.compareValue=c;break}}}}function y(a,b){this.setModifier("compare",a,b)}function l(a,b){a=k(a,!1);this.options.cumulative=this.userOptions.cumulative=a;this.update({},k(b,!0));this.dataModify?this.dataModify.initCumulative():this.points.forEach(a=>{delete a.cumulativeSum})}function w(a,b){this.setModifier("cumulative",a,b)}const g=[];a.compose=function(a,b,d){if(I.pushUnique(g, +a)){const b=a.prototype;b.setCompare=e;b.setCumulative=l;G(a,"afterInit",v);G(a,"afterGetExtremes",E);G(a,"afterProcessData",q)}I.pushUnique(g,b)&&(b=b.prototype,b.setCompare=y,b.setModifier=h,b.setCumulative=w);I.pushUnique(g,d)&&(d.prototype.tooltipFormatter=n);return a};class b{constructor(a){this.series=a}modifyValue(){return 0}static getCumulativeExtremes(a){let b=Infinity,c=-Infinity;a.reduce((a,f)=>{f=a+f;b=Math.min(b,f,a);c=Math.max(c,f,a);return f});return[b,c]}initCompare(a){this.modifyValue= +function(b,c){null===b&&(b=0);const f=this.compareValue;return"undefined"!==typeof b&&"undefined"!==typeof f?(b="value"===a?b-f:b/f*100-(100===this.series.options.compareBase?0:100),"undefined"!==typeof c&&(c=this.series.points[c])&&(c.change=b),b):0}}initCumulative(){this.modifyValue=function(a,b){null===a&&(a=0);if(void 0!==a&&void 0!==b){const c=0m&&(n?a=d-k:d=a+k);t(a)&&t(d)||(a=d=void 0);return{min:a,max:d}}}return p});M(a,"Stock/Navigator/NavigatorDefaults.js",[a["Core/Color/Color.js"],a["Core/Series/SeriesRegistry.js"]],function(a,A){({parse:a}=a);({seriesTypes:A}=A);A={height:40,margin:25,maskInside:!0,handles:{width:7,height:15,symbols:["navigator-handle","navigator-handle"],enabled:!0,lineWidth:1,backgroundColor:"#f2f2f2",borderColor:"#999999"},maskFill:a("#667aff").setOpacity(.3).get(), +outlineColor:"#999999",outlineWidth:1,series:{type:"undefined"===typeof A.areaspline?"line":"areaspline",fillOpacity:.05,lineWidth:1,compare:null,sonification:{enabled:!1},dataGrouping:{approximation:"average",enabled:!0,groupPixelWidth:2,firstAnchor:"firstPoint",anchor:"middle",lastAnchor:"lastPoint",units:[["millisecond",[1,2,5,10,20,25,50,100,200,500]],["second",[1,2,5,10,15,30]],["minute",[1,2,5,10,15,30]],["hour",[1,2,3,4,6,8,12]],["day",[1,2,3,4]],["week",[1,2,3]],["month",[1,3,6]],["year", +null]]},dataLabels:{enabled:!1,zIndex:2},id:"highcharts-navigator-series",className:"highcharts-navigator-series",lineColor:null,marker:{enabled:!1},threshold:null},xAxis:{overscroll:0,className:"highcharts-navigator-xaxis",tickLength:0,lineWidth:0,gridLineColor:"#e6e6e6",gridLineWidth:1,tickPixelInterval:200,labels:{align:"left",style:{color:"#000000",fontSize:"0.7em",opacity:.6,textOutline:"2px contrast"},x:3,y:-4},crosshair:!1},yAxis:{className:"highcharts-navigator-yaxis",gridLineWidth:0,startOnTick:!1, +endOnTick:!1,minPadding:.1,maxPadding:.1,labels:{enabled:!1},crosshair:!1,title:{text:null},tickLength:0,tickWidth:0}};"";return A});M(a,"Stock/Navigator/NavigatorSymbols.js",[],function(){return{"navigator-handle":function(a,A,H,I,F={}){a=F.width?F.width/2:H;A=Math.round(a/3)+.5;I=F.height||I;return[["M",-a-1,.5],["L",a,.5],["L",a,I+.5],["L",-a-1,I+.5],["L",-a-1,.5],["M",-A,4],["L",-A,I-3],["M",A-1,4],["L",A-1,I-3]]}}});M(a,"Stock/Navigator/NavigatorComposition.js",[a["Core/Defaults.js"],a["Core/Globals.js"], +a["Core/Axis/NavigatorAxisComposition.js"],a["Stock/Navigator/NavigatorDefaults.js"],a["Stock/Navigator/NavigatorSymbols.js"],a["Core/Renderer/RendererRegistry.js"],a["Core/Utilities.js"]],function(a,A,H,I,F,G,C){function u(){this.navigator&&this.navigator.setBaseSeries(null,!1)}function t(){var a;const b=this.legend,c=this.navigator;let f,d,e;if(c){f=b&&b.options;d=c.xAxis;e=c.yAxis;const {scrollbarHeight:g,scrollButtonSize:h}=c;this.inverted?(c.left=c.opposite?this.chartWidth-g-c.height:this.spacing[3]+ +g,c.top=this.plotTop+h):(c.left=y(d.left,this.plotLeft+h),c.top=c.navigatorOptions.top||this.chartHeight-c.height-g-((null===(a=this.scrollbar)||void 0===a?void 0:a.options.margin)||0)-this.spacing[2]-(this.rangeSelector&&this.extraBottomMargin?this.rangeSelector.getHeight():0)-(f&&"bottom"===f.verticalAlign&&"proximate"!==f.layout&&f.enabled&&!f.floating?b.legendHeight+y(f.margin,10):0)-(this.titleOffset?this.titleOffset[2]:0));d&&e&&(this.inverted?d.options.left=e.options.left=c.left:d.options.top= +e.options.top=c.top,d.setAxisSize(),e.setAxisSize())}}function r(a){this.navigator||this.scroller||!this.options.navigator.enabled&&!this.options.scrollbar.enabled||(this.scroller=this.navigator=new w(this),y(a.redraw,!0)&&this.redraw(a.animation))}function d(){const a=this.options;if(a.navigator.enabled||a.scrollbar.enabled)this.scroller=this.navigator=new w(this)}function p(){const a=this.options,b=a.navigator,c=a.rangeSelector;if((b&&b.enabled||c&&c.enabled)&&(!D&&"x"===a.chart.zooming.type||D&& +"x"===a.chart.zooming.pinchType))return!1}function m(a){const b=a.navigator;b&&a.xAxis[0]&&(a=a.xAxis[0].getExtremes(),b.render(a.min,a.max))}function k(a){const b=a.options.navigator||{},c=a.options.scrollbar||{};this.navigator||this.scroller||!b.enabled&&!c.enabled||(q(!0,this.options.navigator,b),q(!0,this.options.scrollbar,c),delete a.options.navigator,delete a.options.scrollbar)}function v(){this.chart.navigator&&!this.options.isInternal&&this.chart.navigator.setBaseSeries(null,!1)}const {defaultOptions:n, +setOptions:h}=a,{isTouchDevice:D}=A,{getRendererType:L}=G,{addEvent:E,extend:e,merge:q,pick:y}=C,l=[];let w;return{compose:function(a,b,c,f){H.compose(a);w=c;C.pushUnique(l,b)&&(b.prototype.callbacks.push(m),E(b,"afterAddSeries",u),E(b,"afterSetChartSize",t),E(b,"afterUpdate",r),E(b,"beforeRender",d),E(b,"beforeShowResetZoom",p),E(b,"update",k));C.pushUnique(l,f)&&E(f,"afterUpdate",v);C.pushUnique(l,L)&&e(L().prototype.symbols,F);C.pushUnique(l,h)&&e(n,{navigator:I})}}});M(a,"Core/Axis/ScrollbarAxis.js", +[a["Core/Utilities.js"]],function(a){const {addEvent:u,defined:H,pick:I}=a,F=[];class G{static compose(A,B){if(!a.pushUnique(F,A))return A;const t=a=>{const d=I(a.options&&a.options.min,a.min),p=I(a.options&&a.options.max,a.max);return{axisMin:d,axisMax:p,scrollMin:H(a.dataMin)?Math.min(d,a.min,a.dataMin,I(a.threshold,Infinity)):d,scrollMax:H(a.dataMax)?Math.max(p,a.max,a.dataMax,I(a.threshold,-Infinity)):p}};u(A,"afterInit",function(){const a=this;a.options&&a.options.scrollbar&&a.options.scrollbar.enabled&& +(a.options.scrollbar.vertical=!a.horiz,a.options.startOnTick=a.options.endOnTick=!1,a.scrollbar=new B(a.chart.renderer,a.options.scrollbar,a.chart),u(a.scrollbar,"changed",function(d){let {axisMin:p,axisMax:m,scrollMin:k,scrollMax:r}=t(a);var n=r-k;let h;H(p)&&H(m)&&(a.horiz&&!a.reversed||!a.horiz&&a.reversed?(h=k+n*this.to,n=k+n*this.from):(h=k+n*(1-this.from),n=k+n*(1-this.to)),this.shouldUpdateExtremes(d.DOMType)?a.setExtremes(n,h,!0,"mousemove"===d.DOMType||"touchmove"===d.DOMType?!1:void 0,d): +this.setRange(this.from,this.to))}))});u(A,"afterRender",function(){let {scrollMin:a,scrollMax:d}=t(this),p=this.scrollbar;var m=this.axisTitleMargin+(this.titleOffset||0),k=this.chart.scrollbarsOffsets;let v=this.options.margin||0;p&&(this.horiz?(this.opposite||(k[1]+=m),p.position(this.left,this.top+this.height+2+k[1]-(this.opposite?v:0),this.width,this.height),this.opposite||(k[1]+=v),m=1):(this.opposite&&(k[0]+=m),p.position(p.options.opposite?this.left+this.width+2+k[0]-(this.opposite?0:v):this.opposite? +0:v,this.top,this.width,this.height),this.opposite&&(k[0]+=v),m=0),k[m]+=p.size+(p.options.margin||0),isNaN(a)||isNaN(d)||!H(this.min)||!H(this.max)||this.min===this.max?p.setRange(0,1):(k=(this.min-a)/(d-a),m=(this.max-a)/(d-a),this.horiz&&!this.reversed||!this.horiz&&this.reversed?p.setRange(k,m):p.setRange(1-m,1-k)))});u(A,"afterGetOffset",function(){const a=this.scrollbar;var d=a&&!a.options.opposite;d=this.horiz?2:d?3:1;a&&(this.chart.scrollbarsOffsets=[0,0],this.chart.axisOffset[d]+=a.size+ +(a.options.margin||0))});return A}}return G});M(a,"Stock/Scrollbar/ScrollbarDefaults.js",[a["Core/Globals.js"]],function(a){return{height:10,barBorderRadius:5,buttonBorderRadius:0,buttonsEnabled:!1,liveRedraw:void 0,margin:void 0,minWidth:6,opposite:!0,step:.2,zIndex:3,barBackgroundColor:"#cccccc",barBorderWidth:0,barBorderColor:"#cccccc",buttonArrowColor:"#333333",buttonBackgroundColor:"#e6e6e6",buttonBorderColor:"#cccccc",buttonBorderWidth:1,rifleColor:"none",trackBackgroundColor:"rgba(255, 255, 255, 0.001)", +trackBorderColor:"#cccccc",trackBorderRadius:5,trackBorderWidth:1}});M(a,"Stock/Scrollbar/Scrollbar.js",[a["Core/Defaults.js"],a["Core/Globals.js"],a["Core/Axis/ScrollbarAxis.js"],a["Stock/Scrollbar/ScrollbarDefaults.js"],a["Core/Utilities.js"]],function(a,A,H,I,F){const {defaultOptions:u}=a,{addEvent:C,correctFloat:B,defined:t,destroyObjectProperties:r,fireEvent:d,merge:p,pick:m,removeEvent:k}=F;class v{static compose(a){H.compose(a,v)}static swapXY(a,d){d&&a.forEach(a=>{const d=a.length;let h;for(let e= +0;ethis.calculatedWidth?d.minWidth:0;return{chartX:(a.chartX-this.x-this.xOffset)/(this.barWidth-d),chartY:(a.chartY-this.y-this.yOffset)/(this.barWidth-d)}}destroy(){const a=this,d=a.chart.scroller;a.removeEvents();["track","scrollbarRifles","scrollbar","scrollbarGroup","group"].forEach(function(d){a[d]&&a[d].destroy&&(a[d]=a[d].destroy())});d&&a===d.scrollbar&&(d.scrollbar=null,r(d.scrollbarButtons))}drawScrollbarButton(a){const d=this.renderer,k=this.scrollbarButtons,n=this.options, +m=this.size;var e=d.g().add(this.group);k.push(e);n.buttonsEnabled&&(e=d.rect().addClass("highcharts-scrollbar-button").add(e),this.chart.styledMode||e.attr({stroke:n.buttonBorderColor,"stroke-width":n.buttonBorderWidth,fill:n.buttonBackgroundColor}),e.attr(e.crisp({x:-.5,y:-.5,width:m+1,height:m+1,r:n.buttonBorderRadius},e.strokeWidth())),a=d.path(v.swapXY([["M",m/2+(a?-1:1),m/2-3],["L",m/2+(a?-1:1),m/2+3],["L",m/2+(a?2:-2),m/2]],n.vertical)).addClass("highcharts-scrollbar-arrow").add(k[a]),this.chart.styledMode|| +a.attr({fill:n.buttonArrowColor}))}init(a,d,k){this.scrollbarButtons=[];this.renderer=a;this.userOptions=d;this.options=p(I,u.scrollbar,d);this.options.margin=m(this.options.margin,10);this.chart=k;this.size=m(this.options.size,this.options.height);d.enabled&&(this.render(),this.addEvents())}mouseDownHandler(a){a=this.chart.pointer.normalize(a);a=this.cursorToScrollbarPosition(a);this.chartX=a.chartX;this.chartY=a.chartY;this.initPositions=[this.from,this.to];this.grabbedCenter=!0}mouseMoveHandler(a){var h= +this.chart.pointer.normalize(a),k=this.options.vertical?"chartY":"chartX";const m=this.initPositions||[];!this.grabbedCenter||a.touches&&0===a.touches[0][k]||(h=this.cursorToScrollbarPosition(h)[k],k=this[k],k=h-k,this.hasDragged=!0,this.updatePosition(m[0]+k,m[1]+k),this.hasDragged&&d(this,"changed",{from:this.from,to:this.to,trigger:"scrollbar",DOMType:a.type,DOMEvent:a}))}mouseUpHandler(a){this.hasDragged&&d(this,"changed",{from:this.from,to:this.to,trigger:"scrollbar",DOMType:a.type,DOMEvent:a}); +this.grabbedCenter=this.hasDragged=this.chartX=this.chartY=null}position(a,d,k,m){const {buttonsEnabled:h,margin:e=0,vertical:n}=this.options,p=this.rendered?"animate":"attr";let l=m,w=0;this.group.show();this.x=a;this.y=d+this.trackBorderWidth;this.width=k;this.height=m;this.xOffset=l;this.yOffset=w;n?(this.width=this.yOffset=k=this.size,this.xOffset=l=0,this.yOffset=w=h?this.size:0,this.barWidth=m-(h?2*k:0),this.x=a+=e):(this.height=m=this.size,this.xOffset=l=h?this.size:0,this.barWidth=k-(h?2* +m:0),this.y+=e);this.group[p]({translateX:a,translateY:this.y});this.track[p]({width:k,height:m});this.scrollbarButtons[1][p]({translateX:n?0:k-l,translateY:n?m-w:0})}removeEvents(){this._events.forEach(function(a){k.apply(null,a)});this._events.length=0}render(){const a=this.renderer,d=this.options,k=this.size,m=this.chart.styledMode,p=a.g("scrollbar").attr({zIndex:d.zIndex}).hide().add();this.group=p;this.track=a.rect().addClass("highcharts-scrollbar-track").attr({r:d.trackBorderRadius||0,height:k, +width:k}).add(p);m||this.track.attr({fill:d.trackBackgroundColor,stroke:d.trackBorderColor,"stroke-width":d.trackBorderWidth});const e=this.trackBorderWidth=this.track.strokeWidth();this.track.attr({x:-e%2/2,y:-e%2/2});this.scrollbarGroup=a.g().add(p);this.scrollbar=a.rect().addClass("highcharts-scrollbar-thumb").attr({height:k-e,width:k-e,r:d.barBorderRadius||0}).add(this.scrollbarGroup);this.scrollbarRifles=a.path(v.swapXY([["M",-3,k/4],["L",-3,2*k/3],["M",0,k/4],["L",0,2*k/3],["M",3,k/4],["L", +3,2*k/3]],d.vertical)).addClass("highcharts-scrollbar-rifles").add(this.scrollbarGroup);m||(this.scrollbar.attr({fill:d.barBackgroundColor,stroke:d.barBorderColor,"stroke-width":d.barBorderWidth}),this.scrollbarRifles.attr({stroke:d.rifleColor,"stroke-width":1}));this.scrollbarStrokeWidth=this.scrollbar.strokeWidth();this.scrollbarGroup.translate(-this.scrollbarStrokeWidth%2/2,-this.scrollbarStrokeWidth%2/2);this.drawScrollbarButton(0);this.drawScrollbarButton(1)}setRange(a,d){const h=this.options, +k=h.vertical;var m=h.minWidth,e=this.barWidth;const n=!this.rendered||this.hasDragged||this.chart.navigator&&this.chart.navigator.hasDragged?"attr":"animate";if(t(e)){var p=e*Math.min(d,1);a=Math.max(a,0);var l=Math.ceil(e*a);this.calculatedWidth=p=B(p-l);p=p?this.scrollbarRifles.hide():this.scrollbarRifles.show();!1===h.showFull&&(0>=a&&1<=d?this.group.hide():this.group.show());this.rendered=!0}}shouldUpdateExtremes(a){return m(this.options.liveRedraw,A.svg&&!A.isTouchDevice&&!this.chart.boosted)||"mouseup"===a||"touchend"===a||!t(a)}trackClick(a){const h=this.chart.pointer.normalize(a),k=this.to- +this.from,m=this.y+this.scrollbarTop,n=this.x+this.scrollbarLeft;this.options.vertical&&h.chartY>m||!this.options.vertical&&h.chartX>n?this.updatePosition(this.from+k,this.to+k):this.updatePosition(this.from-k,this.to-k);d(this,"changed",{from:this.from,to:this.to,trigger:"scrollbar",DOMEvent:a})}update(a){this.destroy();this.init(this.chart.renderer,p(!0,this.options,a),this.chart)}updatePosition(a,d){1a&&(d=B(d-a),a=0);this.from=a;this.to=d}}v.defaultOptions=I;u.scrollbar= +p(!0,v.defaultOptions,u.scrollbar);return v});M(a,"Stock/Navigator/Navigator.js",[a["Core/Axis/Axis.js"],a["Core/Defaults.js"],a["Core/Globals.js"],a["Core/Axis/NavigatorAxisComposition.js"],a["Stock/Navigator/NavigatorComposition.js"],a["Stock/Scrollbar/Scrollbar.js"],a["Core/Utilities.js"]],function(a,A,H,I,F,G,C){function u(a,...c){c=[].filter.call(c,e);if(c.length)return Math[a].apply(0,c)}const {defaultOptions:t}=A,{hasTouch:r,isTouchDevice:d}=H,{addEvent:p,clamp:m,correctFloat:k,defined:v,destroyObjectProperties:n, +erase:h,extend:D,find:L,isArray:E,isNumber:e,merge:q,pick:y,removeEvent:l,splat:w}=C;class g{static compose(a,c,f){F.compose(a,c,g,f)}constructor(a){this.rendered=this.range=this.outline=this.opposite=this.navigatorSize=this.navigatorSeries=this.navigatorOptions=this.navigatorGroup=this.navigatorEnabled=this.left=this.height=this.handles=this.chart=this.baseSeries=void 0;this.scrollbarHeight=0;this.zoomedMin=this.zoomedMax=this.yAxis=this.xAxis=this.top=this.size=this.shades=this.scrollButtonSize= +void 0;this.init(a)}drawHandle(a,c,f,d){const b=this.navigatorOptions.handles.height;this.handles[c][d](f?{translateX:Math.round(this.left+this.height/2),translateY:Math.round(this.top+parseInt(a,10)+.5-b)}:{translateX:Math.round(this.left+parseInt(a,10)),translateY:Math.round(this.top+this.height/2-b/2-1)})}drawOutline(a,c,f,d){const b=this.navigatorOptions.maskInside;var e=this.outline.strokeWidth();const g=e/2;var h=e%2/2;const k=this.scrollButtonSize,l=this.size,m=this.top;e=this.height;const n= +m-g,q=m+e;let p=this.left;f?(f=m+c+h,c=m+a+h,h=[["M",p+e,m-k-h],["L",p+e,f],["L",p,f],["M",p,c],["L",p+e,c],["L",p+e,m+l+k]],b&&h.push(["M",p+e,f-g],["L",p+e,c+g])):(p-=k,a+=p+k-h,c+=p+k-h,h=[["M",p,n],["L",a,n],["L",a,q],["M",c,q],["L",c,n],["L",p+l+2*k,m+g]],b&&h.push(["M",a-g,n],["L",c+g,n]));this.outline[d]({d:h})}drawMasks(a,c,f,d){const b=this.left,e=this.top,g=this.height;let h,k,l,m;f?(l=[b,b,b],m=[e,e+a,e+c],k=[g,g,g],h=[a,c-a,this.size-c]):(l=[b,b+a,b+c],m=[e,e,e],k=[a,c-a,this.size-c], +h=[g,g,g]);this.shades.forEach((a,b)=>{a[d]({x:l[b],y:m[b],width:k[b],height:h[b]})})}renderElements(){const a=this,c=a.navigatorOptions,f=c.maskInside,d=a.chart,e=d.renderer,g={cursor:d.inverted?"ns-resize":"ew-resize"},h=a.navigatorGroup=e.g("navigator").attr({zIndex:8,visibility:"hidden"}).add();[!f,f,!f].forEach((b,f)=>{const k=e.rect().addClass("highcharts-navigator-mask"+(1===f?"-inside":"-outside")).add(h);d.styledMode||(k.attr({fill:b?c.maskFill:"rgba(0,0,0,0)"}),1===f&&k.css(g));a.shades[f]= +k});a.outline=e.path().addClass("highcharts-navigator-outline").add(h);d.styledMode||a.outline.attr({"stroke-width":c.outlineWidth,stroke:c.outlineColor});if(c.handles&&c.handles.enabled){const b=c.handles,{height:f,width:k}=b;[0,1].forEach(c=>{a.handles[c]=e.symbol(b.symbols[c],-k/2-1,0,k,f,b);d.inverted&&a.handles[c].attr({rotation:90,rotationOriginX:Math.floor(-k/2),rotationOriginY:(f+k)/2});a.handles[c].attr({zIndex:7-c}).addClass("highcharts-navigator-handle highcharts-navigator-handle-"+["left", +"right"][c]).add(h);d.styledMode||a.handles[c].attr({fill:b.backgroundColor,stroke:b.borderColor,"stroke-width":b.lineWidth}).css(g)})}}update(a){(this.series||[]).forEach(a=>{a.baseSeries&&delete a.baseSeries.navigatorSeries});this.destroy();q(!0,this.chart.options.navigator,a);this.init(this.chart)}render(a,c,f,d){var b=this.chart;const g=this.xAxis,h=g.pointRange||0;var l=g.navigatorAxis.fake?b.xAxis[0]:g;const n=this.navigatorEnabled;var p=this.rendered,q=b.inverted;const x=b.xAxis[0].minRange, +w=b.xAxis[0].options.maxRange,r=this.scrollButtonSize;let t=this.scrollbarHeight,u;if(!this.hasDragged||v(f)){a=k(a-h/2);c=k(c+h/2);if(!e(a)||!e(c))if(p)f=0,d=y(g.width,l.width);else return;this.left=y(g.left,b.plotLeft+r+(q?b.plotWidth:0));var B=this.size=u=y(g.len,(q?b.plotHeight:b.plotWidth)-2*r);b=q?t:u+2*r;f=y(f,g.toPixels(a,!0));d=y(d,g.toPixels(c,!0));e(f)&&Infinity!==Math.abs(f)||(f=0,d=b);a=g.toValue(f,!0);c=g.toValue(d,!0);var A=Math.abs(k(c-a));Aw&&(this.grabbedLeft?f=g.toPixels(c-w-h,!0):this.grabbedRight&&(d=g.toPixels(a+w+h,!0)));this.zoomedMax=m(Math.max(f,d),0,B);this.zoomedMin=m(this.fixedWidth?this.zoomedMax-this.fixedWidth:Math.min(f,d),0,B);this.range=this.zoomedMax-this.zoomedMin;B=Math.round(this.zoomedMax);f=Math.round(this.zoomedMin);n&&(this.navigatorGroup.attr({visibility:"inherit"}),p=p&&!this.hasDragged?"animate":"attr",this.drawMasks(f,B,q,p),this.drawOutline(f,B, +q,p),this.navigatorOptions.handles.enabled&&(this.drawHandle(f,0,q,p),this.drawHandle(B,1,q,p)));this.scrollbar&&(q?(q=this.top-r,l=this.left-t+(n||!l.opposite?0:(l.titleOffset||0)+l.axisTitleMargin),t=u+2*r):(q=this.top+(n?this.height:-t),l=this.left-r),this.scrollbar.position(l,q,b,t),this.scrollbar.setRange(this.zoomedMin/(u||1),this.zoomedMax/(u||1)));this.rendered=!0}}addMouseEvents(){const a=this,c=a.chart,f=c.container;let d=[],e,g;a.mouseMoveHandler=e=function(b){a.onMouseMove(b)};a.mouseUpHandler= +g=function(b){a.onMouseUp(b)};d=a.getPartsEvents("mousedown");d.push(p(c.renderTo,"mousemove",e),p(f.ownerDocument,"mouseup",g));r&&(d.push(p(c.renderTo,"touchmove",e),p(f.ownerDocument,"touchend",g)),d.concat(a.getPartsEvents("touchstart")));a.eventsToUnbind=d;a.series&&a.series[0]&&d.push(p(a.series[0].xAxis,"foundExtremes",function(){c.navigator.modifyNavigatorAxisExtremes()}))}getPartsEvents(a){const b=this,f=[];["shades","handles"].forEach(function(c){b[c].forEach(function(d,e){f.push(p(d.element, +a,function(a){b[c+"Mousedown"](a,e)}))})});return f}shadesMousedown(a,c){a=this.chart.pointer.normalize(a);const b=this.chart,d=this.xAxis,e=this.zoomedMin,g=this.size,h=this.range;let k=this.left,l=a.chartX,m,n;b.inverted&&(l=a.chartY,k=this.top);1===c?(this.grabbedCenter=l,this.fixedWidth=h,this.dragOffset=l-e):(a=l-k-h/2,0===c?a=Math.max(0,a):2===c&&a+h>=g&&(a=g-h,this.reversedExtremes?(a-=h,n=this.getUnionExtremes().dataMin):m=this.getUnionExtremes().dataMax),a!==e&&(this.fixedWidth=h,c=d.navigatorAxis.toFixedRange(a, +a+h,n,m),v(c.min)&&b.xAxis[0].setExtremes(Math.min(c.min,c.max),Math.max(c.min,c.max),!0,null,{trigger:"navigator"})))}handlesMousedown(a,c){this.chart.pointer.normalize(a);a=this.chart;const b=a.xAxis[0],d=this.reversedExtremes;0===c?(this.grabbedLeft=!0,this.otherHandlePos=this.zoomedMax,this.fixedExtreme=d?b.min:b.max):(this.grabbedRight=!0,this.otherHandlePos=this.zoomedMin,this.fixedExtreme=d?b.max:b.min);a.fixedRange=null}onMouseMove(a){const b=this;var f=b.chart;const e=b.navigatorSize,g=b.range, +h=b.dragOffset,k=f.inverted;let l=b.left;a.touches&&0===a.touches[0].pageX||(a=f.pointer.normalize(a),f=a.chartX,k&&(l=b.top,f=a.chartY),b.grabbedLeft?(b.hasDragged=!0,b.render(0,0,f-l,b.otherHandlePos)):b.grabbedRight?(b.hasDragged=!0,b.render(0,0,b.otherHandlePos,f-l)):b.grabbedCenter&&(b.hasDragged=!0,fe+h-g&&(f=e+h-g),b.render(0,0,f-h,f-h+g)),b.hasDragged&&b.scrollbar&&y(b.scrollbar.options.liveRedraw,!d&&!this.chart.boosted)&&(a.DOMType=a.type,setTimeout(function(){b.onMouseUp(a)},0)))}onMouseUp(a){var b= +this.chart,f=this.xAxis,d=this.scrollbar;const g=a.DOMEvent||a,h=b.inverted,k=this.rendered&&!this.hasDragged?"animate":"attr";let l,m;(!this.hasDragged||d&&d.hasDragged)&&"scrollbar"!==a.trigger||(d=this.getUnionExtremes(),this.zoomedMin===this.otherHandlePos?l=this.fixedExtreme:this.zoomedMax===this.otherHandlePos&&(m=this.fixedExtreme),this.zoomedMax===this.size&&(m=this.reversedExtremes?d.dataMin:d.dataMax),0===this.zoomedMin&&(l=this.reversedExtremes?d.dataMax:d.dataMin),f=f.navigatorAxis.toFixedRange(this.zoomedMin, +this.zoomedMax,l,m),v(f.min)&&b.xAxis[0].setExtremes(Math.min(f.min,f.max),Math.max(f.min,f.max),!0,this.hasDragged?!1:null,{trigger:"navigator",triggerOp:"navigator-drag",DOMEvent:g}));"mousemove"!==a.DOMType&&"touchmove"!==a.DOMType&&(this.grabbedLeft=this.grabbedRight=this.grabbedCenter=this.fixedWidth=this.fixedExtreme=this.otherHandlePos=this.hasDragged=this.dragOffset=null);this.navigatorEnabled&&e(this.zoomedMin)&&e(this.zoomedMax)&&(b=Math.round(this.zoomedMin),a=Math.round(this.zoomedMax), +this.shades&&this.drawMasks(b,a,h,k),this.outline&&this.drawOutline(b,a,h,k),this.navigatorOptions.handles.enabled&&Object.keys(this.handles).length===this.handles.length&&(this.drawHandle(b,0,h,k),this.drawHandle(a,1,h,k)))}removeEvents(){this.eventsToUnbind&&(this.eventsToUnbind.forEach(function(a){a()}),this.eventsToUnbind=void 0);this.removeBaseSeriesEvents()}removeBaseSeriesEvents(){const a=this.baseSeries||[];this.navigatorEnabled&&a[0]&&(!1!==this.navigatorOptions.adaptToUpdatedData&&a.forEach(function(a){l(a, +"updatedData",this.updatedDataHandler)},this),a[0].xAxis&&l(a[0].xAxis,"foundExtremes",this.modifyBaseAxisExtremes))}init(b){var c=b.options,d=c.navigator||{},g=d.enabled,h=c.scrollbar||{},k=h.enabled;c=g&&d.height||0;var l=k&&h.height||0;const m=h.buttonsEnabled&&l||0;this.handles=[];this.shades=[];this.chart=b;this.setBaseSeries();this.height=c;this.scrollbarHeight=l;this.scrollButtonSize=m;this.scrollbarEnabled=k;this.navigatorEnabled=g;this.navigatorOptions=d;this.scrollbarOptions=h;this.opposite= +y(d.opposite,!(g||!b.inverted));const n=this;g=n.baseSeries;h=b.xAxis.length;k=b.yAxis.length;l=g&&g[0]&&g[0].xAxis||b.xAxis[0]||{options:{}};b.isDirtyBox=!0;n.navigatorEnabled?(n.xAxis=new a(b,q({breaks:l.options.breaks,ordinal:l.options.ordinal},d.xAxis,{id:"navigator-x-axis",yAxis:"navigator-y-axis",isX:!0,type:"datetime",index:h,isInternal:!0,offset:0,keepOrdinalPadding:!0,startOnTick:!1,endOnTick:!1,minPadding:0,maxPadding:0,zoomEnabled:!1},b.inverted?{offsets:[m,0,-m,0],width:c}:{offsets:[0, +-m,0,m],height:c})),n.yAxis=new a(b,q(d.yAxis,{id:"navigator-y-axis",alignTicks:!1,offset:0,index:k,isInternal:!0,reversed:y(d.yAxis&&d.yAxis.reversed,b.yAxis[0]&&b.yAxis[0].reversed,!1),zoomEnabled:!1},b.inverted?{width:c}:{height:c})),g||d.series.data?n.updateNavigatorSeries(!1):0===b.series.length&&(n.unbindRedraw=p(b,"beforeRedraw",function(){0!a.options.isInternal).index:0);(b.series||[]).forEach((b,c)=>{b.options.isInternal||!b.options.showInNavigator&&(c!==a&&b.options.id!==a||!1===b.options.showInNavigator)||d.push(b)});this.xAxis&&!this.xAxis.navigatorAxis.fake&&this.updateNavigatorSeries(!0, +c)}updateNavigatorSeries(a,c){const b=this,d=b.chart,e=b.baseSeries,g={enableMouseTracking:!1,index:null,linkedTo:null,group:"nav",padXAxis:!1,xAxis:"navigator-x-axis",yAxis:"navigator-y-axis",showInLegend:!1,stacking:void 0,isInternal:!0,states:{inactive:{opacity:1}}},h=b.series=(b.series||[]).filter(a=>{const c=a.baseSeries;return 0>e.indexOf(c)?(c&&(l(c,"updatedData",b.updatedDataHandler),delete c.navigatorSeries),a.chart&&a.destroy(),!1):!0});let k,m,n=b.navigatorOptions.series,p;e&&e.length&& +e.forEach(a=>{const f=a.navigatorSeries;var l=D({color:a.color,visible:a.visible},E(n)?t.navigator.series:n);f&&!1===b.navigatorOptions.adaptToUpdatedData||(g.name="Navigator "+e.length,k=a.options||{},p=k.navigatorOptions||{},l.dataLabels=w(l.dataLabels),m=q(k,g,l,p),m.pointRange=y(l.pointRange,p.pointRange,t.plotOptions[m.type||"line"].pointRange),l=p.data||l.data,b.hasNavigatorData=b.hasNavigatorData||!!l,m.data=l||k.data&&k.data.slice(0),f&&f.options?f.update(m,c):(a.navigatorSeries=d.initSeries(m), +a.navigatorSeries.baseSeries=a,h.push(a.navigatorSeries)))});if(n.data&&(!e||!e.length)||E(n))b.hasNavigatorData=!1,n=w(n),n.forEach((a,c)=>{g.name="Navigator "+(h.length+1);m=q(t.navigator.series,{color:d.series[c]&&!d.series[c].options.isInternal&&d.series[c].color||d.options.colors[c]||d.options.colors[0]},g,a);m.data=a.data;m.data&&(b.hasNavigatorData=!0,h.push(d.initSeries(m)))});a&&this.addBaseSeriesEvents()}addBaseSeriesEvents(){const a=this,c=a.baseSeries||[];c[0]&&c[0].xAxis&&c[0].eventsToUnbind.push(p(c[0].xAxis, +"foundExtremes",this.modifyBaseAxisExtremes));c.forEach(b=>{b.eventsToUnbind.push(p(b,"show",function(){this.navigatorSeries&&this.navigatorSeries.setVisible(!0,!1)}));b.eventsToUnbind.push(p(b,"hide",function(){this.navigatorSeries&&this.navigatorSeries.setVisible(!1,!1)}));!1!==this.navigatorOptions.adaptToUpdatedData&&b.xAxis&&b.eventsToUnbind.push(p(b,"updatedData",this.updatedDataHandler));b.eventsToUnbind.push(p(b,"remove",function(){this.navigatorSeries&&(h(a.series,this.navigatorSeries),v(this.navigatorSeries.options)&& +this.navigatorSeries.remove(!1),delete this.navigatorSeries)}))})}getBaseSeriesMin(a){return this.baseSeries.reduce(function(a,b){return Math.min(a,b.xData&&b.xData.length?b.xData[0]:a)},a)}modifyNavigatorAxisExtremes(){const a=this.xAxis;if("undefined"!==typeof a.getExtremes){const b=this.getUnionExtremes(!0);!b||b.dataMin===a.min&&b.dataMax===a.max||(a.min=b.dataMin,a.max=b.dataMax)}}modifyBaseAxisExtremes(){const a=this.chart.navigator;var c=this.getExtremes();const d=c.dataMin,g=c.dataMax;c=c.max- +c.min;const h=a.stickToMin,k=a.stickToMax,l=y(this.options.overscroll,0),m=a.series&&a.series[0],n=!!this.setExtremes;let p,q;this.eventArgs&&"rangeSelectorButton"===this.eventArgs.trigger||(h&&(q=d,p=q+c),k&&(p=g+l,h||(q=Math.max(d,p-c,a.getBaseSeriesMin(m&&m.xData?m.xData[0]:-Number.MAX_VALUE)))),n&&(h||k)&&e(q)&&(this.min=this.userMin=q,this.max=this.userMax=p));a.stickToMin=a.stickToMax=null}updatedDataHandler(){const a=this.chart.navigator,c=this.navigatorSeries;a.stickToMax=y(this.chart.options.navigator&& +this.chart.options.navigator.stickToMax,a.reversedExtremes?0===Math.round(a.zoomedMin):Math.round(a.zoomedMax)>=Math.round(a.size));a.stickToMin=a.shouldStickToMin(this,a);c&&!a.hasNavigatorData&&(c.options.pointStart=this.xData[0],c.setData(this.options.data,!1,null,!1))}shouldStickToMin(a,c){c=c.getBaseSeriesMin(a.xData[0]);var b=a.xAxis;a=b.max;const d=b.min;b=b.options.range;return e(a)&&e(d)?b&&0{a.destroy&&a.destroy()});"series xAxis yAxis shades outline scrollbarTrack scrollbarRifles scrollbarGroup scrollbar navigatorGroup rendered".split(" ").forEach(a=>{this[a]&&this[a].destroy&&this[a].destroy();this[a]=null});[this.handles].forEach(a=>{n(a)})}}return g});M(a,"Stock/RangeSelector/RangeSelectorDefaults.js",[],function(){return{lang:{rangeSelectorZoom:"Zoom",rangeSelectorFrom:"", +rangeSelectorTo:"\u2192"},rangeSelector:{allButtonsEnabled:!1,buttons:void 0,buttonSpacing:5,dropdown:"responsive",enabled:void 0,verticalAlign:"top",buttonTheme:{width:28,height:18,padding:2,zIndex:7},floating:!1,x:0,y:0,height:void 0,inputBoxBorderColor:"none",inputBoxHeight:17,inputBoxWidth:void 0,inputDateFormat:"%e %b %Y",inputDateParser:void 0,inputEditDateFormat:"%Y-%m-%d",inputEnabled:!0,inputPosition:{align:"right",x:0,y:0},inputSpacing:5,selected:void 0,buttonPosition:{align:"left",x:0, +y:0},inputStyle:{color:"#334eff",cursor:"pointer",fontSize:"0.8em"},labelStyle:{color:"#666666",fontSize:"0.8em"}}}});M(a,"Stock/RangeSelector/RangeSelectorComposition.js",[a["Core/Defaults.js"],a["Stock/RangeSelector/RangeSelectorDefaults.js"],a["Core/Utilities.js"]],function(a,A,H){function u(){const a=this.range,d=a.type,e=this.max,b=this.chart.time,c=function(a,c){const f="year"===d?"FullYear":"Month",e=new b.Date(a),g=b.get(f,e);b.set(f,e,g+c);g===b.get(f,e)&&b.set("Date",e,0);return e.getTime()- +a};let f,h;D(a)?(f=e-a,h=a):a&&(f=e+c(e,-(a.count||1)),this.chart&&(this.chart.fixedRange=e-f));const k=E(this.dataMin,Number.MIN_VALUE);D(f)||(f=k);f<=k&&(f=k,"undefined"===typeof h&&(h=c(f,a.count)),this.newMax=Math.min(f+h,E(this.dataMax,Number.MAX_VALUE)));D(e)?!D(a)&&a&&a._offsetMin&&(f+=a._offsetMin):f=void 0;return f}function F(){this.options.rangeSelector&&this.options.rangeSelector.enabled&&(this.rangeSelector=new y(this))}function G(){var a=this.axes;const d=this.rangeSelector;d&&(D(d.deferredYTDClick)&& +(d.clickButton(d.deferredYTDClick),delete d.deferredYTDClick),a.forEach(a=>{a.updateNames();a.setScale()}),this.getAxisMargins(),d.render(),a=d.options.verticalAlign,d.options.floating||("bottom"===a?this.extraBottomMargin=!0:"middle"!==a&&(this.extraTopMargin=!0)))}function C(a){let d,g,b,c;const f=a.rangeSelector,l=()=>{f&&(d=a.xAxis[0].getExtremes(),g=a.legend,c=f&&f.options.verticalAlign,D(d.min)&&f.render(d.min,d.max),g.display&&"top"===c&&c===g.options.verticalAlign&&(b=L(a.spacingBox),b.y= +"vertical"===g.options.layout?a.plotTop:b.y+f.getHeight(),g.group.placed=!1,g.align(b)))};f&&(h(e,b=>b[0]===a)||e.push([a,[k(a.xAxis[0],"afterSetExtremes",function(a){f&&f.render(a.min,a.max)}),k(a,"redraw",l)]]),l())}function B(){for(let a=0,d=e.length;aa());e.splice(a,1);break}}}function t(){var a=this.rangeSelector;a&&(a=a.getHeight(),this.extraTopMargin&&(this.plotTop+=a),this.extraBottomMargin&&(this.marginBottom+=a))}function r(){var a=this.rangeSelector; +a&&!a.options.floating&&(a.render(),a=a.options.verticalAlign,"bottom"===a?this.extraBottomMargin=!0:"middle"!==a&&(this.extraTopMargin=!0))}function d(a){var d=a.options.rangeSelector;a=this.extraBottomMargin;const e=this.extraTopMargin;let b=this.rangeSelector;d&&d.enabled&&!v(b)&&this.options.rangeSelector&&(this.options.rangeSelector.enabled=!0,this.rangeSelector=b=new y(this));this.extraTopMargin=this.extraBottomMargin=!1;b&&(C(this),d=d&&d.verticalAlign||b.options&&b.options.verticalAlign,b.options.floating|| +("bottom"===d?this.extraBottomMargin=!0:"middle"!==d&&(this.extraTopMargin=!0)),this.extraBottomMargin!==a||this.extraTopMargin!==e)&&(this.isDirtyBox=!0)}const {defaultOptions:p,setOptions:m}=a,{addEvent:k,defined:v,extend:n,find:h,isNumber:D,merge:L,pick:E}=H,e=[],q=[];let y;return{compose:function(a,e,g){y=g;H.pushUnique(q,a)&&(a.prototype.minFromRange=u);H.pushUnique(q,e)&&(k(e,"afterGetContainer",F),k(e,"beforeRender",G),k(e,"destroy",B),k(e,"getMargins",t),k(e,"render",r),k(e,"update",d),e.prototype.callbacks.push(C)); +H.pushUnique(q,m)&&(n(p,{rangeSelector:A.rangeSelector}),n(p.lang,A.lang))}}});M(a,"Stock/RangeSelector/RangeSelector.js",[a["Core/Axis/Axis.js"],a["Core/Defaults.js"],a["Core/Globals.js"],a["Stock/RangeSelector/RangeSelectorComposition.js"],a["Core/Renderer/SVG/SVGElement.js"],a["Core/Utilities.js"]],function(a,A,H,I,F,G){function u(a){if(-1!==a.indexOf("%L"))return"text";const d="aAdewbBmoyY".split("").some(b=>-1!==a.indexOf("%"+b)),b="HkIlMS".split("").some(b=>-1!==a.indexOf("%"+b));return d&& +b?"datetime-local":d?"date":b?"time":"text"}const {defaultOptions:B}=A,{addEvent:t,createElement:r,css:d,defined:p,destroyObjectProperties:m,discardElement:k,extend:v,fireEvent:n,isNumber:h,merge:D,objectEach:L,pad:E,pick:e,pInt:q,splat:y}=G;class l{static compose(a,d){I.compose(a,d,l)}constructor(a){this.buttons=void 0;this.buttonOptions=l.prototype.defaultButtons;this.initialButtonGroupWidth=0;this.options=void 0;this.chart=a;this.init(a)}clickButton(d,g){const b=this.chart,c=this.buttonOptions[d], +f=b.xAxis[0];var k=b.scroller&&b.scroller.getUnionExtremes()||f||{},l=c.type;const m=c.dataGrouping;let q=k.dataMin,r=k.dataMax,w,u=f&&Math.round(Math.min(f.max,e(r,f.max))),v;k=c._range;let B,A,E,C=!0;if(null!==q&&null!==r){b.fixedRange=k;this.setSelected(d);m&&(this.forcedDataGrouping=!0,a.prototype.setDataGrouping.call(f||{chart:this.chart},m,!1),this.frozenStates=c.preserveDataGrouping);if("month"===l||"year"===l)f?(l={range:c,max:u,chart:b,dataMin:q,dataMax:r},w=f.minFromRange.call(l),h(l.newMax)&& +(u=l.newMax),C=!1):k=c;else if(k)w=Math.max(u-k,q),u=Math.min(w+k,r),C=!1;else if("ytd"===l)if(f){if("undefined"===typeof r||"undefined"===typeof q)q=Number.MAX_VALUE,r=Number.MIN_VALUE,b.series.forEach(a=>{if(a=a.xData)q=Math.min(a[0],q),r=Math.max(a[a.length-1],r)}),g=!1;l=this.getYTDExtremes(r,q,b.time.useUTC);w=B=l.min;u=l.max}else{this.deferredYTDClick=d;return}else"all"===l&&f&&(b.navigator&&b.navigator.baseSeries[0]&&(b.navigator.baseSeries[0].xAxis.options.range=void 0),w=q,u=r);C&&c._offsetMin&& +p(w)&&(w+=c._offsetMin);c._offsetMax&&p(u)&&(u+=c._offsetMax);this.dropdown&&(this.dropdown.selectedIndex=d+1);f?f.setExtremes(w,u,e(g,!0),void 0,{trigger:"rangeSelectorButton",rangeSelectorButton:c}):(v=y(b.options.xAxis)[0],E=v.range,v.range=k,A=v.min,v.min=B,t(b,"load",function(){v.range=E;v.min=A}));n(this,"afterBtnClick")}}setSelected(a){this.selected=this.options.selected=a}init(a){const d=this,b=a.options.rangeSelector,c=b.buttons||d.defaultButtons.slice(),f=b.selected,e=function(){const a= +d.minInput,b=d.maxInput;a&&a.blur&&n(a,"blur");b&&b.blur&&n(b,"blur")};d.chart=a;d.options=b;d.buttons=[];d.buttonOptions=c;this.eventsToUnbind=[];this.eventsToUnbind.push(t(a.container,"mousedown",e));this.eventsToUnbind.push(t(a,"resize",e));c.forEach(d.computeButtonRange);"undefined"!==typeof f&&c[f]&&this.clickButton(f,!1);this.eventsToUnbind.push(t(a,"load",function(){a.xAxis&&a.xAxis[0]&&t(a.xAxis[0],"setExtremes",function(b){this.max-this.min!==a.fixedRange&&"rangeSelectorButton"!==b.trigger&& +"updatedData"!==b.trigger&&d.forcedDataGrouping&&!d.frozenStates&&this.setDataGrouping(!1,!1)})}))}updateButtonStates(){const a=this;var d=this.chart;const b=this.dropdown,c=d.xAxis[0],f=Math.round(c.max-c.min),e=!c.hasVisibleSeries,k=d.scroller&&d.scroller.getUnionExtremes()||c,l=k.dataMin,m=k.dataMax;d=a.getYTDExtremes(m,l,d.time.useUTC);const n=d.min,q=d.max,p=a.selected,r=a.options.allButtonsEnabled,t=a.buttons;let u=h(p);a.buttonOptions.forEach((d,g)=>{var h=d._range,k=d.type,x=d.count||1;const w= +t[g],v=d._offsetMax-d._offsetMin,z=g===p,y=h>m-l,B=h=864E5*{month:28,year:365}[k]*x-v&&f-36E5<=864E5*{month:31,year:366}[k]*x+v?h=!0:"ytd"===k?(h=q-n+v===f,A=!z):"all"===k&&(h=c.max-c.min>=m-l,J=!z&&u&&h);k=!r&&(y||B||J||e);x=z&&h||h&&!u&&!A||z&&a.frozenStates;k?d=3:x&&(u=!0,d=2);w.state!==d&&(w.setState(d),b&&(b.options[g+1].disabled=k,2===d&&(b.selectedIndex=g+1)),0===d&&p===g&&a.setSelected())})}computeButtonRange(a){const d= +a.type,b=a.count||1,c={millisecond:1,second:1E3,minute:6E4,hour:36E5,day:864E5,week:6048E5};if(c[d])a._range=c[d]*b;else if("month"===d||"year"===d)a._range=864E5*{month:30,year:365}[d]*b;a._offsetMin=e(a.offsetMin,0);a._offsetMax=e(a.offsetMax,0);a._range+=a._offsetMax-a._offsetMin}getInputValue(a){a="min"===a?this.minInput:this.maxInput;const d=this.chart.options.rangeSelector,b=this.chart.time;return a?("text"===a.type&&d.inputDateParser||this.defaultInputDateParser)(a.value,b.useUTC,b):0}setInputValue(a, +d){const b=this.options,c=this.chart.time,f="min"===a?this.minInput:this.maxInput;a="min"===a?this.minDateBox:this.maxDateBox;if(f){var e=f.getAttribute("data-hc-time");e=p(e)?Number(e):void 0;p(d)&&(p(e)&&f.setAttribute("data-hc-time-previous",e),f.setAttribute("data-hc-time",d),e=d);f.value=c.dateFormat(this.inputTypeFormats[f.type]||b.inputEditDateFormat,e);a&&a.attr({text:c.dateFormat(b.inputDateFormat,e)})}}setInputExtremes(a,d,b){if(a="min"===a?this.minInput:this.maxInput){const c=this.inputTypeFormats[a.type], +f=this.chart.time;c&&(d=f.dateFormat(c,d),a.min!==d&&(a.min=d),b=f.dateFormat(c,b),a.max!==b&&(a.max=b))}}showInput(a){const e="min"===a?this.minDateBox:this.maxDateBox;if((a="min"===a?this.minInput:this.maxInput)&&e&&this.inputGroup){const b="text"===a.type,{translateX:c,translateY:f}=this.inputGroup,{inputBoxWidth:g}=this.options;d(a,{width:b?e.width+(g?-2:20)+"px":"auto",height:e.height-2+"px",border:"2px solid silver"});b&&g?d(a,{left:c+e.x+"px",top:f+"px"}):d(a,{left:Math.min(Math.round(e.x+ +c-(a.offsetWidth-e.width)/2),this.chart.chartWidth-a.offsetWidth)+"px",top:f-(a.offsetHeight-e.height)/2+"px"})}}hideInput(a){(a="min"===a?this.minInput:this.maxInput)&&d(a,{top:"-9999em",border:0,width:"1px",height:"1px"})}defaultInputDateParser(a,d,b){var c=a.split("/").join("-").split(" ").join("T");-1===c.indexOf("T")&&(c+="T00:00");if(d)c+="Z";else{var e;if(e=H.isSafari)e=c,e=!(6=e?`+${E(-e)}:00`:`-${E(e)}:00`)}c=Date.parse(c);h(c)||(a=a.split("-"),c=Date.UTC(q(a[0]),q(a[1])-1,q(a[2])));b&&d&&h(c)&&(c+=b.getTimezoneOffset(c));return c}drawInput(a){function e(){const {maxInput:c,minInput:d}=k,e=b.xAxis[0];var f=b.scroller&&b.scroller.xAxis?b.scroller.xAxis:e;const g=f.dataMin;f=f.dataMax;let l=k.getInputValue(a);l!==Number(t.getAttribute("data-hc-time-previous"))&&h(l)&&(t.setAttribute("data-hc-time-previous",l),q&&c&&h(g)?l>Number(c.getAttribute("data-hc-time"))? +l=void 0:lf&&(l=f)),"undefined"!==typeof l&&e.setExtremes(q?l:e.min,q?e.max:l,void 0,void 0,{trigger:"rangeSelectorInput"}))}const {chart:b,div:c,inputGroup:f}=this,k=this,l=b.renderer.style||{};var m=b.renderer;const n=b.options.rangeSelector,q="min"===a;var p=B.lang[q?"rangeSelectorFrom":"rangeSelectorTo"]||"";p=m.label(p,0).addClass("highcharts-range-label").attr({padding:p?2:0,height:p?n.inputBoxHeight:0}).add(f);m=m.label("", +0).addClass("highcharts-range-input").attr({padding:2,width:n.inputBoxWidth,height:n.inputBoxHeight,"text-align":"center"}).on("click",function(){k.showInput(a);k[a+"Input"].focus()});b.styledMode||m.attr({stroke:n.inputBoxBorderColor,"stroke-width":1});m.add(f);const t=r("input",{name:a,className:"highcharts-range-selector"},void 0,c);t.setAttribute("type",u(n.inputDateFormat||"%e %b %Y"));b.styledMode||(p.css(D(l,n.labelStyle)),m.css(D({color:"#333333"},l,n.inputStyle)),d(t,v({position:"absolute", +border:0,boxShadow:"0 0 15px rgba(0,0,0,0.3)",width:"1px",height:"1px",padding:0,textAlign:"center",fontSize:l.fontSize,fontFamily:l.fontFamily,top:"-9999em"},n.inputStyle)));t.onfocus=()=>{k.showInput(a)};t.onblur=()=>{t===H.doc.activeElement&&e();k.hideInput(a);k.setInputValue(a);t.blur()};let w=!1;t.onchange=()=>{w||(e(),k.hideInput(a),t.blur())};t.onkeypress=a=>{13===a.keyCode&&e()};t.onkeydown=a=>{w=!0;38!==a.keyCode&&40!==a.keyCode||e()};t.onkeyup=()=>{w=!1};return{dateBox:m,input:t,label:p}}getPosition(){var a= +this.chart;const d=a.options.rangeSelector;a="top"===d.verticalAlign?a.plotTop-a.axisOffset[0]:0;return{buttonTop:a+d.buttonPosition.y,inputTop:a+d.inputPosition.y-10}}getYTDExtremes(a,d,b){const c=this.chart.time;var e=new c.Date(a);const g=c.get("FullYear",e);b=b?c.Date.UTC(g,0,1):+new c.Date(g,0,1);d=Math.max(d,b);e=e.getTime();return{max:Math.min(a||e,e),min:d}}render(a,d){var b=this.chart,c=b.renderer;const f=b.container;var g=b.options;const h=g.rangeSelector,k=e(g.chart.style&&g.chart.style.zIndex, +0)+1;g=h.inputEnabled;if(!1!==h.enabled){this.rendered||(this.group=c.g("range-selector-group").attr({zIndex:7}).add(),this.div=r("div",void 0,{position:"relative",height:0,zIndex:k}),this.buttonOptions.length&&this.renderButtons(),f.parentNode&&f.parentNode.insertBefore(this.div,f),g&&(this.inputGroup=c.g("input-group").add(this.group),c=this.drawInput("min"),this.minDateBox=c.dateBox,this.minLabel=c.label,this.minInput=c.input,c=this.drawInput("max"),this.maxDateBox=c.dateBox,this.maxLabel=c.label, +this.maxInput=c.input));if(g&&(this.setInputValue("min",a),this.setInputValue("max",d),a=b.scroller&&b.scroller.getUnionExtremes()||b.xAxis[0]||{},p(a.dataMin)&&p(a.dataMax)&&(b=b.xAxis[0].minRange||0,this.setInputExtremes("min",a.dataMin,Math.min(a.dataMax,this.getInputValue("max"))-b),this.setInputExtremes("max",Math.max(a.dataMin,this.getInputValue("min"))+b,a.dataMax)),this.inputGroup)){let a=0;[this.minLabel,this.minDateBox,this.maxLabel,this.maxDateBox].forEach(b=>{if(b){const {width:c}=b.getBBox(); +c&&(b.attr({x:a}),a+=c+h.inputSpacing)}})}this.alignElements();this.rendered=!0}}renderButtons(){const {buttons:a,chart:d,options:b}=this,c=B.lang,f=d.renderer,h=D(b.buttonTheme),k=h&&h.states,l=h.width||28;delete h.width;delete h.states;this.buttonGroup=f.g("range-selector-buttons").add(this.group);const m=this.dropdown=r("select",void 0,{position:"absolute",width:"1px",height:"1px",padding:0,border:0,top:"-9999em",cursor:"pointer",opacity:.0001},this.div);t(m,"touchstart",()=>{m.style.fontSize= +"16px"});[[H.isMS?"mouseover":"mouseenter"],[H.isMS?"mouseout":"mouseleave"],["change","click"]].forEach(([b,c])=>{t(m,b,()=>{const d=a[this.currentButtonIndex()];d&&n(d.element,c||b)})});this.zoomText=f.label(c&&c.rangeSelectorZoom||"",0).attr({padding:b.buttonTheme.padding,height:b.buttonTheme.height,paddingLeft:0,paddingRight:0}).add(this.buttonGroup);this.chart.styledMode||(this.zoomText.css(b.labelStyle),h["stroke-width"]=e(h["stroke-width"],0));r("option",{textContent:this.zoomText.textStr, +disabled:!0},void 0,m);this.buttonOptions.forEach((b,c)=>{r("option",{textContent:b.title||b.text},void 0,m);a[c]=f.button(b.text,0,0,a=>{const d=b.events&&b.events.click;let e;d&&(e=d.call(b,a));!1!==e&&this.clickButton(c);this.isActive=!0},h,k&&k.hover,k&&k.select,k&&k.disabled).attr({"text-align":"center",width:l}).add(this.buttonGroup);b.title&&a[c].attr("title",b.title)})}alignElements(){const {buttonGroup:a,buttons:d,chart:b,group:c,inputGroup:f,options:h,zoomText:k}=this;var l=b.options;const m= +l.exporting&&!1!==l.exporting.enabled&&l.navigation&&l.navigation.buttonOptions,{buttonPosition:n,inputPosition:p,verticalAlign:q}=h;l=(a,c)=>m&&this.titleCollision(b)&&"top"===q&&"right"===c.align&&c.y-a.getBBox().height-12<(m.y||0)+(m.height||0)+b.spacing[0]?-40:0;var r=b.plotLeft;if(c&&n&&p){var t=n.x-b.spacing[3];if(a){this.positionButtons();if(!this.initialButtonGroupWidth){let a=0;k&&(a+=k.getBBox().width+5);d.forEach((b,c)=>{a+=b.width;c!==d.length-1&&(a+=h.buttonSpacing)});this.initialButtonGroupWidth= +a}r-=b.spacing[3];this.updateButtonStates();var u=l(a,n);this.alignButtonGroup(u);c.placed=a.placed=b.hasLoaded}u=0;f&&(u=l(f,p),"left"===p.align?t=r:"right"===p.align&&(t=-Math.max(b.axisOffset[1],-u)),f.align({y:p.y,width:f.getBBox().width,align:p.align,x:p.x+t-2},!0,b.spacingBox),f.placed=b.hasLoaded);this.handleCollision(u);c.align({verticalAlign:q},!0,b.spacingBox);l=c.alignAttr.translateY;r=c.getBBox().height+20;t=0;"bottom"===q&&(t=(t=b.legend&&b.legend.options)&&"bottom"===t.verticalAlign&& +t.enabled&&!t.floating?b.legend.legendHeight+e(t.margin,10):0,r=r+t-20,t=l-r-(h.floating?0:h.y)-(b.titleOffset?b.titleOffset[2]:0)-10);if("top"===q)h.floating&&(t=0),b.titleOffset&&b.titleOffset[0]&&(t=b.titleOffset[0]),t+=b.margin[0]-b.spacing[0]||0;else if("middle"===q)if(p.y===n.y)t=l;else if(p.y||n.y)t=0>p.y||0>n.y?t-Math.min(p.y,n.y):l-r;c.translate(h.x,h.y+Math.floor(t));const {minInput:g,maxInput:m,dropdown:x}=this;h.inputEnabled&&g&&m&&(g.style.marginTop=c.translateY+"px",m.style.marginTop= +c.translateY+"px");x&&(x.style.marginTop=c.translateY+"px")}}alignButtonGroup(a,d){const {chart:b,options:c,buttonGroup:f}=this,{buttonPosition:g}=c,h=b.plotLeft-b.spacing[3];let k=g.x-b.spacing[3];"right"===g.align?k+=a-h:"center"===g.align&&(k-=h/2);f&&f.align({y:g.y,width:e(d,this.initialButtonGroupWidth),align:g.align,x:k},!0,b.spacingBox)}positionButtons(){const {buttons:a,chart:d,options:b,zoomText:c}=this,f=d.hasLoaded?"animate":"attr",{buttonPosition:h}=b,k=d.plotLeft;let l=k;c&&"hidden"!== +c.visibility&&(c[f]({x:e(k+h.x,k)}),l+=h.x+c.getBBox().width+5);for(let c=0,d=this.buttonOptions.length;c{let a=0;this.buttons.forEach(b=>{b=b.getBBox();b.width>a&&(a=b.width)});return a},m=d=>{if(c&&b){const f=c.alignAttr.translateX+c.alignOptions.x-a+c.getBBox().x+ +2,g=c.alignOptions.width,h=b.alignAttr.translateX+b.getBBox().x;return h+d>f&&f+g>h&&e.y{c&&b&&c.attr({translateX:c.alignAttr.translateX+(d.axisOffset[1]>=-a?0:-a),translateY:c.alignAttr.translateY+b.getBBox().height+10})};if(b){if("always"===h){this.collapseButtons(a);m(l())&&n();return}"never"===h&&this.expandButtons()}c&&b?k.align===e.align||m(this.initialButtonGroupWidth+20)?"responsive"===h?(this.collapseButtons(a),m(l())&&n()):n():"responsive"===h&&this.expandButtons(): +b&&"responsive"===h&&(this.initialButtonGroupWidth>d.plotWidth?this.collapseButtons(a):this.expandButtons())}collapseButtons(a){const {buttons:d,buttonOptions:b,chart:c,dropdown:f,options:h,zoomText:k}=this,l=c.userOptions.rangeSelector&&c.userOptions.rangeSelector.buttonTheme||{},m=a=>({text:a?`${a} \u25be`:"\u25be",width:"auto",paddingLeft:e(h.buttonTheme.paddingLeft,l.padding,8),paddingRight:e(h.buttonTheme.paddingRight,l.padding,8)});k&&k.hide();let n=!1;b.forEach((a,b)=>{b=d[b];2!==b.state?b.hide(): +(b.show(),b.attr(m(a.text)),n=!0)});n||(f&&(f.selectedIndex=0),d[0].show(),d[0].attr(m(this.zoomText&&this.zoomText.textStr)));const {align:p}=h.buttonPosition;this.positionButtons();"right"!==p&&"center"!==p||this.alignButtonGroup(a,d[this.currentButtonIndex()].getBBox().width);this.showDropdown()}expandButtons(){const {buttons:a,buttonOptions:d,options:b,zoomText:c}=this;this.hideDropdown();c&&c.show();d.forEach((c,d)=>{d=a[d];d.show();d.attr({text:c.text,width:b.buttonTheme.width||28,paddingLeft:e(b.buttonTheme.paddingLeft, +"unset"),paddingRight:e(b.buttonTheme.paddingRight,"unset")});2>d.state&&d.setState(0)});this.positionButtons()}currentButtonIndex(){const {dropdown:a}=this;return a&&0e&&0>c||0a()),a.eventsToUnbind=void 0);m(a.buttons);d&&(d.onfocus=d.onblur=d.onchange=null);b&&(b.onfocus=b.onblur=b.onchange=null);L(a,function(b,d){b&&"chart"!==d&&(b instanceof F?b.destroy():b instanceof V.HTMLElement&&k(b));b!==l.prototype[d]&&(a[d]=null)},this)}}v(l.prototype,{defaultButtons:[{type:"month",count:1,text:"1m",title:"View 1 month"},{type:"month",count:3,text:"3m",title:"View 3 months"},{type:"month",count:6,text:"6m", +title:"View 6 months"},{type:"ytd",text:"YTD",title:"View year to date"},{type:"year",count:1,text:"1y",title:"View 1 year"},{type:"all",text:"All",title:"View all"}],inputTypeFormats:{"datetime-local":"%Y-%m-%dT%H:%M:%S",date:"%Y-%m-%d",time:"%H:%M:%S"}});"";return l});M(a,"Core/Axis/OrdinalAxis.js",[a["Core/Axis/Axis.js"],a["Core/Globals.js"],a["Core/Series/Series.js"],a["Core/Utilities.js"]],function(a,A,H,I){const {addEvent:u,correctFloat:G,css:C,defined:B,error:t,pick:r,timeUnits:d}=I,p=[];var m; +(function(a){function k(a,c,e,g,h=[],k=0,l){const b={},f=this.options.tickPixelInterval;var m=this.chart.time,n=[],p;let q;let r;var x=0;let u=[],v=-Number.MAX_VALUE;if(!this.options.ordinal&&!this.options.breaks||!h||3>h.length||"undefined"===typeof c)return m.getTimeTicks.apply(m,arguments);const w=h.length;for(p=0;pe;h[p]5*k||r){if(h[p]>v){for(q=m.getTimeTicks(a,h[x],h[p],g);q.length&&q[0]<=v;)q.shift();q.length&&(v=q[q.length-1]);n.push(u.length); +u=u.concat(q)}x=p+1}if(r)break}if(q){h=q.info;if(l&&h.unitRange<=d.hour){p=u.length-1;for(x=1;xe?x-1:x;for(a=void 0;p--;)n=m[p],x=Math.abs(a-n),a&&x<.8*f&&(null===z||x< +.8*z)?(b[u[p]]&&!b[u[p+1]]?(x=p+1,a=n):x=p,u.splice(x,1)):a=n}return u}function m(a){const b=this.ordinal.positions;if(!b)return a;let d=b.length-1,e;0>a?a=b[0]:a>d?a=b[d]:(d=Math.floor(a),e=a-d);return"undefined"!==typeof e&&"undefined"!==typeof b[d]?b[d]+(e?e*(b[d+1]-b[d]):0):a}function h(a){var b=this.ordinal,d=b.positions;if(!d)return a;var e=(a-(this.old?this.old.min:this.min))*(this.old?this.old.transA:this.transA)+this.minPixelPadding;0a?e+c*a:d+c*(a-b)}return a}function D(b,c){const d=a.Additions.findIndexOf(b,c,!0);return b[d]===c?d:d+(c-b[d])/(b[d+1]-b[d])}function F(){this.ordinal||(this.ordinal=new a.Additions(this))}function E(){this.isXAxis&&B(this.options.overscroll)&& +this.max===this.dataMax&&(!this.chart.mouseIsDown||this.isInternal)&&(!this.eventArgs||this.eventArgs&&"navigator"!==this.eventArgs.trigger)&&(this.max+=this.options.overscroll,!this.isInternal&&B(this.userMin)&&(this.min+=this.options.overscroll))}function e(){this.horiz&&!this.isDirty&&(this.isDirty=this.isOrdinal&&this.chart.navigator&&!this.chart.navigator.adaptToUpdatedData)}function q(){this.ordinal&&(this.ordinal.beforeSetTickPositions(),this.tickInterval=this.ordinal.postProcessTickInterval(this.tickInterval))} +function y(a){const b=this.xAxis[0],d=b.options.overscroll,e=a.originalEvent.chartX,g=this.options.chart.panning;let h=!1;if(g&&"y"!==g.type&&b.options.ordinal&&b.series.length){var k=this.mouseDownX;const a=b.getExtremes(),c=a.dataMax,f=a.min,g=a.max;var l=this.hoverPoints,m=b.closestPointRange||b.ordinal&&b.ordinal.overscrollPointsRange;k=(k-e)/(b.translationSlope*(b.ordinal.slope||m));m=b.ordinal.getExtendedPositions();var n={ordinal:{positions:m,extendedOrdinalPositions:m}};m=b.index2val;const p= +b.val2lin;let q;n.ordinal.positions?1k?(l=n,q=b.ordinal.positions?b:n):(l=b.ordinal.positions?b:n,q=n),n=q.ordinal.positions,c>n[n.length-1]&&n.push(c),this.fixedRange=g-f,k=b.navigatorAxis.toFixedRange(void 0,void 0,m.apply(l,[p.apply(l,[f,!0])+k]),m.apply(q,[p.apply(q,[g,!0])+k])),k.min>=Math.min(a.dataMin,f)&&k.max<=Math.max(c,g)+d&&b.setExtremes(k.min,k.max,!0,!1,{trigger:"pan"}),this.mouseDownX=e,C(this.container,{cursor:"move"})):h=!0}else h= +!0;h||g&&/y/.test(g.type)?d&&(b.max=b.dataMax+d):a.preventDefault()}function l(){const a=this.xAxis;a&&a.options.ordinal&&(delete a.ordinal.index,delete a.ordinal.extendedOrdinalPositions)}function w(a,c){const b=this.ordinal;var d=b.positions;let e=b.slope,g=b.extendedOrdinalPositions;if(!d)return a;var h=d.length;if(d[0]<=a&&d[h-1]>=a)a=D(d,a);else{g||(g=b.getExtendedPositions&&b.getExtendedPositions(),b.extendedOrdinalPositions=g);if(!g||!g.length)return a;h=g.length;e||(e=(g[h-1]-g[0])/h);d=D(g, +d[0]);a=a>=g[0]&&a<=g[h-1]?D(g,a)-d:aw||g-p[p.length-1]>w)&&(t=!0)}else a.options.overscroll&&(2===l?q=p[1]-p[0]:1===l?(q=a.options.overscroll,p=[p[0],p[0]+q]): +q=c.overscrollPointsRange);t||a.forceOrdinal?(a.options.overscroll&&(c.overscrollPointsRange=q,p=p.concat(c.getOverscrollPositions())),c.positions=p,w=a.ordinal2lin(Math.max(e,p[0]),!0),n=Math.max(a.ordinal2lin(Math.min(g,p[p.length-1]),!0),1),c.slope=g=(g-e)/(n-w),c.offset=e-w*g):(c.overscrollPointsRange=r(a.closestPointRange,c.overscrollPointsRange),c.positions=a.ordinal.slope=c.offset=void 0)}a.isOrdinal=d&&t;c.groupIntervalFactor=null}static findIndexOf(a,c,d){let b=0,e=a.length-1,f;for(;b=r(b.min,-Infinity)&&(e=a.points[0].plotX)});a=(a-e)/(b.translationSlope*(this.slope||b.closestPointRange||this.overscrollPointsRange));return g.findIndexOf(c,d)+a}getOverscrollPositions(){const a=this.axis,c=a.options.overscroll, +d=this.overscrollPointsRange,e=[];let g=a.dataMax;if(B(d))for(;g<=a.dataMax+c;)g+=d,e.push(g);return e}postProcessTickInterval(a){const b=this.axis,d=this.slope;return d?b.options.breaks?b.closestPointRange||a:a/(d/b.closestPointRange):a}}a.Additions=g})(m||(m={}));return m});M(a,"Series/HLC/HLCPoint.js",[a["Core/Series/SeriesRegistry.js"]],function(a){({column:{prototype:{pointClass:a}}}=a.seriesTypes);class u extends a{constructor(){super(...arguments);this.series=this.plotClose=this.options=this.low= +this.high=this.close=void 0}}return u});M(a,"Series/HLC/HLCSeriesDefaults.js",[],function(){"";return{lineWidth:1,tooltip:{pointFormat:'\u25cf {series.name}
High: {point.high}
Low: {point.low}
Close: {point.close}
'},threshold:null,states:{hover:{lineWidth:3}},stickyTracking:!0}});M(a,"Series/HLC/HLCSeries.js",[a["Series/HLC/HLCPoint.js"],a["Series/HLC/HLCSeriesDefaults.js"],a["Core/Series/SeriesRegistry.js"],a["Core/Utilities.js"]], +function(a,A,H,I){const {column:u}=H.seriesTypes,{extend:G,merge:C}=I;class B extends u{constructor(){super(...arguments);this.yData=this.points=this.options=this.data=void 0}extendStem(a,r,d){const p=a[0];a=a[1];"number"===typeof p[2]&&(p[2]=Math.max(d+r,p[2]));"number"===typeof a[2]&&(a[2]=Math.min(d-r,a[2]))}getPointPath(a,r){r=r.strokeWidth();const d=a.series,p=r%2/2,m=Math.round(a.plotX)-p,k=Math.round(a.shapeArgs.width/2),t=[["M",m,Math.round(a.yBottom)],["L",m,Math.round(a.plotHigh)]];null!== +a.close&&(a=Math.round(a.plotClose)+p,t.push(["M",m,a],["L",m+k,a]),d.extendStem(t,r/2,a));return t}drawSinglePoint(a){var r=a.series;const d=r.chart;let p=a.graphic;"undefined"!==typeof a.plotY&&(p||(a.graphic=p=d.renderer.path().add(r.group)),d.styledMode||p.attr(r.pointAttribs(a,a.selected&&"select")),r=r.getPointPath(a,p),p[p?"animate":"attr"]({d:r}).addClass(a.getClassName(),!0))}drawPoints(){this.points.forEach(this.drawSinglePoint)}init(){super.init.apply(this,arguments);this.options.stacking= +void 0}pointAttribs(a,r){a=super.pointAttribs.call(this,a,r);delete a.fill;return a}toYData(a){return[a.high,a.low,a.close]}translate(){const a=this,r=a.yAxis,d=this.pointArrayMap&&this.pointArrayMap.slice()||[],p=d.map(a=>`plot${a.charAt(0).toUpperCase()+a.slice(1)}`);p.push("yBottom");d.push("low");super.translate.apply(a);a.points.forEach(function(m){d.forEach(function(d,t){d=m[d];null!==d&&(a.dataModify&&(d=a.dataModify.modifyValue(d)),m[p[t]]=r.toPixels(d,!0))});m.tooltipPos[1]=m.plotHigh+r.pos- +a.chart.plotTop})}}B.defaultOptions=C(u.defaultOptions,A);G(B.prototype,{pointClass:a,animate:null,directTouch:!1,pointArrayMap:["high","low","close"],pointAttrToOptions:{stroke:"color","stroke-width":"lineWidth"},pointValKey:"close"});H.registerSeriesType("hlc",B);return B});M(a,"Series/OHLC/OHLCPoint.js",[a["Core/Series/SeriesRegistry.js"]],function(a){({seriesTypes:{hlc:a}}=a);class u extends a.prototype.pointClass{constructor(){super(...arguments);this.series=this.plotOpen=this.options=this.open= +void 0}getClassName(){return super.getClassName.call(this)+(this.open\u25cf {series.name}
Open: {point.open}
High: {point.high}
Low: {point.low}
Close: {point.close}
'}}});M(a,"Series/OHLC/OHLCSeries.js",[a["Series/OHLC/OHLCPoint.js"],a["Series/OHLC/OHLCSeriesDefaults.js"],a["Core/Series/SeriesRegistry.js"],a["Core/Utilities.js"]],function(a,A,H,I){function u(a){a=a.options;const d=a.dataGrouping;d&&a.useOhlcData&& +"highcharts-navigator-series"!==a.id&&(d.approximation="ohlc")}function G(a){a=a.options;a.useOhlcData&&"highcharts-navigator-series"!==a.id&&t(this,{pointValKey:p.prototype.pointValKey,pointArrayMap:p.prototype.pointArrayMap,toYData:p.prototype.toYData})}const {seriesTypes:{hlc:C}}=H,{addEvent:B,extend:t,merge:r}=I,d=[];class p extends C{constructor(){super(...arguments);this.points=this.options=this.data=void 0}static compose(a,...k){I.pushUnique(d,a)&&(B(a,"afterSetOptions",u),B(a,"init",G))}getPointPath(a, +d){const k=super.getPointPath(a,d);d=d.strokeWidth();const m=d%2/2,h=Math.round(a.plotX)-m,p=Math.round(a.shapeArgs.width/2);null!==a.open&&(a=Math.round(a.plotOpen)+m,k.push(["M",h,a],["L",h-p,a]),super.extendStem(k,d/2,a));return k}pointAttribs(a,d){d=super.pointAttribs.call(this,a,d);const k=this.options;delete d.fill;!a.options.color&&k.upColor&&a.opend&&(t-=Math.round((p-d)/2),d=p);v=a[u](t,r,d,p);if(k&&m){let n=k;"circle"===u?n=t+d/2:(t=v[0],d=v[1],"M"===t[0]&&"L"===d[0]&&(n=(t[1]+d[1])/2));v.push(["M",n,r>m?r:r+p],["L",k,m]);v=v.concat(a.circle(k-1,m-1,2,2))}return v}} +const G=[];u.compose=function(u){-1===G.indexOf(u)&&(G.push(u),u=u.prototype.symbols,u.flag=A,F(u,"circle"),F(u,"square"));u=a.getRendererType();G.indexOf(u)&&G.push(u)}})(u||(u={}));return u});M(a,"Series/OnSeriesComposition.js",[a["Series/Column/ColumnSeries.js"],a["Core/Series/Series.js"],a["Core/Utilities.js"]],function(a,A,H){const {prototype:u}=a,{prototype:F}=A,{defined:G,stableSort:C}=H;var B;(function(a){function r(a){return F.getPlotBox.call(this.options.onSeries&&this.chart.get(this.options.onSeries)|| +this,a)}function d(){u.translate.apply(this);const a=this;var d=a.options,p=a.chart;const n=a.points;var h=d.onSeries;const r=(h=h&&p.get(h))&&h.options.step,t=h&&h.points,A=p.inverted,e=a.xAxis,q=a.yAxis;p=n.length-1;let y;d=d.onKey||"y";let l=t&&t.length,w=0,g,b,c,f;if(h&&h.visible&&l){w=(h.pointXOffset||0)+(h.barW||0)/2;var x=h.currentDataGrouping;b=t[l-1].x+(x?x.totalRange:0);C(n,(a,b)=>a.x-b.x);for(d="plot"+d[0].toUpperCase()+d.substr(1);l--&&n[p]&&!(g=t[l],x=n[p],x.y=g.y,g.x<=x.x&&"undefined"!== +typeof g[d]&&(x.x<=b&&(x.plotY=g[d],g.xp)););}n.forEach((b,c)=>{let d;b.plotX+=w;if("undefined"===typeof b.plotY||A)0<=b.plotX&&b.plotX<=e.len?A?(b.plotY=e.translate(b.x,0,1,0,1),b.plotX=G(b.y)?q.translate(b.y,0,0,0,1):0):b.plotY=(e.opposite?0:a.yAxis.len)+e.offset:b.shapeArgs={};(y=n[c-1])&&y.plotX===b.plotX&&("undefined"===typeof y.stackIndex&&(y.stackIndex=0),d=y.stackIndex+ +1);b.stackIndex=d});this.onSeries=h}const p=[];a.compose=function(a){if(H.pushUnique(p,a)){const k=a.prototype;k.getPlotBox=r;k.translate=d}return a};a.getPlotBox=r;a.translate=d})(B||(B={}));return B});M(a,"Series/Flags/FlagsSeries.js",[a["Series/Flags/FlagsPoint.js"],a["Series/Flags/FlagsSeriesDefaults.js"],a["Series/Flags/FlagsSymbols.js"],a["Core/Globals.js"],a["Series/OnSeriesComposition.js"],a["Core/Renderer/RendererUtilities.js"],a["Core/Series/SeriesRegistry.js"],a["Core/Renderer/SVG/SVGElement.js"], +a["Core/Utilities.js"]],function(a,A,H,I,F,G,C,B,t){({noop:I}=I);const {distribute:r}=G,{series:d,seriesTypes:{column:p}}=C,{addEvent:m,defined:k,extend:u,merge:n,objectEach:h,wrap:D}=t;class L extends p{constructor(){super(...arguments);this.points=this.options=this.data=void 0}animate(a){a&&this.setClip()}drawPoints(){var a=this.points,d=this.chart;const m=d.renderer,p=d.inverted,l=this.options,t=l.y,g=this.yAxis,b={},c=[];let f,u;let v,z;let A,C,F;for(v=a.length;v--;){z=a[v];C=(p?z.plotY:z.plotX)> +this.xAxis.len;f=z.plotX;var G=z.stackIndex;var H=z.options.shape||l.shape;u=z.plotY;"undefined"!==typeof u&&(u=z.plotY+t-("undefined"!==typeof G&&G*l.stackDistance));z.anchorX=G?void 0:z.plotX;A=G?void 0:z.plotY;F="flag"!==H;G=z.graphic;"undefined"!==typeof u&&0<=f&&!C?(G&&z.hasNewShapeType()&&(G=G.destroy()),G||(G=z.graphic=m.label("",null,null,H,null,null,l.useHTML).addClass("highcharts-point").add(this.markerGroup),z.graphic.div&&(z.graphic.div.point=z),G.isNew=!0),G.attr({align:F?"center":"left", +width:l.width,height:l.height,"text-align":l.textAlign}),d.styledMode||G.attr(this.pointAttribs(z)).css(n(l.style,z.style)).shadow(l.shadow),0l+c.width)&&(D?p=r=n(p,l,l+c.width):b=!0);b||u.push(["M", +p,q],["L",r,t])}):A.forEach(function(a){let b;p=a.pos;r=p+a.len;q=t=Math.round(m+c.height-F);"pass"!==D&&(qm+c.height)&&(D?q=t=n(q,m,m+c.height):b=!0);b||u.push(["M",p,q],["L",r,t])})),a.path=0B&&t=c&&(w=-(q.translateX+g.width-c));q.attr({x:p+w,y:n,anchorX:h?p:this.opposite?0:d.chartWidth,anchorY:h?this.opposite?d.chartHeight:0:n+g.height/2})}});B.prototype.forceCropping= +function(){const a=this.chart,b=this.options.dataGrouping;return!1!==this.allowDG&&b&&y(b.enabled,a.options.isStock)};u(A,"update",function(a){a=a.options;"scrollbar"in a&&this.navigator&&(q(!0,this.options.scrollbar,a.scrollbar),this.navigator.update({}),delete a.scrollbar)});return w});M(a,"masters/modules/stock.src.js",[a["Core/Globals.js"],a["Series/DataModifyComposition.js"],a["Stock/Navigator/Navigator.js"],a["Stock/RangeSelector/RangeSelector.js"],a["Stock/Scrollbar/Scrollbar.js"],a["Core/Axis/OrdinalAxis.js"], +a["Series/OHLC/OHLCSeries.js"],a["Series/Flags/FlagsSeries.js"],a["Core/Chart/StockChart.js"]],function(a,A,H,I,F,G,C,B,t){a.Navigator=H;a.RangeSelector=I;a.Scrollbar=F;a.StockChart=a.stockChart=t.stockChart;A.compose(a.Series,a.Axis,a.Point);B.compose(a.Renderer);H.compose(a.Axis,a.Chart,a.Series);C.compose(a.Series);G.compose(a.Axis,a.Series,a.Chart);I.compose(a.Axis,a.Chart);F.compose(a.Axis)});M(a,"masters/highstock.src.js",[a["masters/highcharts.src.js"]],function(a){a.product="Highstock";return a}); +a["masters/highstock.src.js"]._modules=a;return a["masters/highstock.src.js"]}); +//# sourceMappingURL=highstock.js.map \ No newline at end of file diff --git a/web/static/style.css b/web/static/style.css new file mode 100644 index 0000000..9c532b6 --- /dev/null +++ b/web/static/style.css @@ -0,0 +1,23 @@ +ul { + list-style-type: none; + margin: 0; + padding: 0; + overflow: hidden; + background-color: lightgrey; +} + +li { + float: left; +} + +li a { + display: block; + color: white; + text-align: center; + padding: 14px 16px; + text-decoration: none; +} + +li a:hover { + background-color: darkgrey; +} diff --git a/web/templates/data/add.html b/web/templates/data/add.html new file mode 100644 index 0000000..83d09e3 --- /dev/null +++ b/web/templates/data/add.html @@ -0,0 +1,20 @@ +{% for message in get_flashed_messages() %} +
{{ message }}
+
+{% endfor %} +
+ +
+ +

+ +
+ +

+ +
+ +

+ + back +
diff --git a/web/templates/data/base.html b/web/templates/data/base.html new file mode 100644 index 0000000..5743e0d --- /dev/null +++ b/web/templates/data/base.html @@ -0,0 +1,16 @@ + + + + + + + + + {% block title %}{% endblock %} - IOC + + + {% include 'data/navbar.html' %} +
+ {% block body %}{% endblock %} + + diff --git a/web/templates/data/index.html b/web/templates/data/index.html new file mode 100644 index 0000000..663da52 --- /dev/null +++ b/web/templates/data/index.html @@ -0,0 +1,113 @@ +{% extends 'data/base.html' %} +{% block title %}Dashboard{% endblock %} +{% block body %} + +
+
+ {% for id, value in button_count.items() %} +

Button {{ id }} was pressed: {{ value }} times.

+ {% endfor %} +{% endblock %} diff --git a/web/templates/data/led.html b/web/templates/data/led.html new file mode 100644 index 0000000..f7563a0 --- /dev/null +++ b/web/templates/data/led.html @@ -0,0 +1,24 @@ +{% extends 'data/base.html' %} +{% block title %}LED{% endblock %} +{% block body %} +{% for message in get_flashed_messages() %} +
{{ message }}
+
+{% endfor %} +
+ +
+ +

+ +

Set 0 to toggle, or any number to set the frequency.

+ +

+ + back +
+{% endblock %} diff --git a/web/templates/data/navbar.html b/web/templates/data/navbar.html new file mode 100644 index 0000000..0fc14e1 --- /dev/null +++ b/web/templates/data/navbar.html @@ -0,0 +1,6 @@ + diff --git a/web/templates/data/oled.html b/web/templates/data/oled.html new file mode 100644 index 0000000..8965f7d --- /dev/null +++ b/web/templates/data/oled.html @@ -0,0 +1,24 @@ +{% extends 'data/base.html' %} +{% block title %}OLED{% endblock %} +{% block body %} +{% for message in get_flashed_messages() %} +
{{ message }}
+
+{% endfor %} +
+ +
+ +

+ +
+ +

+ + back +
+{% endblock %} diff --git a/web/templates/data/song.html b/web/templates/data/song.html new file mode 100644 index 0000000..1d7e4c8 --- /dev/null +++ b/web/templates/data/song.html @@ -0,0 +1,31 @@ +{% extends 'data/base.html' %} +{% block title %}Song{% endblock %} +{% block body %} +{% for message in get_flashed_messages() %} +
{{ message }}
+
+{% endfor %} +
+ +
+ +

+ +
+ +

+ + back +
+{% endblock %}