Version Description
- Fixed a PHP "Cannot use object of type WP_Error as array" error.
- Activating/deactivating NinjaFirewall from WP CLI doesn't require the
--user
parameter anymore. - On websites running PHP 7.3 or above, NinjaFirewall will use the hrtime() function instead of microtime() for its metrics, because it is more reliable as it is not based on the internal system clock.
- WP+ Edition (Premium): Fixed a bug with right-to-left (RTL) WordPress sites where the checkboxes below the log were all messed up.
- The detection of base64-encoded injection has been slightly tweaked to lower the risk of false positives.
- WP+ Edition (Premium): The Bot Access Control input now accepts the following 6 additional characters:
( ) , ; ' "
. - The "Monthly Statistics" graph and tooltip colours were improved.
- Updated Charts.js library.
- Small fixes and adjustments.
- WP+ Edition (Premium): Updated GeoIP databases.
Download this release
Release Info
Developer | nintechnet |
Plugin | NinjaFirewall (WP Edition) |
Version | 4.5.1 |
Comparing to | |
See all releases |
Code changes from version 4.5 to 4.5.1
- languages/ninjafirewall-fr_FR.mo +0 -0
- languages/ninjafirewall-fr_FR.po +245 -237
- languages/ninjafirewall.pot +240 -235
- lib/dashboard_statistics.php +20 -5
- lib/event_updates.php +3 -0
- lib/firewall.php +37 -6
- lib/fw_livelog.php +4 -3
- lib/monitoring_file_check.php +36 -12
- lib/utils.php +59 -63
- ninjafirewall.php +45 -22
- readme.txt +15 -2
- static/chart.min.js +3 -3
languages/ninjafirewall-fr_FR.mo
CHANGED
Binary file
|
languages/ninjafirewall-fr_FR.po
CHANGED
@@ -4,8 +4,8 @@ msgid ""
|
|
4 |
msgstr ""
|
5 |
"Project-Id-Version: Stable (latest release)\n"
|
6 |
"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/ninjafirewall\n"
|
7 |
-
"POT-Creation-Date: 2022-
|
8 |
-
"PO-Revision-Date: 2022-
|
9 |
"Last-Translator: NinTechNet <contact@nintechnet.com>\n"
|
10 |
"Language-Team: NinTechNet <nintechnet.com>\n"
|
11 |
"Language: fr_FR\n"
|
@@ -16,7 +16,7 @@ msgstr ""
|
|
16 |
"X-Poedit-SourceCharset: UTF-8\n"
|
17 |
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
18 |
|
19 |
-
#: lib/anti_malware.php:24 ninjafirewall.php:
|
20 |
msgid "Anti-Malware"
|
21 |
msgstr "Anti-Malware"
|
22 |
|
@@ -107,13 +107,13 @@ msgstr "NinjaFirewall (WP Edition)"
|
|
107 |
#: lib/dashboard.php:127 lib/event_notifications.php:42
|
108 |
#: lib/firewall_options.php:42 lib/firewall_policies.php:71
|
109 |
#: lib/login_protection.php:30 lib/logs_firewall_log.php:59
|
110 |
-
#: lib/logs_live_log.php:79 lib/monitoring_file_check.php:
|
111 |
#: lib/monitoring_file_guard.php:46 lib/network.php:52
|
112 |
#: lib/security_rules_update.php:101
|
113 |
msgid "Your changes have been saved."
|
114 |
msgstr "Les modifications ont été enregistrées."
|
115 |
|
116 |
-
#: lib/dashboard.php:132 ninjafirewall.php:
|
117 |
msgid "Dashboard"
|
118 |
msgstr "Tableau de Bord"
|
119 |
|
@@ -547,7 +547,7 @@ msgstr "Élevé"
|
|
547 |
msgid "Medium"
|
548 |
msgstr "Moyen"
|
549 |
|
550 |
-
#: lib/dashboard_statistics.php:
|
551 |
msgid "Select monthly stats to view..."
|
552 |
msgstr "Sélectionnez les statistiques à afficher..."
|
553 |
|
@@ -570,11 +570,11 @@ msgstr ""
|
|
570 |
"Votre adresse e-mail a été supprimée de l'option \"Notifications d'Événement"
|
571 |
"\"."
|
572 |
|
573 |
-
#: lib/email_sodium.php:169 lib/monitoring_file_check.php:
|
574 |
-
#: lib/monitoring_file_check.php:
|
575 |
-
#: lib/monitoring_file_check.php:
|
576 |
-
#: lib/security_rules_update.php:561 lib/utils.php:225 lib/utils.php:
|
577 |
-
#: lib/utils.php:
|
578 |
msgid "Blog:"
|
579 |
msgstr "Blog :"
|
580 |
|
@@ -582,14 +582,14 @@ msgstr "Blog :"
|
|
582 |
msgid "Email address:"
|
583 |
msgstr "Adresse e-mail :"
|
584 |
|
585 |
-
#: lib/email_sodium.php:171 lib/utils.php:230 lib/utils.php:
|
586 |
-
#: lib/utils.php:
|
587 |
msgid "User IP:"
|
588 |
msgstr "IP utilisateur :"
|
589 |
|
590 |
-
#: lib/email_sodium.php:172 lib/event_updates.php:
|
591 |
-
#: lib/utils.php:
|
592 |
-
#: lib/utils.php:
|
593 |
msgid "Date:"
|
594 |
msgstr "Date :"
|
595 |
|
@@ -623,7 +623,7 @@ msgstr "Oui"
|
|
623 |
msgid "No"
|
624 |
msgstr "Non"
|
625 |
|
626 |
-
#: lib/event_notifications.php:34 lib/help.php:377 ninjafirewall.php:
|
627 |
msgid "Event Notifications"
|
628 |
msgstr "Notifications d'Événement"
|
629 |
|
@@ -848,7 +848,7 @@ msgstr "Moyen :"
|
|
848 |
msgid "Blocked brute-force attacks:"
|
849 |
msgstr "Attaques par force brute bloquées :"
|
850 |
|
851 |
-
#: lib/event_notifications.php:504 lib/event_updates.php:
|
852 |
msgid ""
|
853 |
"This notification can be turned off from NinjaFirewall \"Event Notifications"
|
854 |
"\" page."
|
@@ -856,15 +856,15 @@ msgstr ""
|
|
856 |
"Cette notification peut être désactivée depuis la page \"Notifications "
|
857 |
"d’Événement\" de NinjaFirewall."
|
858 |
|
859 |
-
#: lib/event_updates.php:
|
860 |
msgid "Downloaded security rules are corrupted"
|
861 |
msgstr "Le fichier des règles du pare-feu téléchargé est corrompu"
|
862 |
|
863 |
-
#: lib/event_updates.php:
|
864 |
msgid "[NinjaFirewall] Warning: Security update available"
|
865 |
msgstr "[NinjaFirewall] Mise à jour de sécurité en attente"
|
866 |
|
867 |
-
#: lib/event_updates.php:
|
868 |
msgid ""
|
869 |
"NinjaFirewall has detected that there are security updates available for "
|
870 |
"your website:"
|
@@ -872,59 +872,59 @@ msgstr ""
|
|
872 |
"NinjaFirewall a détecté que des mises à jour de sécurité sont disponibles "
|
873 |
"pour votre site Web :"
|
874 |
|
875 |
-
#: lib/event_updates.php:
|
876 |
#, php-format
|
877 |
msgid "Blog: %s"
|
878 |
msgstr "Blog : %s"
|
879 |
|
880 |
-
#: lib/event_updates.php:
|
881 |
-
#: lib/event_updates.php:
|
882 |
#, php-format
|
883 |
msgid "Your version: %s"
|
884 |
msgstr "Votre version : %s"
|
885 |
|
886 |
-
#: lib/event_updates.php:
|
887 |
-
#: lib/event_updates.php:
|
888 |
#, php-format
|
889 |
msgid "New version: %s"
|
890 |
msgstr "Nouvelle version : %s"
|
891 |
|
892 |
-
#: lib/event_updates.php:
|
893 |
-
#: lib/event_updates.php:
|
894 |
msgid "Severity: This is an important security update"
|
895 |
msgstr "Sévérité : Ceci est une mise à jour de sécurité importante"
|
896 |
|
897 |
-
#: lib/event_updates.php:
|
898 |
-
#: lib/event_updates.php:
|
899 |
msgid "Severity: **This is a critical security update**"
|
900 |
msgstr "Sévérité : **Ceci est une mise à jour de sécurité critique**"
|
901 |
|
902 |
-
#: lib/event_updates.php:
|
903 |
-
#: lib/event_updates.php:
|
904 |
msgid "Type: Security fix"
|
905 |
msgstr "Type : Correctif de sécurité"
|
906 |
|
907 |
-
#: lib/event_updates.php:
|
908 |
#, php-format
|
909 |
msgid "Plugin: %s"
|
910 |
msgstr "Extension : %s"
|
911 |
|
912 |
-
#: lib/event_updates.php:
|
913 |
#, php-format
|
914 |
msgid "Theme: %s"
|
915 |
msgstr "Theme : %s"
|
916 |
|
917 |
-
#: lib/event_updates.php:
|
918 |
msgid "Don't leave your blog at risk, make sure to update as soon as possible."
|
919 |
msgstr ""
|
920 |
"Ne laissez pas votre blog en danger, lancez cette mise à jour dès que "
|
921 |
"possible."
|
922 |
|
923 |
-
#: lib/event_updates.php:
|
924 |
msgid "Cannot download security rules: connection error"
|
925 |
msgstr "Impossible de télécharger les règles du pare-feu : erreur de connexion"
|
926 |
|
927 |
-
#: lib/event_updates.php:
|
928 |
#, php-format
|
929 |
msgid "Cannot download security rules: HTTP response error %s"
|
930 |
msgstr ""
|
@@ -976,7 +976,7 @@ msgstr "téléchargé(e)"
|
|
976 |
msgid "[NinjaFirewall] Alert: %s"
|
977 |
msgstr "[NinjaFirewall] Alerte : %s"
|
978 |
|
979 |
-
#: lib/events.php:199 lib/events.php:201 lib/utils.php:
|
980 |
msgid "-Blog:"
|
981 |
msgstr "- Blog :"
|
982 |
|
@@ -984,19 +984,19 @@ msgstr "- Blog :"
|
|
984 |
msgid "NinjaFirewall has detected the following activity on your account:"
|
985 |
msgstr "NinjaFirewall a détecté l'activité suivante sur votre compte :"
|
986 |
|
987 |
-
#: lib/events.php:206 lib/utils.php:
|
988 |
msgid "-User:"
|
989 |
msgstr "- Nom :"
|
990 |
|
991 |
-
#: lib/events.php:207 lib/utils.php:
|
992 |
msgid "-IP:"
|
993 |
msgstr "- IP :"
|
994 |
|
995 |
-
#: lib/events.php:208 lib/utils.php:
|
996 |
msgid "-Date:"
|
997 |
msgstr "-Date :"
|
998 |
|
999 |
-
#: lib/firewall_options.php:29 ninjafirewall.php:
|
1000 |
msgid "Firewall Options"
|
1001 |
msgstr "Options du Pare-feu"
|
1002 |
|
@@ -1156,16 +1156,16 @@ msgid "The imported file is not compatible with that version of NinjaFirewall"
|
|
1156 |
msgstr ""
|
1157 |
"Le fichier importé n'est pas compatible avec cette version de NinjaFirewall"
|
1158 |
|
1159 |
-
#: lib/firewall_options.php:473 ninjafirewall.php:
|
1160 |
msgid "[NinjaFirewall] Alert: Firewall is disabled"
|
1161 |
msgstr "[NinjaFirewall] Alerte : Le pare-feu a été désactivé"
|
1162 |
|
1163 |
#: lib/firewall_options.php:475 lib/firewall_options.php:477
|
1164 |
-
#: ninjafirewall.php:
|
1165 |
msgid "-Blog :"
|
1166 |
msgstr "- Blog :"
|
1167 |
|
1168 |
-
#: lib/firewall_options.php:481 ninjafirewall.php:
|
1169 |
msgid "Someone disabled NinjaFirewall from your WordPress admin dashboard:"
|
1170 |
msgstr ""
|
1171 |
"Quelqu'un a désactivé NinjaFirewall depuis votre Tableau de bord de "
|
@@ -1190,15 +1190,15 @@ msgstr ""
|
|
1190 |
"Quelqu'un a importé une nouvelle configuration qui a modifié tous les "
|
1191 |
"paramètres du pare-feu :"
|
1192 |
|
1193 |
-
#: lib/firewall_options.php:494 ninjafirewall.php:
|
1194 |
msgid "-User :"
|
1195 |
msgstr "- Nom :"
|
1196 |
|
1197 |
-
#: lib/firewall_options.php:495 ninjafirewall.php:
|
1198 |
msgid "-IP :"
|
1199 |
msgstr "- IP :"
|
1200 |
|
1201 |
-
#: lib/firewall_options.php:496 ninjafirewall.php:
|
1202 |
msgid "-Date :"
|
1203 |
msgstr "- Date :"
|
1204 |
|
@@ -1211,7 +1211,7 @@ msgstr ""
|
|
1211 |
"Pour utiliser cette option, allez dans le <a href=\"%s\">Tableau de Bord</a> "
|
1212 |
"et activez le mode Full WAF de NinjaFirewall."
|
1213 |
|
1214 |
-
#: lib/firewall_policies.php:62 ninjafirewall.php:
|
1215 |
msgid "Firewall Policies"
|
1216 |
msgstr "Politiques du Pare-feu"
|
1217 |
|
@@ -2999,7 +2999,7 @@ msgstr ""
|
|
2999 |
"intercepter les requêtes HTTP envoyées à tout script PHP, même si ce dernier "
|
3000 |
"ne fait pas partie de WordPress (logiciel tiers, backdoor, etc)."
|
3001 |
|
3002 |
-
#: lib/help.php:360 lib/network.php:32 ninjafirewall.php:
|
3003 |
msgid "Network"
|
3004 |
msgstr "Réseau"
|
3005 |
|
@@ -3052,7 +3052,7 @@ msgstr ""
|
|
3052 |
"après avoir pénétré dans votre Tableau de bord de WordPress, d'y installer "
|
3053 |
"une porte dérobée (backdoor) afin de prendre le contrôle de votre blog."
|
3054 |
|
3055 |
-
#: lib/help.php:389 lib/login_protection.php:21 ninjafirewall.php:
|
3056 |
msgid "Login Protection"
|
3057 |
msgstr "Page de Connexion"
|
3058 |
|
@@ -5465,7 +5465,7 @@ msgstr ""
|
|
5465 |
"Erreur : Votre fichier .htaccess n'est pas accessible en écriture. Veuillez "
|
5466 |
"modifier ses autorisations : %s"
|
5467 |
|
5468 |
-
#: lib/install.php:110 ninjafirewall.php:
|
5469 |
#, php-format
|
5470 |
msgid "Error: wrong parameter value (%s)."
|
5471 |
msgstr "Erreur : Mauvais paramètre (%s)."
|
@@ -5743,7 +5743,7 @@ msgstr "Erreur : le mot de passe doit comporter de 6 à 255 caractères."
|
|
5743 |
msgid "Error: unable to write to the %s configuration file"
|
5744 |
msgstr "Erreur : impossible d’écrire dans le fichier de configuration %s"
|
5745 |
|
5746 |
-
#: lib/logs.php:36 ninjafirewall.php:
|
5747 |
msgid "Logs"
|
5748 |
msgstr "Journaux"
|
5749 |
|
@@ -5890,7 +5890,7 @@ msgstr ""
|
|
5890 |
"et assurez vous que l'option \"Ajouter l'Administrateur à la liste blanche\" "
|
5891 |
"est activée."
|
5892 |
|
5893 |
-
#: lib/logs_live_log.php:96 ninjafirewall.php:
|
5894 |
msgid ""
|
5895 |
"Live Log lets you watch your blog traffic in real time. To enable it, click "
|
5896 |
"on the button below."
|
@@ -5940,7 +5940,7 @@ msgstr "Options de Live Log"
|
|
5940 |
msgid "Inclusion and exclusion filters (REQUEST_URI)"
|
5941 |
msgstr "Filtres d'inclusion et d'exclusion (REQUEST_URI)"
|
5942 |
|
5943 |
-
#: lib/logs_live_log.php:158 lib/monitoring_file_check.php:
|
5944 |
msgid "None"
|
5945 |
msgstr "Aucune"
|
5946 |
|
@@ -5952,7 +5952,7 @@ msgstr "Doit inclure"
|
|
5952 |
msgid "Must not include"
|
5953 |
msgstr "Ne doit pas inclure"
|
5954 |
|
5955 |
-
#: lib/logs_live_log.php:162 lib/monitoring_file_check.php:
|
5956 |
#: lib/monitoring_file_guard.php:89
|
5957 |
msgid "e.g.,"
|
5958 |
msgstr "par ex."
|
@@ -5999,7 +5999,7 @@ msgstr "Sauvegarder les options"
|
|
5999 |
msgid "Error: please enter the custom log format."
|
6000 |
msgstr "Erreur : veuillez entrer le format d'affichage."
|
6001 |
|
6002 |
-
#: lib/monitoring.php:43 ninjafirewall.php:
|
6003 |
msgid "Monitoring"
|
6004 |
msgstr "Monitoring"
|
6005 |
|
@@ -6016,27 +6016,27 @@ msgstr ""
|
|
6016 |
"erreurs, les contenus piratés et les problèmes de fuite de données provenant "
|
6017 |
"de votre blog."
|
6018 |
|
6019 |
-
#: lib/monitoring_file_check.php:
|
6020 |
msgid "Snapshot successfully created."
|
6021 |
msgstr "L'instantané a bien été créé."
|
6022 |
|
6023 |
-
#: lib/monitoring_file_check.php:
|
6024 |
msgid "Snapshot file successfully deleted."
|
6025 |
msgstr "L'instantané a bien été supprimé."
|
6026 |
|
6027 |
-
#: lib/monitoring_file_check.php:
|
6028 |
msgid "You must create a snapshot first."
|
6029 |
msgstr "Vous devez d'abord créer un instantané."
|
6030 |
|
6031 |
-
#: lib/monitoring_file_check.php:
|
6032 |
msgid "NinjaFirewall detected that changes were made to your files."
|
6033 |
msgstr "NinjaFirewall a détecté des changements dans vos fichiers."
|
6034 |
|
6035 |
-
#: lib/monitoring_file_check.php:
|
6036 |
msgid "No changes detected."
|
6037 |
msgstr "Aucun changement n'a été détecté."
|
6038 |
|
6039 |
-
#: lib/monitoring_file_check.php:
|
6040 |
msgid ""
|
6041 |
"File Check lets you perform file integrity monitoring upon request or on a "
|
6042 |
"specific interval. To start, create a snapshot of your files by clicking the "
|
@@ -6045,21 +6045,21 @@ msgstr ""
|
|
6045 |
"File Check vous permet d'effectuer une analyse de l'intégrité de vos "
|
6046 |
"fichiers sur demande ou à un intervalle spécifique défini."
|
6047 |
|
6048 |
-
#: lib/monitoring_file_check.php:
|
6049 |
msgid "Create a snapshot of all files stored in that directory"
|
6050 |
msgstr ""
|
6051 |
"Créer un instantané de tous les fichiers se trouvant dans ce répertoire"
|
6052 |
|
6053 |
-
#: lib/monitoring_file_check.php:
|
6054 |
#, php-format
|
6055 |
msgid "Default: %s"
|
6056 |
msgstr "Défaut : %s"
|
6057 |
|
6058 |
-
#: lib/monitoring_file_check.php:
|
6059 |
msgid "Exclude the following files/folders (optional)"
|
6060 |
msgstr "Exclure les fichiers / dossiers suivants (optionnel)"
|
6061 |
|
6062 |
-
#: lib/monitoring_file_check.php:
|
6063 |
msgid ""
|
6064 |
"Full or partial case-sensitive string(s). Multiple values must be comma-"
|
6065 |
"separated"
|
@@ -6067,141 +6067,141 @@ msgstr ""
|
|
6067 |
"Chaîne de caractères complète ou partielle, sensible à la casse. Plusieurs "
|
6068 |
"valeurs doivent être séparées par des virgules"
|
6069 |
|
6070 |
-
#: lib/monitoring_file_check.php:
|
6071 |
msgid "Do not follow symbolic links (default)"
|
6072 |
msgstr "Ne pas suivre les liens symboliques (défaut)"
|
6073 |
|
6074 |
-
#: lib/monitoring_file_check.php:
|
6075 |
msgid "Create Snapshot"
|
6076 |
msgstr "Créer un Instantané"
|
6077 |
|
6078 |
-
#: lib/monitoring_file_check.php:
|
6079 |
msgid "Last snapshot"
|
6080 |
msgstr "Dernier instantané"
|
6081 |
|
6082 |
-
#: lib/monitoring_file_check.php:
|
6083 |
#, php-format
|
6084 |
msgid "Created on: %s"
|
6085 |
msgstr "Créé le : %s"
|
6086 |
|
6087 |
-
#: lib/monitoring_file_check.php:
|
6088 |
#, php-format
|
6089 |
msgid "Total files: %s "
|
6090 |
msgstr "Nombre de fichiers : %s "
|
6091 |
|
6092 |
-
#: lib/monitoring_file_check.php:
|
6093 |
msgid "Directory:"
|
6094 |
msgstr "Répertoire :"
|
6095 |
|
6096 |
-
#: lib/monitoring_file_check.php:
|
6097 |
msgid "Exclusion:"
|
6098 |
msgstr "Exclusion :"
|
6099 |
|
6100 |
-
#: lib/monitoring_file_check.php:
|
6101 |
msgid "Symlinks:"
|
6102 |
msgstr "Lien symboliques :"
|
6103 |
|
6104 |
-
#: lib/monitoring_file_check.php:
|
6105 |
msgid "follow"
|
6106 |
msgstr "suivre"
|
6107 |
|
6108 |
-
#: lib/monitoring_file_check.php:
|
6109 |
msgid "do not follow"
|
6110 |
msgstr "ne pas suivre"
|
6111 |
|
6112 |
-
#: lib/monitoring_file_check.php:
|
6113 |
#, php-format
|
6114 |
msgid "Processing time: %s seconds"
|
6115 |
msgstr "Temps de traitement : %s secondes"
|
6116 |
|
6117 |
-
#: lib/monitoring_file_check.php:
|
6118 |
msgid "Download Snapshot"
|
6119 |
msgstr "Télécharger l'instantané"
|
6120 |
|
6121 |
-
#: lib/monitoring_file_check.php:
|
6122 |
msgid "Delete Snapshot"
|
6123 |
msgstr "Supprimer l'instantané"
|
6124 |
|
6125 |
-
#: lib/monitoring_file_check.php:
|
6126 |
msgid "Last changes"
|
6127 |
msgstr "Dernières modifications"
|
6128 |
|
6129 |
-
#: lib/monitoring_file_check.php:
|
6130 |
#, php-format
|
6131 |
msgid "New files: %s"
|
6132 |
msgstr "Nouveaux fichiers : %s"
|
6133 |
|
6134 |
-
#: lib/monitoring_file_check.php:
|
6135 |
#, php-format
|
6136 |
msgid "Deleted files: %s"
|
6137 |
msgstr "Fichiers supprimés : %s"
|
6138 |
|
6139 |
-
#: lib/monitoring_file_check.php:
|
6140 |
#, php-format
|
6141 |
msgid "Modified files: %s"
|
6142 |
msgstr "Fichiers modifiés : %s"
|
6143 |
|
6144 |
-
#: lib/monitoring_file_check.php:
|
6145 |
msgid "View Changes"
|
6146 |
msgstr "Voir les Modifications"
|
6147 |
|
6148 |
-
#: lib/monitoring_file_check.php:
|
6149 |
msgid "Download Changes"
|
6150 |
msgstr "Télécharger les Modifications"
|
6151 |
|
6152 |
-
#: lib/monitoring_file_check.php:
|
6153 |
msgid "Click a file to get more info about it."
|
6154 |
msgstr "Cliquez sur un fichier pour obtenir plus d'informations à son sujet."
|
6155 |
|
6156 |
-
#: lib/monitoring_file_check.php:
|
6157 |
msgid "New files:"
|
6158 |
msgstr "Nouveaux fichiers :"
|
6159 |
|
6160 |
-
#: lib/monitoring_file_check.php:
|
6161 |
msgid "Size"
|
6162 |
msgstr "Taille"
|
6163 |
|
6164 |
-
#: lib/monitoring_file_check.php:
|
6165 |
msgid "Access"
|
6166 |
msgstr "Accès"
|
6167 |
|
6168 |
-
#: lib/monitoring_file_check.php:
|
6169 |
msgid "Uid / Gid"
|
6170 |
msgstr "Uid / Gid"
|
6171 |
|
6172 |
-
#: lib/monitoring_file_check.php:
|
6173 |
msgid "Modify"
|
6174 |
msgstr "Modification"
|
6175 |
|
6176 |
-
#: lib/monitoring_file_check.php:
|
6177 |
msgid "Change"
|
6178 |
msgstr "Changement"
|
6179 |
|
6180 |
-
#: lib/monitoring_file_check.php:
|
6181 |
msgid "Deleted files:"
|
6182 |
msgstr "Fichiers supprimés :"
|
6183 |
|
6184 |
-
#: lib/monitoring_file_check.php:
|
6185 |
msgid "Modified files:"
|
6186 |
msgstr "Fichiers modifiés :"
|
6187 |
|
6188 |
-
#: lib/monitoring_file_check.php:
|
6189 |
msgid "Old"
|
6190 |
msgstr "Ancien"
|
6191 |
|
6192 |
-
#: lib/monitoring_file_check.php:
|
6193 |
msgid "New"
|
6194 |
msgstr "Nouveau"
|
6195 |
|
6196 |
-
#: lib/monitoring_file_check.php:
|
6197 |
msgid "Scan System For File Changes"
|
6198 |
msgstr "Lancer l'analyse des fichiers"
|
6199 |
|
6200 |
-
#: lib/monitoring_file_check.php:
|
6201 |
msgid "Options"
|
6202 |
msgstr "Options"
|
6203 |
|
6204 |
-
#: lib/monitoring_file_check.php:
|
6205 |
#, php-format
|
6206 |
msgid ""
|
6207 |
"It seems that %s is set. Ensure you have another way to run WP-Cron, "
|
@@ -6210,27 +6210,27 @@ msgstr ""
|
|
6210 |
"Il semble que %s est activé. Assurez vous de pouvoir exécuter WP-Cron, sinon "
|
6211 |
"File Check ne pourra pas se lancer automatiquement."
|
6212 |
|
6213 |
-
#: lib/monitoring_file_check.php:
|
6214 |
msgid "Enable scheduled scans"
|
6215 |
msgstr "Lancer File Check automatiquement"
|
6216 |
|
6217 |
-
#: lib/monitoring_file_check.php:
|
6218 |
msgid "No (default)"
|
6219 |
msgstr "Non (défaut)"
|
6220 |
|
6221 |
-
#: lib/monitoring_file_check.php:
|
6222 |
msgid "Hourly"
|
6223 |
msgstr "Une fois par heure"
|
6224 |
|
6225 |
-
#: lib/monitoring_file_check.php:
|
6226 |
msgid "Twicedaily"
|
6227 |
msgstr "Deux fois par jour"
|
6228 |
|
6229 |
-
#: lib/monitoring_file_check.php:
|
6230 |
msgid "Daily"
|
6231 |
msgstr "Tous les jours"
|
6232 |
|
6233 |
-
#: lib/monitoring_file_check.php:
|
6234 |
#, php-format
|
6235 |
msgid ""
|
6236 |
"Next scan will start in approximately %s day(s), %s hour(s), %s minute(s) "
|
@@ -6239,7 +6239,7 @@ msgstr ""
|
|
6239 |
"La prochaine analyse commencera dans %s jour(s), %s heure(s), %s minute(s) "
|
6240 |
"et %s seconde(s)."
|
6241 |
|
6242 |
-
#: lib/monitoring_file_check.php:
|
6243 |
msgid ""
|
6244 |
"The next scheduled scan date is in the past! WordPress wp-cron may not be "
|
6245 |
"working or may have been disabled."
|
@@ -6247,107 +6247,107 @@ msgstr ""
|
|
6247 |
"La date de la prochaine analyse est dans le passé ! Essayez de "
|
6248 |
"recharger cette page, sinon vérifiez que WP-Cron n'a pas été désactivé."
|
6249 |
|
6250 |
-
#: lib/monitoring_file_check.php:
|
6251 |
msgid "Scheduled scan report"
|
6252 |
msgstr "Rapport d'analyse"
|
6253 |
|
6254 |
-
#: lib/monitoring_file_check.php:
|
6255 |
msgid "Send me a report by email only if changes are detected (default)"
|
6256 |
msgstr ""
|
6257 |
"Envoyez-moi un rapport uniquement si des changements ont été détectés "
|
6258 |
"(défaut)"
|
6259 |
|
6260 |
-
#: lib/monitoring_file_check.php:
|
6261 |
msgid "Always send me a report by email after a scheduled scan"
|
6262 |
msgstr "Envoyez-moi toujours un rapport après une analyse automatique"
|
6263 |
|
6264 |
-
#: lib/monitoring_file_check.php:
|
6265 |
msgid "Save Scan Options"
|
6266 |
msgstr "Sauvegarder les options"
|
6267 |
|
6268 |
-
#: lib/monitoring_file_check.php:
|
6269 |
msgid "Enter the full path to the directory to be scanned."
|
6270 |
msgstr "Entrez le chemin complet vers le répertoire à scanner."
|
6271 |
|
6272 |
-
#: lib/monitoring_file_check.php:
|
6273 |
#, php-format
|
6274 |
msgid "The directory %s is not correct."
|
6275 |
msgstr "Le répertoire %s est invalide."
|
6276 |
|
6277 |
-
#: lib/monitoring_file_check.php:
|
6278 |
#, php-format
|
6279 |
msgid "The directory %s does not exist."
|
6280 |
msgstr "Le répertoire %s n'existe pas."
|
6281 |
|
6282 |
-
#: lib/monitoring_file_check.php:
|
6283 |
#, php-format
|
6284 |
msgid "The directory %s is not readable."
|
6285 |
msgstr "Le répertoire %s n'est pas lisible."
|
6286 |
|
6287 |
-
#: lib/monitoring_file_check.php:
|
6288 |
#, php-format
|
6289 |
msgid "Cannot write to %s."
|
6290 |
msgstr "Impossible d'écrire dans %s."
|
6291 |
|
6292 |
-
#: lib/monitoring_file_check.php:
|
6293 |
#, php-format
|
6294 |
msgid "Error : cannot open %s directory."
|
6295 |
msgstr "Erreur : impossible d'ouvrir le répertoire %s."
|
6296 |
|
6297 |
-
#: lib/monitoring_file_check.php:
|
6298 |
#, php-format
|
6299 |
msgid "Error : %s directory is not readable."
|
6300 |
msgstr "Erreur : le répertoire %s n'est pas lisible."
|
6301 |
|
6302 |
-
#: lib/monitoring_file_check.php:
|
6303 |
#, php-format
|
6304 |
msgid "Missing options line %s, please try again."
|
6305 |
msgstr "Option manquante (ligne %s). Veuillez essayer à nouveau."
|
6306 |
|
6307 |
-
#: lib/monitoring_file_check.php:
|
6308 |
#, php-format
|
6309 |
msgid "Cannot create %s."
|
6310 |
msgstr "Impossible de créer %s."
|
6311 |
|
6312 |
-
#: lib/monitoring_file_check.php:
|
6313 |
msgid "Error reading old snapshot file."
|
6314 |
msgstr "Erreur lors de la lecture du fichier de l'ancien instantané."
|
6315 |
|
6316 |
-
#: lib/monitoring_file_check.php:
|
6317 |
msgid "Error reading new snapshot file."
|
6318 |
msgstr "Erreur lors de la lecture du fichier du nouvel instantané."
|
6319 |
|
6320 |
-
#: lib/monitoring_file_check.php:
|
6321 |
msgid "New file"
|
6322 |
msgstr "Nouveau fichier"
|
6323 |
|
6324 |
-
#: lib/monitoring_file_check.php:
|
6325 |
msgid "Modified file"
|
6326 |
msgstr "Fichier modifié"
|
6327 |
|
6328 |
-
#: lib/monitoring_file_check.php:
|
6329 |
msgid "Deleted file"
|
6330 |
msgstr "Fichier supprimé"
|
6331 |
|
6332 |
-
#: lib/monitoring_file_check.php:
|
6333 |
msgid "[NinjaFirewall] Alert: File Check detection"
|
6334 |
msgstr "[NinjaFirewall] Alerte: Détection File Check"
|
6335 |
|
6336 |
-
#: lib/monitoring_file_check.php:
|
6337 |
#: lib/security_rules_update.php:564
|
6338 |
#, php-format
|
6339 |
msgid "Date: %s"
|
6340 |
msgstr "Date : %s"
|
6341 |
|
6342 |
-
#: lib/monitoring_file_check.php:
|
6343 |
msgid "See attached file for details."
|
6344 |
msgstr "Voir le fichier joint pour plus de détails."
|
6345 |
|
6346 |
-
#: lib/monitoring_file_check.php:
|
6347 |
msgid "[NinjaFirewall] File Check report"
|
6348 |
msgstr "[NinjaFirewall] Rapport de File Check"
|
6349 |
|
6350 |
-
#: lib/monitoring_file_check.php:
|
6351 |
msgid "NinjaFirewall did not detect changes in your files."
|
6352 |
msgstr "NinjaFirewall n'a pas détecté de changements dans vos fichiers."
|
6353 |
|
@@ -6404,7 +6404,7 @@ msgstr ""
|
|
6404 |
msgid "Save File Guard options"
|
6405 |
msgstr "Sauvegarder les options"
|
6406 |
|
6407 |
-
#: lib/network.php:24 ninjafirewall.php:
|
6408 |
#, php-format
|
6409 |
msgid "You are not allowed to perform this task (%s)."
|
6410 |
msgstr "Vous n'êtes pas autorisé à effectuer cette tâche (%s)."
|
@@ -6436,7 +6436,7 @@ msgid "Scheduled task has stopped, restarting it (%s)"
|
|
6436 |
msgstr "La tâche planifiée s'est arrêtée, redémarrage en cours (%s)"
|
6437 |
|
6438 |
#: lib/security_rules.php:44 lib/security_rules_update.php:565
|
6439 |
-
#: ninjafirewall.php:
|
6440 |
msgid "Security Rules"
|
6441 |
msgstr "Règles de Sécurité"
|
6442 |
|
@@ -6934,7 +6934,7 @@ msgstr ""
|
|
6934 |
msgid "Cancel and Close"
|
6935 |
msgstr "Annuler et Fermer"
|
6936 |
|
6937 |
-
#: lib/utils.php:188 lib/utils.php:196 lib/utils.php:
|
6938 |
msgid "N/A"
|
6939 |
msgstr "N/A"
|
6940 |
|
@@ -6948,7 +6948,7 @@ msgstr "Tentative de création de %s"
|
|
6948 |
msgid "Attempt to edit a published %s (ID: %s)"
|
6949 |
msgstr "Tentative de modification de %s (ID: %s)"
|
6950 |
|
6951 |
-
#: lib/utils.php:212 lib/utils.php:
|
6952 |
msgid "Unauthenticated user"
|
6953 |
msgstr "Utilisateur non authentifié"
|
6954 |
|
@@ -6964,7 +6964,7 @@ msgstr ""
|
|
6964 |
"NinjaFirewall a bloqué une tentative de modification/création d'une page ou "
|
6965 |
"d'un article par un utilisateur qui n'avait pas les capacités nécessaires :"
|
6966 |
|
6967 |
-
#: lib/utils.php:226 lib/utils.php:
|
6968 |
msgid "Username:"
|
6969 |
msgstr "Utilisateur :"
|
6970 |
|
@@ -6972,13 +6972,7 @@ msgstr "Utilisateur :"
|
|
6972 |
msgid "Action:"
|
6973 |
msgstr "Action :"
|
6974 |
|
6975 |
-
#: lib/utils.php:
|
6976 |
-
#: lib/utils.php:1518
|
6977 |
-
msgid "A PHP backtrace has been attached to this message for your convenience."
|
6978 |
-
msgstr ""
|
6979 |
-
"La pile d'exécution de PHP est jointe à ce message pour votre commodité."
|
6980 |
-
|
6981 |
-
#: lib/utils.php:244 lib/utils.php:323 lib/utils.php:1273 lib/utils.php:1528
|
6982 |
msgid ""
|
6983 |
"This protection (and notification) can be turned off from NinjaFirewall "
|
6984 |
"\"Firewall Policies\" page."
|
@@ -6986,16 +6980,16 @@ msgstr ""
|
|
6986 |
"Cette protection (et notification) peut être désactivée à partir de la page "
|
6987 |
"\"Politiques du Pare-feu\" de NinjaFirewall."
|
6988 |
|
6989 |
-
#: lib/utils.php:
|
6990 |
-
#: lib/utils.php:
|
6991 |
msgid "You are not allowed to perform this task."
|
6992 |
msgstr "Vous n'êtes pas autorisé à effectuer cette tâche."
|
6993 |
|
6994 |
-
#: lib/utils.php:
|
6995 |
msgid "Blocked post/page deletion attempt"
|
6996 |
msgstr "Tentative de suppression de page/article bloquée"
|
6997 |
|
6998 |
-
#: lib/utils.php:
|
6999 |
msgid ""
|
7000 |
"NinjaFirewall has blocked an attempt to delete a post by a user who doesn't "
|
7001 |
"have the right capabilities:"
|
@@ -7003,21 +6997,21 @@ msgstr ""
|
|
7003 |
"NinjaFirewall a bloqué une tentative de suppression d'une page ou d'un "
|
7004 |
"article par un utilisateur qui n'avait pas les capacités nécessaires :"
|
7005 |
|
7006 |
-
#: lib/utils.php:
|
7007 |
msgid "Blocked user account creation"
|
7008 |
msgstr "Création de compte d'utilisateur bloquée"
|
7009 |
|
7010 |
-
#: lib/utils.php:
|
7011 |
msgid "NinjaFirewall has blocked an attempt to create a user account:"
|
7012 |
msgstr ""
|
7013 |
"NinjaFirewall a bloqué une tentative de création d'un compte d'utilisateur :"
|
7014 |
|
7015 |
-
#: lib/utils.php:
|
7016 |
#, php-format
|
7017 |
msgid "Backup file is corrupted, deleting it (%s)"
|
7018 |
msgstr "Le fichier de sauvegarde est corrompu, suppression en cours (%s)"
|
7019 |
|
7020 |
-
#: lib/utils.php:
|
7021 |
#, php-format
|
7022 |
msgid ""
|
7023 |
"NinjaFirewall's options are corrupted, restoring them from last known good "
|
@@ -7026,7 +7020,7 @@ msgstr ""
|
|
7026 |
"Les options de NinjaFirewall sont corrompues, tentative de restauration à "
|
7027 |
"partir du dernier fichier de sauvegarde connu (%s)"
|
7028 |
|
7029 |
-
#: lib/utils.php:
|
7030 |
msgid ""
|
7031 |
"NinjaFirewall's options are corrupted, restoring their default values (no "
|
7032 |
"valid backup found)"
|
@@ -7034,7 +7028,7 @@ msgstr ""
|
|
7034 |
"Les options de NinjaFirewall sont corrompues, restauration des valeurs par "
|
7035 |
"défaut (il n'existe pas de fichier de sauvegarde)"
|
7036 |
|
7037 |
-
#: lib/utils.php:
|
7038 |
msgid ""
|
7039 |
"Warning: Because NinjaFirewall's Login Protection is enabled, Site Health "
|
7040 |
"may return an error message regarding the loopback test (e.g., 404 or 401 "
|
@@ -7045,11 +7039,11 @@ msgstr ""
|
|
7045 |
"concernant le test de la requête de bouclage (ex.: code d’état HTTP 404 ou "
|
7046 |
"401). Vous pouvez l'ignorer en toute sécurité."
|
7047 |
|
7048 |
-
#: lib/utils.php:
|
7049 |
msgid "NinjaFirewall error"
|
7050 |
msgstr "NinjaFirewall Erreur"
|
7051 |
|
7052 |
-
#: lib/utils.php:
|
7053 |
#, php-format
|
7054 |
msgid ""
|
7055 |
"%s directory cannot be created. Please review your installation and ensure "
|
@@ -7058,7 +7052,7 @@ msgstr ""
|
|
7058 |
"Le répertoire %s ne peut pas être créé. Vérifiez votre installation et "
|
7059 |
"assurez vous que %s n'est pas en lecture seule."
|
7060 |
|
7061 |
-
#: lib/utils.php:
|
7062 |
#, php-format
|
7063 |
msgid ""
|
7064 |
"%s directory is read-only. Please review your installation and ensure that "
|
@@ -7067,31 +7061,31 @@ msgstr ""
|
|
7067 |
"Le répertoire %s est en lecture seule. Vérifiez votre installation et les "
|
7068 |
"permissions de %s."
|
7069 |
|
7070 |
-
#: lib/utils.php:
|
7071 |
msgid "unknown error"
|
7072 |
msgstr "erreur inconnue"
|
7073 |
|
7074 |
-
#: lib/utils.php:
|
7075 |
msgid "NinjaFirewall fatal error:"
|
7076 |
msgstr "NinjaFirewall erreur fatale :"
|
7077 |
|
7078 |
-
#: lib/utils.php:
|
7079 |
msgid "Review your installation, your site is not protected."
|
7080 |
msgstr "Vérifiez votre installation, votre site n'est pas protégé."
|
7081 |
|
7082 |
-
#: lib/utils.php:
|
7083 |
msgid "Alert: WordPress console login"
|
7084 |
msgstr "Alerte : Connexion à WordPress"
|
7085 |
|
7086 |
-
#: lib/utils.php:
|
7087 |
msgid "Someone just logged in to your WordPress admin console:"
|
7088 |
msgstr "Quelqu'un vient de se connecter à votre Tableau de bord de WordPress:"
|
7089 |
|
7090 |
-
#: lib/utils.php:
|
7091 |
msgid "Forbidden access"
|
7092 |
msgstr "Accès interdit"
|
7093 |
|
7094 |
-
#: lib/utils.php:
|
7095 |
#, php-format
|
7096 |
msgid ""
|
7097 |
"<strong>ERROR</strong>: Invalid username, email address or password.<br /><a "
|
@@ -7100,11 +7094,11 @@ msgstr ""
|
|
7100 |
"<strong>ERREUR</strong>: Identifiant, email ou mot de passe invalide.<br /"
|
7101 |
"><a href=\"%s\">Mot de passe perdu</a> ?"
|
7102 |
|
7103 |
-
#: lib/utils.php:
|
7104 |
msgid "[NinjaFirewall] Alert: Database changes detected"
|
7105 |
msgstr "[NinjaFirewall] Alerte: Modification dans la base de données"
|
7106 |
|
7107 |
-
#: lib/utils.php:
|
7108 |
msgid ""
|
7109 |
"NinjaFirewall has detected that one or more administrator accounts were "
|
7110 |
"modified in the database:"
|
@@ -7112,12 +7106,12 @@ msgstr ""
|
|
7112 |
"NinjaFirewall a détecté que un ou plusieurs comptes d'administrateur ont été "
|
7113 |
"modifiés dans la base de données:"
|
7114 |
|
7115 |
-
#: lib/utils.php:
|
7116 |
#, php-format
|
7117 |
msgid "Total administrators : %s"
|
7118 |
msgstr "Nombre d'administrateurs : %s"
|
7119 |
|
7120 |
-
#: lib/utils.php:
|
7121 |
msgid ""
|
7122 |
"If you cannot see any modifications in the above fields, it is possible that "
|
7123 |
"the administrator password was changed."
|
@@ -7125,11 +7119,11 @@ msgstr ""
|
|
7125 |
"Si vous ne voyez pas de modifications dans les données ci-dessus, il est "
|
7126 |
"possible que le mot de passe administrateur ait été changé."
|
7127 |
|
7128 |
-
#: lib/utils.php:
|
7129 |
msgid "Blocked privilege escalation attempt"
|
7130 |
msgstr "Tentatives d'élévation des privilèges"
|
7131 |
|
7132 |
-
#: lib/utils.php:
|
7133 |
msgid ""
|
7134 |
"NinjaFirewall has blocked an attempt to modify a user capability by someone "
|
7135 |
"who does not have administrative privileges:"
|
@@ -7137,7 +7131,7 @@ msgstr ""
|
|
7137 |
"NinjaFirewall a bloqué une tentative de modification de certaines Capacités "
|
7138 |
"par un utilisateur ne disposant pas de privilèges administratifs :"
|
7139 |
|
7140 |
-
#: lib/utils.php:
|
7141 |
msgid ""
|
7142 |
"NinjaFirewall brute-force protection is enabled and you are temporarily "
|
7143 |
"whitelisted."
|
@@ -7145,7 +7139,7 @@ msgstr ""
|
|
7145 |
"La protection de NinjaFirewall contre les attaques par force brute est "
|
7146 |
"activée. Vous êtes temporairement dans la liste blanche."
|
7147 |
|
7148 |
-
#: lib/utils.php:
|
7149 |
#, php-format
|
7150 |
msgid ""
|
7151 |
"Hey, it seems that you've been using NinjaFirewall for some time. If you "
|
@@ -7158,17 +7152,17 @@ msgstr ""
|
|
7158 |
"a>. Il a fallu des milliers d'heures pour le développer, mais il suffit "
|
7159 |
"seulement de quelques minutes pour le noter. Merci !"
|
7160 |
|
7161 |
-
#: lib/utils.php:
|
7162 |
msgid ""
|
7163 |
"The attempt was blocked and the option was reversed to its original value."
|
7164 |
msgstr ""
|
7165 |
"La tentative a été bloquée et l'option a été remise à sa valeur d'origine."
|
7166 |
|
7167 |
-
#: lib/utils.php:
|
7168 |
msgid "Attempt to modify WordPress settings"
|
7169 |
msgstr "Tentative de modification des paramètres de WordPress"
|
7170 |
|
7171 |
-
#: lib/utils.php:
|
7172 |
msgid ""
|
7173 |
"NinjaFirewall has blocked an attempt to modify some important WordPress "
|
7174 |
"settings by a user that does not have administrative privileges:"
|
@@ -7177,31 +7171,31 @@ msgstr ""
|
|
7177 |
"importants de WordPress par un utilisateur ne disposant pas de privilèges "
|
7178 |
"administratifs :"
|
7179 |
|
7180 |
-
#: lib/utils.php:
|
7181 |
#, php-format
|
7182 |
msgid "Option: %s"
|
7183 |
msgstr "Option: %s"
|
7184 |
|
7185 |
-
#: lib/utils.php:
|
7186 |
#, php-format
|
7187 |
msgid "Original value: %s"
|
7188 |
msgstr "Valeur originale : %s"
|
7189 |
|
7190 |
-
#: lib/utils.php:
|
7191 |
#, php-format
|
7192 |
msgid "Modified value: %s"
|
7193 |
msgstr "Valeur modifiée : %s"
|
7194 |
|
7195 |
-
#: lib/utils.php:
|
7196 |
#, php-format
|
7197 |
msgid "Action taken: %s"
|
7198 |
msgstr "Action prise : %s"
|
7199 |
|
7200 |
-
#: lib/utils.php:
|
7201 |
msgid "Code injection attempt in WordPress options table"
|
7202 |
msgstr "Tentative d'injection de code dans la table des options de WordPress"
|
7203 |
|
7204 |
-
#: lib/utils.php:
|
7205 |
msgid ""
|
7206 |
"NinjaFirewall has blocked an attempt to inject code in the WordPress options "
|
7207 |
"table by a user that does not have administrative privileges:"
|
@@ -7210,28 +7204,28 @@ msgstr ""
|
|
7210 |
"options de WordPress par un utilisateur ne disposant pas de privilèges "
|
7211 |
"administratifs :"
|
7212 |
|
7213 |
-
#: lib/utils.php:
|
7214 |
#, php-format
|
7215 |
msgid "Code: %s"
|
7216 |
msgstr "Code : %s"
|
7217 |
|
7218 |
-
#: lib/utils.php:
|
7219 |
msgid "Important: NinjaFirewall has detected that this is a security update."
|
7220 |
msgstr ""
|
7221 |
"Important : NinjaFirewall a détecté que ceci est un mise à jour de sécurité."
|
7222 |
|
7223 |
-
#: lib/utils.php:
|
7224 |
msgid "More info about this warning."
|
7225 |
msgstr "En savoir plus."
|
7226 |
|
7227 |
-
#: lib/utils.php:
|
7228 |
#, php-format
|
7229 |
msgid "Cannot send notification, no valid email found (%s)"
|
7230 |
msgstr ""
|
7231 |
"Impossible d'envoyer la notification, aucune adresse e-mail valide n'a été "
|
7232 |
"trouvée (%s)"
|
7233 |
|
7234 |
-
#: lib/utils.php:
|
7235 |
#, php-format
|
7236 |
msgid ""
|
7237 |
"If you don't have access to that site any longer, you can remove your email "
|
@@ -7240,21 +7234,26 @@ msgstr ""
|
|
7240 |
"Si vous n'avez plus accès à ce site, vous pouvez supprimer votre e-mail en "
|
7241 |
"cliquant sur le lien suivant (valide pendant 12 heures) : %s"
|
7242 |
|
7243 |
-
#: lib/utils.php:
|
|
|
|
|
|
|
|
|
|
|
7244 |
#, php-format
|
7245 |
msgid "Error, cannot create the %s folder."
|
7246 |
msgstr "Erreur, impossible de créer le répertoire %s."
|
7247 |
|
7248 |
-
#: lib/utils.php:
|
7249 |
msgid "Check your server permissions and try again."
|
7250 |
msgstr "Vérifiez les autorisations de votre serveur et réessayez."
|
7251 |
|
7252 |
-
#: lib/utils.php:
|
7253 |
#, php-format
|
7254 |
msgid "Error, the %s folder is not writable."
|
7255 |
msgstr "Erreur, le répertoire %s est en lecture seule."
|
7256 |
|
7257 |
-
#: lib/utils.php:
|
7258 |
#, php-format
|
7259 |
msgid "Error, cannot write %s."
|
7260 |
msgstr "Erreur, impossible d'écrire dans %s."
|
@@ -7774,7 +7773,16 @@ msgstr ""
|
|
7774 |
"Impossible de récupérer les règles de l'utilisateur dans la base de données "
|
7775 |
"(#4)"
|
7776 |
|
7777 |
-
#: ninjafirewall.php:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
7778 |
msgid ""
|
7779 |
"You do not have \"unfiltered_html\" capability. Please enable it in order to "
|
7780 |
"run NinjaFirewall (or make sure you do not have \"DISALLOW_UNFILTERED_HTML\" "
|
@@ -7785,7 +7793,7 @@ msgstr ""
|
|
7785 |
"la directive \"DISALLOW_UNFILTERED_HTML\" activée dans votre fichier wp-"
|
7786 |
"config.php)."
|
7787 |
|
7788 |
-
#: ninjafirewall.php:
|
7789 |
#, php-format
|
7790 |
msgid ""
|
7791 |
"NinjaFirewall requires WordPress %s or greater but your current version is "
|
@@ -7793,19 +7801,19 @@ msgid ""
|
|
7793 |
msgstr ""
|
7794 |
"NinjaFirewall nécessite au moins WordPress %s mais votre version est %s."
|
7795 |
|
7796 |
-
#: ninjafirewall.php:
|
7797 |
#, php-format
|
7798 |
msgid ""
|
7799 |
"NinjaFirewall requires PHP 5.3 or greater but your current version is %s."
|
7800 |
msgstr ""
|
7801 |
"NinjaFirewall nécessite au moins PHP 5.3 mais votre version de PHP est %s."
|
7802 |
|
7803 |
-
#: ninjafirewall.php:
|
7804 |
#, php-format
|
7805 |
msgid "NinjaFirewall requires the PHP %s extension."
|
7806 |
msgstr "NinjaFirewall nécessite l'extension PHP %s."
|
7807 |
|
7808 |
-
#: ninjafirewall.php:
|
7809 |
msgid ""
|
7810 |
"You have SAFE_MODE enabled. Please disable it, it is deprecated as of PHP "
|
7811 |
"5.3.0 (see http://php.net/safe-mode)."
|
@@ -7814,15 +7822,15 @@ msgstr ""
|
|
7814 |
"devenue obsolète depuis PHP 5.3 et a été supprimée depuis PHP 5.4 (cf. "
|
7815 |
"http://php.net/safe-mode)."
|
7816 |
|
7817 |
-
#: ninjafirewall.php:
|
7818 |
msgid "You are not allowed to activate NinjaFirewall."
|
7819 |
msgstr "Vous n’êtes pas autorisé à activer NinjaFirewall."
|
7820 |
|
7821 |
-
#: ninjafirewall.php:
|
7822 |
msgid "NinjaFirewall is not compatible with Microsoft Windows."
|
7823 |
msgstr "NinjaFirewall n'est pas compatible avec Microsoft Windows."
|
7824 |
|
7825 |
-
#: ninjafirewall.php:
|
7826 |
msgid ""
|
7827 |
"All fields will be restored to their default values and any changes you made "
|
7828 |
"will be lost. Continue?"
|
@@ -7830,19 +7838,19 @@ msgstr ""
|
|
7830 |
"Tous les champs vont être re-initialisés et vos changements seront perdus. "
|
7831 |
"Continuer ?"
|
7832 |
|
7833 |
-
#: ninjafirewall.php:
|
7834 |
msgid "Missing security nonce, try to reload the page."
|
7835 |
msgstr "La nonce de sécurité est manquante, essayer de recharger cette page."
|
7836 |
|
7837 |
-
#: ninjafirewall.php:
|
7838 |
msgid "Please select the HTTP server in the list."
|
7839 |
msgstr "Sélectionnez votre serveur HTTP dans la list."
|
7840 |
|
7841 |
-
#: ninjafirewall.php:
|
7842 |
msgid "Delete the firewall's error log ?"
|
7843 |
msgstr "Supprimer le journal des erreurs ?"
|
7844 |
|
7845 |
-
#: ninjafirewall.php:
|
7846 |
msgid ""
|
7847 |
"This action will restore the selected configuration file and will override "
|
7848 |
"all your current firewall options, policies and rules. Continue?"
|
@@ -7851,7 +7859,7 @@ msgstr ""
|
|
7851 |
"remplacera toutes les options, politiques et règles de pare-feu actuelles. "
|
7852 |
"Continuer ?"
|
7853 |
|
7854 |
-
#: ninjafirewall.php:
|
7855 |
msgid ""
|
7856 |
"Any character that is not a letter [a-zA-Z], a digit [0-9], a dot [.], a "
|
7857 |
"hyphen [-] or an underscore [_] will be removed from the filename and "
|
@@ -7861,7 +7869,7 @@ msgstr ""
|
|
7861 |
"[.], un trait d'union[-] ou un caractère de soulignement[_], sera supprimé "
|
7862 |
"du nom du fichier et remplacé par le caractère de substitution. Continuer ?"
|
7863 |
|
7864 |
-
#: ninjafirewall.php:
|
7865 |
msgid ""
|
7866 |
"Ensure that you can access your admin console over HTTPS before enabling "
|
7867 |
"this option, otherwise you will lock yourself out of your site. Continue?"
|
@@ -7870,7 +7878,7 @@ msgstr ""
|
|
7870 |
"option, sinon vous risqueriez de ne plus pouvoir accéder à l'interface "
|
7871 |
"d'administration. Continuer ?"
|
7872 |
|
7873 |
-
#: ninjafirewall.php:
|
7874 |
msgid ""
|
7875 |
"WooCommerce is running: if you block accounts creation, your customers won't "
|
7876 |
"be able to sign up. Continue?"
|
@@ -7878,7 +7886,7 @@ msgstr ""
|
|
7878 |
"WooCommerce est activé : si vous bloquez la création de comptes, vos clients "
|
7879 |
"ne pourront pas s'enregistrer. Continuer ?"
|
7880 |
|
7881 |
-
#: ninjafirewall.php:
|
7882 |
msgid ""
|
7883 |
"Your blog has user registration enabled: if you block accounts creation, "
|
7884 |
"your customers won't be able to sign up. Continue?"
|
@@ -7886,7 +7894,7 @@ msgstr ""
|
|
7886 |
"Votre blog accepte les inscriptions : si vous bloquez la création de "
|
7887 |
"comptes, vos clients ne pourront plus s'inscrire. Continuer ?"
|
7888 |
|
7889 |
-
#: ninjafirewall.php:
|
7890 |
msgid ""
|
7891 |
"Your multisite installation allows users to register new sites: if you "
|
7892 |
"enable this option, they will likely get blocked when creating their blog. "
|
@@ -7895,140 +7903,140 @@ msgstr ""
|
|
7895 |
"Les utilisateurs sont autorisés a créer des nouveaux sites : si vous activez "
|
7896 |
"cette option, ils ne pourront plus le faire. Continuer ?"
|
7897 |
|
7898 |
-
#: ninjafirewall.php:
|
7899 |
msgid "Delete the current snapshot ?"
|
7900 |
msgstr "Supprimer l'instantané actuel ?"
|
7901 |
|
7902 |
-
#: ninjafirewall.php:
|
7903 |
msgid "Invalid character."
|
7904 |
msgstr "Caractère invalide."
|
7905 |
|
7906 |
-
#: ninjafirewall.php:
|
7907 |
msgid "\"admin\" is not acceptable, please choose another user name."
|
7908 |
msgstr ""
|
7909 |
"\"admin\" n\\'est pas acceptable, merci de bien vouloir choisir un autre "
|
7910 |
"identifiant."
|
7911 |
|
7912 |
-
#: ninjafirewall.php:
|
7913 |
msgid "Please enter max 1024 character only."
|
7914 |
msgstr "Veuillez ne pas entrer plus de 1 024 caractères."
|
7915 |
|
7916 |
-
#: ninjafirewall.php:
|
7917 |
msgid "Select when to enable the login protection."
|
7918 |
msgstr "Veuillez sélectionner quand activer la protection."
|
7919 |
|
7920 |
-
#: ninjafirewall.php:
|
7921 |
msgid "Enter a name and a password for the HTTP authentication."
|
7922 |
msgstr ""
|
7923 |
"Veuillez entrer un nom d'utilisateur et mot de passe pour l'authentification "
|
7924 |
"HTTP."
|
7925 |
|
7926 |
-
#: ninjafirewall.php:
|
7927 |
msgid "Your public key is not valid."
|
7928 |
msgstr "Votre clé publique n\\'est pas valide."
|
7929 |
|
7930 |
-
#: ninjafirewall.php:
|
7931 |
msgid "No traffic yet, please wait"
|
7932 |
msgstr "Aucun visiteur actuellement, veuillez patienter"
|
7933 |
|
7934 |
-
#: ninjafirewall.php:
|
7935 |
msgid "seconds..."
|
7936 |
msgstr "secondes..."
|
7937 |
|
7938 |
-
#: ninjafirewall.php:
|
7939 |
msgid "Error: Live Log did not receive the expected response from your server:"
|
7940 |
msgstr "Erreur : le serveur distant n\\'a pas retourné la réponse attendue :"
|
7941 |
|
7942 |
-
#: ninjafirewall.php:
|
7943 |
msgid "Error: URL does not seem to exist (404 Not Found):"
|
7944 |
msgstr "Erreur : l'URL ne semble pas exister (404 Not Found) :"
|
7945 |
|
7946 |
-
#: ninjafirewall.php:
|
7947 |
msgid "Error: Cannot find your log file. Try to reload this page."
|
7948 |
msgstr ""
|
7949 |
"Erreur : Impossible de trouver le fichier log. Essayez de recharger cette "
|
7950 |
"page."
|
7951 |
|
7952 |
-
#: ninjafirewall.php:
|
7953 |
msgid "Error: The HTTP server returned the following error code:"
|
7954 |
msgstr "Erreur : Le serveur HTTP a retourné le code d'erreur suivant :"
|
7955 |
|
7956 |
-
#: ninjafirewall.php:
|
7957 |
msgid "Error: Security nonces do not match. Reload the page and try again."
|
7958 |
msgstr ""
|
7959 |
"Erreur : Les nonces de sécurité ne correspondent pas. Veuillez recharger "
|
7960 |
"cette page."
|
7961 |
|
7962 |
-
#: ninjafirewall.php:
|
7963 |
msgid "Error: NinjaFirewall is disabled"
|
7964 |
msgstr "Erreur : NinjaFirewall est désactivé"
|
7965 |
|
7966 |
-
#: ninjafirewall.php:
|
7967 |
#, php-format
|
7968 |
msgid "Error: missing parameter (%s)."
|
7969 |
msgstr "Erreur : Paramètre manquant (%s)."
|
7970 |
|
7971 |
-
#: ninjafirewall.php:
|
7972 |
msgid "NinjaFirewall: Dashboard"
|
7973 |
msgstr "NinjaFirewall : Tableau de Bord"
|
7974 |
|
7975 |
-
#: ninjafirewall.php:
|
7976 |
msgid "NinjaFirewall: Firewall Options"
|
7977 |
msgstr "NinjaFirewall : Options du Pare-feu"
|
7978 |
|
7979 |
-
#: ninjafirewall.php:
|
7980 |
msgid "NinjaFirewall: Firewall Policies"
|
7981 |
msgstr "NinjaFirewall : Politiques du Pare-feu"
|
7982 |
|
7983 |
-
#: ninjafirewall.php:
|
7984 |
msgid "NinjaFirewall: Monitoring"
|
7985 |
msgstr "NinjaFirewall : Monitoring"
|
7986 |
|
7987 |
-
#: ninjafirewall.php:
|
7988 |
msgid "NinjaFirewall: Anti-Malware"
|
7989 |
msgstr "NinjaFirewall : Anti-Malware"
|
7990 |
|
7991 |
-
#: ninjafirewall.php:
|
7992 |
msgid "NinjaFirewall: Network"
|
7993 |
msgstr "NinjaFirewall : Réseau"
|
7994 |
|
7995 |
-
#: ninjafirewall.php:
|
7996 |
msgid "NinjaFirewall: Event Notifications"
|
7997 |
msgstr "NinjaFirewall : Notifications d’Événement"
|
7998 |
|
7999 |
-
#: ninjafirewall.php:
|
8000 |
msgid "NinjaFirewall: Log-in Protection"
|
8001 |
msgstr "NinjaFirewall : Page de Connexion"
|
8002 |
|
8003 |
-
#: ninjafirewall.php:
|
8004 |
msgid "NinjaFirewall: Logs"
|
8005 |
msgstr "NinjaFirewall : Journaux"
|
8006 |
|
8007 |
-
#: ninjafirewall.php:
|
8008 |
msgid "NinjaFirewall: Security Rules"
|
8009 |
msgstr "NinjaFirewall : Règles de Sécurité"
|
8010 |
|
8011 |
-
#: ninjafirewall.php:
|
8012 |
msgid "NinjaFirewall Settings"
|
8013 |
msgstr "Réglages de NinjaFirewall"
|
8014 |
|
8015 |
-
#: ninjafirewall.php:
|
8016 |
msgid "NinjaFirewall is enabled"
|
8017 |
msgstr "NinjaFirewall est activé"
|
8018 |
|
8019 |
-
#: ninjafirewall.php:
|
8020 |
msgid "Access Restricted"
|
8021 |
msgstr "Accès limité"
|
8022 |
|
8023 |
-
#: ninjafirewall.php:
|
8024 |
msgid "Settings"
|
8025 |
msgstr "Réglages"
|
8026 |
|
8027 |
-
#: ninjafirewall.php:
|
8028 |
msgid "Upgrade to Premium"
|
8029 |
msgstr "Passez Premium !"
|
8030 |
|
8031 |
-
#: ninjafirewall.php:
|
8032 |
msgid "Rate it!"
|
8033 |
msgstr "Notez-le !"
|
8034 |
|
4 |
msgstr ""
|
5 |
"Project-Id-Version: Stable (latest release)\n"
|
6 |
"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/ninjafirewall\n"
|
7 |
+
"POT-Creation-Date: 2022-03-16 16:44+0700\n"
|
8 |
+
"PO-Revision-Date: 2022-03-16 16:44+0700\n"
|
9 |
"Last-Translator: NinTechNet <contact@nintechnet.com>\n"
|
10 |
"Language-Team: NinTechNet <nintechnet.com>\n"
|
11 |
"Language: fr_FR\n"
|
16 |
"X-Poedit-SourceCharset: UTF-8\n"
|
17 |
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
18 |
|
19 |
+
#: lib/anti_malware.php:24 ninjafirewall.php:925
|
20 |
msgid "Anti-Malware"
|
21 |
msgstr "Anti-Malware"
|
22 |
|
107 |
#: lib/dashboard.php:127 lib/event_notifications.php:42
|
108 |
#: lib/firewall_options.php:42 lib/firewall_policies.php:71
|
109 |
#: lib/login_protection.php:30 lib/logs_firewall_log.php:59
|
110 |
+
#: lib/logs_live_log.php:79 lib/monitoring_file_check.php:112
|
111 |
#: lib/monitoring_file_guard.php:46 lib/network.php:52
|
112 |
#: lib/security_rules_update.php:101
|
113 |
msgid "Your changes have been saved."
|
114 |
msgstr "Les modifications ont été enregistrées."
|
115 |
|
116 |
+
#: lib/dashboard.php:132 ninjafirewall.php:903
|
117 |
msgid "Dashboard"
|
118 |
msgstr "Tableau de Bord"
|
119 |
|
547 |
msgid "Medium"
|
548 |
msgstr "Moyen"
|
549 |
|
550 |
+
#: lib/dashboard_statistics.php:196
|
551 |
msgid "Select monthly stats to view..."
|
552 |
msgstr "Sélectionnez les statistiques à afficher..."
|
553 |
|
570 |
"Votre adresse e-mail a été supprimée de l'option \"Notifications d'Événement"
|
571 |
"\"."
|
572 |
|
573 |
+
#: lib/email_sodium.php:169 lib/monitoring_file_check.php:760
|
574 |
+
#: lib/monitoring_file_check.php:762 lib/monitoring_file_check.php:782
|
575 |
+
#: lib/monitoring_file_check.php:784 lib/security_rules_update.php:559
|
576 |
+
#: lib/security_rules_update.php:561 lib/utils.php:225 lib/utils.php:300
|
577 |
+
#: lib/utils.php:412 lib/utils.php:1067 lib/utils.php:1241 lib/utils.php:1500
|
578 |
msgid "Blog:"
|
579 |
msgstr "Blog :"
|
580 |
|
582 |
msgid "Email address:"
|
583 |
msgstr "Adresse e-mail :"
|
584 |
|
585 |
+
#: lib/email_sodium.php:171 lib/utils.php:230 lib/utils.php:304
|
586 |
+
#: lib/utils.php:414 lib/utils.php:1249 lib/utils.php:1501
|
587 |
msgid "User IP:"
|
588 |
msgstr "IP utilisateur :"
|
589 |
|
590 |
+
#: lib/email_sodium.php:172 lib/event_updates.php:160 lib/utils.php:233
|
591 |
+
#: lib/utils.php:307 lib/utils.php:417 lib/utils.php:1068 lib/utils.php:1252
|
592 |
+
#: lib/utils.php:1504
|
593 |
msgid "Date:"
|
594 |
msgstr "Date :"
|
595 |
|
623 |
msgid "No"
|
624 |
msgstr "Non"
|
625 |
|
626 |
+
#: lib/event_notifications.php:34 lib/help.php:377 ninjafirewall.php:933
|
627 |
msgid "Event Notifications"
|
628 |
msgstr "Notifications d'Événement"
|
629 |
|
848 |
msgid "Blocked brute-force attacks:"
|
849 |
msgstr "Attaques par force brute bloquées :"
|
850 |
|
851 |
+
#: lib/event_notifications.php:504 lib/event_updates.php:222 lib/utils.php:1079
|
852 |
msgid ""
|
853 |
"This notification can be turned off from NinjaFirewall \"Event Notifications"
|
854 |
"\" page."
|
856 |
"Cette notification peut être désactivée depuis la page \"Notifications "
|
857 |
"d’Événement\" de NinjaFirewall."
|
858 |
|
859 |
+
#: lib/event_updates.php:56
|
860 |
msgid "Downloaded security rules are corrupted"
|
861 |
msgstr "Le fichier des règles du pare-feu téléchargé est corrompu"
|
862 |
|
863 |
+
#: lib/event_updates.php:157
|
864 |
msgid "[NinjaFirewall] Warning: Security update available"
|
865 |
msgstr "[NinjaFirewall] Mise à jour de sécurité en attente"
|
866 |
|
867 |
+
#: lib/event_updates.php:159
|
868 |
msgid ""
|
869 |
"NinjaFirewall has detected that there are security updates available for "
|
870 |
"your website:"
|
872 |
"NinjaFirewall a détecté que des mises à jour de sécurité sont disponibles "
|
873 |
"pour votre site Web :"
|
874 |
|
875 |
+
#: lib/event_updates.php:163 lib/event_updates.php:165
|
876 |
#, php-format
|
877 |
msgid "Blog: %s"
|
878 |
msgstr "Blog : %s"
|
879 |
|
880 |
+
#: lib/event_updates.php:171 lib/event_updates.php:187
|
881 |
+
#: lib/event_updates.php:206
|
882 |
#, php-format
|
883 |
msgid "Your version: %s"
|
884 |
msgstr "Votre version : %s"
|
885 |
|
886 |
+
#: lib/event_updates.php:172 lib/event_updates.php:188
|
887 |
+
#: lib/event_updates.php:207
|
888 |
#, php-format
|
889 |
msgid "New version: %s"
|
890 |
msgstr "Nouvelle version : %s"
|
891 |
|
892 |
+
#: lib/event_updates.php:174 lib/event_updates.php:191
|
893 |
+
#: lib/event_updates.php:210
|
894 |
msgid "Severity: This is an important security update"
|
895 |
msgstr "Sévérité : Ceci est une mise à jour de sécurité importante"
|
896 |
|
897 |
+
#: lib/event_updates.php:176 lib/event_updates.php:193
|
898 |
+
#: lib/event_updates.php:212
|
899 |
msgid "Severity: **This is a critical security update**"
|
900 |
msgstr "Sévérité : **Ceci est une mise à jour de sécurité critique**"
|
901 |
|
902 |
+
#: lib/event_updates.php:178 lib/event_updates.php:195
|
903 |
+
#: lib/event_updates.php:214
|
904 |
msgid "Type: Security fix"
|
905 |
msgstr "Type : Correctif de sécurité"
|
906 |
|
907 |
+
#: lib/event_updates.php:186
|
908 |
#, php-format
|
909 |
msgid "Plugin: %s"
|
910 |
msgstr "Extension : %s"
|
911 |
|
912 |
+
#: lib/event_updates.php:205
|
913 |
#, php-format
|
914 |
msgid "Theme: %s"
|
915 |
msgstr "Theme : %s"
|
916 |
|
917 |
+
#: lib/event_updates.php:220 lib/utils.php:1586
|
918 |
msgid "Don't leave your blog at risk, make sure to update as soon as possible."
|
919 |
msgstr ""
|
920 |
"Ne laissez pas votre blog en danger, lancez cette mise à jour dès que "
|
921 |
"possible."
|
922 |
|
923 |
+
#: lib/event_updates.php:246
|
924 |
msgid "Cannot download security rules: connection error"
|
925 |
msgstr "Impossible de télécharger les règles du pare-feu : erreur de connexion"
|
926 |
|
927 |
+
#: lib/event_updates.php:252
|
928 |
#, php-format
|
929 |
msgid "Cannot download security rules: HTTP response error %s"
|
930 |
msgstr ""
|
976 |
msgid "[NinjaFirewall] Alert: %s"
|
977 |
msgstr "[NinjaFirewall] Alerte : %s"
|
978 |
|
979 |
+
#: lib/events.php:199 lib/events.php:201 lib/utils.php:817
|
980 |
msgid "-Blog:"
|
981 |
msgstr "- Blog :"
|
982 |
|
984 |
msgid "NinjaFirewall has detected the following activity on your account:"
|
985 |
msgstr "NinjaFirewall a détecté l'activité suivante sur votre compte :"
|
986 |
|
987 |
+
#: lib/events.php:206 lib/utils.php:822
|
988 |
msgid "-User:"
|
989 |
msgstr "- Nom :"
|
990 |
|
991 |
+
#: lib/events.php:207 lib/utils.php:823
|
992 |
msgid "-IP:"
|
993 |
msgstr "- IP :"
|
994 |
|
995 |
+
#: lib/events.php:208 lib/utils.php:824
|
996 |
msgid "-Date:"
|
997 |
msgstr "-Date :"
|
998 |
|
999 |
+
#: lib/firewall_options.php:29 ninjafirewall.php:907
|
1000 |
msgid "Firewall Options"
|
1001 |
msgstr "Options du Pare-feu"
|
1002 |
|
1156 |
msgstr ""
|
1157 |
"Le fichier importé n'est pas compatible avec cette version de NinjaFirewall"
|
1158 |
|
1159 |
+
#: lib/firewall_options.php:473 ninjafirewall.php:226
|
1160 |
msgid "[NinjaFirewall] Alert: Firewall is disabled"
|
1161 |
msgstr "[NinjaFirewall] Alerte : Le pare-feu a été désactivé"
|
1162 |
|
1163 |
#: lib/firewall_options.php:475 lib/firewall_options.php:477
|
1164 |
+
#: ninjafirewall.php:228 ninjafirewall.php:230
|
1165 |
msgid "-Blog :"
|
1166 |
msgstr "- Blog :"
|
1167 |
|
1168 |
+
#: lib/firewall_options.php:481 ninjafirewall.php:232
|
1169 |
msgid "Someone disabled NinjaFirewall from your WordPress admin dashboard:"
|
1170 |
msgstr ""
|
1171 |
"Quelqu'un a désactivé NinjaFirewall depuis votre Tableau de bord de "
|
1190 |
"Quelqu'un a importé une nouvelle configuration qui a modifié tous les "
|
1191 |
"paramètres du pare-feu :"
|
1192 |
|
1193 |
+
#: lib/firewall_options.php:494 ninjafirewall.php:233
|
1194 |
msgid "-User :"
|
1195 |
msgstr "- Nom :"
|
1196 |
|
1197 |
+
#: lib/firewall_options.php:495 ninjafirewall.php:234
|
1198 |
msgid "-IP :"
|
1199 |
msgstr "- IP :"
|
1200 |
|
1201 |
+
#: lib/firewall_options.php:496 ninjafirewall.php:235
|
1202 |
msgid "-Date :"
|
1203 |
msgstr "- Date :"
|
1204 |
|
1211 |
"Pour utiliser cette option, allez dans le <a href=\"%s\">Tableau de Bord</a> "
|
1212 |
"et activez le mode Full WAF de NinjaFirewall."
|
1213 |
|
1214 |
+
#: lib/firewall_policies.php:62 ninjafirewall.php:911
|
1215 |
msgid "Firewall Policies"
|
1216 |
msgstr "Politiques du Pare-feu"
|
1217 |
|
2999 |
"intercepter les requêtes HTTP envoyées à tout script PHP, même si ce dernier "
|
3000 |
"ne fait pas partie de WordPress (logiciel tiers, backdoor, etc)."
|
3001 |
|
3002 |
+
#: lib/help.php:360 lib/network.php:32 ninjafirewall.php:929
|
3003 |
msgid "Network"
|
3004 |
msgstr "Réseau"
|
3005 |
|
3052 |
"après avoir pénétré dans votre Tableau de bord de WordPress, d'y installer "
|
3053 |
"une porte dérobée (backdoor) afin de prendre le contrôle de votre blog."
|
3054 |
|
3055 |
+
#: lib/help.php:389 lib/login_protection.php:21 ninjafirewall.php:937
|
3056 |
msgid "Login Protection"
|
3057 |
msgstr "Page de Connexion"
|
3058 |
|
5465 |
"Erreur : Votre fichier .htaccess n'est pas accessible en écriture. Veuillez "
|
5466 |
"modifier ses autorisations : %s"
|
5467 |
|
5468 |
+
#: lib/install.php:110 ninjafirewall.php:667 ninjafirewall.php:671
|
5469 |
#, php-format
|
5470 |
msgid "Error: wrong parameter value (%s)."
|
5471 |
msgstr "Erreur : Mauvais paramètre (%s)."
|
5743 |
msgid "Error: unable to write to the %s configuration file"
|
5744 |
msgstr "Erreur : impossible d’écrire dans le fichier de configuration %s"
|
5745 |
|
5746 |
+
#: lib/logs.php:36 ninjafirewall.php:941
|
5747 |
msgid "Logs"
|
5748 |
msgstr "Journaux"
|
5749 |
|
5890 |
"et assurez vous que l'option \"Ajouter l'Administrateur à la liste blanche\" "
|
5891 |
"est activée."
|
5892 |
|
5893 |
+
#: lib/logs_live_log.php:96 ninjafirewall.php:369
|
5894 |
msgid ""
|
5895 |
"Live Log lets you watch your blog traffic in real time. To enable it, click "
|
5896 |
"on the button below."
|
5940 |
msgid "Inclusion and exclusion filters (REQUEST_URI)"
|
5941 |
msgstr "Filtres d'inclusion et d'exclusion (REQUEST_URI)"
|
5942 |
|
5943 |
+
#: lib/logs_live_log.php:158 lib/monitoring_file_check.php:405
|
5944 |
msgid "None"
|
5945 |
msgstr "Aucune"
|
5946 |
|
5952 |
msgid "Must not include"
|
5953 |
msgstr "Ne doit pas inclure"
|
5954 |
|
5955 |
+
#: lib/logs_live_log.php:162 lib/monitoring_file_check.php:163
|
5956 |
#: lib/monitoring_file_guard.php:89
|
5957 |
msgid "e.g.,"
|
5958 |
msgstr "par ex."
|
5999 |
msgid "Error: please enter the custom log format."
|
6000 |
msgstr "Erreur : veuillez entrer le format d'affichage."
|
6001 |
|
6002 |
+
#: lib/monitoring.php:43 ninjafirewall.php:915
|
6003 |
msgid "Monitoring"
|
6004 |
msgstr "Monitoring"
|
6005 |
|
6016 |
"erreurs, les contenus piratés et les problèmes de fuite de données provenant "
|
6017 |
"de votre blog."
|
6018 |
|
6019 |
+
#: lib/monitoring_file_check.php:63
|
6020 |
msgid "Snapshot successfully created."
|
6021 |
msgstr "L'instantané a bien été créé."
|
6022 |
|
6023 |
+
#: lib/monitoring_file_check.php:72
|
6024 |
msgid "Snapshot file successfully deleted."
|
6025 |
msgstr "L'instantané a bien été supprimé."
|
6026 |
|
6027 |
+
#: lib/monitoring_file_check.php:89
|
6028 |
msgid "You must create a snapshot first."
|
6029 |
msgstr "Vous devez d'abord créer un instantané."
|
6030 |
|
6031 |
+
#: lib/monitoring_file_check.php:103 lib/monitoring_file_check.php:758
|
6032 |
msgid "NinjaFirewall detected that changes were made to your files."
|
6033 |
msgstr "NinjaFirewall a détecté des changements dans vos fichiers."
|
6034 |
|
6035 |
+
#: lib/monitoring_file_check.php:106
|
6036 |
msgid "No changes detected."
|
6037 |
msgstr "Aucun changement n'a été détecté."
|
6038 |
|
6039 |
+
#: lib/monitoring_file_check.php:142
|
6040 |
msgid ""
|
6041 |
"File Check lets you perform file integrity monitoring upon request or on a "
|
6042 |
"specific interval. To start, create a snapshot of your files by clicking the "
|
6045 |
"File Check vous permet d'effectuer une analyse de l'intégrité de vos "
|
6046 |
"fichiers sur demande ou à un intervalle spécifique défini."
|
6047 |
|
6048 |
+
#: lib/monitoring_file_check.php:149
|
6049 |
msgid "Create a snapshot of all files stored in that directory"
|
6050 |
msgstr ""
|
6051 |
"Créer un instantané de tous les fichiers se trouvant dans ce répertoire"
|
6052 |
|
6053 |
+
#: lib/monitoring_file_check.php:157
|
6054 |
#, php-format
|
6055 |
msgid "Default: %s"
|
6056 |
msgstr "Défaut : %s"
|
6057 |
|
6058 |
+
#: lib/monitoring_file_check.php:162 lib/monitoring_file_guard.php:88
|
6059 |
msgid "Exclude the following files/folders (optional)"
|
6060 |
msgstr "Exclure les fichiers / dossiers suivants (optionnel)"
|
6061 |
|
6062 |
+
#: lib/monitoring_file_check.php:163
|
6063 |
msgid ""
|
6064 |
"Full or partial case-sensitive string(s). Multiple values must be comma-"
|
6065 |
"separated"
|
6067 |
"Chaîne de caractères complète ou partielle, sensible à la casse. Plusieurs "
|
6068 |
"valeurs doivent être séparées par des virgules"
|
6069 |
|
6070 |
+
#: lib/monitoring_file_check.php:169
|
6071 |
msgid "Do not follow symbolic links (default)"
|
6072 |
msgstr "Ne pas suivre les liens symboliques (défaut)"
|
6073 |
|
6074 |
+
#: lib/monitoring_file_check.php:175
|
6075 |
msgid "Create Snapshot"
|
6076 |
msgstr "Créer un Instantané"
|
6077 |
|
6078 |
+
#: lib/monitoring_file_check.php:241
|
6079 |
msgid "Last snapshot"
|
6080 |
msgstr "Dernier instantané"
|
6081 |
|
6082 |
+
#: lib/monitoring_file_check.php:243
|
6083 |
#, php-format
|
6084 |
msgid "Created on: %s"
|
6085 |
msgstr "Créé le : %s"
|
6086 |
|
6087 |
+
#: lib/monitoring_file_check.php:244
|
6088 |
#, php-format
|
6089 |
msgid "Total files: %s "
|
6090 |
msgstr "Nombre de fichiers : %s "
|
6091 |
|
6092 |
+
#: lib/monitoring_file_check.php:246
|
6093 |
msgid "Directory:"
|
6094 |
msgstr "Répertoire :"
|
6095 |
|
6096 |
+
#: lib/monitoring_file_check.php:250
|
6097 |
msgid "Exclusion:"
|
6098 |
msgstr "Exclusion :"
|
6099 |
|
6100 |
+
#: lib/monitoring_file_check.php:256
|
6101 |
msgid "Symlinks:"
|
6102 |
msgstr "Lien symboliques :"
|
6103 |
|
6104 |
+
#: lib/monitoring_file_check.php:258
|
6105 |
msgid "follow"
|
6106 |
msgstr "suivre"
|
6107 |
|
6108 |
+
#: lib/monitoring_file_check.php:260
|
6109 |
msgid "do not follow"
|
6110 |
msgstr "ne pas suivre"
|
6111 |
|
6112 |
+
#: lib/monitoring_file_check.php:264
|
6113 |
#, php-format
|
6114 |
msgid "Processing time: %s seconds"
|
6115 |
msgstr "Temps de traitement : %s secondes"
|
6116 |
|
6117 |
+
#: lib/monitoring_file_check.php:269
|
6118 |
msgid "Download Snapshot"
|
6119 |
msgstr "Télécharger l'instantané"
|
6120 |
|
6121 |
+
#: lib/monitoring_file_check.php:269
|
6122 |
msgid "Delete Snapshot"
|
6123 |
msgstr "Supprimer l'instantané"
|
6124 |
|
6125 |
+
#: lib/monitoring_file_check.php:275
|
6126 |
msgid "Last changes"
|
6127 |
msgstr "Dernières modifications"
|
6128 |
|
6129 |
+
#: lib/monitoring_file_check.php:282 lib/monitoring_file_check.php:766
|
6130 |
#, php-format
|
6131 |
msgid "New files: %s"
|
6132 |
msgstr "Nouveaux fichiers : %s"
|
6133 |
|
6134 |
+
#: lib/monitoring_file_check.php:283 lib/monitoring_file_check.php:768
|
6135 |
#, php-format
|
6136 |
msgid "Deleted files: %s"
|
6137 |
msgstr "Fichiers supprimés : %s"
|
6138 |
|
6139 |
+
#: lib/monitoring_file_check.php:284 lib/monitoring_file_check.php:767
|
6140 |
#, php-format
|
6141 |
msgid "Modified files: %s"
|
6142 |
msgstr "Fichiers modifiés : %s"
|
6143 |
|
6144 |
+
#: lib/monitoring_file_check.php:288
|
6145 |
msgid "View Changes"
|
6146 |
msgstr "Voir les Modifications"
|
6147 |
|
6148 |
+
#: lib/monitoring_file_check.php:292
|
6149 |
msgid "Download Changes"
|
6150 |
msgstr "Télécharger les Modifications"
|
6151 |
|
6152 |
+
#: lib/monitoring_file_check.php:304
|
6153 |
msgid "Click a file to get more info about it."
|
6154 |
msgstr "Cliquez sur un fichier pour obtenir plus d'informations à son sujet."
|
6155 |
|
6156 |
+
#: lib/monitoring_file_check.php:307
|
6157 |
msgid "New files:"
|
6158 |
msgstr "Nouveaux fichiers :"
|
6159 |
|
6160 |
+
#: lib/monitoring_file_check.php:316 lib/monitoring_file_check.php:369
|
6161 |
msgid "Size"
|
6162 |
msgstr "Taille"
|
6163 |
|
6164 |
+
#: lib/monitoring_file_check.php:320 lib/monitoring_file_check.php:374
|
6165 |
msgid "Access"
|
6166 |
msgstr "Accès"
|
6167 |
|
6168 |
+
#: lib/monitoring_file_check.php:324 lib/monitoring_file_check.php:379
|
6169 |
msgid "Uid / Gid"
|
6170 |
msgstr "Uid / Gid"
|
6171 |
|
6172 |
+
#: lib/monitoring_file_check.php:328 lib/monitoring_file_check.php:384
|
6173 |
msgid "Modify"
|
6174 |
msgstr "Modification"
|
6175 |
|
6176 |
+
#: lib/monitoring_file_check.php:332 lib/monitoring_file_check.php:389
|
6177 |
msgid "Change"
|
6178 |
msgstr "Changement"
|
6179 |
|
6180 |
+
#: lib/monitoring_file_check.php:342
|
6181 |
msgid "Deleted files:"
|
6182 |
msgstr "Fichiers supprimés :"
|
6183 |
|
6184 |
+
#: lib/monitoring_file_check.php:355
|
6185 |
msgid "Modified files:"
|
6186 |
msgstr "Fichiers modifiés :"
|
6187 |
|
6188 |
+
#: lib/monitoring_file_check.php:365
|
6189 |
msgid "Old"
|
6190 |
msgstr "Ancien"
|
6191 |
|
6192 |
+
#: lib/monitoring_file_check.php:366
|
6193 |
msgid "New"
|
6194 |
msgstr "Nouveau"
|
6195 |
|
6196 |
+
#: lib/monitoring_file_check.php:415
|
6197 |
msgid "Scan System For File Changes"
|
6198 |
msgstr "Lancer l'analyse des fichiers"
|
6199 |
|
6200 |
+
#: lib/monitoring_file_check.php:433
|
6201 |
msgid "Options"
|
6202 |
msgstr "Options"
|
6203 |
|
6204 |
+
#: lib/monitoring_file_check.php:440
|
6205 |
#, php-format
|
6206 |
msgid ""
|
6207 |
"It seems that %s is set. Ensure you have another way to run WP-Cron, "
|
6210 |
"Il semble que %s est activé. Assurez vous de pouvoir exécuter WP-Cron, sinon "
|
6211 |
"File Check ne pourra pas se lancer automatiquement."
|
6212 |
|
6213 |
+
#: lib/monitoring_file_check.php:446
|
6214 |
msgid "Enable scheduled scans"
|
6215 |
msgstr "Lancer File Check automatiquement"
|
6216 |
|
6217 |
+
#: lib/monitoring_file_check.php:448
|
6218 |
msgid "No (default)"
|
6219 |
msgstr "Non (défaut)"
|
6220 |
|
6221 |
+
#: lib/monitoring_file_check.php:449 lib/security_rules_update.php:153
|
6222 |
msgid "Hourly"
|
6223 |
msgstr "Une fois par heure"
|
6224 |
|
6225 |
+
#: lib/monitoring_file_check.php:450 lib/security_rules_update.php:154
|
6226 |
msgid "Twicedaily"
|
6227 |
msgstr "Deux fois par jour"
|
6228 |
|
6229 |
+
#: lib/monitoring_file_check.php:451 lib/security_rules_update.php:155
|
6230 |
msgid "Daily"
|
6231 |
msgstr "Tous les jours"
|
6232 |
|
6233 |
+
#: lib/monitoring_file_check.php:458
|
6234 |
#, php-format
|
6235 |
msgid ""
|
6236 |
"Next scan will start in approximately %s day(s), %s hour(s), %s minute(s) "
|
6239 |
"La prochaine analyse commencera dans %s jour(s), %s heure(s), %s minute(s) "
|
6240 |
"et %s seconde(s)."
|
6241 |
|
6242 |
+
#: lib/monitoring_file_check.php:465
|
6243 |
msgid ""
|
6244 |
"The next scheduled scan date is in the past! WordPress wp-cron may not be "
|
6245 |
"working or may have been disabled."
|
6247 |
"La date de la prochaine analyse est dans le passé ! Essayez de "
|
6248 |
"recharger cette page, sinon vérifiez que WP-Cron n'a pas été désactivé."
|
6249 |
|
6250 |
+
#: lib/monitoring_file_check.php:473
|
6251 |
msgid "Scheduled scan report"
|
6252 |
msgstr "Rapport d'analyse"
|
6253 |
|
6254 |
+
#: lib/monitoring_file_check.php:475
|
6255 |
msgid "Send me a report by email only if changes are detected (default)"
|
6256 |
msgstr ""
|
6257 |
"Envoyez-moi un rapport uniquement si des changements ont été détectés "
|
6258 |
"(défaut)"
|
6259 |
|
6260 |
+
#: lib/monitoring_file_check.php:476
|
6261 |
msgid "Always send me a report by email after a scheduled scan"
|
6262 |
msgstr "Envoyez-moi toujours un rapport après une analyse automatique"
|
6263 |
|
6264 |
+
#: lib/monitoring_file_check.php:481
|
6265 |
msgid "Save Scan Options"
|
6266 |
msgstr "Sauvegarder les options"
|
6267 |
|
6268 |
+
#: lib/monitoring_file_check.php:493
|
6269 |
msgid "Enter the full path to the directory to be scanned."
|
6270 |
msgstr "Entrez le chemin complet vers le répertoire à scanner."
|
6271 |
|
6272 |
+
#: lib/monitoring_file_check.php:496
|
6273 |
#, php-format
|
6274 |
msgid "The directory %s is not correct."
|
6275 |
msgstr "Le répertoire %s est invalide."
|
6276 |
|
6277 |
+
#: lib/monitoring_file_check.php:503
|
6278 |
#, php-format
|
6279 |
msgid "The directory %s does not exist."
|
6280 |
msgstr "Le répertoire %s n'existe pas."
|
6281 |
|
6282 |
+
#: lib/monitoring_file_check.php:506
|
6283 |
#, php-format
|
6284 |
msgid "The directory %s is not readable."
|
6285 |
msgstr "Le répertoire %s n'est pas lisible."
|
6286 |
|
6287 |
+
#: lib/monitoring_file_check.php:547
|
6288 |
#, php-format
|
6289 |
msgid "Cannot write to %s."
|
6290 |
msgstr "Impossible d'écrire dans %s."
|
6291 |
|
6292 |
+
#: lib/monitoring_file_check.php:577
|
6293 |
#, php-format
|
6294 |
msgid "Error : cannot open %s directory."
|
6295 |
msgstr "Erreur : impossible d'ouvrir le répertoire %s."
|
6296 |
|
6297 |
+
#: lib/monitoring_file_check.php:580
|
6298 |
#, php-format
|
6299 |
msgid "Error : %s directory is not readable."
|
6300 |
msgstr "Erreur : le répertoire %s n'est pas lisible."
|
6301 |
|
6302 |
+
#: lib/monitoring_file_check.php:595
|
6303 |
#, php-format
|
6304 |
msgid "Missing options line %s, please try again."
|
6305 |
msgstr "Option manquante (ligne %s). Veuillez essayer à nouveau."
|
6306 |
|
6307 |
+
#: lib/monitoring_file_check.php:605
|
6308 |
#, php-format
|
6309 |
msgid "Cannot create %s."
|
6310 |
msgstr "Impossible de créer %s."
|
6311 |
|
6312 |
+
#: lib/monitoring_file_check.php:622
|
6313 |
msgid "Error reading old snapshot file."
|
6314 |
msgstr "Erreur lors de la lecture du fichier de l'ancien instantané."
|
6315 |
|
6316 |
+
#: lib/monitoring_file_check.php:633
|
6317 |
msgid "Error reading new snapshot file."
|
6318 |
msgstr "Erreur lors de la lecture du fichier du nouvel instantané."
|
6319 |
|
6320 |
+
#: lib/monitoring_file_check.php:731 ninjafirewall.php:476
|
6321 |
msgid "New file"
|
6322 |
msgstr "Nouveau fichier"
|
6323 |
|
6324 |
+
#: lib/monitoring_file_check.php:732 ninjafirewall.php:477
|
6325 |
msgid "Modified file"
|
6326 |
msgstr "Fichier modifié"
|
6327 |
|
6328 |
+
#: lib/monitoring_file_check.php:733 ninjafirewall.php:478
|
6329 |
msgid "Deleted file"
|
6330 |
msgstr "Fichier supprimé"
|
6331 |
|
6332 |
+
#: lib/monitoring_file_check.php:757
|
6333 |
msgid "[NinjaFirewall] Alert: File Check detection"
|
6334 |
msgstr "[NinjaFirewall] Alerte: Détection File Check"
|
6335 |
|
6336 |
+
#: lib/monitoring_file_check.php:764 lib/monitoring_file_check.php:786
|
6337 |
#: lib/security_rules_update.php:564
|
6338 |
#, php-format
|
6339 |
msgid "Date: %s"
|
6340 |
msgstr "Date : %s"
|
6341 |
|
6342 |
+
#: lib/monitoring_file_check.php:770
|
6343 |
msgid "See attached file for details."
|
6344 |
msgstr "Voir le fichier joint pour plus de détails."
|
6345 |
|
6346 |
+
#: lib/monitoring_file_check.php:779
|
6347 |
msgid "[NinjaFirewall] File Check report"
|
6348 |
msgstr "[NinjaFirewall] Rapport de File Check"
|
6349 |
|
6350 |
+
#: lib/monitoring_file_check.php:780
|
6351 |
msgid "NinjaFirewall did not detect changes in your files."
|
6352 |
msgstr "NinjaFirewall n'a pas détecté de changements dans vos fichiers."
|
6353 |
|
6404 |
msgid "Save File Guard options"
|
6405 |
msgstr "Sauvegarder les options"
|
6406 |
|
6407 |
+
#: lib/network.php:24 ninjafirewall.php:1202 ninjafirewall.php:1206
|
6408 |
#, php-format
|
6409 |
msgid "You are not allowed to perform this task (%s)."
|
6410 |
msgstr "Vous n'êtes pas autorisé à effectuer cette tâche (%s)."
|
6436 |
msgstr "La tâche planifiée s'est arrêtée, redémarrage en cours (%s)"
|
6437 |
|
6438 |
#: lib/security_rules.php:44 lib/security_rules_update.php:565
|
6439 |
+
#: ninjafirewall.php:945
|
6440 |
msgid "Security Rules"
|
6441 |
msgstr "Règles de Sécurité"
|
6442 |
|
6934 |
msgid "Cancel and Close"
|
6935 |
msgstr "Annuler et Fermer"
|
6936 |
|
6937 |
+
#: lib/utils.php:188 lib/utils.php:196 lib/utils.php:289
|
6938 |
msgid "N/A"
|
6939 |
msgstr "N/A"
|
6940 |
|
6948 |
msgid "Attempt to edit a published %s (ID: %s)"
|
6949 |
msgstr "Tentative de modification de %s (ID: %s)"
|
6950 |
|
6951 |
+
#: lib/utils.php:212 lib/utils.php:281
|
6952 |
msgid "Unauthenticated user"
|
6953 |
msgstr "Utilisateur non authentifié"
|
6954 |
|
6964 |
"NinjaFirewall a bloqué une tentative de modification/création d'une page ou "
|
6965 |
"d'un article par un utilisateur qui n'avait pas les capacités nécessaires :"
|
6966 |
|
6967 |
+
#: lib/utils.php:226 lib/utils.php:301 lib/utils.php:413 lib/utils.php:1245
|
6968 |
msgid "Username:"
|
6969 |
msgstr "Utilisateur :"
|
6970 |
|
6972 |
msgid "Action:"
|
6973 |
msgstr "Action :"
|
6974 |
|
6975 |
+
#: lib/utils.php:238 lib/utils.php:312 lib/utils.php:1257 lib/utils.php:1506
|
|
|
|
|
|
|
|
|
|
|
|
|
6976 |
msgid ""
|
6977 |
"This protection (and notification) can be turned off from NinjaFirewall "
|
6978 |
"\"Firewall Policies\" page."
|
6980 |
"Cette protection (et notification) peut être désactivée à partir de la page "
|
6981 |
"\"Politiques du Pare-feu\" de NinjaFirewall."
|
6982 |
|
6983 |
+
#: lib/utils.php:252 lib/utils.php:253 lib/utils.php:326 lib/utils.php:327
|
6984 |
+
#: lib/utils.php:436 lib/utils.php:437 lib/utils.php:1272 lib/utils.php:1273
|
6985 |
msgid "You are not allowed to perform this task."
|
6986 |
msgstr "Vous n'êtes pas autorisé à effectuer cette tâche."
|
6987 |
|
6988 |
+
#: lib/utils.php:292
|
6989 |
msgid "Blocked post/page deletion attempt"
|
6990 |
msgstr "Tentative de suppression de page/article bloquée"
|
6991 |
|
6992 |
+
#: lib/utils.php:299
|
6993 |
msgid ""
|
6994 |
"NinjaFirewall has blocked an attempt to delete a post by a user who doesn't "
|
6995 |
"have the right capabilities:"
|
6997 |
"NinjaFirewall a bloqué une tentative de suppression d'une page ou d'un "
|
6998 |
"article par un utilisateur qui n'avait pas les capacités nécessaires :"
|
6999 |
|
7000 |
+
#: lib/utils.php:403
|
7001 |
msgid "Blocked user account creation"
|
7002 |
msgstr "Création de compte d'utilisateur bloquée"
|
7003 |
|
7004 |
+
#: lib/utils.php:410
|
7005 |
msgid "NinjaFirewall has blocked an attempt to create a user account:"
|
7006 |
msgstr ""
|
7007 |
"NinjaFirewall a bloqué une tentative de création d'un compte d'utilisateur :"
|
7008 |
|
7009 |
+
#: lib/utils.php:501
|
7010 |
#, php-format
|
7011 |
msgid "Backup file is corrupted, deleting it (%s)"
|
7012 |
msgstr "Le fichier de sauvegarde est corrompu, suppression en cours (%s)"
|
7013 |
|
7014 |
+
#: lib/utils.php:509
|
7015 |
#, php-format
|
7016 |
msgid ""
|
7017 |
"NinjaFirewall's options are corrupted, restoring them from last known good "
|
7020 |
"Les options de NinjaFirewall sont corrompues, tentative de restauration à "
|
7021 |
"partir du dernier fichier de sauvegarde connu (%s)"
|
7022 |
|
7023 |
+
#: lib/utils.php:515
|
7024 |
msgid ""
|
7025 |
"NinjaFirewall's options are corrupted, restoring their default values (no "
|
7026 |
"valid backup found)"
|
7028 |
"Les options de NinjaFirewall sont corrompues, restauration des valeurs par "
|
7029 |
"défaut (il n'existe pas de fichier de sauvegarde)"
|
7030 |
|
7031 |
+
#: lib/utils.php:748
|
7032 |
msgid ""
|
7033 |
"Warning: Because NinjaFirewall's Login Protection is enabled, Site Health "
|
7034 |
"may return an error message regarding the loopback test (e.g., 404 or 401 "
|
7039 |
"concernant le test de la requête de bouclage (ex.: code d’état HTTP 404 ou "
|
7040 |
"401). Vous pouvez l'ignorer en toute sécurité."
|
7041 |
|
7042 |
+
#: lib/utils.php:771 lib/utils.php:775
|
7043 |
msgid "NinjaFirewall error"
|
7044 |
msgstr "NinjaFirewall Erreur"
|
7045 |
|
7046 |
+
#: lib/utils.php:772
|
7047 |
#, php-format
|
7048 |
msgid ""
|
7049 |
"%s directory cannot be created. Please review your installation and ensure "
|
7052 |
"Le répertoire %s ne peut pas être créé. Vérifiez votre installation et "
|
7053 |
"assurez vous que %s n'est pas en lecture seule."
|
7054 |
|
7055 |
+
#: lib/utils.php:776
|
7056 |
#, php-format
|
7057 |
msgid ""
|
7058 |
"%s directory is read-only. Please review your installation and ensure that "
|
7061 |
"Le répertoire %s est en lecture seule. Vérifiez votre installation et les "
|
7062 |
"permissions de %s."
|
7063 |
|
7064 |
+
#: lib/utils.php:791
|
7065 |
msgid "unknown error"
|
7066 |
msgstr "erreur inconnue"
|
7067 |
|
7068 |
+
#: lib/utils.php:793
|
7069 |
msgid "NinjaFirewall fatal error:"
|
7070 |
msgstr "NinjaFirewall erreur fatale :"
|
7071 |
|
7072 |
+
#: lib/utils.php:794
|
7073 |
msgid "Review your installation, your site is not protected."
|
7074 |
msgstr "Vérifiez votre installation, votre site n'est pas protégé."
|
7075 |
|
7076 |
+
#: lib/utils.php:815
|
7077 |
msgid "Alert: WordPress console login"
|
7078 |
msgstr "Alerte : Connexion à WordPress"
|
7079 |
|
7080 |
+
#: lib/utils.php:821
|
7081 |
msgid "Someone just logged in to your WordPress admin console:"
|
7082 |
msgstr "Quelqu'un vient de se connecter à votre Tableau de bord de WordPress:"
|
7083 |
|
7084 |
+
#: lib/utils.php:939 lib/utils.php:966
|
7085 |
msgid "Forbidden access"
|
7086 |
msgstr "Accès interdit"
|
7087 |
|
7088 |
+
#: lib/utils.php:985
|
7089 |
#, php-format
|
7090 |
msgid ""
|
7091 |
"<strong>ERROR</strong>: Invalid username, email address or password.<br /><a "
|
7094 |
"<strong>ERREUR</strong>: Identifiant, email ou mot de passe invalide.<br /"
|
7095 |
"><a href=\"%s\">Mot de passe perdu</a> ?"
|
7096 |
|
7097 |
+
#: lib/utils.php:1063
|
7098 |
msgid "[NinjaFirewall] Alert: Database changes detected"
|
7099 |
msgstr "[NinjaFirewall] Alerte: Modification dans la base de données"
|
7100 |
|
7101 |
+
#: lib/utils.php:1064
|
7102 |
msgid ""
|
7103 |
"NinjaFirewall has detected that one or more administrator accounts were "
|
7104 |
"modified in the database:"
|
7106 |
"NinjaFirewall a détecté que un ou plusieurs comptes d'administrateur ont été "
|
7107 |
"modifiés dans la base de données:"
|
7108 |
|
7109 |
+
#: lib/utils.php:1069
|
7110 |
#, php-format
|
7111 |
msgid "Total administrators : %s"
|
7112 |
msgstr "Nombre d'administrateurs : %s"
|
7113 |
|
7114 |
+
#: lib/utils.php:1078
|
7115 |
msgid ""
|
7116 |
"If you cannot see any modifications in the above fields, it is possible that "
|
7117 |
"the administrator password was changed."
|
7119 |
"Si vous ne voyez pas de modifications dans les données ci-dessus, il est "
|
7120 |
"possible que le mot de passe administrateur ait été changé."
|
7121 |
|
7122 |
+
#: lib/utils.php:1231
|
7123 |
msgid "Blocked privilege escalation attempt"
|
7124 |
msgstr "Tentatives d'élévation des privilèges"
|
7125 |
|
7126 |
+
#: lib/utils.php:1239
|
7127 |
msgid ""
|
7128 |
"NinjaFirewall has blocked an attempt to modify a user capability by someone "
|
7129 |
"who does not have administrative privileges:"
|
7131 |
"NinjaFirewall a bloqué une tentative de modification de certaines Capacités "
|
7132 |
"par un utilisateur ne disposant pas de privilèges administratifs :"
|
7133 |
|
7134 |
+
#: lib/utils.php:1284
|
7135 |
msgid ""
|
7136 |
"NinjaFirewall brute-force protection is enabled and you are temporarily "
|
7137 |
"whitelisted."
|
7139 |
"La protection de NinjaFirewall contre les attaques par force brute est "
|
7140 |
"activée. Vous êtes temporairement dans la liste blanche."
|
7141 |
|
7142 |
+
#: lib/utils.php:1299
|
7143 |
#, php-format
|
7144 |
msgid ""
|
7145 |
"Hey, it seems that you've been using NinjaFirewall for some time. If you "
|
7152 |
"a>. Il a fallu des milliers d'heures pour le développer, mais il suffit "
|
7153 |
"seulement de quelques minutes pour le noter. Merci !"
|
7154 |
|
7155 |
+
#: lib/utils.php:1474
|
7156 |
msgid ""
|
7157 |
"The attempt was blocked and the option was reversed to its original value."
|
7158 |
msgstr ""
|
7159 |
"La tentative a été bloquée et l'option a été remise à sa valeur d'origine."
|
7160 |
|
7161 |
+
#: lib/utils.php:1479
|
7162 |
msgid "Attempt to modify WordPress settings"
|
7163 |
msgstr "Tentative de modification des paramètres de WordPress"
|
7164 |
|
7165 |
+
#: lib/utils.php:1480
|
7166 |
msgid ""
|
7167 |
"NinjaFirewall has blocked an attempt to modify some important WordPress "
|
7168 |
"settings by a user that does not have administrative privileges:"
|
7171 |
"importants de WordPress par un utilisateur ne disposant pas de privilèges "
|
7172 |
"administratifs :"
|
7173 |
|
7174 |
+
#: lib/utils.php:1481 lib/utils.php:1490
|
7175 |
#, php-format
|
7176 |
msgid "Option: %s"
|
7177 |
msgstr "Option: %s"
|
7178 |
|
7179 |
+
#: lib/utils.php:1482
|
7180 |
#, php-format
|
7181 |
msgid "Original value: %s"
|
7182 |
msgstr "Valeur originale : %s"
|
7183 |
|
7184 |
+
#: lib/utils.php:1483
|
7185 |
#, php-format
|
7186 |
msgid "Modified value: %s"
|
7187 |
msgstr "Valeur modifiée : %s"
|
7188 |
|
7189 |
+
#: lib/utils.php:1484 lib/utils.php:1492
|
7190 |
#, php-format
|
7191 |
msgid "Action taken: %s"
|
7192 |
msgstr "Action prise : %s"
|
7193 |
|
7194 |
+
#: lib/utils.php:1488
|
7195 |
msgid "Code injection attempt in WordPress options table"
|
7196 |
msgstr "Tentative d'injection de code dans la table des options de WordPress"
|
7197 |
|
7198 |
+
#: lib/utils.php:1489
|
7199 |
msgid ""
|
7200 |
"NinjaFirewall has blocked an attempt to inject code in the WordPress options "
|
7201 |
"table by a user that does not have administrative privileges:"
|
7204 |
"options de WordPress par un utilisateur ne disposant pas de privilèges "
|
7205 |
"administratifs :"
|
7206 |
|
7207 |
+
#: lib/utils.php:1491
|
7208 |
#, php-format
|
7209 |
msgid "Code: %s"
|
7210 |
msgstr "Code : %s"
|
7211 |
|
7212 |
+
#: lib/utils.php:1585
|
7213 |
msgid "Important: NinjaFirewall has detected that this is a security update."
|
7214 |
msgstr ""
|
7215 |
"Important : NinjaFirewall a détecté que ceci est un mise à jour de sécurité."
|
7216 |
|
7217 |
+
#: lib/utils.php:1588
|
7218 |
msgid "More info about this warning."
|
7219 |
msgstr "En savoir plus."
|
7220 |
|
7221 |
+
#: lib/utils.php:1611
|
7222 |
#, php-format
|
7223 |
msgid "Cannot send notification, no valid email found (%s)"
|
7224 |
msgstr ""
|
7225 |
"Impossible d'envoyer la notification, aucune adresse e-mail valide n'a été "
|
7226 |
"trouvée (%s)"
|
7227 |
|
7228 |
+
#: lib/utils.php:1636
|
7229 |
#, php-format
|
7230 |
msgid ""
|
7231 |
"If you don't have access to that site any longer, you can remove your email "
|
7234 |
"Si vous n'avez plus accès à ce site, vous pouvez supprimer votre e-mail en "
|
7235 |
"cliquant sur le lien suivant (valide pendant 12 heures) : %s"
|
7236 |
|
7237 |
+
#: lib/utils.php:1658
|
7238 |
+
msgid "A PHP backtrace has been attached to this message for your convenience."
|
7239 |
+
msgstr ""
|
7240 |
+
"La pile d'exécution de PHP est jointe à ce message pour votre commodité."
|
7241 |
+
|
7242 |
+
#: lib/utils.php:1679
|
7243 |
#, php-format
|
7244 |
msgid "Error, cannot create the %s folder."
|
7245 |
msgstr "Erreur, impossible de créer le répertoire %s."
|
7246 |
|
7247 |
+
#: lib/utils.php:1680 lib/utils.php:1689 lib/utils.php:1698
|
7248 |
msgid "Check your server permissions and try again."
|
7249 |
msgstr "Vérifiez les autorisations de votre serveur et réessayez."
|
7250 |
|
7251 |
+
#: lib/utils.php:1688
|
7252 |
#, php-format
|
7253 |
msgid "Error, the %s folder is not writable."
|
7254 |
msgstr "Erreur, le répertoire %s est en lecture seule."
|
7255 |
|
7256 |
+
#: lib/utils.php:1697
|
7257 |
#, php-format
|
7258 |
msgid "Error, cannot write %s."
|
7259 |
msgstr "Erreur, impossible d'écrire dans %s."
|
7773 |
"Impossible de récupérer les règles de l'utilisateur dans la base de données "
|
7774 |
"(#4)"
|
7775 |
|
7776 |
+
#: ninjafirewall.php:140 ninjafirewall.php:212
|
7777 |
+
msgid ""
|
7778 |
+
"Error: to interact with NinjaFirewall you must use the --user flag with the "
|
7779 |
+
"administrator name, ID or email address (e.g., --user=adminuser)."
|
7780 |
+
msgstr ""
|
7781 |
+
"Erreur : pour interagir avec NinjaFirewall, vous devez utiliser l'indicateur "
|
7782 |
+
"--user avec le nom, l'ID ou l'adresse e-mail de l'administrateur (par "
|
7783 |
+
"exemple, --user=adminuser)."
|
7784 |
+
|
7785 |
+
#: ninjafirewall.php:142 ninjafirewall.php:214
|
7786 |
msgid ""
|
7787 |
"You do not have \"unfiltered_html\" capability. Please enable it in order to "
|
7788 |
"run NinjaFirewall (or make sure you do not have \"DISALLOW_UNFILTERED_HTML\" "
|
7793 |
"la directive \"DISALLOW_UNFILTERED_HTML\" activée dans votre fichier wp-"
|
7794 |
"config.php)."
|
7795 |
|
7796 |
+
#: ninjafirewall.php:150
|
7797 |
#, php-format
|
7798 |
msgid ""
|
7799 |
"NinjaFirewall requires WordPress %s or greater but your current version is "
|
7801 |
msgstr ""
|
7802 |
"NinjaFirewall nécessite au moins WordPress %s mais votre version est %s."
|
7803 |
|
7804 |
+
#: ninjafirewall.php:154
|
7805 |
#, php-format
|
7806 |
msgid ""
|
7807 |
"NinjaFirewall requires PHP 5.3 or greater but your current version is %s."
|
7808 |
msgstr ""
|
7809 |
"NinjaFirewall nécessite au moins PHP 5.3 mais votre version de PHP est %s."
|
7810 |
|
7811 |
+
#: ninjafirewall.php:158
|
7812 |
#, php-format
|
7813 |
msgid "NinjaFirewall requires the PHP %s extension."
|
7814 |
msgstr "NinjaFirewall nécessite l'extension PHP %s."
|
7815 |
|
7816 |
+
#: ninjafirewall.php:162
|
7817 |
msgid ""
|
7818 |
"You have SAFE_MODE enabled. Please disable it, it is deprecated as of PHP "
|
7819 |
"5.3.0 (see http://php.net/safe-mode)."
|
7822 |
"devenue obsolète depuis PHP 5.3 et a été supprimée depuis PHP 5.4 (cf. "
|
7823 |
"http://php.net/safe-mode)."
|
7824 |
|
7825 |
+
#: ninjafirewall.php:166
|
7826 |
msgid "You are not allowed to activate NinjaFirewall."
|
7827 |
msgstr "Vous n’êtes pas autorisé à activer NinjaFirewall."
|
7828 |
|
7829 |
+
#: ninjafirewall.php:170
|
7830 |
msgid "NinjaFirewall is not compatible with Microsoft Windows."
|
7831 |
msgstr "NinjaFirewall n'est pas compatible avec Microsoft Windows."
|
7832 |
|
7833 |
+
#: ninjafirewall.php:320
|
7834 |
msgid ""
|
7835 |
"All fields will be restored to their default values and any changes you made "
|
7836 |
"will be lost. Continue?"
|
7838 |
"Tous les champs vont être re-initialisés et vos changements seront perdus. "
|
7839 |
"Continuer ?"
|
7840 |
|
7841 |
+
#: ninjafirewall.php:324
|
7842 |
msgid "Missing security nonce, try to reload the page."
|
7843 |
msgstr "La nonce de sécurité est manquante, essayer de recharger cette page."
|
7844 |
|
7845 |
+
#: ninjafirewall.php:326
|
7846 |
msgid "Please select the HTTP server in the list."
|
7847 |
msgstr "Sélectionnez votre serveur HTTP dans la list."
|
7848 |
|
7849 |
+
#: ninjafirewall.php:329
|
7850 |
msgid "Delete the firewall's error log ?"
|
7851 |
msgstr "Supprimer le journal des erreurs ?"
|
7852 |
|
7853 |
+
#: ninjafirewall.php:333
|
7854 |
msgid ""
|
7855 |
"This action will restore the selected configuration file and will override "
|
7856 |
"all your current firewall options, policies and rules. Continue?"
|
7859 |
"remplacera toutes les options, politiques et règles de pare-feu actuelles. "
|
7860 |
"Continuer ?"
|
7861 |
|
7862 |
+
#: ninjafirewall.php:337
|
7863 |
msgid ""
|
7864 |
"Any character that is not a letter [a-zA-Z], a digit [0-9], a dot [.], a "
|
7865 |
"hyphen [-] or an underscore [_] will be removed from the filename and "
|
7869 |
"[.], un trait d'union[-] ou un caractère de soulignement[_], sera supprimé "
|
7870 |
"du nom du fichier et remplacé par le caractère de substitution. Continuer ?"
|
7871 |
|
7872 |
+
#: ninjafirewall.php:339
|
7873 |
msgid ""
|
7874 |
"Ensure that you can access your admin console over HTTPS before enabling "
|
7875 |
"this option, otherwise you will lock yourself out of your site. Continue?"
|
7878 |
"option, sinon vous risqueriez de ne plus pouvoir accéder à l'interface "
|
7879 |
"d'administration. Continuer ?"
|
7880 |
|
7881 |
+
#: ninjafirewall.php:341
|
7882 |
msgid ""
|
7883 |
"WooCommerce is running: if you block accounts creation, your customers won't "
|
7884 |
"be able to sign up. Continue?"
|
7886 |
"WooCommerce est activé : si vous bloquez la création de comptes, vos clients "
|
7887 |
"ne pourront pas s'enregistrer. Continuer ?"
|
7888 |
|
7889 |
+
#: ninjafirewall.php:343
|
7890 |
msgid ""
|
7891 |
"Your blog has user registration enabled: if you block accounts creation, "
|
7892 |
"your customers won't be able to sign up. Continue?"
|
7894 |
"Votre blog accepte les inscriptions : si vous bloquez la création de "
|
7895 |
"comptes, vos clients ne pourront plus s'inscrire. Continuer ?"
|
7896 |
|
7897 |
+
#: ninjafirewall.php:345
|
7898 |
msgid ""
|
7899 |
"Your multisite installation allows users to register new sites: if you "
|
7900 |
"enable this option, they will likely get blocked when creating their blog. "
|
7903 |
"Les utilisateurs sont autorisés a créer des nouveaux sites : si vous activez "
|
7904 |
"cette option, ils ne pourront plus le faire. Continuer ?"
|
7905 |
|
7906 |
+
#: ninjafirewall.php:349
|
7907 |
msgid "Delete the current snapshot ?"
|
7908 |
msgstr "Supprimer l'instantané actuel ?"
|
7909 |
|
7910 |
+
#: ninjafirewall.php:353
|
7911 |
msgid "Invalid character."
|
7912 |
msgstr "Caractère invalide."
|
7913 |
|
7914 |
+
#: ninjafirewall.php:355
|
7915 |
msgid "\"admin\" is not acceptable, please choose another user name."
|
7916 |
msgstr ""
|
7917 |
"\"admin\" n\\'est pas acceptable, merci de bien vouloir choisir un autre "
|
7918 |
"identifiant."
|
7919 |
|
7920 |
+
#: ninjafirewall.php:357
|
7921 |
msgid "Please enter max 1024 character only."
|
7922 |
msgstr "Veuillez ne pas entrer plus de 1 024 caractères."
|
7923 |
|
7924 |
+
#: ninjafirewall.php:359
|
7925 |
msgid "Select when to enable the login protection."
|
7926 |
msgstr "Veuillez sélectionner quand activer la protection."
|
7927 |
|
7928 |
+
#: ninjafirewall.php:361
|
7929 |
msgid "Enter a name and a password for the HTTP authentication."
|
7930 |
msgstr ""
|
7931 |
"Veuillez entrer un nom d'utilisateur et mot de passe pour l'authentification "
|
7932 |
"HTTP."
|
7933 |
|
7934 |
+
#: ninjafirewall.php:365
|
7935 |
msgid "Your public key is not valid."
|
7936 |
msgstr "Votre clé publique n\\'est pas valide."
|
7937 |
|
7938 |
+
#: ninjafirewall.php:371
|
7939 |
msgid "No traffic yet, please wait"
|
7940 |
msgstr "Aucun visiteur actuellement, veuillez patienter"
|
7941 |
|
7942 |
+
#: ninjafirewall.php:373
|
7943 |
msgid "seconds..."
|
7944 |
msgstr "secondes..."
|
7945 |
|
7946 |
+
#: ninjafirewall.php:375
|
7947 |
msgid "Error: Live Log did not receive the expected response from your server:"
|
7948 |
msgstr "Erreur : le serveur distant n\\'a pas retourné la réponse attendue :"
|
7949 |
|
7950 |
+
#: ninjafirewall.php:377
|
7951 |
msgid "Error: URL does not seem to exist (404 Not Found):"
|
7952 |
msgstr "Erreur : l'URL ne semble pas exister (404 Not Found) :"
|
7953 |
|
7954 |
+
#: ninjafirewall.php:379
|
7955 |
msgid "Error: Cannot find your log file. Try to reload this page."
|
7956 |
msgstr ""
|
7957 |
"Erreur : Impossible de trouver le fichier log. Essayez de recharger cette "
|
7958 |
"page."
|
7959 |
|
7960 |
+
#: ninjafirewall.php:381
|
7961 |
msgid "Error: The HTTP server returned the following error code:"
|
7962 |
msgstr "Erreur : Le serveur HTTP a retourné le code d'erreur suivant :"
|
7963 |
|
7964 |
+
#: ninjafirewall.php:652 ninjafirewall.php:772 ninjafirewall.php:841
|
7965 |
msgid "Error: Security nonces do not match. Reload the page and try again."
|
7966 |
msgstr ""
|
7967 |
"Erreur : Les nonces de sécurité ne correspondent pas. Veuillez recharger "
|
7968 |
"cette page."
|
7969 |
|
7970 |
+
#: ninjafirewall.php:658
|
7971 |
msgid "Error: NinjaFirewall is disabled"
|
7972 |
msgstr "Erreur : NinjaFirewall est désactivé"
|
7973 |
|
7974 |
+
#: ninjafirewall.php:663 ninjafirewall.php:777 ninjafirewall.php:807
|
7975 |
#, php-format
|
7976 |
msgid "Error: missing parameter (%s)."
|
7977 |
msgstr "Erreur : Paramètre manquant (%s)."
|
7978 |
|
7979 |
+
#: ninjafirewall.php:903
|
7980 |
msgid "NinjaFirewall: Dashboard"
|
7981 |
msgstr "NinjaFirewall : Tableau de Bord"
|
7982 |
|
7983 |
+
#: ninjafirewall.php:907
|
7984 |
msgid "NinjaFirewall: Firewall Options"
|
7985 |
msgstr "NinjaFirewall : Options du Pare-feu"
|
7986 |
|
7987 |
+
#: ninjafirewall.php:911
|
7988 |
msgid "NinjaFirewall: Firewall Policies"
|
7989 |
msgstr "NinjaFirewall : Politiques du Pare-feu"
|
7990 |
|
7991 |
+
#: ninjafirewall.php:915
|
7992 |
msgid "NinjaFirewall: Monitoring"
|
7993 |
msgstr "NinjaFirewall : Monitoring"
|
7994 |
|
7995 |
+
#: ninjafirewall.php:925
|
7996 |
msgid "NinjaFirewall: Anti-Malware"
|
7997 |
msgstr "NinjaFirewall : Anti-Malware"
|
7998 |
|
7999 |
+
#: ninjafirewall.php:929
|
8000 |
msgid "NinjaFirewall: Network"
|
8001 |
msgstr "NinjaFirewall : Réseau"
|
8002 |
|
8003 |
+
#: ninjafirewall.php:933
|
8004 |
msgid "NinjaFirewall: Event Notifications"
|
8005 |
msgstr "NinjaFirewall : Notifications d’Événement"
|
8006 |
|
8007 |
+
#: ninjafirewall.php:937
|
8008 |
msgid "NinjaFirewall: Log-in Protection"
|
8009 |
msgstr "NinjaFirewall : Page de Connexion"
|
8010 |
|
8011 |
+
#: ninjafirewall.php:941
|
8012 |
msgid "NinjaFirewall: Logs"
|
8013 |
msgstr "NinjaFirewall : Journaux"
|
8014 |
|
8015 |
+
#: ninjafirewall.php:945
|
8016 |
msgid "NinjaFirewall: Security Rules"
|
8017 |
msgstr "NinjaFirewall : Règles de Sécurité"
|
8018 |
|
8019 |
+
#: ninjafirewall.php:989
|
8020 |
msgid "NinjaFirewall Settings"
|
8021 |
msgstr "Réglages de NinjaFirewall"
|
8022 |
|
8023 |
+
#: ninjafirewall.php:997
|
8024 |
msgid "NinjaFirewall is enabled"
|
8025 |
msgstr "NinjaFirewall est activé"
|
8026 |
|
8027 |
+
#: ninjafirewall.php:1137
|
8028 |
msgid "Access Restricted"
|
8029 |
msgstr "Accès limité"
|
8030 |
|
8031 |
+
#: ninjafirewall.php:1143
|
8032 |
msgid "Settings"
|
8033 |
msgstr "Réglages"
|
8034 |
|
8035 |
+
#: ninjafirewall.php:1144
|
8036 |
msgid "Upgrade to Premium"
|
8037 |
msgstr "Passez Premium !"
|
8038 |
|
8039 |
+
#: ninjafirewall.php:1145
|
8040 |
msgid "Rate it!"
|
8041 |
msgstr "Notez-le !"
|
8042 |
|
languages/ninjafirewall.pot
CHANGED
@@ -2,7 +2,7 @@
|
|
2 |
msgid ""
|
3 |
msgstr ""
|
4 |
"Project-Id-Version: Stable (latest release)\n"
|
5 |
-
"POT-Creation-Date: 2022-
|
6 |
"PO-Revision-Date: 2018-04-05 22:52+0700\n"
|
7 |
"Last-Translator: NinTechNet <contact@nintechnet.com>\n"
|
8 |
"Language-Team: \n"
|
@@ -19,7 +19,7 @@ msgstr ""
|
|
19 |
"X-Poedit-SearchPath-0: .\n"
|
20 |
"X-Poedit-SearchPathExcluded-0: /languages\n"
|
21 |
|
22 |
-
#: lib/anti_malware.php:24 ninjafirewall.php:
|
23 |
msgid "Anti-Malware"
|
24 |
msgstr ""
|
25 |
|
@@ -92,13 +92,13 @@ msgstr ""
|
|
92 |
#: lib/dashboard.php:127 lib/event_notifications.php:42
|
93 |
#: lib/firewall_options.php:42 lib/firewall_policies.php:71
|
94 |
#: lib/login_protection.php:30 lib/logs_firewall_log.php:59
|
95 |
-
#: lib/logs_live_log.php:79 lib/monitoring_file_check.php:
|
96 |
#: lib/monitoring_file_guard.php:46 lib/network.php:52
|
97 |
#: lib/security_rules_update.php:101
|
98 |
msgid "Your changes have been saved."
|
99 |
msgstr ""
|
100 |
|
101 |
-
#: lib/dashboard.php:132 ninjafirewall.php:
|
102 |
msgid "Dashboard"
|
103 |
msgstr ""
|
104 |
|
@@ -482,7 +482,7 @@ msgstr ""
|
|
482 |
msgid "Medium"
|
483 |
msgstr ""
|
484 |
|
485 |
-
#: lib/dashboard_statistics.php:
|
486 |
msgid "Select monthly stats to view..."
|
487 |
msgstr ""
|
488 |
|
@@ -503,11 +503,11 @@ msgstr ""
|
|
503 |
msgid "Your email address was removed from the \"Event Notifications\" option."
|
504 |
msgstr ""
|
505 |
|
506 |
-
#: lib/email_sodium.php:169 lib/monitoring_file_check.php:
|
507 |
-
#: lib/monitoring_file_check.php:
|
508 |
-
#: lib/monitoring_file_check.php:
|
509 |
-
#: lib/security_rules_update.php:561 lib/utils.php:225 lib/utils.php:
|
510 |
-
#: lib/utils.php:
|
511 |
msgid "Blog:"
|
512 |
msgstr ""
|
513 |
|
@@ -515,14 +515,14 @@ msgstr ""
|
|
515 |
msgid "Email address:"
|
516 |
msgstr ""
|
517 |
|
518 |
-
#: lib/email_sodium.php:171 lib/utils.php:230 lib/utils.php:
|
519 |
-
#: lib/utils.php:
|
520 |
msgid "User IP:"
|
521 |
msgstr ""
|
522 |
|
523 |
-
#: lib/email_sodium.php:172 lib/event_updates.php:
|
524 |
-
#: lib/utils.php:
|
525 |
-
#: lib/utils.php:
|
526 |
msgid "Date:"
|
527 |
msgstr ""
|
528 |
|
@@ -553,7 +553,7 @@ msgstr ""
|
|
553 |
msgid "No"
|
554 |
msgstr ""
|
555 |
|
556 |
-
#: lib/event_notifications.php:34 lib/help.php:377 ninjafirewall.php:
|
557 |
msgid "Event Notifications"
|
558 |
msgstr ""
|
559 |
|
@@ -770,77 +770,77 @@ msgstr ""
|
|
770 |
msgid "Blocked brute-force attacks:"
|
771 |
msgstr ""
|
772 |
|
773 |
-
#: lib/event_notifications.php:504 lib/event_updates.php:
|
774 |
msgid ""
|
775 |
"This notification can be turned off from NinjaFirewall \"Event Notifications"
|
776 |
"\" page."
|
777 |
msgstr ""
|
778 |
|
779 |
-
#: lib/event_updates.php:
|
780 |
msgid "Downloaded security rules are corrupted"
|
781 |
msgstr ""
|
782 |
|
783 |
-
#: lib/event_updates.php:
|
784 |
msgid "[NinjaFirewall] Warning: Security update available"
|
785 |
msgstr ""
|
786 |
|
787 |
-
#: lib/event_updates.php:
|
788 |
msgid ""
|
789 |
"NinjaFirewall has detected that there are security updates available for "
|
790 |
"your website:"
|
791 |
msgstr ""
|
792 |
|
793 |
-
#: lib/event_updates.php:
|
794 |
#, php-format
|
795 |
msgid "Blog: %s"
|
796 |
msgstr ""
|
797 |
|
798 |
-
#: lib/event_updates.php:
|
799 |
-
#: lib/event_updates.php:
|
800 |
#, php-format
|
801 |
msgid "Your version: %s"
|
802 |
msgstr ""
|
803 |
|
804 |
-
#: lib/event_updates.php:
|
805 |
-
#: lib/event_updates.php:
|
806 |
#, php-format
|
807 |
msgid "New version: %s"
|
808 |
msgstr ""
|
809 |
|
810 |
-
#: lib/event_updates.php:
|
811 |
-
#: lib/event_updates.php:
|
812 |
msgid "Severity: This is an important security update"
|
813 |
msgstr ""
|
814 |
|
815 |
-
#: lib/event_updates.php:
|
816 |
-
#: lib/event_updates.php:
|
817 |
msgid "Severity: **This is a critical security update**"
|
818 |
msgstr ""
|
819 |
|
820 |
-
#: lib/event_updates.php:
|
821 |
-
#: lib/event_updates.php:
|
822 |
msgid "Type: Security fix"
|
823 |
msgstr ""
|
824 |
|
825 |
-
#: lib/event_updates.php:
|
826 |
#, php-format
|
827 |
msgid "Plugin: %s"
|
828 |
msgstr ""
|
829 |
|
830 |
-
#: lib/event_updates.php:
|
831 |
#, php-format
|
832 |
msgid "Theme: %s"
|
833 |
msgstr ""
|
834 |
|
835 |
-
#: lib/event_updates.php:
|
836 |
msgid "Don't leave your blog at risk, make sure to update as soon as possible."
|
837 |
msgstr ""
|
838 |
|
839 |
-
#: lib/event_updates.php:
|
840 |
msgid "Cannot download security rules: connection error"
|
841 |
msgstr ""
|
842 |
|
843 |
-
#: lib/event_updates.php:
|
844 |
#, php-format
|
845 |
msgid "Cannot download security rules: HTTP response error %s"
|
846 |
msgstr ""
|
@@ -891,7 +891,7 @@ msgstr ""
|
|
891 |
msgid "[NinjaFirewall] Alert: %s"
|
892 |
msgstr ""
|
893 |
|
894 |
-
#: lib/events.php:199 lib/events.php:201 lib/utils.php:
|
895 |
msgid "-Blog:"
|
896 |
msgstr ""
|
897 |
|
@@ -899,19 +899,19 @@ msgstr ""
|
|
899 |
msgid "NinjaFirewall has detected the following activity on your account:"
|
900 |
msgstr ""
|
901 |
|
902 |
-
#: lib/events.php:206 lib/utils.php:
|
903 |
msgid "-User:"
|
904 |
msgstr ""
|
905 |
|
906 |
-
#: lib/events.php:207 lib/utils.php:
|
907 |
msgid "-IP:"
|
908 |
msgstr ""
|
909 |
|
910 |
-
#: lib/events.php:208 lib/utils.php:
|
911 |
msgid "-Date:"
|
912 |
msgstr ""
|
913 |
|
914 |
-
#: lib/firewall_options.php:29 ninjafirewall.php:
|
915 |
msgid "Firewall Options"
|
916 |
msgstr ""
|
917 |
|
@@ -1062,16 +1062,16 @@ msgstr ""
|
|
1062 |
msgid "The imported file is not compatible with that version of NinjaFirewall"
|
1063 |
msgstr ""
|
1064 |
|
1065 |
-
#: lib/firewall_options.php:473 ninjafirewall.php:
|
1066 |
msgid "[NinjaFirewall] Alert: Firewall is disabled"
|
1067 |
msgstr ""
|
1068 |
|
1069 |
#: lib/firewall_options.php:475 lib/firewall_options.php:477
|
1070 |
-
#: ninjafirewall.php:
|
1071 |
msgid "-Blog :"
|
1072 |
msgstr ""
|
1073 |
|
1074 |
-
#: lib/firewall_options.php:481 ninjafirewall.php:
|
1075 |
msgid "Someone disabled NinjaFirewall from your WordPress admin dashboard:"
|
1076 |
msgstr ""
|
1077 |
|
@@ -1090,15 +1090,15 @@ msgid ""
|
|
1090 |
"Someone imported a new configuration which overrode the firewall settings:"
|
1091 |
msgstr ""
|
1092 |
|
1093 |
-
#: lib/firewall_options.php:494 ninjafirewall.php:
|
1094 |
msgid "-User :"
|
1095 |
msgstr ""
|
1096 |
|
1097 |
-
#: lib/firewall_options.php:495 ninjafirewall.php:
|
1098 |
msgid "-IP :"
|
1099 |
msgstr ""
|
1100 |
|
1101 |
-
#: lib/firewall_options.php:496 ninjafirewall.php:
|
1102 |
msgid "-Date :"
|
1103 |
msgstr ""
|
1104 |
|
@@ -1109,7 +1109,7 @@ msgid ""
|
|
1109 |
"enable NinjaFirewall's Full WAF mode."
|
1110 |
msgstr ""
|
1111 |
|
1112 |
-
#: lib/firewall_policies.php:62 ninjafirewall.php:
|
1113 |
msgid "Firewall Policies"
|
1114 |
msgstr ""
|
1115 |
|
@@ -2489,7 +2489,7 @@ msgid ""
|
|
2489 |
"package (third-party software, shell script, backdoor etc)."
|
2490 |
msgstr ""
|
2491 |
|
2492 |
-
#: lib/help.php:360 lib/network.php:32 ninjafirewall.php:
|
2493 |
msgid "Network"
|
2494 |
msgstr ""
|
2495 |
|
@@ -2525,7 +2525,7 @@ msgid ""
|
|
2525 |
"theme in order to take full control of your website."
|
2526 |
msgstr ""
|
2527 |
|
2528 |
-
#: lib/help.php:389 lib/login_protection.php:21 ninjafirewall.php:
|
2529 |
msgid "Login Protection"
|
2530 |
msgstr ""
|
2531 |
|
@@ -4482,7 +4482,7 @@ msgid ""
|
|
4482 |
"Error: Your .htaccess file is not writable, please change its permissions: %s"
|
4483 |
msgstr ""
|
4484 |
|
4485 |
-
#: lib/install.php:110 ninjafirewall.php:
|
4486 |
#, php-format
|
4487 |
msgid "Error: wrong parameter value (%s)."
|
4488 |
msgstr ""
|
@@ -4724,7 +4724,7 @@ msgstr ""
|
|
4724 |
msgid "Error: unable to write to the %s configuration file"
|
4725 |
msgstr ""
|
4726 |
|
4727 |
-
#: lib/logs.php:36 ninjafirewall.php:
|
4728 |
msgid "Logs"
|
4729 |
msgstr ""
|
4730 |
|
@@ -4846,7 +4846,7 @@ msgid ""
|
|
4846 |
"Administrator to the whitelist\" option is enabled."
|
4847 |
msgstr ""
|
4848 |
|
4849 |
-
#: lib/logs_live_log.php:96 ninjafirewall.php:
|
4850 |
msgid ""
|
4851 |
"Live Log lets you watch your blog traffic in real time. To enable it, click "
|
4852 |
"on the button below."
|
@@ -4892,7 +4892,7 @@ msgstr ""
|
|
4892 |
msgid "Inclusion and exclusion filters (REQUEST_URI)"
|
4893 |
msgstr ""
|
4894 |
|
4895 |
-
#: lib/logs_live_log.php:158 lib/monitoring_file_check.php:
|
4896 |
msgid "None"
|
4897 |
msgstr ""
|
4898 |
|
@@ -4904,7 +4904,7 @@ msgstr ""
|
|
4904 |
msgid "Must not include"
|
4905 |
msgstr ""
|
4906 |
|
4907 |
-
#: lib/logs_live_log.php:162 lib/monitoring_file_check.php:
|
4908 |
#: lib/monitoring_file_guard.php:89
|
4909 |
msgid "e.g.,"
|
4910 |
msgstr ""
|
@@ -4947,7 +4947,7 @@ msgstr ""
|
|
4947 |
msgid "Error: please enter the custom log format."
|
4948 |
msgstr ""
|
4949 |
|
4950 |
-
#: lib/monitoring.php:43 ninjafirewall.php:
|
4951 |
msgid "Monitoring"
|
4952 |
msgstr ""
|
4953 |
|
@@ -4959,325 +4959,325 @@ msgid ""
|
|
4959 |
"leakage issues on your website."
|
4960 |
msgstr ""
|
4961 |
|
4962 |
-
#: lib/monitoring_file_check.php:
|
4963 |
msgid "Snapshot successfully created."
|
4964 |
msgstr ""
|
4965 |
|
4966 |
-
#: lib/monitoring_file_check.php:
|
4967 |
msgid "Snapshot file successfully deleted."
|
4968 |
msgstr ""
|
4969 |
|
4970 |
-
#: lib/monitoring_file_check.php:
|
4971 |
msgid "You must create a snapshot first."
|
4972 |
msgstr ""
|
4973 |
|
4974 |
-
#: lib/monitoring_file_check.php:
|
4975 |
msgid "NinjaFirewall detected that changes were made to your files."
|
4976 |
msgstr ""
|
4977 |
|
4978 |
-
#: lib/monitoring_file_check.php:
|
4979 |
msgid "No changes detected."
|
4980 |
msgstr ""
|
4981 |
|
4982 |
-
#: lib/monitoring_file_check.php:
|
4983 |
msgid ""
|
4984 |
"File Check lets you perform file integrity monitoring upon request or on a "
|
4985 |
"specific interval. To start, create a snapshot of your files by clicking the "
|
4986 |
"button below."
|
4987 |
msgstr ""
|
4988 |
|
4989 |
-
#: lib/monitoring_file_check.php:
|
4990 |
msgid "Create a snapshot of all files stored in that directory"
|
4991 |
msgstr ""
|
4992 |
|
4993 |
-
#: lib/monitoring_file_check.php:
|
4994 |
#, php-format
|
4995 |
msgid "Default: %s"
|
4996 |
msgstr ""
|
4997 |
|
4998 |
-
#: lib/monitoring_file_check.php:
|
4999 |
msgid "Exclude the following files/folders (optional)"
|
5000 |
msgstr ""
|
5001 |
|
5002 |
-
#: lib/monitoring_file_check.php:
|
5003 |
msgid ""
|
5004 |
"Full or partial case-sensitive string(s). Multiple values must be comma-"
|
5005 |
"separated"
|
5006 |
msgstr ""
|
5007 |
|
5008 |
-
#: lib/monitoring_file_check.php:
|
5009 |
msgid "Do not follow symbolic links (default)"
|
5010 |
msgstr ""
|
5011 |
|
5012 |
-
#: lib/monitoring_file_check.php:
|
5013 |
msgid "Create Snapshot"
|
5014 |
msgstr ""
|
5015 |
|
5016 |
-
#: lib/monitoring_file_check.php:
|
5017 |
msgid "Last snapshot"
|
5018 |
msgstr ""
|
5019 |
|
5020 |
-
#: lib/monitoring_file_check.php:
|
5021 |
#, php-format
|
5022 |
msgid "Created on: %s"
|
5023 |
msgstr ""
|
5024 |
|
5025 |
-
#: lib/monitoring_file_check.php:
|
5026 |
#, php-format
|
5027 |
msgid "Total files: %s "
|
5028 |
msgstr ""
|
5029 |
|
5030 |
-
#: lib/monitoring_file_check.php:
|
5031 |
msgid "Directory:"
|
5032 |
msgstr ""
|
5033 |
|
5034 |
-
#: lib/monitoring_file_check.php:
|
5035 |
msgid "Exclusion:"
|
5036 |
msgstr ""
|
5037 |
|
5038 |
-
#: lib/monitoring_file_check.php:
|
5039 |
msgid "Symlinks:"
|
5040 |
msgstr ""
|
5041 |
|
5042 |
-
#: lib/monitoring_file_check.php:
|
5043 |
msgid "follow"
|
5044 |
msgstr ""
|
5045 |
|
5046 |
-
#: lib/monitoring_file_check.php:
|
5047 |
msgid "do not follow"
|
5048 |
msgstr ""
|
5049 |
|
5050 |
-
#: lib/monitoring_file_check.php:
|
5051 |
#, php-format
|
5052 |
msgid "Processing time: %s seconds"
|
5053 |
msgstr ""
|
5054 |
|
5055 |
-
#: lib/monitoring_file_check.php:
|
5056 |
msgid "Download Snapshot"
|
5057 |
msgstr ""
|
5058 |
|
5059 |
-
#: lib/monitoring_file_check.php:
|
5060 |
msgid "Delete Snapshot"
|
5061 |
msgstr ""
|
5062 |
|
5063 |
-
#: lib/monitoring_file_check.php:
|
5064 |
msgid "Last changes"
|
5065 |
msgstr ""
|
5066 |
|
5067 |
-
#: lib/monitoring_file_check.php:
|
5068 |
#, php-format
|
5069 |
msgid "New files: %s"
|
5070 |
msgstr ""
|
5071 |
|
5072 |
-
#: lib/monitoring_file_check.php:
|
5073 |
#, php-format
|
5074 |
msgid "Deleted files: %s"
|
5075 |
msgstr ""
|
5076 |
|
5077 |
-
#: lib/monitoring_file_check.php:
|
5078 |
#, php-format
|
5079 |
msgid "Modified files: %s"
|
5080 |
msgstr ""
|
5081 |
|
5082 |
-
#: lib/monitoring_file_check.php:
|
5083 |
msgid "View Changes"
|
5084 |
msgstr ""
|
5085 |
|
5086 |
-
#: lib/monitoring_file_check.php:
|
5087 |
msgid "Download Changes"
|
5088 |
msgstr ""
|
5089 |
|
5090 |
-
#: lib/monitoring_file_check.php:
|
5091 |
msgid "Click a file to get more info about it."
|
5092 |
msgstr ""
|
5093 |
|
5094 |
-
#: lib/monitoring_file_check.php:
|
5095 |
msgid "New files:"
|
5096 |
msgstr ""
|
5097 |
|
5098 |
-
#: lib/monitoring_file_check.php:
|
5099 |
msgid "Size"
|
5100 |
msgstr ""
|
5101 |
|
5102 |
-
#: lib/monitoring_file_check.php:
|
5103 |
msgid "Access"
|
5104 |
msgstr ""
|
5105 |
|
5106 |
-
#: lib/monitoring_file_check.php:
|
5107 |
msgid "Uid / Gid"
|
5108 |
msgstr ""
|
5109 |
|
5110 |
-
#: lib/monitoring_file_check.php:
|
5111 |
msgid "Modify"
|
5112 |
msgstr ""
|
5113 |
|
5114 |
-
#: lib/monitoring_file_check.php:
|
5115 |
msgid "Change"
|
5116 |
msgstr ""
|
5117 |
|
5118 |
-
#: lib/monitoring_file_check.php:
|
5119 |
msgid "Deleted files:"
|
5120 |
msgstr ""
|
5121 |
|
5122 |
-
#: lib/monitoring_file_check.php:
|
5123 |
msgid "Modified files:"
|
5124 |
msgstr ""
|
5125 |
|
5126 |
-
#: lib/monitoring_file_check.php:
|
5127 |
msgid "Old"
|
5128 |
msgstr ""
|
5129 |
|
5130 |
-
#: lib/monitoring_file_check.php:
|
5131 |
msgid "New"
|
5132 |
msgstr ""
|
5133 |
|
5134 |
-
#: lib/monitoring_file_check.php:
|
5135 |
msgid "Scan System For File Changes"
|
5136 |
msgstr ""
|
5137 |
|
5138 |
-
#: lib/monitoring_file_check.php:
|
5139 |
msgid "Options"
|
5140 |
msgstr ""
|
5141 |
|
5142 |
-
#: lib/monitoring_file_check.php:
|
5143 |
#, php-format
|
5144 |
msgid ""
|
5145 |
"It seems that %s is set. Ensure you have another way to run WP-Cron, "
|
5146 |
"otherwise NinjaFirewall scheduled scans will not work."
|
5147 |
msgstr ""
|
5148 |
|
5149 |
-
#: lib/monitoring_file_check.php:
|
5150 |
msgid "Enable scheduled scans"
|
5151 |
msgstr ""
|
5152 |
|
5153 |
-
#: lib/monitoring_file_check.php:
|
5154 |
msgid "No (default)"
|
5155 |
msgstr ""
|
5156 |
|
5157 |
-
#: lib/monitoring_file_check.php:
|
5158 |
msgid "Hourly"
|
5159 |
msgstr ""
|
5160 |
|
5161 |
-
#: lib/monitoring_file_check.php:
|
5162 |
msgid "Twicedaily"
|
5163 |
msgstr ""
|
5164 |
|
5165 |
-
#: lib/monitoring_file_check.php:
|
5166 |
msgid "Daily"
|
5167 |
msgstr ""
|
5168 |
|
5169 |
-
#: lib/monitoring_file_check.php:
|
5170 |
#, php-format
|
5171 |
msgid ""
|
5172 |
"Next scan will start in approximately %s day(s), %s hour(s), %s minute(s) "
|
5173 |
"and %s second(s)."
|
5174 |
msgstr ""
|
5175 |
|
5176 |
-
#: lib/monitoring_file_check.php:
|
5177 |
msgid ""
|
5178 |
"The next scheduled scan date is in the past! WordPress wp-cron may not be "
|
5179 |
"working or may have been disabled."
|
5180 |
msgstr ""
|
5181 |
|
5182 |
-
#: lib/monitoring_file_check.php:
|
5183 |
msgid "Scheduled scan report"
|
5184 |
msgstr ""
|
5185 |
|
5186 |
-
#: lib/monitoring_file_check.php:
|
5187 |
msgid "Send me a report by email only if changes are detected (default)"
|
5188 |
msgstr ""
|
5189 |
|
5190 |
-
#: lib/monitoring_file_check.php:
|
5191 |
msgid "Always send me a report by email after a scheduled scan"
|
5192 |
msgstr ""
|
5193 |
|
5194 |
-
#: lib/monitoring_file_check.php:
|
5195 |
msgid "Save Scan Options"
|
5196 |
msgstr ""
|
5197 |
|
5198 |
-
#: lib/monitoring_file_check.php:
|
5199 |
msgid "Enter the full path to the directory to be scanned."
|
5200 |
msgstr ""
|
5201 |
|
5202 |
-
#: lib/monitoring_file_check.php:
|
5203 |
#, php-format
|
5204 |
msgid "The directory %s is not correct."
|
5205 |
msgstr ""
|
5206 |
|
5207 |
-
#: lib/monitoring_file_check.php:
|
5208 |
#, php-format
|
5209 |
msgid "The directory %s does not exist."
|
5210 |
msgstr ""
|
5211 |
|
5212 |
-
#: lib/monitoring_file_check.php:
|
5213 |
#, php-format
|
5214 |
msgid "The directory %s is not readable."
|
5215 |
msgstr ""
|
5216 |
|
5217 |
-
#: lib/monitoring_file_check.php:
|
5218 |
#, php-format
|
5219 |
msgid "Cannot write to %s."
|
5220 |
msgstr ""
|
5221 |
|
5222 |
-
#: lib/monitoring_file_check.php:
|
5223 |
#, php-format
|
5224 |
msgid "Error : cannot open %s directory."
|
5225 |
msgstr ""
|
5226 |
|
5227 |
-
#: lib/monitoring_file_check.php:
|
5228 |
#, php-format
|
5229 |
msgid "Error : %s directory is not readable."
|
5230 |
msgstr ""
|
5231 |
|
5232 |
-
#: lib/monitoring_file_check.php:
|
5233 |
#, php-format
|
5234 |
msgid "Missing options line %s, please try again."
|
5235 |
msgstr ""
|
5236 |
|
5237 |
-
#: lib/monitoring_file_check.php:
|
5238 |
#, php-format
|
5239 |
msgid "Cannot create %s."
|
5240 |
msgstr ""
|
5241 |
|
5242 |
-
#: lib/monitoring_file_check.php:
|
5243 |
msgid "Error reading old snapshot file."
|
5244 |
msgstr ""
|
5245 |
|
5246 |
-
#: lib/monitoring_file_check.php:
|
5247 |
msgid "Error reading new snapshot file."
|
5248 |
msgstr ""
|
5249 |
|
5250 |
-
#: lib/monitoring_file_check.php:
|
5251 |
msgid "New file"
|
5252 |
msgstr ""
|
5253 |
|
5254 |
-
#: lib/monitoring_file_check.php:
|
5255 |
msgid "Modified file"
|
5256 |
msgstr ""
|
5257 |
|
5258 |
-
#: lib/monitoring_file_check.php:
|
5259 |
msgid "Deleted file"
|
5260 |
msgstr ""
|
5261 |
|
5262 |
-
#: lib/monitoring_file_check.php:
|
5263 |
msgid "[NinjaFirewall] Alert: File Check detection"
|
5264 |
msgstr ""
|
5265 |
|
5266 |
-
#: lib/monitoring_file_check.php:
|
5267 |
#: lib/security_rules_update.php:564
|
5268 |
#, php-format
|
5269 |
msgid "Date: %s"
|
5270 |
msgstr ""
|
5271 |
|
5272 |
-
#: lib/monitoring_file_check.php:
|
5273 |
msgid "See attached file for details."
|
5274 |
msgstr ""
|
5275 |
|
5276 |
-
#: lib/monitoring_file_check.php:
|
5277 |
msgid "[NinjaFirewall] File Check report"
|
5278 |
msgstr ""
|
5279 |
|
5280 |
-
#: lib/monitoring_file_check.php:
|
5281 |
msgid "NinjaFirewall did not detect changes in your files."
|
5282 |
msgstr ""
|
5283 |
|
@@ -5323,7 +5323,7 @@ msgstr ""
|
|
5323 |
msgid "Save File Guard options"
|
5324 |
msgstr ""
|
5325 |
|
5326 |
-
#: lib/network.php:24 ninjafirewall.php:
|
5327 |
#, php-format
|
5328 |
msgid "You are not allowed to perform this task (%s)."
|
5329 |
msgstr ""
|
@@ -5353,7 +5353,7 @@ msgid "Scheduled task has stopped, restarting it (%s)"
|
|
5353 |
msgstr ""
|
5354 |
|
5355 |
#: lib/security_rules.php:44 lib/security_rules_update.php:565
|
5356 |
-
#: ninjafirewall.php:
|
5357 |
msgid "Security Rules"
|
5358 |
msgstr ""
|
5359 |
|
@@ -5776,7 +5776,7 @@ msgstr ""
|
|
5776 |
msgid "Cancel and Close"
|
5777 |
msgstr ""
|
5778 |
|
5779 |
-
#: lib/utils.php:188 lib/utils.php:196 lib/utils.php:
|
5780 |
msgid "N/A"
|
5781 |
msgstr ""
|
5782 |
|
@@ -5790,7 +5790,7 @@ msgstr ""
|
|
5790 |
msgid "Attempt to edit a published %s (ID: %s)"
|
5791 |
msgstr ""
|
5792 |
|
5793 |
-
#: lib/utils.php:212 lib/utils.php:
|
5794 |
msgid "Unauthenticated user"
|
5795 |
msgstr ""
|
5796 |
|
@@ -5804,7 +5804,7 @@ msgid ""
|
|
5804 |
"doesn't have the right capabilities:"
|
5805 |
msgstr ""
|
5806 |
|
5807 |
-
#: lib/utils.php:226 lib/utils.php:
|
5808 |
msgid "Username:"
|
5809 |
msgstr ""
|
5810 |
|
@@ -5812,152 +5812,147 @@ msgstr ""
|
|
5812 |
msgid "Action:"
|
5813 |
msgstr ""
|
5814 |
|
5815 |
-
#: lib/utils.php:
|
5816 |
-
#: lib/utils.php:1518
|
5817 |
-
msgid "A PHP backtrace has been attached to this message for your convenience."
|
5818 |
-
msgstr ""
|
5819 |
-
|
5820 |
-
#: lib/utils.php:244 lib/utils.php:323 lib/utils.php:1273 lib/utils.php:1528
|
5821 |
msgid ""
|
5822 |
"This protection (and notification) can be turned off from NinjaFirewall "
|
5823 |
"\"Firewall Policies\" page."
|
5824 |
msgstr ""
|
5825 |
|
5826 |
-
#: lib/utils.php:
|
5827 |
-
#: lib/utils.php:
|
5828 |
msgid "You are not allowed to perform this task."
|
5829 |
msgstr ""
|
5830 |
|
5831 |
-
#: lib/utils.php:
|
5832 |
msgid "Blocked post/page deletion attempt"
|
5833 |
msgstr ""
|
5834 |
|
5835 |
-
#: lib/utils.php:
|
5836 |
msgid ""
|
5837 |
"NinjaFirewall has blocked an attempt to delete a post by a user who doesn't "
|
5838 |
"have the right capabilities:"
|
5839 |
msgstr ""
|
5840 |
|
5841 |
-
#: lib/utils.php:
|
5842 |
msgid "Blocked user account creation"
|
5843 |
msgstr ""
|
5844 |
|
5845 |
-
#: lib/utils.php:
|
5846 |
msgid "NinjaFirewall has blocked an attempt to create a user account:"
|
5847 |
msgstr ""
|
5848 |
|
5849 |
-
#: lib/utils.php:
|
5850 |
#, php-format
|
5851 |
msgid "Backup file is corrupted, deleting it (%s)"
|
5852 |
msgstr ""
|
5853 |
|
5854 |
-
#: lib/utils.php:
|
5855 |
#, php-format
|
5856 |
msgid ""
|
5857 |
"NinjaFirewall's options are corrupted, restoring them from last known good "
|
5858 |
"backup file (%s)"
|
5859 |
msgstr ""
|
5860 |
|
5861 |
-
#: lib/utils.php:
|
5862 |
msgid ""
|
5863 |
"NinjaFirewall's options are corrupted, restoring their default values (no "
|
5864 |
"valid backup found)"
|
5865 |
msgstr ""
|
5866 |
|
5867 |
-
#: lib/utils.php:
|
5868 |
msgid ""
|
5869 |
"Warning: Because NinjaFirewall's Login Protection is enabled, Site Health "
|
5870 |
"may return an error message regarding the loopback test (e.g., 404 or 401 "
|
5871 |
"HTTP status code). You can safely ignore it."
|
5872 |
msgstr ""
|
5873 |
|
5874 |
-
#: lib/utils.php:
|
5875 |
msgid "NinjaFirewall error"
|
5876 |
msgstr ""
|
5877 |
|
5878 |
-
#: lib/utils.php:
|
5879 |
#, php-format
|
5880 |
msgid ""
|
5881 |
"%s directory cannot be created. Please review your installation and ensure "
|
5882 |
"that %s is writable."
|
5883 |
msgstr ""
|
5884 |
|
5885 |
-
#: lib/utils.php:
|
5886 |
#, php-format
|
5887 |
msgid ""
|
5888 |
"%s directory is read-only. Please review your installation and ensure that "
|
5889 |
"%s is writable."
|
5890 |
msgstr ""
|
5891 |
|
5892 |
-
#: lib/utils.php:
|
5893 |
msgid "unknown error"
|
5894 |
msgstr ""
|
5895 |
|
5896 |
-
#: lib/utils.php:
|
5897 |
msgid "NinjaFirewall fatal error:"
|
5898 |
msgstr ""
|
5899 |
|
5900 |
-
#: lib/utils.php:
|
5901 |
msgid "Review your installation, your site is not protected."
|
5902 |
msgstr ""
|
5903 |
|
5904 |
-
#: lib/utils.php:
|
5905 |
msgid "Alert: WordPress console login"
|
5906 |
msgstr ""
|
5907 |
|
5908 |
-
#: lib/utils.php:
|
5909 |
msgid "Someone just logged in to your WordPress admin console:"
|
5910 |
msgstr ""
|
5911 |
|
5912 |
-
#: lib/utils.php:
|
5913 |
msgid "Forbidden access"
|
5914 |
msgstr ""
|
5915 |
|
5916 |
-
#: lib/utils.php:
|
5917 |
#, php-format
|
5918 |
msgid ""
|
5919 |
"<strong>ERROR</strong>: Invalid username, email address or password.<br /><a "
|
5920 |
"href=\"%s\">Lost your password</a>?"
|
5921 |
msgstr ""
|
5922 |
|
5923 |
-
#: lib/utils.php:
|
5924 |
msgid "[NinjaFirewall] Alert: Database changes detected"
|
5925 |
msgstr ""
|
5926 |
|
5927 |
-
#: lib/utils.php:
|
5928 |
msgid ""
|
5929 |
"NinjaFirewall has detected that one or more administrator accounts were "
|
5930 |
"modified in the database:"
|
5931 |
msgstr ""
|
5932 |
|
5933 |
-
#: lib/utils.php:
|
5934 |
#, php-format
|
5935 |
msgid "Total administrators : %s"
|
5936 |
msgstr ""
|
5937 |
|
5938 |
-
#: lib/utils.php:
|
5939 |
msgid ""
|
5940 |
"If you cannot see any modifications in the above fields, it is possible that "
|
5941 |
"the administrator password was changed."
|
5942 |
msgstr ""
|
5943 |
|
5944 |
-
#: lib/utils.php:
|
5945 |
msgid "Blocked privilege escalation attempt"
|
5946 |
msgstr ""
|
5947 |
|
5948 |
-
#: lib/utils.php:
|
5949 |
msgid ""
|
5950 |
"NinjaFirewall has blocked an attempt to modify a user capability by someone "
|
5951 |
"who does not have administrative privileges:"
|
5952 |
msgstr ""
|
5953 |
|
5954 |
-
#: lib/utils.php:
|
5955 |
msgid ""
|
5956 |
"NinjaFirewall brute-force protection is enabled and you are temporarily "
|
5957 |
"whitelisted."
|
5958 |
msgstr ""
|
5959 |
|
5960 |
-
#: lib/utils.php:
|
5961 |
#, php-format
|
5962 |
msgid ""
|
5963 |
"Hey, it seems that you've been using NinjaFirewall for some time. If you "
|
@@ -5966,91 +5961,95 @@ msgid ""
|
|
5966 |
"rate it. Thank you!"
|
5967 |
msgstr ""
|
5968 |
|
5969 |
-
#: lib/utils.php:
|
5970 |
msgid ""
|
5971 |
"The attempt was blocked and the option was reversed to its original value."
|
5972 |
msgstr ""
|
5973 |
|
5974 |
-
#: lib/utils.php:
|
5975 |
msgid "Attempt to modify WordPress settings"
|
5976 |
msgstr ""
|
5977 |
|
5978 |
-
#: lib/utils.php:
|
5979 |
msgid ""
|
5980 |
"NinjaFirewall has blocked an attempt to modify some important WordPress "
|
5981 |
"settings by a user that does not have administrative privileges:"
|
5982 |
msgstr ""
|
5983 |
|
5984 |
-
#: lib/utils.php:
|
5985 |
#, php-format
|
5986 |
msgid "Option: %s"
|
5987 |
msgstr ""
|
5988 |
|
5989 |
-
#: lib/utils.php:
|
5990 |
#, php-format
|
5991 |
msgid "Original value: %s"
|
5992 |
msgstr ""
|
5993 |
|
5994 |
-
#: lib/utils.php:
|
5995 |
#, php-format
|
5996 |
msgid "Modified value: %s"
|
5997 |
msgstr ""
|
5998 |
|
5999 |
-
#: lib/utils.php:
|
6000 |
#, php-format
|
6001 |
msgid "Action taken: %s"
|
6002 |
msgstr ""
|
6003 |
|
6004 |
-
#: lib/utils.php:
|
6005 |
msgid "Code injection attempt in WordPress options table"
|
6006 |
msgstr ""
|
6007 |
|
6008 |
-
#: lib/utils.php:
|
6009 |
msgid ""
|
6010 |
"NinjaFirewall has blocked an attempt to inject code in the WordPress options "
|
6011 |
"table by a user that does not have administrative privileges:"
|
6012 |
msgstr ""
|
6013 |
|
6014 |
-
#: lib/utils.php:
|
6015 |
#, php-format
|
6016 |
msgid "Code: %s"
|
6017 |
msgstr ""
|
6018 |
|
6019 |
-
#: lib/utils.php:
|
6020 |
msgid "Important: NinjaFirewall has detected that this is a security update."
|
6021 |
msgstr ""
|
6022 |
|
6023 |
-
#: lib/utils.php:
|
6024 |
msgid "More info about this warning."
|
6025 |
msgstr ""
|
6026 |
|
6027 |
-
#: lib/utils.php:
|
6028 |
#, php-format
|
6029 |
msgid "Cannot send notification, no valid email found (%s)"
|
6030 |
msgstr ""
|
6031 |
|
6032 |
-
#: lib/utils.php:
|
6033 |
#, php-format
|
6034 |
msgid ""
|
6035 |
"If you don't have access to that site any longer, you can remove your email "
|
6036 |
"by clicking the following link (valid for 12 hours): %s"
|
6037 |
msgstr ""
|
6038 |
|
6039 |
-
#: lib/utils.php:
|
|
|
|
|
|
|
|
|
6040 |
#, php-format
|
6041 |
msgid "Error, cannot create the %s folder."
|
6042 |
msgstr ""
|
6043 |
|
6044 |
-
#: lib/utils.php:
|
6045 |
msgid "Check your server permissions and try again."
|
6046 |
msgstr ""
|
6047 |
|
6048 |
-
#: lib/utils.php:
|
6049 |
#, php-format
|
6050 |
msgid "Error, the %s folder is not writable."
|
6051 |
msgstr ""
|
6052 |
|
6053 |
-
#: lib/utils.php:
|
6054 |
#, php-format
|
6055 |
msgid "Error, cannot write %s."
|
6056 |
msgstr ""
|
@@ -6445,226 +6444,232 @@ msgstr ""
|
|
6445 |
msgid "Cannot retrieve user rules from database (#4)"
|
6446 |
msgstr ""
|
6447 |
|
6448 |
-
#: ninjafirewall.php:
|
|
|
|
|
|
|
|
|
|
|
|
|
6449 |
msgid ""
|
6450 |
"You do not have \"unfiltered_html\" capability. Please enable it in order to "
|
6451 |
"run NinjaFirewall (or make sure you do not have \"DISALLOW_UNFILTERED_HTML\" "
|
6452 |
"in your wp-config.php script)."
|
6453 |
msgstr ""
|
6454 |
|
6455 |
-
#: ninjafirewall.php:
|
6456 |
#, php-format
|
6457 |
msgid ""
|
6458 |
"NinjaFirewall requires WordPress %s or greater but your current version is "
|
6459 |
"%s."
|
6460 |
msgstr ""
|
6461 |
|
6462 |
-
#: ninjafirewall.php:
|
6463 |
#, php-format
|
6464 |
msgid ""
|
6465 |
"NinjaFirewall requires PHP 5.3 or greater but your current version is %s."
|
6466 |
msgstr ""
|
6467 |
|
6468 |
-
#: ninjafirewall.php:
|
6469 |
#, php-format
|
6470 |
msgid "NinjaFirewall requires the PHP %s extension."
|
6471 |
msgstr ""
|
6472 |
|
6473 |
-
#: ninjafirewall.php:
|
6474 |
msgid ""
|
6475 |
"You have SAFE_MODE enabled. Please disable it, it is deprecated as of PHP "
|
6476 |
"5.3.0 (see http://php.net/safe-mode)."
|
6477 |
msgstr ""
|
6478 |
|
6479 |
-
#: ninjafirewall.php:
|
6480 |
msgid "You are not allowed to activate NinjaFirewall."
|
6481 |
msgstr ""
|
6482 |
|
6483 |
-
#: ninjafirewall.php:
|
6484 |
msgid "NinjaFirewall is not compatible with Microsoft Windows."
|
6485 |
msgstr ""
|
6486 |
|
6487 |
-
#: ninjafirewall.php:
|
6488 |
msgid ""
|
6489 |
"All fields will be restored to their default values and any changes you made "
|
6490 |
"will be lost. Continue?"
|
6491 |
msgstr ""
|
6492 |
|
6493 |
-
#: ninjafirewall.php:
|
6494 |
msgid "Missing security nonce, try to reload the page."
|
6495 |
msgstr ""
|
6496 |
|
6497 |
-
#: ninjafirewall.php:
|
6498 |
msgid "Please select the HTTP server in the list."
|
6499 |
msgstr ""
|
6500 |
|
6501 |
-
#: ninjafirewall.php:
|
6502 |
msgid "Delete the firewall's error log ?"
|
6503 |
msgstr ""
|
6504 |
|
6505 |
-
#: ninjafirewall.php:
|
6506 |
msgid ""
|
6507 |
"This action will restore the selected configuration file and will override "
|
6508 |
"all your current firewall options, policies and rules. Continue?"
|
6509 |
msgstr ""
|
6510 |
|
6511 |
-
#: ninjafirewall.php:
|
6512 |
msgid ""
|
6513 |
"Any character that is not a letter [a-zA-Z], a digit [0-9], a dot [.], a "
|
6514 |
"hyphen [-] or an underscore [_] will be removed from the filename and "
|
6515 |
"replaced with the substitution character. Continue?"
|
6516 |
msgstr ""
|
6517 |
|
6518 |
-
#: ninjafirewall.php:
|
6519 |
msgid ""
|
6520 |
"Ensure that you can access your admin console over HTTPS before enabling "
|
6521 |
"this option, otherwise you will lock yourself out of your site. Continue?"
|
6522 |
msgstr ""
|
6523 |
|
6524 |
-
#: ninjafirewall.php:
|
6525 |
msgid ""
|
6526 |
"WooCommerce is running: if you block accounts creation, your customers won't "
|
6527 |
"be able to sign up. Continue?"
|
6528 |
msgstr ""
|
6529 |
|
6530 |
-
#: ninjafirewall.php:
|
6531 |
msgid ""
|
6532 |
"Your blog has user registration enabled: if you block accounts creation, "
|
6533 |
"your customers won't be able to sign up. Continue?"
|
6534 |
msgstr ""
|
6535 |
|
6536 |
-
#: ninjafirewall.php:
|
6537 |
msgid ""
|
6538 |
"Your multisite installation allows users to register new sites: if you "
|
6539 |
"enable this option, they will likely get blocked when creating their blog. "
|
6540 |
"Continue?"
|
6541 |
msgstr ""
|
6542 |
|
6543 |
-
#: ninjafirewall.php:
|
6544 |
msgid "Delete the current snapshot ?"
|
6545 |
msgstr ""
|
6546 |
|
6547 |
-
#: ninjafirewall.php:
|
6548 |
msgid "Invalid character."
|
6549 |
msgstr ""
|
6550 |
|
6551 |
-
#: ninjafirewall.php:
|
6552 |
msgid "\"admin\" is not acceptable, please choose another user name."
|
6553 |
msgstr ""
|
6554 |
|
6555 |
-
#: ninjafirewall.php:
|
6556 |
msgid "Please enter max 1024 character only."
|
6557 |
msgstr ""
|
6558 |
|
6559 |
-
#: ninjafirewall.php:
|
6560 |
msgid "Select when to enable the login protection."
|
6561 |
msgstr ""
|
6562 |
|
6563 |
-
#: ninjafirewall.php:
|
6564 |
msgid "Enter a name and a password for the HTTP authentication."
|
6565 |
msgstr ""
|
6566 |
|
6567 |
-
#: ninjafirewall.php:
|
6568 |
msgid "Your public key is not valid."
|
6569 |
msgstr ""
|
6570 |
|
6571 |
-
#: ninjafirewall.php:
|
6572 |
msgid "No traffic yet, please wait"
|
6573 |
msgstr ""
|
6574 |
|
6575 |
-
#: ninjafirewall.php:
|
6576 |
msgid "seconds..."
|
6577 |
msgstr ""
|
6578 |
|
6579 |
-
#: ninjafirewall.php:
|
6580 |
msgid "Error: Live Log did not receive the expected response from your server:"
|
6581 |
msgstr ""
|
6582 |
|
6583 |
-
#: ninjafirewall.php:
|
6584 |
msgid "Error: URL does not seem to exist (404 Not Found):"
|
6585 |
msgstr ""
|
6586 |
|
6587 |
-
#: ninjafirewall.php:
|
6588 |
msgid "Error: Cannot find your log file. Try to reload this page."
|
6589 |
msgstr ""
|
6590 |
|
6591 |
-
#: ninjafirewall.php:
|
6592 |
msgid "Error: The HTTP server returned the following error code:"
|
6593 |
msgstr ""
|
6594 |
|
6595 |
-
#: ninjafirewall.php:
|
6596 |
msgid "Error: Security nonces do not match. Reload the page and try again."
|
6597 |
msgstr ""
|
6598 |
|
6599 |
-
#: ninjafirewall.php:
|
6600 |
msgid "Error: NinjaFirewall is disabled"
|
6601 |
msgstr ""
|
6602 |
|
6603 |
-
#: ninjafirewall.php:
|
6604 |
#, php-format
|
6605 |
msgid "Error: missing parameter (%s)."
|
6606 |
msgstr ""
|
6607 |
|
6608 |
-
#: ninjafirewall.php:
|
6609 |
msgid "NinjaFirewall: Dashboard"
|
6610 |
msgstr ""
|
6611 |
|
6612 |
-
#: ninjafirewall.php:
|
6613 |
msgid "NinjaFirewall: Firewall Options"
|
6614 |
msgstr ""
|
6615 |
|
6616 |
-
#: ninjafirewall.php:
|
6617 |
msgid "NinjaFirewall: Firewall Policies"
|
6618 |
msgstr ""
|
6619 |
|
6620 |
-
#: ninjafirewall.php:
|
6621 |
msgid "NinjaFirewall: Monitoring"
|
6622 |
msgstr ""
|
6623 |
|
6624 |
-
#: ninjafirewall.php:
|
6625 |
msgid "NinjaFirewall: Anti-Malware"
|
6626 |
msgstr ""
|
6627 |
|
6628 |
-
#: ninjafirewall.php:
|
6629 |
msgid "NinjaFirewall: Network"
|
6630 |
msgstr ""
|
6631 |
|
6632 |
-
#: ninjafirewall.php:
|
6633 |
msgid "NinjaFirewall: Event Notifications"
|
6634 |
msgstr ""
|
6635 |
|
6636 |
-
#: ninjafirewall.php:
|
6637 |
msgid "NinjaFirewall: Log-in Protection"
|
6638 |
msgstr ""
|
6639 |
|
6640 |
-
#: ninjafirewall.php:
|
6641 |
msgid "NinjaFirewall: Logs"
|
6642 |
msgstr ""
|
6643 |
|
6644 |
-
#: ninjafirewall.php:
|
6645 |
msgid "NinjaFirewall: Security Rules"
|
6646 |
msgstr ""
|
6647 |
|
6648 |
-
#: ninjafirewall.php:
|
6649 |
msgid "NinjaFirewall Settings"
|
6650 |
msgstr ""
|
6651 |
|
6652 |
-
#: ninjafirewall.php:
|
6653 |
msgid "NinjaFirewall is enabled"
|
6654 |
msgstr ""
|
6655 |
|
6656 |
-
#: ninjafirewall.php:
|
6657 |
msgid "Access Restricted"
|
6658 |
msgstr ""
|
6659 |
|
6660 |
-
#: ninjafirewall.php:
|
6661 |
msgid "Settings"
|
6662 |
msgstr ""
|
6663 |
|
6664 |
-
#: ninjafirewall.php:
|
6665 |
msgid "Upgrade to Premium"
|
6666 |
msgstr ""
|
6667 |
|
6668 |
-
#: ninjafirewall.php:
|
6669 |
msgid "Rate it!"
|
6670 |
msgstr ""
|
2 |
msgid ""
|
3 |
msgstr ""
|
4 |
"Project-Id-Version: Stable (latest release)\n"
|
5 |
+
"POT-Creation-Date: 2022-03-16 16:44+0700\n"
|
6 |
"PO-Revision-Date: 2018-04-05 22:52+0700\n"
|
7 |
"Last-Translator: NinTechNet <contact@nintechnet.com>\n"
|
8 |
"Language-Team: \n"
|
19 |
"X-Poedit-SearchPath-0: .\n"
|
20 |
"X-Poedit-SearchPathExcluded-0: /languages\n"
|
21 |
|
22 |
+
#: lib/anti_malware.php:24 ninjafirewall.php:925
|
23 |
msgid "Anti-Malware"
|
24 |
msgstr ""
|
25 |
|
92 |
#: lib/dashboard.php:127 lib/event_notifications.php:42
|
93 |
#: lib/firewall_options.php:42 lib/firewall_policies.php:71
|
94 |
#: lib/login_protection.php:30 lib/logs_firewall_log.php:59
|
95 |
+
#: lib/logs_live_log.php:79 lib/monitoring_file_check.php:112
|
96 |
#: lib/monitoring_file_guard.php:46 lib/network.php:52
|
97 |
#: lib/security_rules_update.php:101
|
98 |
msgid "Your changes have been saved."
|
99 |
msgstr ""
|
100 |
|
101 |
+
#: lib/dashboard.php:132 ninjafirewall.php:903
|
102 |
msgid "Dashboard"
|
103 |
msgstr ""
|
104 |
|
482 |
msgid "Medium"
|
483 |
msgstr ""
|
484 |
|
485 |
+
#: lib/dashboard_statistics.php:196
|
486 |
msgid "Select monthly stats to view..."
|
487 |
msgstr ""
|
488 |
|
503 |
msgid "Your email address was removed from the \"Event Notifications\" option."
|
504 |
msgstr ""
|
505 |
|
506 |
+
#: lib/email_sodium.php:169 lib/monitoring_file_check.php:760
|
507 |
+
#: lib/monitoring_file_check.php:762 lib/monitoring_file_check.php:782
|
508 |
+
#: lib/monitoring_file_check.php:784 lib/security_rules_update.php:559
|
509 |
+
#: lib/security_rules_update.php:561 lib/utils.php:225 lib/utils.php:300
|
510 |
+
#: lib/utils.php:412 lib/utils.php:1067 lib/utils.php:1241 lib/utils.php:1500
|
511 |
msgid "Blog:"
|
512 |
msgstr ""
|
513 |
|
515 |
msgid "Email address:"
|
516 |
msgstr ""
|
517 |
|
518 |
+
#: lib/email_sodium.php:171 lib/utils.php:230 lib/utils.php:304
|
519 |
+
#: lib/utils.php:414 lib/utils.php:1249 lib/utils.php:1501
|
520 |
msgid "User IP:"
|
521 |
msgstr ""
|
522 |
|
523 |
+
#: lib/email_sodium.php:172 lib/event_updates.php:160 lib/utils.php:233
|
524 |
+
#: lib/utils.php:307 lib/utils.php:417 lib/utils.php:1068 lib/utils.php:1252
|
525 |
+
#: lib/utils.php:1504
|
526 |
msgid "Date:"
|
527 |
msgstr ""
|
528 |
|
553 |
msgid "No"
|
554 |
msgstr ""
|
555 |
|
556 |
+
#: lib/event_notifications.php:34 lib/help.php:377 ninjafirewall.php:933
|
557 |
msgid "Event Notifications"
|
558 |
msgstr ""
|
559 |
|
770 |
msgid "Blocked brute-force attacks:"
|
771 |
msgstr ""
|
772 |
|
773 |
+
#: lib/event_notifications.php:504 lib/event_updates.php:222 lib/utils.php:1079
|
774 |
msgid ""
|
775 |
"This notification can be turned off from NinjaFirewall \"Event Notifications"
|
776 |
"\" page."
|
777 |
msgstr ""
|
778 |
|
779 |
+
#: lib/event_updates.php:56
|
780 |
msgid "Downloaded security rules are corrupted"
|
781 |
msgstr ""
|
782 |
|
783 |
+
#: lib/event_updates.php:157
|
784 |
msgid "[NinjaFirewall] Warning: Security update available"
|
785 |
msgstr ""
|
786 |
|
787 |
+
#: lib/event_updates.php:159
|
788 |
msgid ""
|
789 |
"NinjaFirewall has detected that there are security updates available for "
|
790 |
"your website:"
|
791 |
msgstr ""
|
792 |
|
793 |
+
#: lib/event_updates.php:163 lib/event_updates.php:165
|
794 |
#, php-format
|
795 |
msgid "Blog: %s"
|
796 |
msgstr ""
|
797 |
|
798 |
+
#: lib/event_updates.php:171 lib/event_updates.php:187
|
799 |
+
#: lib/event_updates.php:206
|
800 |
#, php-format
|
801 |
msgid "Your version: %s"
|
802 |
msgstr ""
|
803 |
|
804 |
+
#: lib/event_updates.php:172 lib/event_updates.php:188
|
805 |
+
#: lib/event_updates.php:207
|
806 |
#, php-format
|
807 |
msgid "New version: %s"
|
808 |
msgstr ""
|
809 |
|
810 |
+
#: lib/event_updates.php:174 lib/event_updates.php:191
|
811 |
+
#: lib/event_updates.php:210
|
812 |
msgid "Severity: This is an important security update"
|
813 |
msgstr ""
|
814 |
|
815 |
+
#: lib/event_updates.php:176 lib/event_updates.php:193
|
816 |
+
#: lib/event_updates.php:212
|
817 |
msgid "Severity: **This is a critical security update**"
|
818 |
msgstr ""
|
819 |
|
820 |
+
#: lib/event_updates.php:178 lib/event_updates.php:195
|
821 |
+
#: lib/event_updates.php:214
|
822 |
msgid "Type: Security fix"
|
823 |
msgstr ""
|
824 |
|
825 |
+
#: lib/event_updates.php:186
|
826 |
#, php-format
|
827 |
msgid "Plugin: %s"
|
828 |
msgstr ""
|
829 |
|
830 |
+
#: lib/event_updates.php:205
|
831 |
#, php-format
|
832 |
msgid "Theme: %s"
|
833 |
msgstr ""
|
834 |
|
835 |
+
#: lib/event_updates.php:220 lib/utils.php:1586
|
836 |
msgid "Don't leave your blog at risk, make sure to update as soon as possible."
|
837 |
msgstr ""
|
838 |
|
839 |
+
#: lib/event_updates.php:246
|
840 |
msgid "Cannot download security rules: connection error"
|
841 |
msgstr ""
|
842 |
|
843 |
+
#: lib/event_updates.php:252
|
844 |
#, php-format
|
845 |
msgid "Cannot download security rules: HTTP response error %s"
|
846 |
msgstr ""
|
891 |
msgid "[NinjaFirewall] Alert: %s"
|
892 |
msgstr ""
|
893 |
|
894 |
+
#: lib/events.php:199 lib/events.php:201 lib/utils.php:817
|
895 |
msgid "-Blog:"
|
896 |
msgstr ""
|
897 |
|
899 |
msgid "NinjaFirewall has detected the following activity on your account:"
|
900 |
msgstr ""
|
901 |
|
902 |
+
#: lib/events.php:206 lib/utils.php:822
|
903 |
msgid "-User:"
|
904 |
msgstr ""
|
905 |
|
906 |
+
#: lib/events.php:207 lib/utils.php:823
|
907 |
msgid "-IP:"
|
908 |
msgstr ""
|
909 |
|
910 |
+
#: lib/events.php:208 lib/utils.php:824
|
911 |
msgid "-Date:"
|
912 |
msgstr ""
|
913 |
|
914 |
+
#: lib/firewall_options.php:29 ninjafirewall.php:907
|
915 |
msgid "Firewall Options"
|
916 |
msgstr ""
|
917 |
|
1062 |
msgid "The imported file is not compatible with that version of NinjaFirewall"
|
1063 |
msgstr ""
|
1064 |
|
1065 |
+
#: lib/firewall_options.php:473 ninjafirewall.php:226
|
1066 |
msgid "[NinjaFirewall] Alert: Firewall is disabled"
|
1067 |
msgstr ""
|
1068 |
|
1069 |
#: lib/firewall_options.php:475 lib/firewall_options.php:477
|
1070 |
+
#: ninjafirewall.php:228 ninjafirewall.php:230
|
1071 |
msgid "-Blog :"
|
1072 |
msgstr ""
|
1073 |
|
1074 |
+
#: lib/firewall_options.php:481 ninjafirewall.php:232
|
1075 |
msgid "Someone disabled NinjaFirewall from your WordPress admin dashboard:"
|
1076 |
msgstr ""
|
1077 |
|
1090 |
"Someone imported a new configuration which overrode the firewall settings:"
|
1091 |
msgstr ""
|
1092 |
|
1093 |
+
#: lib/firewall_options.php:494 ninjafirewall.php:233
|
1094 |
msgid "-User :"
|
1095 |
msgstr ""
|
1096 |
|
1097 |
+
#: lib/firewall_options.php:495 ninjafirewall.php:234
|
1098 |
msgid "-IP :"
|
1099 |
msgstr ""
|
1100 |
|
1101 |
+
#: lib/firewall_options.php:496 ninjafirewall.php:235
|
1102 |
msgid "-Date :"
|
1103 |
msgstr ""
|
1104 |
|
1109 |
"enable NinjaFirewall's Full WAF mode."
|
1110 |
msgstr ""
|
1111 |
|
1112 |
+
#: lib/firewall_policies.php:62 ninjafirewall.php:911
|
1113 |
msgid "Firewall Policies"
|
1114 |
msgstr ""
|
1115 |
|
2489 |
"package (third-party software, shell script, backdoor etc)."
|
2490 |
msgstr ""
|
2491 |
|
2492 |
+
#: lib/help.php:360 lib/network.php:32 ninjafirewall.php:929
|
2493 |
msgid "Network"
|
2494 |
msgstr ""
|
2495 |
|
2525 |
"theme in order to take full control of your website."
|
2526 |
msgstr ""
|
2527 |
|
2528 |
+
#: lib/help.php:389 lib/login_protection.php:21 ninjafirewall.php:937
|
2529 |
msgid "Login Protection"
|
2530 |
msgstr ""
|
2531 |
|
4482 |
"Error: Your .htaccess file is not writable, please change its permissions: %s"
|
4483 |
msgstr ""
|
4484 |
|
4485 |
+
#: lib/install.php:110 ninjafirewall.php:667 ninjafirewall.php:671
|
4486 |
#, php-format
|
4487 |
msgid "Error: wrong parameter value (%s)."
|
4488 |
msgstr ""
|
4724 |
msgid "Error: unable to write to the %s configuration file"
|
4725 |
msgstr ""
|
4726 |
|
4727 |
+
#: lib/logs.php:36 ninjafirewall.php:941
|
4728 |
msgid "Logs"
|
4729 |
msgstr ""
|
4730 |
|
4846 |
"Administrator to the whitelist\" option is enabled."
|
4847 |
msgstr ""
|
4848 |
|
4849 |
+
#: lib/logs_live_log.php:96 ninjafirewall.php:369
|
4850 |
msgid ""
|
4851 |
"Live Log lets you watch your blog traffic in real time. To enable it, click "
|
4852 |
"on the button below."
|
4892 |
msgid "Inclusion and exclusion filters (REQUEST_URI)"
|
4893 |
msgstr ""
|
4894 |
|
4895 |
+
#: lib/logs_live_log.php:158 lib/monitoring_file_check.php:405
|
4896 |
msgid "None"
|
4897 |
msgstr ""
|
4898 |
|
4904 |
msgid "Must not include"
|
4905 |
msgstr ""
|
4906 |
|
4907 |
+
#: lib/logs_live_log.php:162 lib/monitoring_file_check.php:163
|
4908 |
#: lib/monitoring_file_guard.php:89
|
4909 |
msgid "e.g.,"
|
4910 |
msgstr ""
|
4947 |
msgid "Error: please enter the custom log format."
|
4948 |
msgstr ""
|
4949 |
|
4950 |
+
#: lib/monitoring.php:43 ninjafirewall.php:915
|
4951 |
msgid "Monitoring"
|
4952 |
msgstr ""
|
4953 |
|
4959 |
"leakage issues on your website."
|
4960 |
msgstr ""
|
4961 |
|
4962 |
+
#: lib/monitoring_file_check.php:63
|
4963 |
msgid "Snapshot successfully created."
|
4964 |
msgstr ""
|
4965 |
|
4966 |
+
#: lib/monitoring_file_check.php:72
|
4967 |
msgid "Snapshot file successfully deleted."
|
4968 |
msgstr ""
|
4969 |
|
4970 |
+
#: lib/monitoring_file_check.php:89
|
4971 |
msgid "You must create a snapshot first."
|
4972 |
msgstr ""
|
4973 |
|
4974 |
+
#: lib/monitoring_file_check.php:103 lib/monitoring_file_check.php:758
|
4975 |
msgid "NinjaFirewall detected that changes were made to your files."
|
4976 |
msgstr ""
|
4977 |
|
4978 |
+
#: lib/monitoring_file_check.php:106
|
4979 |
msgid "No changes detected."
|
4980 |
msgstr ""
|
4981 |
|
4982 |
+
#: lib/monitoring_file_check.php:142
|
4983 |
msgid ""
|
4984 |
"File Check lets you perform file integrity monitoring upon request or on a "
|
4985 |
"specific interval. To start, create a snapshot of your files by clicking the "
|
4986 |
"button below."
|
4987 |
msgstr ""
|
4988 |
|
4989 |
+
#: lib/monitoring_file_check.php:149
|
4990 |
msgid "Create a snapshot of all files stored in that directory"
|
4991 |
msgstr ""
|
4992 |
|
4993 |
+
#: lib/monitoring_file_check.php:157
|
4994 |
#, php-format
|
4995 |
msgid "Default: %s"
|
4996 |
msgstr ""
|
4997 |
|
4998 |
+
#: lib/monitoring_file_check.php:162 lib/monitoring_file_guard.php:88
|
4999 |
msgid "Exclude the following files/folders (optional)"
|
5000 |
msgstr ""
|
5001 |
|
5002 |
+
#: lib/monitoring_file_check.php:163
|
5003 |
msgid ""
|
5004 |
"Full or partial case-sensitive string(s). Multiple values must be comma-"
|
5005 |
"separated"
|
5006 |
msgstr ""
|
5007 |
|
5008 |
+
#: lib/monitoring_file_check.php:169
|
5009 |
msgid "Do not follow symbolic links (default)"
|
5010 |
msgstr ""
|
5011 |
|
5012 |
+
#: lib/monitoring_file_check.php:175
|
5013 |
msgid "Create Snapshot"
|
5014 |
msgstr ""
|
5015 |
|
5016 |
+
#: lib/monitoring_file_check.php:241
|
5017 |
msgid "Last snapshot"
|
5018 |
msgstr ""
|
5019 |
|
5020 |
+
#: lib/monitoring_file_check.php:243
|
5021 |
#, php-format
|
5022 |
msgid "Created on: %s"
|
5023 |
msgstr ""
|
5024 |
|
5025 |
+
#: lib/monitoring_file_check.php:244
|
5026 |
#, php-format
|
5027 |
msgid "Total files: %s "
|
5028 |
msgstr ""
|
5029 |
|
5030 |
+
#: lib/monitoring_file_check.php:246
|
5031 |
msgid "Directory:"
|
5032 |
msgstr ""
|
5033 |
|
5034 |
+
#: lib/monitoring_file_check.php:250
|
5035 |
msgid "Exclusion:"
|
5036 |
msgstr ""
|
5037 |
|
5038 |
+
#: lib/monitoring_file_check.php:256
|
5039 |
msgid "Symlinks:"
|
5040 |
msgstr ""
|
5041 |
|
5042 |
+
#: lib/monitoring_file_check.php:258
|
5043 |
msgid "follow"
|
5044 |
msgstr ""
|
5045 |
|
5046 |
+
#: lib/monitoring_file_check.php:260
|
5047 |
msgid "do not follow"
|
5048 |
msgstr ""
|
5049 |
|
5050 |
+
#: lib/monitoring_file_check.php:264
|
5051 |
#, php-format
|
5052 |
msgid "Processing time: %s seconds"
|
5053 |
msgstr ""
|
5054 |
|
5055 |
+
#: lib/monitoring_file_check.php:269
|
5056 |
msgid "Download Snapshot"
|
5057 |
msgstr ""
|
5058 |
|
5059 |
+
#: lib/monitoring_file_check.php:269
|
5060 |
msgid "Delete Snapshot"
|
5061 |
msgstr ""
|
5062 |
|
5063 |
+
#: lib/monitoring_file_check.php:275
|
5064 |
msgid "Last changes"
|
5065 |
msgstr ""
|
5066 |
|
5067 |
+
#: lib/monitoring_file_check.php:282 lib/monitoring_file_check.php:766
|
5068 |
#, php-format
|
5069 |
msgid "New files: %s"
|
5070 |
msgstr ""
|
5071 |
|
5072 |
+
#: lib/monitoring_file_check.php:283 lib/monitoring_file_check.php:768
|
5073 |
#, php-format
|
5074 |
msgid "Deleted files: %s"
|
5075 |
msgstr ""
|
5076 |
|
5077 |
+
#: lib/monitoring_file_check.php:284 lib/monitoring_file_check.php:767
|
5078 |
#, php-format
|
5079 |
msgid "Modified files: %s"
|
5080 |
msgstr ""
|
5081 |
|
5082 |
+
#: lib/monitoring_file_check.php:288
|
5083 |
msgid "View Changes"
|
5084 |
msgstr ""
|
5085 |
|
5086 |
+
#: lib/monitoring_file_check.php:292
|
5087 |
msgid "Download Changes"
|
5088 |
msgstr ""
|
5089 |
|
5090 |
+
#: lib/monitoring_file_check.php:304
|
5091 |
msgid "Click a file to get more info about it."
|
5092 |
msgstr ""
|
5093 |
|
5094 |
+
#: lib/monitoring_file_check.php:307
|
5095 |
msgid "New files:"
|
5096 |
msgstr ""
|
5097 |
|
5098 |
+
#: lib/monitoring_file_check.php:316 lib/monitoring_file_check.php:369
|
5099 |
msgid "Size"
|
5100 |
msgstr ""
|
5101 |
|
5102 |
+
#: lib/monitoring_file_check.php:320 lib/monitoring_file_check.php:374
|
5103 |
msgid "Access"
|
5104 |
msgstr ""
|
5105 |
|
5106 |
+
#: lib/monitoring_file_check.php:324 lib/monitoring_file_check.php:379
|
5107 |
msgid "Uid / Gid"
|
5108 |
msgstr ""
|
5109 |
|
5110 |
+
#: lib/monitoring_file_check.php:328 lib/monitoring_file_check.php:384
|
5111 |
msgid "Modify"
|
5112 |
msgstr ""
|
5113 |
|
5114 |
+
#: lib/monitoring_file_check.php:332 lib/monitoring_file_check.php:389
|
5115 |
msgid "Change"
|
5116 |
msgstr ""
|
5117 |
|
5118 |
+
#: lib/monitoring_file_check.php:342
|
5119 |
msgid "Deleted files:"
|
5120 |
msgstr ""
|
5121 |
|
5122 |
+
#: lib/monitoring_file_check.php:355
|
5123 |
msgid "Modified files:"
|
5124 |
msgstr ""
|
5125 |
|
5126 |
+
#: lib/monitoring_file_check.php:365
|
5127 |
msgid "Old"
|
5128 |
msgstr ""
|
5129 |
|
5130 |
+
#: lib/monitoring_file_check.php:366
|
5131 |
msgid "New"
|
5132 |
msgstr ""
|
5133 |
|
5134 |
+
#: lib/monitoring_file_check.php:415
|
5135 |
msgid "Scan System For File Changes"
|
5136 |
msgstr ""
|
5137 |
|
5138 |
+
#: lib/monitoring_file_check.php:433
|
5139 |
msgid "Options"
|
5140 |
msgstr ""
|
5141 |
|
5142 |
+
#: lib/monitoring_file_check.php:440
|
5143 |
#, php-format
|
5144 |
msgid ""
|
5145 |
"It seems that %s is set. Ensure you have another way to run WP-Cron, "
|
5146 |
"otherwise NinjaFirewall scheduled scans will not work."
|
5147 |
msgstr ""
|
5148 |
|
5149 |
+
#: lib/monitoring_file_check.php:446
|
5150 |
msgid "Enable scheduled scans"
|
5151 |
msgstr ""
|
5152 |
|
5153 |
+
#: lib/monitoring_file_check.php:448
|
5154 |
msgid "No (default)"
|
5155 |
msgstr ""
|
5156 |
|
5157 |
+
#: lib/monitoring_file_check.php:449 lib/security_rules_update.php:153
|
5158 |
msgid "Hourly"
|
5159 |
msgstr ""
|
5160 |
|
5161 |
+
#: lib/monitoring_file_check.php:450 lib/security_rules_update.php:154
|
5162 |
msgid "Twicedaily"
|
5163 |
msgstr ""
|
5164 |
|
5165 |
+
#: lib/monitoring_file_check.php:451 lib/security_rules_update.php:155
|
5166 |
msgid "Daily"
|
5167 |
msgstr ""
|
5168 |
|
5169 |
+
#: lib/monitoring_file_check.php:458
|
5170 |
#, php-format
|
5171 |
msgid ""
|
5172 |
"Next scan will start in approximately %s day(s), %s hour(s), %s minute(s) "
|
5173 |
"and %s second(s)."
|
5174 |
msgstr ""
|
5175 |
|
5176 |
+
#: lib/monitoring_file_check.php:465
|
5177 |
msgid ""
|
5178 |
"The next scheduled scan date is in the past! WordPress wp-cron may not be "
|
5179 |
"working or may have been disabled."
|
5180 |
msgstr ""
|
5181 |
|
5182 |
+
#: lib/monitoring_file_check.php:473
|
5183 |
msgid "Scheduled scan report"
|
5184 |
msgstr ""
|
5185 |
|
5186 |
+
#: lib/monitoring_file_check.php:475
|
5187 |
msgid "Send me a report by email only if changes are detected (default)"
|
5188 |
msgstr ""
|
5189 |
|
5190 |
+
#: lib/monitoring_file_check.php:476
|
5191 |
msgid "Always send me a report by email after a scheduled scan"
|
5192 |
msgstr ""
|
5193 |
|
5194 |
+
#: lib/monitoring_file_check.php:481
|
5195 |
msgid "Save Scan Options"
|
5196 |
msgstr ""
|
5197 |
|
5198 |
+
#: lib/monitoring_file_check.php:493
|
5199 |
msgid "Enter the full path to the directory to be scanned."
|
5200 |
msgstr ""
|
5201 |
|
5202 |
+
#: lib/monitoring_file_check.php:496
|
5203 |
#, php-format
|
5204 |
msgid "The directory %s is not correct."
|
5205 |
msgstr ""
|
5206 |
|
5207 |
+
#: lib/monitoring_file_check.php:503
|
5208 |
#, php-format
|
5209 |
msgid "The directory %s does not exist."
|
5210 |
msgstr ""
|
5211 |
|
5212 |
+
#: lib/monitoring_file_check.php:506
|
5213 |
#, php-format
|
5214 |
msgid "The directory %s is not readable."
|
5215 |
msgstr ""
|
5216 |
|
5217 |
+
#: lib/monitoring_file_check.php:547
|
5218 |
#, php-format
|
5219 |
msgid "Cannot write to %s."
|
5220 |
msgstr ""
|
5221 |
|
5222 |
+
#: lib/monitoring_file_check.php:577
|
5223 |
#, php-format
|
5224 |
msgid "Error : cannot open %s directory."
|
5225 |
msgstr ""
|
5226 |
|
5227 |
+
#: lib/monitoring_file_check.php:580
|
5228 |
#, php-format
|
5229 |
msgid "Error : %s directory is not readable."
|
5230 |
msgstr ""
|
5231 |
|
5232 |
+
#: lib/monitoring_file_check.php:595
|
5233 |
#, php-format
|
5234 |
msgid "Missing options line %s, please try again."
|
5235 |
msgstr ""
|
5236 |
|
5237 |
+
#: lib/monitoring_file_check.php:605
|
5238 |
#, php-format
|
5239 |
msgid "Cannot create %s."
|
5240 |
msgstr ""
|
5241 |
|
5242 |
+
#: lib/monitoring_file_check.php:622
|
5243 |
msgid "Error reading old snapshot file."
|
5244 |
msgstr ""
|
5245 |
|
5246 |
+
#: lib/monitoring_file_check.php:633
|
5247 |
msgid "Error reading new snapshot file."
|
5248 |
msgstr ""
|
5249 |
|
5250 |
+
#: lib/monitoring_file_check.php:731 ninjafirewall.php:476
|
5251 |
msgid "New file"
|
5252 |
msgstr ""
|
5253 |
|
5254 |
+
#: lib/monitoring_file_check.php:732 ninjafirewall.php:477
|
5255 |
msgid "Modified file"
|
5256 |
msgstr ""
|
5257 |
|
5258 |
+
#: lib/monitoring_file_check.php:733 ninjafirewall.php:478
|
5259 |
msgid "Deleted file"
|
5260 |
msgstr ""
|
5261 |
|
5262 |
+
#: lib/monitoring_file_check.php:757
|
5263 |
msgid "[NinjaFirewall] Alert: File Check detection"
|
5264 |
msgstr ""
|
5265 |
|
5266 |
+
#: lib/monitoring_file_check.php:764 lib/monitoring_file_check.php:786
|
5267 |
#: lib/security_rules_update.php:564
|
5268 |
#, php-format
|
5269 |
msgid "Date: %s"
|
5270 |
msgstr ""
|
5271 |
|
5272 |
+
#: lib/monitoring_file_check.php:770
|
5273 |
msgid "See attached file for details."
|
5274 |
msgstr ""
|
5275 |
|
5276 |
+
#: lib/monitoring_file_check.php:779
|
5277 |
msgid "[NinjaFirewall] File Check report"
|
5278 |
msgstr ""
|
5279 |
|
5280 |
+
#: lib/monitoring_file_check.php:780
|
5281 |
msgid "NinjaFirewall did not detect changes in your files."
|
5282 |
msgstr ""
|
5283 |
|
5323 |
msgid "Save File Guard options"
|
5324 |
msgstr ""
|
5325 |
|
5326 |
+
#: lib/network.php:24 ninjafirewall.php:1202 ninjafirewall.php:1206
|
5327 |
#, php-format
|
5328 |
msgid "You are not allowed to perform this task (%s)."
|
5329 |
msgstr ""
|
5353 |
msgstr ""
|
5354 |
|
5355 |
#: lib/security_rules.php:44 lib/security_rules_update.php:565
|
5356 |
+
#: ninjafirewall.php:945
|
5357 |
msgid "Security Rules"
|
5358 |
msgstr ""
|
5359 |
|
5776 |
msgid "Cancel and Close"
|
5777 |
msgstr ""
|
5778 |
|
5779 |
+
#: lib/utils.php:188 lib/utils.php:196 lib/utils.php:289
|
5780 |
msgid "N/A"
|
5781 |
msgstr ""
|
5782 |
|
5790 |
msgid "Attempt to edit a published %s (ID: %s)"
|
5791 |
msgstr ""
|
5792 |
|
5793 |
+
#: lib/utils.php:212 lib/utils.php:281
|
5794 |
msgid "Unauthenticated user"
|
5795 |
msgstr ""
|
5796 |
|
5804 |
"doesn't have the right capabilities:"
|
5805 |
msgstr ""
|
5806 |
|
5807 |
+
#: lib/utils.php:226 lib/utils.php:301 lib/utils.php:413 lib/utils.php:1245
|
5808 |
msgid "Username:"
|
5809 |
msgstr ""
|
5810 |
|
5812 |
msgid "Action:"
|
5813 |
msgstr ""
|
5814 |
|
5815 |
+
#: lib/utils.php:238 lib/utils.php:312 lib/utils.php:1257 lib/utils.php:1506
|
|
|
|
|
|
|
|
|
|
|
5816 |
msgid ""
|
5817 |
"This protection (and notification) can be turned off from NinjaFirewall "
|
5818 |
"\"Firewall Policies\" page."
|
5819 |
msgstr ""
|
5820 |
|
5821 |
+
#: lib/utils.php:252 lib/utils.php:253 lib/utils.php:326 lib/utils.php:327
|
5822 |
+
#: lib/utils.php:436 lib/utils.php:437 lib/utils.php:1272 lib/utils.php:1273
|
5823 |
msgid "You are not allowed to perform this task."
|
5824 |
msgstr ""
|
5825 |
|
5826 |
+
#: lib/utils.php:292
|
5827 |
msgid "Blocked post/page deletion attempt"
|
5828 |
msgstr ""
|
5829 |
|
5830 |
+
#: lib/utils.php:299
|
5831 |
msgid ""
|
5832 |
"NinjaFirewall has blocked an attempt to delete a post by a user who doesn't "
|
5833 |
"have the right capabilities:"
|
5834 |
msgstr ""
|
5835 |
|
5836 |
+
#: lib/utils.php:403
|
5837 |
msgid "Blocked user account creation"
|
5838 |
msgstr ""
|
5839 |
|
5840 |
+
#: lib/utils.php:410
|
5841 |
msgid "NinjaFirewall has blocked an attempt to create a user account:"
|
5842 |
msgstr ""
|
5843 |
|
5844 |
+
#: lib/utils.php:501
|
5845 |
#, php-format
|
5846 |
msgid "Backup file is corrupted, deleting it (%s)"
|
5847 |
msgstr ""
|
5848 |
|
5849 |
+
#: lib/utils.php:509
|
5850 |
#, php-format
|
5851 |
msgid ""
|
5852 |
"NinjaFirewall's options are corrupted, restoring them from last known good "
|
5853 |
"backup file (%s)"
|
5854 |
msgstr ""
|
5855 |
|
5856 |
+
#: lib/utils.php:515
|
5857 |
msgid ""
|
5858 |
"NinjaFirewall's options are corrupted, restoring their default values (no "
|
5859 |
"valid backup found)"
|
5860 |
msgstr ""
|
5861 |
|
5862 |
+
#: lib/utils.php:748
|
5863 |
msgid ""
|
5864 |
"Warning: Because NinjaFirewall's Login Protection is enabled, Site Health "
|
5865 |
"may return an error message regarding the loopback test (e.g., 404 or 401 "
|
5866 |
"HTTP status code). You can safely ignore it."
|
5867 |
msgstr ""
|
5868 |
|
5869 |
+
#: lib/utils.php:771 lib/utils.php:775
|
5870 |
msgid "NinjaFirewall error"
|
5871 |
msgstr ""
|
5872 |
|
5873 |
+
#: lib/utils.php:772
|
5874 |
#, php-format
|
5875 |
msgid ""
|
5876 |
"%s directory cannot be created. Please review your installation and ensure "
|
5877 |
"that %s is writable."
|
5878 |
msgstr ""
|
5879 |
|
5880 |
+
#: lib/utils.php:776
|
5881 |
#, php-format
|
5882 |
msgid ""
|
5883 |
"%s directory is read-only. Please review your installation and ensure that "
|
5884 |
"%s is writable."
|
5885 |
msgstr ""
|
5886 |
|
5887 |
+
#: lib/utils.php:791
|
5888 |
msgid "unknown error"
|
5889 |
msgstr ""
|
5890 |
|
5891 |
+
#: lib/utils.php:793
|
5892 |
msgid "NinjaFirewall fatal error:"
|
5893 |
msgstr ""
|
5894 |
|
5895 |
+
#: lib/utils.php:794
|
5896 |
msgid "Review your installation, your site is not protected."
|
5897 |
msgstr ""
|
5898 |
|
5899 |
+
#: lib/utils.php:815
|
5900 |
msgid "Alert: WordPress console login"
|
5901 |
msgstr ""
|
5902 |
|
5903 |
+
#: lib/utils.php:821
|
5904 |
msgid "Someone just logged in to your WordPress admin console:"
|
5905 |
msgstr ""
|
5906 |
|
5907 |
+
#: lib/utils.php:939 lib/utils.php:966
|
5908 |
msgid "Forbidden access"
|
5909 |
msgstr ""
|
5910 |
|
5911 |
+
#: lib/utils.php:985
|
5912 |
#, php-format
|
5913 |
msgid ""
|
5914 |
"<strong>ERROR</strong>: Invalid username, email address or password.<br /><a "
|
5915 |
"href=\"%s\">Lost your password</a>?"
|
5916 |
msgstr ""
|
5917 |
|
5918 |
+
#: lib/utils.php:1063
|
5919 |
msgid "[NinjaFirewall] Alert: Database changes detected"
|
5920 |
msgstr ""
|
5921 |
|
5922 |
+
#: lib/utils.php:1064
|
5923 |
msgid ""
|
5924 |
"NinjaFirewall has detected that one or more administrator accounts were "
|
5925 |
"modified in the database:"
|
5926 |
msgstr ""
|
5927 |
|
5928 |
+
#: lib/utils.php:1069
|
5929 |
#, php-format
|
5930 |
msgid "Total administrators : %s"
|
5931 |
msgstr ""
|
5932 |
|
5933 |
+
#: lib/utils.php:1078
|
5934 |
msgid ""
|
5935 |
"If you cannot see any modifications in the above fields, it is possible that "
|
5936 |
"the administrator password was changed."
|
5937 |
msgstr ""
|
5938 |
|
5939 |
+
#: lib/utils.php:1231
|
5940 |
msgid "Blocked privilege escalation attempt"
|
5941 |
msgstr ""
|
5942 |
|
5943 |
+
#: lib/utils.php:1239
|
5944 |
msgid ""
|
5945 |
"NinjaFirewall has blocked an attempt to modify a user capability by someone "
|
5946 |
"who does not have administrative privileges:"
|
5947 |
msgstr ""
|
5948 |
|
5949 |
+
#: lib/utils.php:1284
|
5950 |
msgid ""
|
5951 |
"NinjaFirewall brute-force protection is enabled and you are temporarily "
|
5952 |
"whitelisted."
|
5953 |
msgstr ""
|
5954 |
|
5955 |
+
#: lib/utils.php:1299
|
5956 |
#, php-format
|
5957 |
msgid ""
|
5958 |
"Hey, it seems that you've been using NinjaFirewall for some time. If you "
|
5961 |
"rate it. Thank you!"
|
5962 |
msgstr ""
|
5963 |
|
5964 |
+
#: lib/utils.php:1474
|
5965 |
msgid ""
|
5966 |
"The attempt was blocked and the option was reversed to its original value."
|
5967 |
msgstr ""
|
5968 |
|
5969 |
+
#: lib/utils.php:1479
|
5970 |
msgid "Attempt to modify WordPress settings"
|
5971 |
msgstr ""
|
5972 |
|
5973 |
+
#: lib/utils.php:1480
|
5974 |
msgid ""
|
5975 |
"NinjaFirewall has blocked an attempt to modify some important WordPress "
|
5976 |
"settings by a user that does not have administrative privileges:"
|
5977 |
msgstr ""
|
5978 |
|
5979 |
+
#: lib/utils.php:1481 lib/utils.php:1490
|
5980 |
#, php-format
|
5981 |
msgid "Option: %s"
|
5982 |
msgstr ""
|
5983 |
|
5984 |
+
#: lib/utils.php:1482
|
5985 |
#, php-format
|
5986 |
msgid "Original value: %s"
|
5987 |
msgstr ""
|
5988 |
|
5989 |
+
#: lib/utils.php:1483
|
5990 |
#, php-format
|
5991 |
msgid "Modified value: %s"
|
5992 |
msgstr ""
|
5993 |
|
5994 |
+
#: lib/utils.php:1484 lib/utils.php:1492
|
5995 |
#, php-format
|
5996 |
msgid "Action taken: %s"
|
5997 |
msgstr ""
|
5998 |
|
5999 |
+
#: lib/utils.php:1488
|
6000 |
msgid "Code injection attempt in WordPress options table"
|
6001 |
msgstr ""
|
6002 |
|
6003 |
+
#: lib/utils.php:1489
|
6004 |
msgid ""
|
6005 |
"NinjaFirewall has blocked an attempt to inject code in the WordPress options "
|
6006 |
"table by a user that does not have administrative privileges:"
|
6007 |
msgstr ""
|
6008 |
|
6009 |
+
#: lib/utils.php:1491
|
6010 |
#, php-format
|
6011 |
msgid "Code: %s"
|
6012 |
msgstr ""
|
6013 |
|
6014 |
+
#: lib/utils.php:1585
|
6015 |
msgid "Important: NinjaFirewall has detected that this is a security update."
|
6016 |
msgstr ""
|
6017 |
|
6018 |
+
#: lib/utils.php:1588
|
6019 |
msgid "More info about this warning."
|
6020 |
msgstr ""
|
6021 |
|
6022 |
+
#: lib/utils.php:1611
|
6023 |
#, php-format
|
6024 |
msgid "Cannot send notification, no valid email found (%s)"
|
6025 |
msgstr ""
|
6026 |
|
6027 |
+
#: lib/utils.php:1636
|
6028 |
#, php-format
|
6029 |
msgid ""
|
6030 |
"If you don't have access to that site any longer, you can remove your email "
|
6031 |
"by clicking the following link (valid for 12 hours): %s"
|
6032 |
msgstr ""
|
6033 |
|
6034 |
+
#: lib/utils.php:1658
|
6035 |
+
msgid "A PHP backtrace has been attached to this message for your convenience."
|
6036 |
+
msgstr ""
|
6037 |
+
|
6038 |
+
#: lib/utils.php:1679
|
6039 |
#, php-format
|
6040 |
msgid "Error, cannot create the %s folder."
|
6041 |
msgstr ""
|
6042 |
|
6043 |
+
#: lib/utils.php:1680 lib/utils.php:1689 lib/utils.php:1698
|
6044 |
msgid "Check your server permissions and try again."
|
6045 |
msgstr ""
|
6046 |
|
6047 |
+
#: lib/utils.php:1688
|
6048 |
#, php-format
|
6049 |
msgid "Error, the %s folder is not writable."
|
6050 |
msgstr ""
|
6051 |
|
6052 |
+
#: lib/utils.php:1697
|
6053 |
#, php-format
|
6054 |
msgid "Error, cannot write %s."
|
6055 |
msgstr ""
|
6444 |
msgid "Cannot retrieve user rules from database (#4)"
|
6445 |
msgstr ""
|
6446 |
|
6447 |
+
#: ninjafirewall.php:140 ninjafirewall.php:212
|
6448 |
+
msgid ""
|
6449 |
+
"Error: to interact with NinjaFirewall you must use the --user flag with the "
|
6450 |
+
"administrator name, ID or email address (e.g., --user=adminuser)."
|
6451 |
+
msgstr ""
|
6452 |
+
|
6453 |
+
#: ninjafirewall.php:142 ninjafirewall.php:214
|
6454 |
msgid ""
|
6455 |
"You do not have \"unfiltered_html\" capability. Please enable it in order to "
|
6456 |
"run NinjaFirewall (or make sure you do not have \"DISALLOW_UNFILTERED_HTML\" "
|
6457 |
"in your wp-config.php script)."
|
6458 |
msgstr ""
|
6459 |
|
6460 |
+
#: ninjafirewall.php:150
|
6461 |
#, php-format
|
6462 |
msgid ""
|
6463 |
"NinjaFirewall requires WordPress %s or greater but your current version is "
|
6464 |
"%s."
|
6465 |
msgstr ""
|
6466 |
|
6467 |
+
#: ninjafirewall.php:154
|
6468 |
#, php-format
|
6469 |
msgid ""
|
6470 |
"NinjaFirewall requires PHP 5.3 or greater but your current version is %s."
|
6471 |
msgstr ""
|
6472 |
|
6473 |
+
#: ninjafirewall.php:158
|
6474 |
#, php-format
|
6475 |
msgid "NinjaFirewall requires the PHP %s extension."
|
6476 |
msgstr ""
|
6477 |
|
6478 |
+
#: ninjafirewall.php:162
|
6479 |
msgid ""
|
6480 |
"You have SAFE_MODE enabled. Please disable it, it is deprecated as of PHP "
|
6481 |
"5.3.0 (see http://php.net/safe-mode)."
|
6482 |
msgstr ""
|
6483 |
|
6484 |
+
#: ninjafirewall.php:166
|
6485 |
msgid "You are not allowed to activate NinjaFirewall."
|
6486 |
msgstr ""
|
6487 |
|
6488 |
+
#: ninjafirewall.php:170
|
6489 |
msgid "NinjaFirewall is not compatible with Microsoft Windows."
|
6490 |
msgstr ""
|
6491 |
|
6492 |
+
#: ninjafirewall.php:320
|
6493 |
msgid ""
|
6494 |
"All fields will be restored to their default values and any changes you made "
|
6495 |
"will be lost. Continue?"
|
6496 |
msgstr ""
|
6497 |
|
6498 |
+
#: ninjafirewall.php:324
|
6499 |
msgid "Missing security nonce, try to reload the page."
|
6500 |
msgstr ""
|
6501 |
|
6502 |
+
#: ninjafirewall.php:326
|
6503 |
msgid "Please select the HTTP server in the list."
|
6504 |
msgstr ""
|
6505 |
|
6506 |
+
#: ninjafirewall.php:329
|
6507 |
msgid "Delete the firewall's error log ?"
|
6508 |
msgstr ""
|
6509 |
|
6510 |
+
#: ninjafirewall.php:333
|
6511 |
msgid ""
|
6512 |
"This action will restore the selected configuration file and will override "
|
6513 |
"all your current firewall options, policies and rules. Continue?"
|
6514 |
msgstr ""
|
6515 |
|
6516 |
+
#: ninjafirewall.php:337
|
6517 |
msgid ""
|
6518 |
"Any character that is not a letter [a-zA-Z], a digit [0-9], a dot [.], a "
|
6519 |
"hyphen [-] or an underscore [_] will be removed from the filename and "
|
6520 |
"replaced with the substitution character. Continue?"
|
6521 |
msgstr ""
|
6522 |
|
6523 |
+
#: ninjafirewall.php:339
|
6524 |
msgid ""
|
6525 |
"Ensure that you can access your admin console over HTTPS before enabling "
|
6526 |
"this option, otherwise you will lock yourself out of your site. Continue?"
|
6527 |
msgstr ""
|
6528 |
|
6529 |
+
#: ninjafirewall.php:341
|
6530 |
msgid ""
|
6531 |
"WooCommerce is running: if you block accounts creation, your customers won't "
|
6532 |
"be able to sign up. Continue?"
|
6533 |
msgstr ""
|
6534 |
|
6535 |
+
#: ninjafirewall.php:343
|
6536 |
msgid ""
|
6537 |
"Your blog has user registration enabled: if you block accounts creation, "
|
6538 |
"your customers won't be able to sign up. Continue?"
|
6539 |
msgstr ""
|
6540 |
|
6541 |
+
#: ninjafirewall.php:345
|
6542 |
msgid ""
|
6543 |
"Your multisite installation allows users to register new sites: if you "
|
6544 |
"enable this option, they will likely get blocked when creating their blog. "
|
6545 |
"Continue?"
|
6546 |
msgstr ""
|
6547 |
|
6548 |
+
#: ninjafirewall.php:349
|
6549 |
msgid "Delete the current snapshot ?"
|
6550 |
msgstr ""
|
6551 |
|
6552 |
+
#: ninjafirewall.php:353
|
6553 |
msgid "Invalid character."
|
6554 |
msgstr ""
|
6555 |
|
6556 |
+
#: ninjafirewall.php:355
|
6557 |
msgid "\"admin\" is not acceptable, please choose another user name."
|
6558 |
msgstr ""
|
6559 |
|
6560 |
+
#: ninjafirewall.php:357
|
6561 |
msgid "Please enter max 1024 character only."
|
6562 |
msgstr ""
|
6563 |
|
6564 |
+
#: ninjafirewall.php:359
|
6565 |
msgid "Select when to enable the login protection."
|
6566 |
msgstr ""
|
6567 |
|
6568 |
+
#: ninjafirewall.php:361
|
6569 |
msgid "Enter a name and a password for the HTTP authentication."
|
6570 |
msgstr ""
|
6571 |
|
6572 |
+
#: ninjafirewall.php:365
|
6573 |
msgid "Your public key is not valid."
|
6574 |
msgstr ""
|
6575 |
|
6576 |
+
#: ninjafirewall.php:371
|
6577 |
msgid "No traffic yet, please wait"
|
6578 |
msgstr ""
|
6579 |
|
6580 |
+
#: ninjafirewall.php:373
|
6581 |
msgid "seconds..."
|
6582 |
msgstr ""
|
6583 |
|
6584 |
+
#: ninjafirewall.php:375
|
6585 |
msgid "Error: Live Log did not receive the expected response from your server:"
|
6586 |
msgstr ""
|
6587 |
|
6588 |
+
#: ninjafirewall.php:377
|
6589 |
msgid "Error: URL does not seem to exist (404 Not Found):"
|
6590 |
msgstr ""
|
6591 |
|
6592 |
+
#: ninjafirewall.php:379
|
6593 |
msgid "Error: Cannot find your log file. Try to reload this page."
|
6594 |
msgstr ""
|
6595 |
|
6596 |
+
#: ninjafirewall.php:381
|
6597 |
msgid "Error: The HTTP server returned the following error code:"
|
6598 |
msgstr ""
|
6599 |
|
6600 |
+
#: ninjafirewall.php:652 ninjafirewall.php:772 ninjafirewall.php:841
|
6601 |
msgid "Error: Security nonces do not match. Reload the page and try again."
|
6602 |
msgstr ""
|
6603 |
|
6604 |
+
#: ninjafirewall.php:658
|
6605 |
msgid "Error: NinjaFirewall is disabled"
|
6606 |
msgstr ""
|
6607 |
|
6608 |
+
#: ninjafirewall.php:663 ninjafirewall.php:777 ninjafirewall.php:807
|
6609 |
#, php-format
|
6610 |
msgid "Error: missing parameter (%s)."
|
6611 |
msgstr ""
|
6612 |
|
6613 |
+
#: ninjafirewall.php:903
|
6614 |
msgid "NinjaFirewall: Dashboard"
|
6615 |
msgstr ""
|
6616 |
|
6617 |
+
#: ninjafirewall.php:907
|
6618 |
msgid "NinjaFirewall: Firewall Options"
|
6619 |
msgstr ""
|
6620 |
|
6621 |
+
#: ninjafirewall.php:911
|
6622 |
msgid "NinjaFirewall: Firewall Policies"
|
6623 |
msgstr ""
|
6624 |
|
6625 |
+
#: ninjafirewall.php:915
|
6626 |
msgid "NinjaFirewall: Monitoring"
|
6627 |
msgstr ""
|
6628 |
|
6629 |
+
#: ninjafirewall.php:925
|
6630 |
msgid "NinjaFirewall: Anti-Malware"
|
6631 |
msgstr ""
|
6632 |
|
6633 |
+
#: ninjafirewall.php:929
|
6634 |
msgid "NinjaFirewall: Network"
|
6635 |
msgstr ""
|
6636 |
|
6637 |
+
#: ninjafirewall.php:933
|
6638 |
msgid "NinjaFirewall: Event Notifications"
|
6639 |
msgstr ""
|
6640 |
|
6641 |
+
#: ninjafirewall.php:937
|
6642 |
msgid "NinjaFirewall: Log-in Protection"
|
6643 |
msgstr ""
|
6644 |
|
6645 |
+
#: ninjafirewall.php:941
|
6646 |
msgid "NinjaFirewall: Logs"
|
6647 |
msgstr ""
|
6648 |
|
6649 |
+
#: ninjafirewall.php:945
|
6650 |
msgid "NinjaFirewall: Security Rules"
|
6651 |
msgstr ""
|
6652 |
|
6653 |
+
#: ninjafirewall.php:989
|
6654 |
msgid "NinjaFirewall Settings"
|
6655 |
msgstr ""
|
6656 |
|
6657 |
+
#: ninjafirewall.php:997
|
6658 |
msgid "NinjaFirewall is enabled"
|
6659 |
msgstr ""
|
6660 |
|
6661 |
+
#: ninjafirewall.php:1137
|
6662 |
msgid "Access Restricted"
|
6663 |
msgstr ""
|
6664 |
|
6665 |
+
#: ninjafirewall.php:1143
|
6666 |
msgid "Settings"
|
6667 |
msgstr ""
|
6668 |
|
6669 |
+
#: ninjafirewall.php:1144
|
6670 |
msgid "Upgrade to Premium"
|
6671 |
msgstr ""
|
6672 |
|
6673 |
+
#: ninjafirewall.php:1145
|
6674 |
msgid "Rate it!"
|
6675 |
msgstr ""
|
lib/dashboard_statistics.php
CHANGED
@@ -127,14 +127,15 @@ window.onload = function() {
|
|
127 |
type: 'bar',
|
128 |
data: {
|
129 |
labels: [
|
130 |
-
"<?php echo esc_attr__('Critical', 'ninjafirewall') .' '. $critical ?>%",
|
131 |
-
"<?php echo esc_attr__('High', 'ninjafirewall') .' '. $high ?>%",
|
132 |
-
"<?php echo esc_attr__('Medium', 'ninjafirewall') .' '. $medium ?>%"
|
133 |
],
|
134 |
datasets: [{
|
135 |
-
label: '<?php esc_attr_e('Blocked threats', '
|
136 |
data: [<?php echo "{$c}, {$h}, {$m}" ?>],
|
137 |
-
backgroundColor: ['
|
|
|
138 |
borderColor: ['#8C2C2A', '#c9302c', '#ec971f'],
|
139 |
borderWidth: 1
|
140 |
}]
|
@@ -151,6 +152,20 @@ window.onload = function() {
|
|
151 |
legend: {
|
152 |
display: false
|
153 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
154 |
}
|
155 |
}
|
156 |
});
|
127 |
type: 'bar',
|
128 |
data: {
|
129 |
labels: [
|
130 |
+
"<?php echo esc_attr__('Critical', 'ninjafirewall') .': '. $critical ?>%",
|
131 |
+
"<?php echo esc_attr__('High', 'ninjafirewall') .': '. $high ?>%",
|
132 |
+
"<?php echo esc_attr__('Medium', 'ninjafirewall') .': '. $medium ?>%"
|
133 |
],
|
134 |
datasets: [{
|
135 |
+
label: '<?php esc_attr_e('Blocked threats', 'ninjafirewall') ?>',
|
136 |
data: [<?php echo "{$c}, {$h}, {$m}" ?>],
|
137 |
+
backgroundColor: ['rgba(201, 48, 44, .8)', 'rgba(236, 151, 31, .8)', 'rgba(236, 232, 31, .8)'],
|
138 |
+
hoverBackgroundColor: ['rgba(201, 48, 44, 1)', 'rgba(236, 151, 31, 1)', 'rgba(236, 232, 31, 1)'],
|
139 |
borderColor: ['#8C2C2A', '#c9302c', '#ec971f'],
|
140 |
borderWidth: 1
|
141 |
}]
|
152 |
legend: {
|
153 |
display: false
|
154 |
},
|
155 |
+
tooltip: {
|
156 |
+
borderWidth: 1,
|
157 |
+
borderColor: '#666',
|
158 |
+
displayColors: false,
|
159 |
+
backgroundColor: '#F5F5B5',
|
160 |
+
titleColor:'#666',
|
161 |
+
padding: 8,
|
162 |
+
footerColor: '#666',
|
163 |
+
callbacks: {
|
164 |
+
labelTextColor: function(context) {
|
165 |
+
return '#543453';
|
166 |
+
}
|
167 |
+
}
|
168 |
+
}
|
169 |
}
|
170 |
}
|
171 |
});
|
lib/event_updates.php
CHANGED
@@ -45,6 +45,9 @@ function nfw_check_security_updates() {
|
|
45 |
// Fetch latest data:
|
46 |
$list = array();
|
47 |
$list = nfw_fetch_security_updates( $url );
|
|
|
|
|
|
|
48 |
if ( $list === false ) {
|
49 |
return false;
|
50 |
}
|
45 |
// Fetch latest data:
|
46 |
$list = array();
|
47 |
$list = nfw_fetch_security_updates( $url );
|
48 |
+
|
49 |
+
set_transient( 'nfw_fetchsecupdates', 1, 6000 );
|
50 |
+
|
51 |
if ( $list === false ) {
|
52 |
return false;
|
53 |
}
|
lib/firewall.php
CHANGED
@@ -15,12 +15,19 @@
|
|
15 |
// | GNU General Public License for more details. |
|
16 |
// +---------------------------------------------------------------------+ sa
|
17 |
if ( strpos($_SERVER['SCRIPT_NAME'], '/nfwlog/') !== FALSE ||
|
18 |
-
strpos($_SERVER['SCRIPT_NAME'], '/ninjafirewall/') !== FALSE ) {
|
19 |
-
|
20 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
21 |
|
22 |
$nfw_ = array();
|
23 |
-
$nfw_['fw_starttime'] =
|
24 |
|
25 |
// Optional NinjaFirewall configuration file
|
26 |
// ( see https://blog.nintechnet.com/ninjafirewall-wp-edition-the-htninja-configuration-file/ ) :
|
@@ -1303,7 +1310,7 @@ function nfw_check_b64( $key, $string ) {
|
|
1303 |
$decoded = base64_decode($string);
|
1304 |
if ( strlen($decoded) < 4 ) { return; }
|
1305 |
|
1306 |
-
if ( preg_match( '`\b(?:\$?_(COOKIE|ENV|FILES|(?:GE|POS|REQUES)T|SE(RVER|SSION))|HTTP_(?:(?:POST|GET)_VARS|RAW_POST_DATA)|GLOBALS)\s*[=\[)]|\b(?i:array_map|assert|base64_(?:de|en)code|chmod|curl_exec|(?:ex|im)plode|error_reporting|eval|file(?:_get_contents)?|f(?:open|write|close)|fsockopen|function_exists|gzinflate|md5|move_uploaded_file|ob_start|passthru|[ep]reg_replace|phpinfo|stripslashes|strrev|(?:shell_)?exec|substr|system|unlink)\s*\(|[\s;]echo\s*[\'"]|<(?i:
|
1307 |
if ( $key === 'args' && ! defined('NFW_WPWAF') &&
|
1308 |
preg_match( '/^{"query":"SELECT/', $decoded ) &&
|
1309 |
strpos($_SERVER['SCRIPT_NAME'], '/jetpack-temp/jp-helper-') !== FALSE ) {
|
@@ -1505,8 +1512,9 @@ function nfw_log($loginfo, $logdata, $loglevel, $ruleid) {
|
|
1505 |
$encoding = '[hex:' . array_shift( $unp ) . ']';
|
1506 |
}
|
1507 |
|
|
|
1508 |
@file_put_contents( $log_file,
|
1509 |
-
$tmp . '[' . time() . '] ' . '[' .
|
1510 |
'[' . $_SERVER['SERVER_NAME'] . '] ' . '[#' . $nfw_['num_incident'] . '] ' .
|
1511 |
'[' . $ruleid . '] ' .
|
1512 |
'[' . $loglevel . '] ' . '[' . nfw_anonymize_ip() . '] ' .
|
@@ -1517,6 +1525,29 @@ function nfw_log($loginfo, $logdata, $loglevel, $ruleid) {
|
|
1517 |
|
1518 |
// =====================================================================
|
1519 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1520 |
function nfw_anonymize_ip() {
|
1521 |
|
1522 |
global $nfw_;
|
15 |
// | GNU General Public License for more details. |
|
16 |
// +---------------------------------------------------------------------+ sa
|
17 |
if ( strpos($_SERVER['SCRIPT_NAME'], '/nfwlog/') !== FALSE ||
|
18 |
+
strpos($_SERVER['SCRIPT_NAME'], '/ninjafirewall/') !== FALSE ) {
|
19 |
+
die('Forbidden');
|
20 |
+
}
|
21 |
+
if ( defined('NFW_STATUS') ) { return; }
|
22 |
+
if ( defined('WP_CLI') && WP_CLI && PHP_SAPI === 'cli' ) {
|
23 |
+
if (! defined('NFW_UWL') ) {
|
24 |
+
define('NFW_UWL', true);
|
25 |
+
}
|
26 |
+
return;
|
27 |
+
}
|
28 |
|
29 |
$nfw_ = array();
|
30 |
+
$nfw_['fw_starttime'] = nfw_fc_metrics('start');
|
31 |
|
32 |
// Optional NinjaFirewall configuration file
|
33 |
// ( see https://blog.nintechnet.com/ninjafirewall-wp-edition-the-htninja-configuration-file/ ) :
|
1310 |
$decoded = base64_decode($string);
|
1311 |
if ( strlen($decoded) < 4 ) { return; }
|
1312 |
|
1313 |
+
if ( preg_match( '`\b(?:\$?_(COOKIE|ENV|FILES|(?:GE|POS|REQUES)T|SE(RVER|SSION))|HTTP_(?:(?:POST|GET)_VARS|RAW_POST_DATA)|GLOBALS)\s*[=\[)]|\b(?i:array_map|assert|base64_(?:de|en)code|chmod|curl_exec|(?:ex|im)plode|error_reporting|eval|file(?:_get_contents)?|f(?:open|write|close)|fsockopen|function_exists|gzinflate|md5|move_uploaded_file|ob_start|passthru|[ep]reg_replace|phpinfo|stripslashes|strrev|(?:shell_)?exec|substr|system|unlink)\s*\(|[\s;]echo\s*[\'"]|<(?i:applet|embed|i?frame(?:set)?|marquee|object|script)\b|\W\$\{\s*[\'"]\w+[\'"]|<\?(?i:php|=)\s|(?i:(?:\b|\d)select\b.+?from\b.+?(?:\b|\d)where|(?:\b|\d)insert\b.+?into\b|(?:\b|\d)union\b.+?(?:\b|\d)select\b|(?:\b|\d)update\b.+?(?:\b|\d)set\b)|^.{0,25}[;{}]?\b[OC]:\d+:"[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*":\d+:{.*?}`', $decoded) ) {
|
1314 |
if ( $key === 'args' && ! defined('NFW_WPWAF') &&
|
1315 |
preg_match( '/^{"query":"SELECT/', $decoded ) &&
|
1316 |
strpos($_SERVER['SCRIPT_NAME'], '/jetpack-temp/jp-helper-') !== FALSE ) {
|
1512 |
$encoding = '[hex:' . array_shift( $unp ) . ']';
|
1513 |
}
|
1514 |
|
1515 |
+
$elapse = nfw_fc_metrics('stop', $nfw_['fw_starttime']);
|
1516 |
@file_put_contents( $log_file,
|
1517 |
+
$tmp . '[' . time() . '] ' . '[' . $elapse . '] ' .
|
1518 |
'[' . $_SERVER['SERVER_NAME'] . '] ' . '[#' . $nfw_['num_incident'] . '] ' .
|
1519 |
'[' . $ruleid . '] ' .
|
1520 |
'[' . $loglevel . '] ' . '[' . nfw_anonymize_ip() . '] ' .
|
1525 |
|
1526 |
// =====================================================================
|
1527 |
|
1528 |
+
function nfw_fc_metrics( $action = 'start', $starttime = 0 ) {
|
1529 |
+
|
1530 |
+
if ( function_exists('hrtime') ) {
|
1531 |
+
$metrics = 'hrtime';
|
1532 |
+
} else {
|
1533 |
+
$metrics = 'microtime';
|
1534 |
+
}
|
1535 |
+
|
1536 |
+
// Start chrono
|
1537 |
+
if ( $action == 'start') {
|
1538 |
+
return $metrics( true );
|
1539 |
+
}
|
1540 |
+
|
1541 |
+
// Stop chrono and return elapsed time
|
1542 |
+
if ( $metrics == 'hrtime') {
|
1543 |
+
return number_format( ( $metrics( true ) - $starttime ) / 1000000000, 5 );
|
1544 |
+
} else {
|
1545 |
+
return number_format( $metrics( true ) - $starttime, 5 );
|
1546 |
+
}
|
1547 |
+
}
|
1548 |
+
|
1549 |
+
// =====================================================================
|
1550 |
+
|
1551 |
function nfw_anonymize_ip() {
|
1552 |
|
1553 |
global $nfw_;
|
lib/fw_livelog.php
CHANGED
@@ -69,18 +69,19 @@ function fw_livelog_record() {
|
|
69 |
|
70 |
global $nfw_;
|
71 |
|
72 |
-
$nfw_['mtime']
|
|
|
73 |
|
74 |
// If the file was not accessed for more than 100s, we assume
|
75 |
// the admin has stopped using live log from WordPress
|
76 |
// dashboard (max refresh rate is 45s) :
|
77 |
-
if ( $
|
78 |
unlink($nfw_['log_dir'] .'/cache/livelogrun.php');
|
79 |
// If the log was not modified for the past 10mn, we delete it as well :
|
80 |
$nfw_['livelog'] = $nfw_['log_dir'] . '/cache/livelog.php';
|
81 |
if ( file_exists($nfw_['livelog']) ) {
|
82 |
$nfw_['mtime'] = filemtime($nfw_['livelog']);
|
83 |
-
if ( $
|
84 |
unlink( $nfw_['livelog'] );
|
85 |
}
|
86 |
}
|
69 |
|
70 |
global $nfw_;
|
71 |
|
72 |
+
$nfw_['mtime'] = filemtime($nfw_['log_dir'] .'/cache/livelogrun.php');
|
73 |
+
$now = time();
|
74 |
|
75 |
// If the file was not accessed for more than 100s, we assume
|
76 |
// the admin has stopped using live log from WordPress
|
77 |
// dashboard (max refresh rate is 45s) :
|
78 |
+
if ( $now - $nfw_['mtime'] > 100 ) {
|
79 |
unlink($nfw_['log_dir'] .'/cache/livelogrun.php');
|
80 |
// If the log was not modified for the past 10mn, we delete it as well :
|
81 |
$nfw_['livelog'] = $nfw_['log_dir'] . '/cache/livelog.php';
|
82 |
if ( file_exists($nfw_['livelog']) ) {
|
83 |
$nfw_['mtime'] = filemtime($nfw_['livelog']);
|
84 |
+
if ( $now - $nfw_['mtime'] > 600 ) {
|
85 |
unlink( $nfw_['livelog'] );
|
86 |
}
|
87 |
}
|
lib/monitoring_file_check.php
CHANGED
@@ -17,24 +17,25 @@
|
|
17 |
+---------------------------------------------------------------------+ i18n+ / sa / 2
|
18 |
*/
|
19 |
|
20 |
-
if (! defined(
|
21 |
|
22 |
-
$log_dir
|
23 |
-
$nfmon_snapshot
|
24 |
-
$nfmon_diff
|
25 |
-
$err
|
|
|
26 |
|
27 |
// Scheduled scan ?
|
28 |
if (defined('NFSCANDO') ) {
|
29 |
|
30 |
-
$snapproc =
|
31 |
-
$err = nf_sub_monitoring_scan($nfmon_snapshot, $nfmon_diff);
|
32 |
if (! empty( $err ) ) {
|
33 |
nfw_log_error( $err );
|
34 |
}
|
35 |
$nfw_options = nfw_get_option('nfw_options');
|
36 |
if (empty($nfw_options['enabled']) ) { return; }
|
37 |
-
$nfw_options['snapproc'] =
|
38 |
nfw_update_option('nfw_options', $nfw_options);
|
39 |
|
40 |
// Changes detected :
|
@@ -88,13 +89,13 @@ if (! empty($_REQUEST['nfw_act'])) {
|
|
88 |
$err = __('You must create a snapshot first.', 'ninjafirewall');
|
89 |
} else {
|
90 |
|
91 |
-
$snapproc =
|
92 |
$err = nf_sub_monitoring_scan($nfmon_snapshot, $nfmon_diff);
|
93 |
if (! empty( $err ) ) {
|
94 |
nfw_log_error( $err );
|
95 |
}
|
96 |
$nfw_options = nfw_get_option('nfw_options');
|
97 |
-
$nfw_options['snapproc'] =
|
98 |
nfw_update_option('nfw_options', $nfw_options);
|
99 |
|
100 |
if (! $err) {
|
@@ -519,7 +520,7 @@ function nf_sub_monitoring_create($nfmon_snapshot) {
|
|
519 |
}
|
520 |
|
521 |
@ini_set('max_execution_time', 0);
|
522 |
-
$snapproc =
|
523 |
|
524 |
if ($fh = fopen($nfmon_snapshot, 'w') ) {
|
525 |
fwrite($fh, '<?php die("Forbidden"); ?>' . "\n");
|
@@ -536,7 +537,7 @@ function nf_sub_monitoring_create($nfmon_snapshot) {
|
|
536 |
|
537 |
// Save scan dir :
|
538 |
$nfw_options = nfw_get_option('nfw_options');
|
539 |
-
$nfw_options['snapproc'] =
|
540 |
$nfw_options['snapexclude'] = $_POST['snapexclude'];
|
541 |
$nfw_options['snapdir'] = $_POST['snapdir'];
|
542 |
$nfw_options['snapnoslink'] = $snapnoslink;
|
@@ -789,5 +790,28 @@ function nf_scan_email($nfmon_diff, $log_dir) {
|
|
789 |
}
|
790 |
}
|
791 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
792 |
// ---------------------------------------------------------------------
|
793 |
// EOF
|
17 |
+---------------------------------------------------------------------+ i18n+ / sa / 2
|
18 |
*/
|
19 |
|
20 |
+
if (! defined('NFW_ENGINE_VERSION') ) { die('Forbidden'); }
|
21 |
|
22 |
+
$log_dir = NFW_LOG_DIR . '/nfwlog/cache/';
|
23 |
+
$nfmon_snapshot = $log_dir . 'nfilecheck_snapshot.php';
|
24 |
+
$nfmon_diff = $log_dir . 'nfilecheck_diff.php';
|
25 |
+
$err = '';
|
26 |
+
$success = '';
|
27 |
|
28 |
// Scheduled scan ?
|
29 |
if (defined('NFSCANDO') ) {
|
30 |
|
31 |
+
$snapproc = nf_fc_metrics('start');
|
32 |
+
$err = nf_sub_monitoring_scan($nfmon_snapshot, $nfmon_diff );
|
33 |
if (! empty( $err ) ) {
|
34 |
nfw_log_error( $err );
|
35 |
}
|
36 |
$nfw_options = nfw_get_option('nfw_options');
|
37 |
if (empty($nfw_options['enabled']) ) { return; }
|
38 |
+
$nfw_options['snapproc'] = nf_fc_metrics('stop', $snapproc );
|
39 |
nfw_update_option('nfw_options', $nfw_options);
|
40 |
|
41 |
// Changes detected :
|
89 |
$err = __('You must create a snapshot first.', 'ninjafirewall');
|
90 |
} else {
|
91 |
|
92 |
+
$snapproc = nf_fc_metrics('start');
|
93 |
$err = nf_sub_monitoring_scan($nfmon_snapshot, $nfmon_diff);
|
94 |
if (! empty( $err ) ) {
|
95 |
nfw_log_error( $err );
|
96 |
}
|
97 |
$nfw_options = nfw_get_option('nfw_options');
|
98 |
+
$nfw_options['snapproc'] = nf_fc_metrics('stop', $snapproc );
|
99 |
nfw_update_option('nfw_options', $nfw_options);
|
100 |
|
101 |
if (! $err) {
|
520 |
}
|
521 |
|
522 |
@ini_set('max_execution_time', 0);
|
523 |
+
$snapproc = nf_fc_metrics('start');
|
524 |
|
525 |
if ($fh = fopen($nfmon_snapshot, 'w') ) {
|
526 |
fwrite($fh, '<?php die("Forbidden"); ?>' . "\n");
|
537 |
|
538 |
// Save scan dir :
|
539 |
$nfw_options = nfw_get_option('nfw_options');
|
540 |
+
$nfw_options['snapproc'] = nf_fc_metrics('stop', $snapproc );
|
541 |
$nfw_options['snapexclude'] = $_POST['snapexclude'];
|
542 |
$nfw_options['snapdir'] = $_POST['snapdir'];
|
543 |
$nfw_options['snapnoslink'] = $snapnoslink;
|
790 |
}
|
791 |
}
|
792 |
|
793 |
+
// ---------------------------------------------------------------------
|
794 |
+
|
795 |
+
function nf_fc_metrics( $action = 'start', $starttime = 0 ) {
|
796 |
+
|
797 |
+
if ( function_exists('hrtime') ) {
|
798 |
+
$metrics = 'hrtime';
|
799 |
+
} else {
|
800 |
+
$metrics = 'microtime';
|
801 |
+
}
|
802 |
+
|
803 |
+
// Start chrono
|
804 |
+
if ( $action == 'start') {
|
805 |
+
return $metrics( true );
|
806 |
+
}
|
807 |
+
|
808 |
+
// Stop chrono and return elapsed time
|
809 |
+
if ( $metrics == 'hrtime') {
|
810 |
+
return number_format( ( $metrics( true ) - $starttime ) / 1000000000, 2 );
|
811 |
+
} else {
|
812 |
+
return number_format( $metrics( true ) - $starttime, 2 );
|
813 |
+
}
|
814 |
+
}
|
815 |
+
|
816 |
// ---------------------------------------------------------------------
|
817 |
// EOF
|
lib/utils.php
CHANGED
@@ -232,24 +232,18 @@ function nf_wp_insert_post_empty_content( $maybe_empty, $postarr ) {
|
|
232 |
$message.= 'REQUEST_URI: ' . $_SERVER['REQUEST_URI'] . "\n";
|
233 |
$message.= __('Date:', 'ninjafirewall') .' '. date_i18n('F j, Y @ H:i:s') . ' (UTC '. date('O') . ")\n\n";
|
234 |
|
235 |
-
// Attach PHP backtrace
|
236 |
-
$
|
237 |
-
|
238 |
-
$nftmpfname = NFW_LOG_DIR .'/nfwlog/backtrace_'. uniqid() .'.txt';
|
239 |
-
$dbg = debug_backtrace( $verbosity );
|
240 |
-
array_shift( $dbg );
|
241 |
-
file_put_contents( $nftmpfname, print_r( $dbg, true ) );
|
242 |
-
$message.= __('A PHP backtrace has been attached to this message for your convenience.', 'ninjafirewall') . "\n\n";
|
243 |
-
}
|
244 |
$message.= __('This protection (and notification) can be turned off from NinjaFirewall "Firewall Policies" page.', 'ninjafirewall') . "\n\n";
|
245 |
$message.= NF_PG_SIGNATURE ."\n\n". NF_PG_MORESEC ."\n";
|
246 |
-
if ( empty( $nftmpfname ) ) {
|
247 |
nfw_mail( $subject, $message, 'unsubscribe' );
|
248 |
|
249 |
} else {
|
250 |
// Attach backtrace and delete temp file:
|
251 |
-
nfw_mail( $subject, $message, 'unsubscribe', $headers = '', $nftmpfname );
|
252 |
-
unlink( $nftmpfname );
|
253 |
}
|
254 |
|
255 |
// Block it:
|
@@ -274,6 +268,7 @@ function nf_pre_delete_post( $delete, $post, $force_delete ) {
|
|
274 |
if ( isset( $_SESSION['nfw_goodguy'] ) || nfw_is_whitelisted() || empty( $nfw_options['enabled'] ) || empty( $nfw_options['disallow_publish'] ) ) {
|
275 |
return null;
|
276 |
}
|
|
|
277 |
if (! isset( $post->post_type ) || ! isset( $post->post_status ) || empty( $post->ID ) ) {
|
278 |
return null;
|
279 |
}
|
@@ -311,24 +306,18 @@ function nf_pre_delete_post( $delete, $post, $force_delete ) {
|
|
311 |
$message.= 'REQUEST_URI: ' . $_SERVER['REQUEST_URI'] . "\n";
|
312 |
$message.= __('Date:', 'ninjafirewall') .' '. date_i18n('F j, Y @ H:i:s') . ' (UTC '. date('O') . ")\n\n";
|
313 |
|
314 |
-
// Attach PHP backtrace
|
315 |
-
$
|
316 |
-
|
317 |
-
$nftmpfname = NFW_LOG_DIR .'/nfwlog/backtrace_'. uniqid() .'.txt';
|
318 |
-
$dbg = debug_backtrace( $verbosity );
|
319 |
-
array_shift( $dbg );
|
320 |
-
file_put_contents( $nftmpfname, print_r( $dbg, true ) );
|
321 |
-
$message.= __('A PHP backtrace has been attached to this message for your convenience.', 'ninjafirewall') . "\n\n";
|
322 |
-
}
|
323 |
$message.= __('This protection (and notification) can be turned off from NinjaFirewall "Firewall Policies" page.', 'ninjafirewall') . "\n\n";
|
324 |
$message.= NF_PG_SIGNATURE ."\n\n". NF_PG_MORESEC ."\n";
|
325 |
-
if ( empty( $nftmpfname ) ) {
|
326 |
nfw_mail( $subject, $message, 'unsubscribe' );
|
327 |
|
328 |
} else {
|
329 |
// Attach backtrace and delete temp file:
|
330 |
-
nfw_mail( $subject, $message, 'unsubscribe', $headers = '', $nftmpfname );
|
331 |
-
unlink( $nftmpfname );
|
332 |
}
|
333 |
|
334 |
// Block it:
|
@@ -427,24 +416,18 @@ function nfw_account_creation( $user_login ) {
|
|
427 |
$message.= 'REQUEST_URI: ' . $_SERVER['REQUEST_URI'] . "\n";
|
428 |
$message.= __('Date:', 'ninjafirewall') .' '. date_i18n('F j, Y @ H:i:s') . ' (UTC '. date('O') . ")\n\n";
|
429 |
|
430 |
-
// Attach PHP backtrace
|
431 |
-
$
|
432 |
-
|
433 |
-
$nftmpfname = NFW_LOG_DIR .'/nfwlog/backtrace_'. uniqid() .'.txt';
|
434 |
-
$dbg = debug_backtrace( $verbosity );
|
435 |
-
array_shift( $dbg );
|
436 |
-
file_put_contents( $nftmpfname, print_r( $dbg, true ) );
|
437 |
-
$message.= __('A PHP backtrace has been attached to this message for your convenience.', 'ninjafirewall') . "\n\n";
|
438 |
-
}
|
439 |
$message.= NF_PG_SIGNATURE ."\n\n". NF_PG_MORESEC;
|
440 |
|
441 |
-
if ( empty( $nftmpfname ) ) {
|
442 |
nfw_mail( $subject, $message, 'unsubscribe' );
|
443 |
|
444 |
} else {
|
445 |
// Attach backtrace and delete temp file:
|
446 |
-
nfw_mail( $subject, $message, 'unsubscribe', $headers = '', $nftmpfname );
|
447 |
-
unlink( $nftmpfname );
|
448 |
}
|
449 |
|
450 |
// Block it:
|
@@ -661,8 +644,11 @@ function nfw_garbage_collector() {
|
|
661 |
|
662 |
// ------------------------------------------------------------------
|
663 |
// Security updates
|
664 |
-
|
665 |
-
|
|
|
|
|
|
|
666 |
|
667 |
// ------------------------------------------------------------------
|
668 |
// Widget's security news prefetch
|
@@ -697,9 +683,13 @@ function nfw_fetch_secnews( $maxnews, $return = 1 ) {
|
|
697 |
'sslverify' => true
|
698 |
)
|
699 |
);
|
700 |
-
if ( is_wp_error( $res )
|
|
|
|
|
|
|
701 |
return $res['body'];
|
702 |
}
|
|
|
703 |
// Cache the data for 30 minutes
|
704 |
set_transient( 'nfw_widgetnews', $res['body'], 1800 );
|
705 |
}
|
@@ -1261,25 +1251,19 @@ function nfwhook_user_meta( $id, $key, $value ) {
|
|
1261 |
$message.= 'REQUEST_URI: ' . $_SERVER['REQUEST_URI'] . "\n";
|
1262 |
$message.= __('Date:', 'ninjafirewall') .' '. date_i18n('F j, Y @ H:i:s') . ' (UTC '. date('O') . ")\n\n";
|
1263 |
|
1264 |
-
// Attach PHP backtrace
|
1265 |
-
$
|
1266 |
-
|
1267 |
-
$nftmpfname = NFW_LOG_DIR .'/nfwlog/backtrace_'. uniqid() .'.txt';
|
1268 |
-
$dbg = debug_backtrace( $verbosity );
|
1269 |
-
array_shift( $dbg );
|
1270 |
-
file_put_contents( $nftmpfname, print_r( $dbg, true ) );
|
1271 |
-
$message.= __('A PHP backtrace has been attached to this message for your convenience.', 'ninjafirewall') . "\n\n";
|
1272 |
-
}
|
1273 |
$message.= __('This protection (and notification) can be turned off from NinjaFirewall "Firewall Policies" page.', 'ninjafirewall') . "\n\n";
|
1274 |
$message.= NF_PG_SIGNATURE ."\n\n". NF_PG_MORESEC;
|
1275 |
|
1276 |
-
if ( empty( $nftmpfname ) ) {
|
1277 |
nfw_mail( $subject, $message, 'unsubscribe' );
|
1278 |
|
1279 |
} else {
|
1280 |
// Attach backtrace and delete temp file:
|
1281 |
-
nfw_mail( $subject, $message, 'unsubscribe', $headers = '', $nftmpfname );
|
1282 |
-
unlink( $nftmpfname );
|
1283 |
}
|
1284 |
|
1285 |
// Block it:
|
@@ -1508,15 +1492,9 @@ function nf_monitor_options_alert( $option, $value, $old_value, $type ) {
|
|
1508 |
$message.= sprintf( __('Action taken: %s', 'ninjafirewall') ."\n\n", $action );
|
1509 |
}
|
1510 |
|
1511 |
-
// Attach PHP backtrace
|
1512 |
-
$
|
1513 |
-
|
1514 |
-
$nftmpfname = NFW_LOG_DIR .'/nfwlog/backtrace_'. uniqid() .'.txt';
|
1515 |
-
$dbg = debug_backtrace( $verbosity );
|
1516 |
-
array_shift( $dbg );
|
1517 |
-
file_put_contents( $nftmpfname, print_r( $dbg, true ) );
|
1518 |
-
$message.= __('A PHP backtrace has been attached to this message for your convenience.', 'ninjafirewall') . "\n\n";
|
1519 |
-
}
|
1520 |
|
1521 |
// Show current blog, not main site (multisite):
|
1522 |
$message.= __('Blog:', 'ninjafirewall') .' '. home_url('/') . "\n";
|
@@ -1528,13 +1506,13 @@ function nf_monitor_options_alert( $option, $value, $old_value, $type ) {
|
|
1528 |
$message.= __('This protection (and notification) can be turned off from NinjaFirewall "Firewall Policies" page.', 'ninjafirewall') . "\n\n";
|
1529 |
$message.= NF_PG_SIGNATURE ."\n\n". NF_PG_MORESEC;
|
1530 |
|
1531 |
-
if ( empty( $nftmpfname ) ) {
|
1532 |
nfw_mail( $subject, $message, 'unsubscribe' );
|
1533 |
|
1534 |
} else {
|
1535 |
// Attach backtrace and delete temp file:
|
1536 |
-
nfw_mail( $subject, $message, 'unsubscribe', $headers = '', $nftmpfname );
|
1537 |
-
unlink( $nftmpfname );
|
1538 |
}
|
1539 |
|
1540 |
}
|
@@ -1665,6 +1643,24 @@ function nfw_mail( $subject, $message, $unsubscribe = 0, $headers = '', $attachm
|
|
1665 |
}
|
1666 |
}
|
1667 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1668 |
// ---------------------------------------------------------------------
|
1669 |
// Activate WPWAF mode.
|
1670 |
|
232 |
$message.= 'REQUEST_URI: ' . $_SERVER['REQUEST_URI'] . "\n";
|
233 |
$message.= __('Date:', 'ninjafirewall') .' '. date_i18n('F j, Y @ H:i:s') . ' (UTC '. date('O') . ")\n\n";
|
234 |
|
235 |
+
// Attach PHP backtrace
|
236 |
+
$return = nfw_debug_backtrace( $nfw_options );
|
237 |
+
$message.= $return['message'];
|
|
|
|
|
|
|
|
|
|
|
|
|
238 |
$message.= __('This protection (and notification) can be turned off from NinjaFirewall "Firewall Policies" page.', 'ninjafirewall') . "\n\n";
|
239 |
$message.= NF_PG_SIGNATURE ."\n\n". NF_PG_MORESEC ."\n";
|
240 |
+
if ( empty( $return['nftmpfname'] ) ) {
|
241 |
nfw_mail( $subject, $message, 'unsubscribe' );
|
242 |
|
243 |
} else {
|
244 |
// Attach backtrace and delete temp file:
|
245 |
+
nfw_mail( $subject, $message, 'unsubscribe', $headers = '', $return['nftmpfname'] );
|
246 |
+
unlink( $return['nftmpfname'] );
|
247 |
}
|
248 |
|
249 |
// Block it:
|
268 |
if ( isset( $_SESSION['nfw_goodguy'] ) || nfw_is_whitelisted() || empty( $nfw_options['enabled'] ) || empty( $nfw_options['disallow_publish'] ) ) {
|
269 |
return null;
|
270 |
}
|
271 |
+
|
272 |
if (! isset( $post->post_type ) || ! isset( $post->post_status ) || empty( $post->ID ) ) {
|
273 |
return null;
|
274 |
}
|
306 |
$message.= 'REQUEST_URI: ' . $_SERVER['REQUEST_URI'] . "\n";
|
307 |
$message.= __('Date:', 'ninjafirewall') .' '. date_i18n('F j, Y @ H:i:s') . ' (UTC '. date('O') . ")\n\n";
|
308 |
|
309 |
+
// Attach PHP backtrace
|
310 |
+
$return = nfw_debug_backtrace( $nfw_options );
|
311 |
+
$message.= $return['message'];
|
|
|
|
|
|
|
|
|
|
|
|
|
312 |
$message.= __('This protection (and notification) can be turned off from NinjaFirewall "Firewall Policies" page.', 'ninjafirewall') . "\n\n";
|
313 |
$message.= NF_PG_SIGNATURE ."\n\n". NF_PG_MORESEC ."\n";
|
314 |
+
if ( empty( $return['nftmpfname'] ) ) {
|
315 |
nfw_mail( $subject, $message, 'unsubscribe' );
|
316 |
|
317 |
} else {
|
318 |
// Attach backtrace and delete temp file:
|
319 |
+
nfw_mail( $subject, $message, 'unsubscribe', $headers = '', $return['nftmpfname'] );
|
320 |
+
unlink( $return['nftmpfname'] );
|
321 |
}
|
322 |
|
323 |
// Block it:
|
416 |
$message.= 'REQUEST_URI: ' . $_SERVER['REQUEST_URI'] . "\n";
|
417 |
$message.= __('Date:', 'ninjafirewall') .' '. date_i18n('F j, Y @ H:i:s') . ' (UTC '. date('O') . ")\n\n";
|
418 |
|
419 |
+
// Attach PHP backtrace
|
420 |
+
$return = nfw_debug_backtrace( $nfw_options );
|
421 |
+
$message.= $return['message'];
|
|
|
|
|
|
|
|
|
|
|
|
|
422 |
$message.= NF_PG_SIGNATURE ."\n\n". NF_PG_MORESEC;
|
423 |
|
424 |
+
if ( empty( $return['nftmpfname'] ) ) {
|
425 |
nfw_mail( $subject, $message, 'unsubscribe' );
|
426 |
|
427 |
} else {
|
428 |
// Attach backtrace and delete temp file:
|
429 |
+
nfw_mail( $subject, $message, 'unsubscribe', $headers = '', $return['nftmpfname'] );
|
430 |
+
unlink( $return['nftmpfname'] );
|
431 |
}
|
432 |
|
433 |
// Block it:
|
644 |
|
645 |
// ------------------------------------------------------------------
|
646 |
// Security updates
|
647 |
+
$nfw_fetchsecupdates = get_transient( 'nfw_fetchsecupdates' );
|
648 |
+
if ( $nfw_fetchsecupdates === false ) {
|
649 |
+
require __DIR__ .'/event_updates.php';
|
650 |
+
nfw_check_security_updates();
|
651 |
+
}
|
652 |
|
653 |
// ------------------------------------------------------------------
|
654 |
// Widget's security news prefetch
|
683 |
'sslverify' => true
|
684 |
)
|
685 |
);
|
686 |
+
if ( is_wp_error( $res ) ) {
|
687 |
+
return $res->get_error_message();
|
688 |
+
}
|
689 |
+
if ( $res['response']['code'] != 200 ) {
|
690 |
return $res['body'];
|
691 |
}
|
692 |
+
|
693 |
// Cache the data for 30 minutes
|
694 |
set_transient( 'nfw_widgetnews', $res['body'], 1800 );
|
695 |
}
|
1251 |
$message.= 'REQUEST_URI: ' . $_SERVER['REQUEST_URI'] . "\n";
|
1252 |
$message.= __('Date:', 'ninjafirewall') .' '. date_i18n('F j, Y @ H:i:s') . ' (UTC '. date('O') . ")\n\n";
|
1253 |
|
1254 |
+
// Attach PHP backtrace
|
1255 |
+
$return = nfw_debug_backtrace( $nfw_options );
|
1256 |
+
$message.= $return['message'];
|
|
|
|
|
|
|
|
|
|
|
|
|
1257 |
$message.= __('This protection (and notification) can be turned off from NinjaFirewall "Firewall Policies" page.', 'ninjafirewall') . "\n\n";
|
1258 |
$message.= NF_PG_SIGNATURE ."\n\n". NF_PG_MORESEC;
|
1259 |
|
1260 |
+
if ( empty( $return['nftmpfname'] ) ) {
|
1261 |
nfw_mail( $subject, $message, 'unsubscribe' );
|
1262 |
|
1263 |
} else {
|
1264 |
// Attach backtrace and delete temp file:
|
1265 |
+
nfw_mail( $subject, $message, 'unsubscribe', $headers = '', $return['nftmpfname'] );
|
1266 |
+
unlink( $return['nftmpfname'] );
|
1267 |
}
|
1268 |
|
1269 |
// Block it:
|
1492 |
$message.= sprintf( __('Action taken: %s', 'ninjafirewall') ."\n\n", $action );
|
1493 |
}
|
1494 |
|
1495 |
+
// Attach PHP backtrace
|
1496 |
+
$return = nfw_debug_backtrace( $nfw_options );
|
1497 |
+
$message.= $return['message'];
|
|
|
|
|
|
|
|
|
|
|
|
|
1498 |
|
1499 |
// Show current blog, not main site (multisite):
|
1500 |
$message.= __('Blog:', 'ninjafirewall') .' '. home_url('/') . "\n";
|
1506 |
$message.= __('This protection (and notification) can be turned off from NinjaFirewall "Firewall Policies" page.', 'ninjafirewall') . "\n\n";
|
1507 |
$message.= NF_PG_SIGNATURE ."\n\n". NF_PG_MORESEC;
|
1508 |
|
1509 |
+
if ( empty( $return['nftmpfname'] ) ) {
|
1510 |
nfw_mail( $subject, $message, 'unsubscribe' );
|
1511 |
|
1512 |
} else {
|
1513 |
// Attach backtrace and delete temp file:
|
1514 |
+
nfw_mail( $subject, $message, 'unsubscribe', $headers = '', $return['nftmpfname'] );
|
1515 |
+
unlink( $return['nftmpfname'] );
|
1516 |
}
|
1517 |
|
1518 |
}
|
1643 |
}
|
1644 |
}
|
1645 |
|
1646 |
+
// ---------------------------------------------------------------------
|
1647 |
+
// Attach a backtrace if required.
|
1648 |
+
|
1649 |
+
function nfw_debug_backtrace( $nfw_options ) {
|
1650 |
+
|
1651 |
+
$return = array();
|
1652 |
+
$return['message'] = '';
|
1653 |
+
$verbosity = nfw_verbosity( $nfw_options );
|
1654 |
+
if ( $verbosity !== false ) {
|
1655 |
+
$return['nftmpfname'] = NFW_LOG_DIR .'/nfwlog/backtrace_'. bin2hex( random_bytes( 8 ) ) .'.txt';
|
1656 |
+
$dbg = debug_backtrace( $verbosity );
|
1657 |
+
array_shift( $dbg );
|
1658 |
+
file_put_contents( $return['nftmpfname'], print_r( $dbg, true ) );
|
1659 |
+
$return['message'] = __('A PHP backtrace has been attached to this message for your convenience.', 'ninjafirewall') . "\n\n";
|
1660 |
+
}
|
1661 |
+
return $return;
|
1662 |
+
}
|
1663 |
+
|
1664 |
// ---------------------------------------------------------------------
|
1665 |
// Activate WPWAF mode.
|
1666 |
|
ninjafirewall.php
CHANGED
@@ -3,7 +3,7 @@
|
|
3 |
Plugin Name: NinjaFirewall (WP Edition)
|
4 |
Plugin URI: https://nintechnet.com/
|
5 |
Description: A true Web Application Firewall to protect and secure WordPress.
|
6 |
-
Version: 4.5
|
7 |
Author: The Ninja Technologies Network
|
8 |
Author URI: https://nintechnet.com/
|
9 |
License: GPLv3 or later
|
@@ -19,7 +19,7 @@ Domain Path: /languages
|
|
19 |
| (c) NinTechNet - https://nintechnet.com/ |
|
20 |
+---------------------------------------------------------------------+
|
21 |
*/
|
22 |
-
define(
|
23 |
/*
|
24 |
+---------------------------------------------------------------------+
|
25 |
| This program is free software: you can redistribute it and/or |
|
@@ -34,7 +34,7 @@ define( 'NFW_ENGINE_VERSION', '4.5' );
|
|
34 |
+---------------------------------------------------------------------+
|
35 |
*/
|
36 |
|
37 |
-
if (! defined(
|
38 |
|
39 |
/* ------------------------------------------------------------------ */
|
40 |
|
@@ -42,15 +42,15 @@ function nfw_load_txtdomain() {
|
|
42 |
|
43 |
if ( defined('NFW_NOI18N') ) { return; }
|
44 |
|
45 |
-
unload_textdomain(
|
46 |
-
$nf_locale = array(
|
47 |
$this_user_locale = get_user_locale();
|
48 |
if ( in_array( $this_user_locale, $nf_locale ) ) {
|
49 |
-
if ( file_exists( __DIR__ ."/languages/ninjafirewall-{$this_user_locale}.mo"
|
50 |
-
load_textdomain(
|
51 |
}
|
52 |
-
} elseif ( file_exists( WP_LANG_DIR ."/plugins/ninjafirewall-{$this_user_locale}.mo"
|
53 |
-
load_textdomain(
|
54 |
}
|
55 |
}
|
56 |
add_action('plugins_loaded','nfw_load_txtdomain');
|
@@ -134,12 +134,20 @@ add_action( 'nfwgccron', 'nfw_garbage_collector' );
|
|
134 |
|
135 |
function nfw_activate() {
|
136 |
|
137 |
-
//
|
138 |
-
|
139 |
-
|
|
|
140 |
}
|
141 |
|
142 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
143 |
|
144 |
global $wp_version;
|
145 |
if ( version_compare( $wp_version, '4.7.0', '<' ) ) {
|
@@ -158,10 +166,6 @@ function nfw_activate() {
|
|
158 |
exit( esc_html__('You have SAFE_MODE enabled. Please disable it, it is deprecated as of PHP 5.3.0 (see http://php.net/safe-mode).', 'ninjafirewall'));
|
159 |
}
|
160 |
|
161 |
-
if ( ( is_multisite() ) && (! current_user_can( 'manage_network' ) ) ) {
|
162 |
-
exit( esc_html__('You are not allowed to activate NinjaFirewall.', 'ninjafirewall') );
|
163 |
-
}
|
164 |
-
|
165 |
if ( PATH_SEPARATOR == ';' ) {
|
166 |
exit( esc_html__('NinjaFirewall is not compatible with Microsoft Windows.', 'ninjafirewall') );
|
167 |
}
|
@@ -202,14 +206,30 @@ register_activation_hook( __FILE__, 'nfw_activate' );
|
|
202 |
|
203 |
function nfw_deactivate() {
|
204 |
|
205 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
206 |
|
207 |
$nfw_options = nfw_get_option( 'nfw_options' );
|
208 |
|
209 |
// Reused from Firewall Options
|
210 |
if ( empty( $_REQUEST['action'] ) || strpos( $_REQUEST['action'], 'deactivate' ) === false ) {
|
211 |
-
global $current_user;
|
212 |
-
$current_user = wp_get_current_user();
|
213 |
$subject = __('[NinjaFirewall] Alert: Firewall is disabled', 'ninjafirewall');
|
214 |
if ( is_multisite() ) {
|
215 |
$url = __('-Blog :', 'ninjafirewall') .' '. network_home_url('/') . "\n\n";
|
@@ -217,7 +237,7 @@ function nfw_deactivate() {
|
|
217 |
$url = __('-Blog :', 'ninjafirewall') .' '. home_url('/') . "\n\n";
|
218 |
}
|
219 |
$message = __('Someone disabled NinjaFirewall from your WordPress admin dashboard:', 'ninjafirewall') . "\n\n";
|
220 |
-
$message .= __('-User :', 'ninjafirewall') .
|
221 |
__('-IP :', 'ninjafirewall') .' '. NFW_REMOTE_ADDR . "\n" .
|
222 |
__('-Date :', 'ninjafirewall') .' '. ucfirst( date_i18n('F j, Y @ H:i:s O') ) ."\n" .
|
223 |
$url .
|
@@ -284,7 +304,10 @@ function nfw_load_ext( $hook ) {
|
|
284 |
'nfw_charts',
|
285 |
plugin_dir_url( __FILE__ ) . 'static/chart.min.js',
|
286 |
array( 'jquery' ),
|
287 |
-
NFW_ENGINE_VERSION
|
|
|
|
|
|
|
288 |
);
|
289 |
}
|
290 |
|
3 |
Plugin Name: NinjaFirewall (WP Edition)
|
4 |
Plugin URI: https://nintechnet.com/
|
5 |
Description: A true Web Application Firewall to protect and secure WordPress.
|
6 |
+
Version: 4.5.1
|
7 |
Author: The Ninja Technologies Network
|
8 |
Author URI: https://nintechnet.com/
|
9 |
License: GPLv3 or later
|
19 |
| (c) NinTechNet - https://nintechnet.com/ |
|
20 |
+---------------------------------------------------------------------+
|
21 |
*/
|
22 |
+
define('NFW_ENGINE_VERSION', '4.5.1');
|
23 |
/*
|
24 |
+---------------------------------------------------------------------+
|
25 |
| This program is free software: you can redistribute it and/or |
|
34 |
+---------------------------------------------------------------------+
|
35 |
*/
|
36 |
|
37 |
+
if (! defined('ABSPATH') ) { die('Forbidden'); }
|
38 |
|
39 |
/* ------------------------------------------------------------------ */
|
40 |
|
42 |
|
43 |
if ( defined('NFW_NOI18N') ) { return; }
|
44 |
|
45 |
+
unload_textdomain('ninjafirewall');
|
46 |
+
$nf_locale = array('fr_FR');
|
47 |
$this_user_locale = get_user_locale();
|
48 |
if ( in_array( $this_user_locale, $nf_locale ) ) {
|
49 |
+
if ( file_exists( __DIR__ ."/languages/ninjafirewall-{$this_user_locale}.mo") ) {
|
50 |
+
load_textdomain('ninjafirewall', __DIR__ ."/languages/ninjafirewall-{$this_user_locale}.mo");
|
51 |
}
|
52 |
+
} elseif ( file_exists( WP_LANG_DIR ."/plugins/ninjafirewall-{$this_user_locale}.mo") ) {
|
53 |
+
load_textdomain('ninjafirewall', WP_LANG_DIR ."/plugins/ninjafirewall-{$this_user_locale}.mo");
|
54 |
}
|
55 |
}
|
56 |
add_action('plugins_loaded','nfw_load_txtdomain');
|
134 |
|
135 |
function nfw_activate() {
|
136 |
|
137 |
+
// Install/activate NinjaFirewall
|
138 |
+
|
139 |
+
if ( defined('WP_CLI') && WP_CLI && PHP_SAPI === 'cli' ) {
|
140 |
+
$php_cli = true;
|
141 |
}
|
142 |
|
143 |
+
if (! isset( $php_cli ) ) {
|
144 |
+
// Warn if the user does not have the 'unfiltered_html' capability:
|
145 |
+
if (! current_user_can('unfiltered_html') ) {
|
146 |
+
exit( esc_html__('You do not have "unfiltered_html" capability. Please enable it in order to run NinjaFirewall (or make sure you do not have "DISALLOW_UNFILTERED_HTML" in your wp-config.php script).', 'ninjafirewall'));
|
147 |
+
}
|
148 |
+
|
149 |
+
nf_not_allowed( 'block', __LINE__ );
|
150 |
+
}
|
151 |
|
152 |
global $wp_version;
|
153 |
if ( version_compare( $wp_version, '4.7.0', '<' ) ) {
|
166 |
exit( esc_html__('You have SAFE_MODE enabled. Please disable it, it is deprecated as of PHP 5.3.0 (see http://php.net/safe-mode).', 'ninjafirewall'));
|
167 |
}
|
168 |
|
|
|
|
|
|
|
|
|
169 |
if ( PATH_SEPARATOR == ';' ) {
|
170 |
exit( esc_html__('NinjaFirewall is not compatible with Microsoft Windows.', 'ninjafirewall') );
|
171 |
}
|
206 |
|
207 |
function nfw_deactivate() {
|
208 |
|
209 |
+
if ( defined('WP_CLI') && WP_CLI && PHP_SAPI === 'cli' ) {
|
210 |
+
$php_cli = true;
|
211 |
+
}
|
212 |
+
|
213 |
+
if (! isset( $php_cli ) ) {
|
214 |
+
// Warn if the user does not have the 'unfiltered_html' capability:
|
215 |
+
if (! current_user_can( 'unfiltered_html' ) ) {
|
216 |
+
exit( esc_html__('You do not have "unfiltered_html" capability. Please enable it in order to run NinjaFirewall (or make sure you do not have "DISALLOW_UNFILTERED_HTML" in your wp-config.php script).', 'ninjafirewall'));
|
217 |
+
}
|
218 |
+
nf_not_allowed( 'block', __LINE__ );
|
219 |
+
|
220 |
+
global $current_user;
|
221 |
+
$current_user = wp_get_current_user();
|
222 |
+
$user_login = $current_user->user_login;
|
223 |
+
$user_roles = $current_user->roles[0];
|
224 |
+
} else {
|
225 |
+
$user_login = 'WP CLI';
|
226 |
+
$user_roles = '-';
|
227 |
+
}
|
228 |
|
229 |
$nfw_options = nfw_get_option( 'nfw_options' );
|
230 |
|
231 |
// Reused from Firewall Options
|
232 |
if ( empty( $_REQUEST['action'] ) || strpos( $_REQUEST['action'], 'deactivate' ) === false ) {
|
|
|
|
|
233 |
$subject = __('[NinjaFirewall] Alert: Firewall is disabled', 'ninjafirewall');
|
234 |
if ( is_multisite() ) {
|
235 |
$url = __('-Blog :', 'ninjafirewall') .' '. network_home_url('/') . "\n\n";
|
237 |
$url = __('-Blog :', 'ninjafirewall') .' '. home_url('/') . "\n\n";
|
238 |
}
|
239 |
$message = __('Someone disabled NinjaFirewall from your WordPress admin dashboard:', 'ninjafirewall') . "\n\n";
|
240 |
+
$message .= __('-User :', 'ninjafirewall') ." $user_login ($user_roles)\n" .
|
241 |
__('-IP :', 'ninjafirewall') .' '. NFW_REMOTE_ADDR . "\n" .
|
242 |
__('-Date :', 'ninjafirewall') .' '. ucfirst( date_i18n('F j, Y @ H:i:s O') ) ."\n" .
|
243 |
$url .
|
304 |
'nfw_charts',
|
305 |
plugin_dir_url( __FILE__ ) . 'static/chart.min.js',
|
306 |
array( 'jquery' ),
|
307 |
+
NFW_ENGINE_VERSION,
|
308 |
+
// We load it in the footer, because some plugins loads it too
|
309 |
+
// on every pages and that could mess with our pages
|
310 |
+
true
|
311 |
);
|
312 |
}
|
313 |
|
readme.txt
CHANGED
@@ -1,9 +1,9 @@
|
|
1 |
=== NinjaFirewall (WP Edition) - Advanced Security Plugin and Firewall ===
|
2 |
Contributors: nintechnet, bruandet
|
3 |
-
Tags: security, firewall, malware, protection, hack, antispam,
|
4 |
Requires at least: 4.7
|
5 |
Tested up to: 5.9
|
6 |
-
Stable tag: 4.5
|
7 |
Requires PHP: 5.5
|
8 |
License: GPLv3 or later
|
9 |
License URI: http://www.gnu.org/licenses/gpl-3.0.html
|
@@ -208,6 +208,19 @@ WordPress Sicherheit Plugin.
|
|
208 |
|
209 |
Need more security? Take the time to explore our supercharged Premium edition: [NinjaFirewall WP+ Edition](https://nintechnet.com/ninjafirewall/wp-edition/?comparison)
|
210 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
211 |
= 4.5 =
|
212 |
|
213 |
* Added the possibility to enter custom HTTP response headers. See "Firewall Policies > Advanced Policies > HTTP response headers > Custom HTTP headers".
|
1 |
=== NinjaFirewall (WP Edition) - Advanced Security Plugin and Firewall ===
|
2 |
Contributors: nintechnet, bruandet
|
3 |
+
Tags: security, firewall, malware, virus, protection, hack, antispam, scanner, hacked site, brute force, seguridad, seguranca, sicherheit, sicurezza, veiligheid, classicpress
|
4 |
Requires at least: 4.7
|
5 |
Tested up to: 5.9
|
6 |
+
Stable tag: 4.5.1
|
7 |
Requires PHP: 5.5
|
8 |
License: GPLv3 or later
|
9 |
License URI: http://www.gnu.org/licenses/gpl-3.0.html
|
208 |
|
209 |
Need more security? Take the time to explore our supercharged Premium edition: [NinjaFirewall WP+ Edition](https://nintechnet.com/ninjafirewall/wp-edition/?comparison)
|
210 |
|
211 |
+
= 4.5.1 =
|
212 |
+
|
213 |
+
* Fixed a PHP "Cannot use object of type WP_Error as array" error.
|
214 |
+
* Activating/deactivating NinjaFirewall from WP CLI doesn't require the `--user` parameter anymore.
|
215 |
+
* On websites running PHP 7.3 or above, NinjaFirewall will use the hrtime() function instead of microtime() for its metrics, because it is more reliable as it is not based on the internal system clock.
|
216 |
+
* WP+ Edition (Premium): Fixed a bug with right-to-left (RTL) WordPress sites where the checkboxes below the log were all messed up.
|
217 |
+
* The detection of base64-encoded injection has been slightly tweaked to lower the risk of false positives.
|
218 |
+
* WP+ Edition (Premium): The Bot Access Control input now accepts the following 6 additional characters: `( ) , ; ' "`.
|
219 |
+
* The "Monthly Statistics" graph and tooltip colours were improved.
|
220 |
+
* Updated Charts.js library.
|
221 |
+
* Small fixes and adjustments.
|
222 |
+
* WP+ Edition (Premium): Updated GeoIP databases.
|
223 |
+
|
224 |
= 4.5 =
|
225 |
|
226 |
* Added the possibility to enter custom HTTP response headers. See "Firewall Policies > Advanced Policies > HTTP response headers > Custom HTTP headers".
|
static/chart.min.js
CHANGED
@@ -1,7 +1,7 @@
|
|
1 |
/*!
|
2 |
-
* Chart.js v3.7.
|
3 |
* https://www.chartjs.org
|
4 |
-
* (c)
|
5 |
* Released under the MIT License
|
6 |
*/
|
7 |
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Chart=e()}(this,(function(){"use strict";const t="undefined"==typeof window?function(t){return t()}:window.requestAnimationFrame;function e(e,i,s){const n=s||(t=>Array.prototype.slice.call(t));let o=!1,a=[];return function(...s){a=n(s),o||(o=!0,t.call(window,(()=>{o=!1,e.apply(i,a)})))}}function i(t,e){let i;return function(...s){return e?(clearTimeout(i),i=setTimeout(t,e,s)):t.apply(this,s),e}}const s=t=>"start"===t?"left":"end"===t?"right":"center",n=(t,e,i)=>"start"===t?e:"end"===t?i:(e+i)/2,o=(t,e,i,s)=>t===(s?"left":"right")?i:"center"===t?(e+i)/2:e;var a=new class{constructor(){this._request=null,this._charts=new Map,this._running=!1,this._lastDate=void 0}_notify(t,e,i,s){const n=e.listeners[s],o=e.duration;n.forEach((s=>s({chart:t,initial:e.initial,numSteps:o,currentStep:Math.min(i-e.start,o)})))}_refresh(){this._request||(this._running=!0,this._request=t.call(window,(()=>{this._update(),this._request=null,this._running&&this._refresh()})))}_update(t=Date.now()){let e=0;this._charts.forEach(((i,s)=>{if(!i.running||!i.items.length)return;const n=i.items;let o,a=n.length-1,r=!1;for(;a>=0;--a)o=n[a],o._active?(o._total>i.duration&&(i.duration=o._total),o.tick(t),r=!0):(n[a]=n[n.length-1],n.pop());r&&(s.draw(),this._notify(s,i,t,"progress")),n.length||(i.running=!1,this._notify(s,i,t,"complete"),i.initial=!1),e+=n.length})),this._lastDate=t,0===e&&(this._running=!1)}_getAnims(t){const e=this._charts;let i=e.get(t);return i||(i={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},e.set(t,i)),i}listen(t,e,i){this._getAnims(t).listeners[e].push(i)}add(t,e){e&&e.length&&this._getAnims(t).items.push(...e)}has(t){return this._getAnims(t).items.length>0}start(t){const e=this._charts.get(t);e&&(e.running=!0,e.start=Date.now(),e.duration=e.items.reduce(((t,e)=>Math.max(t,e._duration)),0),this._refresh())}running(t){if(!this._running)return!1;const e=this._charts.get(t);return!!(e&&e.running&&e.items.length)}stop(t){const e=this._charts.get(t);if(!e||!e.items.length)return;const i=e.items;let s=i.length-1;for(;s>=0;--s)i[s].cancel();e.items=[],this._notify(t,e,Date.now(),"complete")}remove(t){return this._charts.delete(t)}};
|
@@ -10,4 +10,4 @@
|
|
10 |
* https://github.com/kurkle/color#readme
|
11 |
* (c) 2020 Jukka Kurkela
|
12 |
* Released under the MIT License
|
13 |
-
*/const r={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,a:10,b:11,c:12,d:13,e:14,f:15},l="0123456789ABCDEF",h=t=>l[15&t],c=t=>l[(240&t)>>4]+l[15&t],d=t=>(240&t)>>4==(15&t);function u(t){var e=function(t){return d(t.r)&&d(t.g)&&d(t.b)&&d(t.a)}(t)?h:c;return t?"#"+e(t.r)+e(t.g)+e(t.b)+(t.a<255?e(t.a):""):t}function f(t){return t+.5|0}const g=(t,e,i)=>Math.max(Math.min(t,i),e);function p(t){return g(f(2.55*t),0,255)}function m(t){return g(f(255*t),0,255)}function x(t){return g(f(t/2.55)/100,0,1)}function b(t){return g(f(100*t),0,100)}const _=/^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/;const y=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function v(t,e,i){const s=e*Math.min(i,1-i),n=(e,n=(e+t/30)%12)=>i-s*Math.max(Math.min(n-3,9-n,1),-1);return[n(0),n(8),n(4)]}function w(t,e,i){const s=(s,n=(s+t/60)%6)=>i-i*e*Math.max(Math.min(n,4-n,1),0);return[s(5),s(3),s(1)]}function M(t,e,i){const s=v(t,1,.5);let n;for(e+i>1&&(n=1/(e+i),e*=n,i*=n),n=0;n<3;n++)s[n]*=1-e-i,s[n]+=e;return s}function k(t){const e=t.r/255,i=t.g/255,s=t.b/255,n=Math.max(e,i,s),o=Math.min(e,i,s),a=(n+o)/2;let r,l,h;return n!==o&&(h=n-o,l=a>.5?h/(2-n-o):h/(n+o),r=n===e?(i-s)/h+(i<s?6:0):n===i?(s-e)/h+2:(e-i)/h+4,r=60*r+.5),[0|r,l||0,a]}function S(t,e,i,s){return(Array.isArray(e)?t(e[0],e[1],e[2]):t(e,i,s)).map(m)}function P(t,e,i){return S(v,t,e,i)}function D(t){return(t%360+360)%360}function C(t){const e=y.exec(t);let i,s=255;if(!e)return;e[5]!==i&&(s=e[6]?p(+e[5]):m(+e[5]));const n=D(+e[2]),o=+e[3]/100,a=+e[4]/100;return i="hwb"===e[1]?function(t,e,i){return S(M,t,e,i)}(n,o,a):"hsv"===e[1]?function(t,e,i){return S(w,t,e,i)}(n,o,a):P(n,o,a),{r:i[0],g:i[1],b:i[2],a:s}}const O={x:"dark",Z:"light",Y:"re",X:"blu",W:"gr",V:"medium",U:"slate",A:"ee",T:"ol",S:"or",B:"ra",C:"lateg",D:"ights",R:"in",Q:"turquois",E:"hi",P:"ro",O:"al",N:"le",M:"de",L:"yello",F:"en",K:"ch",G:"arks",H:"ea",I:"ightg",J:"wh"},A={OiceXe:"f0f8ff",antiquewEte:"faebd7",aqua:"ffff",aquamarRe:"7fffd4",azuY:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"0",blanKedOmond:"ffebcd",Xe:"ff",XeviTet:"8a2be2",bPwn:"a52a2a",burlywood:"deb887",caMtXe:"5f9ea0",KartYuse:"7fff00",KocTate:"d2691e",cSO:"ff7f50",cSnflowerXe:"6495ed",cSnsilk:"fff8dc",crimson:"dc143c",cyan:"ffff",xXe:"8b",xcyan:"8b8b",xgTMnPd:"b8860b",xWay:"a9a9a9",xgYF:"6400",xgYy:"a9a9a9",xkhaki:"bdb76b",xmagFta:"8b008b",xTivegYF:"556b2f",xSange:"ff8c00",xScEd:"9932cc",xYd:"8b0000",xsOmon:"e9967a",xsHgYF:"8fbc8f",xUXe:"483d8b",xUWay:"2f4f4f",xUgYy:"2f4f4f",xQe:"ced1",xviTet:"9400d3",dAppRk:"ff1493",dApskyXe:"bfff",dimWay:"696969",dimgYy:"696969",dodgerXe:"1e90ff",fiYbrick:"b22222",flSOwEte:"fffaf0",foYstWAn:"228b22",fuKsia:"ff00ff",gaRsbSo:"dcdcdc",ghostwEte:"f8f8ff",gTd:"ffd700",gTMnPd:"daa520",Way:"808080",gYF:"8000",gYFLw:"adff2f",gYy:"808080",honeyMw:"f0fff0",hotpRk:"ff69b4",RdianYd:"cd5c5c",Rdigo:"4b0082",ivSy:"fffff0",khaki:"f0e68c",lavFMr:"e6e6fa",lavFMrXsh:"fff0f5",lawngYF:"7cfc00",NmoncEffon:"fffacd",ZXe:"add8e6",ZcSO:"f08080",Zcyan:"e0ffff",ZgTMnPdLw:"fafad2",ZWay:"d3d3d3",ZgYF:"90ee90",ZgYy:"d3d3d3",ZpRk:"ffb6c1",ZsOmon:"ffa07a",ZsHgYF:"20b2aa",ZskyXe:"87cefa",ZUWay:"778899",ZUgYy:"778899",ZstAlXe:"b0c4de",ZLw:"ffffe0",lime:"ff00",limegYF:"32cd32",lRF:"faf0e6",magFta:"ff00ff",maPon:"800000",VaquamarRe:"66cdaa",VXe:"cd",VScEd:"ba55d3",VpurpN:"9370db",VsHgYF:"3cb371",VUXe:"7b68ee",VsprRggYF:"fa9a",VQe:"48d1cc",VviTetYd:"c71585",midnightXe:"191970",mRtcYam:"f5fffa",mistyPse:"ffe4e1",moccasR:"ffe4b5",navajowEte:"ffdead",navy:"80",Tdlace:"fdf5e6",Tive:"808000",TivedBb:"6b8e23",Sange:"ffa500",SangeYd:"ff4500",ScEd:"da70d6",pOegTMnPd:"eee8aa",pOegYF:"98fb98",pOeQe:"afeeee",pOeviTetYd:"db7093",papayawEp:"ffefd5",pHKpuff:"ffdab9",peru:"cd853f",pRk:"ffc0cb",plum:"dda0dd",powMrXe:"b0e0e6",purpN:"800080",YbeccapurpN:"663399",Yd:"ff0000",Psybrown:"bc8f8f",PyOXe:"4169e1",saddNbPwn:"8b4513",sOmon:"fa8072",sandybPwn:"f4a460",sHgYF:"2e8b57",sHshell:"fff5ee",siFna:"a0522d",silver:"c0c0c0",skyXe:"87ceeb",UXe:"6a5acd",UWay:"708090",UgYy:"708090",snow:"fffafa",sprRggYF:"ff7f",stAlXe:"4682b4",tan:"d2b48c",teO:"8080",tEstN:"d8bfd8",tomato:"ff6347",Qe:"40e0d0",viTet:"ee82ee",JHt:"f5deb3",wEte:"ffffff",wEtesmoke:"f5f5f5",Lw:"ffff00",LwgYF:"9acd32"};let T;function L(t){T||(T=function(){const t={},e=Object.keys(A),i=Object.keys(O);let s,n,o,a,r;for(s=0;s<e.length;s++){for(a=r=e[s],n=0;n<i.length;n++)o=i[n],r=r.replace(o,O[o]);o=parseInt(A[a],16),t[r]=[o>>16&255,o>>8&255,255&o]}return t}(),T.transparent=[0,0,0,0]);const e=T[t.toLowerCase()];return e&&{r:e[0],g:e[1],b:e[2],a:4===e.length?e[3]:255}}function R(t,e,i){if(t){let s=k(t);s[e]=Math.max(0,Math.min(s[e]+s[e]*i,0===e?360:1)),s=P(s),t.r=s[0],t.g=s[1],t.b=s[2]}}function E(t,e){return t?Object.assign(e||{},t):t}function I(t){var e={r:0,g:0,b:0,a:255};return Array.isArray(t)?t.length>=3&&(e={r:t[0],g:t[1],b:t[2],a:255},t.length>3&&(e.a=m(t[3]))):(e=E(t,{r:0,g:0,b:0,a:1})).a=m(e.a),e}function z(t){return"r"===t.charAt(0)?function(t){const e=_.exec(t);let i,s,n,o=255;if(e){if(e[7]!==i){const t=+e[7];o=255&(e[8]?p(t):255*t)}return i=+e[1],s=+e[3],n=+e[5],i=255&(e[2]?p(i):i),s=255&(e[4]?p(s):s),n=255&(e[6]?p(n):n),{r:i,g:s,b:n,a:o}}}(t):C(t)}class F{constructor(t){if(t instanceof F)return t;const e=typeof t;let i;var s,n,o;"object"===e?i=I(t):"string"===e&&(o=(s=t).length,"#"===s[0]&&(4===o||5===o?n={r:255&17*r[s[1]],g:255&17*r[s[2]],b:255&17*r[s[3]],a:5===o?17*r[s[4]]:255}:7!==o&&9!==o||(n={r:r[s[1]]<<4|r[s[2]],g:r[s[3]]<<4|r[s[4]],b:r[s[5]]<<4|r[s[6]],a:9===o?r[s[7]]<<4|r[s[8]]:255})),i=n||L(t)||z(t)),this._rgb=i,this._valid=!!i}get valid(){return this._valid}get rgb(){var t=E(this._rgb);return t&&(t.a=x(t.a)),t}set rgb(t){this._rgb=I(t)}rgbString(){return this._valid?(t=this._rgb)&&(t.a<255?`rgba(${t.r}, ${t.g}, ${t.b}, ${x(t.a)})`:`rgb(${t.r}, ${t.g}, ${t.b})`):this._rgb;var t}hexString(){return this._valid?u(this._rgb):this._rgb}hslString(){return this._valid?function(t){if(!t)return;const e=k(t),i=e[0],s=b(e[1]),n=b(e[2]);return t.a<255?`hsla(${i}, ${s}%, ${n}%, ${x(t.a)})`:`hsl(${i}, ${s}%, ${n}%)`}(this._rgb):this._rgb}mix(t,e){const i=this;if(t){const s=i.rgb,n=t.rgb;let o;const a=e===o?.5:e,r=2*a-1,l=s.a-n.a,h=((r*l==-1?r:(r+l)/(1+r*l))+1)/2;o=1-h,s.r=255&h*s.r+o*n.r+.5,s.g=255&h*s.g+o*n.g+.5,s.b=255&h*s.b+o*n.b+.5,s.a=a*s.a+(1-a)*n.a,i.rgb=s}return i}clone(){return new F(this.rgb)}alpha(t){return this._rgb.a=m(t),this}clearer(t){return this._rgb.a*=1-t,this}greyscale(){const t=this._rgb,e=f(.3*t.r+.59*t.g+.11*t.b);return t.r=t.g=t.b=e,this}opaquer(t){return this._rgb.a*=1+t,this}negate(){const t=this._rgb;return t.r=255-t.r,t.g=255-t.g,t.b=255-t.b,this}lighten(t){return R(this._rgb,2,t),this}darken(t){return R(this._rgb,2,-t),this}saturate(t){return R(this._rgb,1,t),this}desaturate(t){return R(this._rgb,1,-t),this}rotate(t){return function(t,e){var i=k(t);i[0]=D(i[0]+e),i=P(i),t.r=i[0],t.g=i[1],t.b=i[2]}(this._rgb,t),this}}function B(t){return new F(t)}const V=t=>t instanceof CanvasGradient||t instanceof CanvasPattern;function W(t){return V(t)?t:B(t)}function N(t){return V(t)?t:B(t).saturate(.5).darken(.1).hexString()}function H(){}const j=function(){let t=0;return function(){return t++}}();function $(t){return null==t}function Y(t){if(Array.isArray&&Array.isArray(t))return!0;const e=Object.prototype.toString.call(t);return"[object"===e.substr(0,7)&&"Array]"===e.substr(-6)}function U(t){return null!==t&&"[object Object]"===Object.prototype.toString.call(t)}const X=t=>("number"==typeof t||t instanceof Number)&&isFinite(+t);function q(t,e){return X(t)?t:e}function K(t,e){return void 0===t?e:t}const G=(t,e)=>"string"==typeof t&&t.endsWith("%")?parseFloat(t)/100:t/e,Z=(t,e)=>"string"==typeof t&&t.endsWith("%")?parseFloat(t)/100*e:+t;function J(t,e,i){if(t&&"function"==typeof t.call)return t.apply(i,e)}function Q(t,e,i,s){let n,o,a;if(Y(t))if(o=t.length,s)for(n=o-1;n>=0;n--)e.call(i,t[n],n);else for(n=0;n<o;n++)e.call(i,t[n],n);else if(U(t))for(a=Object.keys(t),o=a.length,n=0;n<o;n++)e.call(i,t[a[n]],a[n])}function tt(t,e){let i,s,n,o;if(!t||!e||t.length!==e.length)return!1;for(i=0,s=t.length;i<s;++i)if(n=t[i],o=e[i],n.datasetIndex!==o.datasetIndex||n.index!==o.index)return!1;return!0}function et(t){if(Y(t))return t.map(et);if(U(t)){const e=Object.create(null),i=Object.keys(t),s=i.length;let n=0;for(;n<s;++n)e[i[n]]=et(t[i[n]]);return e}return t}function it(t){return-1===["__proto__","prototype","constructor"].indexOf(t)}function st(t,e,i,s){if(!it(t))return;const n=e[t],o=i[t];U(n)&&U(o)?nt(n,o,s):e[t]=et(o)}function nt(t,e,i){const s=Y(e)?e:[e],n=s.length;if(!U(t))return t;const o=(i=i||{}).merger||st;for(let a=0;a<n;++a){if(!U(e=s[a]))continue;const n=Object.keys(e);for(let s=0,a=n.length;s<a;++s)o(n[s],t,e,i)}return t}function ot(t,e){return nt(t,e,{merger:at})}function at(t,e,i){if(!it(t))return;const s=e[t],n=i[t];U(s)&&U(n)?ot(s,n):Object.prototype.hasOwnProperty.call(e,t)||(e[t]=et(n))}function rt(t,e){const i=t.indexOf(".",e);return-1===i?t.length:i}function lt(t,e){if(""===e)return t;let i=0,s=rt(e,i);for(;t&&s>i;)t=t[e.substr(i,s-i)],i=s+1,s=rt(e,i);return t}function ht(t){return t.charAt(0).toUpperCase()+t.slice(1)}const ct=t=>void 0!==t,dt=t=>"function"==typeof t,ut=(t,e)=>{if(t.size!==e.size)return!1;for(const i of t)if(!e.has(i))return!1;return!0};function ft(t){return"mouseup"===t.type||"click"===t.type||"contextmenu"===t.type}const gt=Object.create(null),pt=Object.create(null);function mt(t,e){if(!e)return t;const i=e.split(".");for(let e=0,s=i.length;e<s;++e){const s=i[e];t=t[s]||(t[s]=Object.create(null))}return t}function xt(t,e,i){return"string"==typeof e?nt(mt(t,e),i):nt(mt(t,""),e)}var bt=new class{constructor(t){this.animation=void 0,this.backgroundColor="rgba(0,0,0,0.1)",this.borderColor="rgba(0,0,0,0.1)",this.color="#666",this.datasets={},this.devicePixelRatio=t=>t.chart.platform.getDevicePixelRatio(),this.elements={},this.events=["mousemove","mouseout","click","touchstart","touchmove"],this.font={family:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",size:12,style:"normal",lineHeight:1.2,weight:null},this.hover={},this.hoverBackgroundColor=(t,e)=>N(e.backgroundColor),this.hoverBorderColor=(t,e)=>N(e.borderColor),this.hoverColor=(t,e)=>N(e.color),this.indexAxis="x",this.interaction={mode:"nearest",intersect:!0},this.maintainAspectRatio=!0,this.onHover=null,this.onClick=null,this.parsing=!0,this.plugins={},this.responsive=!0,this.scale=void 0,this.scales={},this.showLine=!0,this.drawActiveElementsOnTop=!0,this.describe(t)}set(t,e){return xt(this,t,e)}get(t){return mt(this,t)}describe(t,e){return xt(pt,t,e)}override(t,e){return xt(gt,t,e)}route(t,e,i,s){const n=mt(this,t),o=mt(this,i),a="_"+e;Object.defineProperties(n,{[a]:{value:n[e],writable:!0},[e]:{enumerable:!0,get(){const t=this[a],e=o[s];return U(t)?Object.assign({},e,t):K(t,e)},set(t){this[a]=t}}})}}({_scriptable:t=>!t.startsWith("on"),_indexable:t=>"events"!==t,hover:{_fallback:"interaction"},interaction:{_scriptable:!1,_indexable:!1}});const _t=Math.PI,yt=2*_t,vt=yt+_t,wt=Number.POSITIVE_INFINITY,Mt=_t/180,kt=_t/2,St=_t/4,Pt=2*_t/3,Dt=Math.log10,Ct=Math.sign;function Ot(t){const e=Math.round(t);t=Lt(t,e,t/1e3)?e:t;const i=Math.pow(10,Math.floor(Dt(t))),s=t/i;return(s<=1?1:s<=2?2:s<=5?5:10)*i}function At(t){const e=[],i=Math.sqrt(t);let s;for(s=1;s<i;s++)t%s==0&&(e.push(s),e.push(t/s));return i===(0|i)&&e.push(i),e.sort(((t,e)=>t-e)).pop(),e}function Tt(t){return!isNaN(parseFloat(t))&&isFinite(t)}function Lt(t,e,i){return Math.abs(t-e)<i}function Rt(t,e){const i=Math.round(t);return i-e<=t&&i+e>=t}function Et(t,e,i){let s,n,o;for(s=0,n=t.length;s<n;s++)o=t[s][i],isNaN(o)||(e.min=Math.min(e.min,o),e.max=Math.max(e.max,o))}function It(t){return t*(_t/180)}function zt(t){return t*(180/_t)}function Ft(t){if(!X(t))return;let e=1,i=0;for(;Math.round(t*e)/e!==t;)e*=10,i++;return i}function Bt(t,e){const i=e.x-t.x,s=e.y-t.y,n=Math.sqrt(i*i+s*s);let o=Math.atan2(s,i);return o<-.5*_t&&(o+=yt),{angle:o,distance:n}}function Vt(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))}function Wt(t,e){return(t-e+vt)%yt-_t}function Nt(t){return(t%yt+yt)%yt}function Ht(t,e,i,s){const n=Nt(t),o=Nt(e),a=Nt(i),r=Nt(o-n),l=Nt(a-n),h=Nt(n-o),c=Nt(n-a);return n===o||n===a||s&&o===a||r>l&&h<c}function jt(t,e,i){return Math.max(e,Math.min(i,t))}function $t(t){return jt(t,-32768,32767)}function Yt(t,e,i,s=1e-6){return t>=Math.min(e,i)-s&&t<=Math.max(e,i)+s}function Ut(t){return!t||$(t.size)||$(t.family)?null:(t.style?t.style+" ":"")+(t.weight?t.weight+" ":"")+t.size+"px "+t.family}function Xt(t,e,i,s,n){let o=e[n];return o||(o=e[n]=t.measureText(n).width,i.push(n)),o>s&&(s=o),s}function qt(t,e,i,s){let n=(s=s||{}).data=s.data||{},o=s.garbageCollect=s.garbageCollect||[];s.font!==e&&(n=s.data={},o=s.garbageCollect=[],s.font=e),t.save(),t.font=e;let a=0;const r=i.length;let l,h,c,d,u;for(l=0;l<r;l++)if(d=i[l],null!=d&&!0!==Y(d))a=Xt(t,n,o,a,d);else if(Y(d))for(h=0,c=d.length;h<c;h++)u=d[h],null==u||Y(u)||(a=Xt(t,n,o,a,u));t.restore();const f=o.length/2;if(f>i.length){for(l=0;l<f;l++)delete n[o[l]];o.splice(0,f)}return a}function Kt(t,e,i){const s=t.currentDevicePixelRatio,n=0!==i?Math.max(i/2,.5):0;return Math.round((e-n)*s)/s+n}function Gt(t,e){(e=e||t.getContext("2d")).save(),e.resetTransform(),e.clearRect(0,0,t.width,t.height),e.restore()}function Zt(t,e,i,s){let n,o,a,r,l;const h=e.pointStyle,c=e.rotation,d=e.radius;let u=(c||0)*Mt;if(h&&"object"==typeof h&&(n=h.toString(),"[object HTMLImageElement]"===n||"[object HTMLCanvasElement]"===n))return t.save(),t.translate(i,s),t.rotate(u),t.drawImage(h,-h.width/2,-h.height/2,h.width,h.height),void t.restore();if(!(isNaN(d)||d<=0)){switch(t.beginPath(),h){default:t.arc(i,s,d,0,yt),t.closePath();break;case"triangle":t.moveTo(i+Math.sin(u)*d,s-Math.cos(u)*d),u+=Pt,t.lineTo(i+Math.sin(u)*d,s-Math.cos(u)*d),u+=Pt,t.lineTo(i+Math.sin(u)*d,s-Math.cos(u)*d),t.closePath();break;case"rectRounded":l=.516*d,r=d-l,o=Math.cos(u+St)*r,a=Math.sin(u+St)*r,t.arc(i-o,s-a,l,u-_t,u-kt),t.arc(i+a,s-o,l,u-kt,u),t.arc(i+o,s+a,l,u,u+kt),t.arc(i-a,s+o,l,u+kt,u+_t),t.closePath();break;case"rect":if(!c){r=Math.SQRT1_2*d,t.rect(i-r,s-r,2*r,2*r);break}u+=St;case"rectRot":o=Math.cos(u)*d,a=Math.sin(u)*d,t.moveTo(i-o,s-a),t.lineTo(i+a,s-o),t.lineTo(i+o,s+a),t.lineTo(i-a,s+o),t.closePath();break;case"crossRot":u+=St;case"cross":o=Math.cos(u)*d,a=Math.sin(u)*d,t.moveTo(i-o,s-a),t.lineTo(i+o,s+a),t.moveTo(i+a,s-o),t.lineTo(i-a,s+o);break;case"star":o=Math.cos(u)*d,a=Math.sin(u)*d,t.moveTo(i-o,s-a),t.lineTo(i+o,s+a),t.moveTo(i+a,s-o),t.lineTo(i-a,s+o),u+=St,o=Math.cos(u)*d,a=Math.sin(u)*d,t.moveTo(i-o,s-a),t.lineTo(i+o,s+a),t.moveTo(i+a,s-o),t.lineTo(i-a,s+o);break;case"line":o=Math.cos(u)*d,a=Math.sin(u)*d,t.moveTo(i-o,s-a),t.lineTo(i+o,s+a);break;case"dash":t.moveTo(i,s),t.lineTo(i+Math.cos(u)*d,s+Math.sin(u)*d)}t.fill(),e.borderWidth>0&&t.stroke()}}function Jt(t,e,i){return i=i||.5,!e||t&&t.x>e.left-i&&t.x<e.right+i&&t.y>e.top-i&&t.y<e.bottom+i}function Qt(t,e){t.save(),t.beginPath(),t.rect(e.left,e.top,e.right-e.left,e.bottom-e.top),t.clip()}function te(t){t.restore()}function ee(t,e,i,s,n){if(!e)return t.lineTo(i.x,i.y);if("middle"===n){const s=(e.x+i.x)/2;t.lineTo(s,e.y),t.lineTo(s,i.y)}else"after"===n!=!!s?t.lineTo(e.x,i.y):t.lineTo(i.x,e.y);t.lineTo(i.x,i.y)}function ie(t,e,i,s){if(!e)return t.lineTo(i.x,i.y);t.bezierCurveTo(s?e.cp1x:e.cp2x,s?e.cp1y:e.cp2y,s?i.cp2x:i.cp1x,s?i.cp2y:i.cp1y,i.x,i.y)}function se(t,e,i,s,n,o={}){const a=Y(e)?e:[e],r=o.strokeWidth>0&&""!==o.strokeColor;let l,h;for(t.save(),t.font=n.string,function(t,e){e.translation&&t.translate(e.translation[0],e.translation[1]);$(e.rotation)||t.rotate(e.rotation);e.color&&(t.fillStyle=e.color);e.textAlign&&(t.textAlign=e.textAlign);e.textBaseline&&(t.textBaseline=e.textBaseline)}(t,o),l=0;l<a.length;++l)h=a[l],r&&(o.strokeColor&&(t.strokeStyle=o.strokeColor),$(o.strokeWidth)||(t.lineWidth=o.strokeWidth),t.strokeText(h,i,s,o.maxWidth)),t.fillText(h,i,s,o.maxWidth),ne(t,i,s,h,o),s+=n.lineHeight;t.restore()}function ne(t,e,i,s,n){if(n.strikethrough||n.underline){const o=t.measureText(s),a=e-o.actualBoundingBoxLeft,r=e+o.actualBoundingBoxRight,l=i-o.actualBoundingBoxAscent,h=i+o.actualBoundingBoxDescent,c=n.strikethrough?(l+h)/2:h;t.strokeStyle=t.fillStyle,t.beginPath(),t.lineWidth=n.decorationWidth||2,t.moveTo(a,c),t.lineTo(r,c),t.stroke()}}function oe(t,e){const{x:i,y:s,w:n,h:o,radius:a}=e;t.arc(i+a.topLeft,s+a.topLeft,a.topLeft,-kt,_t,!0),t.lineTo(i,s+o-a.bottomLeft),t.arc(i+a.bottomLeft,s+o-a.bottomLeft,a.bottomLeft,_t,kt,!0),t.lineTo(i+n-a.bottomRight,s+o),t.arc(i+n-a.bottomRight,s+o-a.bottomRight,a.bottomRight,kt,0,!0),t.lineTo(i+n,s+a.topRight),t.arc(i+n-a.topRight,s+a.topRight,a.topRight,0,-kt,!0),t.lineTo(i+a.topLeft,s)}function ae(t,e,i){i=i||(i=>t[i]<e);let s,n=t.length-1,o=0;for(;n-o>1;)s=o+n>>1,i(s)?o=s:n=s;return{lo:o,hi:n}}const re=(t,e,i)=>ae(t,i,(s=>t[s][e]<i)),le=(t,e,i)=>ae(t,i,(s=>t[s][e]>=i));function he(t,e,i){let s=0,n=t.length;for(;s<n&&t[s]<e;)s++;for(;n>s&&t[n-1]>i;)n--;return s>0||n<t.length?t.slice(s,n):t}const ce=["push","pop","shift","splice","unshift"];function de(t,e){t._chartjs?t._chartjs.listeners.push(e):(Object.defineProperty(t,"_chartjs",{configurable:!0,enumerable:!1,value:{listeners:[e]}}),ce.forEach((e=>{const i="_onData"+ht(e),s=t[e];Object.defineProperty(t,e,{configurable:!0,enumerable:!1,value(...e){const n=s.apply(this,e);return t._chartjs.listeners.forEach((t=>{"function"==typeof t[i]&&t[i](...e)})),n}})})))}function ue(t,e){const i=t._chartjs;if(!i)return;const s=i.listeners,n=s.indexOf(e);-1!==n&&s.splice(n,1),s.length>0||(ce.forEach((e=>{delete t[e]})),delete t._chartjs)}function fe(t){const e=new Set;let i,s;for(i=0,s=t.length;i<s;++i)e.add(t[i]);return e.size===s?t:Array.from(e)}function ge(){return"undefined"!=typeof window&&"undefined"!=typeof document}function pe(t){let e=t.parentNode;return e&&"[object ShadowRoot]"===e.toString()&&(e=e.host),e}function me(t,e,i){let s;return"string"==typeof t?(s=parseInt(t,10),-1!==t.indexOf("%")&&(s=s/100*e.parentNode[i])):s=t,s}const xe=t=>window.getComputedStyle(t,null);function be(t,e){return xe(t).getPropertyValue(e)}const _e=["top","right","bottom","left"];function ye(t,e,i){const s={};i=i?"-"+i:"";for(let n=0;n<4;n++){const o=_e[n];s[o]=parseFloat(t[e+"-"+o+i])||0}return s.width=s.left+s.right,s.height=s.top+s.bottom,s}function ve(t,e){const{canvas:i,currentDevicePixelRatio:s}=e,n=xe(i),o="border-box"===n.boxSizing,a=ye(n,"padding"),r=ye(n,"border","width"),{x:l,y:h,box:c}=function(t,e){const i=t.native||t,s=i.touches,n=s&&s.length?s[0]:i,{offsetX:o,offsetY:a}=n;let r,l,h=!1;if(((t,e,i)=>(t>0||e>0)&&(!i||!i.shadowRoot))(o,a,i.target))r=o,l=a;else{const t=e.getBoundingClientRect();r=n.clientX-t.left,l=n.clientY-t.top,h=!0}return{x:r,y:l,box:h}}(t,i),d=a.left+(c&&r.left),u=a.top+(c&&r.top);let{width:f,height:g}=e;return o&&(f-=a.width+r.width,g-=a.height+r.height),{x:Math.round((l-d)/f*i.width/s),y:Math.round((h-u)/g*i.height/s)}}const we=t=>Math.round(10*t)/10;function Me(t,e,i,s){const n=xe(t),o=ye(n,"margin"),a=me(n.maxWidth,t,"clientWidth")||wt,r=me(n.maxHeight,t,"clientHeight")||wt,l=function(t,e,i){let s,n;if(void 0===e||void 0===i){const o=pe(t);if(o){const t=o.getBoundingClientRect(),a=xe(o),r=ye(a,"border","width"),l=ye(a,"padding");e=t.width-l.width-r.width,i=t.height-l.height-r.height,s=me(a.maxWidth,o,"clientWidth"),n=me(a.maxHeight,o,"clientHeight")}else e=t.clientWidth,i=t.clientHeight}return{width:e,height:i,maxWidth:s||wt,maxHeight:n||wt}}(t,e,i);let{width:h,height:c}=l;if("content-box"===n.boxSizing){const t=ye(n,"border","width"),e=ye(n,"padding");h-=e.width+t.width,c-=e.height+t.height}return h=Math.max(0,h-o.width),c=Math.max(0,s?Math.floor(h/s):c-o.height),h=we(Math.min(h,a,l.maxWidth)),c=we(Math.min(c,r,l.maxHeight)),h&&!c&&(c=we(h/2)),{width:h,height:c}}function ke(t,e,i){const s=e||1,n=Math.floor(t.height*s),o=Math.floor(t.width*s);t.height=n/s,t.width=o/s;const a=t.canvas;return a.style&&(i||!a.style.height&&!a.style.width)&&(a.style.height=`${t.height}px`,a.style.width=`${t.width}px`),(t.currentDevicePixelRatio!==s||a.height!==n||a.width!==o)&&(t.currentDevicePixelRatio=s,a.height=n,a.width=o,t.ctx.setTransform(s,0,0,s,0,0),!0)}const Se=function(){let t=!1;try{const e={get passive(){return t=!0,!1}};window.addEventListener("test",null,e),window.removeEventListener("test",null,e)}catch(t){}return t}();function Pe(t,e){const i=be(t,e),s=i&&i.match(/^(\d+)(\.\d+)?px$/);return s?+s[1]:void 0}function De(t,e){return"native"in t?{x:t.x,y:t.y}:ve(t,e)}function Ce(t,e,i,s){const{controller:n,data:o,_sorted:a}=t,r=n._cachedMeta.iScale;if(r&&e===r.axis&&"r"!==e&&a&&o.length){const t=r._reversePixels?le:re;if(!s)return t(o,e,i);if(n._sharedOptions){const s=o[0],n="function"==typeof s.getRange&&s.getRange(e);if(n){const s=t(o,e,i-n),a=t(o,e,i+n);return{lo:s.lo,hi:a.hi}}}}return{lo:0,hi:o.length-1}}function Oe(t,e,i,s,n){const o=t.getSortedVisibleDatasetMetas(),a=i[e];for(let t=0,i=o.length;t<i;++t){const{index:i,data:r}=o[t],{lo:l,hi:h}=Ce(o[t],e,a,n);for(let t=l;t<=h;++t){const e=r[t];e.skip||s(e,i,t)}}}function Ae(t,e,i,s){const n=[];if(!Jt(e,t.chartArea,t._minPadding))return n;return Oe(t,i,e,(function(t,i,o){t.inRange(e.x,e.y,s)&&n.push({element:t,datasetIndex:i,index:o})}),!0),n}function Te(t,e,i,s,n){let o=[];const a=function(t){const e=-1!==t.indexOf("x"),i=-1!==t.indexOf("y");return function(t,s){const n=e?Math.abs(t.x-s.x):0,o=i?Math.abs(t.y-s.y):0;return Math.sqrt(Math.pow(n,2)+Math.pow(o,2))}}(i);let r=Number.POSITIVE_INFINITY;return Oe(t,i,e,(function(i,l,h){const c=i.inRange(e.x,e.y,n);if(s&&!c)return;const d=i.getCenterPoint(n);if(!Jt(d,t.chartArea,t._minPadding)&&!c)return;const u=a(e,d);u<r?(o=[{element:i,datasetIndex:l,index:h}],r=u):u===r&&o.push({element:i,datasetIndex:l,index:h})})),o}function Le(t,e,i,s,n){return Jt(e,t.chartArea,t._minPadding)?"r"!==i||s?Te(t,e,i,s,n):function(t,e,i,s){let n=[];return Oe(t,i,e,(function(t,i,o){const{startAngle:a,endAngle:r}=t.getProps(["startAngle","endAngle"],s),{angle:l}=Bt(t,{x:e.x,y:e.y});Ht(l,a,r)&&n.push({element:t,datasetIndex:i,index:o})})),n}(t,e,i,n):[]}function Re(t,e,i,s){const n=De(e,t),o=[],a=i.axis,r="x"===a?"inXRange":"inYRange";let l=!1;return function(t,e){const i=t.getSortedVisibleDatasetMetas();let s,n,o;for(let t=0,a=i.length;t<a;++t){({index:s,data:n}=i[t]);for(let t=0,i=n.length;t<i;++t)o=n[t],o.skip||e(o,s,t)}}(t,((t,e,i)=>{t[r](n[a],s)&&o.push({element:t,datasetIndex:e,index:i}),t.inRange(n.x,n.y,s)&&(l=!0)})),i.intersect&&!l?[]:o}var Ee={modes:{index(t,e,i,s){const n=De(e,t),o=i.axis||"x",a=i.intersect?Ae(t,n,o,s):Le(t,n,o,!1,s),r=[];return a.length?(t.getSortedVisibleDatasetMetas().forEach((t=>{const e=a[0].index,i=t.data[e];i&&!i.skip&&r.push({element:i,datasetIndex:t.index,index:e})})),r):[]},dataset(t,e,i,s){const n=De(e,t),o=i.axis||"xy";let a=i.intersect?Ae(t,n,o,s):Le(t,n,o,!1,s);if(a.length>0){const e=a[0].datasetIndex,i=t.getDatasetMeta(e).data;a=[];for(let t=0;t<i.length;++t)a.push({element:i[t],datasetIndex:e,index:t})}return a},point:(t,e,i,s)=>Ae(t,De(e,t),i.axis||"xy",s),nearest:(t,e,i,s)=>Le(t,De(e,t),i.axis||"xy",i.intersect,s),x:(t,e,i,s)=>Re(t,e,{axis:"x",intersect:i.intersect},s),y:(t,e,i,s)=>Re(t,e,{axis:"y",intersect:i.intersect},s)}};const Ie=new RegExp(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/),ze=new RegExp(/^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/);function Fe(t,e){const i=(""+t).match(Ie);if(!i||"normal"===i[1])return 1.2*e;switch(t=+i[2],i[3]){case"px":return t;case"%":t/=100}return e*t}function Be(t,e){const i={},s=U(e),n=s?Object.keys(e):e,o=U(t)?s?i=>K(t[i],t[e[i]]):e=>t[e]:()=>t;for(const t of n)i[t]=+o(t)||0;return i}function Ve(t){return Be(t,{top:"y",right:"x",bottom:"y",left:"x"})}function We(t){return Be(t,["topLeft","topRight","bottomLeft","bottomRight"])}function Ne(t){const e=Ve(t);return e.width=e.left+e.right,e.height=e.top+e.bottom,e}function He(t,e){t=t||{},e=e||bt.font;let i=K(t.size,e.size);"string"==typeof i&&(i=parseInt(i,10));let s=K(t.style,e.style);s&&!(""+s).match(ze)&&(console.warn('Invalid font style specified: "'+s+'"'),s="");const n={family:K(t.family,e.family),lineHeight:Fe(K(t.lineHeight,e.lineHeight),i),size:i,style:s,weight:K(t.weight,e.weight),string:""};return n.string=Ut(n),n}function je(t,e,i,s){let n,o,a,r=!0;for(n=0,o=t.length;n<o;++n)if(a=t[n],void 0!==a&&(void 0!==e&&"function"==typeof a&&(a=a(e),r=!1),void 0!==i&&Y(a)&&(a=a[i%a.length],r=!1),void 0!==a))return s&&!r&&(s.cacheable=!1),a}function $e(t,e,i){const{min:s,max:n}=t,o=Z(e,(n-s)/2),a=(t,e)=>i&&0===t?0:t+e;return{min:a(s,-Math.abs(o)),max:a(n,o)}}function Ye(t,e){return Object.assign(Object.create(t),e)}const Ue=["left","top","right","bottom"];function Xe(t,e){return t.filter((t=>t.pos===e))}function qe(t,e){return t.filter((t=>-1===Ue.indexOf(t.pos)&&t.box.axis===e))}function Ke(t,e){return t.sort(((t,i)=>{const s=e?i:t,n=e?t:i;return s.weight===n.weight?s.index-n.index:s.weight-n.weight}))}function Ge(t,e){const i=function(t){const e={};for(const i of t){const{stack:t,pos:s,stackWeight:n}=i;if(!t||!Ue.includes(s))continue;const o=e[t]||(e[t]={count:0,placed:0,weight:0,size:0});o.count++,o.weight+=n}return e}(t),{vBoxMaxWidth:s,hBoxMaxHeight:n}=e;let o,a,r;for(o=0,a=t.length;o<a;++o){r=t[o];const{fullSize:a}=r.box,l=i[r.stack],h=l&&r.stackWeight/l.weight;r.horizontal?(r.width=h?h*s:a&&e.availableWidth,r.height=n):(r.width=s,r.height=h?h*n:a&&e.availableHeight)}return i}function Ze(t,e,i,s){return Math.max(t[i],e[i])+Math.max(t[s],e[s])}function Je(t,e){t.top=Math.max(t.top,e.top),t.left=Math.max(t.left,e.left),t.bottom=Math.max(t.bottom,e.bottom),t.right=Math.max(t.right,e.right)}function Qe(t,e,i,s){const{pos:n,box:o}=i,a=t.maxPadding;if(!U(n)){i.size&&(t[n]-=i.size);const e=s[i.stack]||{size:0,count:1};e.size=Math.max(e.size,i.horizontal?o.height:o.width),i.size=e.size/e.count,t[n]+=i.size}o.getPadding&&Je(a,o.getPadding());const r=Math.max(0,e.outerWidth-Ze(a,t,"left","right")),l=Math.max(0,e.outerHeight-Ze(a,t,"top","bottom")),h=r!==t.w,c=l!==t.h;return t.w=r,t.h=l,i.horizontal?{same:h,other:c}:{same:c,other:h}}function ti(t,e){const i=e.maxPadding;function s(t){const s={left:0,top:0,right:0,bottom:0};return t.forEach((t=>{s[t]=Math.max(e[t],i[t])})),s}return s(t?["left","right"]:["top","bottom"])}function ei(t,e,i,s){const n=[];let o,a,r,l,h,c;for(o=0,a=t.length,h=0;o<a;++o){r=t[o],l=r.box,l.update(r.width||e.w,r.height||e.h,ti(r.horizontal,e));const{same:a,other:d}=Qe(e,i,r,s);h|=a&&n.length,c=c||d,l.fullSize||n.push(r)}return h&&ei(n,e,i,s)||c}function ii(t,e,i,s,n){t.top=i,t.left=e,t.right=e+s,t.bottom=i+n,t.width=s,t.height=n}function si(t,e,i,s){const n=i.padding;let{x:o,y:a}=e;for(const r of t){const t=r.box,l=s[r.stack]||{count:1,placed:0,weight:1},h=r.stackWeight/l.weight||1;if(r.horizontal){const s=e.w*h,o=l.size||t.height;ct(l.start)&&(a=l.start),t.fullSize?ii(t,n.left,a,i.outerWidth-n.right-n.left,o):ii(t,e.left+l.placed,a,s,o),l.start=a,l.placed+=s,a=t.bottom}else{const s=e.h*h,a=l.size||t.width;ct(l.start)&&(o=l.start),t.fullSize?ii(t,o,n.top,a,i.outerHeight-n.bottom-n.top):ii(t,o,e.top+l.placed,a,s),l.start=o,l.placed+=s,o=t.right}}e.x=o,e.y=a}bt.set("layout",{autoPadding:!0,padding:{top:0,right:0,bottom:0,left:0}});var ni={addBox(t,e){t.boxes||(t.boxes=[]),e.fullSize=e.fullSize||!1,e.position=e.position||"top",e.weight=e.weight||0,e._layers=e._layers||function(){return[{z:0,draw(t){e.draw(t)}}]},t.boxes.push(e)},removeBox(t,e){const i=t.boxes?t.boxes.indexOf(e):-1;-1!==i&&t.boxes.splice(i,1)},configure(t,e,i){e.fullSize=i.fullSize,e.position=i.position,e.weight=i.weight},update(t,e,i,s){if(!t)return;const n=Ne(t.options.layout.padding),o=Math.max(e-n.width,0),a=Math.max(i-n.height,0),r=function(t){const e=function(t){const e=[];let i,s,n,o,a,r;for(i=0,s=(t||[]).length;i<s;++i)n=t[i],({position:o,options:{stack:a,stackWeight:r=1}}=n),e.push({index:i,box:n,pos:o,horizontal:n.isHorizontal(),weight:n.weight,stack:a&&o+a,stackWeight:r});return e}(t),i=Ke(e.filter((t=>t.box.fullSize)),!0),s=Ke(Xe(e,"left"),!0),n=Ke(Xe(e,"right")),o=Ke(Xe(e,"top"),!0),a=Ke(Xe(e,"bottom")),r=qe(e,"x"),l=qe(e,"y");return{fullSize:i,leftAndTop:s.concat(o),rightAndBottom:n.concat(l).concat(a).concat(r),chartArea:Xe(e,"chartArea"),vertical:s.concat(n).concat(l),horizontal:o.concat(a).concat(r)}}(t.boxes),l=r.vertical,h=r.horizontal;Q(t.boxes,(t=>{"function"==typeof t.beforeLayout&&t.beforeLayout()}));const c=l.reduce(((t,e)=>e.box.options&&!1===e.box.options.display?t:t+1),0)||1,d=Object.freeze({outerWidth:e,outerHeight:i,padding:n,availableWidth:o,availableHeight:a,vBoxMaxWidth:o/2/c,hBoxMaxHeight:a/2}),u=Object.assign({},n);Je(u,Ne(s));const f=Object.assign({maxPadding:u,w:o,h:a,x:n.left,y:n.top},n),g=Ge(l.concat(h),d);ei(r.fullSize,f,d,g),ei(l,f,d,g),ei(h,f,d,g)&&ei(l,f,d,g),function(t){const e=t.maxPadding;function i(i){const s=Math.max(e[i]-t[i],0);return t[i]+=s,s}t.y+=i("top"),t.x+=i("left"),i("right"),i("bottom")}(f),si(r.leftAndTop,f,d,g),f.x+=f.w,f.y+=f.h,si(r.rightAndBottom,f,d,g),t.chartArea={left:f.left,top:f.top,right:f.left+f.w,bottom:f.top+f.h,height:f.h,width:f.w},Q(r.chartArea,(e=>{const i=e.box;Object.assign(i,t.chartArea),i.update(f.w,f.h,{left:0,top:0,right:0,bottom:0})}))}};function oi(t,e=[""],i=t,s,n=(()=>t[0])){ct(s)||(s=mi("_fallback",t));const o={[Symbol.toStringTag]:"Object",_cacheable:!0,_scopes:t,_rootScopes:i,_fallback:s,_getTarget:n,override:n=>oi([n,...t],e,i,s)};return new Proxy(o,{deleteProperty:(e,i)=>(delete e[i],delete e._keys,delete t[0][i],!0),get:(i,s)=>ci(i,s,(()=>function(t,e,i,s){let n;for(const o of e)if(n=mi(li(o,t),i),ct(n))return hi(t,n)?gi(i,s,t,n):n}(s,e,t,i))),getOwnPropertyDescriptor:(t,e)=>Reflect.getOwnPropertyDescriptor(t._scopes[0],e),getPrototypeOf:()=>Reflect.getPrototypeOf(t[0]),has:(t,e)=>xi(t).includes(e),ownKeys:t=>xi(t),set(t,e,i){const s=t._storage||(t._storage=n());return t[e]=s[e]=i,delete t._keys,!0}})}function ai(t,e,i,s){const n={_cacheable:!1,_proxy:t,_context:e,_subProxy:i,_stack:new Set,_descriptors:ri(t,s),setContext:e=>ai(t,e,i,s),override:n=>ai(t.override(n),e,i,s)};return new Proxy(n,{deleteProperty:(e,i)=>(delete e[i],delete t[i],!0),get:(t,e,i)=>ci(t,e,(()=>function(t,e,i){const{_proxy:s,_context:n,_subProxy:o,_descriptors:a}=t;let r=s[e];dt(r)&&a.isScriptable(e)&&(r=function(t,e,i,s){const{_proxy:n,_context:o,_subProxy:a,_stack:r}=i;if(r.has(t))throw new Error("Recursion detected: "+Array.from(r).join("->")+"->"+t);r.add(t),e=e(o,a||s),r.delete(t),hi(t,e)&&(e=gi(n._scopes,n,t,e));return e}(e,r,t,i));Y(r)&&r.length&&(r=function(t,e,i,s){const{_proxy:n,_context:o,_subProxy:a,_descriptors:r}=i;if(ct(o.index)&&s(t))e=e[o.index%e.length];else if(U(e[0])){const i=e,s=n._scopes.filter((t=>t!==i));e=[];for(const l of i){const i=gi(s,n,t,l);e.push(ai(i,o,a&&a[t],r))}}return e}(e,r,t,a.isIndexable));hi(e,r)&&(r=ai(r,n,o&&o[e],a));return r}(t,e,i))),getOwnPropertyDescriptor:(e,i)=>e._descriptors.allKeys?Reflect.has(t,i)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(t,i),getPrototypeOf:()=>Reflect.getPrototypeOf(t),has:(e,i)=>Reflect.has(t,i),ownKeys:()=>Reflect.ownKeys(t),set:(e,i,s)=>(t[i]=s,delete e[i],!0)})}function ri(t,e={scriptable:!0,indexable:!0}){const{_scriptable:i=e.scriptable,_indexable:s=e.indexable,_allKeys:n=e.allKeys}=t;return{allKeys:n,scriptable:i,indexable:s,isScriptable:dt(i)?i:()=>i,isIndexable:dt(s)?s:()=>s}}const li=(t,e)=>t?t+ht(e):e,hi=(t,e)=>U(e)&&"adapters"!==t&&(null===Object.getPrototypeOf(e)||e.constructor===Object);function ci(t,e,i){if(Object.prototype.hasOwnProperty.call(t,e))return t[e];const s=i();return t[e]=s,s}function di(t,e,i){return dt(t)?t(e,i):t}const ui=(t,e)=>!0===t?e:"string"==typeof t?lt(e,t):void 0;function fi(t,e,i,s,n){for(const o of e){const e=ui(i,o);if(e){t.add(e);const o=di(e._fallback,i,n);if(ct(o)&&o!==i&&o!==s)return o}else if(!1===e&&ct(s)&&i!==s)return null}return!1}function gi(t,e,i,s){const n=e._rootScopes,o=di(e._fallback,i,s),a=[...t,...n],r=new Set;r.add(s);let l=pi(r,a,i,o||i,s);return null!==l&&((!ct(o)||o===i||(l=pi(r,a,o,l,s),null!==l))&&oi(Array.from(r),[""],n,o,(()=>function(t,e,i){const s=t._getTarget();e in s||(s[e]={});const n=s[e];if(Y(n)&&U(i))return i;return n}(e,i,s))))}function pi(t,e,i,s,n){for(;i;)i=fi(t,e,i,s,n);return i}function mi(t,e){for(const i of e){if(!i)continue;const e=i[t];if(ct(e))return e}}function xi(t){let e=t._keys;return e||(e=t._keys=function(t){const e=new Set;for(const i of t)for(const t of Object.keys(i).filter((t=>!t.startsWith("_"))))e.add(t);return Array.from(e)}(t._scopes)),e}const bi=Number.EPSILON||1e-14,_i=(t,e)=>e<t.length&&!t[e].skip&&t[e],yi=t=>"x"===t?"y":"x";function vi(t,e,i,s){const n=t.skip?e:t,o=e,a=i.skip?e:i,r=Vt(o,n),l=Vt(a,o);let h=r/(r+l),c=l/(r+l);h=isNaN(h)?0:h,c=isNaN(c)?0:c;const d=s*h,u=s*c;return{previous:{x:o.x-d*(a.x-n.x),y:o.y-d*(a.y-n.y)},next:{x:o.x+u*(a.x-n.x),y:o.y+u*(a.y-n.y)}}}function wi(t,e="x"){const i=yi(e),s=t.length,n=Array(s).fill(0),o=Array(s);let a,r,l,h=_i(t,0);for(a=0;a<s;++a)if(r=l,l=h,h=_i(t,a+1),l){if(h){const t=h[e]-l[e];n[a]=0!==t?(h[i]-l[i])/t:0}o[a]=r?h?Ct(n[a-1])!==Ct(n[a])?0:(n[a-1]+n[a])/2:n[a-1]:n[a]}!function(t,e,i){const s=t.length;let n,o,a,r,l,h=_i(t,0);for(let c=0;c<s-1;++c)l=h,h=_i(t,c+1),l&&h&&(Lt(e[c],0,bi)?i[c]=i[c+1]=0:(n=i[c]/e[c],o=i[c+1]/e[c],r=Math.pow(n,2)+Math.pow(o,2),r<=9||(a=3/Math.sqrt(r),i[c]=n*a*e[c],i[c+1]=o*a*e[c])))}(t,n,o),function(t,e,i="x"){const s=yi(i),n=t.length;let o,a,r,l=_i(t,0);for(let h=0;h<n;++h){if(a=r,r=l,l=_i(t,h+1),!r)continue;const n=r[i],c=r[s];a&&(o=(n-a[i])/3,r[`cp1${i}`]=n-o,r[`cp1${s}`]=c-o*e[h]),l&&(o=(l[i]-n)/3,r[`cp2${i}`]=n+o,r[`cp2${s}`]=c+o*e[h])}}(t,o,e)}function Mi(t,e,i){return Math.max(Math.min(t,i),e)}function ki(t,e,i,s,n){let o,a,r,l;if(e.spanGaps&&(t=t.filter((t=>!t.skip))),"monotone"===e.cubicInterpolationMode)wi(t,n);else{let i=s?t[t.length-1]:t[0];for(o=0,a=t.length;o<a;++o)r=t[o],l=vi(i,r,t[Math.min(o+1,a-(s?0:1))%a],e.tension),r.cp1x=l.previous.x,r.cp1y=l.previous.y,r.cp2x=l.next.x,r.cp2y=l.next.y,i=r}e.capBezierPoints&&function(t,e){let i,s,n,o,a,r=Jt(t[0],e);for(i=0,s=t.length;i<s;++i)a=o,o=r,r=i<s-1&&Jt(t[i+1],e),o&&(n=t[i],a&&(n.cp1x=Mi(n.cp1x,e.left,e.right),n.cp1y=Mi(n.cp1y,e.top,e.bottom)),r&&(n.cp2x=Mi(n.cp2x,e.left,e.right),n.cp2y=Mi(n.cp2y,e.top,e.bottom)))}(t,i)}const Si=t=>0===t||1===t,Pi=(t,e,i)=>-Math.pow(2,10*(t-=1))*Math.sin((t-e)*yt/i),Di=(t,e,i)=>Math.pow(2,-10*t)*Math.sin((t-e)*yt/i)+1,Ci={linear:t=>t,easeInQuad:t=>t*t,easeOutQuad:t=>-t*(t-2),easeInOutQuad:t=>(t/=.5)<1?.5*t*t:-.5*(--t*(t-2)-1),easeInCubic:t=>t*t*t,easeOutCubic:t=>(t-=1)*t*t+1,easeInOutCubic:t=>(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2),easeInQuart:t=>t*t*t*t,easeOutQuart:t=>-((t-=1)*t*t*t-1),easeInOutQuart:t=>(t/=.5)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2),easeInQuint:t=>t*t*t*t*t,easeOutQuint:t=>(t-=1)*t*t*t*t+1,easeInOutQuint:t=>(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2),easeInSine:t=>1-Math.cos(t*kt),easeOutSine:t=>Math.sin(t*kt),easeInOutSine:t=>-.5*(Math.cos(_t*t)-1),easeInExpo:t=>0===t?0:Math.pow(2,10*(t-1)),easeOutExpo:t=>1===t?1:1-Math.pow(2,-10*t),easeInOutExpo:t=>Si(t)?t:t<.5?.5*Math.pow(2,10*(2*t-1)):.5*(2-Math.pow(2,-10*(2*t-1))),easeInCirc:t=>t>=1?t:-(Math.sqrt(1-t*t)-1),easeOutCirc:t=>Math.sqrt(1-(t-=1)*t),easeInOutCirc:t=>(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1),easeInElastic:t=>Si(t)?t:Pi(t,.075,.3),easeOutElastic:t=>Si(t)?t:Di(t,.075,.3),easeInOutElastic(t){const e=.1125;return Si(t)?t:t<.5?.5*Pi(2*t,e,.45):.5+.5*Di(2*t-1,e,.45)},easeInBack(t){const e=1.70158;return t*t*((e+1)*t-e)},easeOutBack(t){const e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack(t){let e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},easeInBounce:t=>1-Ci.easeOutBounce(1-t),easeOutBounce(t){const e=7.5625,i=2.75;return t<1/i?e*t*t:t<2/i?e*(t-=1.5/i)*t+.75:t<2.5/i?e*(t-=2.25/i)*t+.9375:e*(t-=2.625/i)*t+.984375},easeInOutBounce:t=>t<.5?.5*Ci.easeInBounce(2*t):.5*Ci.easeOutBounce(2*t-1)+.5};function Oi(t,e,i,s){return{x:t.x+i*(e.x-t.x),y:t.y+i*(e.y-t.y)}}function Ai(t,e,i,s){return{x:t.x+i*(e.x-t.x),y:"middle"===s?i<.5?t.y:e.y:"after"===s?i<1?t.y:e.y:i>0?e.y:t.y}}function Ti(t,e,i,s){const n={x:t.cp2x,y:t.cp2y},o={x:e.cp1x,y:e.cp1y},a=Oi(t,n,i),r=Oi(n,o,i),l=Oi(o,e,i),h=Oi(a,r,i),c=Oi(r,l,i);return Oi(h,c,i)}const Li=new Map;function Ri(t,e,i){return function(t,e){e=e||{};const i=t+JSON.stringify(e);let s=Li.get(i);return s||(s=new Intl.NumberFormat(t,e),Li.set(i,s)),s}(e,i).format(t)}function Ei(t,e,i){return t?function(t,e){return{x:i=>t+t+e-i,setWidth(t){e=t},textAlign:t=>"center"===t?t:"right"===t?"left":"right",xPlus:(t,e)=>t-e,leftForLtr:(t,e)=>t-e}}(e,i):{x:t=>t,setWidth(t){},textAlign:t=>t,xPlus:(t,e)=>t+e,leftForLtr:(t,e)=>t}}function Ii(t,e){let i,s;"ltr"!==e&&"rtl"!==e||(i=t.canvas.style,s=[i.getPropertyValue("direction"),i.getPropertyPriority("direction")],i.setProperty("direction",e,"important"),t.prevTextDirection=s)}function zi(t,e){void 0!==e&&(delete t.prevTextDirection,t.canvas.style.setProperty("direction",e[0],e[1]))}function Fi(t){return"angle"===t?{between:Ht,compare:Wt,normalize:Nt}:{between:Yt,compare:(t,e)=>t-e,normalize:t=>t}}function Bi({start:t,end:e,count:i,loop:s,style:n}){return{start:t%i,end:e%i,loop:s&&(e-t+1)%i==0,style:n}}function Vi(t,e,i){if(!i)return[t];const{property:s,start:n,end:o}=i,a=e.length,{compare:r,between:l,normalize:h}=Fi(s),{start:c,end:d,loop:u,style:f}=function(t,e,i){const{property:s,start:n,end:o}=i,{between:a,normalize:r}=Fi(s),l=e.length;let h,c,{start:d,end:u,loop:f}=t;if(f){for(d+=l,u+=l,h=0,c=l;h<c&&a(r(e[d%l][s]),n,o);++h)d--,u--;d%=l,u%=l}return u<d&&(u+=l),{start:d,end:u,loop:f,style:t.style}}(t,e,i),g=[];let p,m,x,b=!1,_=null;const y=()=>b||l(n,x,p)&&0!==r(n,x),v=()=>!b||0===r(o,p)||l(o,x,p);for(let t=c,i=c;t<=d;++t)m=e[t%a],m.skip||(p=h(m[s]),p!==x&&(b=l(p,n,o),null===_&&y()&&(_=0===r(p,n)?t:i),null!==_&&v()&&(g.push(Bi({start:_,end:t,loop:u,count:a,style:f})),_=null),i=t,x=p));return null!==_&&g.push(Bi({start:_,end:d,loop:u,count:a,style:f})),g}function Wi(t,e){const i=[],s=t.segments;for(let n=0;n<s.length;n++){const o=Vi(s[n],t.points,e);o.length&&i.push(...o)}return i}function Ni(t,e){const i=t.points,s=t.options.spanGaps,n=i.length;if(!n)return[];const o=!!t._loop,{start:a,end:r}=function(t,e,i,s){let n=0,o=e-1;if(i&&!s)for(;n<e&&!t[n].skip;)n++;for(;n<e&&t[n].skip;)n++;for(n%=e,i&&(o+=n);o>n&&t[o%e].skip;)o--;return o%=e,{start:n,end:o}}(i,n,o,s);if(!0===s)return Hi(t,[{start:a,end:r,loop:o}],i,e);return Hi(t,function(t,e,i,s){const n=t.length,o=[];let a,r=e,l=t[e];for(a=e+1;a<=i;++a){const i=t[a%n];i.skip||i.stop?l.skip||(s=!1,o.push({start:e%n,end:(a-1)%n,loop:s}),e=r=i.stop?a:null):(r=a,l.skip&&(e=a)),l=i}return null!==r&&o.push({start:e%n,end:r%n,loop:s}),o}(i,a,r<a?r+n:r,!!t._fullLoop&&0===a&&r===n-1),i,e)}function Hi(t,e,i,s){return s&&s.setContext&&i?function(t,e,i,s){const n=t._chart.getContext(),o=ji(t.options),{_datasetIndex:a,options:{spanGaps:r}}=t,l=i.length,h=[];let c=o,d=e[0].start,u=d;function f(t,e,s,n){const o=r?-1:1;if(t!==e){for(t+=l;i[t%l].skip;)t-=o;for(;i[e%l].skip;)e+=o;t%l!=e%l&&(h.push({start:t%l,end:e%l,loop:s,style:n}),c=n,d=e%l)}}for(const t of e){d=r?d:t.start;let e,o=i[d%l];for(u=d+1;u<=t.end;u++){const r=i[u%l];e=ji(s.setContext(Ye(n,{type:"segment",p0:o,p1:r,p0DataIndex:(u-1)%l,p1DataIndex:u%l,datasetIndex:a}))),$i(e,c)&&f(d,u-1,t.loop,c),o=r,c=e}d<u-1&&f(d,u-1,t.loop,c)}return h}(t,e,i,s):e}function ji(t){return{backgroundColor:t.backgroundColor,borderCapStyle:t.borderCapStyle,borderDash:t.borderDash,borderDashOffset:t.borderDashOffset,borderJoinStyle:t.borderJoinStyle,borderWidth:t.borderWidth,borderColor:t.borderColor}}function $i(t,e){return e&&JSON.stringify(t)!==JSON.stringify(e)}var Yi=Object.freeze({__proto__:null,easingEffects:Ci,color:W,getHoverColor:N,noop:H,uid:j,isNullOrUndef:$,isArray:Y,isObject:U,isFinite:X,finiteOrDefault:q,valueOrDefault:K,toPercentage:G,toDimension:Z,callback:J,each:Q,_elementsEqual:tt,clone:et,_merger:st,merge:nt,mergeIf:ot,_mergerIf:at,_deprecated:function(t,e,i,s){void 0!==e&&console.warn(t+': "'+i+'" is deprecated. Please use "'+s+'" instead')},resolveObjectKey:lt,_capitalize:ht,defined:ct,isFunction:dt,setsEqual:ut,_isClickEvent:ft,toFontString:Ut,_measureText:Xt,_longestText:qt,_alignPixel:Kt,clearCanvas:Gt,drawPoint:Zt,_isPointInArea:Jt,clipArea:Qt,unclipArea:te,_steppedLineTo:ee,_bezierCurveTo:ie,renderText:se,addRoundedRectPath:oe,_lookup:ae,_lookupByKey:re,_rlookupByKey:le,_filterBetween:he,listenArrayEvents:de,unlistenArrayEvents:ue,_arrayUnique:fe,_createResolver:oi,_attachContext:ai,_descriptors:ri,splineCurve:vi,splineCurveMonotone:wi,_updateBezierControlPoints:ki,_isDomSupported:ge,_getParentNode:pe,getStyle:be,getRelativePosition:ve,getMaximumSize:Me,retinaScale:ke,supportsEventListenerOptions:Se,readUsedSize:Pe,fontString:function(t,e,i){return e+" "+t+"px "+i},requestAnimFrame:t,throttled:e,debounce:i,_toLeftRightCenter:s,_alignStartEnd:n,_textX:o,_pointInLine:Oi,_steppedInterpolation:Ai,_bezierInterpolation:Ti,formatNumber:Ri,toLineHeight:Fe,_readValueToProps:Be,toTRBL:Ve,toTRBLCorners:We,toPadding:Ne,toFont:He,resolve:je,_addGrace:$e,createContext:Ye,PI:_t,TAU:yt,PITAU:vt,INFINITY:wt,RAD_PER_DEG:Mt,HALF_PI:kt,QUARTER_PI:St,TWO_THIRDS_PI:Pt,log10:Dt,sign:Ct,niceNum:Ot,_factorize:At,isNumber:Tt,almostEquals:Lt,almostWhole:Rt,_setMinAndMaxByKey:Et,toRadians:It,toDegrees:zt,_decimalPlaces:Ft,getAngleFromPoint:Bt,distanceBetweenPoints:Vt,_angleDiff:Wt,_normalizeAngle:Nt,_angleBetween:Ht,_limitValue:jt,_int16Range:$t,_isBetween:Yt,getRtlAdapter:Ei,overrideTextDirection:Ii,restoreTextDirection:zi,_boundSegment:Vi,_boundSegments:Wi,_computeSegments:Ni});class Ui{acquireContext(t,e){}releaseContext(t){return!1}addEventListener(t,e,i){}removeEventListener(t,e,i){}getDevicePixelRatio(){return 1}getMaximumSize(t,e,i,s){return e=Math.max(0,e||t.width),i=i||t.height,{width:e,height:Math.max(0,s?Math.floor(e/s):i)}}isAttached(t){return!0}updateConfig(t){}}class Xi extends Ui{acquireContext(t){return t&&t.getContext&&t.getContext("2d")||null}updateConfig(t){t.options.animation=!1}}const qi={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"},Ki=t=>null===t||""===t;const Gi=!!Se&&{passive:!0};function Zi(t,e,i){t.canvas.removeEventListener(e,i,Gi)}function Ji(t,e){for(const i of t)if(i===e||i.contains(e))return!0}function Qi(t,e,i){const s=t.canvas,n=new MutationObserver((t=>{let e=!1;for(const i of t)e=e||Ji(i.addedNodes,s),e=e&&!Ji(i.removedNodes,s);e&&i()}));return n.observe(document,{childList:!0,subtree:!0}),n}function ts(t,e,i){const s=t.canvas,n=new MutationObserver((t=>{let e=!1;for(const i of t)e=e||Ji(i.removedNodes,s),e=e&&!Ji(i.addedNodes,s);e&&i()}));return n.observe(document,{childList:!0,subtree:!0}),n}const es=new Map;let is=0;function ss(){const t=window.devicePixelRatio;t!==is&&(is=t,es.forEach(((e,i)=>{i.currentDevicePixelRatio!==t&&e()})))}function ns(t,i,s){const n=t.canvas,o=n&&pe(n);if(!o)return;const a=e(((t,e)=>{const i=o.clientWidth;s(t,e),i<o.clientWidth&&s()}),window),r=new ResizeObserver((t=>{const e=t[0],i=e.contentRect.width,s=e.contentRect.height;0===i&&0===s||a(i,s)}));return r.observe(o),function(t,e){es.size||window.addEventListener("resize",ss),es.set(t,e)}(t,a),r}function os(t,e,i){i&&i.disconnect(),"resize"===e&&function(t){es.delete(t),es.size||window.removeEventListener("resize",ss)}(t)}function as(t,i,s){const n=t.canvas,o=e((e=>{null!==t.ctx&&s(function(t,e){const i=qi[t.type]||t.type,{x:s,y:n}=ve(t,e);return{type:i,chart:e,native:t,x:void 0!==s?s:null,y:void 0!==n?n:null}}(e,t))}),t,(t=>{const e=t[0];return[e,e.offsetX,e.offsetY]}));return function(t,e,i){t.addEventListener(e,i,Gi)}(n,i,o),o}class rs extends Ui{acquireContext(t,e){const i=t&&t.getContext&&t.getContext("2d");return i&&i.canvas===t?(function(t,e){const i=t.style,s=t.getAttribute("height"),n=t.getAttribute("width");if(t.$chartjs={initial:{height:s,width:n,style:{display:i.display,height:i.height,width:i.width}}},i.display=i.display||"block",i.boxSizing=i.boxSizing||"border-box",Ki(n)){const e=Pe(t,"width");void 0!==e&&(t.width=e)}if(Ki(s))if(""===t.style.height)t.height=t.width/(e||2);else{const e=Pe(t,"height");void 0!==e&&(t.height=e)}}(t,e),i):null}releaseContext(t){const e=t.canvas;if(!e.$chartjs)return!1;const i=e.$chartjs.initial;["height","width"].forEach((t=>{const s=i[t];$(s)?e.removeAttribute(t):e.setAttribute(t,s)}));const s=i.style||{};return Object.keys(s).forEach((t=>{e.style[t]=s[t]})),e.width=e.width,delete e.$chartjs,!0}addEventListener(t,e,i){this.removeEventListener(t,e);const s=t.$proxies||(t.$proxies={}),n={attach:Qi,detach:ts,resize:ns}[e]||as;s[e]=n(t,e,i)}removeEventListener(t,e){const i=t.$proxies||(t.$proxies={}),s=i[e];if(!s)return;({attach:os,detach:os,resize:os}[e]||Zi)(t,e,s),i[e]=void 0}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(t,e,i,s){return Me(t,e,i,s)}isAttached(t){const e=pe(t);return!(!e||!e.isConnected)}}function ls(t){return!ge()||"undefined"!=typeof OffscreenCanvas&&t instanceof OffscreenCanvas?Xi:rs}var hs=Object.freeze({__proto__:null,_detectPlatform:ls,BasePlatform:Ui,BasicPlatform:Xi,DomPlatform:rs});const cs="transparent",ds={boolean:(t,e,i)=>i>.5?e:t,color(t,e,i){const s=W(t||cs),n=s.valid&&W(e||cs);return n&&n.valid?n.mix(s,i).hexString():e},number:(t,e,i)=>t+(e-t)*i};class us{constructor(t,e,i,s){const n=e[i];s=je([t.to,s,n,t.from]);const o=je([t.from,n,s]);this._active=!0,this._fn=t.fn||ds[t.type||typeof o],this._easing=Ci[t.easing]||Ci.linear,this._start=Math.floor(Date.now()+(t.delay||0)),this._duration=this._total=Math.floor(t.duration),this._loop=!!t.loop,this._target=e,this._prop=i,this._from=o,this._to=s,this._promises=void 0}active(){return this._active}update(t,e,i){if(this._active){this._notify(!1);const s=this._target[this._prop],n=i-this._start,o=this._duration-n;this._start=i,this._duration=Math.floor(Math.max(o,t.duration)),this._total+=n,this._loop=!!t.loop,this._to=je([t.to,e,s,t.from]),this._from=je([t.from,s,e])}}cancel(){this._active&&(this.tick(Date.now()),this._active=!1,this._notify(!1))}tick(t){const e=t-this._start,i=this._duration,s=this._prop,n=this._from,o=this._loop,a=this._to;let r;if(this._active=n!==a&&(o||e<i),!this._active)return this._target[s]=a,void this._notify(!0);e<0?this._target[s]=n:(r=e/i%2,r=o&&r>1?2-r:r,r=this._easing(Math.min(1,Math.max(0,r))),this._target[s]=this._fn(n,a,r))}wait(){const t=this._promises||(this._promises=[]);return new Promise(((e,i)=>{t.push({res:e,rej:i})}))}_notify(t){const e=t?"res":"rej",i=this._promises||[];for(let t=0;t<i.length;t++)i[t][e]()}}bt.set("animation",{delay:void 0,duration:1e3,easing:"easeOutQuart",fn:void 0,from:void 0,loop:void 0,to:void 0,type:void 0});const fs=Object.keys(bt.animation);bt.describe("animation",{_fallback:!1,_indexable:!1,_scriptable:t=>"onProgress"!==t&&"onComplete"!==t&&"fn"!==t}),bt.set("animations",{colors:{type:"color",properties:["color","borderColor","backgroundColor"]},numbers:{type:"number",properties:["x","y","borderWidth","radius","tension"]}}),bt.describe("animations",{_fallback:"animation"}),bt.set("transitions",{active:{animation:{duration:400}},resize:{animation:{duration:0}},show:{animations:{colors:{from:"transparent"},visible:{type:"boolean",duration:0}}},hide:{animations:{colors:{to:"transparent"},visible:{type:"boolean",easing:"linear",fn:t=>0|t}}}});class gs{constructor(t,e){this._chart=t,this._properties=new Map,this.configure(e)}configure(t){if(!U(t))return;const e=this._properties;Object.getOwnPropertyNames(t).forEach((i=>{const s=t[i];if(!U(s))return;const n={};for(const t of fs)n[t]=s[t];(Y(s.properties)&&s.properties||[i]).forEach((t=>{t!==i&&e.has(t)||e.set(t,n)}))}))}_animateOptions(t,e){const i=e.options,s=function(t,e){if(!e)return;let i=t.options;if(!i)return void(t.options=e);i.$shared&&(t.options=i=Object.assign({},i,{$shared:!1,$animations:{}}));return i}(t,i);if(!s)return[];const n=this._createAnimations(s,i);return i.$shared&&function(t,e){const i=[],s=Object.keys(e);for(let e=0;e<s.length;e++){const n=t[s[e]];n&&n.active()&&i.push(n.wait())}return Promise.all(i)}(t.options.$animations,i).then((()=>{t.options=i}),(()=>{})),n}_createAnimations(t,e){const i=this._properties,s=[],n=t.$animations||(t.$animations={}),o=Object.keys(e),a=Date.now();let r;for(r=o.length-1;r>=0;--r){const l=o[r];if("$"===l.charAt(0))continue;if("options"===l){s.push(...this._animateOptions(t,e));continue}const h=e[l];let c=n[l];const d=i.get(l);if(c){if(d&&c.active()){c.update(d,h,a);continue}c.cancel()}d&&d.duration?(n[l]=c=new us(d,t,l,h),s.push(c)):t[l]=h}return s}update(t,e){if(0===this._properties.size)return void Object.assign(t,e);const i=this._createAnimations(t,e);return i.length?(a.add(this._chart,i),!0):void 0}}function ps(t,e){const i=t&&t.options||{},s=i.reverse,n=void 0===i.min?e:0,o=void 0===i.max?e:0;return{start:s?o:n,end:s?n:o}}function ms(t,e){const i=[],s=t._getSortedDatasetMetas(e);let n,o;for(n=0,o=s.length;n<o;++n)i.push(s[n].index);return i}function xs(t,e,i,s={}){const n=t.keys,o="single"===s.mode;let a,r,l,h;if(null!==e){for(a=0,r=n.length;a<r;++a){if(l=+n[a],l===i){if(s.all)continue;break}h=t.values[l],X(h)&&(o||0===e||Ct(e)===Ct(h))&&(e+=h)}return e}}function bs(t,e){const i=t&&t.options.stacked;return i||void 0===i&&void 0!==e.stack}function _s(t,e,i){const s=t[e]||(t[e]={});return s[i]||(s[i]={})}function ys(t,e,i,s){for(const n of e.getMatchingVisibleMetas(s).reverse()){const e=t[n.index];if(i&&e>0||!i&&e<0)return n.index}return null}function vs(t,e){const{chart:i,_cachedMeta:s}=t,n=i._stacks||(i._stacks={}),{iScale:o,vScale:a,index:r}=s,l=o.axis,h=a.axis,c=function(t,e,i){return`${t.id}.${e.id}.${i.stack||i.type}`}(o,a,s),d=e.length;let u;for(let t=0;t<d;++t){const i=e[t],{[l]:o,[h]:d}=i;u=(i._stacks||(i._stacks={}))[h]=_s(n,c,o),u[r]=d,u._top=ys(u,a,!0,s.type),u._bottom=ys(u,a,!1,s.type)}}function ws(t,e){const i=t.scales;return Object.keys(i).filter((t=>i[t].axis===e)).shift()}function Ms(t,e){const i=t.controller.index,s=t.vScale&&t.vScale.axis;if(s){e=e||t._parsed;for(const t of e){const e=t._stacks;if(!e||void 0===e[s]||void 0===e[s][i])return;delete e[s][i]}}}const ks=t=>"reset"===t||"none"===t,Ss=(t,e)=>e?t:Object.assign({},t);class Ps{constructor(t,e){this.chart=t,this._ctx=t.ctx,this.index=e,this._cachedDataOpts={},this._cachedMeta=this.getMeta(),this._type=this._cachedMeta.type,this.options=void 0,this._parsing=!1,this._data=void 0,this._objectData=void 0,this._sharedOptions=void 0,this._drawStart=void 0,this._drawCount=void 0,this.enableOptionSharing=!1,this.$context=void 0,this._syncList=[],this.initialize()}initialize(){const t=this._cachedMeta;this.configure(),this.linkScales(),t._stacked=bs(t.vScale,t),this.addElements()}updateIndex(t){this.index!==t&&Ms(this._cachedMeta),this.index=t}linkScales(){const t=this.chart,e=this._cachedMeta,i=this.getDataset(),s=(t,e,i,s)=>"x"===t?e:"r"===t?s:i,n=e.xAxisID=K(i.xAxisID,ws(t,"x")),o=e.yAxisID=K(i.yAxisID,ws(t,"y")),a=e.rAxisID=K(i.rAxisID,ws(t,"r")),r=e.indexAxis,l=e.iAxisID=s(r,n,o,a),h=e.vAxisID=s(r,o,n,a);e.xScale=this.getScaleForId(n),e.yScale=this.getScaleForId(o),e.rScale=this.getScaleForId(a),e.iScale=this.getScaleForId(l),e.vScale=this.getScaleForId(h)}getDataset(){return this.chart.data.datasets[this.index]}getMeta(){return this.chart.getDatasetMeta(this.index)}getScaleForId(t){return this.chart.scales[t]}_getOtherScale(t){const e=this._cachedMeta;return t===e.iScale?e.vScale:e.iScale}reset(){this._update("reset")}_destroy(){const t=this._cachedMeta;this._data&&ue(this._data,this),t._stacked&&Ms(t)}_dataCheck(){const t=this.getDataset(),e=t.data||(t.data=[]),i=this._data;if(U(e))this._data=function(t){const e=Object.keys(t),i=new Array(e.length);let s,n,o;for(s=0,n=e.length;s<n;++s)o=e[s],i[s]={x:o,y:t[o]};return i}(e);else if(i!==e){if(i){ue(i,this);const t=this._cachedMeta;Ms(t),t._parsed=[]}e&&Object.isExtensible(e)&&de(e,this),this._syncList=[],this._data=e}}addElements(){const t=this._cachedMeta;this._dataCheck(),this.datasetElementType&&(t.dataset=new this.datasetElementType)}buildOrUpdateElements(t){const e=this._cachedMeta,i=this.getDataset();let s=!1;this._dataCheck();const n=e._stacked;e._stacked=bs(e.vScale,e),e.stack!==i.stack&&(s=!0,Ms(e),e.stack=i.stack),this._resyncElements(t),(s||n!==e._stacked)&&vs(this,e._parsed)}configure(){const t=this.chart.config,e=t.datasetScopeKeys(this._type),i=t.getOptionScopes(this.getDataset(),e,!0);this.options=t.createResolver(i,this.getContext()),this._parsing=this.options.parsing,this._cachedDataOpts={}}parse(t,e){const{_cachedMeta:i,_data:s}=this,{iScale:n,_stacked:o}=i,a=n.axis;let r,l,h,c=0===t&&e===s.length||i._sorted,d=t>0&&i._parsed[t-1];if(!1===this._parsing)i._parsed=s,i._sorted=!0,h=s;else{h=Y(s[t])?this.parseArrayData(i,s,t,e):U(s[t])?this.parseObjectData(i,s,t,e):this.parsePrimitiveData(i,s,t,e);const n=()=>null===l[a]||d&&l[a]<d[a];for(r=0;r<e;++r)i._parsed[r+t]=l=h[r],c&&(n()&&(c=!1),d=l);i._sorted=c}o&&vs(this,h)}parsePrimitiveData(t,e,i,s){const{iScale:n,vScale:o}=t,a=n.axis,r=o.axis,l=n.getLabels(),h=n===o,c=new Array(s);let d,u,f;for(d=0,u=s;d<u;++d)f=d+i,c[d]={[a]:h||n.parse(l[f],f),[r]:o.parse(e[f],f)};return c}parseArrayData(t,e,i,s){const{xScale:n,yScale:o}=t,a=new Array(s);let r,l,h,c;for(r=0,l=s;r<l;++r)h=r+i,c=e[h],a[r]={x:n.parse(c[0],h),y:o.parse(c[1],h)};return a}parseObjectData(t,e,i,s){const{xScale:n,yScale:o}=t,{xAxisKey:a="x",yAxisKey:r="y"}=this._parsing,l=new Array(s);let h,c,d,u;for(h=0,c=s;h<c;++h)d=h+i,u=e[d],l[h]={x:n.parse(lt(u,a),d),y:o.parse(lt(u,r),d)};return l}getParsed(t){return this._cachedMeta._parsed[t]}getDataElement(t){return this._cachedMeta.data[t]}applyStack(t,e,i){const s=this.chart,n=this._cachedMeta,o=e[t.axis];return xs({keys:ms(s,!0),values:e._stacks[t.axis]},o,n.index,{mode:i})}updateRangeFromParsed(t,e,i,s){const n=i[e.axis];let o=null===n?NaN:n;const a=s&&i._stacks[e.axis];s&&a&&(s.values=a,o=xs(s,n,this._cachedMeta.index)),t.min=Math.min(t.min,o),t.max=Math.max(t.max,o)}getMinMax(t,e){const i=this._cachedMeta,s=i._parsed,n=i._sorted&&t===i.iScale,o=s.length,a=this._getOtherScale(t),r=((t,e,i)=>t&&!e.hidden&&e._stacked&&{keys:ms(i,!0),values:null})(e,i,this.chart),l={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY},{min:h,max:c}=function(t){const{min:e,max:i,minDefined:s,maxDefined:n}=t.getUserBounds();return{min:s?e:Number.NEGATIVE_INFINITY,max:n?i:Number.POSITIVE_INFINITY}}(a);let d,u;function f(){u=s[d];const e=u[a.axis];return!X(u[t.axis])||h>e||c<e}for(d=0;d<o&&(f()||(this.updateRangeFromParsed(l,t,u,r),!n));++d);if(n)for(d=o-1;d>=0;--d)if(!f()){this.updateRangeFromParsed(l,t,u,r);break}return l}getAllParsedValues(t){const e=this._cachedMeta._parsed,i=[];let s,n,o;for(s=0,n=e.length;s<n;++s)o=e[s][t.axis],X(o)&&i.push(o);return i}getMaxOverflow(){return!1}getLabelAndValue(t){const e=this._cachedMeta,i=e.iScale,s=e.vScale,n=this.getParsed(t);return{label:i?""+i.getLabelForValue(n[i.axis]):"",value:s?""+s.getLabelForValue(n[s.axis]):""}}_update(t){const e=this._cachedMeta;this.update(t||"default"),e._clip=function(t){let e,i,s,n;return U(t)?(e=t.top,i=t.right,s=t.bottom,n=t.left):e=i=s=n=t,{top:e,right:i,bottom:s,left:n,disabled:!1===t}}(K(this.options.clip,function(t,e,i){if(!1===i)return!1;const s=ps(t,i),n=ps(e,i);return{top:n.end,right:s.end,bottom:n.start,left:s.start}}(e.xScale,e.yScale,this.getMaxOverflow())))}update(t){}draw(){const t=this._ctx,e=this.chart,i=this._cachedMeta,s=i.data||[],n=e.chartArea,o=[],a=this._drawStart||0,r=this._drawCount||s.length-a,l=this.options.drawActiveElementsOnTop;let h;for(i.dataset&&i.dataset.draw(t,n,a,r),h=a;h<a+r;++h){const e=s[h];e.hidden||(e.active&&l?o.push(e):e.draw(t,n))}for(h=0;h<o.length;++h)o[h].draw(t,n)}getStyle(t,e){const i=e?"active":"default";return void 0===t&&this._cachedMeta.dataset?this.resolveDatasetElementOptions(i):this.resolveDataElementOptions(t||0,i)}getContext(t,e,i){const s=this.getDataset();let n;if(t>=0&&t<this._cachedMeta.data.length){const e=this._cachedMeta.data[t];n=e.$context||(e.$context=function(t,e,i){return Ye(t,{active:!1,dataIndex:e,parsed:void 0,raw:void 0,element:i,index:e,mode:"default",type:"data"})}(this.getContext(),t,e)),n.parsed=this.getParsed(t),n.raw=s.data[t],n.index=n.dataIndex=t}else n=this.$context||(this.$context=function(t,e){return Ye(t,{active:!1,dataset:void 0,datasetIndex:e,index:e,mode:"default",type:"dataset"})}(this.chart.getContext(),this.index)),n.dataset=s,n.index=n.datasetIndex=this.index;return n.active=!!e,n.mode=i,n}resolveDatasetElementOptions(t){return this._resolveElementOptions(this.datasetElementType.id,t)}resolveDataElementOptions(t,e){return this._resolveElementOptions(this.dataElementType.id,e,t)}_resolveElementOptions(t,e="default",i){const s="active"===e,n=this._cachedDataOpts,o=t+"-"+e,a=n[o],r=this.enableOptionSharing&&ct(i);if(a)return Ss(a,r);const l=this.chart.config,h=l.datasetElementScopeKeys(this._type,t),c=s?[`${t}Hover`,"hover",t,""]:[t,""],d=l.getOptionScopes(this.getDataset(),h),u=Object.keys(bt.elements[t]),f=l.resolveNamedOptions(d,u,(()=>this.getContext(i,s)),c);return f.$shared&&(f.$shared=r,n[o]=Object.freeze(Ss(f,r))),f}_resolveAnimations(t,e,i){const s=this.chart,n=this._cachedDataOpts,o=`animation-${e}`,a=n[o];if(a)return a;let r;if(!1!==s.options.animation){const s=this.chart.config,n=s.datasetAnimationScopeKeys(this._type,e),o=s.getOptionScopes(this.getDataset(),n);r=s.createResolver(o,this.getContext(t,i,e))}const l=new gs(s,r&&r.animations);return r&&r._cacheable&&(n[o]=Object.freeze(l)),l}getSharedOptions(t){if(t.$shared)return this._sharedOptions||(this._sharedOptions=Object.assign({},t))}includeOptions(t,e){return!e||ks(t)||this.chart._animationsDisabled}updateElement(t,e,i,s){ks(s)?Object.assign(t,i):this._resolveAnimations(e,s).update(t,i)}updateSharedOptions(t,e,i){t&&!ks(e)&&this._resolveAnimations(void 0,e).update(t,i)}_setStyle(t,e,i,s){t.active=s;const n=this.getStyle(e,s);this._resolveAnimations(e,i,s).update(t,{options:!s&&this.getSharedOptions(n)||n})}removeHoverStyle(t,e,i){this._setStyle(t,i,"active",!1)}setHoverStyle(t,e,i){this._setStyle(t,i,"active",!0)}_removeDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!1)}_setDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!0)}_resyncElements(t){const e=this._data,i=this._cachedMeta.data;for(const[t,e,i]of this._syncList)this[t](e,i);this._syncList=[];const s=i.length,n=e.length,o=Math.min(n,s);o&&this.parse(0,o),n>s?this._insertElements(s,n-s,t):n<s&&this._removeElements(n,s-n)}_insertElements(t,e,i=!0){const s=this._cachedMeta,n=s.data,o=t+e;let a;const r=t=>{for(t.length+=e,a=t.length-1;a>=o;a--)t[a]=t[a-e]};for(r(n),a=t;a<o;++a)n[a]=new this.dataElementType;this._parsing&&r(s._parsed),this.parse(t,e),i&&this.updateElements(n,t,e,"reset")}updateElements(t,e,i,s){}_removeElements(t,e){const i=this._cachedMeta;if(this._parsing){const s=i._parsed.splice(t,e);i._stacked&&Ms(i,s)}i.data.splice(t,e)}_sync(t){if(this._parsing)this._syncList.push(t);else{const[e,i,s]=t;this[e](i,s)}this.chart._dataChanges.push([this.index,...t])}_onDataPush(){const t=arguments.length;this._sync(["_insertElements",this.getDataset().data.length-t,t])}_onDataPop(){this._sync(["_removeElements",this._cachedMeta.data.length-1,1])}_onDataShift(){this._sync(["_removeElements",0,1])}_onDataSplice(t,e){e&&this._sync(["_removeElements",t,e]);const i=arguments.length-2;i&&this._sync(["_insertElements",t,i])}_onDataUnshift(){this._sync(["_insertElements",0,arguments.length])}}Ps.defaults={},Ps.prototype.datasetElementType=null,Ps.prototype.dataElementType=null;class Ds{constructor(){this.x=void 0,this.y=void 0,this.active=!1,this.options=void 0,this.$animations=void 0}tooltipPosition(t){const{x:e,y:i}=this.getProps(["x","y"],t);return{x:e,y:i}}hasValue(){return Tt(this.x)&&Tt(this.y)}getProps(t,e){const i=this.$animations;if(!e||!i)return this;const s={};return t.forEach((t=>{s[t]=i[t]&&i[t].active()?i[t]._to:this[t]})),s}}Ds.defaults={},Ds.defaultRoutes=void 0;const Cs={values:t=>Y(t)?t:""+t,numeric(t,e,i){if(0===t)return"0";const s=this.chart.options.locale;let n,o=t;if(i.length>1){const e=Math.max(Math.abs(i[0].value),Math.abs(i[i.length-1].value));(e<1e-4||e>1e15)&&(n="scientific"),o=function(t,e){let i=e.length>3?e[2].value-e[1].value:e[1].value-e[0].value;Math.abs(i)>=1&&t!==Math.floor(t)&&(i=t-Math.floor(t));return i}(t,i)}const a=Dt(Math.abs(o)),r=Math.max(Math.min(-1*Math.floor(a),20),0),l={notation:n,minimumFractionDigits:r,maximumFractionDigits:r};return Object.assign(l,this.options.ticks.format),Ri(t,s,l)},logarithmic(t,e,i){if(0===t)return"0";const s=t/Math.pow(10,Math.floor(Dt(t)));return 1===s||2===s||5===s?Cs.numeric.call(this,t,e,i):""}};var Os={formatters:Cs};function As(t,e){const i=t.options.ticks,s=i.maxTicksLimit||function(t){const e=t.options.offset,i=t._tickSize(),s=t._length/i+(e?0:1),n=t._maxLength/i;return Math.floor(Math.min(s,n))}(t),n=i.major.enabled?function(t){const e=[];let i,s;for(i=0,s=t.length;i<s;i++)t[i].major&&e.push(i);return e}(e):[],o=n.length,a=n[0],r=n[o-1],l=[];if(o>s)return function(t,e,i,s){let n,o=0,a=i[0];for(s=Math.ceil(s),n=0;n<t.length;n++)n===a&&(e.push(t[n]),o++,a=i[o*s])}(e,l,n,o/s),l;const h=function(t,e,i){const s=function(t){const e=t.length;let i,s;if(e<2)return!1;for(s=t[0],i=1;i<e;++i)if(t[i]-t[i-1]!==s)return!1;return s}(t),n=e.length/i;if(!s)return Math.max(n,1);const o=At(s);for(let t=0,e=o.length-1;t<e;t++){const e=o[t];if(e>n)return e}return Math.max(n,1)}(n,e,s);if(o>0){let t,i;const s=o>1?Math.round((r-a)/(o-1)):null;for(Ts(e,l,h,$(s)?0:a-s,a),t=0,i=o-1;t<i;t++)Ts(e,l,h,n[t],n[t+1]);return Ts(e,l,h,r,$(s)?e.length:r+s),l}return Ts(e,l,h),l}function Ts(t,e,i,s,n){const o=K(s,0),a=Math.min(K(n,t.length),t.length);let r,l,h,c=0;for(i=Math.ceil(i),n&&(r=n-s,i=r/Math.floor(r/i)),h=o;h<0;)c++,h=Math.round(o+c*i);for(l=Math.max(o,0);l<a;l++)l===h&&(e.push(t[l]),c++,h=Math.round(o+c*i))}bt.set("scale",{display:!0,offset:!1,reverse:!1,beginAtZero:!1,bounds:"ticks",grace:0,grid:{display:!0,lineWidth:1,drawBorder:!0,drawOnChartArea:!0,drawTicks:!0,tickLength:8,tickWidth:(t,e)=>e.lineWidth,tickColor:(t,e)=>e.color,offset:!1,borderDash:[],borderDashOffset:0,borderWidth:1},title:{display:!1,text:"",padding:{top:4,bottom:4}},ticks:{minRotation:0,maxRotation:50,mirror:!1,textStrokeWidth:0,textStrokeColor:"",padding:3,display:!0,autoSkip:!0,autoSkipPadding:3,labelOffset:0,callback:Os.formatters.values,minor:{},major:{},align:"center",crossAlign:"near",showLabelBackdrop:!1,backdropColor:"rgba(255, 255, 255, 0.75)",backdropPadding:2}}),bt.route("scale.ticks","color","","color"),bt.route("scale.grid","color","","borderColor"),bt.route("scale.grid","borderColor","","borderColor"),bt.route("scale.title","color","","color"),bt.describe("scale",{_fallback:!1,_scriptable:t=>!t.startsWith("before")&&!t.startsWith("after")&&"callback"!==t&&"parser"!==t,_indexable:t=>"borderDash"!==t&&"tickBorderDash"!==t}),bt.describe("scales",{_fallback:"scale"}),bt.describe("scale.ticks",{_scriptable:t=>"backdropPadding"!==t&&"callback"!==t,_indexable:t=>"backdropPadding"!==t});const Ls=(t,e,i)=>"top"===e||"left"===e?t[e]+i:t[e]-i;function Rs(t,e){const i=[],s=t.length/e,n=t.length;let o=0;for(;o<n;o+=s)i.push(t[Math.floor(o)]);return i}function Es(t,e,i){const s=t.ticks.length,n=Math.min(e,s-1),o=t._startPixel,a=t._endPixel,r=1e-6;let l,h=t.getPixelForTick(n);if(!(i&&(l=1===s?Math.max(h-o,a-h):0===e?(t.getPixelForTick(1)-h)/2:(h-t.getPixelForTick(n-1))/2,h+=n<e?l:-l,h<o-r||h>a+r)))return h}function Is(t){return t.drawTicks?t.tickLength:0}function zs(t,e){if(!t.display)return 0;const i=He(t.font,e),s=Ne(t.padding);return(Y(t.text)?t.text.length:1)*i.lineHeight+s.height}function Fs(t,e,i){let n=s(t);return(i&&"right"!==e||!i&&"right"===e)&&(n=(t=>"left"===t?"right":"right"===t?"left":t)(n)),n}class Bs extends Ds{constructor(t){super(),this.id=t.id,this.type=t.type,this.options=void 0,this.ctx=t.ctx,this.chart=t.chart,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this._margins={left:0,right:0,top:0,bottom:0},this.maxWidth=void 0,this.maxHeight=void 0,this.paddingTop=void 0,this.paddingBottom=void 0,this.paddingLeft=void 0,this.paddingRight=void 0,this.axis=void 0,this.labelRotation=void 0,this.min=void 0,this.max=void 0,this._range=void 0,this.ticks=[],this._gridLineItems=null,this._labelItems=null,this._labelSizes=null,this._length=0,this._maxLength=0,this._longestTextCache={},this._startPixel=void 0,this._endPixel=void 0,this._reversePixels=!1,this._userMax=void 0,this._userMin=void 0,this._suggestedMax=void 0,this._suggestedMin=void 0,this._ticksLength=0,this._borderValue=0,this._cache={},this._dataLimitsCached=!1,this.$context=void 0}init(t){this.options=t.setContext(this.getContext()),this.axis=t.axis,this._userMin=this.parse(t.min),this._userMax=this.parse(t.max),this._suggestedMin=this.parse(t.suggestedMin),this._suggestedMax=this.parse(t.suggestedMax)}parse(t,e){return t}getUserBounds(){let{_userMin:t,_userMax:e,_suggestedMin:i,_suggestedMax:s}=this;return t=q(t,Number.POSITIVE_INFINITY),e=q(e,Number.NEGATIVE_INFINITY),i=q(i,Number.POSITIVE_INFINITY),s=q(s,Number.NEGATIVE_INFINITY),{min:q(t,i),max:q(e,s),minDefined:X(t),maxDefined:X(e)}}getMinMax(t){let e,{min:i,max:s,minDefined:n,maxDefined:o}=this.getUserBounds();if(n&&o)return{min:i,max:s};const a=this.getMatchingVisibleMetas();for(let r=0,l=a.length;r<l;++r)e=a[r].controller.getMinMax(this,t),n||(i=Math.min(i,e.min)),o||(s=Math.max(s,e.max));return i=o&&i>s?s:i,s=n&&i>s?i:s,{min:q(i,q(s,i)),max:q(s,q(i,s))}}getPadding(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}}getTicks(){return this.ticks}getLabels(){const t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels||[]}beforeLayout(){this._cache={},this._dataLimitsCached=!1}beforeUpdate(){J(this.options.beforeUpdate,[this])}update(t,e,i){const{beginAtZero:s,grace:n,ticks:o}=this.options,a=o.sampleSize;this.beforeUpdate(),this.maxWidth=t,this.maxHeight=e,this._margins=i=Object.assign({left:0,right:0,top:0,bottom:0},i),this.ticks=null,this._labelSizes=null,this._gridLineItems=null,this._labelItems=null,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this._maxLength=this.isHorizontal()?this.width+i.left+i.right:this.height+i.top+i.bottom,this._dataLimitsCached||(this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this._range=$e(this,n,s),this._dataLimitsCached=!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();const r=a<this.ticks.length;this._convertTicksToLabels(r?Rs(this.ticks,a):this.ticks),this.configure(),this.beforeCalculateLabelRotation(),this.calculateLabelRotation(),this.afterCalculateLabelRotation(),o.display&&(o.autoSkip||"auto"===o.source)&&(this.ticks=As(this,this.ticks),this._labelSizes=null),r&&this._convertTicksToLabels(this.ticks),this.beforeFit(),this.fit(),this.afterFit(),this.afterUpdate()}configure(){let t,e,i=this.options.reverse;this.isHorizontal()?(t=this.left,e=this.right):(t=this.top,e=this.bottom,i=!i),this._startPixel=t,this._endPixel=e,this._reversePixels=i,this._length=e-t,this._alignToPixels=this.options.alignToPixels}afterUpdate(){J(this.options.afterUpdate,[this])}beforeSetDimensions(){J(this.options.beforeSetDimensions,[this])}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=0,this.right=this.width):(this.height=this.maxHeight,this.top=0,this.bottom=this.height),this.paddingLeft=0,this.paddingTop=0,this.paddingRight=0,this.paddingBottom=0}afterSetDimensions(){J(this.options.afterSetDimensions,[this])}_callHooks(t){this.chart.notifyPlugins(t,this.getContext()),J(this.options[t],[this])}beforeDataLimits(){this._callHooks("beforeDataLimits")}determineDataLimits(){}afterDataLimits(){this._callHooks("afterDataLimits")}beforeBuildTicks(){this._callHooks("beforeBuildTicks")}buildTicks(){return[]}afterBuildTicks(){this._callHooks("afterBuildTicks")}beforeTickToLabelConversion(){J(this.options.beforeTickToLabelConversion,[this])}generateTickLabels(t){const e=this.options.ticks;let i,s,n;for(i=0,s=t.length;i<s;i++)n=t[i],n.label=J(e.callback,[n.value,i,t],this)}afterTickToLabelConversion(){J(this.options.afterTickToLabelConversion,[this])}beforeCalculateLabelRotation(){J(this.options.beforeCalculateLabelRotation,[this])}calculateLabelRotation(){const t=this.options,e=t.ticks,i=this.ticks.length,s=e.minRotation||0,n=e.maxRotation;let o,a,r,l=s;if(!this._isVisible()||!e.display||s>=n||i<=1||!this.isHorizontal())return void(this.labelRotation=s);const h=this._getLabelSizes(),c=h.widest.width,d=h.highest.height,u=jt(this.chart.width-c,0,this.maxWidth);o=t.offset?this.maxWidth/i:u/(i-1),c+6>o&&(o=u/(i-(t.offset?.5:1)),a=this.maxHeight-Is(t.grid)-e.padding-zs(t.title,this.chart.options.font),r=Math.sqrt(c*c+d*d),l=zt(Math.min(Math.asin(jt((h.highest.height+6)/o,-1,1)),Math.asin(jt(a/r,-1,1))-Math.asin(jt(d/r,-1,1)))),l=Math.max(s,Math.min(n,l))),this.labelRotation=l}afterCalculateLabelRotation(){J(this.options.afterCalculateLabelRotation,[this])}beforeFit(){J(this.options.beforeFit,[this])}fit(){const t={width:0,height:0},{chart:e,options:{ticks:i,title:s,grid:n}}=this,o=this._isVisible(),a=this.isHorizontal();if(o){const o=zs(s,e.options.font);if(a?(t.width=this.maxWidth,t.height=Is(n)+o):(t.height=this.maxHeight,t.width=Is(n)+o),i.display&&this.ticks.length){const{first:e,last:s,widest:n,highest:o}=this._getLabelSizes(),r=2*i.padding,l=It(this.labelRotation),h=Math.cos(l),c=Math.sin(l);if(a){const e=i.mirror?0:c*n.width+h*o.height;t.height=Math.min(this.maxHeight,t.height+e+r)}else{const e=i.mirror?0:h*n.width+c*o.height;t.width=Math.min(this.maxWidth,t.width+e+r)}this._calculatePadding(e,s,c,h)}}this._handleMargins(),a?(this.width=this._length=e.width-this._margins.left-this._margins.right,this.height=t.height):(this.width=t.width,this.height=this._length=e.height-this._margins.top-this._margins.bottom)}_calculatePadding(t,e,i,s){const{ticks:{align:n,padding:o},position:a}=this.options,r=0!==this.labelRotation,l="top"!==a&&"x"===this.axis;if(this.isHorizontal()){const a=this.getPixelForTick(0)-this.left,h=this.right-this.getPixelForTick(this.ticks.length-1);let c=0,d=0;r?l?(c=s*t.width,d=i*e.height):(c=i*t.height,d=s*e.width):"start"===n?d=e.width:"end"===n?c=t.width:(c=t.width/2,d=e.width/2),this.paddingLeft=Math.max((c-a+o)*this.width/(this.width-a),0),this.paddingRight=Math.max((d-h+o)*this.width/(this.width-h),0)}else{let i=e.height/2,s=t.height/2;"start"===n?(i=0,s=t.height):"end"===n&&(i=e.height,s=0),this.paddingTop=i+o,this.paddingBottom=s+o}}_handleMargins(){this._margins&&(this._margins.left=Math.max(this.paddingLeft,this._margins.left),this._margins.top=Math.max(this.paddingTop,this._margins.top),this._margins.right=Math.max(this.paddingRight,this._margins.right),this._margins.bottom=Math.max(this.paddingBottom,this._margins.bottom))}afterFit(){J(this.options.afterFit,[this])}isHorizontal(){const{axis:t,position:e}=this.options;return"top"===e||"bottom"===e||"x"===t}isFullSize(){return this.options.fullSize}_convertTicksToLabels(t){let e,i;for(this.beforeTickToLabelConversion(),this.generateTickLabels(t),e=0,i=t.length;e<i;e++)$(t[e].label)&&(t.splice(e,1),i--,e--);this.afterTickToLabelConversion()}_getLabelSizes(){let t=this._labelSizes;if(!t){const e=this.options.ticks.sampleSize;let i=this.ticks;e<i.length&&(i=Rs(i,e)),this._labelSizes=t=this._computeLabelSizes(i,i.length)}return t}_computeLabelSizes(t,e){const{ctx:i,_longestTextCache:s}=this,n=[],o=[];let a,r,l,h,c,d,u,f,g,p,m,x=0,b=0;for(a=0;a<e;++a){if(h=t[a].label,c=this._resolveTickFontOptions(a),i.font=d=c.string,u=s[d]=s[d]||{data:{},gc:[]},f=c.lineHeight,g=p=0,$(h)||Y(h)){if(Y(h))for(r=0,l=h.length;r<l;++r)m=h[r],$(m)||Y(m)||(g=Xt(i,u.data,u.gc,g,m),p+=f)}else g=Xt(i,u.data,u.gc,g,h),p=f;n.push(g),o.push(p),x=Math.max(g,x),b=Math.max(p,b)}!function(t,e){Q(t,(t=>{const i=t.gc,s=i.length/2;let n;if(s>e){for(n=0;n<s;++n)delete t.data[i[n]];i.splice(0,s)}}))}(s,e);const _=n.indexOf(x),y=o.indexOf(b),v=t=>({width:n[t]||0,height:o[t]||0});return{first:v(0),last:v(e-1),widest:v(_),highest:v(y),widths:n,heights:o}}getLabelForValue(t){return t}getPixelForValue(t,e){return NaN}getValueForPixel(t){}getPixelForTick(t){const e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t].value)}getPixelForDecimal(t){this._reversePixels&&(t=1-t);const e=this._startPixel+t*this._length;return $t(this._alignToPixels?Kt(this.chart,e,0):e)}getDecimalForPixel(t){const e=(t-this._startPixel)/this._length;return this._reversePixels?1-e:e}getBasePixel(){return this.getPixelForValue(this.getBaseValue())}getBaseValue(){const{min:t,max:e}=this;return t<0&&e<0?e:t>0&&e>0?t:0}getContext(t){const e=this.ticks||[];if(t>=0&&t<e.length){const i=e[t];return i.$context||(i.$context=function(t,e,i){return Ye(t,{tick:i,index:e,type:"tick"})}(this.getContext(),t,i))}return this.$context||(this.$context=Ye(this.chart.getContext(),{scale:this,type:"scale"}))}_tickSize(){const t=this.options.ticks,e=It(this.labelRotation),i=Math.abs(Math.cos(e)),s=Math.abs(Math.sin(e)),n=this._getLabelSizes(),o=t.autoSkipPadding||0,a=n?n.widest.width+o:0,r=n?n.highest.height+o:0;return this.isHorizontal()?r*i>a*s?a/i:r/s:r*s<a*i?r/i:a/s}_isVisible(){const t=this.options.display;return"auto"!==t?!!t:this.getMatchingVisibleMetas().length>0}_computeGridLineItems(t){const e=this.axis,i=this.chart,s=this.options,{grid:n,position:o}=s,a=n.offset,r=this.isHorizontal(),l=this.ticks.length+(a?1:0),h=Is(n),c=[],d=n.setContext(this.getContext()),u=d.drawBorder?d.borderWidth:0,f=u/2,g=function(t){return Kt(i,t,u)};let p,m,x,b,_,y,v,w,M,k,S,P;if("top"===o)p=g(this.bottom),y=this.bottom-h,w=p-f,k=g(t.top)+f,P=t.bottom;else if("bottom"===o)p=g(this.top),k=t.top,P=g(t.bottom)-f,y=p+f,w=this.top+h;else if("left"===o)p=g(this.right),_=this.right-h,v=p-f,M=g(t.left)+f,S=t.right;else if("right"===o)p=g(this.left),M=t.left,S=g(t.right)-f,_=p+f,v=this.left+h;else if("x"===e){if("center"===o)p=g((t.top+t.bottom)/2+.5);else if(U(o)){const t=Object.keys(o)[0],e=o[t];p=g(this.chart.scales[t].getPixelForValue(e))}k=t.top,P=t.bottom,y=p+f,w=y+h}else if("y"===e){if("center"===o)p=g((t.left+t.right)/2);else if(U(o)){const t=Object.keys(o)[0],e=o[t];p=g(this.chart.scales[t].getPixelForValue(e))}_=p-f,v=_-h,M=t.left,S=t.right}const D=K(s.ticks.maxTicksLimit,l),C=Math.max(1,Math.ceil(l/D));for(m=0;m<l;m+=C){const t=n.setContext(this.getContext(m)),e=t.lineWidth,s=t.color,o=n.borderDash||[],l=t.borderDashOffset,h=t.tickWidth,d=t.tickColor,u=t.tickBorderDash||[],f=t.tickBorderDashOffset;x=Es(this,m,a),void 0!==x&&(b=Kt(i,x,e),r?_=v=M=S=b:y=w=k=P=b,c.push({tx1:_,ty1:y,tx2:v,ty2:w,x1:M,y1:k,x2:S,y2:P,width:e,color:s,borderDash:o,borderDashOffset:l,tickWidth:h,tickColor:d,tickBorderDash:u,tickBorderDashOffset:f}))}return this._ticksLength=l,this._borderValue=p,c}_computeLabelItems(t){const e=this.axis,i=this.options,{position:s,ticks:n}=i,o=this.isHorizontal(),a=this.ticks,{align:r,crossAlign:l,padding:h,mirror:c}=n,d=Is(i.grid),u=d+h,f=c?-h:u,g=-It(this.labelRotation),p=[];let m,x,b,_,y,v,w,M,k,S,P,D,C="middle";if("top"===s)v=this.bottom-f,w=this._getXAxisLabelAlignment();else if("bottom"===s)v=this.top+f,w=this._getXAxisLabelAlignment();else if("left"===s){const t=this._getYAxisLabelAlignment(d);w=t.textAlign,y=t.x}else if("right"===s){const t=this._getYAxisLabelAlignment(d);w=t.textAlign,y=t.x}else if("x"===e){if("center"===s)v=(t.top+t.bottom)/2+u;else if(U(s)){const t=Object.keys(s)[0],e=s[t];v=this.chart.scales[t].getPixelForValue(e)+u}w=this._getXAxisLabelAlignment()}else if("y"===e){if("center"===s)y=(t.left+t.right)/2-u;else if(U(s)){const t=Object.keys(s)[0],e=s[t];y=this.chart.scales[t].getPixelForValue(e)}w=this._getYAxisLabelAlignment(d).textAlign}"y"===e&&("start"===r?C="top":"end"===r&&(C="bottom"));const O=this._getLabelSizes();for(m=0,x=a.length;m<x;++m){b=a[m],_=b.label;const t=n.setContext(this.getContext(m));M=this.getPixelForTick(m)+n.labelOffset,k=this._resolveTickFontOptions(m),S=k.lineHeight,P=Y(_)?_.length:1;const e=P/2,i=t.color,r=t.textStrokeColor,h=t.textStrokeWidth;let d;if(o?(y=M,D="top"===s?"near"===l||0!==g?-P*S+S/2:"center"===l?-O.highest.height/2-e*S+S:-O.highest.height+S/2:"near"===l||0!==g?S/2:"center"===l?O.highest.height/2-e*S:O.highest.height-P*S,c&&(D*=-1)):(v=M,D=(1-P)*S/2),t.showLabelBackdrop){const e=Ne(t.backdropPadding),i=O.heights[m],s=O.widths[m];let n=v+D-e.top,o=y-e.left;switch(C){case"middle":n-=i/2;break;case"bottom":n-=i}switch(w){case"center":o-=s/2;break;case"right":o-=s}d={left:o,top:n,width:s+e.width,height:i+e.height,color:t.backdropColor}}p.push({rotation:g,label:_,font:k,color:i,strokeColor:r,strokeWidth:h,textOffset:D,textAlign:w,textBaseline:C,translation:[y,v],backdrop:d})}return p}_getXAxisLabelAlignment(){const{position:t,ticks:e}=this.options;if(-It(this.labelRotation))return"top"===t?"left":"right";let i="center";return"start"===e.align?i="left":"end"===e.align&&(i="right"),i}_getYAxisLabelAlignment(t){const{position:e,ticks:{crossAlign:i,mirror:s,padding:n}}=this.options,o=t+n,a=this._getLabelSizes().widest.width;let r,l;return"left"===e?s?(l=this.right+n,"near"===i?r="left":"center"===i?(r="center",l+=a/2):(r="right",l+=a)):(l=this.right-o,"near"===i?r="right":"center"===i?(r="center",l-=a/2):(r="left",l=this.left)):"right"===e?s?(l=this.left+n,"near"===i?r="right":"center"===i?(r="center",l-=a/2):(r="left",l-=a)):(l=this.left+o,"near"===i?r="left":"center"===i?(r="center",l+=a/2):(r="right",l=this.right)):r="right",{textAlign:r,x:l}}_computeLabelArea(){if(this.options.ticks.mirror)return;const t=this.chart,e=this.options.position;return"left"===e||"right"===e?{top:0,left:this.left,bottom:t.height,right:this.right}:"top"===e||"bottom"===e?{top:this.top,left:0,bottom:this.bottom,right:t.width}:void 0}drawBackground(){const{ctx:t,options:{backgroundColor:e},left:i,top:s,width:n,height:o}=this;e&&(t.save(),t.fillStyle=e,t.fillRect(i,s,n,o),t.restore())}getLineWidthForValue(t){const e=this.options.grid;if(!this._isVisible()||!e.display)return 0;const i=this.ticks.findIndex((e=>e.value===t));if(i>=0){return e.setContext(this.getContext(i)).lineWidth}return 0}drawGrid(t){const e=this.options.grid,i=this.ctx,s=this._gridLineItems||(this._gridLineItems=this._computeGridLineItems(t));let n,o;const a=(t,e,s)=>{s.width&&s.color&&(i.save(),i.lineWidth=s.width,i.strokeStyle=s.color,i.setLineDash(s.borderDash||[]),i.lineDashOffset=s.borderDashOffset,i.beginPath(),i.moveTo(t.x,t.y),i.lineTo(e.x,e.y),i.stroke(),i.restore())};if(e.display)for(n=0,o=s.length;n<o;++n){const t=s[n];e.drawOnChartArea&&a({x:t.x1,y:t.y1},{x:t.x2,y:t.y2},t),e.drawTicks&&a({x:t.tx1,y:t.ty1},{x:t.tx2,y:t.ty2},{color:t.tickColor,width:t.tickWidth,borderDash:t.tickBorderDash,borderDashOffset:t.tickBorderDashOffset})}}drawBorder(){const{chart:t,ctx:e,options:{grid:i}}=this,s=i.setContext(this.getContext()),n=i.drawBorder?s.borderWidth:0;if(!n)return;const o=i.setContext(this.getContext(0)).lineWidth,a=this._borderValue;let r,l,h,c;this.isHorizontal()?(r=Kt(t,this.left,n)-n/2,l=Kt(t,this.right,o)+o/2,h=c=a):(h=Kt(t,this.top,n)-n/2,c=Kt(t,this.bottom,o)+o/2,r=l=a),e.save(),e.lineWidth=s.borderWidth,e.strokeStyle=s.borderColor,e.beginPath(),e.moveTo(r,h),e.lineTo(l,c),e.stroke(),e.restore()}drawLabels(t){if(!this.options.ticks.display)return;const e=this.ctx,i=this._computeLabelArea();i&&Qt(e,i);const s=this._labelItems||(this._labelItems=this._computeLabelItems(t));let n,o;for(n=0,o=s.length;n<o;++n){const t=s[n],i=t.font,o=t.label;t.backdrop&&(e.fillStyle=t.backdrop.color,e.fillRect(t.backdrop.left,t.backdrop.top,t.backdrop.width,t.backdrop.height)),se(e,o,0,t.textOffset,i,t)}i&&te(e)}drawTitle(){const{ctx:t,options:{position:e,title:i,reverse:s}}=this;if(!i.display)return;const o=He(i.font),a=Ne(i.padding),r=i.align;let l=o.lineHeight/2;"bottom"===e||"center"===e||U(e)?(l+=a.bottom,Y(i.text)&&(l+=o.lineHeight*(i.text.length-1))):l+=a.top;const{titleX:h,titleY:c,maxWidth:d,rotation:u}=function(t,e,i,s){const{top:o,left:a,bottom:r,right:l,chart:h}=t,{chartArea:c,scales:d}=h;let u,f,g,p=0;const m=r-o,x=l-a;if(t.isHorizontal()){if(f=n(s,a,l),U(i)){const t=Object.keys(i)[0],s=i[t];g=d[t].getPixelForValue(s)+m-e}else g="center"===i?(c.bottom+c.top)/2+m-e:Ls(t,i,e);u=l-a}else{if(U(i)){const t=Object.keys(i)[0],s=i[t];f=d[t].getPixelForValue(s)-x+e}else f="center"===i?(c.left+c.right)/2-x+e:Ls(t,i,e);g=n(s,r,o),p="left"===i?-kt:kt}return{titleX:f,titleY:g,maxWidth:u,rotation:p}}(this,l,e,r);se(t,i.text,0,0,o,{color:i.color,maxWidth:d,rotation:u,textAlign:Fs(r,e,s),textBaseline:"middle",translation:[h,c]})}draw(t){this._isVisible()&&(this.drawBackground(),this.drawGrid(t),this.drawBorder(),this.drawTitle(),this.drawLabels(t))}_layers(){const t=this.options,e=t.ticks&&t.ticks.z||0,i=K(t.grid&&t.grid.z,-1);return this._isVisible()&&this.draw===Bs.prototype.draw?[{z:i,draw:t=>{this.drawBackground(),this.drawGrid(t),this.drawTitle()}},{z:i+1,draw:()=>{this.drawBorder()}},{z:e,draw:t=>{this.drawLabels(t)}}]:[{z:e,draw:t=>{this.draw(t)}}]}getMatchingVisibleMetas(t){const e=this.chart.getSortedVisibleDatasetMetas(),i=this.axis+"AxisID",s=[];let n,o;for(n=0,o=e.length;n<o;++n){const o=e[n];o[i]!==this.id||t&&o.type!==t||s.push(o)}return s}_resolveTickFontOptions(t){return He(this.options.ticks.setContext(this.getContext(t)).font)}_maxDigits(){const t=this._resolveTickFontOptions(0).lineHeight;return(this.isHorizontal()?this.width:this.height)/t}}class Vs{constructor(t,e,i){this.type=t,this.scope=e,this.override=i,this.items=Object.create(null)}isForType(t){return Object.prototype.isPrototypeOf.call(this.type.prototype,t.prototype)}register(t){const e=Object.getPrototypeOf(t);let i;(function(t){return"id"in t&&"defaults"in t})(e)&&(i=this.register(e));const s=this.items,n=t.id,o=this.scope+"."+n;if(!n)throw new Error("class does not have id: "+t);return n in s||(s[n]=t,function(t,e,i){const s=nt(Object.create(null),[i?bt.get(i):{},bt.get(e),t.defaults]);bt.set(e,s),t.defaultRoutes&&function(t,e){Object.keys(e).forEach((i=>{const s=i.split("."),n=s.pop(),o=[t].concat(s).join("."),a=e[i].split("."),r=a.pop(),l=a.join(".");bt.route(o,n,l,r)}))}(e,t.defaultRoutes);t.descriptors&&bt.describe(e,t.descriptors)}(t,o,i),this.override&&bt.override(t.id,t.overrides)),o}get(t){return this.items[t]}unregister(t){const e=this.items,i=t.id,s=this.scope;i in e&&delete e[i],s&&i in bt[s]&&(delete bt[s][i],this.override&&delete gt[i])}}var Ws=new class{constructor(){this.controllers=new Vs(Ps,"datasets",!0),this.elements=new Vs(Ds,"elements"),this.plugins=new Vs(Object,"plugins"),this.scales=new Vs(Bs,"scales"),this._typedRegistries=[this.controllers,this.scales,this.elements]}add(...t){this._each("register",t)}remove(...t){this._each("unregister",t)}addControllers(...t){this._each("register",t,this.controllers)}addElements(...t){this._each("register",t,this.elements)}addPlugins(...t){this._each("register",t,this.plugins)}addScales(...t){this._each("register",t,this.scales)}getController(t){return this._get(t,this.controllers,"controller")}getElement(t){return this._get(t,this.elements,"element")}getPlugin(t){return this._get(t,this.plugins,"plugin")}getScale(t){return this._get(t,this.scales,"scale")}removeControllers(...t){this._each("unregister",t,this.controllers)}removeElements(...t){this._each("unregister",t,this.elements)}removePlugins(...t){this._each("unregister",t,this.plugins)}removeScales(...t){this._each("unregister",t,this.scales)}_each(t,e,i){[...e].forEach((e=>{const s=i||this._getRegistryForType(e);i||s.isForType(e)||s===this.plugins&&e.id?this._exec(t,s,e):Q(e,(e=>{const s=i||this._getRegistryForType(e);this._exec(t,s,e)}))}))}_exec(t,e,i){const s=ht(t);J(i["before"+s],[],i),e[t](i),J(i["after"+s],[],i)}_getRegistryForType(t){for(let e=0;e<this._typedRegistries.length;e++){const i=this._typedRegistries[e];if(i.isForType(t))return i}return this.plugins}_get(t,e,i){const s=e.get(t);if(void 0===s)throw new Error('"'+t+'" is not a registered '+i+".");return s}};class Ns{constructor(){this._init=[]}notify(t,e,i,s){"beforeInit"===e&&(this._init=this._createDescriptors(t,!0),this._notify(this._init,t,"install"));const n=s?this._descriptors(t).filter(s):this._descriptors(t),o=this._notify(n,t,e,i);return"afterDestroy"===e&&(this._notify(n,t,"stop"),this._notify(this._init,t,"uninstall")),o}_notify(t,e,i,s){s=s||{};for(const n of t){const t=n.plugin;if(!1===J(t[i],[e,s,n.options],t)&&s.cancelable)return!1}return!0}invalidate(){$(this._cache)||(this._oldCache=this._cache,this._cache=void 0)}_descriptors(t){if(this._cache)return this._cache;const e=this._cache=this._createDescriptors(t);return this._notifyStateChanges(t),e}_createDescriptors(t,e){const i=t&&t.config,s=K(i.options&&i.options.plugins,{}),n=function(t){const e=[],i=Object.keys(Ws.plugins.items);for(let t=0;t<i.length;t++)e.push(Ws.getPlugin(i[t]));const s=t.plugins||[];for(let t=0;t<s.length;t++){const i=s[t];-1===e.indexOf(i)&&e.push(i)}return e}(i);return!1!==s||e?function(t,e,i,s){const n=[],o=t.getContext();for(let a=0;a<e.length;a++){const r=e[a],l=Hs(i[r.id],s);null!==l&&n.push({plugin:r,options:js(t.config,r,l,o)})}return n}(t,n,s,e):[]}_notifyStateChanges(t){const e=this._oldCache||[],i=this._cache,s=(t,e)=>t.filter((t=>!e.some((e=>t.plugin.id===e.plugin.id))));this._notify(s(e,i),t,"stop"),this._notify(s(i,e),t,"start")}}function Hs(t,e){return e||!1!==t?!0===t?{}:t:null}function js(t,e,i,s){const n=t.pluginScopeKeys(e),o=t.getOptionScopes(i,n);return t.createResolver(o,s,[""],{scriptable:!1,indexable:!1,allKeys:!0})}function $s(t,e){const i=bt.datasets[t]||{};return((e.datasets||{})[t]||{}).indexAxis||e.indexAxis||i.indexAxis||"x"}function Ys(t,e){return"x"===t||"y"===t?t:e.axis||("top"===(i=e.position)||"bottom"===i?"x":"left"===i||"right"===i?"y":void 0)||t.charAt(0).toLowerCase();var i}function Us(t){const e=t.options||(t.options={});e.plugins=K(e.plugins,{}),e.scales=function(t,e){const i=gt[t.type]||{scales:{}},s=e.scales||{},n=$s(t.type,e),o=Object.create(null),a=Object.create(null);return Object.keys(s).forEach((t=>{const e=s[t];if(!U(e))return console.error(`Invalid scale configuration for scale: ${t}`);if(e._proxy)return console.warn(`Ignoring resolver passed as options for scale: ${t}`);const r=Ys(t,e),l=function(t,e){return t===e?"_index_":"_value_"}(r,n),h=i.scales||{};o[r]=o[r]||t,a[t]=ot(Object.create(null),[{axis:r},e,h[r],h[l]])})),t.data.datasets.forEach((i=>{const n=i.type||t.type,r=i.indexAxis||$s(n,e),l=(gt[n]||{}).scales||{};Object.keys(l).forEach((t=>{const e=function(t,e){let i=t;return"_index_"===t?i=e:"_value_"===t&&(i="x"===e?"y":"x"),i}(t,r),n=i[e+"AxisID"]||o[e]||e;a[n]=a[n]||Object.create(null),ot(a[n],[{axis:e},s[n],l[t]])}))})),Object.keys(a).forEach((t=>{const e=a[t];ot(e,[bt.scales[e.type],bt.scale])})),a}(t,e)}function Xs(t){return(t=t||{}).datasets=t.datasets||[],t.labels=t.labels||[],t}const qs=new Map,Ks=new Set;function Gs(t,e){let i=qs.get(t);return i||(i=e(),qs.set(t,i),Ks.add(i)),i}const Zs=(t,e,i)=>{const s=lt(e,i);void 0!==s&&t.add(s)};class Js{constructor(t){this._config=function(t){return(t=t||{}).data=Xs(t.data),Us(t),t}(t),this._scopeCache=new Map,this._resolverCache=new Map}get platform(){return this._config.platform}get type(){return this._config.type}set type(t){this._config.type=t}get data(){return this._config.data}set data(t){this._config.data=Xs(t)}get options(){return this._config.options}set options(t){this._config.options=t}get plugins(){return this._config.plugins}update(){const t=this._config;this.clearCache(),Us(t)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(t){return Gs(t,(()=>[[`datasets.${t}`,""]]))}datasetAnimationScopeKeys(t,e){return Gs(`${t}.transition.${e}`,(()=>[[`datasets.${t}.transitions.${e}`,`transitions.${e}`],[`datasets.${t}`,""]]))}datasetElementScopeKeys(t,e){return Gs(`${t}-${e}`,(()=>[[`datasets.${t}.elements.${e}`,`datasets.${t}`,`elements.${e}`,""]]))}pluginScopeKeys(t){const e=t.id;return Gs(`${this.type}-plugin-${e}`,(()=>[[`plugins.${e}`,...t.additionalOptionScopes||[]]]))}_cachedScopes(t,e){const i=this._scopeCache;let s=i.get(t);return s&&!e||(s=new Map,i.set(t,s)),s}getOptionScopes(t,e,i){const{options:s,type:n}=this,o=this._cachedScopes(t,i),a=o.get(e);if(a)return a;const r=new Set;e.forEach((e=>{t&&(r.add(t),e.forEach((e=>Zs(r,t,e)))),e.forEach((t=>Zs(r,s,t))),e.forEach((t=>Zs(r,gt[n]||{},t))),e.forEach((t=>Zs(r,bt,t))),e.forEach((t=>Zs(r,pt,t)))}));const l=Array.from(r);return 0===l.length&&l.push(Object.create(null)),Ks.has(e)&&o.set(e,l),l}chartOptionScopes(){const{options:t,type:e}=this;return[t,gt[e]||{},bt.datasets[e]||{},{type:e},bt,pt]}resolveNamedOptions(t,e,i,s=[""]){const n={$shared:!0},{resolver:o,subPrefixes:a}=Qs(this._resolverCache,t,s);let r=o;if(function(t,e){const{isScriptable:i,isIndexable:s}=ri(t);for(const n of e){const e=i(n),o=s(n),a=(o||e)&&t[n];if(e&&(dt(a)||tn(a))||o&&Y(a))return!0}return!1}(o,e)){n.$shared=!1;r=ai(o,i=dt(i)?i():i,this.createResolver(t,i,a))}for(const t of e)n[t]=r[t];return n}createResolver(t,e,i=[""],s){const{resolver:n}=Qs(this._resolverCache,t,i);return U(e)?ai(n,e,void 0,s):n}}function Qs(t,e,i){let s=t.get(e);s||(s=new Map,t.set(e,s));const n=i.join();let o=s.get(n);if(!o){o={resolver:oi(e,i),subPrefixes:i.filter((t=>!t.toLowerCase().includes("hover")))},s.set(n,o)}return o}const tn=t=>U(t)&&Object.getOwnPropertyNames(t).reduce(((e,i)=>e||dt(t[i])),!1);const en=["top","bottom","left","right","chartArea"];function sn(t,e){return"top"===t||"bottom"===t||-1===en.indexOf(t)&&"x"===e}function nn(t,e){return function(i,s){return i[t]===s[t]?i[e]-s[e]:i[t]-s[t]}}function on(t){const e=t.chart,i=e.options.animation;e.notifyPlugins("afterRender"),J(i&&i.onComplete,[t],e)}function an(t){const e=t.chart,i=e.options.animation;J(i&&i.onProgress,[t],e)}function rn(t){return ge()&&"string"==typeof t?t=document.getElementById(t):t&&t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas),t}const ln={},hn=t=>{const e=rn(t);return Object.values(ln).filter((t=>t.canvas===e)).pop()};function cn(t,e,i){const s=Object.keys(t);for(const n of s){const s=+n;if(s>=e){const o=t[n];delete t[n],(i>0||s>e)&&(t[s+i]=o)}}}class dn{constructor(t,e){const s=this.config=new Js(e),n=rn(t),o=hn(n);if(o)throw new Error("Canvas is already in use. Chart with ID '"+o.id+"' must be destroyed before the canvas can be reused.");const r=s.createResolver(s.chartOptionScopes(),this.getContext());this.platform=new(s.platform||ls(n)),this.platform.updateConfig(s);const l=this.platform.acquireContext(n,r.aspectRatio),h=l&&l.canvas,c=h&&h.height,d=h&&h.width;this.id=j(),this.ctx=l,this.canvas=h,this.width=d,this.height=c,this._options=r,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._responsiveListeners=void 0,this._sortedMetasets=[],this.scales={},this._plugins=new Ns,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=i((t=>this.update(t)),r.resizeDelay||0),this._dataChanges=[],ln[this.id]=this,l&&h?(a.listen(this,"complete",on),a.listen(this,"progress",an),this._initialize(),this.attached&&this.update()):console.error("Failed to create chart: can't acquire context from the given item")}get aspectRatio(){const{options:{aspectRatio:t,maintainAspectRatio:e},width:i,height:s,_aspectRatio:n}=this;return $(t)?e&&n?n:s?i/s:null:t}get data(){return this.config.data}set data(t){this.config.data=t}get options(){return this._options}set options(t){this.config.options=t}_initialize(){return this.notifyPlugins("beforeInit"),this.options.responsive?this.resize():ke(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins("afterInit"),this}clear(){return Gt(this.canvas,this.ctx),this}stop(){return a.stop(this),this}resize(t,e){a.running(this)?this._resizeBeforeDraw={width:t,height:e}:this._resize(t,e)}_resize(t,e){const i=this.options,s=this.canvas,n=i.maintainAspectRatio&&this.aspectRatio,o=this.platform.getMaximumSize(s,t,e,n),a=i.devicePixelRatio||this.platform.getDevicePixelRatio(),r=this.width?"resize":"attach";this.width=o.width,this.height=o.height,this._aspectRatio=this.aspectRatio,ke(this,a,!0)&&(this.notifyPlugins("resize",{size:o}),J(i.onResize,[this,o],this),this.attached&&this._doResize(r)&&this.render())}ensureScalesHaveIDs(){Q(this.options.scales||{},((t,e)=>{t.id=e}))}buildOrUpdateScales(){const t=this.options,e=t.scales,i=this.scales,s=Object.keys(i).reduce(((t,e)=>(t[e]=!1,t)),{});let n=[];e&&(n=n.concat(Object.keys(e).map((t=>{const i=e[t],s=Ys(t,i),n="r"===s,o="x"===s;return{options:i,dposition:n?"chartArea":o?"bottom":"left",dtype:n?"radialLinear":o?"category":"linear"}})))),Q(n,(e=>{const n=e.options,o=n.id,a=Ys(o,n),r=K(n.type,e.dtype);void 0!==n.position&&sn(n.position,a)===sn(e.dposition)||(n.position=e.dposition),s[o]=!0;let l=null;if(o in i&&i[o].type===r)l=i[o];else{l=new(Ws.getScale(r))({id:o,type:r,ctx:this.ctx,chart:this}),i[l.id]=l}l.init(n,t)})),Q(s,((t,e)=>{t||delete i[e]})),Q(i,(t=>{ni.configure(this,t,t.options),ni.addBox(this,t)}))}_updateMetasets(){const t=this._metasets,e=this.data.datasets.length,i=t.length;if(t.sort(((t,e)=>t.index-e.index)),i>e){for(let t=e;t<i;++t)this._destroyDatasetMeta(t);t.splice(e,i-e)}this._sortedMetasets=t.slice(0).sort(nn("order","index"))}_removeUnreferencedMetasets(){const{_metasets:t,data:{datasets:e}}=this;t.length>e.length&&delete this._stacks,t.forEach(((t,i)=>{0===e.filter((e=>e===t._dataset)).length&&this._destroyDatasetMeta(i)}))}buildOrUpdateControllers(){const t=[],e=this.data.datasets;let i,s;for(this._removeUnreferencedMetasets(),i=0,s=e.length;i<s;i++){const s=e[i];let n=this.getDatasetMeta(i);const o=s.type||this.config.type;if(n.type&&n.type!==o&&(this._destroyDatasetMeta(i),n=this.getDatasetMeta(i)),n.type=o,n.indexAxis=s.indexAxis||$s(o,this.options),n.order=s.order||0,n.index=i,n.label=""+s.label,n.visible=this.isDatasetVisible(i),n.controller)n.controller.updateIndex(i),n.controller.linkScales();else{const e=Ws.getController(o),{datasetElementType:s,dataElementType:a}=bt.datasets[o];Object.assign(e.prototype,{dataElementType:Ws.getElement(a),datasetElementType:s&&Ws.getElement(s)}),n.controller=new e(this,i),t.push(n.controller)}}return this._updateMetasets(),t}_resetElements(){Q(this.data.datasets,((t,e)=>{this.getDatasetMeta(e).controller.reset()}),this)}reset(){this._resetElements(),this.notifyPlugins("reset")}update(t){const e=this.config;e.update();const i=this._options=e.createResolver(e.chartOptionScopes(),this.getContext()),s=this._animationsDisabled=!i.animation;if(this._updateScales(),this._checkEventBindings(),this._updateHiddenIndices(),this._plugins.invalidate(),!1===this.notifyPlugins("beforeUpdate",{mode:t,cancelable:!0}))return;const n=this.buildOrUpdateControllers();this.notifyPlugins("beforeElementsUpdate");let o=0;for(let t=0,e=this.data.datasets.length;t<e;t++){const{controller:e}=this.getDatasetMeta(t),i=!s&&-1===n.indexOf(e);e.buildOrUpdateElements(i),o=Math.max(+e.getMaxOverflow(),o)}o=this._minPadding=i.layout.autoPadding?o:0,this._updateLayout(o),s||Q(n,(t=>{t.reset()})),this._updateDatasets(t),this.notifyPlugins("afterUpdate",{mode:t}),this._layers.sort(nn("z","_idx"));const{_active:a,_lastEvent:r}=this;r?this._eventHandler(r,!0):a.length&&this._updateHoverStyles(a,a,!0),this.render()}_updateScales(){Q(this.scales,(t=>{ni.removeBox(this,t)})),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){const t=this.options,e=new Set(Object.keys(this._listeners)),i=new Set(t.events);ut(e,i)&&!!this._responsiveListeners===t.responsive||(this.unbindEvents(),this.bindEvents())}_updateHiddenIndices(){const{_hiddenIndices:t}=this,e=this._getUniformDataChanges()||[];for(const{method:i,start:s,count:n}of e){cn(t,s,"_removeElements"===i?-n:n)}}_getUniformDataChanges(){const t=this._dataChanges;if(!t||!t.length)return;this._dataChanges=[];const e=this.data.datasets.length,i=e=>new Set(t.filter((t=>t[0]===e)).map(((t,e)=>e+","+t.splice(1).join(",")))),s=i(0);for(let t=1;t<e;t++)if(!ut(s,i(t)))return;return Array.from(s).map((t=>t.split(","))).map((t=>({method:t[1],start:+t[2],count:+t[3]})))}_updateLayout(t){if(!1===this.notifyPlugins("beforeLayout",{cancelable:!0}))return;ni.update(this,this.width,this.height,t);const e=this.chartArea,i=e.width<=0||e.height<=0;this._layers=[],Q(this.boxes,(t=>{i&&"chartArea"===t.position||(t.configure&&t.configure(),this._layers.push(...t._layers()))}),this),this._layers.forEach(((t,e)=>{t._idx=e})),this.notifyPlugins("afterLayout")}_updateDatasets(t){if(!1!==this.notifyPlugins("beforeDatasetsUpdate",{mode:t,cancelable:!0})){for(let t=0,e=this.data.datasets.length;t<e;++t)this.getDatasetMeta(t).controller.configure();for(let e=0,i=this.data.datasets.length;e<i;++e)this._updateDataset(e,dt(t)?t({datasetIndex:e}):t);this.notifyPlugins("afterDatasetsUpdate",{mode:t})}}_updateDataset(t,e){const i=this.getDatasetMeta(t),s={meta:i,index:t,mode:e,cancelable:!0};!1!==this.notifyPlugins("beforeDatasetUpdate",s)&&(i.controller._update(e),s.cancelable=!1,this.notifyPlugins("afterDatasetUpdate",s))}render(){!1!==this.notifyPlugins("beforeRender",{cancelable:!0})&&(a.has(this)?this.attached&&!a.running(this)&&a.start(this):(this.draw(),on({chart:this})))}draw(){let t;if(this._resizeBeforeDraw){const{width:t,height:e}=this._resizeBeforeDraw;this._resize(t,e),this._resizeBeforeDraw=null}if(this.clear(),this.width<=0||this.height<=0)return;if(!1===this.notifyPlugins("beforeDraw",{cancelable:!0}))return;const e=this._layers;for(t=0;t<e.length&&e[t].z<=0;++t)e[t].draw(this.chartArea);for(this._drawDatasets();t<e.length;++t)e[t].draw(this.chartArea);this.notifyPlugins("afterDraw")}_getSortedDatasetMetas(t){const e=this._sortedMetasets,i=[];let s,n;for(s=0,n=e.length;s<n;++s){const n=e[s];t&&!n.visible||i.push(n)}return i}getSortedVisibleDatasetMetas(){return this._getSortedDatasetMetas(!0)}_drawDatasets(){if(!1===this.notifyPlugins("beforeDatasetsDraw",{cancelable:!0}))return;const t=this.getSortedVisibleDatasetMetas();for(let e=t.length-1;e>=0;--e)this._drawDataset(t[e]);this.notifyPlugins("afterDatasetsDraw")}_drawDataset(t){const e=this.ctx,i=t._clip,s=!i.disabled,n=this.chartArea,o={meta:t,index:t.index,cancelable:!0};!1!==this.notifyPlugins("beforeDatasetDraw",o)&&(s&&Qt(e,{left:!1===i.left?0:n.left-i.left,right:!1===i.right?this.width:n.right+i.right,top:!1===i.top?0:n.top-i.top,bottom:!1===i.bottom?this.height:n.bottom+i.bottom}),t.controller.draw(),s&&te(e),o.cancelable=!1,this.notifyPlugins("afterDatasetDraw",o))}getElementsAtEventForMode(t,e,i,s){const n=Ee.modes[e];return"function"==typeof n?n(this,t,i,s):[]}getDatasetMeta(t){const e=this.data.datasets[t],i=this._metasets;let s=i.filter((t=>t&&t._dataset===e)).pop();return s||(s={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:e&&e.order||0,index:t,_dataset:e,_parsed:[],_sorted:!1},i.push(s)),s}getContext(){return this.$context||(this.$context=Ye(null,{chart:this,type:"chart"}))}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(t){const e=this.data.datasets[t];if(!e)return!1;const i=this.getDatasetMeta(t);return"boolean"==typeof i.hidden?!i.hidden:!e.hidden}setDatasetVisibility(t,e){this.getDatasetMeta(t).hidden=!e}toggleDataVisibility(t){this._hiddenIndices[t]=!this._hiddenIndices[t]}getDataVisibility(t){return!this._hiddenIndices[t]}_updateVisibility(t,e,i){const s=i?"show":"hide",n=this.getDatasetMeta(t),o=n.controller._resolveAnimations(void 0,s);ct(e)?(n.data[e].hidden=!i,this.update()):(this.setDatasetVisibility(t,i),o.update(n,{visible:i}),this.update((e=>e.datasetIndex===t?s:void 0)))}hide(t,e){this._updateVisibility(t,e,!1)}show(t,e){this._updateVisibility(t,e,!0)}_destroyDatasetMeta(t){const e=this._metasets[t];e&&e.controller&&e.controller._destroy(),delete this._metasets[t]}_stop(){let t,e;for(this.stop(),a.remove(this),t=0,e=this.data.datasets.length;t<e;++t)this._destroyDatasetMeta(t)}destroy(){this.notifyPlugins("beforeDestroy");const{canvas:t,ctx:e}=this;this._stop(),this.config.clearCache(),t&&(this.unbindEvents(),Gt(t,e),this.platform.releaseContext(e),this.canvas=null,this.ctx=null),this.notifyPlugins("destroy"),delete ln[this.id],this.notifyPlugins("afterDestroy")}toBase64Image(...t){return this.canvas.toDataURL(...t)}bindEvents(){this.bindUserEvents(),this.options.responsive?this.bindResponsiveEvents():this.attached=!0}bindUserEvents(){const t=this._listeners,e=this.platform,i=(i,s)=>{e.addEventListener(this,i,s),t[i]=s},s=(t,e,i)=>{t.offsetX=e,t.offsetY=i,this._eventHandler(t)};Q(this.options.events,(t=>i(t,s)))}bindResponsiveEvents(){this._responsiveListeners||(this._responsiveListeners={});const t=this._responsiveListeners,e=this.platform,i=(i,s)=>{e.addEventListener(this,i,s),t[i]=s},s=(i,s)=>{t[i]&&(e.removeEventListener(this,i,s),delete t[i])},n=(t,e)=>{this.canvas&&this.resize(t,e)};let o;const a=()=>{s("attach",a),this.attached=!0,this.resize(),i("resize",n),i("detach",o)};o=()=>{this.attached=!1,s("resize",n),this._stop(),this._resize(0,0),i("attach",a)},e.isAttached(this.canvas)?a():o()}unbindEvents(){Q(this._listeners,((t,e)=>{this.platform.removeEventListener(this,e,t)})),this._listeners={},Q(this._responsiveListeners,((t,e)=>{this.platform.removeEventListener(this,e,t)})),this._responsiveListeners=void 0}updateHoverStyle(t,e,i){const s=i?"set":"remove";let n,o,a,r;for("dataset"===e&&(n=this.getDatasetMeta(t[0].datasetIndex),n.controller["_"+s+"DatasetHoverStyle"]()),a=0,r=t.length;a<r;++a){o=t[a];const e=o&&this.getDatasetMeta(o.datasetIndex).controller;e&&e[s+"HoverStyle"](o.element,o.datasetIndex,o.index)}}getActiveElements(){return this._active||[]}setActiveElements(t){const e=this._active||[],i=t.map((({datasetIndex:t,index:e})=>{const i=this.getDatasetMeta(t);if(!i)throw new Error("No dataset found at index "+t);return{datasetIndex:t,element:i.data[e],index:e}}));!tt(i,e)&&(this._active=i,this._lastEvent=null,this._updateHoverStyles(i,e))}notifyPlugins(t,e,i){return this._plugins.notify(this,t,e,i)}_updateHoverStyles(t,e,i){const s=this.options.hover,n=(t,e)=>t.filter((t=>!e.some((e=>t.datasetIndex===e.datasetIndex&&t.index===e.index)))),o=n(e,t),a=i?t:n(t,e);o.length&&this.updateHoverStyle(o,s.mode,!1),a.length&&s.mode&&this.updateHoverStyle(a,s.mode,!0)}_eventHandler(t,e){const i={event:t,replay:e,cancelable:!0,inChartArea:Jt(t,this.chartArea,this._minPadding)},s=e=>(e.options.events||this.options.events).includes(t.native.type);if(!1===this.notifyPlugins("beforeEvent",i,s))return;const n=this._handleEvent(t,e,i.inChartArea);return i.cancelable=!1,this.notifyPlugins("afterEvent",i,s),(n||i.changed)&&this.render(),this}_handleEvent(t,e,i){const{_active:s=[],options:n}=this,o=e,a=this._getActiveElements(t,s,i,o),r=ft(t),l=function(t,e,i,s){return i&&"mouseout"!==t.type?s?e:t:null}(t,this._lastEvent,i,r);i&&(this._lastEvent=null,J(n.onHover,[t,a,this],this),r&&J(n.onClick,[t,a,this],this));const h=!tt(a,s);return(h||e)&&(this._active=a,this._updateHoverStyles(a,s,e)),this._lastEvent=l,h}_getActiveElements(t,e,i,s){if("mouseout"===t.type)return[];if(!i)return e;const n=this.options.hover;return this.getElementsAtEventForMode(t,n.mode,n,s)}}const un=()=>Q(dn.instances,(t=>t._plugins.invalidate())),fn=!0;function gn(){throw new Error("This method is not implemented: Check that a complete date adapter is provided.")}Object.defineProperties(dn,{defaults:{enumerable:fn,value:bt},instances:{enumerable:fn,value:ln},overrides:{enumerable:fn,value:gt},registry:{enumerable:fn,value:Ws},version:{enumerable:fn,value:"3.7.0"},getChart:{enumerable:fn,value:hn},register:{enumerable:fn,value:(...t)=>{Ws.add(...t),un()}},unregister:{enumerable:fn,value:(...t)=>{Ws.remove(...t),un()}}});class pn{constructor(t){this.options=t||{}}formats(){return gn()}parse(t,e){return gn()}format(t,e){return gn()}add(t,e,i){return gn()}diff(t,e,i){return gn()}startOf(t,e,i){return gn()}endOf(t,e){return gn()}}pn.override=function(t){Object.assign(pn.prototype,t)};var mn={_date:pn};function xn(t){const e=t.iScale,i=function(t,e){if(!t._cache.$bar){const i=t.getMatchingVisibleMetas(e);let s=[];for(let e=0,n=i.length;e<n;e++)s=s.concat(i[e].controller.getAllParsedValues(t));t._cache.$bar=fe(s.sort(((t,e)=>t-e)))}return t._cache.$bar}(e,t.type);let s,n,o,a,r=e._length;const l=()=>{32767!==o&&-32768!==o&&(ct(a)&&(r=Math.min(r,Math.abs(o-a)||r)),a=o)};for(s=0,n=i.length;s<n;++s)o=e.getPixelForValue(i[s]),l();for(a=void 0,s=0,n=e.ticks.length;s<n;++s)o=e.getPixelForTick(s),l();return r}function bn(t,e,i,s){return Y(t)?function(t,e,i,s){const n=i.parse(t[0],s),o=i.parse(t[1],s),a=Math.min(n,o),r=Math.max(n,o);let l=a,h=r;Math.abs(a)>Math.abs(r)&&(l=r,h=a),e[i.axis]=h,e._custom={barStart:l,barEnd:h,start:n,end:o,min:a,max:r}}(t,e,i,s):e[i.axis]=i.parse(t,s),e}function _n(t,e,i,s){const n=t.iScale,o=t.vScale,a=n.getLabels(),r=n===o,l=[];let h,c,d,u;for(h=i,c=i+s;h<c;++h)u=e[h],d={},d[n.axis]=r||n.parse(a[h],h),l.push(bn(u,d,o,h));return l}function yn(t){return t&&void 0!==t.barStart&&void 0!==t.barEnd}function vn(t,e,i,s){let n=e.borderSkipped;const o={};if(!n)return void(t.borderSkipped=o);const{start:a,end:r,reverse:l,top:h,bottom:c}=function(t){let e,i,s,n,o;return t.horizontal?(e=t.base>t.x,i="left",s="right"):(e=t.base<t.y,i="bottom",s="top"),e?(n="end",o="start"):(n="start",o="end"),{start:i,end:s,reverse:e,top:n,bottom:o}}(t);"middle"===n&&i&&(t.enableBorderRadius=!0,(i._top||0)===s?n=h:(i._bottom||0)===s?n=c:(o[wn(c,a,r,l)]=!0,n=h)),o[wn(n,a,r,l)]=!0,t.borderSkipped=o}function wn(t,e,i,s){var n,o,a;return s?(a=i,t=Mn(t=(n=t)===(o=e)?a:n===a?o:n,i,e)):t=Mn(t,e,i),t}function Mn(t,e,i){return"start"===t?e:"end"===t?i:t}function kn(t,{inflateAmount:e},i){t.inflateAmount="auto"===e?1===i?.33:0:e}class Sn extends Ps{parsePrimitiveData(t,e,i,s){return _n(t,e,i,s)}parseArrayData(t,e,i,s){return _n(t,e,i,s)}parseObjectData(t,e,i,s){const{iScale:n,vScale:o}=t,{xAxisKey:a="x",yAxisKey:r="y"}=this._parsing,l="x"===n.axis?a:r,h="x"===o.axis?a:r,c=[];let d,u,f,g;for(d=i,u=i+s;d<u;++d)g=e[d],f={},f[n.axis]=n.parse(lt(g,l),d),c.push(bn(lt(g,h),f,o,d));return c}updateRangeFromParsed(t,e,i,s){super.updateRangeFromParsed(t,e,i,s);const n=i._custom;n&&e===this._cachedMeta.vScale&&(t.min=Math.min(t.min,n.min),t.max=Math.max(t.max,n.max))}getMaxOverflow(){return 0}getLabelAndValue(t){const e=this._cachedMeta,{iScale:i,vScale:s}=e,n=this.getParsed(t),o=n._custom,a=yn(o)?"["+o.start+", "+o.end+"]":""+s.getLabelForValue(n[s.axis]);return{label:""+i.getLabelForValue(n[i.axis]),value:a}}initialize(){this.enableOptionSharing=!0,super.initialize();this._cachedMeta.stack=this.getDataset().stack}update(t){const e=this._cachedMeta;this.updateElements(e.data,0,e.data.length,t)}updateElements(t,e,i,s){const n="reset"===s,{index:o,_cachedMeta:{vScale:a}}=this,r=a.getBasePixel(),l=a.isHorizontal(),h=this._getRuler(),c=this.resolveDataElementOptions(e,s),d=this.getSharedOptions(c),u=this.includeOptions(s,d);this.updateSharedOptions(d,s,c);for(let c=e;c<e+i;c++){const e=this.getParsed(c),i=n||$(e[a.axis])?{base:r,head:r}:this._calculateBarValuePixels(c),f=this._calculateBarIndexPixels(c,h),g=(e._stacks||{})[a.axis],p={horizontal:l,base:i.base,enableBorderRadius:!g||yn(e._custom)||o===g._top||o===g._bottom,x:l?i.head:f.center,y:l?f.center:i.head,height:l?f.size:Math.abs(i.size),width:l?Math.abs(i.size):f.size};u&&(p.options=d||this.resolveDataElementOptions(c,t[c].active?"active":s));const m=p.options||t[c].options;vn(p,m,g,o),kn(p,m,h.ratio),this.updateElement(t[c],c,p,s)}}_getStacks(t,e){const i=this._cachedMeta.iScale,s=i.getMatchingVisibleMetas(this._type),n=i.options.stacked,o=s.length,a=[];let r,l;for(r=0;r<o;++r)if(l=s[r],l.controller.options.grouped){if(void 0!==e){const t=l.controller.getParsed(e)[l.controller._cachedMeta.vScale.axis];if($(t)||isNaN(t))continue}if((!1===n||-1===a.indexOf(l.stack)||void 0===n&&void 0===l.stack)&&a.push(l.stack),l.index===t)break}return a.length||a.push(void 0),a}_getStackCount(t){return this._getStacks(void 0,t).length}_getStackIndex(t,e,i){const s=this._getStacks(t,i),n=void 0!==e?s.indexOf(e):-1;return-1===n?s.length-1:n}_getRuler(){const t=this.options,e=this._cachedMeta,i=e.iScale,s=[];let n,o;for(n=0,o=e.data.length;n<o;++n)s.push(i.getPixelForValue(this.getParsed(n)[i.axis],n));const a=t.barThickness;return{min:a||xn(e),pixels:s,start:i._startPixel,end:i._endPixel,stackCount:this._getStackCount(),scale:i,grouped:t.grouped,ratio:a?1:t.categoryPercentage*t.barPercentage}}_calculateBarValuePixels(t){const{_cachedMeta:{vScale:e,_stacked:i},options:{base:s,minBarLength:n}}=this,o=s||0,a=this.getParsed(t),r=a._custom,l=yn(r);let h,c,d=a[e.axis],u=0,f=i?this.applyStack(e,a,i):d;f!==d&&(u=f-d,f=d),l&&(d=r.barStart,f=r.barEnd-r.barStart,0!==d&&Ct(d)!==Ct(r.barEnd)&&(u=0),u+=d);const g=$(s)||l?u:s;let p=e.getPixelForValue(g);if(h=this.chart.getDataVisibility(t)?e.getPixelForValue(u+f):p,c=h-p,Math.abs(c)<n&&(c=function(t,e,i){return 0!==t?Ct(t):(e.isHorizontal()?1:-1)*(e.min>=i?1:-1)}(c,e,o)*n,d===o&&(p-=c/2),h=p+c),p===e.getPixelForValue(o)){const t=Ct(c)*e.getLineWidthForValue(o)/2;p+=t,c-=t}return{size:c,base:p,head:h,center:h+c/2}}_calculateBarIndexPixels(t,e){const i=e.scale,s=this.options,n=s.skipNull,o=K(s.maxBarThickness,1/0);let a,r;if(e.grouped){const i=n?this._getStackCount(t):e.stackCount,l="flex"===s.barThickness?function(t,e,i,s){const n=e.pixels,o=n[t];let a=t>0?n[t-1]:null,r=t<n.length-1?n[t+1]:null;const l=i.categoryPercentage;null===a&&(a=o-(null===r?e.end-e.start:r-o)),null===r&&(r=o+o-a);const h=o-(o-Math.min(a,r))/2*l;return{chunk:Math.abs(r-a)/2*l/s,ratio:i.barPercentage,start:h}}(t,e,s,i):function(t,e,i,s){const n=i.barThickness;let o,a;return $(n)?(o=e.min*i.categoryPercentage,a=i.barPercentage):(o=n*s,a=1),{chunk:o/s,ratio:a,start:e.pixels[t]-o/2}}(t,e,s,i),h=this._getStackIndex(this.index,this._cachedMeta.stack,n?t:void 0);a=l.start+l.chunk*h+l.chunk/2,r=Math.min(o,l.chunk*l.ratio)}else a=i.getPixelForValue(this.getParsed(t)[i.axis],t),r=Math.min(o,e.min*e.ratio);return{base:a-r/2,head:a+r/2,center:a,size:r}}draw(){const t=this._cachedMeta,e=t.vScale,i=t.data,s=i.length;let n=0;for(;n<s;++n)null!==this.getParsed(n)[e.axis]&&i[n].draw(this._ctx)}}Sn.id="bar",Sn.defaults={datasetElementType:!1,dataElementType:"bar",categoryPercentage:.8,barPercentage:.9,grouped:!0,animations:{numbers:{type:"number",properties:["x","y","base","width","height"]}}},Sn.overrides={scales:{_index_:{type:"category",offset:!0,grid:{offset:!0}},_value_:{type:"linear",beginAtZero:!0}}};class Pn extends Ps{initialize(){this.enableOptionSharing=!0,super.initialize()}parsePrimitiveData(t,e,i,s){const n=super.parsePrimitiveData(t,e,i,s);for(let t=0;t<n.length;t++)n[t]._custom=this.resolveDataElementOptions(t+i).radius;return n}parseArrayData(t,e,i,s){const n=super.parseArrayData(t,e,i,s);for(let t=0;t<n.length;t++){const s=e[i+t];n[t]._custom=K(s[2],this.resolveDataElementOptions(t+i).radius)}return n}parseObjectData(t,e,i,s){const n=super.parseObjectData(t,e,i,s);for(let t=0;t<n.length;t++){const s=e[i+t];n[t]._custom=K(s&&s.r&&+s.r,this.resolveDataElementOptions(t+i).radius)}return n}getMaxOverflow(){const t=this._cachedMeta.data;let e=0;for(let i=t.length-1;i>=0;--i)e=Math.max(e,t[i].size(this.resolveDataElementOptions(i))/2);return e>0&&e}getLabelAndValue(t){const e=this._cachedMeta,{xScale:i,yScale:s}=e,n=this.getParsed(t),o=i.getLabelForValue(n.x),a=s.getLabelForValue(n.y),r=n._custom;return{label:e.label,value:"("+o+", "+a+(r?", "+r:"")+")"}}update(t){const e=this._cachedMeta.data;this.updateElements(e,0,e.length,t)}updateElements(t,e,i,s){const n="reset"===s,{iScale:o,vScale:a}=this._cachedMeta,r=this.resolveDataElementOptions(e,s),l=this.getSharedOptions(r),h=this.includeOptions(s,l),c=o.axis,d=a.axis;for(let r=e;r<e+i;r++){const e=t[r],i=!n&&this.getParsed(r),l={},u=l[c]=n?o.getPixelForDecimal(.5):o.getPixelForValue(i[c]),f=l[d]=n?a.getBasePixel():a.getPixelForValue(i[d]);l.skip=isNaN(u)||isNaN(f),h&&(l.options=this.resolveDataElementOptions(r,e.active?"active":s),n&&(l.options.radius=0)),this.updateElement(e,r,l,s)}this.updateSharedOptions(l,s,r)}resolveDataElementOptions(t,e){const i=this.getParsed(t);let s=super.resolveDataElementOptions(t,e);s.$shared&&(s=Object.assign({},s,{$shared:!1}));const n=s.radius;return"active"!==e&&(s.radius=0),s.radius+=K(i&&i._custom,n),s}}Pn.id="bubble",Pn.defaults={datasetElementType:!1,dataElementType:"point",animations:{numbers:{type:"number",properties:["x","y","borderWidth","radius"]}}},Pn.overrides={scales:{x:{type:"linear"},y:{type:"linear"}},plugins:{tooltip:{callbacks:{title:()=>""}}}};class Dn extends Ps{constructor(t,e){super(t,e),this.enableOptionSharing=!0,this.innerRadius=void 0,this.outerRadius=void 0,this.offsetX=void 0,this.offsetY=void 0}linkScales(){}parse(t,e){const i=this.getDataset().data,s=this._cachedMeta;if(!1===this._parsing)s._parsed=i;else{let n,o,a=t=>+i[t];if(U(i[t])){const{key:t="value"}=this._parsing;a=e=>+lt(i[e],t)}for(n=t,o=t+e;n<o;++n)s._parsed[n]=a(n)}}_getRotation(){return It(this.options.rotation-90)}_getCircumference(){return It(this.options.circumference)}_getRotationExtents(){let t=yt,e=-yt;for(let i=0;i<this.chart.data.datasets.length;++i)if(this.chart.isDatasetVisible(i)){const s=this.chart.getDatasetMeta(i).controller,n=s._getRotation(),o=s._getCircumference();t=Math.min(t,n),e=Math.max(e,n+o)}return{rotation:t,circumference:e-t}}update(t){const e=this.chart,{chartArea:i}=e,s=this._cachedMeta,n=s.data,o=this.getMaxBorderWidth()+this.getMaxOffset(n)+this.options.spacing,a=Math.max((Math.min(i.width,i.height)-o)/2,0),r=Math.min(G(this.options.cutout,a),1),l=this._getRingWeight(this.index),{circumference:h,rotation:c}=this._getRotationExtents(),{ratioX:d,ratioY:u,offsetX:f,offsetY:g}=function(t,e,i){let s=1,n=1,o=0,a=0;if(e<yt){const r=t,l=r+e,h=Math.cos(r),c=Math.sin(r),d=Math.cos(l),u=Math.sin(l),f=(t,e,s)=>Ht(t,r,l,!0)?1:Math.max(e,e*i,s,s*i),g=(t,e,s)=>Ht(t,r,l,!0)?-1:Math.min(e,e*i,s,s*i),p=f(0,h,d),m=f(kt,c,u),x=g(_t,h,d),b=g(_t+kt,c,u);s=(p-x)/2,n=(m-b)/2,o=-(p+x)/2,a=-(m+b)/2}return{ratioX:s,ratioY:n,offsetX:o,offsetY:a}}(c,h,r),p=(i.width-o)/d,m=(i.height-o)/u,x=Math.max(Math.min(p,m)/2,0),b=Z(this.options.radius,x),_=(b-Math.max(b*r,0))/this._getVisibleDatasetWeightTotal();this.offsetX=f*b,this.offsetY=g*b,s.total=this.calculateTotal(),this.outerRadius=b-_*this._getRingWeightOffset(this.index),this.innerRadius=Math.max(this.outerRadius-_*l,0),this.updateElements(n,0,n.length,t)}_circumference(t,e){const i=this.options,s=this._cachedMeta,n=this._getCircumference();return e&&i.animation.animateRotate||!this.chart.getDataVisibility(t)||null===s._parsed[t]||s.data[t].hidden?0:this.calculateCircumference(s._parsed[t]*n/yt)}updateElements(t,e,i,s){const n="reset"===s,o=this.chart,a=o.chartArea,r=o.options.animation,l=(a.left+a.right)/2,h=(a.top+a.bottom)/2,c=n&&r.animateScale,d=c?0:this.innerRadius,u=c?0:this.outerRadius,f=this.resolveDataElementOptions(e,s),g=this.getSharedOptions(f),p=this.includeOptions(s,g);let m,x=this._getRotation();for(m=0;m<e;++m)x+=this._circumference(m,n);for(m=e;m<e+i;++m){const e=this._circumference(m,n),i=t[m],o={x:l+this.offsetX,y:h+this.offsetY,startAngle:x,endAngle:x+e,circumference:e,outerRadius:u,innerRadius:d};p&&(o.options=g||this.resolveDataElementOptions(m,i.active?"active":s)),x+=e,this.updateElement(i,m,o,s)}this.updateSharedOptions(g,s,f)}calculateTotal(){const t=this._cachedMeta,e=t.data;let i,s=0;for(i=0;i<e.length;i++){const n=t._parsed[i];null===n||isNaN(n)||!this.chart.getDataVisibility(i)||e[i].hidden||(s+=Math.abs(n))}return s}calculateCircumference(t){const e=this._cachedMeta.total;return e>0&&!isNaN(t)?yt*(Math.abs(t)/e):0}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart,s=i.data.labels||[],n=Ri(e._parsed[t],i.options.locale);return{label:s[t]||"",value:n}}getMaxBorderWidth(t){let e=0;const i=this.chart;let s,n,o,a,r;if(!t)for(s=0,n=i.data.datasets.length;s<n;++s)if(i.isDatasetVisible(s)){o=i.getDatasetMeta(s),t=o.data,a=o.controller;break}if(!t)return 0;for(s=0,n=t.length;s<n;++s)r=a.resolveDataElementOptions(s),"inner"!==r.borderAlign&&(e=Math.max(e,r.borderWidth||0,r.hoverBorderWidth||0));return e}getMaxOffset(t){let e=0;for(let i=0,s=t.length;i<s;++i){const t=this.resolveDataElementOptions(i);e=Math.max(e,t.offset||0,t.hoverOffset||0)}return e}_getRingWeightOffset(t){let e=0;for(let i=0;i<t;++i)this.chart.isDatasetVisible(i)&&(e+=this._getRingWeight(i));return e}_getRingWeight(t){return Math.max(K(this.chart.data.datasets[t].weight,1),0)}_getVisibleDatasetWeightTotal(){return this._getRingWeightOffset(this.chart.data.datasets.length)||1}}Dn.id="doughnut",Dn.defaults={datasetElementType:!1,dataElementType:"arc",animation:{animateRotate:!0,animateScale:!1},animations:{numbers:{type:"number",properties:["circumference","endAngle","innerRadius","outerRadius","startAngle","x","y","offset","borderWidth","spacing"]}},cutout:"50%",rotation:0,circumference:360,radius:"100%",spacing:0,indexAxis:"r"},Dn.descriptors={_scriptable:t=>"spacing"!==t,_indexable:t=>"spacing"!==t},Dn.overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data;if(e.labels.length&&e.datasets.length){const{labels:{pointStyle:i}}=t.legend.options;return e.labels.map(((e,s)=>{const n=t.getDatasetMeta(0).controller.getStyle(s);return{text:e,fillStyle:n.backgroundColor,strokeStyle:n.borderColor,lineWidth:n.borderWidth,pointStyle:i,hidden:!t.getDataVisibility(s),index:s}}))}return[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}},tooltip:{callbacks:{title:()=>"",label(t){let e=t.label;const i=": "+t.formattedValue;return Y(e)?(e=e.slice(),e[0]+=i):e+=i,e}}}}};class Cn extends Ps{initialize(){this.enableOptionSharing=!0,super.initialize()}update(t){const e=this._cachedMeta,{dataset:i,data:s=[],_dataset:n}=e,o=this.chart._animationsDisabled;let{start:a,count:r}=function(t,e,i){const s=e.length;let n=0,o=s;if(t._sorted){const{iScale:a,_parsed:r}=t,l=a.axis,{min:h,max:c,minDefined:d,maxDefined:u}=a.getUserBounds();d&&(n=jt(Math.min(re(r,a.axis,h).lo,i?s:re(e,l,a.getPixelForValue(h)).lo),0,s-1)),o=u?jt(Math.max(re(r,a.axis,c).hi+1,i?0:re(e,l,a.getPixelForValue(c)).hi+1),n,s)-n:s-n}return{start:n,count:o}}(e,s,o);this._drawStart=a,this._drawCount=r,function(t){const{xScale:e,yScale:i,_scaleRanges:s}=t,n={xmin:e.min,xmax:e.max,ymin:i.min,ymax:i.max};if(!s)return t._scaleRanges=n,!0;const o=s.xmin!==e.min||s.xmax!==e.max||s.ymin!==i.min||s.ymax!==i.max;return Object.assign(s,n),o}(e)&&(a=0,r=s.length),i._chart=this.chart,i._datasetIndex=this.index,i._decimated=!!n._decimated,i.points=s;const l=this.resolveDatasetElementOptions(t);this.options.showLine||(l.borderWidth=0),l.segment=this.options.segment,this.updateElement(i,void 0,{animated:!o,options:l},t),this.updateElements(s,a,r,t)}updateElements(t,e,i,s){const n="reset"===s,{iScale:o,vScale:a,_stacked:r,_dataset:l}=this._cachedMeta,h=this.resolveDataElementOptions(e,s),c=this.getSharedOptions(h),d=this.includeOptions(s,c),u=o.axis,f=a.axis,{spanGaps:g,segment:p}=this.options,m=Tt(g)?g:Number.POSITIVE_INFINITY,x=this.chart._animationsDisabled||n||"none"===s;let b=e>0&&this.getParsed(e-1);for(let h=e;h<e+i;++h){const e=t[h],i=this.getParsed(h),g=x?e:{},_=$(i[f]),y=g[u]=o.getPixelForValue(i[u],h),v=g[f]=n||_?a.getBasePixel():a.getPixelForValue(r?this.applyStack(a,i,r):i[f],h);g.skip=isNaN(y)||isNaN(v)||_,g.stop=h>0&&i[u]-b[u]>m,p&&(g.parsed=i,g.raw=l.data[h]),d&&(g.options=c||this.resolveDataElementOptions(h,e.active?"active":s)),x||this.updateElement(e,h,g,s),b=i}this.updateSharedOptions(c,s,h)}getMaxOverflow(){const t=this._cachedMeta,e=t.dataset,i=e.options&&e.options.borderWidth||0,s=t.data||[];if(!s.length)return i;const n=s[0].size(this.resolveDataElementOptions(0)),o=s[s.length-1].size(this.resolveDataElementOptions(s.length-1));return Math.max(i,n,o)/2}draw(){const t=this._cachedMeta;t.dataset.updateControlPoints(this.chart.chartArea,t.iScale.axis),super.draw()}}Cn.id="line",Cn.defaults={datasetElementType:"line",dataElementType:"point",showLine:!0,spanGaps:!1},Cn.overrides={scales:{_index_:{type:"category"},_value_:{type:"linear"}}};class On extends Ps{constructor(t,e){super(t,e),this.innerRadius=void 0,this.outerRadius=void 0}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart,s=i.data.labels||[],n=Ri(e._parsed[t].r,i.options.locale);return{label:s[t]||"",value:n}}update(t){const e=this._cachedMeta.data;this._updateRadius(),this.updateElements(e,0,e.length,t)}_updateRadius(){const t=this.chart,e=t.chartArea,i=t.options,s=Math.min(e.right-e.left,e.bottom-e.top),n=Math.max(s/2,0),o=(n-Math.max(i.cutoutPercentage?n/100*i.cutoutPercentage:1,0))/t.getVisibleDatasetCount();this.outerRadius=n-o*this.index,this.innerRadius=this.outerRadius-o}updateElements(t,e,i,s){const n="reset"===s,o=this.chart,a=this.getDataset(),r=o.options.animation,l=this._cachedMeta.rScale,h=l.xCenter,c=l.yCenter,d=l.getIndexAngle(0)-.5*_t;let u,f=d;const g=360/this.countVisibleElements();for(u=0;u<e;++u)f+=this._computeAngle(u,s,g);for(u=e;u<e+i;u++){const e=t[u];let i=f,p=f+this._computeAngle(u,s,g),m=o.getDataVisibility(u)?l.getDistanceFromCenterForValue(a.data[u]):0;f=p,n&&(r.animateScale&&(m=0),r.animateRotate&&(i=p=d));const x={x:h,y:c,innerRadius:0,outerRadius:m,startAngle:i,endAngle:p,options:this.resolveDataElementOptions(u,e.active?"active":s)};this.updateElement(e,u,x,s)}}countVisibleElements(){const t=this.getDataset(),e=this._cachedMeta;let i=0;return e.data.forEach(((e,s)=>{!isNaN(t.data[s])&&this.chart.getDataVisibility(s)&&i++})),i}_computeAngle(t,e,i){return this.chart.getDataVisibility(t)?It(this.resolveDataElementOptions(t,e).angle||i):0}}On.id="polarArea",On.defaults={dataElementType:"arc",animation:{animateRotate:!0,animateScale:!0},animations:{numbers:{type:"number",properties:["x","y","startAngle","endAngle","innerRadius","outerRadius"]}},indexAxis:"r",startAngle:0},On.overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data;if(e.labels.length&&e.datasets.length){const{labels:{pointStyle:i}}=t.legend.options;return e.labels.map(((e,s)=>{const n=t.getDatasetMeta(0).controller.getStyle(s);return{text:e,fillStyle:n.backgroundColor,strokeStyle:n.borderColor,lineWidth:n.borderWidth,pointStyle:i,hidden:!t.getDataVisibility(s),index:s}}))}return[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}},tooltip:{callbacks:{title:()=>"",label:t=>t.chart.data.labels[t.dataIndex]+": "+t.formattedValue}}},scales:{r:{type:"radialLinear",angleLines:{display:!1},beginAtZero:!0,grid:{circular:!0},pointLabels:{display:!1},startAngle:0}}};class An extends Dn{}An.id="pie",An.defaults={cutout:0,rotation:0,circumference:360,radius:"100%"};class Tn extends Ps{getLabelAndValue(t){const e=this._cachedMeta.vScale,i=this.getParsed(t);return{label:e.getLabels()[t],value:""+e.getLabelForValue(i[e.axis])}}update(t){const e=this._cachedMeta,i=e.dataset,s=e.data||[],n=e.iScale.getLabels();if(i.points=s,"resize"!==t){const e=this.resolveDatasetElementOptions(t);this.options.showLine||(e.borderWidth=0);const o={_loop:!0,_fullLoop:n.length===s.length,options:e};this.updateElement(i,void 0,o,t)}this.updateElements(s,0,s.length,t)}updateElements(t,e,i,s){const n=this.getDataset(),o=this._cachedMeta.rScale,a="reset"===s;for(let r=e;r<e+i;r++){const e=t[r],i=this.resolveDataElementOptions(r,e.active?"active":s),l=o.getPointPositionForValue(r,n.data[r]),h=a?o.xCenter:l.x,c=a?o.yCenter:l.y,d={x:h,y:c,angle:l.angle,skip:isNaN(h)||isNaN(c),options:i};this.updateElement(e,r,d,s)}}}Tn.id="radar",Tn.defaults={datasetElementType:"line",dataElementType:"point",indexAxis:"r",showLine:!0,elements:{line:{fill:"start"}}},Tn.overrides={aspectRatio:1,scales:{r:{type:"radialLinear"}}};class Ln extends Cn{}Ln.id="scatter",Ln.defaults={showLine:!1,fill:!1},Ln.overrides={interaction:{mode:"point"},plugins:{tooltip:{callbacks:{title:()=>"",label:t=>"("+t.label+", "+t.formattedValue+")"}}},scales:{x:{type:"linear"},y:{type:"linear"}}};var Rn=Object.freeze({__proto__:null,BarController:Sn,BubbleController:Pn,DoughnutController:Dn,LineController:Cn,PolarAreaController:On,PieController:An,RadarController:Tn,ScatterController:Ln});function En(t,e,i){const{startAngle:s,pixelMargin:n,x:o,y:a,outerRadius:r,innerRadius:l}=e;let h=n/r;t.beginPath(),t.arc(o,a,r,s-h,i+h),l>n?(h=n/l,t.arc(o,a,l,i+h,s-h,!0)):t.arc(o,a,n,i+kt,s-kt),t.closePath(),t.clip()}function In(t,e,i,s){const n=Be(t.options.borderRadius,["outerStart","outerEnd","innerStart","innerEnd"]);const o=(i-e)/2,a=Math.min(o,s*e/2),r=t=>{const e=(i-Math.min(o,t))*s/2;return jt(t,0,Math.min(o,e))};return{outerStart:r(n.outerStart),outerEnd:r(n.outerEnd),innerStart:jt(n.innerStart,0,a),innerEnd:jt(n.innerEnd,0,a)}}function zn(t,e,i,s){return{x:i+t*Math.cos(e),y:s+t*Math.sin(e)}}function Fn(t,e,i,s,n){const{x:o,y:a,startAngle:r,pixelMargin:l,innerRadius:h}=e,c=Math.max(e.outerRadius+s+i-l,0),d=h>0?h+s+i+l:0;let u=0;const f=n-r;if(s){const t=((h>0?h-s:0)+(c>0?c-s:0))/2;u=(f-(0!==t?f*t/(t+s):f))/2}const g=(f-Math.max(.001,f*c-i/_t)/c)/2,p=r+g+u,m=n-g-u,{outerStart:x,outerEnd:b,innerStart:_,innerEnd:y}=In(e,d,c,m-p),v=c-x,w=c-b,M=p+x/v,k=m-b/w,S=d+_,P=d+y,D=p+_/S,C=m-y/P;if(t.beginPath(),t.arc(o,a,c,M,k),b>0){const e=zn(w,k,o,a);t.arc(e.x,e.y,b,k,m+kt)}const O=zn(P,m,o,a);if(t.lineTo(O.x,O.y),y>0){const e=zn(P,C,o,a);t.arc(e.x,e.y,y,m+kt,C+Math.PI)}if(t.arc(o,a,d,m-y/d,p+_/d,!0),_>0){const e=zn(S,D,o,a);t.arc(e.x,e.y,_,D+Math.PI,p-kt)}const A=zn(v,p,o,a);if(t.lineTo(A.x,A.y),x>0){const e=zn(v,M,o,a);t.arc(e.x,e.y,x,p-kt,M)}t.closePath()}function Bn(t,e,i,s,n){const{options:o}=e,{borderWidth:a,borderJoinStyle:r}=o,l="inner"===o.borderAlign;a&&(l?(t.lineWidth=2*a,t.lineJoin=r||"round"):(t.lineWidth=a,t.lineJoin=r||"bevel"),e.fullCircles&&function(t,e,i){const{x:s,y:n,startAngle:o,pixelMargin:a,fullCircles:r}=e,l=Math.max(e.outerRadius-a,0),h=e.innerRadius+a;let c;for(i&&En(t,e,o+yt),t.beginPath(),t.arc(s,n,h,o+yt,o,!0),c=0;c<r;++c)t.stroke();for(t.beginPath(),t.arc(s,n,l,o,o+yt),c=0;c<r;++c)t.stroke()}(t,e,l),l&&En(t,e,n),Fn(t,e,i,s,n),t.stroke())}class Vn extends Ds{constructor(t){super(),this.options=void 0,this.circumference=void 0,this.startAngle=void 0,this.endAngle=void 0,this.innerRadius=void 0,this.outerRadius=void 0,this.pixelMargin=0,this.fullCircles=0,t&&Object.assign(this,t)}inRange(t,e,i){const s=this.getProps(["x","y"],i),{angle:n,distance:o}=Bt(s,{x:t,y:e}),{startAngle:a,endAngle:r,innerRadius:l,outerRadius:h,circumference:c}=this.getProps(["startAngle","endAngle","innerRadius","outerRadius","circumference"],i),d=this.options.spacing/2,u=K(c,r-a)>=yt||Ht(n,a,r),f=Yt(o,l+d,h+d);return u&&f}getCenterPoint(t){const{x:e,y:i,startAngle:s,endAngle:n,innerRadius:o,outerRadius:a}=this.getProps(["x","y","startAngle","endAngle","innerRadius","outerRadius","circumference"],t),{offset:r,spacing:l}=this.options,h=(s+n)/2,c=(o+a+l+r)/2;return{x:e+Math.cos(h)*c,y:i+Math.sin(h)*c}}tooltipPosition(t){return this.getCenterPoint(t)}draw(t){const{options:e,circumference:i}=this,s=(e.offset||0)/2,n=(e.spacing||0)/2;if(this.pixelMargin="inner"===e.borderAlign?.33:0,this.fullCircles=i>yt?Math.floor(i/yt):0,0===i||this.innerRadius<0||this.outerRadius<0)return;t.save();let o=0;if(s){o=s/2;const e=(this.startAngle+this.endAngle)/2;t.translate(Math.cos(e)*o,Math.sin(e)*o),this.circumference>=_t&&(o=s)}t.fillStyle=e.backgroundColor,t.strokeStyle=e.borderColor;const a=function(t,e,i,s){const{fullCircles:n,startAngle:o,circumference:a}=e;let r=e.endAngle;if(n){Fn(t,e,i,s,o+yt);for(let e=0;e<n;++e)t.fill();isNaN(a)||(r=o+a%yt,a%yt==0&&(r+=yt))}return Fn(t,e,i,s,r),t.fill(),r}(t,this,o,n);Bn(t,this,o,n,a),t.restore()}}function Wn(t,e,i=e){t.lineCap=K(i.borderCapStyle,e.borderCapStyle),t.setLineDash(K(i.borderDash,e.borderDash)),t.lineDashOffset=K(i.borderDashOffset,e.borderDashOffset),t.lineJoin=K(i.borderJoinStyle,e.borderJoinStyle),t.lineWidth=K(i.borderWidth,e.borderWidth),t.strokeStyle=K(i.borderColor,e.borderColor)}function Nn(t,e,i){t.lineTo(i.x,i.y)}function Hn(t,e,i={}){const s=t.length,{start:n=0,end:o=s-1}=i,{start:a,end:r}=e,l=Math.max(n,a),h=Math.min(o,r),c=n<a&&o<a||n>r&&o>r;return{count:s,start:l,loop:e.loop,ilen:h<l&&!c?s+h-l:h-l}}function jn(t,e,i,s){const{points:n,options:o}=e,{count:a,start:r,loop:l,ilen:h}=Hn(n,i,s),c=function(t){return t.stepped?ee:t.tension||"monotone"===t.cubicInterpolationMode?ie:Nn}(o);let d,u,f,{move:g=!0,reverse:p}=s||{};for(d=0;d<=h;++d)u=n[(r+(p?h-d:d))%a],u.skip||(g?(t.moveTo(u.x,u.y),g=!1):c(t,f,u,p,o.stepped),f=u);return l&&(u=n[(r+(p?h:0))%a],c(t,f,u,p,o.stepped)),!!l}function $n(t,e,i,s){const n=e.points,{count:o,start:a,ilen:r}=Hn(n,i,s),{move:l=!0,reverse:h}=s||{};let c,d,u,f,g,p,m=0,x=0;const b=t=>(a+(h?r-t:t))%o,_=()=>{f!==g&&(t.lineTo(m,g),t.lineTo(m,f),t.lineTo(m,p))};for(l&&(d=n[b(0)],t.moveTo(d.x,d.y)),c=0;c<=r;++c){if(d=n[b(c)],d.skip)continue;const e=d.x,i=d.y,s=0|e;s===u?(i<f?f=i:i>g&&(g=i),m=(x*m+e)/++x):(_(),t.lineTo(e,i),u=s,x=0,f=g=i),p=i}_()}function Yn(t){const e=t.options,i=e.borderDash&&e.borderDash.length;return!(t._decimated||t._loop||e.tension||"monotone"===e.cubicInterpolationMode||e.stepped||i)?$n:jn}Vn.id="arc",Vn.defaults={borderAlign:"center",borderColor:"#fff",borderJoinStyle:void 0,borderRadius:0,borderWidth:2,offset:0,spacing:0,angle:void 0},Vn.defaultRoutes={backgroundColor:"backgroundColor"};const Un="function"==typeof Path2D;function Xn(t,e,i,s){Un&&!e.options.segment?function(t,e,i,s){let n=e._path;n||(n=e._path=new Path2D,e.path(n,i,s)&&n.closePath()),Wn(t,e.options),t.stroke(n)}(t,e,i,s):function(t,e,i,s){const{segments:n,options:o}=e,a=Yn(e);for(const r of n)Wn(t,o,r.style),t.beginPath(),a(t,e,r,{start:i,end:i+s-1})&&t.closePath(),t.stroke()}(t,e,i,s)}class qn extends Ds{constructor(t){super(),this.animated=!0,this.options=void 0,this._chart=void 0,this._loop=void 0,this._fullLoop=void 0,this._path=void 0,this._points=void 0,this._segments=void 0,this._decimated=!1,this._pointsUpdated=!1,this._datasetIndex=void 0,t&&Object.assign(this,t)}updateControlPoints(t,e){const i=this.options;if((i.tension||"monotone"===i.cubicInterpolationMode)&&!i.stepped&&!this._pointsUpdated){const s=i.spanGaps?this._loop:this._fullLoop;ki(this._points,i,t,s,e),this._pointsUpdated=!0}}set points(t){this._points=t,delete this._segments,delete this._path,this._pointsUpdated=!1}get points(){return this._points}get segments(){return this._segments||(this._segments=Ni(this,this.options.segment))}first(){const t=this.segments,e=this.points;return t.length&&e[t[0].start]}last(){const t=this.segments,e=this.points,i=t.length;return i&&e[t[i-1].end]}interpolate(t,e){const i=this.options,s=t[e],n=this.points,o=Wi(this,{property:e,start:s,end:s});if(!o.length)return;const a=[],r=function(t){return t.stepped?Ai:t.tension||"monotone"===t.cubicInterpolationMode?Ti:Oi}(i);let l,h;for(l=0,h=o.length;l<h;++l){const{start:h,end:c}=o[l],d=n[h],u=n[c];if(d===u){a.push(d);continue}const f=r(d,u,Math.abs((s-d[e])/(u[e]-d[e])),i.stepped);f[e]=t[e],a.push(f)}return 1===a.length?a[0]:a}pathSegment(t,e,i){return Yn(this)(t,this,e,i)}path(t,e,i){const s=this.segments,n=Yn(this);let o=this._loop;e=e||0,i=i||this.points.length-e;for(const a of s)o&=n(t,this,a,{start:e,end:e+i-1});return!!o}draw(t,e,i,s){const n=this.options||{};(this.points||[]).length&&n.borderWidth&&(t.save(),Xn(t,this,i,s),t.restore()),this.animated&&(this._pointsUpdated=!1,this._path=void 0)}}function Kn(t,e,i,s){const n=t.options,{[i]:o}=t.getProps([i],s);return Math.abs(e-o)<n.radius+n.hitRadius}qn.id="line",qn.defaults={borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",borderWidth:3,capBezierPoints:!0,cubicInterpolationMode:"default",fill:!1,spanGaps:!1,stepped:!1,tension:0},qn.defaultRoutes={backgroundColor:"backgroundColor",borderColor:"borderColor"},qn.descriptors={_scriptable:!0,_indexable:t=>"borderDash"!==t&&"fill"!==t};class Gn extends Ds{constructor(t){super(),this.options=void 0,this.parsed=void 0,this.skip=void 0,this.stop=void 0,t&&Object.assign(this,t)}inRange(t,e,i){const s=this.options,{x:n,y:o}=this.getProps(["x","y"],i);return Math.pow(t-n,2)+Math.pow(e-o,2)<Math.pow(s.hitRadius+s.radius,2)}inXRange(t,e){return Kn(this,t,"x",e)}inYRange(t,e){return Kn(this,t,"y",e)}getCenterPoint(t){const{x:e,y:i}=this.getProps(["x","y"],t);return{x:e,y:i}}size(t){let e=(t=t||this.options||{}).radius||0;e=Math.max(e,e&&t.hoverRadius||0);return 2*(e+(e&&t.borderWidth||0))}draw(t,e){const i=this.options;this.skip||i.radius<.1||!Jt(this,e,this.size(i)/2)||(t.strokeStyle=i.borderColor,t.lineWidth=i.borderWidth,t.fillStyle=i.backgroundColor,Zt(t,i,this.x,this.y))}getRange(){const t=this.options||{};return t.radius+t.hitRadius}}function Zn(t,e){const{x:i,y:s,base:n,width:o,height:a}=t.getProps(["x","y","base","width","height"],e);let r,l,h,c,d;return t.horizontal?(d=a/2,r=Math.min(i,n),l=Math.max(i,n),h=s-d,c=s+d):(d=o/2,r=i-d,l=i+d,h=Math.min(s,n),c=Math.max(s,n)),{left:r,top:h,right:l,bottom:c}}function Jn(t,e,i,s){return t?0:jt(e,i,s)}function Qn(t){const e=Zn(t),i=e.right-e.left,s=e.bottom-e.top,n=function(t,e,i){const s=t.options.borderWidth,n=t.borderSkipped,o=Ve(s);return{t:Jn(n.top,o.top,0,i),r:Jn(n.right,o.right,0,e),b:Jn(n.bottom,o.bottom,0,i),l:Jn(n.left,o.left,0,e)}}(t,i/2,s/2),o=function(t,e,i){const{enableBorderRadius:s}=t.getProps(["enableBorderRadius"]),n=t.options.borderRadius,o=We(n),a=Math.min(e,i),r=t.borderSkipped,l=s||U(n);return{topLeft:Jn(!l||r.top||r.left,o.topLeft,0,a),topRight:Jn(!l||r.top||r.right,o.topRight,0,a),bottomLeft:Jn(!l||r.bottom||r.left,o.bottomLeft,0,a),bottomRight:Jn(!l||r.bottom||r.right,o.bottomRight,0,a)}}(t,i/2,s/2);return{outer:{x:e.left,y:e.top,w:i,h:s,radius:o},inner:{x:e.left+n.l,y:e.top+n.t,w:i-n.l-n.r,h:s-n.t-n.b,radius:{topLeft:Math.max(0,o.topLeft-Math.max(n.t,n.l)),topRight:Math.max(0,o.topRight-Math.max(n.t,n.r)),bottomLeft:Math.max(0,o.bottomLeft-Math.max(n.b,n.l)),bottomRight:Math.max(0,o.bottomRight-Math.max(n.b,n.r))}}}}function to(t,e,i,s){const n=null===e,o=null===i,a=t&&!(n&&o)&&Zn(t,s);return a&&(n||Yt(e,a.left,a.right))&&(o||Yt(i,a.top,a.bottom))}function eo(t,e){t.rect(e.x,e.y,e.w,e.h)}function io(t,e,i={}){const s=t.x!==i.x?-e:0,n=t.y!==i.y?-e:0,o=(t.x+t.w!==i.x+i.w?e:0)-s,a=(t.y+t.h!==i.y+i.h?e:0)-n;return{x:t.x+s,y:t.y+n,w:t.w+o,h:t.h+a,radius:t.radius}}Gn.id="point",Gn.defaults={borderWidth:1,hitRadius:1,hoverBorderWidth:1,hoverRadius:4,pointStyle:"circle",radius:3,rotation:0},Gn.defaultRoutes={backgroundColor:"backgroundColor",borderColor:"borderColor"};class so extends Ds{constructor(t){super(),this.options=void 0,this.horizontal=void 0,this.base=void 0,this.width=void 0,this.height=void 0,this.inflateAmount=void 0,t&&Object.assign(this,t)}draw(t){const{inflateAmount:e,options:{borderColor:i,backgroundColor:s}}=this,{inner:n,outer:o}=Qn(this),a=(r=o.radius).topLeft||r.topRight||r.bottomLeft||r.bottomRight?oe:eo;var r;t.save(),o.w===n.w&&o.h===n.h||(t.beginPath(),a(t,io(o,e,n)),t.clip(),a(t,io(n,-e,o)),t.fillStyle=i,t.fill("evenodd")),t.beginPath(),a(t,io(n,e)),t.fillStyle=s,t.fill(),t.restore()}inRange(t,e,i){return to(this,t,e,i)}inXRange(t,e){return to(this,t,null,e)}inYRange(t,e){return to(this,null,t,e)}getCenterPoint(t){const{x:e,y:i,base:s,horizontal:n}=this.getProps(["x","y","base","horizontal"],t);return{x:n?(e+s)/2:e,y:n?i:(i+s)/2}}getRange(t){return"x"===t?this.width/2:this.height/2}}so.id="bar",so.defaults={borderSkipped:"start",borderWidth:0,borderRadius:0,inflateAmount:"auto",pointStyle:void 0},so.defaultRoutes={backgroundColor:"backgroundColor",borderColor:"borderColor"};var no=Object.freeze({__proto__:null,ArcElement:Vn,LineElement:qn,PointElement:Gn,BarElement:so});function oo(t){if(t._decimated){const e=t._data;delete t._decimated,delete t._data,Object.defineProperty(t,"data",{value:e})}}function ao(t){t.data.datasets.forEach((t=>{oo(t)}))}var ro={id:"decimation",defaults:{algorithm:"min-max",enabled:!1},beforeElementsUpdate:(t,e,i)=>{if(!i.enabled)return void ao(t);const s=t.width;t.data.datasets.forEach(((e,n)=>{const{_data:o,indexAxis:a}=e,r=t.getDatasetMeta(n),l=o||e.data;if("y"===je([a,t.options.indexAxis]))return;if("line"!==r.type)return;const h=t.scales[r.xAxisID];if("linear"!==h.type&&"time"!==h.type)return;if(t.options.parsing)return;let{start:c,count:d}=function(t,e){const i=e.length;let s,n=0;const{iScale:o}=t,{min:a,max:r,minDefined:l,maxDefined:h}=o.getUserBounds();return l&&(n=jt(re(e,o.axis,a).lo,0,i-1)),s=h?jt(re(e,o.axis,r).hi+1,n,i)-n:i-n,{start:n,count:s}}(r,l);if(d<=(i.threshold||4*s))return void oo(e);let u;switch($(o)&&(e._data=l,delete e.data,Object.defineProperty(e,"data",{configurable:!0,enumerable:!0,get:function(){return this._decimated},set:function(t){this._data=t}})),i.algorithm){case"lttb":u=function(t,e,i,s,n){const o=n.samples||s;if(o>=i)return t.slice(e,e+i);const a=[],r=(i-2)/(o-2);let l=0;const h=e+i-1;let c,d,u,f,g,p=e;for(a[l++]=t[p],c=0;c<o-2;c++){let s,n=0,o=0;const h=Math.floor((c+1)*r)+1+e,m=Math.min(Math.floor((c+2)*r)+1,i)+e,x=m-h;for(s=h;s<m;s++)n+=t[s].x,o+=t[s].y;n/=x,o/=x;const b=Math.floor(c*r)+1+e,_=Math.min(Math.floor((c+1)*r)+1,i)+e,{x:y,y:v}=t[p];for(u=f=-1,s=b;s<_;s++)f=.5*Math.abs((y-n)*(t[s].y-v)-(y-t[s].x)*(o-v)),f>u&&(u=f,d=t[s],g=s);a[l++]=d,p=g}return a[l++]=t[h],a}(l,c,d,s,i);break;case"min-max":u=function(t,e,i,s){let n,o,a,r,l,h,c,d,u,f,g=0,p=0;const m=[],x=e+i-1,b=t[e].x,_=t[x].x-b;for(n=e;n<e+i;++n){o=t[n],a=(o.x-b)/_*s,r=o.y;const e=0|a;if(e===l)r<u?(u=r,h=n):r>f&&(f=r,c=n),g=(p*g+o.x)/++p;else{const i=n-1;if(!$(h)&&!$(c)){const e=Math.min(h,c),s=Math.max(h,c);e!==d&&e!==i&&m.push({...t[e],x:g}),s!==d&&s!==i&&m.push({...t[s],x:g})}n>0&&i!==d&&m.push(t[i]),m.push(o),l=e,p=0,u=f=r,h=c=d=n}}return m}(l,c,d,s);break;default:throw new Error(`Unsupported decimation algorithm '${i.algorithm}'`)}e._decimated=u}))},destroy(t){ao(t)}};function lo(t,e,i){const s=function(t){const e=t.options,i=e.fill;let s=K(i&&i.target,i);return void 0===s&&(s=!!e.backgroundColor),!1!==s&&null!==s&&(!0===s?"origin":s)}(t);if(U(s))return!isNaN(s.value)&&s;let n=parseFloat(s);return X(n)&&Math.floor(n)===n?("-"!==s[0]&&"+"!==s[0]||(n=e+n),!(n===e||n<0||n>=i)&&n):["origin","start","end","stack","shape"].indexOf(s)>=0&&s}class ho{constructor(t){this.x=t.x,this.y=t.y,this.radius=t.radius}pathSegment(t,e,i){const{x:s,y:n,radius:o}=this;return e=e||{start:0,end:yt},t.arc(s,n,o,e.end,e.start,!0),!i.bounds}interpolate(t){const{x:e,y:i,radius:s}=this,n=t.angle;return{x:e+Math.cos(n)*s,y:i+Math.sin(n)*s,angle:n}}}function co(t){return(t.scale||{}).getPointPositionForValue?function(t){const{scale:e,fill:i}=t,s=e.options,n=e.getLabels().length,o=[],a=s.reverse?e.max:e.min,r=s.reverse?e.min:e.max;let l,h,c;if(c="start"===i?a:"end"===i?r:U(i)?i.value:e.getBaseValue(),s.grid.circular)return h=e.getPointPositionForValue(0,a),new ho({x:h.x,y:h.y,radius:e.getDistanceFromCenterForValue(c)});for(l=0;l<n;++l)o.push(e.getPointPositionForValue(l,c));return o}(t):function(t){const{scale:e={},fill:i}=t;let s,n=null;return"start"===i?n=e.bottom:"end"===i?n=e.top:U(i)?n=e.getPixelForValue(i.value):e.getBasePixel&&(n=e.getBasePixel()),X(n)?(s=e.isHorizontal(),{x:s?n:null,y:s?null:n}):null}(t)}function uo(t,e,i){for(;e>t;e--){const t=i[e];if(!isNaN(t.x)&&!isNaN(t.y))break}return e}function fo(t,e,i){const s=[];for(let n=0;n<i.length;n++){const o=i[n],{first:a,last:r,point:l}=go(o,e,"x");if(!(!l||a&&r))if(a)s.unshift(l);else if(t.push(l),!r)break}t.push(...s)}function go(t,e,i){const s=t.interpolate(e,i);if(!s)return{};const n=s[i],o=t.segments,a=t.points;let r=!1,l=!1;for(let t=0;t<o.length;t++){const e=o[t],s=a[e.start][i],h=a[e.end][i];if(Yt(n,s,h)){r=n===s,l=n===h;break}}return{first:r,last:l,point:s}}function po(t){const{chart:e,fill:i,line:s}=t;if(X(i))return function(t,e){const i=t.getDatasetMeta(e);return i&&t.isDatasetVisible(e)?i.dataset:null}(e,i);if("stack"===i)return function(t){const{scale:e,index:i,line:s}=t,n=[],o=s.segments,a=s.points,r=function(t,e){const i=[],s=t.getMatchingVisibleMetas("line");for(let t=0;t<s.length;t++){const n=s[t];if(n.index===e)break;n.hidden||i.unshift(n.dataset)}return i}(e,i);r.push(mo({x:null,y:e.bottom},s));for(let t=0;t<o.length;t++){const e=o[t];for(let t=e.start;t<=e.end;t++)fo(n,a[t],r)}return new qn({points:n,options:{}})}(t);if("shape"===i)return!0;const n=co(t);return n instanceof ho?n:mo(n,s)}function mo(t,e){let i=[],s=!1;return Y(t)?(s=!0,i=t):i=function(t,e){const{x:i=null,y:s=null}=t||{},n=e.points,o=[];return e.segments.forEach((({start:t,end:e})=>{e=uo(t,e,n);const a=n[t],r=n[e];null!==s?(o.push({x:a.x,y:s}),o.push({x:r.x,y:s})):null!==i&&(o.push({x:i,y:a.y}),o.push({x:i,y:r.y}))})),o}(t,e),i.length?new qn({points:i,options:{tension:0},_loop:s,_fullLoop:s}):null}function xo(t,e,i){let s=t[e].fill;const n=[e];let o;if(!i)return s;for(;!1!==s&&-1===n.indexOf(s);){if(!X(s))return s;if(o=t[s],!o)return!1;if(o.visible)return s;n.push(s),s=o.fill}return!1}function bo(t,e,i){t.beginPath(),e.path(t),t.lineTo(e.last().x,i),t.lineTo(e.first().x,i),t.closePath(),t.clip()}function _o(t,e,i,s){if(s)return;let n=e[t],o=i[t];return"angle"===t&&(n=Nt(n),o=Nt(o)),{property:t,start:n,end:o}}function yo(t,e,i,s){return t&&e?s(t[i],e[i]):t?t[i]:e?e[i]:0}function vo(t,e,i){const{top:s,bottom:n}=e.chart.chartArea,{property:o,start:a,end:r}=i||{};"x"===o&&(t.beginPath(),t.rect(a,s,r-a,n-s),t.clip())}function wo(t,e,i,s){const n=e.interpolate(i,s);n&&t.lineTo(n.x,n.y)}function Mo(t,e){const{line:i,target:s,property:n,color:o,scale:a}=e,r=function(t,e,i){const s=t.segments,n=t.points,o=e.points,a=[];for(const t of s){let{start:s,end:r}=t;r=uo(s,r,n);const l=_o(i,n[s],n[r],t.loop);if(!e.segments){a.push({source:t,target:l,start:n[s],end:n[r]});continue}const h=Wi(e,l);for(const e of h){const s=_o(i,o[e.start],o[e.end],e.loop),r=Vi(t,n,s);for(const t of r)a.push({source:t,target:e,start:{[i]:yo(l,s,"start",Math.max)},end:{[i]:yo(l,s,"end",Math.min)}})}}return a}(i,s,n);for(const{source:e,target:l,start:h,end:c}of r){const{style:{backgroundColor:r=o}={}}=e,d=!0!==s;t.save(),t.fillStyle=r,vo(t,a,d&&_o(n,h,c)),t.beginPath();const u=!!i.pathSegment(t,e);let f;if(d){u?t.closePath():wo(t,s,c,n);const e=!!s.pathSegment(t,l,{move:u,reverse:!0});f=u&&e,f||wo(t,s,h,n)}t.closePath(),t.fill(f?"evenodd":"nonzero"),t.restore()}}function ko(t,e,i){const s=po(e),{line:n,scale:o,axis:a}=e,r=n.options,l=r.fill,h=r.backgroundColor,{above:c=h,below:d=h}=l||{};s&&n.points.length&&(Qt(t,i),function(t,e){const{line:i,target:s,above:n,below:o,area:a,scale:r}=e,l=i._loop?"angle":e.axis;t.save(),"x"===l&&o!==n&&(bo(t,s,a.top),Mo(t,{line:i,target:s,color:n,scale:r,property:l}),t.restore(),t.save(),bo(t,s,a.bottom)),Mo(t,{line:i,target:s,color:o,scale:r,property:l}),t.restore()}(t,{line:n,target:s,above:c,below:d,area:i,scale:o,axis:a}),te(t))}var So={id:"filler",afterDatasetsUpdate(t,e,i){const s=(t.data.datasets||[]).length,n=[];let o,a,r,l;for(a=0;a<s;++a)o=t.getDatasetMeta(a),r=o.dataset,l=null,r&&r.options&&r instanceof qn&&(l={visible:t.isDatasetVisible(a),index:a,fill:lo(r,a,s),chart:t,axis:o.controller.options.indexAxis,scale:o.vScale,line:r}),o.$filler=l,n.push(l);for(a=0;a<s;++a)l=n[a],l&&!1!==l.fill&&(l.fill=xo(n,a,i.propagate))},beforeDraw(t,e,i){const s="beforeDraw"===i.drawTime,n=t.getSortedVisibleDatasetMetas(),o=t.chartArea;for(let e=n.length-1;e>=0;--e){const i=n[e].$filler;i&&(i.line.updateControlPoints(o,i.axis),s&&ko(t.ctx,i,o))}},beforeDatasetsDraw(t,e,i){if("beforeDatasetsDraw"!==i.drawTime)return;const s=t.getSortedVisibleDatasetMetas();for(let e=s.length-1;e>=0;--e){const i=s[e].$filler;i&&ko(t.ctx,i,t.chartArea)}},beforeDatasetDraw(t,e,i){const s=e.meta.$filler;s&&!1!==s.fill&&"beforeDatasetDraw"===i.drawTime&&ko(t.ctx,s,t.chartArea)},defaults:{propagate:!0,drawTime:"beforeDatasetDraw"}};const Po=(t,e)=>{let{boxHeight:i=e,boxWidth:s=e}=t;return t.usePointStyle&&(i=Math.min(i,e),s=Math.min(s,e)),{boxWidth:s,boxHeight:i,itemHeight:Math.max(e,i)}};class Do extends Ds{constructor(t){super(),this._added=!1,this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1,this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this.legendItems=void 0,this.columnSizes=void 0,this.lineWidths=void 0,this.maxHeight=void 0,this.maxWidth=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.height=void 0,this.width=void 0,this._margins=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e,i){this.maxWidth=t,this.maxHeight=e,this._margins=i,this.setDimensions(),this.buildLabels(),this.fit()}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=this._margins.left,this.right=this.width):(this.height=this.maxHeight,this.top=this._margins.top,this.bottom=this.height)}buildLabels(){const t=this.options.labels||{};let e=J(t.generateLabels,[this.chart],this)||[];t.filter&&(e=e.filter((e=>t.filter(e,this.chart.data)))),t.sort&&(e=e.sort(((e,i)=>t.sort(e,i,this.chart.data)))),this.options.reverse&&e.reverse(),this.legendItems=e}fit(){const{options:t,ctx:e}=this;if(!t.display)return void(this.width=this.height=0);const i=t.labels,s=He(i.font),n=s.size,o=this._computeTitleHeight(),{boxWidth:a,itemHeight:r}=Po(i,n);let l,h;e.font=s.string,this.isHorizontal()?(l=this.maxWidth,h=this._fitRows(o,n,a,r)+10):(h=this.maxHeight,l=this._fitCols(o,n,a,r)+10),this.width=Math.min(l,t.maxWidth||this.maxWidth),this.height=Math.min(h,t.maxHeight||this.maxHeight)}_fitRows(t,e,i,s){const{ctx:n,maxWidth:o,options:{labels:{padding:a}}}=this,r=this.legendHitBoxes=[],l=this.lineWidths=[0],h=s+a;let c=t;n.textAlign="left",n.textBaseline="middle";let d=-1,u=-h;return this.legendItems.forEach(((t,f)=>{const g=i+e/2+n.measureText(t.text).width;(0===f||l[l.length-1]+g+2*a>o)&&(c+=h,l[l.length-(f>0?0:1)]=0,u+=h,d++),r[f]={left:0,top:u,row:d,width:g,height:s},l[l.length-1]+=g+a})),c}_fitCols(t,e,i,s){const{ctx:n,maxHeight:o,options:{labels:{padding:a}}}=this,r=this.legendHitBoxes=[],l=this.columnSizes=[],h=o-t;let c=a,d=0,u=0,f=0,g=0;return this.legendItems.forEach(((t,o)=>{const p=i+e/2+n.measureText(t.text).width;o>0&&u+s+2*a>h&&(c+=d+a,l.push({width:d,height:u}),f+=d+a,g++,d=u=0),r[o]={left:f,top:u,col:g,width:p,height:s},d=Math.max(d,p),u+=s+a})),c+=d,l.push({width:d,height:u}),c}adjustHitBoxes(){if(!this.options.display)return;const t=this._computeTitleHeight(),{legendHitBoxes:e,options:{align:i,labels:{padding:s},rtl:o}}=this,a=Ei(o,this.left,this.width);if(this.isHorizontal()){let o=0,r=n(i,this.left+s,this.right-this.lineWidths[o]);for(const l of e)o!==l.row&&(o=l.row,r=n(i,this.left+s,this.right-this.lineWidths[o])),l.top+=this.top+t+s,l.left=a.leftForLtr(a.x(r),l.width),r+=l.width+s}else{let o=0,r=n(i,this.top+t+s,this.bottom-this.columnSizes[o].height);for(const l of e)l.col!==o&&(o=l.col,r=n(i,this.top+t+s,this.bottom-this.columnSizes[o].height)),l.top=r,l.left+=this.left+s,l.left=a.leftForLtr(a.x(l.left),l.width),r+=l.height+s}}isHorizontal(){return"top"===this.options.position||"bottom"===this.options.position}draw(){if(this.options.display){const t=this.ctx;Qt(t,this),this._draw(),te(t)}}_draw(){const{options:t,columnSizes:e,lineWidths:i,ctx:s}=this,{align:a,labels:r}=t,l=bt.color,h=Ei(t.rtl,this.left,this.width),c=He(r.font),{color:d,padding:u}=r,f=c.size,g=f/2;let p;this.drawTitle(),s.textAlign=h.textAlign("left"),s.textBaseline="middle",s.lineWidth=.5,s.font=c.string;const{boxWidth:m,boxHeight:x,itemHeight:b}=Po(r,f),_=this.isHorizontal(),y=this._computeTitleHeight();p=_?{x:n(a,this.left+u,this.right-i[0]),y:this.top+u+y,line:0}:{x:this.left+u,y:n(a,this.top+y+u,this.bottom-e[0].height),line:0},Ii(this.ctx,t.textDirection);const v=b+u;this.legendItems.forEach(((w,M)=>{s.strokeStyle=w.fontColor||d,s.fillStyle=w.fontColor||d;const k=s.measureText(w.text).width,S=h.textAlign(w.textAlign||(w.textAlign=r.textAlign)),P=m+g+k;let D=p.x,C=p.y;h.setWidth(this.width),_?M>0&&D+P+u>this.right&&(C=p.y+=v,p.line++,D=p.x=n(a,this.left+u,this.right-i[p.line])):M>0&&C+v>this.bottom&&(D=p.x=D+e[p.line].width+u,p.line++,C=p.y=n(a,this.top+y+u,this.bottom-e[p.line].height));!function(t,e,i){if(isNaN(m)||m<=0||isNaN(x)||x<0)return;s.save();const n=K(i.lineWidth,1);if(s.fillStyle=K(i.fillStyle,l),s.lineCap=K(i.lineCap,"butt"),s.lineDashOffset=K(i.lineDashOffset,0),s.lineJoin=K(i.lineJoin,"miter"),s.lineWidth=n,s.strokeStyle=K(i.strokeStyle,l),s.setLineDash(K(i.lineDash,[])),r.usePointStyle){const o={radius:m*Math.SQRT2/2,pointStyle:i.pointStyle,rotation:i.rotation,borderWidth:n},a=h.xPlus(t,m/2);Zt(s,o,a,e+g)}else{const o=e+Math.max((f-x)/2,0),a=h.leftForLtr(t,m),r=We(i.borderRadius);s.beginPath(),Object.values(r).some((t=>0!==t))?oe(s,{x:a,y:o,w:m,h:x,radius:r}):s.rect(a,o,m,x),s.fill(),0!==n&&s.stroke()}s.restore()}(h.x(D),C,w),D=o(S,D+m+g,_?D+P:this.right,t.rtl),function(t,e,i){se(s,i.text,t,e+b/2,c,{strikethrough:i.hidden,textAlign:h.textAlign(i.textAlign)})}(h.x(D),C,w),_?p.x+=P+u:p.y+=v})),zi(this.ctx,t.textDirection)}drawTitle(){const t=this.options,e=t.title,i=He(e.font),o=Ne(e.padding);if(!e.display)return;const a=Ei(t.rtl,this.left,this.width),r=this.ctx,l=e.position,h=i.size/2,c=o.top+h;let d,u=this.left,f=this.width;if(this.isHorizontal())f=Math.max(...this.lineWidths),d=this.top+c,u=n(t.align,u,this.right-f);else{const e=this.columnSizes.reduce(((t,e)=>Math.max(t,e.height)),0);d=c+n(t.align,this.top,this.bottom-e-t.labels.padding-this._computeTitleHeight())}const g=n(l,u,u+f);r.textAlign=a.textAlign(s(l)),r.textBaseline="middle",r.strokeStyle=e.color,r.fillStyle=e.color,r.font=i.string,se(r,e.text,g,d,i)}_computeTitleHeight(){const t=this.options.title,e=He(t.font),i=Ne(t.padding);return t.display?e.lineHeight+i.height:0}_getLegendItemAt(t,e){let i,s,n;if(Yt(t,this.left,this.right)&&Yt(e,this.top,this.bottom))for(n=this.legendHitBoxes,i=0;i<n.length;++i)if(s=n[i],Yt(t,s.left,s.left+s.width)&&Yt(e,s.top,s.top+s.height))return this.legendItems[i];return null}handleEvent(t){const e=this.options;if(!function(t,e){if("mousemove"===t&&(e.onHover||e.onLeave))return!0;if(e.onClick&&("click"===t||"mouseup"===t))return!0;return!1}(t.type,e))return;const i=this._getLegendItemAt(t.x,t.y);if("mousemove"===t.type){const o=this._hoveredItem,a=(n=i,null!==(s=o)&&null!==n&&s.datasetIndex===n.datasetIndex&&s.index===n.index);o&&!a&&J(e.onLeave,[t,o,this],this),this._hoveredItem=i,i&&!a&&J(e.onHover,[t,i,this],this)}else i&&J(e.onClick,[t,i,this],this);var s,n}}var Co={id:"legend",_element:Do,start(t,e,i){const s=t.legend=new Do({ctx:t.ctx,options:i,chart:t});ni.configure(t,s,i),ni.addBox(t,s)},stop(t){ni.removeBox(t,t.legend),delete t.legend},beforeUpdate(t,e,i){const s=t.legend;ni.configure(t,s,i),s.options=i},afterUpdate(t){const e=t.legend;e.buildLabels(),e.adjustHitBoxes()},afterEvent(t,e){e.replay||t.legend.handleEvent(e.event)},defaults:{display:!0,position:"top",align:"center",fullSize:!0,reverse:!1,weight:1e3,onClick(t,e,i){const s=e.datasetIndex,n=i.chart;n.isDatasetVisible(s)?(n.hide(s),e.hidden=!0):(n.show(s),e.hidden=!1)},onHover:null,onLeave:null,labels:{color:t=>t.chart.options.color,boxWidth:40,padding:10,generateLabels(t){const e=t.data.datasets,{labels:{usePointStyle:i,pointStyle:s,textAlign:n,color:o}}=t.legend.options;return t._getSortedDatasetMetas().map((t=>{const a=t.controller.getStyle(i?0:void 0),r=Ne(a.borderWidth);return{text:e[t.index].label,fillStyle:a.backgroundColor,fontColor:o,hidden:!t.visible,lineCap:a.borderCapStyle,lineDash:a.borderDash,lineDashOffset:a.borderDashOffset,lineJoin:a.borderJoinStyle,lineWidth:(r.width+r.height)/4,strokeStyle:a.borderColor,pointStyle:s||a.pointStyle,rotation:a.rotation,textAlign:n||a.textAlign,borderRadius:0,datasetIndex:t.index}}),this)}},title:{color:t=>t.chart.options.color,display:!1,position:"center",text:""}},descriptors:{_scriptable:t=>!t.startsWith("on"),labels:{_scriptable:t=>!["generateLabels","filter","sort"].includes(t)}}};class Oo extends Ds{constructor(t){super(),this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this._padding=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e){const i=this.options;if(this.left=0,this.top=0,!i.display)return void(this.width=this.height=this.right=this.bottom=0);this.width=this.right=t,this.height=this.bottom=e;const s=Y(i.text)?i.text.length:1;this._padding=Ne(i.padding);const n=s*He(i.font).lineHeight+this._padding.height;this.isHorizontal()?this.height=n:this.width=n}isHorizontal(){const t=this.options.position;return"top"===t||"bottom"===t}_drawArgs(t){const{top:e,left:i,bottom:s,right:o,options:a}=this,r=a.align;let l,h,c,d=0;return this.isHorizontal()?(h=n(r,i,o),c=e+t,l=o-i):("left"===a.position?(h=i+t,c=n(r,s,e),d=-.5*_t):(h=o-t,c=n(r,e,s),d=.5*_t),l=s-e),{titleX:h,titleY:c,maxWidth:l,rotation:d}}draw(){const t=this.ctx,e=this.options;if(!e.display)return;const i=He(e.font),n=i.lineHeight/2+this._padding.top,{titleX:o,titleY:a,maxWidth:r,rotation:l}=this._drawArgs(n);se(t,e.text,0,0,i,{color:e.color,maxWidth:r,rotation:l,textAlign:s(e.align),textBaseline:"middle",translation:[o,a]})}}var Ao={id:"title",_element:Oo,start(t,e,i){!function(t,e){const i=new Oo({ctx:t.ctx,options:e,chart:t});ni.configure(t,i,e),ni.addBox(t,i),t.titleBlock=i}(t,i)},stop(t){const e=t.titleBlock;ni.removeBox(t,e),delete t.titleBlock},beforeUpdate(t,e,i){const s=t.titleBlock;ni.configure(t,s,i),s.options=i},defaults:{align:"center",display:!1,font:{weight:"bold"},fullSize:!0,padding:10,position:"top",text:"",weight:2e3},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}};const To=new WeakMap;var Lo={id:"subtitle",start(t,e,i){const s=new Oo({ctx:t.ctx,options:i,chart:t});ni.configure(t,s,i),ni.addBox(t,s),To.set(t,s)},stop(t){ni.removeBox(t,To.get(t)),To.delete(t)},beforeUpdate(t,e,i){const s=To.get(t);ni.configure(t,s,i),s.options=i},defaults:{align:"center",display:!1,font:{weight:"normal"},fullSize:!0,padding:0,position:"top",text:"",weight:1500},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}};const Ro={average(t){if(!t.length)return!1;let e,i,s=0,n=0,o=0;for(e=0,i=t.length;e<i;++e){const i=t[e].element;if(i&&i.hasValue()){const t=i.tooltipPosition();s+=t.x,n+=t.y,++o}}return{x:s/o,y:n/o}},nearest(t,e){if(!t.length)return!1;let i,s,n,o=e.x,a=e.y,r=Number.POSITIVE_INFINITY;for(i=0,s=t.length;i<s;++i){const s=t[i].element;if(s&&s.hasValue()){const t=Vt(e,s.getCenterPoint());t<r&&(r=t,n=s)}}if(n){const t=n.tooltipPosition();o=t.x,a=t.y}return{x:o,y:a}}};function Eo(t,e){return e&&(Y(e)?Array.prototype.push.apply(t,e):t.push(e)),t}function Io(t){return("string"==typeof t||t instanceof String)&&t.indexOf("\n")>-1?t.split("\n"):t}function zo(t,e){const{element:i,datasetIndex:s,index:n}=e,o=t.getDatasetMeta(s).controller,{label:a,value:r}=o.getLabelAndValue(n);return{chart:t,label:a,parsed:o.getParsed(n),raw:t.data.datasets[s].data[n],formattedValue:r,dataset:o.getDataset(),dataIndex:n,datasetIndex:s,element:i}}function Fo(t,e){const i=t.chart.ctx,{body:s,footer:n,title:o}=t,{boxWidth:a,boxHeight:r}=e,l=He(e.bodyFont),h=He(e.titleFont),c=He(e.footerFont),d=o.length,u=n.length,f=s.length,g=Ne(e.padding);let p=g.height,m=0,x=s.reduce(((t,e)=>t+e.before.length+e.lines.length+e.after.length),0);if(x+=t.beforeBody.length+t.afterBody.length,d&&(p+=d*h.lineHeight+(d-1)*e.titleSpacing+e.titleMarginBottom),x){p+=f*(e.displayColors?Math.max(r,l.lineHeight):l.lineHeight)+(x-f)*l.lineHeight+(x-1)*e.bodySpacing}u&&(p+=e.footerMarginTop+u*c.lineHeight+(u-1)*e.footerSpacing);let b=0;const _=function(t){m=Math.max(m,i.measureText(t).width+b)};return i.save(),i.font=h.string,Q(t.title,_),i.font=l.string,Q(t.beforeBody.concat(t.afterBody),_),b=e.displayColors?a+2+e.boxPadding:0,Q(s,(t=>{Q(t.before,_),Q(t.lines,_),Q(t.after,_)})),b=0,i.font=c.string,Q(t.footer,_),i.restore(),m+=g.width,{width:m,height:p}}function Bo(t,e,i,s){const{x:n,width:o}=i,{width:a,chartArea:{left:r,right:l}}=t;let h="center";return"center"===s?h=n<=(r+l)/2?"left":"right":n<=o/2?h="left":n>=a-o/2&&(h="right"),function(t,e,i,s){const{x:n,width:o}=s,a=i.caretSize+i.caretPadding;return"left"===t&&n+o+a>e.width||"right"===t&&n-o-a<0||void 0}(h,t,e,i)&&(h="center"),h}function Vo(t,e,i){const s=i.yAlign||e.yAlign||function(t,e){const{y:i,height:s}=e;return i<s/2?"top":i>t.height-s/2?"bottom":"center"}(t,i);return{xAlign:i.xAlign||e.xAlign||Bo(t,e,i,s),yAlign:s}}function Wo(t,e,i,s){const{caretSize:n,caretPadding:o,cornerRadius:a}=t,{xAlign:r,yAlign:l}=i,h=n+o,{topLeft:c,topRight:d,bottomLeft:u,bottomRight:f}=We(a);let g=function(t,e){let{x:i,width:s}=t;return"right"===e?i-=s:"center"===e&&(i-=s/2),i}(e,r);const p=function(t,e,i){let{y:s,height:n}=t;return"top"===e?s+=i:s-="bottom"===e?n+i:n/2,s}(e,l,h);return"center"===l?"left"===r?g+=h:"right"===r&&(g-=h):"left"===r?g-=Math.max(c,u)+n:"right"===r&&(g+=Math.max(d,f)+n),{x:jt(g,0,s.width-e.width),y:jt(p,0,s.height-e.height)}}function No(t,e,i){const s=Ne(i.padding);return"center"===e?t.x+t.width/2:"right"===e?t.x+t.width-s.right:t.x+s.left}function Ho(t){return Eo([],Io(t))}function jo(t,e){const i=e&&e.dataset&&e.dataset.tooltip&&e.dataset.tooltip.callbacks;return i?t.override(i):t}class $o extends Ds{constructor(t){super(),this.opacity=0,this._active=[],this._eventPosition=void 0,this._size=void 0,this._cachedAnimations=void 0,this._tooltipItems=[],this.$animations=void 0,this.$context=void 0,this.chart=t.chart||t._chart,this._chart=this.chart,this.options=t.options,this.dataPoints=void 0,this.title=void 0,this.beforeBody=void 0,this.body=void 0,this.afterBody=void 0,this.footer=void 0,this.xAlign=void 0,this.yAlign=void 0,this.x=void 0,this.y=void 0,this.height=void 0,this.width=void 0,this.caretX=void 0,this.caretY=void 0,this.labelColors=void 0,this.labelPointStyles=void 0,this.labelTextColors=void 0}initialize(t){this.options=t,this._cachedAnimations=void 0,this.$context=void 0}_resolveAnimations(){const t=this._cachedAnimations;if(t)return t;const e=this.chart,i=this.options.setContext(this.getContext()),s=i.enabled&&e.options.animation&&i.animations,n=new gs(this.chart,s);return s._cacheable&&(this._cachedAnimations=Object.freeze(n)),n}getContext(){return this.$context||(this.$context=(t=this.chart.getContext(),e=this,i=this._tooltipItems,Ye(t,{tooltip:e,tooltipItems:i,type:"tooltip"})));var t,e,i}getTitle(t,e){const{callbacks:i}=e,s=i.beforeTitle.apply(this,[t]),n=i.title.apply(this,[t]),o=i.afterTitle.apply(this,[t]);let a=[];return a=Eo(a,Io(s)),a=Eo(a,Io(n)),a=Eo(a,Io(o)),a}getBeforeBody(t,e){return Ho(e.callbacks.beforeBody.apply(this,[t]))}getBody(t,e){const{callbacks:i}=e,s=[];return Q(t,(t=>{const e={before:[],lines:[],after:[]},n=jo(i,t);Eo(e.before,Io(n.beforeLabel.call(this,t))),Eo(e.lines,n.label.call(this,t)),Eo(e.after,Io(n.afterLabel.call(this,t))),s.push(e)})),s}getAfterBody(t,e){return Ho(e.callbacks.afterBody.apply(this,[t]))}getFooter(t,e){const{callbacks:i}=e,s=i.beforeFooter.apply(this,[t]),n=i.footer.apply(this,[t]),o=i.afterFooter.apply(this,[t]);let a=[];return a=Eo(a,Io(s)),a=Eo(a,Io(n)),a=Eo(a,Io(o)),a}_createItems(t){const e=this._active,i=this.chart.data,s=[],n=[],o=[];let a,r,l=[];for(a=0,r=e.length;a<r;++a)l.push(zo(this.chart,e[a]));return t.filter&&(l=l.filter(((e,s,n)=>t.filter(e,s,n,i)))),t.itemSort&&(l=l.sort(((e,s)=>t.itemSort(e,s,i)))),Q(l,(e=>{const i=jo(t.callbacks,e);s.push(i.labelColor.call(this,e)),n.push(i.labelPointStyle.call(this,e)),o.push(i.labelTextColor.call(this,e))})),this.labelColors=s,this.labelPointStyles=n,this.labelTextColors=o,this.dataPoints=l,l}update(t,e){const i=this.options.setContext(this.getContext()),s=this._active;let n,o=[];if(s.length){const t=Ro[i.position].call(this,s,this._eventPosition);o=this._createItems(i),this.title=this.getTitle(o,i),this.beforeBody=this.getBeforeBody(o,i),this.body=this.getBody(o,i),this.afterBody=this.getAfterBody(o,i),this.footer=this.getFooter(o,i);const e=this._size=Fo(this,i),a=Object.assign({},t,e),r=Vo(this.chart,i,a),l=Wo(i,a,r,this.chart);this.xAlign=r.xAlign,this.yAlign=r.yAlign,n={opacity:1,x:l.x,y:l.y,width:e.width,height:e.height,caretX:t.x,caretY:t.y}}else 0!==this.opacity&&(n={opacity:0});this._tooltipItems=o,this.$context=void 0,n&&this._resolveAnimations().update(this,n),t&&i.external&&i.external.call(this,{chart:this.chart,tooltip:this,replay:e})}drawCaret(t,e,i,s){const n=this.getCaretPosition(t,i,s);e.lineTo(n.x1,n.y1),e.lineTo(n.x2,n.y2),e.lineTo(n.x3,n.y3)}getCaretPosition(t,e,i){const{xAlign:s,yAlign:n}=this,{caretSize:o,cornerRadius:a}=i,{topLeft:r,topRight:l,bottomLeft:h,bottomRight:c}=We(a),{x:d,y:u}=t,{width:f,height:g}=e;let p,m,x,b,_,y;return"center"===n?(_=u+g/2,"left"===s?(p=d,m=p-o,b=_+o,y=_-o):(p=d+f,m=p+o,b=_-o,y=_+o),x=p):(m="left"===s?d+Math.max(r,h)+o:"right"===s?d+f-Math.max(l,c)-o:this.caretX,"top"===n?(b=u,_=b-o,p=m-o,x=m+o):(b=u+g,_=b+o,p=m+o,x=m-o),y=b),{x1:p,x2:m,x3:x,y1:b,y2:_,y3:y}}drawTitle(t,e,i){const s=this.title,n=s.length;let o,a,r;if(n){const l=Ei(i.rtl,this.x,this.width);for(t.x=No(this,i.titleAlign,i),e.textAlign=l.textAlign(i.titleAlign),e.textBaseline="middle",o=He(i.titleFont),a=i.titleSpacing,e.fillStyle=i.titleColor,e.font=o.string,r=0;r<n;++r)e.fillText(s[r],l.x(t.x),t.y+o.lineHeight/2),t.y+=o.lineHeight+a,r+1===n&&(t.y+=i.titleMarginBottom-a)}}_drawColorBox(t,e,i,s,n){const o=this.labelColors[i],a=this.labelPointStyles[i],{boxHeight:r,boxWidth:l,boxPadding:h}=n,c=He(n.bodyFont),d=No(this,"left",n),u=s.x(d),f=r<c.lineHeight?(c.lineHeight-r)/2:0,g=e.y+f;if(n.usePointStyle){const e={radius:Math.min(l,r)/2,pointStyle:a.pointStyle,rotation:a.rotation,borderWidth:1},i=s.leftForLtr(u,l)+l/2,h=g+r/2;t.strokeStyle=n.multiKeyBackground,t.fillStyle=n.multiKeyBackground,Zt(t,e,i,h),t.strokeStyle=o.borderColor,t.fillStyle=o.backgroundColor,Zt(t,e,i,h)}else{t.lineWidth=o.borderWidth||1,t.strokeStyle=o.borderColor,t.setLineDash(o.borderDash||[]),t.lineDashOffset=o.borderDashOffset||0;const e=s.leftForLtr(u,l-h),i=s.leftForLtr(s.xPlus(u,1),l-h-2),a=We(o.borderRadius);Object.values(a).some((t=>0!==t))?(t.beginPath(),t.fillStyle=n.multiKeyBackground,oe(t,{x:e,y:g,w:l,h:r,radius:a}),t.fill(),t.stroke(),t.fillStyle=o.backgroundColor,t.beginPath(),oe(t,{x:i,y:g+1,w:l-2,h:r-2,radius:a}),t.fill()):(t.fillStyle=n.multiKeyBackground,t.fillRect(e,g,l,r),t.strokeRect(e,g,l,r),t.fillStyle=o.backgroundColor,t.fillRect(i,g+1,l-2,r-2))}t.fillStyle=this.labelTextColors[i]}drawBody(t,e,i){const{body:s}=this,{bodySpacing:n,bodyAlign:o,displayColors:a,boxHeight:r,boxWidth:l,boxPadding:h}=i,c=He(i.bodyFont);let d=c.lineHeight,u=0;const f=Ei(i.rtl,this.x,this.width),g=function(i){e.fillText(i,f.x(t.x+u),t.y+d/2),t.y+=d+n},p=f.textAlign(o);let m,x,b,_,y,v,w;for(e.textAlign=o,e.textBaseline="middle",e.font=c.string,t.x=No(this,p,i),e.fillStyle=i.bodyColor,Q(this.beforeBody,g),u=a&&"right"!==p?"center"===o?l/2+h:l+2+h:0,_=0,v=s.length;_<v;++_){for(m=s[_],x=this.labelTextColors[_],e.fillStyle=x,Q(m.before,g),b=m.lines,a&&b.length&&(this._drawColorBox(e,t,_,f,i),d=Math.max(c.lineHeight,r)),y=0,w=b.length;y<w;++y)g(b[y]),d=c.lineHeight;Q(m.after,g)}u=0,d=c.lineHeight,Q(this.afterBody,g),t.y-=n}drawFooter(t,e,i){const s=this.footer,n=s.length;let o,a;if(n){const r=Ei(i.rtl,this.x,this.width);for(t.x=No(this,i.footerAlign,i),t.y+=i.footerMarginTop,e.textAlign=r.textAlign(i.footerAlign),e.textBaseline="middle",o=He(i.footerFont),e.fillStyle=i.footerColor,e.font=o.string,a=0;a<n;++a)e.fillText(s[a],r.x(t.x),t.y+o.lineHeight/2),t.y+=o.lineHeight+i.footerSpacing}}drawBackground(t,e,i,s){const{xAlign:n,yAlign:o}=this,{x:a,y:r}=t,{width:l,height:h}=i,{topLeft:c,topRight:d,bottomLeft:u,bottomRight:f}=We(s.cornerRadius);e.fillStyle=s.backgroundColor,e.strokeStyle=s.borderColor,e.lineWidth=s.borderWidth,e.beginPath(),e.moveTo(a+c,r),"top"===o&&this.drawCaret(t,e,i,s),e.lineTo(a+l-d,r),e.quadraticCurveTo(a+l,r,a+l,r+d),"center"===o&&"right"===n&&this.drawCaret(t,e,i,s),e.lineTo(a+l,r+h-f),e.quadraticCurveTo(a+l,r+h,a+l-f,r+h),"bottom"===o&&this.drawCaret(t,e,i,s),e.lineTo(a+u,r+h),e.quadraticCurveTo(a,r+h,a,r+h-u),"center"===o&&"left"===n&&this.drawCaret(t,e,i,s),e.lineTo(a,r+c),e.quadraticCurveTo(a,r,a+c,r),e.closePath(),e.fill(),s.borderWidth>0&&e.stroke()}_updateAnimationTarget(t){const e=this.chart,i=this.$animations,s=i&&i.x,n=i&&i.y;if(s||n){const i=Ro[t.position].call(this,this._active,this._eventPosition);if(!i)return;const o=this._size=Fo(this,t),a=Object.assign({},i,this._size),r=Vo(e,t,a),l=Wo(t,a,r,e);s._to===l.x&&n._to===l.y||(this.xAlign=r.xAlign,this.yAlign=r.yAlign,this.width=o.width,this.height=o.height,this.caretX=i.x,this.caretY=i.y,this._resolveAnimations().update(this,l))}}draw(t){const e=this.options.setContext(this.getContext());let i=this.opacity;if(!i)return;this._updateAnimationTarget(e);const s={width:this.width,height:this.height},n={x:this.x,y:this.y};i=Math.abs(i)<.001?0:i;const o=Ne(e.padding),a=this.title.length||this.beforeBody.length||this.body.length||this.afterBody.length||this.footer.length;e.enabled&&a&&(t.save(),t.globalAlpha=i,this.drawBackground(n,t,s,e),Ii(t,e.textDirection),n.y+=o.top,this.drawTitle(n,t,e),this.drawBody(n,t,e),this.drawFooter(n,t,e),zi(t,e.textDirection),t.restore())}getActiveElements(){return this._active||[]}setActiveElements(t,e){const i=this._active,s=t.map((({datasetIndex:t,index:e})=>{const i=this.chart.getDatasetMeta(t);if(!i)throw new Error("Cannot find a dataset at index "+t);return{datasetIndex:t,element:i.data[e],index:e}})),n=!tt(i,s),o=this._positionChanged(s,e);(n||o)&&(this._active=s,this._eventPosition=e,this._ignoreReplayEvents=!0,this.update(!0))}handleEvent(t,e,i=!0){if(e&&this._ignoreReplayEvents)return!1;this._ignoreReplayEvents=!1;const s=this.options,n=this._active||[],o=this._getActiveElements(t,n,e,i),a=this._positionChanged(o,t),r=e||!tt(o,n)||a;return r&&(this._active=o,(s.enabled||s.external)&&(this._eventPosition={x:t.x,y:t.y},this.update(!0,e))),r}_getActiveElements(t,e,i,s){const n=this.options;if("mouseout"===t.type)return[];if(!s)return e;const o=this.chart.getElementsAtEventForMode(t,n.mode,n,i);return n.reverse&&o.reverse(),o}_positionChanged(t,e){const{caretX:i,caretY:s,options:n}=this,o=Ro[n.position].call(this,t,e);return!1!==o&&(i!==o.x||s!==o.y)}}$o.positioners=Ro;var Yo={id:"tooltip",_element:$o,positioners:Ro,afterInit(t,e,i){i&&(t.tooltip=new $o({chart:t,options:i}))},beforeUpdate(t,e,i){t.tooltip&&t.tooltip.initialize(i)},reset(t,e,i){t.tooltip&&t.tooltip.initialize(i)},afterDraw(t){const e=t.tooltip,i={tooltip:e};!1!==t.notifyPlugins("beforeTooltipDraw",i)&&(e&&e.draw(t.ctx),t.notifyPlugins("afterTooltipDraw",i))},afterEvent(t,e){if(t.tooltip){const i=e.replay;t.tooltip.handleEvent(e.event,i,e.inChartArea)&&(e.changed=!0)}},defaults:{enabled:!0,external:null,position:"average",backgroundColor:"rgba(0,0,0,0.8)",titleColor:"#fff",titleFont:{weight:"bold"},titleSpacing:2,titleMarginBottom:6,titleAlign:"left",bodyColor:"#fff",bodySpacing:2,bodyFont:{},bodyAlign:"left",footerColor:"#fff",footerSpacing:2,footerMarginTop:6,footerFont:{weight:"bold"},footerAlign:"left",padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:(t,e)=>e.bodyFont.size,boxWidth:(t,e)=>e.bodyFont.size,multiKeyBackground:"#fff",displayColors:!0,boxPadding:0,borderColor:"rgba(0,0,0,0)",borderWidth:0,animation:{duration:400,easing:"easeOutQuart"},animations:{numbers:{type:"number",properties:["x","y","width","height","caretX","caretY"]},opacity:{easing:"linear",duration:200}},callbacks:{beforeTitle:H,title(t){if(t.length>0){const e=t[0],i=e.chart.data.labels,s=i?i.length:0;if(this&&this.options&&"dataset"===this.options.mode)return e.dataset.label||"";if(e.label)return e.label;if(s>0&&e.dataIndex<s)return i[e.dataIndex]}return""},afterTitle:H,beforeBody:H,beforeLabel:H,label(t){if(this&&this.options&&"dataset"===this.options.mode)return t.label+": "+t.formattedValue||t.formattedValue;let e=t.dataset.label||"";e&&(e+=": ");const i=t.formattedValue;return $(i)||(e+=i),e},labelColor(t){const e=t.chart.getDatasetMeta(t.datasetIndex).controller.getStyle(t.dataIndex);return{borderColor:e.borderColor,backgroundColor:e.backgroundColor,borderWidth:e.borderWidth,borderDash:e.borderDash,borderDashOffset:e.borderDashOffset,borderRadius:0}},labelTextColor(){return this.options.bodyColor},labelPointStyle(t){const e=t.chart.getDatasetMeta(t.datasetIndex).controller.getStyle(t.dataIndex);return{pointStyle:e.pointStyle,rotation:e.rotation}},afterLabel:H,afterBody:H,beforeFooter:H,footer:H,afterFooter:H}},defaultRoutes:{bodyFont:"font",footerFont:"font",titleFont:"font"},descriptors:{_scriptable:t=>"filter"!==t&&"itemSort"!==t&&"external"!==t,_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:"animation"}},additionalOptionScopes:["interaction"]},Uo=Object.freeze({__proto__:null,Decimation:ro,Filler:So,Legend:Co,SubTitle:Lo,Title:Ao,Tooltip:Yo});function Xo(t,e,i,s){const n=t.indexOf(e);if(-1===n)return((t,e,i,s)=>("string"==typeof e?(i=t.push(e)-1,s.unshift({index:i,label:e})):isNaN(e)&&(i=null),i))(t,e,i,s);return n!==t.lastIndexOf(e)?i:n}class qo extends Bs{constructor(t){super(t),this._startValue=void 0,this._valueRange=0,this._addedLabels=[]}init(t){const e=this._addedLabels;if(e.length){const t=this.getLabels();for(const{index:i,label:s}of e)t[i]===s&&t.splice(i,1);this._addedLabels=[]}super.init(t)}parse(t,e){if($(t))return null;const i=this.getLabels();return((t,e)=>null===t?null:jt(Math.round(t),0,e))(e=isFinite(e)&&i[e]===t?e:Xo(i,t,K(e,t),this._addedLabels),i.length-1)}determineDataLimits(){const{minDefined:t,maxDefined:e}=this.getUserBounds();let{min:i,max:s}=this.getMinMax(!0);"ticks"===this.options.bounds&&(t||(i=0),e||(s=this.getLabels().length-1)),this.min=i,this.max=s}buildTicks(){const t=this.min,e=this.max,i=this.options.offset,s=[];let n=this.getLabels();n=0===t&&e===n.length-1?n:n.slice(t,e+1),this._valueRange=Math.max(n.length-(i?0:1),1),this._startValue=this.min-(i?.5:0);for(let i=t;i<=e;i++)s.push({value:i});return s}getLabelForValue(t){const e=this.getLabels();return t>=0&&t<e.length?e[t]:t}configure(){super.configure(),this.isHorizontal()||(this._reversePixels=!this._reversePixels)}getPixelForValue(t){return"number"!=typeof t&&(t=this.parse(t)),null===t?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}getPixelForTick(t){const e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t].value)}getValueForPixel(t){return Math.round(this._startValue+this.getDecimalForPixel(t)*this._valueRange)}getBasePixel(){return this.bottom}}function Ko(t,e,{horizontal:i,minRotation:s}){const n=It(s),o=(i?Math.sin(n):Math.cos(n))||.001,a=.75*e*(""+t).length;return Math.min(e/o,a)}qo.id="category",qo.defaults={ticks:{callback:qo.prototype.getLabelForValue}};class Go extends Bs{constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._endValue=void 0,this._valueRange=0}parse(t,e){return $(t)||("number"==typeof t||t instanceof Number)&&!isFinite(+t)?null:+t}handleTickRangeOptions(){const{beginAtZero:t}=this.options,{minDefined:e,maxDefined:i}=this.getUserBounds();let{min:s,max:n}=this;const o=t=>s=e?s:t,a=t=>n=i?n:t;if(t){const t=Ct(s),e=Ct(n);t<0&&e<0?a(0):t>0&&e>0&&o(0)}if(s===n){let e=1;(n>=Number.MAX_SAFE_INTEGER||s<=Number.MIN_SAFE_INTEGER)&&(e=Math.abs(.05*n)),a(n+e),t||o(s-e)}this.min=s,this.max=n}getTickLimit(){const t=this.options.ticks;let e,{maxTicksLimit:i,stepSize:s}=t;return s?(e=Math.ceil(this.max/s)-Math.floor(this.min/s)+1,e>1e3&&(console.warn(`scales.${this.id}.ticks.stepSize: ${s} would result generating up to ${e} ticks. Limiting to 1000.`),e=1e3)):(e=this.computeTickLimit(),i=i||11),i&&(e=Math.min(i,e)),e}computeTickLimit(){return Number.POSITIVE_INFINITY}buildTicks(){const t=this.options,e=t.ticks;let i=this.getTickLimit();i=Math.max(2,i);const s=function(t,e){const i=[],{bounds:s,step:n,min:o,max:a,precision:r,count:l,maxTicks:h,maxDigits:c,includeBounds:d}=t,u=n||1,f=h-1,{min:g,max:p}=e,m=!$(o),x=!$(a),b=!$(l),_=(p-g)/(c+1);let y,v,w,M,k=Ot((p-g)/f/u)*u;if(k<1e-14&&!m&&!x)return[{value:g},{value:p}];M=Math.ceil(p/k)-Math.floor(g/k),M>f&&(k=Ot(M*k/f/u)*u),$(r)||(y=Math.pow(10,r),k=Math.ceil(k*y)/y),"ticks"===s?(v=Math.floor(g/k)*k,w=Math.ceil(p/k)*k):(v=g,w=p),m&&x&&n&&Rt((a-o)/n,k/1e3)?(M=Math.round(Math.min((a-o)/k,h)),k=(a-o)/M,v=o,w=a):b?(v=m?o:v,w=x?a:w,M=l-1,k=(w-v)/M):(M=(w-v)/k,M=Lt(M,Math.round(M),k/1e3)?Math.round(M):Math.ceil(M));const S=Math.max(Ft(k),Ft(v));y=Math.pow(10,$(r)?S:r),v=Math.round(v*y)/y,w=Math.round(w*y)/y;let P=0;for(m&&(d&&v!==o?(i.push({value:o}),v<o&&P++,Lt(Math.round((v+P*k)*y)/y,o,Ko(o,_,t))&&P++):v<o&&P++);P<M;++P)i.push({value:Math.round((v+P*k)*y)/y});return x&&d&&w!==a?i.length&&Lt(i[i.length-1].value,a,Ko(a,_,t))?i[i.length-1].value=a:i.push({value:a}):x&&w!==a||i.push({value:w}),i}({maxTicks:i,bounds:t.bounds,min:t.min,max:t.max,precision:e.precision,step:e.stepSize,count:e.count,maxDigits:this._maxDigits(),horizontal:this.isHorizontal(),minRotation:e.minRotation||0,includeBounds:!1!==e.includeBounds},this._range||this);return"ticks"===t.bounds&&Et(s,this,"value"),t.reverse?(s.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),s}configure(){const t=this.ticks;let e=this.min,i=this.max;if(super.configure(),this.options.offset&&t.length){const s=(i-e)/Math.max(t.length-1,1)/2;e-=s,i+=s}this._startValue=e,this._endValue=i,this._valueRange=i-e}getLabelForValue(t){return Ri(t,this.chart.options.locale,this.options.ticks.format)}}class Zo extends Go{determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=X(t)?t:0,this.max=X(e)?e:1,this.handleTickRangeOptions()}computeTickLimit(){const t=this.isHorizontal(),e=t?this.width:this.height,i=It(this.options.ticks.minRotation),s=(t?Math.sin(i):Math.cos(i))||.001,n=this._resolveTickFontOptions(0);return Math.ceil(e/Math.min(40,n.lineHeight/s))}getPixelForValue(t){return null===t?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}getValueForPixel(t){return this._startValue+this.getDecimalForPixel(t)*this._valueRange}}function Jo(t){return 1===t/Math.pow(10,Math.floor(Dt(t)))}Zo.id="linear",Zo.defaults={ticks:{callback:Os.formatters.numeric}};class Qo extends Bs{constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._valueRange=0}parse(t,e){const i=Go.prototype.parse.apply(this,[t,e]);if(0!==i)return X(i)&&i>0?i:null;this._zero=!0}determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=X(t)?Math.max(0,t):null,this.max=X(e)?Math.max(0,e):null,this.options.beginAtZero&&(this._zero=!0),this.handleTickRangeOptions()}handleTickRangeOptions(){const{minDefined:t,maxDefined:e}=this.getUserBounds();let i=this.min,s=this.max;const n=e=>i=t?i:e,o=t=>s=e?s:t,a=(t,e)=>Math.pow(10,Math.floor(Dt(t))+e);i===s&&(i<=0?(n(1),o(10)):(n(a(i,-1)),o(a(s,1)))),i<=0&&n(a(s,-1)),s<=0&&o(a(i,1)),this._zero&&this.min!==this._suggestedMin&&i===a(this.min,0)&&n(a(i,-1)),this.min=i,this.max=s}buildTicks(){const t=this.options,e=function(t,e){const i=Math.floor(Dt(e.max)),s=Math.ceil(e.max/Math.pow(10,i)),n=[];let o=q(t.min,Math.pow(10,Math.floor(Dt(e.min)))),a=Math.floor(Dt(o)),r=Math.floor(o/Math.pow(10,a)),l=a<0?Math.pow(10,Math.abs(a)):1;do{n.push({value:o,major:Jo(o)}),++r,10===r&&(r=1,++a,l=a>=0?1:l),o=Math.round(r*Math.pow(10,a)*l)/l}while(a<i||a===i&&r<s);const h=q(t.max,o);return n.push({value:h,major:Jo(o)}),n}({min:this._userMin,max:this._userMax},this);return"ticks"===t.bounds&&Et(e,this,"value"),t.reverse?(e.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),e}getLabelForValue(t){return void 0===t?"0":Ri(t,this.chart.options.locale,this.options.ticks.format)}configure(){const t=this.min;super.configure(),this._startValue=Dt(t),this._valueRange=Dt(this.max)-Dt(t)}getPixelForValue(t){return void 0!==t&&0!==t||(t=this.min),null===t||isNaN(t)?NaN:this.getPixelForDecimal(t===this.min?0:(Dt(t)-this._startValue)/this._valueRange)}getValueForPixel(t){const e=this.getDecimalForPixel(t);return Math.pow(10,this._startValue+e*this._valueRange)}}function ta(t){const e=t.ticks;if(e.display&&t.display){const t=Ne(e.backdropPadding);return K(e.font&&e.font.size,bt.font.size)+t.height}return 0}function ea(t,e,i,s,n){return t===s||t===n?{start:e-i/2,end:e+i/2}:t<s||t>n?{start:e-i,end:e}:{start:e,end:e+i}}function ia(t){const e={l:t.left+t._padding.left,r:t.right-t._padding.right,t:t.top+t._padding.top,b:t.bottom-t._padding.bottom},i=Object.assign({},e),s=[],n=[],o=t._pointLabels.length,a=t.options.pointLabels,r=a.centerPointLabels?_t/o:0;for(let d=0;d<o;d++){const o=a.setContext(t.getPointLabelContext(d));n[d]=o.padding;const u=t.getPointPosition(d,t.drawingArea+n[d],r),f=He(o.font),g=(l=t.ctx,h=f,c=Y(c=t._pointLabels[d])?c:[c],{w:qt(l,h.string,c),h:c.length*h.lineHeight});s[d]=g;const p=Nt(t.getIndexAngle(d)+r),m=Math.round(zt(p));sa(i,e,p,ea(m,u.x,g.w,0,180),ea(m,u.y,g.h,90,270))}var l,h,c;t.setCenterPoint(e.l-i.l,i.r-e.r,e.t-i.t,i.b-e.b),t._pointLabelItems=function(t,e,i){const s=[],n=t._pointLabels.length,o=t.options,a=ta(o)/2,r=t.drawingArea,l=o.pointLabels.centerPointLabels?_t/n:0;for(let o=0;o<n;o++){const n=t.getPointPosition(o,r+a+i[o],l),h=Math.round(zt(Nt(n.angle+kt))),c=e[o],d=aa(n.y,c.h,h),u=na(h),f=oa(n.x,c.w,u);s.push({x:n.x,y:d,textAlign:u,left:f,top:d,right:f+c.w,bottom:d+c.h})}return s}(t,s,n)}function sa(t,e,i,s,n){const o=Math.abs(Math.sin(i)),a=Math.abs(Math.cos(i));let r=0,l=0;s.start<e.l?(r=(e.l-s.start)/o,t.l=Math.min(t.l,e.l-r)):s.end>e.r&&(r=(s.end-e.r)/o,t.r=Math.max(t.r,e.r+r)),n.start<e.t?(l=(e.t-n.start)/a,t.t=Math.min(t.t,e.t-l)):n.end>e.b&&(l=(n.end-e.b)/a,t.b=Math.max(t.b,e.b+l))}function na(t){return 0===t||180===t?"center":t<180?"left":"right"}function oa(t,e,i){return"right"===i?t-=e:"center"===i&&(t-=e/2),t}function aa(t,e,i){return 90===i||270===i?t-=e/2:(i>270||i<90)&&(t-=e),t}function ra(t,e,i,s){const{ctx:n}=t;if(i)n.arc(t.xCenter,t.yCenter,e,0,yt);else{let i=t.getPointPosition(0,e);n.moveTo(i.x,i.y);for(let o=1;o<s;o++)i=t.getPointPosition(o,e),n.lineTo(i.x,i.y)}}Qo.id="logarithmic",Qo.defaults={ticks:{callback:Os.formatters.logarithmic,major:{enabled:!0}}};class la extends Go{constructor(t){super(t),this.xCenter=void 0,this.yCenter=void 0,this.drawingArea=void 0,this._pointLabels=[],this._pointLabelItems=[]}setDimensions(){const t=this._padding=Ne(ta(this.options)/2),e=this.width=this.maxWidth-t.width,i=this.height=this.maxHeight-t.height;this.xCenter=Math.floor(this.left+e/2+t.left),this.yCenter=Math.floor(this.top+i/2+t.top),this.drawingArea=Math.floor(Math.min(e,i)/2)}determineDataLimits(){const{min:t,max:e}=this.getMinMax(!1);this.min=X(t)&&!isNaN(t)?t:0,this.max=X(e)&&!isNaN(e)?e:0,this.handleTickRangeOptions()}computeTickLimit(){return Math.ceil(this.drawingArea/ta(this.options))}generateTickLabels(t){Go.prototype.generateTickLabels.call(this,t),this._pointLabels=this.getLabels().map(((t,e)=>{const i=J(this.options.pointLabels.callback,[t,e],this);return i||0===i?i:""})).filter(((t,e)=>this.chart.getDataVisibility(e)))}fit(){const t=this.options;t.display&&t.pointLabels.display?ia(this):this.setCenterPoint(0,0,0,0)}setCenterPoint(t,e,i,s){this.xCenter+=Math.floor((t-e)/2),this.yCenter+=Math.floor((i-s)/2),this.drawingArea-=Math.min(this.drawingArea/2,Math.max(t,e,i,s))}getIndexAngle(t){return Nt(t*(yt/(this._pointLabels.length||1))+It(this.options.startAngle||0))}getDistanceFromCenterForValue(t){if($(t))return NaN;const e=this.drawingArea/(this.max-this.min);return this.options.reverse?(this.max-t)*e:(t-this.min)*e}getValueForDistanceFromCenter(t){if($(t))return NaN;const e=t/(this.drawingArea/(this.max-this.min));return this.options.reverse?this.max-e:this.min+e}getPointLabelContext(t){const e=this._pointLabels||[];if(t>=0&&t<e.length){const i=e[t];return function(t,e,i){return Ye(t,{label:i,index:e,type:"pointLabel"})}(this.getContext(),t,i)}}getPointPosition(t,e,i=0){const s=this.getIndexAngle(t)-kt+i;return{x:Math.cos(s)*e+this.xCenter,y:Math.sin(s)*e+this.yCenter,angle:s}}getPointPositionForValue(t,e){return this.getPointPosition(t,this.getDistanceFromCenterForValue(e))}getBasePosition(t){return this.getPointPositionForValue(t||0,this.getBaseValue())}getPointLabelPosition(t){const{left:e,top:i,right:s,bottom:n}=this._pointLabelItems[t];return{left:e,top:i,right:s,bottom:n}}drawBackground(){const{backgroundColor:t,grid:{circular:e}}=this.options;if(t){const i=this.ctx;i.save(),i.beginPath(),ra(this,this.getDistanceFromCenterForValue(this._endValue),e,this._pointLabels.length),i.closePath(),i.fillStyle=t,i.fill(),i.restore()}}drawGrid(){const t=this.ctx,e=this.options,{angleLines:i,grid:s}=e,n=this._pointLabels.length;let o,a,r;if(e.pointLabels.display&&function(t,e){const{ctx:i,options:{pointLabels:s}}=t;for(let n=e-1;n>=0;n--){const e=s.setContext(t.getPointLabelContext(n)),o=He(e.font),{x:a,y:r,textAlign:l,left:h,top:c,right:d,bottom:u}=t._pointLabelItems[n],{backdropColor:f}=e;if(!$(f)){const t=Ne(e.backdropPadding);i.fillStyle=f,i.fillRect(h-t.left,c-t.top,d-h+t.width,u-c+t.height)}se(i,t._pointLabels[n],a,r+o.lineHeight/2,o,{color:e.color,textAlign:l,textBaseline:"middle"})}}(this,n),s.display&&this.ticks.forEach(((t,e)=>{if(0!==e){a=this.getDistanceFromCenterForValue(t.value);!function(t,e,i,s){const n=t.ctx,o=e.circular,{color:a,lineWidth:r}=e;!o&&!s||!a||!r||i<0||(n.save(),n.strokeStyle=a,n.lineWidth=r,n.setLineDash(e.borderDash),n.lineDashOffset=e.borderDashOffset,n.beginPath(),ra(t,i,o,s),n.closePath(),n.stroke(),n.restore())}(this,s.setContext(this.getContext(e-1)),a,n)}})),i.display){for(t.save(),o=n-1;o>=0;o--){const s=i.setContext(this.getPointLabelContext(o)),{color:n,lineWidth:l}=s;l&&n&&(t.lineWidth=l,t.strokeStyle=n,t.setLineDash(s.borderDash),t.lineDashOffset=s.borderDashOffset,a=this.getDistanceFromCenterForValue(e.ticks.reverse?this.min:this.max),r=this.getPointPosition(o,a),t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(r.x,r.y),t.stroke())}t.restore()}}drawBorder(){}drawLabels(){const t=this.ctx,e=this.options,i=e.ticks;if(!i.display)return;const s=this.getIndexAngle(0);let n,o;t.save(),t.translate(this.xCenter,this.yCenter),t.rotate(s),t.textAlign="center",t.textBaseline="middle",this.ticks.forEach(((s,a)=>{if(0===a&&!e.reverse)return;const r=i.setContext(this.getContext(a)),l=He(r.font);if(n=this.getDistanceFromCenterForValue(this.ticks[a].value),r.showLabelBackdrop){t.font=l.string,o=t.measureText(s.label).width,t.fillStyle=r.backdropColor;const e=Ne(r.backdropPadding);t.fillRect(-o/2-e.left,-n-l.size/2-e.top,o+e.width,l.size+e.height)}se(t,s.label,0,-n,l,{color:r.color})})),t.restore()}drawTitle(){}}la.id="radialLinear",la.defaults={display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,lineWidth:1,borderDash:[],borderDashOffset:0},grid:{circular:!1},startAngle:0,ticks:{showLabelBackdrop:!0,callback:Os.formatters.numeric},pointLabels:{backdropColor:void 0,backdropPadding:2,display:!0,font:{size:10},callback:t=>t,padding:5,centerPointLabels:!1}},la.defaultRoutes={"angleLines.color":"borderColor","pointLabels.color":"color","ticks.color":"color"},la.descriptors={angleLines:{_fallback:"grid"}};const ha={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},ca=Object.keys(ha);function da(t,e){return t-e}function ua(t,e){if($(e))return null;const i=t._adapter,{parser:s,round:n,isoWeekday:o}=t._parseOpts;let a=e;return"function"==typeof s&&(a=s(a)),X(a)||(a="string"==typeof s?i.parse(a,s):i.parse(a)),null===a?null:(n&&(a="week"!==n||!Tt(o)&&!0!==o?i.startOf(a,n):i.startOf(a,"isoWeek",o)),+a)}function fa(t,e,i,s){const n=ca.length;for(let o=ca.indexOf(t);o<n-1;++o){const t=ha[ca[o]],n=t.steps?t.steps:Number.MAX_SAFE_INTEGER;if(t.common&&Math.ceil((i-e)/(n*t.size))<=s)return ca[o]}return ca[n-1]}function ga(t,e,i){if(i){if(i.length){const{lo:s,hi:n}=ae(i,e);t[i[s]>=e?i[s]:i[n]]=!0}}else t[e]=!0}function pa(t,e,i){const s=[],n={},o=e.length;let a,r;for(a=0;a<o;++a)r=e[a],n[r]=a,s.push({value:r,major:!1});return 0!==o&&i?function(t,e,i,s){const n=t._adapter,o=+n.startOf(e[0].value,s),a=e[e.length-1].value;let r,l;for(r=o;r<=a;r=+n.add(r,1,s))l=i[r],l>=0&&(e[l].major=!0);return e}(t,s,n,i):s}class ma extends Bs{constructor(t){super(t),this._cache={data:[],labels:[],all:[]},this._unit="day",this._majorUnit=void 0,this._offsets={},this._normalized=!1,this._parseOpts=void 0}init(t,e){const i=t.time||(t.time={}),s=this._adapter=new mn._date(t.adapters.date);ot(i.displayFormats,s.formats()),this._parseOpts={parser:i.parser,round:i.round,isoWeekday:i.isoWeekday},super.init(t),this._normalized=e.normalized}parse(t,e){return void 0===t?null:ua(this,t)}beforeLayout(){super.beforeLayout(),this._cache={data:[],labels:[],all:[]}}determineDataLimits(){const t=this.options,e=this._adapter,i=t.time.unit||"day";let{min:s,max:n,minDefined:o,maxDefined:a}=this.getUserBounds();function r(t){o||isNaN(t.min)||(s=Math.min(s,t.min)),a||isNaN(t.max)||(n=Math.max(n,t.max))}o&&a||(r(this._getLabelBounds()),"ticks"===t.bounds&&"labels"===t.ticks.source||r(this.getMinMax(!1))),s=X(s)&&!isNaN(s)?s:+e.startOf(Date.now(),i),n=X(n)&&!isNaN(n)?n:+e.endOf(Date.now(),i)+1,this.min=Math.min(s,n-1),this.max=Math.max(s+1,n)}_getLabelBounds(){const t=this.getLabelTimestamps();let e=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY;return t.length&&(e=t[0],i=t[t.length-1]),{min:e,max:i}}buildTicks(){const t=this.options,e=t.time,i=t.ticks,s="labels"===i.source?this.getLabelTimestamps():this._generate();"ticks"===t.bounds&&s.length&&(this.min=this._userMin||s[0],this.max=this._userMax||s[s.length-1]);const n=this.min,o=he(s,n,this.max);return this._unit=e.unit||(i.autoSkip?fa(e.minUnit,this.min,this.max,this._getLabelCapacity(n)):function(t,e,i,s,n){for(let o=ca.length-1;o>=ca.indexOf(i);o--){const i=ca[o];if(ha[i].common&&t._adapter.diff(n,s,i)>=e-1)return i}return ca[i?ca.indexOf(i):0]}(this,o.length,e.minUnit,this.min,this.max)),this._majorUnit=i.major.enabled&&"year"!==this._unit?function(t){for(let e=ca.indexOf(t)+1,i=ca.length;e<i;++e)if(ha[ca[e]].common)return ca[e]}(this._unit):void 0,this.initOffsets(s),t.reverse&&o.reverse(),pa(this,o,this._majorUnit)}initOffsets(t){let e,i,s=0,n=0;this.options.offset&&t.length&&(e=this.getDecimalForValue(t[0]),s=1===t.length?1-e:(this.getDecimalForValue(t[1])-e)/2,i=this.getDecimalForValue(t[t.length-1]),n=1===t.length?i:(i-this.getDecimalForValue(t[t.length-2]))/2);const o=t.length<3?.5:.25;s=jt(s,0,o),n=jt(n,0,o),this._offsets={start:s,end:n,factor:1/(s+1+n)}}_generate(){const t=this._adapter,e=this.min,i=this.max,s=this.options,n=s.time,o=n.unit||fa(n.minUnit,e,i,this._getLabelCapacity(e)),a=K(n.stepSize,1),r="week"===o&&n.isoWeekday,l=Tt(r)||!0===r,h={};let c,d,u=e;if(l&&(u=+t.startOf(u,"isoWeek",r)),u=+t.startOf(u,l?"day":o),t.diff(i,e,o)>1e5*a)throw new Error(e+" and "+i+" are too far apart with stepSize of "+a+" "+o);const f="data"===s.ticks.source&&this.getDataTimestamps();for(c=u,d=0;c<i;c=+t.add(c,a,o),d++)ga(h,c,f);return c!==i&&"ticks"!==s.bounds&&1!==d||ga(h,c,f),Object.keys(h).sort(((t,e)=>t-e)).map((t=>+t))}getLabelForValue(t){const e=this._adapter,i=this.options.time;return i.tooltipFormat?e.format(t,i.tooltipFormat):e.format(t,i.displayFormats.datetime)}_tickFormatFunction(t,e,i,s){const n=this.options,o=n.time.displayFormats,a=this._unit,r=this._majorUnit,l=a&&o[a],h=r&&o[r],c=i[e],d=r&&h&&c&&c.major,u=this._adapter.format(t,s||(d?h:l)),f=n.ticks.callback;return f?J(f,[u,e,i],this):u}generateTickLabels(t){let e,i,s;for(e=0,i=t.length;e<i;++e)s=t[e],s.label=this._tickFormatFunction(s.value,e,t)}getDecimalForValue(t){return null===t?NaN:(t-this.min)/(this.max-this.min)}getPixelForValue(t){const e=this._offsets,i=this.getDecimalForValue(t);return this.getPixelForDecimal((e.start+i)*e.factor)}getValueForPixel(t){const e=this._offsets,i=this.getDecimalForPixel(t)/e.factor-e.end;return this.min+i*(this.max-this.min)}_getLabelSize(t){const e=this.options.ticks,i=this.ctx.measureText(t).width,s=It(this.isHorizontal()?e.maxRotation:e.minRotation),n=Math.cos(s),o=Math.sin(s),a=this._resolveTickFontOptions(0).size;return{w:i*n+a*o,h:i*o+a*n}}_getLabelCapacity(t){const e=this.options.time,i=e.displayFormats,s=i[e.unit]||i.millisecond,n=this._tickFormatFunction(t,0,pa(this,[t],this._majorUnit),s),o=this._getLabelSize(n),a=Math.floor(this.isHorizontal()?this.width/o.w:this.height/o.h)-1;return a>0?a:1}getDataTimestamps(){let t,e,i=this._cache.data||[];if(i.length)return i;const s=this.getMatchingVisibleMetas();if(this._normalized&&s.length)return this._cache.data=s[0].controller.getAllParsedValues(this);for(t=0,e=s.length;t<e;++t)i=i.concat(s[t].controller.getAllParsedValues(this));return this._cache.data=this.normalize(i)}getLabelTimestamps(){const t=this._cache.labels||[];let e,i;if(t.length)return t;const s=this.getLabels();for(e=0,i=s.length;e<i;++e)t.push(ua(this,s[e]));return this._cache.labels=this._normalized?t:this.normalize(t)}normalize(t){return fe(t.sort(da))}}function xa(t,e,i){let s,n,o,a,r=0,l=t.length-1;i?(e>=t[r].pos&&e<=t[l].pos&&({lo:r,hi:l}=re(t,"pos",e)),({pos:s,time:o}=t[r]),({pos:n,time:a}=t[l])):(e>=t[r].time&&e<=t[l].time&&({lo:r,hi:l}=re(t,"time",e)),({time:s,pos:o}=t[r]),({time:n,pos:a}=t[l]));const h=n-s;return h?o+(a-o)*(e-s)/h:o}ma.id="time",ma.defaults={bounds:"data",adapters:{},time:{parser:!1,unit:!1,round:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{source:"auto",major:{enabled:!1}}};class ba extends ma{constructor(t){super(t),this._table=[],this._minPos=void 0,this._tableRange=void 0}initOffsets(){const t=this._getTimestampsForTable(),e=this._table=this.buildLookupTable(t);this._minPos=xa(e,this.min),this._tableRange=xa(e,this.max)-this._minPos,super.initOffsets(t)}buildLookupTable(t){const{min:e,max:i}=this,s=[],n=[];let o,a,r,l,h;for(o=0,a=t.length;o<a;++o)l=t[o],l>=e&&l<=i&&s.push(l);if(s.length<2)return[{time:e,pos:0},{time:i,pos:1}];for(o=0,a=s.length;o<a;++o)h=s[o+1],r=s[o-1],l=s[o],Math.round((h+r)/2)!==l&&n.push({time:l,pos:o/(a-1)});return n}_getTimestampsForTable(){let t=this._cache.all||[];if(t.length)return t;const e=this.getDataTimestamps(),i=this.getLabelTimestamps();return t=e.length&&i.length?this.normalize(e.concat(i)):e.length?e:i,t=this._cache.all=t,t}getDecimalForValue(t){return(xa(this._table,t)-this._minPos)/this._tableRange}getValueForPixel(t){const e=this._offsets,i=this.getDecimalForPixel(t)/e.factor-e.end;return xa(this._table,i*this._tableRange+this._minPos,!0)}}ba.id="timeseries",ba.defaults=ma.defaults;var _a=Object.freeze({__proto__:null,CategoryScale:qo,LinearScale:Zo,LogarithmicScale:Qo,RadialLinearScale:la,TimeScale:ma,TimeSeriesScale:ba});return dn.register(Rn,_a,no,Uo),dn.helpers={...Yi},dn._adapters=mn,dn.Animation=us,dn.Animations=gs,dn.animator=a,dn.controllers=Ws.controllers.items,dn.DatasetController=Ps,dn.Element=Ds,dn.elements=no,dn.Interaction=Ee,dn.layouts=ni,dn.platforms=hs,dn.Scale=Bs,dn.Ticks=Os,Object.assign(dn,Rn,_a,no,Uo,hs),dn.Chart=dn,"undefined"!=typeof window&&(window.Chart=dn),dn}));
|
1 |
/*!
|
2 |
+
* Chart.js v3.7.1
|
3 |
* https://www.chartjs.org
|
4 |
+
* (c) 2022 Chart.js Contributors
|
5 |
* Released under the MIT License
|
6 |
*/
|
7 |
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Chart=e()}(this,(function(){"use strict";const t="undefined"==typeof window?function(t){return t()}:window.requestAnimationFrame;function e(e,i,s){const n=s||(t=>Array.prototype.slice.call(t));let o=!1,a=[];return function(...s){a=n(s),o||(o=!0,t.call(window,(()=>{o=!1,e.apply(i,a)})))}}function i(t,e){let i;return function(...s){return e?(clearTimeout(i),i=setTimeout(t,e,s)):t.apply(this,s),e}}const s=t=>"start"===t?"left":"end"===t?"right":"center",n=(t,e,i)=>"start"===t?e:"end"===t?i:(e+i)/2,o=(t,e,i,s)=>t===(s?"left":"right")?i:"center"===t?(e+i)/2:e;var a=new class{constructor(){this._request=null,this._charts=new Map,this._running=!1,this._lastDate=void 0}_notify(t,e,i,s){const n=e.listeners[s],o=e.duration;n.forEach((s=>s({chart:t,initial:e.initial,numSteps:o,currentStep:Math.min(i-e.start,o)})))}_refresh(){this._request||(this._running=!0,this._request=t.call(window,(()=>{this._update(),this._request=null,this._running&&this._refresh()})))}_update(t=Date.now()){let e=0;this._charts.forEach(((i,s)=>{if(!i.running||!i.items.length)return;const n=i.items;let o,a=n.length-1,r=!1;for(;a>=0;--a)o=n[a],o._active?(o._total>i.duration&&(i.duration=o._total),o.tick(t),r=!0):(n[a]=n[n.length-1],n.pop());r&&(s.draw(),this._notify(s,i,t,"progress")),n.length||(i.running=!1,this._notify(s,i,t,"complete"),i.initial=!1),e+=n.length})),this._lastDate=t,0===e&&(this._running=!1)}_getAnims(t){const e=this._charts;let i=e.get(t);return i||(i={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},e.set(t,i)),i}listen(t,e,i){this._getAnims(t).listeners[e].push(i)}add(t,e){e&&e.length&&this._getAnims(t).items.push(...e)}has(t){return this._getAnims(t).items.length>0}start(t){const e=this._charts.get(t);e&&(e.running=!0,e.start=Date.now(),e.duration=e.items.reduce(((t,e)=>Math.max(t,e._duration)),0),this._refresh())}running(t){if(!this._running)return!1;const e=this._charts.get(t);return!!(e&&e.running&&e.items.length)}stop(t){const e=this._charts.get(t);if(!e||!e.items.length)return;const i=e.items;let s=i.length-1;for(;s>=0;--s)i[s].cancel();e.items=[],this._notify(t,e,Date.now(),"complete")}remove(t){return this._charts.delete(t)}};
|
10 |
* https://github.com/kurkle/color#readme
|
11 |
* (c) 2020 Jukka Kurkela
|
12 |
* Released under the MIT License
|
13 |
+
*/const r={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,a:10,b:11,c:12,d:13,e:14,f:15},l="0123456789ABCDEF",h=t=>l[15&t],c=t=>l[(240&t)>>4]+l[15&t],d=t=>(240&t)>>4==(15&t);function u(t){var e=function(t){return d(t.r)&&d(t.g)&&d(t.b)&&d(t.a)}(t)?h:c;return t?"#"+e(t.r)+e(t.g)+e(t.b)+(t.a<255?e(t.a):""):t}function f(t){return t+.5|0}const g=(t,e,i)=>Math.max(Math.min(t,i),e);function p(t){return g(f(2.55*t),0,255)}function m(t){return g(f(255*t),0,255)}function x(t){return g(f(t/2.55)/100,0,1)}function b(t){return g(f(100*t),0,100)}const _=/^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/;const y=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function v(t,e,i){const s=e*Math.min(i,1-i),n=(e,n=(e+t/30)%12)=>i-s*Math.max(Math.min(n-3,9-n,1),-1);return[n(0),n(8),n(4)]}function w(t,e,i){const s=(s,n=(s+t/60)%6)=>i-i*e*Math.max(Math.min(n,4-n,1),0);return[s(5),s(3),s(1)]}function M(t,e,i){const s=v(t,1,.5);let n;for(e+i>1&&(n=1/(e+i),e*=n,i*=n),n=0;n<3;n++)s[n]*=1-e-i,s[n]+=e;return s}function k(t){const e=t.r/255,i=t.g/255,s=t.b/255,n=Math.max(e,i,s),o=Math.min(e,i,s),a=(n+o)/2;let r,l,h;return n!==o&&(h=n-o,l=a>.5?h/(2-n-o):h/(n+o),r=n===e?(i-s)/h+(i<s?6:0):n===i?(s-e)/h+2:(e-i)/h+4,r=60*r+.5),[0|r,l||0,a]}function S(t,e,i,s){return(Array.isArray(e)?t(e[0],e[1],e[2]):t(e,i,s)).map(m)}function P(t,e,i){return S(v,t,e,i)}function D(t){return(t%360+360)%360}function C(t){const e=y.exec(t);let i,s=255;if(!e)return;e[5]!==i&&(s=e[6]?p(+e[5]):m(+e[5]));const n=D(+e[2]),o=+e[3]/100,a=+e[4]/100;return i="hwb"===e[1]?function(t,e,i){return S(M,t,e,i)}(n,o,a):"hsv"===e[1]?function(t,e,i){return S(w,t,e,i)}(n,o,a):P(n,o,a),{r:i[0],g:i[1],b:i[2],a:s}}const O={x:"dark",Z:"light",Y:"re",X:"blu",W:"gr",V:"medium",U:"slate",A:"ee",T:"ol",S:"or",B:"ra",C:"lateg",D:"ights",R:"in",Q:"turquois",E:"hi",P:"ro",O:"al",N:"le",M:"de",L:"yello",F:"en",K:"ch",G:"arks",H:"ea",I:"ightg",J:"wh"},A={OiceXe:"f0f8ff",antiquewEte:"faebd7",aqua:"ffff",aquamarRe:"7fffd4",azuY:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"0",blanKedOmond:"ffebcd",Xe:"ff",XeviTet:"8a2be2",bPwn:"a52a2a",burlywood:"deb887",caMtXe:"5f9ea0",KartYuse:"7fff00",KocTate:"d2691e",cSO:"ff7f50",cSnflowerXe:"6495ed",cSnsilk:"fff8dc",crimson:"dc143c",cyan:"ffff",xXe:"8b",xcyan:"8b8b",xgTMnPd:"b8860b",xWay:"a9a9a9",xgYF:"6400",xgYy:"a9a9a9",xkhaki:"bdb76b",xmagFta:"8b008b",xTivegYF:"556b2f",xSange:"ff8c00",xScEd:"9932cc",xYd:"8b0000",xsOmon:"e9967a",xsHgYF:"8fbc8f",xUXe:"483d8b",xUWay:"2f4f4f",xUgYy:"2f4f4f",xQe:"ced1",xviTet:"9400d3",dAppRk:"ff1493",dApskyXe:"bfff",dimWay:"696969",dimgYy:"696969",dodgerXe:"1e90ff",fiYbrick:"b22222",flSOwEte:"fffaf0",foYstWAn:"228b22",fuKsia:"ff00ff",gaRsbSo:"dcdcdc",ghostwEte:"f8f8ff",gTd:"ffd700",gTMnPd:"daa520",Way:"808080",gYF:"8000",gYFLw:"adff2f",gYy:"808080",honeyMw:"f0fff0",hotpRk:"ff69b4",RdianYd:"cd5c5c",Rdigo:"4b0082",ivSy:"fffff0",khaki:"f0e68c",lavFMr:"e6e6fa",lavFMrXsh:"fff0f5",lawngYF:"7cfc00",NmoncEffon:"fffacd",ZXe:"add8e6",ZcSO:"f08080",Zcyan:"e0ffff",ZgTMnPdLw:"fafad2",ZWay:"d3d3d3",ZgYF:"90ee90",ZgYy:"d3d3d3",ZpRk:"ffb6c1",ZsOmon:"ffa07a",ZsHgYF:"20b2aa",ZskyXe:"87cefa",ZUWay:"778899",ZUgYy:"778899",ZstAlXe:"b0c4de",ZLw:"ffffe0",lime:"ff00",limegYF:"32cd32",lRF:"faf0e6",magFta:"ff00ff",maPon:"800000",VaquamarRe:"66cdaa",VXe:"cd",VScEd:"ba55d3",VpurpN:"9370db",VsHgYF:"3cb371",VUXe:"7b68ee",VsprRggYF:"fa9a",VQe:"48d1cc",VviTetYd:"c71585",midnightXe:"191970",mRtcYam:"f5fffa",mistyPse:"ffe4e1",moccasR:"ffe4b5",navajowEte:"ffdead",navy:"80",Tdlace:"fdf5e6",Tive:"808000",TivedBb:"6b8e23",Sange:"ffa500",SangeYd:"ff4500",ScEd:"da70d6",pOegTMnPd:"eee8aa",pOegYF:"98fb98",pOeQe:"afeeee",pOeviTetYd:"db7093",papayawEp:"ffefd5",pHKpuff:"ffdab9",peru:"cd853f",pRk:"ffc0cb",plum:"dda0dd",powMrXe:"b0e0e6",purpN:"800080",YbeccapurpN:"663399",Yd:"ff0000",Psybrown:"bc8f8f",PyOXe:"4169e1",saddNbPwn:"8b4513",sOmon:"fa8072",sandybPwn:"f4a460",sHgYF:"2e8b57",sHshell:"fff5ee",siFna:"a0522d",silver:"c0c0c0",skyXe:"87ceeb",UXe:"6a5acd",UWay:"708090",UgYy:"708090",snow:"fffafa",sprRggYF:"ff7f",stAlXe:"4682b4",tan:"d2b48c",teO:"8080",tEstN:"d8bfd8",tomato:"ff6347",Qe:"40e0d0",viTet:"ee82ee",JHt:"f5deb3",wEte:"ffffff",wEtesmoke:"f5f5f5",Lw:"ffff00",LwgYF:"9acd32"};let T;function L(t){T||(T=function(){const t={},e=Object.keys(A),i=Object.keys(O);let s,n,o,a,r;for(s=0;s<e.length;s++){for(a=r=e[s],n=0;n<i.length;n++)o=i[n],r=r.replace(o,O[o]);o=parseInt(A[a],16),t[r]=[o>>16&255,o>>8&255,255&o]}return t}(),T.transparent=[0,0,0,0]);const e=T[t.toLowerCase()];return e&&{r:e[0],g:e[1],b:e[2],a:4===e.length?e[3]:255}}function R(t,e,i){if(t){let s=k(t);s[e]=Math.max(0,Math.min(s[e]+s[e]*i,0===e?360:1)),s=P(s),t.r=s[0],t.g=s[1],t.b=s[2]}}function E(t,e){return t?Object.assign(e||{},t):t}function I(t){var e={r:0,g:0,b:0,a:255};return Array.isArray(t)?t.length>=3&&(e={r:t[0],g:t[1],b:t[2],a:255},t.length>3&&(e.a=m(t[3]))):(e=E(t,{r:0,g:0,b:0,a:1})).a=m(e.a),e}function z(t){return"r"===t.charAt(0)?function(t){const e=_.exec(t);let i,s,n,o=255;if(e){if(e[7]!==i){const t=+e[7];o=255&(e[8]?p(t):255*t)}return i=+e[1],s=+e[3],n=+e[5],i=255&(e[2]?p(i):i),s=255&(e[4]?p(s):s),n=255&(e[6]?p(n):n),{r:i,g:s,b:n,a:o}}}(t):C(t)}class F{constructor(t){if(t instanceof F)return t;const e=typeof t;let i;var s,n,o;"object"===e?i=I(t):"string"===e&&(o=(s=t).length,"#"===s[0]&&(4===o||5===o?n={r:255&17*r[s[1]],g:255&17*r[s[2]],b:255&17*r[s[3]],a:5===o?17*r[s[4]]:255}:7!==o&&9!==o||(n={r:r[s[1]]<<4|r[s[2]],g:r[s[3]]<<4|r[s[4]],b:r[s[5]]<<4|r[s[6]],a:9===o?r[s[7]]<<4|r[s[8]]:255})),i=n||L(t)||z(t)),this._rgb=i,this._valid=!!i}get valid(){return this._valid}get rgb(){var t=E(this._rgb);return t&&(t.a=x(t.a)),t}set rgb(t){this._rgb=I(t)}rgbString(){return this._valid?(t=this._rgb)&&(t.a<255?`rgba(${t.r}, ${t.g}, ${t.b}, ${x(t.a)})`:`rgb(${t.r}, ${t.g}, ${t.b})`):this._rgb;var t}hexString(){return this._valid?u(this._rgb):this._rgb}hslString(){return this._valid?function(t){if(!t)return;const e=k(t),i=e[0],s=b(e[1]),n=b(e[2]);return t.a<255?`hsla(${i}, ${s}%, ${n}%, ${x(t.a)})`:`hsl(${i}, ${s}%, ${n}%)`}(this._rgb):this._rgb}mix(t,e){const i=this;if(t){const s=i.rgb,n=t.rgb;let o;const a=e===o?.5:e,r=2*a-1,l=s.a-n.a,h=((r*l==-1?r:(r+l)/(1+r*l))+1)/2;o=1-h,s.r=255&h*s.r+o*n.r+.5,s.g=255&h*s.g+o*n.g+.5,s.b=255&h*s.b+o*n.b+.5,s.a=a*s.a+(1-a)*n.a,i.rgb=s}return i}clone(){return new F(this.rgb)}alpha(t){return this._rgb.a=m(t),this}clearer(t){return this._rgb.a*=1-t,this}greyscale(){const t=this._rgb,e=f(.3*t.r+.59*t.g+.11*t.b);return t.r=t.g=t.b=e,this}opaquer(t){return this._rgb.a*=1+t,this}negate(){const t=this._rgb;return t.r=255-t.r,t.g=255-t.g,t.b=255-t.b,this}lighten(t){return R(this._rgb,2,t),this}darken(t){return R(this._rgb,2,-t),this}saturate(t){return R(this._rgb,1,t),this}desaturate(t){return R(this._rgb,1,-t),this}rotate(t){return function(t,e){var i=k(t);i[0]=D(i[0]+e),i=P(i),t.r=i[0],t.g=i[1],t.b=i[2]}(this._rgb,t),this}}function B(t){return new F(t)}const V=t=>t instanceof CanvasGradient||t instanceof CanvasPattern;function W(t){return V(t)?t:B(t)}function N(t){return V(t)?t:B(t).saturate(.5).darken(.1).hexString()}function H(){}const j=function(){let t=0;return function(){return t++}}();function $(t){return null==t}function Y(t){if(Array.isArray&&Array.isArray(t))return!0;const e=Object.prototype.toString.call(t);return"[object"===e.substr(0,7)&&"Array]"===e.substr(-6)}function U(t){return null!==t&&"[object Object]"===Object.prototype.toString.call(t)}const X=t=>("number"==typeof t||t instanceof Number)&&isFinite(+t);function q(t,e){return X(t)?t:e}function K(t,e){return void 0===t?e:t}const G=(t,e)=>"string"==typeof t&&t.endsWith("%")?parseFloat(t)/100:t/e,Z=(t,e)=>"string"==typeof t&&t.endsWith("%")?parseFloat(t)/100*e:+t;function J(t,e,i){if(t&&"function"==typeof t.call)return t.apply(i,e)}function Q(t,e,i,s){let n,o,a;if(Y(t))if(o=t.length,s)for(n=o-1;n>=0;n--)e.call(i,t[n],n);else for(n=0;n<o;n++)e.call(i,t[n],n);else if(U(t))for(a=Object.keys(t),o=a.length,n=0;n<o;n++)e.call(i,t[a[n]],a[n])}function tt(t,e){let i,s,n,o;if(!t||!e||t.length!==e.length)return!1;for(i=0,s=t.length;i<s;++i)if(n=t[i],o=e[i],n.datasetIndex!==o.datasetIndex||n.index!==o.index)return!1;return!0}function et(t){if(Y(t))return t.map(et);if(U(t)){const e=Object.create(null),i=Object.keys(t),s=i.length;let n=0;for(;n<s;++n)e[i[n]]=et(t[i[n]]);return e}return t}function it(t){return-1===["__proto__","prototype","constructor"].indexOf(t)}function st(t,e,i,s){if(!it(t))return;const n=e[t],o=i[t];U(n)&&U(o)?nt(n,o,s):e[t]=et(o)}function nt(t,e,i){const s=Y(e)?e:[e],n=s.length;if(!U(t))return t;const o=(i=i||{}).merger||st;for(let a=0;a<n;++a){if(!U(e=s[a]))continue;const n=Object.keys(e);for(let s=0,a=n.length;s<a;++s)o(n[s],t,e,i)}return t}function ot(t,e){return nt(t,e,{merger:at})}function at(t,e,i){if(!it(t))return;const s=e[t],n=i[t];U(s)&&U(n)?ot(s,n):Object.prototype.hasOwnProperty.call(e,t)||(e[t]=et(n))}function rt(t,e){const i=t.indexOf(".",e);return-1===i?t.length:i}function lt(t,e){if(""===e)return t;let i=0,s=rt(e,i);for(;t&&s>i;)t=t[e.substr(i,s-i)],i=s+1,s=rt(e,i);return t}function ht(t){return t.charAt(0).toUpperCase()+t.slice(1)}const ct=t=>void 0!==t,dt=t=>"function"==typeof t,ut=(t,e)=>{if(t.size!==e.size)return!1;for(const i of t)if(!e.has(i))return!1;return!0};function ft(t){return"mouseup"===t.type||"click"===t.type||"contextmenu"===t.type}const gt=Object.create(null),pt=Object.create(null);function mt(t,e){if(!e)return t;const i=e.split(".");for(let e=0,s=i.length;e<s;++e){const s=i[e];t=t[s]||(t[s]=Object.create(null))}return t}function xt(t,e,i){return"string"==typeof e?nt(mt(t,e),i):nt(mt(t,""),e)}var bt=new class{constructor(t){this.animation=void 0,this.backgroundColor="rgba(0,0,0,0.1)",this.borderColor="rgba(0,0,0,0.1)",this.color="#666",this.datasets={},this.devicePixelRatio=t=>t.chart.platform.getDevicePixelRatio(),this.elements={},this.events=["mousemove","mouseout","click","touchstart","touchmove"],this.font={family:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",size:12,style:"normal",lineHeight:1.2,weight:null},this.hover={},this.hoverBackgroundColor=(t,e)=>N(e.backgroundColor),this.hoverBorderColor=(t,e)=>N(e.borderColor),this.hoverColor=(t,e)=>N(e.color),this.indexAxis="x",this.interaction={mode:"nearest",intersect:!0},this.maintainAspectRatio=!0,this.onHover=null,this.onClick=null,this.parsing=!0,this.plugins={},this.responsive=!0,this.scale=void 0,this.scales={},this.showLine=!0,this.drawActiveElementsOnTop=!0,this.describe(t)}set(t,e){return xt(this,t,e)}get(t){return mt(this,t)}describe(t,e){return xt(pt,t,e)}override(t,e){return xt(gt,t,e)}route(t,e,i,s){const n=mt(this,t),o=mt(this,i),a="_"+e;Object.defineProperties(n,{[a]:{value:n[e],writable:!0},[e]:{enumerable:!0,get(){const t=this[a],e=o[s];return U(t)?Object.assign({},e,t):K(t,e)},set(t){this[a]=t}}})}}({_scriptable:t=>!t.startsWith("on"),_indexable:t=>"events"!==t,hover:{_fallback:"interaction"},interaction:{_scriptable:!1,_indexable:!1}});const _t=Math.PI,yt=2*_t,vt=yt+_t,wt=Number.POSITIVE_INFINITY,Mt=_t/180,kt=_t/2,St=_t/4,Pt=2*_t/3,Dt=Math.log10,Ct=Math.sign;function Ot(t){const e=Math.round(t);t=Lt(t,e,t/1e3)?e:t;const i=Math.pow(10,Math.floor(Dt(t))),s=t/i;return(s<=1?1:s<=2?2:s<=5?5:10)*i}function At(t){const e=[],i=Math.sqrt(t);let s;for(s=1;s<i;s++)t%s==0&&(e.push(s),e.push(t/s));return i===(0|i)&&e.push(i),e.sort(((t,e)=>t-e)).pop(),e}function Tt(t){return!isNaN(parseFloat(t))&&isFinite(t)}function Lt(t,e,i){return Math.abs(t-e)<i}function Rt(t,e){const i=Math.round(t);return i-e<=t&&i+e>=t}function Et(t,e,i){let s,n,o;for(s=0,n=t.length;s<n;s++)o=t[s][i],isNaN(o)||(e.min=Math.min(e.min,o),e.max=Math.max(e.max,o))}function It(t){return t*(_t/180)}function zt(t){return t*(180/_t)}function Ft(t){if(!X(t))return;let e=1,i=0;for(;Math.round(t*e)/e!==t;)e*=10,i++;return i}function Bt(t,e){const i=e.x-t.x,s=e.y-t.y,n=Math.sqrt(i*i+s*s);let o=Math.atan2(s,i);return o<-.5*_t&&(o+=yt),{angle:o,distance:n}}function Vt(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))}function Wt(t,e){return(t-e+vt)%yt-_t}function Nt(t){return(t%yt+yt)%yt}function Ht(t,e,i,s){const n=Nt(t),o=Nt(e),a=Nt(i),r=Nt(o-n),l=Nt(a-n),h=Nt(n-o),c=Nt(n-a);return n===o||n===a||s&&o===a||r>l&&h<c}function jt(t,e,i){return Math.max(e,Math.min(i,t))}function $t(t){return jt(t,-32768,32767)}function Yt(t,e,i,s=1e-6){return t>=Math.min(e,i)-s&&t<=Math.max(e,i)+s}function Ut(t){return!t||$(t.size)||$(t.family)?null:(t.style?t.style+" ":"")+(t.weight?t.weight+" ":"")+t.size+"px "+t.family}function Xt(t,e,i,s,n){let o=e[n];return o||(o=e[n]=t.measureText(n).width,i.push(n)),o>s&&(s=o),s}function qt(t,e,i,s){let n=(s=s||{}).data=s.data||{},o=s.garbageCollect=s.garbageCollect||[];s.font!==e&&(n=s.data={},o=s.garbageCollect=[],s.font=e),t.save(),t.font=e;let a=0;const r=i.length;let l,h,c,d,u;for(l=0;l<r;l++)if(d=i[l],null!=d&&!0!==Y(d))a=Xt(t,n,o,a,d);else if(Y(d))for(h=0,c=d.length;h<c;h++)u=d[h],null==u||Y(u)||(a=Xt(t,n,o,a,u));t.restore();const f=o.length/2;if(f>i.length){for(l=0;l<f;l++)delete n[o[l]];o.splice(0,f)}return a}function Kt(t,e,i){const s=t.currentDevicePixelRatio,n=0!==i?Math.max(i/2,.5):0;return Math.round((e-n)*s)/s+n}function Gt(t,e){(e=e||t.getContext("2d")).save(),e.resetTransform(),e.clearRect(0,0,t.width,t.height),e.restore()}function Zt(t,e,i,s){let n,o,a,r,l;const h=e.pointStyle,c=e.rotation,d=e.radius;let u=(c||0)*Mt;if(h&&"object"==typeof h&&(n=h.toString(),"[object HTMLImageElement]"===n||"[object HTMLCanvasElement]"===n))return t.save(),t.translate(i,s),t.rotate(u),t.drawImage(h,-h.width/2,-h.height/2,h.width,h.height),void t.restore();if(!(isNaN(d)||d<=0)){switch(t.beginPath(),h){default:t.arc(i,s,d,0,yt),t.closePath();break;case"triangle":t.moveTo(i+Math.sin(u)*d,s-Math.cos(u)*d),u+=Pt,t.lineTo(i+Math.sin(u)*d,s-Math.cos(u)*d),u+=Pt,t.lineTo(i+Math.sin(u)*d,s-Math.cos(u)*d),t.closePath();break;case"rectRounded":l=.516*d,r=d-l,o=Math.cos(u+St)*r,a=Math.sin(u+St)*r,t.arc(i-o,s-a,l,u-_t,u-kt),t.arc(i+a,s-o,l,u-kt,u),t.arc(i+o,s+a,l,u,u+kt),t.arc(i-a,s+o,l,u+kt,u+_t),t.closePath();break;case"rect":if(!c){r=Math.SQRT1_2*d,t.rect(i-r,s-r,2*r,2*r);break}u+=St;case"rectRot":o=Math.cos(u)*d,a=Math.sin(u)*d,t.moveTo(i-o,s-a),t.lineTo(i+a,s-o),t.lineTo(i+o,s+a),t.lineTo(i-a,s+o),t.closePath();break;case"crossRot":u+=St;case"cross":o=Math.cos(u)*d,a=Math.sin(u)*d,t.moveTo(i-o,s-a),t.lineTo(i+o,s+a),t.moveTo(i+a,s-o),t.lineTo(i-a,s+o);break;case"star":o=Math.cos(u)*d,a=Math.sin(u)*d,t.moveTo(i-o,s-a),t.lineTo(i+o,s+a),t.moveTo(i+a,s-o),t.lineTo(i-a,s+o),u+=St,o=Math.cos(u)*d,a=Math.sin(u)*d,t.moveTo(i-o,s-a),t.lineTo(i+o,s+a),t.moveTo(i+a,s-o),t.lineTo(i-a,s+o);break;case"line":o=Math.cos(u)*d,a=Math.sin(u)*d,t.moveTo(i-o,s-a),t.lineTo(i+o,s+a);break;case"dash":t.moveTo(i,s),t.lineTo(i+Math.cos(u)*d,s+Math.sin(u)*d)}t.fill(),e.borderWidth>0&&t.stroke()}}function Jt(t,e,i){return i=i||.5,!e||t&&t.x>e.left-i&&t.x<e.right+i&&t.y>e.top-i&&t.y<e.bottom+i}function Qt(t,e){t.save(),t.beginPath(),t.rect(e.left,e.top,e.right-e.left,e.bottom-e.top),t.clip()}function te(t){t.restore()}function ee(t,e,i,s,n){if(!e)return t.lineTo(i.x,i.y);if("middle"===n){const s=(e.x+i.x)/2;t.lineTo(s,e.y),t.lineTo(s,i.y)}else"after"===n!=!!s?t.lineTo(e.x,i.y):t.lineTo(i.x,e.y);t.lineTo(i.x,i.y)}function ie(t,e,i,s){if(!e)return t.lineTo(i.x,i.y);t.bezierCurveTo(s?e.cp1x:e.cp2x,s?e.cp1y:e.cp2y,s?i.cp2x:i.cp1x,s?i.cp2y:i.cp1y,i.x,i.y)}function se(t,e,i,s,n,o={}){const a=Y(e)?e:[e],r=o.strokeWidth>0&&""!==o.strokeColor;let l,h;for(t.save(),t.font=n.string,function(t,e){e.translation&&t.translate(e.translation[0],e.translation[1]);$(e.rotation)||t.rotate(e.rotation);e.color&&(t.fillStyle=e.color);e.textAlign&&(t.textAlign=e.textAlign);e.textBaseline&&(t.textBaseline=e.textBaseline)}(t,o),l=0;l<a.length;++l)h=a[l],r&&(o.strokeColor&&(t.strokeStyle=o.strokeColor),$(o.strokeWidth)||(t.lineWidth=o.strokeWidth),t.strokeText(h,i,s,o.maxWidth)),t.fillText(h,i,s,o.maxWidth),ne(t,i,s,h,o),s+=n.lineHeight;t.restore()}function ne(t,e,i,s,n){if(n.strikethrough||n.underline){const o=t.measureText(s),a=e-o.actualBoundingBoxLeft,r=e+o.actualBoundingBoxRight,l=i-o.actualBoundingBoxAscent,h=i+o.actualBoundingBoxDescent,c=n.strikethrough?(l+h)/2:h;t.strokeStyle=t.fillStyle,t.beginPath(),t.lineWidth=n.decorationWidth||2,t.moveTo(a,c),t.lineTo(r,c),t.stroke()}}function oe(t,e){const{x:i,y:s,w:n,h:o,radius:a}=e;t.arc(i+a.topLeft,s+a.topLeft,a.topLeft,-kt,_t,!0),t.lineTo(i,s+o-a.bottomLeft),t.arc(i+a.bottomLeft,s+o-a.bottomLeft,a.bottomLeft,_t,kt,!0),t.lineTo(i+n-a.bottomRight,s+o),t.arc(i+n-a.bottomRight,s+o-a.bottomRight,a.bottomRight,kt,0,!0),t.lineTo(i+n,s+a.topRight),t.arc(i+n-a.topRight,s+a.topRight,a.topRight,0,-kt,!0),t.lineTo(i+a.topLeft,s)}function ae(t,e,i){i=i||(i=>t[i]<e);let s,n=t.length-1,o=0;for(;n-o>1;)s=o+n>>1,i(s)?o=s:n=s;return{lo:o,hi:n}}const re=(t,e,i)=>ae(t,i,(s=>t[s][e]<i)),le=(t,e,i)=>ae(t,i,(s=>t[s][e]>=i));function he(t,e,i){let s=0,n=t.length;for(;s<n&&t[s]<e;)s++;for(;n>s&&t[n-1]>i;)n--;return s>0||n<t.length?t.slice(s,n):t}const ce=["push","pop","shift","splice","unshift"];function de(t,e){t._chartjs?t._chartjs.listeners.push(e):(Object.defineProperty(t,"_chartjs",{configurable:!0,enumerable:!1,value:{listeners:[e]}}),ce.forEach((e=>{const i="_onData"+ht(e),s=t[e];Object.defineProperty(t,e,{configurable:!0,enumerable:!1,value(...e){const n=s.apply(this,e);return t._chartjs.listeners.forEach((t=>{"function"==typeof t[i]&&t[i](...e)})),n}})})))}function ue(t,e){const i=t._chartjs;if(!i)return;const s=i.listeners,n=s.indexOf(e);-1!==n&&s.splice(n,1),s.length>0||(ce.forEach((e=>{delete t[e]})),delete t._chartjs)}function fe(t){const e=new Set;let i,s;for(i=0,s=t.length;i<s;++i)e.add(t[i]);return e.size===s?t:Array.from(e)}function ge(){return"undefined"!=typeof window&&"undefined"!=typeof document}function pe(t){let e=t.parentNode;return e&&"[object ShadowRoot]"===e.toString()&&(e=e.host),e}function me(t,e,i){let s;return"string"==typeof t?(s=parseInt(t,10),-1!==t.indexOf("%")&&(s=s/100*e.parentNode[i])):s=t,s}const xe=t=>window.getComputedStyle(t,null);function be(t,e){return xe(t).getPropertyValue(e)}const _e=["top","right","bottom","left"];function ye(t,e,i){const s={};i=i?"-"+i:"";for(let n=0;n<4;n++){const o=_e[n];s[o]=parseFloat(t[e+"-"+o+i])||0}return s.width=s.left+s.right,s.height=s.top+s.bottom,s}function ve(t,e){const{canvas:i,currentDevicePixelRatio:s}=e,n=xe(i),o="border-box"===n.boxSizing,a=ye(n,"padding"),r=ye(n,"border","width"),{x:l,y:h,box:c}=function(t,e){const i=t.native||t,s=i.touches,n=s&&s.length?s[0]:i,{offsetX:o,offsetY:a}=n;let r,l,h=!1;if(((t,e,i)=>(t>0||e>0)&&(!i||!i.shadowRoot))(o,a,i.target))r=o,l=a;else{const t=e.getBoundingClientRect();r=n.clientX-t.left,l=n.clientY-t.top,h=!0}return{x:r,y:l,box:h}}(t,i),d=a.left+(c&&r.left),u=a.top+(c&&r.top);let{width:f,height:g}=e;return o&&(f-=a.width+r.width,g-=a.height+r.height),{x:Math.round((l-d)/f*i.width/s),y:Math.round((h-u)/g*i.height/s)}}const we=t=>Math.round(10*t)/10;function Me(t,e,i,s){const n=xe(t),o=ye(n,"margin"),a=me(n.maxWidth,t,"clientWidth")||wt,r=me(n.maxHeight,t,"clientHeight")||wt,l=function(t,e,i){let s,n;if(void 0===e||void 0===i){const o=pe(t);if(o){const t=o.getBoundingClientRect(),a=xe(o),r=ye(a,"border","width"),l=ye(a,"padding");e=t.width-l.width-r.width,i=t.height-l.height-r.height,s=me(a.maxWidth,o,"clientWidth"),n=me(a.maxHeight,o,"clientHeight")}else e=t.clientWidth,i=t.clientHeight}return{width:e,height:i,maxWidth:s||wt,maxHeight:n||wt}}(t,e,i);let{width:h,height:c}=l;if("content-box"===n.boxSizing){const t=ye(n,"border","width"),e=ye(n,"padding");h-=e.width+t.width,c-=e.height+t.height}return h=Math.max(0,h-o.width),c=Math.max(0,s?Math.floor(h/s):c-o.height),h=we(Math.min(h,a,l.maxWidth)),c=we(Math.min(c,r,l.maxHeight)),h&&!c&&(c=we(h/2)),{width:h,height:c}}function ke(t,e,i){const s=e||1,n=Math.floor(t.height*s),o=Math.floor(t.width*s);t.height=n/s,t.width=o/s;const a=t.canvas;return a.style&&(i||!a.style.height&&!a.style.width)&&(a.style.height=`${t.height}px`,a.style.width=`${t.width}px`),(t.currentDevicePixelRatio!==s||a.height!==n||a.width!==o)&&(t.currentDevicePixelRatio=s,a.height=n,a.width=o,t.ctx.setTransform(s,0,0,s,0,0),!0)}const Se=function(){let t=!1;try{const e={get passive(){return t=!0,!1}};window.addEventListener("test",null,e),window.removeEventListener("test",null,e)}catch(t){}return t}();function Pe(t,e){const i=be(t,e),s=i&&i.match(/^(\d+)(\.\d+)?px$/);return s?+s[1]:void 0}function De(t,e){return"native"in t?{x:t.x,y:t.y}:ve(t,e)}function Ce(t,e,i,s){const{controller:n,data:o,_sorted:a}=t,r=n._cachedMeta.iScale;if(r&&e===r.axis&&"r"!==e&&a&&o.length){const t=r._reversePixels?le:re;if(!s)return t(o,e,i);if(n._sharedOptions){const s=o[0],n="function"==typeof s.getRange&&s.getRange(e);if(n){const s=t(o,e,i-n),a=t(o,e,i+n);return{lo:s.lo,hi:a.hi}}}}return{lo:0,hi:o.length-1}}function Oe(t,e,i,s,n){const o=t.getSortedVisibleDatasetMetas(),a=i[e];for(let t=0,i=o.length;t<i;++t){const{index:i,data:r}=o[t],{lo:l,hi:h}=Ce(o[t],e,a,n);for(let t=l;t<=h;++t){const e=r[t];e.skip||s(e,i,t)}}}function Ae(t,e,i,s){const n=[];if(!Jt(e,t.chartArea,t._minPadding))return n;return Oe(t,i,e,(function(t,i,o){t.inRange(e.x,e.y,s)&&n.push({element:t,datasetIndex:i,index:o})}),!0),n}function Te(t,e,i,s,n){let o=[];const a=function(t){const e=-1!==t.indexOf("x"),i=-1!==t.indexOf("y");return function(t,s){const n=e?Math.abs(t.x-s.x):0,o=i?Math.abs(t.y-s.y):0;return Math.sqrt(Math.pow(n,2)+Math.pow(o,2))}}(i);let r=Number.POSITIVE_INFINITY;return Oe(t,i,e,(function(i,l,h){const c=i.inRange(e.x,e.y,n);if(s&&!c)return;const d=i.getCenterPoint(n);if(!Jt(d,t.chartArea,t._minPadding)&&!c)return;const u=a(e,d);u<r?(o=[{element:i,datasetIndex:l,index:h}],r=u):u===r&&o.push({element:i,datasetIndex:l,index:h})})),o}function Le(t,e,i,s,n){return Jt(e,t.chartArea,t._minPadding)?"r"!==i||s?Te(t,e,i,s,n):function(t,e,i,s){let n=[];return Oe(t,i,e,(function(t,i,o){const{startAngle:a,endAngle:r}=t.getProps(["startAngle","endAngle"],s),{angle:l}=Bt(t,{x:e.x,y:e.y});Ht(l,a,r)&&n.push({element:t,datasetIndex:i,index:o})})),n}(t,e,i,n):[]}function Re(t,e,i,s){const n=De(e,t),o=[],a=i.axis,r="x"===a?"inXRange":"inYRange";let l=!1;return function(t,e){const i=t.getSortedVisibleDatasetMetas();let s,n,o;for(let t=0,a=i.length;t<a;++t){({index:s,data:n}=i[t]);for(let t=0,i=n.length;t<i;++t)o=n[t],o.skip||e(o,s,t)}}(t,((t,e,i)=>{t[r](n[a],s)&&o.push({element:t,datasetIndex:e,index:i}),t.inRange(n.x,n.y,s)&&(l=!0)})),i.intersect&&!l?[]:o}var Ee={modes:{index(t,e,i,s){const n=De(e,t),o=i.axis||"x",a=i.intersect?Ae(t,n,o,s):Le(t,n,o,!1,s),r=[];return a.length?(t.getSortedVisibleDatasetMetas().forEach((t=>{const e=a[0].index,i=t.data[e];i&&!i.skip&&r.push({element:i,datasetIndex:t.index,index:e})})),r):[]},dataset(t,e,i,s){const n=De(e,t),o=i.axis||"xy";let a=i.intersect?Ae(t,n,o,s):Le(t,n,o,!1,s);if(a.length>0){const e=a[0].datasetIndex,i=t.getDatasetMeta(e).data;a=[];for(let t=0;t<i.length;++t)a.push({element:i[t],datasetIndex:e,index:t})}return a},point:(t,e,i,s)=>Ae(t,De(e,t),i.axis||"xy",s),nearest:(t,e,i,s)=>Le(t,De(e,t),i.axis||"xy",i.intersect,s),x:(t,e,i,s)=>Re(t,e,{axis:"x",intersect:i.intersect},s),y:(t,e,i,s)=>Re(t,e,{axis:"y",intersect:i.intersect},s)}};const Ie=new RegExp(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/),ze=new RegExp(/^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/);function Fe(t,e){const i=(""+t).match(Ie);if(!i||"normal"===i[1])return 1.2*e;switch(t=+i[2],i[3]){case"px":return t;case"%":t/=100}return e*t}function Be(t,e){const i={},s=U(e),n=s?Object.keys(e):e,o=U(t)?s?i=>K(t[i],t[e[i]]):e=>t[e]:()=>t;for(const t of n)i[t]=+o(t)||0;return i}function Ve(t){return Be(t,{top:"y",right:"x",bottom:"y",left:"x"})}function We(t){return Be(t,["topLeft","topRight","bottomLeft","bottomRight"])}function Ne(t){const e=Ve(t);return e.width=e.left+e.right,e.height=e.top+e.bottom,e}function He(t,e){t=t||{},e=e||bt.font;let i=K(t.size,e.size);"string"==typeof i&&(i=parseInt(i,10));let s=K(t.style,e.style);s&&!(""+s).match(ze)&&(console.warn('Invalid font style specified: "'+s+'"'),s="");const n={family:K(t.family,e.family),lineHeight:Fe(K(t.lineHeight,e.lineHeight),i),size:i,style:s,weight:K(t.weight,e.weight),string:""};return n.string=Ut(n),n}function je(t,e,i,s){let n,o,a,r=!0;for(n=0,o=t.length;n<o;++n)if(a=t[n],void 0!==a&&(void 0!==e&&"function"==typeof a&&(a=a(e),r=!1),void 0!==i&&Y(a)&&(a=a[i%a.length],r=!1),void 0!==a))return s&&!r&&(s.cacheable=!1),a}function $e(t,e,i){const{min:s,max:n}=t,o=Z(e,(n-s)/2),a=(t,e)=>i&&0===t?0:t+e;return{min:a(s,-Math.abs(o)),max:a(n,o)}}function Ye(t,e){return Object.assign(Object.create(t),e)}const Ue=["left","top","right","bottom"];function Xe(t,e){return t.filter((t=>t.pos===e))}function qe(t,e){return t.filter((t=>-1===Ue.indexOf(t.pos)&&t.box.axis===e))}function Ke(t,e){return t.sort(((t,i)=>{const s=e?i:t,n=e?t:i;return s.weight===n.weight?s.index-n.index:s.weight-n.weight}))}function Ge(t,e){const i=function(t){const e={};for(const i of t){const{stack:t,pos:s,stackWeight:n}=i;if(!t||!Ue.includes(s))continue;const o=e[t]||(e[t]={count:0,placed:0,weight:0,size:0});o.count++,o.weight+=n}return e}(t),{vBoxMaxWidth:s,hBoxMaxHeight:n}=e;let o,a,r;for(o=0,a=t.length;o<a;++o){r=t[o];const{fullSize:a}=r.box,l=i[r.stack],h=l&&r.stackWeight/l.weight;r.horizontal?(r.width=h?h*s:a&&e.availableWidth,r.height=n):(r.width=s,r.height=h?h*n:a&&e.availableHeight)}return i}function Ze(t,e,i,s){return Math.max(t[i],e[i])+Math.max(t[s],e[s])}function Je(t,e){t.top=Math.max(t.top,e.top),t.left=Math.max(t.left,e.left),t.bottom=Math.max(t.bottom,e.bottom),t.right=Math.max(t.right,e.right)}function Qe(t,e,i,s){const{pos:n,box:o}=i,a=t.maxPadding;if(!U(n)){i.size&&(t[n]-=i.size);const e=s[i.stack]||{size:0,count:1};e.size=Math.max(e.size,i.horizontal?o.height:o.width),i.size=e.size/e.count,t[n]+=i.size}o.getPadding&&Je(a,o.getPadding());const r=Math.max(0,e.outerWidth-Ze(a,t,"left","right")),l=Math.max(0,e.outerHeight-Ze(a,t,"top","bottom")),h=r!==t.w,c=l!==t.h;return t.w=r,t.h=l,i.horizontal?{same:h,other:c}:{same:c,other:h}}function ti(t,e){const i=e.maxPadding;function s(t){const s={left:0,top:0,right:0,bottom:0};return t.forEach((t=>{s[t]=Math.max(e[t],i[t])})),s}return s(t?["left","right"]:["top","bottom"])}function ei(t,e,i,s){const n=[];let o,a,r,l,h,c;for(o=0,a=t.length,h=0;o<a;++o){r=t[o],l=r.box,l.update(r.width||e.w,r.height||e.h,ti(r.horizontal,e));const{same:a,other:d}=Qe(e,i,r,s);h|=a&&n.length,c=c||d,l.fullSize||n.push(r)}return h&&ei(n,e,i,s)||c}function ii(t,e,i,s,n){t.top=i,t.left=e,t.right=e+s,t.bottom=i+n,t.width=s,t.height=n}function si(t,e,i,s){const n=i.padding;let{x:o,y:a}=e;for(const r of t){const t=r.box,l=s[r.stack]||{count:1,placed:0,weight:1},h=r.stackWeight/l.weight||1;if(r.horizontal){const s=e.w*h,o=l.size||t.height;ct(l.start)&&(a=l.start),t.fullSize?ii(t,n.left,a,i.outerWidth-n.right-n.left,o):ii(t,e.left+l.placed,a,s,o),l.start=a,l.placed+=s,a=t.bottom}else{const s=e.h*h,a=l.size||t.width;ct(l.start)&&(o=l.start),t.fullSize?ii(t,o,n.top,a,i.outerHeight-n.bottom-n.top):ii(t,o,e.top+l.placed,a,s),l.start=o,l.placed+=s,o=t.right}}e.x=o,e.y=a}bt.set("layout",{autoPadding:!0,padding:{top:0,right:0,bottom:0,left:0}});var ni={addBox(t,e){t.boxes||(t.boxes=[]),e.fullSize=e.fullSize||!1,e.position=e.position||"top",e.weight=e.weight||0,e._layers=e._layers||function(){return[{z:0,draw(t){e.draw(t)}}]},t.boxes.push(e)},removeBox(t,e){const i=t.boxes?t.boxes.indexOf(e):-1;-1!==i&&t.boxes.splice(i,1)},configure(t,e,i){e.fullSize=i.fullSize,e.position=i.position,e.weight=i.weight},update(t,e,i,s){if(!t)return;const n=Ne(t.options.layout.padding),o=Math.max(e-n.width,0),a=Math.max(i-n.height,0),r=function(t){const e=function(t){const e=[];let i,s,n,o,a,r;for(i=0,s=(t||[]).length;i<s;++i)n=t[i],({position:o,options:{stack:a,stackWeight:r=1}}=n),e.push({index:i,box:n,pos:o,horizontal:n.isHorizontal(),weight:n.weight,stack:a&&o+a,stackWeight:r});return e}(t),i=Ke(e.filter((t=>t.box.fullSize)),!0),s=Ke(Xe(e,"left"),!0),n=Ke(Xe(e,"right")),o=Ke(Xe(e,"top"),!0),a=Ke(Xe(e,"bottom")),r=qe(e,"x"),l=qe(e,"y");return{fullSize:i,leftAndTop:s.concat(o),rightAndBottom:n.concat(l).concat(a).concat(r),chartArea:Xe(e,"chartArea"),vertical:s.concat(n).concat(l),horizontal:o.concat(a).concat(r)}}(t.boxes),l=r.vertical,h=r.horizontal;Q(t.boxes,(t=>{"function"==typeof t.beforeLayout&&t.beforeLayout()}));const c=l.reduce(((t,e)=>e.box.options&&!1===e.box.options.display?t:t+1),0)||1,d=Object.freeze({outerWidth:e,outerHeight:i,padding:n,availableWidth:o,availableHeight:a,vBoxMaxWidth:o/2/c,hBoxMaxHeight:a/2}),u=Object.assign({},n);Je(u,Ne(s));const f=Object.assign({maxPadding:u,w:o,h:a,x:n.left,y:n.top},n),g=Ge(l.concat(h),d);ei(r.fullSize,f,d,g),ei(l,f,d,g),ei(h,f,d,g)&&ei(l,f,d,g),function(t){const e=t.maxPadding;function i(i){const s=Math.max(e[i]-t[i],0);return t[i]+=s,s}t.y+=i("top"),t.x+=i("left"),i("right"),i("bottom")}(f),si(r.leftAndTop,f,d,g),f.x+=f.w,f.y+=f.h,si(r.rightAndBottom,f,d,g),t.chartArea={left:f.left,top:f.top,right:f.left+f.w,bottom:f.top+f.h,height:f.h,width:f.w},Q(r.chartArea,(e=>{const i=e.box;Object.assign(i,t.chartArea),i.update(f.w,f.h,{left:0,top:0,right:0,bottom:0})}))}};function oi(t,e=[""],i=t,s,n=(()=>t[0])){ct(s)||(s=mi("_fallback",t));const o={[Symbol.toStringTag]:"Object",_cacheable:!0,_scopes:t,_rootScopes:i,_fallback:s,_getTarget:n,override:n=>oi([n,...t],e,i,s)};return new Proxy(o,{deleteProperty:(e,i)=>(delete e[i],delete e._keys,delete t[0][i],!0),get:(i,s)=>ci(i,s,(()=>function(t,e,i,s){let n;for(const o of e)if(n=mi(li(o,t),i),ct(n))return hi(t,n)?gi(i,s,t,n):n}(s,e,t,i))),getOwnPropertyDescriptor:(t,e)=>Reflect.getOwnPropertyDescriptor(t._scopes[0],e),getPrototypeOf:()=>Reflect.getPrototypeOf(t[0]),has:(t,e)=>xi(t).includes(e),ownKeys:t=>xi(t),set(t,e,i){const s=t._storage||(t._storage=n());return t[e]=s[e]=i,delete t._keys,!0}})}function ai(t,e,i,s){const n={_cacheable:!1,_proxy:t,_context:e,_subProxy:i,_stack:new Set,_descriptors:ri(t,s),setContext:e=>ai(t,e,i,s),override:n=>ai(t.override(n),e,i,s)};return new Proxy(n,{deleteProperty:(e,i)=>(delete e[i],delete t[i],!0),get:(t,e,i)=>ci(t,e,(()=>function(t,e,i){const{_proxy:s,_context:n,_subProxy:o,_descriptors:a}=t;let r=s[e];dt(r)&&a.isScriptable(e)&&(r=function(t,e,i,s){const{_proxy:n,_context:o,_subProxy:a,_stack:r}=i;if(r.has(t))throw new Error("Recursion detected: "+Array.from(r).join("->")+"->"+t);r.add(t),e=e(o,a||s),r.delete(t),hi(t,e)&&(e=gi(n._scopes,n,t,e));return e}(e,r,t,i));Y(r)&&r.length&&(r=function(t,e,i,s){const{_proxy:n,_context:o,_subProxy:a,_descriptors:r}=i;if(ct(o.index)&&s(t))e=e[o.index%e.length];else if(U(e[0])){const i=e,s=n._scopes.filter((t=>t!==i));e=[];for(const l of i){const i=gi(s,n,t,l);e.push(ai(i,o,a&&a[t],r))}}return e}(e,r,t,a.isIndexable));hi(e,r)&&(r=ai(r,n,o&&o[e],a));return r}(t,e,i))),getOwnPropertyDescriptor:(e,i)=>e._descriptors.allKeys?Reflect.has(t,i)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(t,i),getPrototypeOf:()=>Reflect.getPrototypeOf(t),has:(e,i)=>Reflect.has(t,i),ownKeys:()=>Reflect.ownKeys(t),set:(e,i,s)=>(t[i]=s,delete e[i],!0)})}function ri(t,e={scriptable:!0,indexable:!0}){const{_scriptable:i=e.scriptable,_indexable:s=e.indexable,_allKeys:n=e.allKeys}=t;return{allKeys:n,scriptable:i,indexable:s,isScriptable:dt(i)?i:()=>i,isIndexable:dt(s)?s:()=>s}}const li=(t,e)=>t?t+ht(e):e,hi=(t,e)=>U(e)&&"adapters"!==t&&(null===Object.getPrototypeOf(e)||e.constructor===Object);function ci(t,e,i){if(Object.prototype.hasOwnProperty.call(t,e))return t[e];const s=i();return t[e]=s,s}function di(t,e,i){return dt(t)?t(e,i):t}const ui=(t,e)=>!0===t?e:"string"==typeof t?lt(e,t):void 0;function fi(t,e,i,s,n){for(const o of e){const e=ui(i,o);if(e){t.add(e);const o=di(e._fallback,i,n);if(ct(o)&&o!==i&&o!==s)return o}else if(!1===e&&ct(s)&&i!==s)return null}return!1}function gi(t,e,i,s){const n=e._rootScopes,o=di(e._fallback,i,s),a=[...t,...n],r=new Set;r.add(s);let l=pi(r,a,i,o||i,s);return null!==l&&((!ct(o)||o===i||(l=pi(r,a,o,l,s),null!==l))&&oi(Array.from(r),[""],n,o,(()=>function(t,e,i){const s=t._getTarget();e in s||(s[e]={});const n=s[e];if(Y(n)&&U(i))return i;return n}(e,i,s))))}function pi(t,e,i,s,n){for(;i;)i=fi(t,e,i,s,n);return i}function mi(t,e){for(const i of e){if(!i)continue;const e=i[t];if(ct(e))return e}}function xi(t){let e=t._keys;return e||(e=t._keys=function(t){const e=new Set;for(const i of t)for(const t of Object.keys(i).filter((t=>!t.startsWith("_"))))e.add(t);return Array.from(e)}(t._scopes)),e}const bi=Number.EPSILON||1e-14,_i=(t,e)=>e<t.length&&!t[e].skip&&t[e],yi=t=>"x"===t?"y":"x";function vi(t,e,i,s){const n=t.skip?e:t,o=e,a=i.skip?e:i,r=Vt(o,n),l=Vt(a,o);let h=r/(r+l),c=l/(r+l);h=isNaN(h)?0:h,c=isNaN(c)?0:c;const d=s*h,u=s*c;return{previous:{x:o.x-d*(a.x-n.x),y:o.y-d*(a.y-n.y)},next:{x:o.x+u*(a.x-n.x),y:o.y+u*(a.y-n.y)}}}function wi(t,e="x"){const i=yi(e),s=t.length,n=Array(s).fill(0),o=Array(s);let a,r,l,h=_i(t,0);for(a=0;a<s;++a)if(r=l,l=h,h=_i(t,a+1),l){if(h){const t=h[e]-l[e];n[a]=0!==t?(h[i]-l[i])/t:0}o[a]=r?h?Ct(n[a-1])!==Ct(n[a])?0:(n[a-1]+n[a])/2:n[a-1]:n[a]}!function(t,e,i){const s=t.length;let n,o,a,r,l,h=_i(t,0);for(let c=0;c<s-1;++c)l=h,h=_i(t,c+1),l&&h&&(Lt(e[c],0,bi)?i[c]=i[c+1]=0:(n=i[c]/e[c],o=i[c+1]/e[c],r=Math.pow(n,2)+Math.pow(o,2),r<=9||(a=3/Math.sqrt(r),i[c]=n*a*e[c],i[c+1]=o*a*e[c])))}(t,n,o),function(t,e,i="x"){const s=yi(i),n=t.length;let o,a,r,l=_i(t,0);for(let h=0;h<n;++h){if(a=r,r=l,l=_i(t,h+1),!r)continue;const n=r[i],c=r[s];a&&(o=(n-a[i])/3,r[`cp1${i}`]=n-o,r[`cp1${s}`]=c-o*e[h]),l&&(o=(l[i]-n)/3,r[`cp2${i}`]=n+o,r[`cp2${s}`]=c+o*e[h])}}(t,o,e)}function Mi(t,e,i){return Math.max(Math.min(t,i),e)}function ki(t,e,i,s,n){let o,a,r,l;if(e.spanGaps&&(t=t.filter((t=>!t.skip))),"monotone"===e.cubicInterpolationMode)wi(t,n);else{let i=s?t[t.length-1]:t[0];for(o=0,a=t.length;o<a;++o)r=t[o],l=vi(i,r,t[Math.min(o+1,a-(s?0:1))%a],e.tension),r.cp1x=l.previous.x,r.cp1y=l.previous.y,r.cp2x=l.next.x,r.cp2y=l.next.y,i=r}e.capBezierPoints&&function(t,e){let i,s,n,o,a,r=Jt(t[0],e);for(i=0,s=t.length;i<s;++i)a=o,o=r,r=i<s-1&&Jt(t[i+1],e),o&&(n=t[i],a&&(n.cp1x=Mi(n.cp1x,e.left,e.right),n.cp1y=Mi(n.cp1y,e.top,e.bottom)),r&&(n.cp2x=Mi(n.cp2x,e.left,e.right),n.cp2y=Mi(n.cp2y,e.top,e.bottom)))}(t,i)}const Si=t=>0===t||1===t,Pi=(t,e,i)=>-Math.pow(2,10*(t-=1))*Math.sin((t-e)*yt/i),Di=(t,e,i)=>Math.pow(2,-10*t)*Math.sin((t-e)*yt/i)+1,Ci={linear:t=>t,easeInQuad:t=>t*t,easeOutQuad:t=>-t*(t-2),easeInOutQuad:t=>(t/=.5)<1?.5*t*t:-.5*(--t*(t-2)-1),easeInCubic:t=>t*t*t,easeOutCubic:t=>(t-=1)*t*t+1,easeInOutCubic:t=>(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2),easeInQuart:t=>t*t*t*t,easeOutQuart:t=>-((t-=1)*t*t*t-1),easeInOutQuart:t=>(t/=.5)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2),easeInQuint:t=>t*t*t*t*t,easeOutQuint:t=>(t-=1)*t*t*t*t+1,easeInOutQuint:t=>(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2),easeInSine:t=>1-Math.cos(t*kt),easeOutSine:t=>Math.sin(t*kt),easeInOutSine:t=>-.5*(Math.cos(_t*t)-1),easeInExpo:t=>0===t?0:Math.pow(2,10*(t-1)),easeOutExpo:t=>1===t?1:1-Math.pow(2,-10*t),easeInOutExpo:t=>Si(t)?t:t<.5?.5*Math.pow(2,10*(2*t-1)):.5*(2-Math.pow(2,-10*(2*t-1))),easeInCirc:t=>t>=1?t:-(Math.sqrt(1-t*t)-1),easeOutCirc:t=>Math.sqrt(1-(t-=1)*t),easeInOutCirc:t=>(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1),easeInElastic:t=>Si(t)?t:Pi(t,.075,.3),easeOutElastic:t=>Si(t)?t:Di(t,.075,.3),easeInOutElastic(t){const e=.1125;return Si(t)?t:t<.5?.5*Pi(2*t,e,.45):.5+.5*Di(2*t-1,e,.45)},easeInBack(t){const e=1.70158;return t*t*((e+1)*t-e)},easeOutBack(t){const e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack(t){let e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},easeInBounce:t=>1-Ci.easeOutBounce(1-t),easeOutBounce(t){const e=7.5625,i=2.75;return t<1/i?e*t*t:t<2/i?e*(t-=1.5/i)*t+.75:t<2.5/i?e*(t-=2.25/i)*t+.9375:e*(t-=2.625/i)*t+.984375},easeInOutBounce:t=>t<.5?.5*Ci.easeInBounce(2*t):.5*Ci.easeOutBounce(2*t-1)+.5};function Oi(t,e,i,s){return{x:t.x+i*(e.x-t.x),y:t.y+i*(e.y-t.y)}}function Ai(t,e,i,s){return{x:t.x+i*(e.x-t.x),y:"middle"===s?i<.5?t.y:e.y:"after"===s?i<1?t.y:e.y:i>0?e.y:t.y}}function Ti(t,e,i,s){const n={x:t.cp2x,y:t.cp2y},o={x:e.cp1x,y:e.cp1y},a=Oi(t,n,i),r=Oi(n,o,i),l=Oi(o,e,i),h=Oi(a,r,i),c=Oi(r,l,i);return Oi(h,c,i)}const Li=new Map;function Ri(t,e,i){return function(t,e){e=e||{};const i=t+JSON.stringify(e);let s=Li.get(i);return s||(s=new Intl.NumberFormat(t,e),Li.set(i,s)),s}(e,i).format(t)}function Ei(t,e,i){return t?function(t,e){return{x:i=>t+t+e-i,setWidth(t){e=t},textAlign:t=>"center"===t?t:"right"===t?"left":"right",xPlus:(t,e)=>t-e,leftForLtr:(t,e)=>t-e}}(e,i):{x:t=>t,setWidth(t){},textAlign:t=>t,xPlus:(t,e)=>t+e,leftForLtr:(t,e)=>t}}function Ii(t,e){let i,s;"ltr"!==e&&"rtl"!==e||(i=t.canvas.style,s=[i.getPropertyValue("direction"),i.getPropertyPriority("direction")],i.setProperty("direction",e,"important"),t.prevTextDirection=s)}function zi(t,e){void 0!==e&&(delete t.prevTextDirection,t.canvas.style.setProperty("direction",e[0],e[1]))}function Fi(t){return"angle"===t?{between:Ht,compare:Wt,normalize:Nt}:{between:Yt,compare:(t,e)=>t-e,normalize:t=>t}}function Bi({start:t,end:e,count:i,loop:s,style:n}){return{start:t%i,end:e%i,loop:s&&(e-t+1)%i==0,style:n}}function Vi(t,e,i){if(!i)return[t];const{property:s,start:n,end:o}=i,a=e.length,{compare:r,between:l,normalize:h}=Fi(s),{start:c,end:d,loop:u,style:f}=function(t,e,i){const{property:s,start:n,end:o}=i,{between:a,normalize:r}=Fi(s),l=e.length;let h,c,{start:d,end:u,loop:f}=t;if(f){for(d+=l,u+=l,h=0,c=l;h<c&&a(r(e[d%l][s]),n,o);++h)d--,u--;d%=l,u%=l}return u<d&&(u+=l),{start:d,end:u,loop:f,style:t.style}}(t,e,i),g=[];let p,m,x,b=!1,_=null;const y=()=>b||l(n,x,p)&&0!==r(n,x),v=()=>!b||0===r(o,p)||l(o,x,p);for(let t=c,i=c;t<=d;++t)m=e[t%a],m.skip||(p=h(m[s]),p!==x&&(b=l(p,n,o),null===_&&y()&&(_=0===r(p,n)?t:i),null!==_&&v()&&(g.push(Bi({start:_,end:t,loop:u,count:a,style:f})),_=null),i=t,x=p));return null!==_&&g.push(Bi({start:_,end:d,loop:u,count:a,style:f})),g}function Wi(t,e){const i=[],s=t.segments;for(let n=0;n<s.length;n++){const o=Vi(s[n],t.points,e);o.length&&i.push(...o)}return i}function Ni(t,e){const i=t.points,s=t.options.spanGaps,n=i.length;if(!n)return[];const o=!!t._loop,{start:a,end:r}=function(t,e,i,s){let n=0,o=e-1;if(i&&!s)for(;n<e&&!t[n].skip;)n++;for(;n<e&&t[n].skip;)n++;for(n%=e,i&&(o+=n);o>n&&t[o%e].skip;)o--;return o%=e,{start:n,end:o}}(i,n,o,s);if(!0===s)return Hi(t,[{start:a,end:r,loop:o}],i,e);return Hi(t,function(t,e,i,s){const n=t.length,o=[];let a,r=e,l=t[e];for(a=e+1;a<=i;++a){const i=t[a%n];i.skip||i.stop?l.skip||(s=!1,o.push({start:e%n,end:(a-1)%n,loop:s}),e=r=i.stop?a:null):(r=a,l.skip&&(e=a)),l=i}return null!==r&&o.push({start:e%n,end:r%n,loop:s}),o}(i,a,r<a?r+n:r,!!t._fullLoop&&0===a&&r===n-1),i,e)}function Hi(t,e,i,s){return s&&s.setContext&&i?function(t,e,i,s){const n=t._chart.getContext(),o=ji(t.options),{_datasetIndex:a,options:{spanGaps:r}}=t,l=i.length,h=[];let c=o,d=e[0].start,u=d;function f(t,e,s,n){const o=r?-1:1;if(t!==e){for(t+=l;i[t%l].skip;)t-=o;for(;i[e%l].skip;)e+=o;t%l!=e%l&&(h.push({start:t%l,end:e%l,loop:s,style:n}),c=n,d=e%l)}}for(const t of e){d=r?d:t.start;let e,o=i[d%l];for(u=d+1;u<=t.end;u++){const r=i[u%l];e=ji(s.setContext(Ye(n,{type:"segment",p0:o,p1:r,p0DataIndex:(u-1)%l,p1DataIndex:u%l,datasetIndex:a}))),$i(e,c)&&f(d,u-1,t.loop,c),o=r,c=e}d<u-1&&f(d,u-1,t.loop,c)}return h}(t,e,i,s):e}function ji(t){return{backgroundColor:t.backgroundColor,borderCapStyle:t.borderCapStyle,borderDash:t.borderDash,borderDashOffset:t.borderDashOffset,borderJoinStyle:t.borderJoinStyle,borderWidth:t.borderWidth,borderColor:t.borderColor}}function $i(t,e){return e&&JSON.stringify(t)!==JSON.stringify(e)}var Yi=Object.freeze({__proto__:null,easingEffects:Ci,color:W,getHoverColor:N,noop:H,uid:j,isNullOrUndef:$,isArray:Y,isObject:U,isFinite:X,finiteOrDefault:q,valueOrDefault:K,toPercentage:G,toDimension:Z,callback:J,each:Q,_elementsEqual:tt,clone:et,_merger:st,merge:nt,mergeIf:ot,_mergerIf:at,_deprecated:function(t,e,i,s){void 0!==e&&console.warn(t+': "'+i+'" is deprecated. Please use "'+s+'" instead')},resolveObjectKey:lt,_capitalize:ht,defined:ct,isFunction:dt,setsEqual:ut,_isClickEvent:ft,toFontString:Ut,_measureText:Xt,_longestText:qt,_alignPixel:Kt,clearCanvas:Gt,drawPoint:Zt,_isPointInArea:Jt,clipArea:Qt,unclipArea:te,_steppedLineTo:ee,_bezierCurveTo:ie,renderText:se,addRoundedRectPath:oe,_lookup:ae,_lookupByKey:re,_rlookupByKey:le,_filterBetween:he,listenArrayEvents:de,unlistenArrayEvents:ue,_arrayUnique:fe,_createResolver:oi,_attachContext:ai,_descriptors:ri,splineCurve:vi,splineCurveMonotone:wi,_updateBezierControlPoints:ki,_isDomSupported:ge,_getParentNode:pe,getStyle:be,getRelativePosition:ve,getMaximumSize:Me,retinaScale:ke,supportsEventListenerOptions:Se,readUsedSize:Pe,fontString:function(t,e,i){return e+" "+t+"px "+i},requestAnimFrame:t,throttled:e,debounce:i,_toLeftRightCenter:s,_alignStartEnd:n,_textX:o,_pointInLine:Oi,_steppedInterpolation:Ai,_bezierInterpolation:Ti,formatNumber:Ri,toLineHeight:Fe,_readValueToProps:Be,toTRBL:Ve,toTRBLCorners:We,toPadding:Ne,toFont:He,resolve:je,_addGrace:$e,createContext:Ye,PI:_t,TAU:yt,PITAU:vt,INFINITY:wt,RAD_PER_DEG:Mt,HALF_PI:kt,QUARTER_PI:St,TWO_THIRDS_PI:Pt,log10:Dt,sign:Ct,niceNum:Ot,_factorize:At,isNumber:Tt,almostEquals:Lt,almostWhole:Rt,_setMinAndMaxByKey:Et,toRadians:It,toDegrees:zt,_decimalPlaces:Ft,getAngleFromPoint:Bt,distanceBetweenPoints:Vt,_angleDiff:Wt,_normalizeAngle:Nt,_angleBetween:Ht,_limitValue:jt,_int16Range:$t,_isBetween:Yt,getRtlAdapter:Ei,overrideTextDirection:Ii,restoreTextDirection:zi,_boundSegment:Vi,_boundSegments:Wi,_computeSegments:Ni});class Ui{acquireContext(t,e){}releaseContext(t){return!1}addEventListener(t,e,i){}removeEventListener(t,e,i){}getDevicePixelRatio(){return 1}getMaximumSize(t,e,i,s){return e=Math.max(0,e||t.width),i=i||t.height,{width:e,height:Math.max(0,s?Math.floor(e/s):i)}}isAttached(t){return!0}updateConfig(t){}}class Xi extends Ui{acquireContext(t){return t&&t.getContext&&t.getContext("2d")||null}updateConfig(t){t.options.animation=!1}}const qi={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"},Ki=t=>null===t||""===t;const Gi=!!Se&&{passive:!0};function Zi(t,e,i){t.canvas.removeEventListener(e,i,Gi)}function Ji(t,e){for(const i of t)if(i===e||i.contains(e))return!0}function Qi(t,e,i){const s=t.canvas,n=new MutationObserver((t=>{let e=!1;for(const i of t)e=e||Ji(i.addedNodes,s),e=e&&!Ji(i.removedNodes,s);e&&i()}));return n.observe(document,{childList:!0,subtree:!0}),n}function ts(t,e,i){const s=t.canvas,n=new MutationObserver((t=>{let e=!1;for(const i of t)e=e||Ji(i.removedNodes,s),e=e&&!Ji(i.addedNodes,s);e&&i()}));return n.observe(document,{childList:!0,subtree:!0}),n}const es=new Map;let is=0;function ss(){const t=window.devicePixelRatio;t!==is&&(is=t,es.forEach(((e,i)=>{i.currentDevicePixelRatio!==t&&e()})))}function ns(t,i,s){const n=t.canvas,o=n&&pe(n);if(!o)return;const a=e(((t,e)=>{const i=o.clientWidth;s(t,e),i<o.clientWidth&&s()}),window),r=new ResizeObserver((t=>{const e=t[0],i=e.contentRect.width,s=e.contentRect.height;0===i&&0===s||a(i,s)}));return r.observe(o),function(t,e){es.size||window.addEventListener("resize",ss),es.set(t,e)}(t,a),r}function os(t,e,i){i&&i.disconnect(),"resize"===e&&function(t){es.delete(t),es.size||window.removeEventListener("resize",ss)}(t)}function as(t,i,s){const n=t.canvas,o=e((e=>{null!==t.ctx&&s(function(t,e){const i=qi[t.type]||t.type,{x:s,y:n}=ve(t,e);return{type:i,chart:e,native:t,x:void 0!==s?s:null,y:void 0!==n?n:null}}(e,t))}),t,(t=>{const e=t[0];return[e,e.offsetX,e.offsetY]}));return function(t,e,i){t.addEventListener(e,i,Gi)}(n,i,o),o}class rs extends Ui{acquireContext(t,e){const i=t&&t.getContext&&t.getContext("2d");return i&&i.canvas===t?(function(t,e){const i=t.style,s=t.getAttribute("height"),n=t.getAttribute("width");if(t.$chartjs={initial:{height:s,width:n,style:{display:i.display,height:i.height,width:i.width}}},i.display=i.display||"block",i.boxSizing=i.boxSizing||"border-box",Ki(n)){const e=Pe(t,"width");void 0!==e&&(t.width=e)}if(Ki(s))if(""===t.style.height)t.height=t.width/(e||2);else{const e=Pe(t,"height");void 0!==e&&(t.height=e)}}(t,e),i):null}releaseContext(t){const e=t.canvas;if(!e.$chartjs)return!1;const i=e.$chartjs.initial;["height","width"].forEach((t=>{const s=i[t];$(s)?e.removeAttribute(t):e.setAttribute(t,s)}));const s=i.style||{};return Object.keys(s).forEach((t=>{e.style[t]=s[t]})),e.width=e.width,delete e.$chartjs,!0}addEventListener(t,e,i){this.removeEventListener(t,e);const s=t.$proxies||(t.$proxies={}),n={attach:Qi,detach:ts,resize:ns}[e]||as;s[e]=n(t,e,i)}removeEventListener(t,e){const i=t.$proxies||(t.$proxies={}),s=i[e];if(!s)return;({attach:os,detach:os,resize:os}[e]||Zi)(t,e,s),i[e]=void 0}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(t,e,i,s){return Me(t,e,i,s)}isAttached(t){const e=pe(t);return!(!e||!e.isConnected)}}function ls(t){return!ge()||"undefined"!=typeof OffscreenCanvas&&t instanceof OffscreenCanvas?Xi:rs}var hs=Object.freeze({__proto__:null,_detectPlatform:ls,BasePlatform:Ui,BasicPlatform:Xi,DomPlatform:rs});const cs="transparent",ds={boolean:(t,e,i)=>i>.5?e:t,color(t,e,i){const s=W(t||cs),n=s.valid&&W(e||cs);return n&&n.valid?n.mix(s,i).hexString():e},number:(t,e,i)=>t+(e-t)*i};class us{constructor(t,e,i,s){const n=e[i];s=je([t.to,s,n,t.from]);const o=je([t.from,n,s]);this._active=!0,this._fn=t.fn||ds[t.type||typeof o],this._easing=Ci[t.easing]||Ci.linear,this._start=Math.floor(Date.now()+(t.delay||0)),this._duration=this._total=Math.floor(t.duration),this._loop=!!t.loop,this._target=e,this._prop=i,this._from=o,this._to=s,this._promises=void 0}active(){return this._active}update(t,e,i){if(this._active){this._notify(!1);const s=this._target[this._prop],n=i-this._start,o=this._duration-n;this._start=i,this._duration=Math.floor(Math.max(o,t.duration)),this._total+=n,this._loop=!!t.loop,this._to=je([t.to,e,s,t.from]),this._from=je([t.from,s,e])}}cancel(){this._active&&(this.tick(Date.now()),this._active=!1,this._notify(!1))}tick(t){const e=t-this._start,i=this._duration,s=this._prop,n=this._from,o=this._loop,a=this._to;let r;if(this._active=n!==a&&(o||e<i),!this._active)return this._target[s]=a,void this._notify(!0);e<0?this._target[s]=n:(r=e/i%2,r=o&&r>1?2-r:r,r=this._easing(Math.min(1,Math.max(0,r))),this._target[s]=this._fn(n,a,r))}wait(){const t=this._promises||(this._promises=[]);return new Promise(((e,i)=>{t.push({res:e,rej:i})}))}_notify(t){const e=t?"res":"rej",i=this._promises||[];for(let t=0;t<i.length;t++)i[t][e]()}}bt.set("animation",{delay:void 0,duration:1e3,easing:"easeOutQuart",fn:void 0,from:void 0,loop:void 0,to:void 0,type:void 0});const fs=Object.keys(bt.animation);bt.describe("animation",{_fallback:!1,_indexable:!1,_scriptable:t=>"onProgress"!==t&&"onComplete"!==t&&"fn"!==t}),bt.set("animations",{colors:{type:"color",properties:["color","borderColor","backgroundColor"]},numbers:{type:"number",properties:["x","y","borderWidth","radius","tension"]}}),bt.describe("animations",{_fallback:"animation"}),bt.set("transitions",{active:{animation:{duration:400}},resize:{animation:{duration:0}},show:{animations:{colors:{from:"transparent"},visible:{type:"boolean",duration:0}}},hide:{animations:{colors:{to:"transparent"},visible:{type:"boolean",easing:"linear",fn:t=>0|t}}}});class gs{constructor(t,e){this._chart=t,this._properties=new Map,this.configure(e)}configure(t){if(!U(t))return;const e=this._properties;Object.getOwnPropertyNames(t).forEach((i=>{const s=t[i];if(!U(s))return;const n={};for(const t of fs)n[t]=s[t];(Y(s.properties)&&s.properties||[i]).forEach((t=>{t!==i&&e.has(t)||e.set(t,n)}))}))}_animateOptions(t,e){const i=e.options,s=function(t,e){if(!e)return;let i=t.options;if(!i)return void(t.options=e);i.$shared&&(t.options=i=Object.assign({},i,{$shared:!1,$animations:{}}));return i}(t,i);if(!s)return[];const n=this._createAnimations(s,i);return i.$shared&&function(t,e){const i=[],s=Object.keys(e);for(let e=0;e<s.length;e++){const n=t[s[e]];n&&n.active()&&i.push(n.wait())}return Promise.all(i)}(t.options.$animations,i).then((()=>{t.options=i}),(()=>{})),n}_createAnimations(t,e){const i=this._properties,s=[],n=t.$animations||(t.$animations={}),o=Object.keys(e),a=Date.now();let r;for(r=o.length-1;r>=0;--r){const l=o[r];if("$"===l.charAt(0))continue;if("options"===l){s.push(...this._animateOptions(t,e));continue}const h=e[l];let c=n[l];const d=i.get(l);if(c){if(d&&c.active()){c.update(d,h,a);continue}c.cancel()}d&&d.duration?(n[l]=c=new us(d,t,l,h),s.push(c)):t[l]=h}return s}update(t,e){if(0===this._properties.size)return void Object.assign(t,e);const i=this._createAnimations(t,e);return i.length?(a.add(this._chart,i),!0):void 0}}function ps(t,e){const i=t&&t.options||{},s=i.reverse,n=void 0===i.min?e:0,o=void 0===i.max?e:0;return{start:s?o:n,end:s?n:o}}function ms(t,e){const i=[],s=t._getSortedDatasetMetas(e);let n,o;for(n=0,o=s.length;n<o;++n)i.push(s[n].index);return i}function xs(t,e,i,s={}){const n=t.keys,o="single"===s.mode;let a,r,l,h;if(null!==e){for(a=0,r=n.length;a<r;++a){if(l=+n[a],l===i){if(s.all)continue;break}h=t.values[l],X(h)&&(o||0===e||Ct(e)===Ct(h))&&(e+=h)}return e}}function bs(t,e){const i=t&&t.options.stacked;return i||void 0===i&&void 0!==e.stack}function _s(t,e,i){const s=t[e]||(t[e]={});return s[i]||(s[i]={})}function ys(t,e,i,s){for(const n of e.getMatchingVisibleMetas(s).reverse()){const e=t[n.index];if(i&&e>0||!i&&e<0)return n.index}return null}function vs(t,e){const{chart:i,_cachedMeta:s}=t,n=i._stacks||(i._stacks={}),{iScale:o,vScale:a,index:r}=s,l=o.axis,h=a.axis,c=function(t,e,i){return`${t.id}.${e.id}.${i.stack||i.type}`}(o,a,s),d=e.length;let u;for(let t=0;t<d;++t){const i=e[t],{[l]:o,[h]:d}=i;u=(i._stacks||(i._stacks={}))[h]=_s(n,c,o),u[r]=d,u._top=ys(u,a,!0,s.type),u._bottom=ys(u,a,!1,s.type)}}function ws(t,e){const i=t.scales;return Object.keys(i).filter((t=>i[t].axis===e)).shift()}function Ms(t,e){const i=t.controller.index,s=t.vScale&&t.vScale.axis;if(s){e=e||t._parsed;for(const t of e){const e=t._stacks;if(!e||void 0===e[s]||void 0===e[s][i])return;delete e[s][i]}}}const ks=t=>"reset"===t||"none"===t,Ss=(t,e)=>e?t:Object.assign({},t);class Ps{constructor(t,e){this.chart=t,this._ctx=t.ctx,this.index=e,this._cachedDataOpts={},this._cachedMeta=this.getMeta(),this._type=this._cachedMeta.type,this.options=void 0,this._parsing=!1,this._data=void 0,this._objectData=void 0,this._sharedOptions=void 0,this._drawStart=void 0,this._drawCount=void 0,this.enableOptionSharing=!1,this.$context=void 0,this._syncList=[],this.initialize()}initialize(){const t=this._cachedMeta;this.configure(),this.linkScales(),t._stacked=bs(t.vScale,t),this.addElements()}updateIndex(t){this.index!==t&&Ms(this._cachedMeta),this.index=t}linkScales(){const t=this.chart,e=this._cachedMeta,i=this.getDataset(),s=(t,e,i,s)=>"x"===t?e:"r"===t?s:i,n=e.xAxisID=K(i.xAxisID,ws(t,"x")),o=e.yAxisID=K(i.yAxisID,ws(t,"y")),a=e.rAxisID=K(i.rAxisID,ws(t,"r")),r=e.indexAxis,l=e.iAxisID=s(r,n,o,a),h=e.vAxisID=s(r,o,n,a);e.xScale=this.getScaleForId(n),e.yScale=this.getScaleForId(o),e.rScale=this.getScaleForId(a),e.iScale=this.getScaleForId(l),e.vScale=this.getScaleForId(h)}getDataset(){return this.chart.data.datasets[this.index]}getMeta(){return this.chart.getDatasetMeta(this.index)}getScaleForId(t){return this.chart.scales[t]}_getOtherScale(t){const e=this._cachedMeta;return t===e.iScale?e.vScale:e.iScale}reset(){this._update("reset")}_destroy(){const t=this._cachedMeta;this._data&&ue(this._data,this),t._stacked&&Ms(t)}_dataCheck(){const t=this.getDataset(),e=t.data||(t.data=[]),i=this._data;if(U(e))this._data=function(t){const e=Object.keys(t),i=new Array(e.length);let s,n,o;for(s=0,n=e.length;s<n;++s)o=e[s],i[s]={x:o,y:t[o]};return i}(e);else if(i!==e){if(i){ue(i,this);const t=this._cachedMeta;Ms(t),t._parsed=[]}e&&Object.isExtensible(e)&&de(e,this),this._syncList=[],this._data=e}}addElements(){const t=this._cachedMeta;this._dataCheck(),this.datasetElementType&&(t.dataset=new this.datasetElementType)}buildOrUpdateElements(t){const e=this._cachedMeta,i=this.getDataset();let s=!1;this._dataCheck();const n=e._stacked;e._stacked=bs(e.vScale,e),e.stack!==i.stack&&(s=!0,Ms(e),e.stack=i.stack),this._resyncElements(t),(s||n!==e._stacked)&&vs(this,e._parsed)}configure(){const t=this.chart.config,e=t.datasetScopeKeys(this._type),i=t.getOptionScopes(this.getDataset(),e,!0);this.options=t.createResolver(i,this.getContext()),this._parsing=this.options.parsing,this._cachedDataOpts={}}parse(t,e){const{_cachedMeta:i,_data:s}=this,{iScale:n,_stacked:o}=i,a=n.axis;let r,l,h,c=0===t&&e===s.length||i._sorted,d=t>0&&i._parsed[t-1];if(!1===this._parsing)i._parsed=s,i._sorted=!0,h=s;else{h=Y(s[t])?this.parseArrayData(i,s,t,e):U(s[t])?this.parseObjectData(i,s,t,e):this.parsePrimitiveData(i,s,t,e);const n=()=>null===l[a]||d&&l[a]<d[a];for(r=0;r<e;++r)i._parsed[r+t]=l=h[r],c&&(n()&&(c=!1),d=l);i._sorted=c}o&&vs(this,h)}parsePrimitiveData(t,e,i,s){const{iScale:n,vScale:o}=t,a=n.axis,r=o.axis,l=n.getLabels(),h=n===o,c=new Array(s);let d,u,f;for(d=0,u=s;d<u;++d)f=d+i,c[d]={[a]:h||n.parse(l[f],f),[r]:o.parse(e[f],f)};return c}parseArrayData(t,e,i,s){const{xScale:n,yScale:o}=t,a=new Array(s);let r,l,h,c;for(r=0,l=s;r<l;++r)h=r+i,c=e[h],a[r]={x:n.parse(c[0],h),y:o.parse(c[1],h)};return a}parseObjectData(t,e,i,s){const{xScale:n,yScale:o}=t,{xAxisKey:a="x",yAxisKey:r="y"}=this._parsing,l=new Array(s);let h,c,d,u;for(h=0,c=s;h<c;++h)d=h+i,u=e[d],l[h]={x:n.parse(lt(u,a),d),y:o.parse(lt(u,r),d)};return l}getParsed(t){return this._cachedMeta._parsed[t]}getDataElement(t){return this._cachedMeta.data[t]}applyStack(t,e,i){const s=this.chart,n=this._cachedMeta,o=e[t.axis];return xs({keys:ms(s,!0),values:e._stacks[t.axis]},o,n.index,{mode:i})}updateRangeFromParsed(t,e,i,s){const n=i[e.axis];let o=null===n?NaN:n;const a=s&&i._stacks[e.axis];s&&a&&(s.values=a,o=xs(s,n,this._cachedMeta.index)),t.min=Math.min(t.min,o),t.max=Math.max(t.max,o)}getMinMax(t,e){const i=this._cachedMeta,s=i._parsed,n=i._sorted&&t===i.iScale,o=s.length,a=this._getOtherScale(t),r=((t,e,i)=>t&&!e.hidden&&e._stacked&&{keys:ms(i,!0),values:null})(e,i,this.chart),l={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY},{min:h,max:c}=function(t){const{min:e,max:i,minDefined:s,maxDefined:n}=t.getUserBounds();return{min:s?e:Number.NEGATIVE_INFINITY,max:n?i:Number.POSITIVE_INFINITY}}(a);let d,u;function f(){u=s[d];const e=u[a.axis];return!X(u[t.axis])||h>e||c<e}for(d=0;d<o&&(f()||(this.updateRangeFromParsed(l,t,u,r),!n));++d);if(n)for(d=o-1;d>=0;--d)if(!f()){this.updateRangeFromParsed(l,t,u,r);break}return l}getAllParsedValues(t){const e=this._cachedMeta._parsed,i=[];let s,n,o;for(s=0,n=e.length;s<n;++s)o=e[s][t.axis],X(o)&&i.push(o);return i}getMaxOverflow(){return!1}getLabelAndValue(t){const e=this._cachedMeta,i=e.iScale,s=e.vScale,n=this.getParsed(t);return{label:i?""+i.getLabelForValue(n[i.axis]):"",value:s?""+s.getLabelForValue(n[s.axis]):""}}_update(t){const e=this._cachedMeta;this.update(t||"default"),e._clip=function(t){let e,i,s,n;return U(t)?(e=t.top,i=t.right,s=t.bottom,n=t.left):e=i=s=n=t,{top:e,right:i,bottom:s,left:n,disabled:!1===t}}(K(this.options.clip,function(t,e,i){if(!1===i)return!1;const s=ps(t,i),n=ps(e,i);return{top:n.end,right:s.end,bottom:n.start,left:s.start}}(e.xScale,e.yScale,this.getMaxOverflow())))}update(t){}draw(){const t=this._ctx,e=this.chart,i=this._cachedMeta,s=i.data||[],n=e.chartArea,o=[],a=this._drawStart||0,r=this._drawCount||s.length-a,l=this.options.drawActiveElementsOnTop;let h;for(i.dataset&&i.dataset.draw(t,n,a,r),h=a;h<a+r;++h){const e=s[h];e.hidden||(e.active&&l?o.push(e):e.draw(t,n))}for(h=0;h<o.length;++h)o[h].draw(t,n)}getStyle(t,e){const i=e?"active":"default";return void 0===t&&this._cachedMeta.dataset?this.resolveDatasetElementOptions(i):this.resolveDataElementOptions(t||0,i)}getContext(t,e,i){const s=this.getDataset();let n;if(t>=0&&t<this._cachedMeta.data.length){const e=this._cachedMeta.data[t];n=e.$context||(e.$context=function(t,e,i){return Ye(t,{active:!1,dataIndex:e,parsed:void 0,raw:void 0,element:i,index:e,mode:"default",type:"data"})}(this.getContext(),t,e)),n.parsed=this.getParsed(t),n.raw=s.data[t],n.index=n.dataIndex=t}else n=this.$context||(this.$context=function(t,e){return Ye(t,{active:!1,dataset:void 0,datasetIndex:e,index:e,mode:"default",type:"dataset"})}(this.chart.getContext(),this.index)),n.dataset=s,n.index=n.datasetIndex=this.index;return n.active=!!e,n.mode=i,n}resolveDatasetElementOptions(t){return this._resolveElementOptions(this.datasetElementType.id,t)}resolveDataElementOptions(t,e){return this._resolveElementOptions(this.dataElementType.id,e,t)}_resolveElementOptions(t,e="default",i){const s="active"===e,n=this._cachedDataOpts,o=t+"-"+e,a=n[o],r=this.enableOptionSharing&&ct(i);if(a)return Ss(a,r);const l=this.chart.config,h=l.datasetElementScopeKeys(this._type,t),c=s?[`${t}Hover`,"hover",t,""]:[t,""],d=l.getOptionScopes(this.getDataset(),h),u=Object.keys(bt.elements[t]),f=l.resolveNamedOptions(d,u,(()=>this.getContext(i,s)),c);return f.$shared&&(f.$shared=r,n[o]=Object.freeze(Ss(f,r))),f}_resolveAnimations(t,e,i){const s=this.chart,n=this._cachedDataOpts,o=`animation-${e}`,a=n[o];if(a)return a;let r;if(!1!==s.options.animation){const s=this.chart.config,n=s.datasetAnimationScopeKeys(this._type,e),o=s.getOptionScopes(this.getDataset(),n);r=s.createResolver(o,this.getContext(t,i,e))}const l=new gs(s,r&&r.animations);return r&&r._cacheable&&(n[o]=Object.freeze(l)),l}getSharedOptions(t){if(t.$shared)return this._sharedOptions||(this._sharedOptions=Object.assign({},t))}includeOptions(t,e){return!e||ks(t)||this.chart._animationsDisabled}updateElement(t,e,i,s){ks(s)?Object.assign(t,i):this._resolveAnimations(e,s).update(t,i)}updateSharedOptions(t,e,i){t&&!ks(e)&&this._resolveAnimations(void 0,e).update(t,i)}_setStyle(t,e,i,s){t.active=s;const n=this.getStyle(e,s);this._resolveAnimations(e,i,s).update(t,{options:!s&&this.getSharedOptions(n)||n})}removeHoverStyle(t,e,i){this._setStyle(t,i,"active",!1)}setHoverStyle(t,e,i){this._setStyle(t,i,"active",!0)}_removeDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!1)}_setDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!0)}_resyncElements(t){const e=this._data,i=this._cachedMeta.data;for(const[t,e,i]of this._syncList)this[t](e,i);this._syncList=[];const s=i.length,n=e.length,o=Math.min(n,s);o&&this.parse(0,o),n>s?this._insertElements(s,n-s,t):n<s&&this._removeElements(n,s-n)}_insertElements(t,e,i=!0){const s=this._cachedMeta,n=s.data,o=t+e;let a;const r=t=>{for(t.length+=e,a=t.length-1;a>=o;a--)t[a]=t[a-e]};for(r(n),a=t;a<o;++a)n[a]=new this.dataElementType;this._parsing&&r(s._parsed),this.parse(t,e),i&&this.updateElements(n,t,e,"reset")}updateElements(t,e,i,s){}_removeElements(t,e){const i=this._cachedMeta;if(this._parsing){const s=i._parsed.splice(t,e);i._stacked&&Ms(i,s)}i.data.splice(t,e)}_sync(t){if(this._parsing)this._syncList.push(t);else{const[e,i,s]=t;this[e](i,s)}this.chart._dataChanges.push([this.index,...t])}_onDataPush(){const t=arguments.length;this._sync(["_insertElements",this.getDataset().data.length-t,t])}_onDataPop(){this._sync(["_removeElements",this._cachedMeta.data.length-1,1])}_onDataShift(){this._sync(["_removeElements",0,1])}_onDataSplice(t,e){e&&this._sync(["_removeElements",t,e]);const i=arguments.length-2;i&&this._sync(["_insertElements",t,i])}_onDataUnshift(){this._sync(["_insertElements",0,arguments.length])}}Ps.defaults={},Ps.prototype.datasetElementType=null,Ps.prototype.dataElementType=null;class Ds{constructor(){this.x=void 0,this.y=void 0,this.active=!1,this.options=void 0,this.$animations=void 0}tooltipPosition(t){const{x:e,y:i}=this.getProps(["x","y"],t);return{x:e,y:i}}hasValue(){return Tt(this.x)&&Tt(this.y)}getProps(t,e){const i=this.$animations;if(!e||!i)return this;const s={};return t.forEach((t=>{s[t]=i[t]&&i[t].active()?i[t]._to:this[t]})),s}}Ds.defaults={},Ds.defaultRoutes=void 0;const Cs={values:t=>Y(t)?t:""+t,numeric(t,e,i){if(0===t)return"0";const s=this.chart.options.locale;let n,o=t;if(i.length>1){const e=Math.max(Math.abs(i[0].value),Math.abs(i[i.length-1].value));(e<1e-4||e>1e15)&&(n="scientific"),o=function(t,e){let i=e.length>3?e[2].value-e[1].value:e[1].value-e[0].value;Math.abs(i)>=1&&t!==Math.floor(t)&&(i=t-Math.floor(t));return i}(t,i)}const a=Dt(Math.abs(o)),r=Math.max(Math.min(-1*Math.floor(a),20),0),l={notation:n,minimumFractionDigits:r,maximumFractionDigits:r};return Object.assign(l,this.options.ticks.format),Ri(t,s,l)},logarithmic(t,e,i){if(0===t)return"0";const s=t/Math.pow(10,Math.floor(Dt(t)));return 1===s||2===s||5===s?Cs.numeric.call(this,t,e,i):""}};var Os={formatters:Cs};function As(t,e){const i=t.options.ticks,s=i.maxTicksLimit||function(t){const e=t.options.offset,i=t._tickSize(),s=t._length/i+(e?0:1),n=t._maxLength/i;return Math.floor(Math.min(s,n))}(t),n=i.major.enabled?function(t){const e=[];let i,s;for(i=0,s=t.length;i<s;i++)t[i].major&&e.push(i);return e}(e):[],o=n.length,a=n[0],r=n[o-1],l=[];if(o>s)return function(t,e,i,s){let n,o=0,a=i[0];for(s=Math.ceil(s),n=0;n<t.length;n++)n===a&&(e.push(t[n]),o++,a=i[o*s])}(e,l,n,o/s),l;const h=function(t,e,i){const s=function(t){const e=t.length;let i,s;if(e<2)return!1;for(s=t[0],i=1;i<e;++i)if(t[i]-t[i-1]!==s)return!1;return s}(t),n=e.length/i;if(!s)return Math.max(n,1);const o=At(s);for(let t=0,e=o.length-1;t<e;t++){const e=o[t];if(e>n)return e}return Math.max(n,1)}(n,e,s);if(o>0){let t,i;const s=o>1?Math.round((r-a)/(o-1)):null;for(Ts(e,l,h,$(s)?0:a-s,a),t=0,i=o-1;t<i;t++)Ts(e,l,h,n[t],n[t+1]);return Ts(e,l,h,r,$(s)?e.length:r+s),l}return Ts(e,l,h),l}function Ts(t,e,i,s,n){const o=K(s,0),a=Math.min(K(n,t.length),t.length);let r,l,h,c=0;for(i=Math.ceil(i),n&&(r=n-s,i=r/Math.floor(r/i)),h=o;h<0;)c++,h=Math.round(o+c*i);for(l=Math.max(o,0);l<a;l++)l===h&&(e.push(t[l]),c++,h=Math.round(o+c*i))}bt.set("scale",{display:!0,offset:!1,reverse:!1,beginAtZero:!1,bounds:"ticks",grace:0,grid:{display:!0,lineWidth:1,drawBorder:!0,drawOnChartArea:!0,drawTicks:!0,tickLength:8,tickWidth:(t,e)=>e.lineWidth,tickColor:(t,e)=>e.color,offset:!1,borderDash:[],borderDashOffset:0,borderWidth:1},title:{display:!1,text:"",padding:{top:4,bottom:4}},ticks:{minRotation:0,maxRotation:50,mirror:!1,textStrokeWidth:0,textStrokeColor:"",padding:3,display:!0,autoSkip:!0,autoSkipPadding:3,labelOffset:0,callback:Os.formatters.values,minor:{},major:{},align:"center",crossAlign:"near",showLabelBackdrop:!1,backdropColor:"rgba(255, 255, 255, 0.75)",backdropPadding:2}}),bt.route("scale.ticks","color","","color"),bt.route("scale.grid","color","","borderColor"),bt.route("scale.grid","borderColor","","borderColor"),bt.route("scale.title","color","","color"),bt.describe("scale",{_fallback:!1,_scriptable:t=>!t.startsWith("before")&&!t.startsWith("after")&&"callback"!==t&&"parser"!==t,_indexable:t=>"borderDash"!==t&&"tickBorderDash"!==t}),bt.describe("scales",{_fallback:"scale"}),bt.describe("scale.ticks",{_scriptable:t=>"backdropPadding"!==t&&"callback"!==t,_indexable:t=>"backdropPadding"!==t});const Ls=(t,e,i)=>"top"===e||"left"===e?t[e]+i:t[e]-i;function Rs(t,e){const i=[],s=t.length/e,n=t.length;let o=0;for(;o<n;o+=s)i.push(t[Math.floor(o)]);return i}function Es(t,e,i){const s=t.ticks.length,n=Math.min(e,s-1),o=t._startPixel,a=t._endPixel,r=1e-6;let l,h=t.getPixelForTick(n);if(!(i&&(l=1===s?Math.max(h-o,a-h):0===e?(t.getPixelForTick(1)-h)/2:(h-t.getPixelForTick(n-1))/2,h+=n<e?l:-l,h<o-r||h>a+r)))return h}function Is(t){return t.drawTicks?t.tickLength:0}function zs(t,e){if(!t.display)return 0;const i=He(t.font,e),s=Ne(t.padding);return(Y(t.text)?t.text.length:1)*i.lineHeight+s.height}function Fs(t,e,i){let n=s(t);return(i&&"right"!==e||!i&&"right"===e)&&(n=(t=>"left"===t?"right":"right"===t?"left":t)(n)),n}class Bs extends Ds{constructor(t){super(),this.id=t.id,this.type=t.type,this.options=void 0,this.ctx=t.ctx,this.chart=t.chart,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this._margins={left:0,right:0,top:0,bottom:0},this.maxWidth=void 0,this.maxHeight=void 0,this.paddingTop=void 0,this.paddingBottom=void 0,this.paddingLeft=void 0,this.paddingRight=void 0,this.axis=void 0,this.labelRotation=void 0,this.min=void 0,this.max=void 0,this._range=void 0,this.ticks=[],this._gridLineItems=null,this._labelItems=null,this._labelSizes=null,this._length=0,this._maxLength=0,this._longestTextCache={},this._startPixel=void 0,this._endPixel=void 0,this._reversePixels=!1,this._userMax=void 0,this._userMin=void 0,this._suggestedMax=void 0,this._suggestedMin=void 0,this._ticksLength=0,this._borderValue=0,this._cache={},this._dataLimitsCached=!1,this.$context=void 0}init(t){this.options=t.setContext(this.getContext()),this.axis=t.axis,this._userMin=this.parse(t.min),this._userMax=this.parse(t.max),this._suggestedMin=this.parse(t.suggestedMin),this._suggestedMax=this.parse(t.suggestedMax)}parse(t,e){return t}getUserBounds(){let{_userMin:t,_userMax:e,_suggestedMin:i,_suggestedMax:s}=this;return t=q(t,Number.POSITIVE_INFINITY),e=q(e,Number.NEGATIVE_INFINITY),i=q(i,Number.POSITIVE_INFINITY),s=q(s,Number.NEGATIVE_INFINITY),{min:q(t,i),max:q(e,s),minDefined:X(t),maxDefined:X(e)}}getMinMax(t){let e,{min:i,max:s,minDefined:n,maxDefined:o}=this.getUserBounds();if(n&&o)return{min:i,max:s};const a=this.getMatchingVisibleMetas();for(let r=0,l=a.length;r<l;++r)e=a[r].controller.getMinMax(this,t),n||(i=Math.min(i,e.min)),o||(s=Math.max(s,e.max));return i=o&&i>s?s:i,s=n&&i>s?i:s,{min:q(i,q(s,i)),max:q(s,q(i,s))}}getPadding(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}}getTicks(){return this.ticks}getLabels(){const t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels||[]}beforeLayout(){this._cache={},this._dataLimitsCached=!1}beforeUpdate(){J(this.options.beforeUpdate,[this])}update(t,e,i){const{beginAtZero:s,grace:n,ticks:o}=this.options,a=o.sampleSize;this.beforeUpdate(),this.maxWidth=t,this.maxHeight=e,this._margins=i=Object.assign({left:0,right:0,top:0,bottom:0},i),this.ticks=null,this._labelSizes=null,this._gridLineItems=null,this._labelItems=null,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this._maxLength=this.isHorizontal()?this.width+i.left+i.right:this.height+i.top+i.bottom,this._dataLimitsCached||(this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this._range=$e(this,n,s),this._dataLimitsCached=!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();const r=a<this.ticks.length;this._convertTicksToLabels(r?Rs(this.ticks,a):this.ticks),this.configure(),this.beforeCalculateLabelRotation(),this.calculateLabelRotation(),this.afterCalculateLabelRotation(),o.display&&(o.autoSkip||"auto"===o.source)&&(this.ticks=As(this,this.ticks),this._labelSizes=null),r&&this._convertTicksToLabels(this.ticks),this.beforeFit(),this.fit(),this.afterFit(),this.afterUpdate()}configure(){let t,e,i=this.options.reverse;this.isHorizontal()?(t=this.left,e=this.right):(t=this.top,e=this.bottom,i=!i),this._startPixel=t,this._endPixel=e,this._reversePixels=i,this._length=e-t,this._alignToPixels=this.options.alignToPixels}afterUpdate(){J(this.options.afterUpdate,[this])}beforeSetDimensions(){J(this.options.beforeSetDimensions,[this])}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=0,this.right=this.width):(this.height=this.maxHeight,this.top=0,this.bottom=this.height),this.paddingLeft=0,this.paddingTop=0,this.paddingRight=0,this.paddingBottom=0}afterSetDimensions(){J(this.options.afterSetDimensions,[this])}_callHooks(t){this.chart.notifyPlugins(t,this.getContext()),J(this.options[t],[this])}beforeDataLimits(){this._callHooks("beforeDataLimits")}determineDataLimits(){}afterDataLimits(){this._callHooks("afterDataLimits")}beforeBuildTicks(){this._callHooks("beforeBuildTicks")}buildTicks(){return[]}afterBuildTicks(){this._callHooks("afterBuildTicks")}beforeTickToLabelConversion(){J(this.options.beforeTickToLabelConversion,[this])}generateTickLabels(t){const e=this.options.ticks;let i,s,n;for(i=0,s=t.length;i<s;i++)n=t[i],n.label=J(e.callback,[n.value,i,t],this)}afterTickToLabelConversion(){J(this.options.afterTickToLabelConversion,[this])}beforeCalculateLabelRotation(){J(this.options.beforeCalculateLabelRotation,[this])}calculateLabelRotation(){const t=this.options,e=t.ticks,i=this.ticks.length,s=e.minRotation||0,n=e.maxRotation;let o,a,r,l=s;if(!this._isVisible()||!e.display||s>=n||i<=1||!this.isHorizontal())return void(this.labelRotation=s);const h=this._getLabelSizes(),c=h.widest.width,d=h.highest.height,u=jt(this.chart.width-c,0,this.maxWidth);o=t.offset?this.maxWidth/i:u/(i-1),c+6>o&&(o=u/(i-(t.offset?.5:1)),a=this.maxHeight-Is(t.grid)-e.padding-zs(t.title,this.chart.options.font),r=Math.sqrt(c*c+d*d),l=zt(Math.min(Math.asin(jt((h.highest.height+6)/o,-1,1)),Math.asin(jt(a/r,-1,1))-Math.asin(jt(d/r,-1,1)))),l=Math.max(s,Math.min(n,l))),this.labelRotation=l}afterCalculateLabelRotation(){J(this.options.afterCalculateLabelRotation,[this])}beforeFit(){J(this.options.beforeFit,[this])}fit(){const t={width:0,height:0},{chart:e,options:{ticks:i,title:s,grid:n}}=this,o=this._isVisible(),a=this.isHorizontal();if(o){const o=zs(s,e.options.font);if(a?(t.width=this.maxWidth,t.height=Is(n)+o):(t.height=this.maxHeight,t.width=Is(n)+o),i.display&&this.ticks.length){const{first:e,last:s,widest:n,highest:o}=this._getLabelSizes(),r=2*i.padding,l=It(this.labelRotation),h=Math.cos(l),c=Math.sin(l);if(a){const e=i.mirror?0:c*n.width+h*o.height;t.height=Math.min(this.maxHeight,t.height+e+r)}else{const e=i.mirror?0:h*n.width+c*o.height;t.width=Math.min(this.maxWidth,t.width+e+r)}this._calculatePadding(e,s,c,h)}}this._handleMargins(),a?(this.width=this._length=e.width-this._margins.left-this._margins.right,this.height=t.height):(this.width=t.width,this.height=this._length=e.height-this._margins.top-this._margins.bottom)}_calculatePadding(t,e,i,s){const{ticks:{align:n,padding:o},position:a}=this.options,r=0!==this.labelRotation,l="top"!==a&&"x"===this.axis;if(this.isHorizontal()){const a=this.getPixelForTick(0)-this.left,h=this.right-this.getPixelForTick(this.ticks.length-1);let c=0,d=0;r?l?(c=s*t.width,d=i*e.height):(c=i*t.height,d=s*e.width):"start"===n?d=e.width:"end"===n?c=t.width:(c=t.width/2,d=e.width/2),this.paddingLeft=Math.max((c-a+o)*this.width/(this.width-a),0),this.paddingRight=Math.max((d-h+o)*this.width/(this.width-h),0)}else{let i=e.height/2,s=t.height/2;"start"===n?(i=0,s=t.height):"end"===n&&(i=e.height,s=0),this.paddingTop=i+o,this.paddingBottom=s+o}}_handleMargins(){this._margins&&(this._margins.left=Math.max(this.paddingLeft,this._margins.left),this._margins.top=Math.max(this.paddingTop,this._margins.top),this._margins.right=Math.max(this.paddingRight,this._margins.right),this._margins.bottom=Math.max(this.paddingBottom,this._margins.bottom))}afterFit(){J(this.options.afterFit,[this])}isHorizontal(){const{axis:t,position:e}=this.options;return"top"===e||"bottom"===e||"x"===t}isFullSize(){return this.options.fullSize}_convertTicksToLabels(t){let e,i;for(this.beforeTickToLabelConversion(),this.generateTickLabels(t),e=0,i=t.length;e<i;e++)$(t[e].label)&&(t.splice(e,1),i--,e--);this.afterTickToLabelConversion()}_getLabelSizes(){let t=this._labelSizes;if(!t){const e=this.options.ticks.sampleSize;let i=this.ticks;e<i.length&&(i=Rs(i,e)),this._labelSizes=t=this._computeLabelSizes(i,i.length)}return t}_computeLabelSizes(t,e){const{ctx:i,_longestTextCache:s}=this,n=[],o=[];let a,r,l,h,c,d,u,f,g,p,m,x=0,b=0;for(a=0;a<e;++a){if(h=t[a].label,c=this._resolveTickFontOptions(a),i.font=d=c.string,u=s[d]=s[d]||{data:{},gc:[]},f=c.lineHeight,g=p=0,$(h)||Y(h)){if(Y(h))for(r=0,l=h.length;r<l;++r)m=h[r],$(m)||Y(m)||(g=Xt(i,u.data,u.gc,g,m),p+=f)}else g=Xt(i,u.data,u.gc,g,h),p=f;n.push(g),o.push(p),x=Math.max(g,x),b=Math.max(p,b)}!function(t,e){Q(t,(t=>{const i=t.gc,s=i.length/2;let n;if(s>e){for(n=0;n<s;++n)delete t.data[i[n]];i.splice(0,s)}}))}(s,e);const _=n.indexOf(x),y=o.indexOf(b),v=t=>({width:n[t]||0,height:o[t]||0});return{first:v(0),last:v(e-1),widest:v(_),highest:v(y),widths:n,heights:o}}getLabelForValue(t){return t}getPixelForValue(t,e){return NaN}getValueForPixel(t){}getPixelForTick(t){const e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t].value)}getPixelForDecimal(t){this._reversePixels&&(t=1-t);const e=this._startPixel+t*this._length;return $t(this._alignToPixels?Kt(this.chart,e,0):e)}getDecimalForPixel(t){const e=(t-this._startPixel)/this._length;return this._reversePixels?1-e:e}getBasePixel(){return this.getPixelForValue(this.getBaseValue())}getBaseValue(){const{min:t,max:e}=this;return t<0&&e<0?e:t>0&&e>0?t:0}getContext(t){const e=this.ticks||[];if(t>=0&&t<e.length){const i=e[t];return i.$context||(i.$context=function(t,e,i){return Ye(t,{tick:i,index:e,type:"tick"})}(this.getContext(),t,i))}return this.$context||(this.$context=Ye(this.chart.getContext(),{scale:this,type:"scale"}))}_tickSize(){const t=this.options.ticks,e=It(this.labelRotation),i=Math.abs(Math.cos(e)),s=Math.abs(Math.sin(e)),n=this._getLabelSizes(),o=t.autoSkipPadding||0,a=n?n.widest.width+o:0,r=n?n.highest.height+o:0;return this.isHorizontal()?r*i>a*s?a/i:r/s:r*s<a*i?r/i:a/s}_isVisible(){const t=this.options.display;return"auto"!==t?!!t:this.getMatchingVisibleMetas().length>0}_computeGridLineItems(t){const e=this.axis,i=this.chart,s=this.options,{grid:n,position:o}=s,a=n.offset,r=this.isHorizontal(),l=this.ticks.length+(a?1:0),h=Is(n),c=[],d=n.setContext(this.getContext()),u=d.drawBorder?d.borderWidth:0,f=u/2,g=function(t){return Kt(i,t,u)};let p,m,x,b,_,y,v,w,M,k,S,P;if("top"===o)p=g(this.bottom),y=this.bottom-h,w=p-f,k=g(t.top)+f,P=t.bottom;else if("bottom"===o)p=g(this.top),k=t.top,P=g(t.bottom)-f,y=p+f,w=this.top+h;else if("left"===o)p=g(this.right),_=this.right-h,v=p-f,M=g(t.left)+f,S=t.right;else if("right"===o)p=g(this.left),M=t.left,S=g(t.right)-f,_=p+f,v=this.left+h;else if("x"===e){if("center"===o)p=g((t.top+t.bottom)/2+.5);else if(U(o)){const t=Object.keys(o)[0],e=o[t];p=g(this.chart.scales[t].getPixelForValue(e))}k=t.top,P=t.bottom,y=p+f,w=y+h}else if("y"===e){if("center"===o)p=g((t.left+t.right)/2);else if(U(o)){const t=Object.keys(o)[0],e=o[t];p=g(this.chart.scales[t].getPixelForValue(e))}_=p-f,v=_-h,M=t.left,S=t.right}const D=K(s.ticks.maxTicksLimit,l),C=Math.max(1,Math.ceil(l/D));for(m=0;m<l;m+=C){const t=n.setContext(this.getContext(m)),e=t.lineWidth,s=t.color,o=n.borderDash||[],l=t.borderDashOffset,h=t.tickWidth,d=t.tickColor,u=t.tickBorderDash||[],f=t.tickBorderDashOffset;x=Es(this,m,a),void 0!==x&&(b=Kt(i,x,e),r?_=v=M=S=b:y=w=k=P=b,c.push({tx1:_,ty1:y,tx2:v,ty2:w,x1:M,y1:k,x2:S,y2:P,width:e,color:s,borderDash:o,borderDashOffset:l,tickWidth:h,tickColor:d,tickBorderDash:u,tickBorderDashOffset:f}))}return this._ticksLength=l,this._borderValue=p,c}_computeLabelItems(t){const e=this.axis,i=this.options,{position:s,ticks:n}=i,o=this.isHorizontal(),a=this.ticks,{align:r,crossAlign:l,padding:h,mirror:c}=n,d=Is(i.grid),u=d+h,f=c?-h:u,g=-It(this.labelRotation),p=[];let m,x,b,_,y,v,w,M,k,S,P,D,C="middle";if("top"===s)v=this.bottom-f,w=this._getXAxisLabelAlignment();else if("bottom"===s)v=this.top+f,w=this._getXAxisLabelAlignment();else if("left"===s){const t=this._getYAxisLabelAlignment(d);w=t.textAlign,y=t.x}else if("right"===s){const t=this._getYAxisLabelAlignment(d);w=t.textAlign,y=t.x}else if("x"===e){if("center"===s)v=(t.top+t.bottom)/2+u;else if(U(s)){const t=Object.keys(s)[0],e=s[t];v=this.chart.scales[t].getPixelForValue(e)+u}w=this._getXAxisLabelAlignment()}else if("y"===e){if("center"===s)y=(t.left+t.right)/2-u;else if(U(s)){const t=Object.keys(s)[0],e=s[t];y=this.chart.scales[t].getPixelForValue(e)}w=this._getYAxisLabelAlignment(d).textAlign}"y"===e&&("start"===r?C="top":"end"===r&&(C="bottom"));const O=this._getLabelSizes();for(m=0,x=a.length;m<x;++m){b=a[m],_=b.label;const t=n.setContext(this.getContext(m));M=this.getPixelForTick(m)+n.labelOffset,k=this._resolveTickFontOptions(m),S=k.lineHeight,P=Y(_)?_.length:1;const e=P/2,i=t.color,r=t.textStrokeColor,h=t.textStrokeWidth;let d;if(o?(y=M,D="top"===s?"near"===l||0!==g?-P*S+S/2:"center"===l?-O.highest.height/2-e*S+S:-O.highest.height+S/2:"near"===l||0!==g?S/2:"center"===l?O.highest.height/2-e*S:O.highest.height-P*S,c&&(D*=-1)):(v=M,D=(1-P)*S/2),t.showLabelBackdrop){const e=Ne(t.backdropPadding),i=O.heights[m],s=O.widths[m];let n=v+D-e.top,o=y-e.left;switch(C){case"middle":n-=i/2;break;case"bottom":n-=i}switch(w){case"center":o-=s/2;break;case"right":o-=s}d={left:o,top:n,width:s+e.width,height:i+e.height,color:t.backdropColor}}p.push({rotation:g,label:_,font:k,color:i,strokeColor:r,strokeWidth:h,textOffset:D,textAlign:w,textBaseline:C,translation:[y,v],backdrop:d})}return p}_getXAxisLabelAlignment(){const{position:t,ticks:e}=this.options;if(-It(this.labelRotation))return"top"===t?"left":"right";let i="center";return"start"===e.align?i="left":"end"===e.align&&(i="right"),i}_getYAxisLabelAlignment(t){const{position:e,ticks:{crossAlign:i,mirror:s,padding:n}}=this.options,o=t+n,a=this._getLabelSizes().widest.width;let r,l;return"left"===e?s?(l=this.right+n,"near"===i?r="left":"center"===i?(r="center",l+=a/2):(r="right",l+=a)):(l=this.right-o,"near"===i?r="right":"center"===i?(r="center",l-=a/2):(r="left",l=this.left)):"right"===e?s?(l=this.left+n,"near"===i?r="right":"center"===i?(r="center",l-=a/2):(r="left",l-=a)):(l=this.left+o,"near"===i?r="left":"center"===i?(r="center",l+=a/2):(r="right",l=this.right)):r="right",{textAlign:r,x:l}}_computeLabelArea(){if(this.options.ticks.mirror)return;const t=this.chart,e=this.options.position;return"left"===e||"right"===e?{top:0,left:this.left,bottom:t.height,right:this.right}:"top"===e||"bottom"===e?{top:this.top,left:0,bottom:this.bottom,right:t.width}:void 0}drawBackground(){const{ctx:t,options:{backgroundColor:e},left:i,top:s,width:n,height:o}=this;e&&(t.save(),t.fillStyle=e,t.fillRect(i,s,n,o),t.restore())}getLineWidthForValue(t){const e=this.options.grid;if(!this._isVisible()||!e.display)return 0;const i=this.ticks.findIndex((e=>e.value===t));if(i>=0){return e.setContext(this.getContext(i)).lineWidth}return 0}drawGrid(t){const e=this.options.grid,i=this.ctx,s=this._gridLineItems||(this._gridLineItems=this._computeGridLineItems(t));let n,o;const a=(t,e,s)=>{s.width&&s.color&&(i.save(),i.lineWidth=s.width,i.strokeStyle=s.color,i.setLineDash(s.borderDash||[]),i.lineDashOffset=s.borderDashOffset,i.beginPath(),i.moveTo(t.x,t.y),i.lineTo(e.x,e.y),i.stroke(),i.restore())};if(e.display)for(n=0,o=s.length;n<o;++n){const t=s[n];e.drawOnChartArea&&a({x:t.x1,y:t.y1},{x:t.x2,y:t.y2},t),e.drawTicks&&a({x:t.tx1,y:t.ty1},{x:t.tx2,y:t.ty2},{color:t.tickColor,width:t.tickWidth,borderDash:t.tickBorderDash,borderDashOffset:t.tickBorderDashOffset})}}drawBorder(){const{chart:t,ctx:e,options:{grid:i}}=this,s=i.setContext(this.getContext()),n=i.drawBorder?s.borderWidth:0;if(!n)return;const o=i.setContext(this.getContext(0)).lineWidth,a=this._borderValue;let r,l,h,c;this.isHorizontal()?(r=Kt(t,this.left,n)-n/2,l=Kt(t,this.right,o)+o/2,h=c=a):(h=Kt(t,this.top,n)-n/2,c=Kt(t,this.bottom,o)+o/2,r=l=a),e.save(),e.lineWidth=s.borderWidth,e.strokeStyle=s.borderColor,e.beginPath(),e.moveTo(r,h),e.lineTo(l,c),e.stroke(),e.restore()}drawLabels(t){if(!this.options.ticks.display)return;const e=this.ctx,i=this._computeLabelArea();i&&Qt(e,i);const s=this._labelItems||(this._labelItems=this._computeLabelItems(t));let n,o;for(n=0,o=s.length;n<o;++n){const t=s[n],i=t.font,o=t.label;t.backdrop&&(e.fillStyle=t.backdrop.color,e.fillRect(t.backdrop.left,t.backdrop.top,t.backdrop.width,t.backdrop.height)),se(e,o,0,t.textOffset,i,t)}i&&te(e)}drawTitle(){const{ctx:t,options:{position:e,title:i,reverse:s}}=this;if(!i.display)return;const o=He(i.font),a=Ne(i.padding),r=i.align;let l=o.lineHeight/2;"bottom"===e||"center"===e||U(e)?(l+=a.bottom,Y(i.text)&&(l+=o.lineHeight*(i.text.length-1))):l+=a.top;const{titleX:h,titleY:c,maxWidth:d,rotation:u}=function(t,e,i,s){const{top:o,left:a,bottom:r,right:l,chart:h}=t,{chartArea:c,scales:d}=h;let u,f,g,p=0;const m=r-o,x=l-a;if(t.isHorizontal()){if(f=n(s,a,l),U(i)){const t=Object.keys(i)[0],s=i[t];g=d[t].getPixelForValue(s)+m-e}else g="center"===i?(c.bottom+c.top)/2+m-e:Ls(t,i,e);u=l-a}else{if(U(i)){const t=Object.keys(i)[0],s=i[t];f=d[t].getPixelForValue(s)-x+e}else f="center"===i?(c.left+c.right)/2-x+e:Ls(t,i,e);g=n(s,r,o),p="left"===i?-kt:kt}return{titleX:f,titleY:g,maxWidth:u,rotation:p}}(this,l,e,r);se(t,i.text,0,0,o,{color:i.color,maxWidth:d,rotation:u,textAlign:Fs(r,e,s),textBaseline:"middle",translation:[h,c]})}draw(t){this._isVisible()&&(this.drawBackground(),this.drawGrid(t),this.drawBorder(),this.drawTitle(),this.drawLabels(t))}_layers(){const t=this.options,e=t.ticks&&t.ticks.z||0,i=K(t.grid&&t.grid.z,-1);return this._isVisible()&&this.draw===Bs.prototype.draw?[{z:i,draw:t=>{this.drawBackground(),this.drawGrid(t),this.drawTitle()}},{z:i+1,draw:()=>{this.drawBorder()}},{z:e,draw:t=>{this.drawLabels(t)}}]:[{z:e,draw:t=>{this.draw(t)}}]}getMatchingVisibleMetas(t){const e=this.chart.getSortedVisibleDatasetMetas(),i=this.axis+"AxisID",s=[];let n,o;for(n=0,o=e.length;n<o;++n){const o=e[n];o[i]!==this.id||t&&o.type!==t||s.push(o)}return s}_resolveTickFontOptions(t){return He(this.options.ticks.setContext(this.getContext(t)).font)}_maxDigits(){const t=this._resolveTickFontOptions(0).lineHeight;return(this.isHorizontal()?this.width:this.height)/t}}class Vs{constructor(t,e,i){this.type=t,this.scope=e,this.override=i,this.items=Object.create(null)}isForType(t){return Object.prototype.isPrototypeOf.call(this.type.prototype,t.prototype)}register(t){const e=Object.getPrototypeOf(t);let i;(function(t){return"id"in t&&"defaults"in t})(e)&&(i=this.register(e));const s=this.items,n=t.id,o=this.scope+"."+n;if(!n)throw new Error("class does not have id: "+t);return n in s||(s[n]=t,function(t,e,i){const s=nt(Object.create(null),[i?bt.get(i):{},bt.get(e),t.defaults]);bt.set(e,s),t.defaultRoutes&&function(t,e){Object.keys(e).forEach((i=>{const s=i.split("."),n=s.pop(),o=[t].concat(s).join("."),a=e[i].split("."),r=a.pop(),l=a.join(".");bt.route(o,n,l,r)}))}(e,t.defaultRoutes);t.descriptors&&bt.describe(e,t.descriptors)}(t,o,i),this.override&&bt.override(t.id,t.overrides)),o}get(t){return this.items[t]}unregister(t){const e=this.items,i=t.id,s=this.scope;i in e&&delete e[i],s&&i in bt[s]&&(delete bt[s][i],this.override&&delete gt[i])}}var Ws=new class{constructor(){this.controllers=new Vs(Ps,"datasets",!0),this.elements=new Vs(Ds,"elements"),this.plugins=new Vs(Object,"plugins"),this.scales=new Vs(Bs,"scales"),this._typedRegistries=[this.controllers,this.scales,this.elements]}add(...t){this._each("register",t)}remove(...t){this._each("unregister",t)}addControllers(...t){this._each("register",t,this.controllers)}addElements(...t){this._each("register",t,this.elements)}addPlugins(...t){this._each("register",t,this.plugins)}addScales(...t){this._each("register",t,this.scales)}getController(t){return this._get(t,this.controllers,"controller")}getElement(t){return this._get(t,this.elements,"element")}getPlugin(t){return this._get(t,this.plugins,"plugin")}getScale(t){return this._get(t,this.scales,"scale")}removeControllers(...t){this._each("unregister",t,this.controllers)}removeElements(...t){this._each("unregister",t,this.elements)}removePlugins(...t){this._each("unregister",t,this.plugins)}removeScales(...t){this._each("unregister",t,this.scales)}_each(t,e,i){[...e].forEach((e=>{const s=i||this._getRegistryForType(e);i||s.isForType(e)||s===this.plugins&&e.id?this._exec(t,s,e):Q(e,(e=>{const s=i||this._getRegistryForType(e);this._exec(t,s,e)}))}))}_exec(t,e,i){const s=ht(t);J(i["before"+s],[],i),e[t](i),J(i["after"+s],[],i)}_getRegistryForType(t){for(let e=0;e<this._typedRegistries.length;e++){const i=this._typedRegistries[e];if(i.isForType(t))return i}return this.plugins}_get(t,e,i){const s=e.get(t);if(void 0===s)throw new Error('"'+t+'" is not a registered '+i+".");return s}};class Ns{constructor(){this._init=[]}notify(t,e,i,s){"beforeInit"===e&&(this._init=this._createDescriptors(t,!0),this._notify(this._init,t,"install"));const n=s?this._descriptors(t).filter(s):this._descriptors(t),o=this._notify(n,t,e,i);return"afterDestroy"===e&&(this._notify(n,t,"stop"),this._notify(this._init,t,"uninstall")),o}_notify(t,e,i,s){s=s||{};for(const n of t){const t=n.plugin;if(!1===J(t[i],[e,s,n.options],t)&&s.cancelable)return!1}return!0}invalidate(){$(this._cache)||(this._oldCache=this._cache,this._cache=void 0)}_descriptors(t){if(this._cache)return this._cache;const e=this._cache=this._createDescriptors(t);return this._notifyStateChanges(t),e}_createDescriptors(t,e){const i=t&&t.config,s=K(i.options&&i.options.plugins,{}),n=function(t){const e=[],i=Object.keys(Ws.plugins.items);for(let t=0;t<i.length;t++)e.push(Ws.getPlugin(i[t]));const s=t.plugins||[];for(let t=0;t<s.length;t++){const i=s[t];-1===e.indexOf(i)&&e.push(i)}return e}(i);return!1!==s||e?function(t,e,i,s){const n=[],o=t.getContext();for(let a=0;a<e.length;a++){const r=e[a],l=Hs(i[r.id],s);null!==l&&n.push({plugin:r,options:js(t.config,r,l,o)})}return n}(t,n,s,e):[]}_notifyStateChanges(t){const e=this._oldCache||[],i=this._cache,s=(t,e)=>t.filter((t=>!e.some((e=>t.plugin.id===e.plugin.id))));this._notify(s(e,i),t,"stop"),this._notify(s(i,e),t,"start")}}function Hs(t,e){return e||!1!==t?!0===t?{}:t:null}function js(t,e,i,s){const n=t.pluginScopeKeys(e),o=t.getOptionScopes(i,n);return t.createResolver(o,s,[""],{scriptable:!1,indexable:!1,allKeys:!0})}function $s(t,e){const i=bt.datasets[t]||{};return((e.datasets||{})[t]||{}).indexAxis||e.indexAxis||i.indexAxis||"x"}function Ys(t,e){return"x"===t||"y"===t?t:e.axis||("top"===(i=e.position)||"bottom"===i?"x":"left"===i||"right"===i?"y":void 0)||t.charAt(0).toLowerCase();var i}function Us(t){const e=t.options||(t.options={});e.plugins=K(e.plugins,{}),e.scales=function(t,e){const i=gt[t.type]||{scales:{}},s=e.scales||{},n=$s(t.type,e),o=Object.create(null),a=Object.create(null);return Object.keys(s).forEach((t=>{const e=s[t];if(!U(e))return console.error(`Invalid scale configuration for scale: ${t}`);if(e._proxy)return console.warn(`Ignoring resolver passed as options for scale: ${t}`);const r=Ys(t,e),l=function(t,e){return t===e?"_index_":"_value_"}(r,n),h=i.scales||{};o[r]=o[r]||t,a[t]=ot(Object.create(null),[{axis:r},e,h[r],h[l]])})),t.data.datasets.forEach((i=>{const n=i.type||t.type,r=i.indexAxis||$s(n,e),l=(gt[n]||{}).scales||{};Object.keys(l).forEach((t=>{const e=function(t,e){let i=t;return"_index_"===t?i=e:"_value_"===t&&(i="x"===e?"y":"x"),i}(t,r),n=i[e+"AxisID"]||o[e]||e;a[n]=a[n]||Object.create(null),ot(a[n],[{axis:e},s[n],l[t]])}))})),Object.keys(a).forEach((t=>{const e=a[t];ot(e,[bt.scales[e.type],bt.scale])})),a}(t,e)}function Xs(t){return(t=t||{}).datasets=t.datasets||[],t.labels=t.labels||[],t}const qs=new Map,Ks=new Set;function Gs(t,e){let i=qs.get(t);return i||(i=e(),qs.set(t,i),Ks.add(i)),i}const Zs=(t,e,i)=>{const s=lt(e,i);void 0!==s&&t.add(s)};class Js{constructor(t){this._config=function(t){return(t=t||{}).data=Xs(t.data),Us(t),t}(t),this._scopeCache=new Map,this._resolverCache=new Map}get platform(){return this._config.platform}get type(){return this._config.type}set type(t){this._config.type=t}get data(){return this._config.data}set data(t){this._config.data=Xs(t)}get options(){return this._config.options}set options(t){this._config.options=t}get plugins(){return this._config.plugins}update(){const t=this._config;this.clearCache(),Us(t)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(t){return Gs(t,(()=>[[`datasets.${t}`,""]]))}datasetAnimationScopeKeys(t,e){return Gs(`${t}.transition.${e}`,(()=>[[`datasets.${t}.transitions.${e}`,`transitions.${e}`],[`datasets.${t}`,""]]))}datasetElementScopeKeys(t,e){return Gs(`${t}-${e}`,(()=>[[`datasets.${t}.elements.${e}`,`datasets.${t}`,`elements.${e}`,""]]))}pluginScopeKeys(t){const e=t.id;return Gs(`${this.type}-plugin-${e}`,(()=>[[`plugins.${e}`,...t.additionalOptionScopes||[]]]))}_cachedScopes(t,e){const i=this._scopeCache;let s=i.get(t);return s&&!e||(s=new Map,i.set(t,s)),s}getOptionScopes(t,e,i){const{options:s,type:n}=this,o=this._cachedScopes(t,i),a=o.get(e);if(a)return a;const r=new Set;e.forEach((e=>{t&&(r.add(t),e.forEach((e=>Zs(r,t,e)))),e.forEach((t=>Zs(r,s,t))),e.forEach((t=>Zs(r,gt[n]||{},t))),e.forEach((t=>Zs(r,bt,t))),e.forEach((t=>Zs(r,pt,t)))}));const l=Array.from(r);return 0===l.length&&l.push(Object.create(null)),Ks.has(e)&&o.set(e,l),l}chartOptionScopes(){const{options:t,type:e}=this;return[t,gt[e]||{},bt.datasets[e]||{},{type:e},bt,pt]}resolveNamedOptions(t,e,i,s=[""]){const n={$shared:!0},{resolver:o,subPrefixes:a}=Qs(this._resolverCache,t,s);let r=o;if(function(t,e){const{isScriptable:i,isIndexable:s}=ri(t);for(const n of e){const e=i(n),o=s(n),a=(o||e)&&t[n];if(e&&(dt(a)||tn(a))||o&&Y(a))return!0}return!1}(o,e)){n.$shared=!1;r=ai(o,i=dt(i)?i():i,this.createResolver(t,i,a))}for(const t of e)n[t]=r[t];return n}createResolver(t,e,i=[""],s){const{resolver:n}=Qs(this._resolverCache,t,i);return U(e)?ai(n,e,void 0,s):n}}function Qs(t,e,i){let s=t.get(e);s||(s=new Map,t.set(e,s));const n=i.join();let o=s.get(n);if(!o){o={resolver:oi(e,i),subPrefixes:i.filter((t=>!t.toLowerCase().includes("hover")))},s.set(n,o)}return o}const tn=t=>U(t)&&Object.getOwnPropertyNames(t).reduce(((e,i)=>e||dt(t[i])),!1);const en=["top","bottom","left","right","chartArea"];function sn(t,e){return"top"===t||"bottom"===t||-1===en.indexOf(t)&&"x"===e}function nn(t,e){return function(i,s){return i[t]===s[t]?i[e]-s[e]:i[t]-s[t]}}function on(t){const e=t.chart,i=e.options.animation;e.notifyPlugins("afterRender"),J(i&&i.onComplete,[t],e)}function an(t){const e=t.chart,i=e.options.animation;J(i&&i.onProgress,[t],e)}function rn(t){return ge()&&"string"==typeof t?t=document.getElementById(t):t&&t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas),t}const ln={},hn=t=>{const e=rn(t);return Object.values(ln).filter((t=>t.canvas===e)).pop()};function cn(t,e,i){const s=Object.keys(t);for(const n of s){const s=+n;if(s>=e){const o=t[n];delete t[n],(i>0||s>e)&&(t[s+i]=o)}}}class dn{constructor(t,e){const s=this.config=new Js(e),n=rn(t),o=hn(n);if(o)throw new Error("Canvas is already in use. Chart with ID '"+o.id+"' must be destroyed before the canvas can be reused.");const r=s.createResolver(s.chartOptionScopes(),this.getContext());this.platform=new(s.platform||ls(n)),this.platform.updateConfig(s);const l=this.platform.acquireContext(n,r.aspectRatio),h=l&&l.canvas,c=h&&h.height,d=h&&h.width;this.id=j(),this.ctx=l,this.canvas=h,this.width=d,this.height=c,this._options=r,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._responsiveListeners=void 0,this._sortedMetasets=[],this.scales={},this._plugins=new Ns,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=i((t=>this.update(t)),r.resizeDelay||0),this._dataChanges=[],ln[this.id]=this,l&&h?(a.listen(this,"complete",on),a.listen(this,"progress",an),this._initialize(),this.attached&&this.update()):console.error("Failed to create chart: can't acquire context from the given item")}get aspectRatio(){const{options:{aspectRatio:t,maintainAspectRatio:e},width:i,height:s,_aspectRatio:n}=this;return $(t)?e&&n?n:s?i/s:null:t}get data(){return this.config.data}set data(t){this.config.data=t}get options(){return this._options}set options(t){this.config.options=t}_initialize(){return this.notifyPlugins("beforeInit"),this.options.responsive?this.resize():ke(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins("afterInit"),this}clear(){return Gt(this.canvas,this.ctx),this}stop(){return a.stop(this),this}resize(t,e){a.running(this)?this._resizeBeforeDraw={width:t,height:e}:this._resize(t,e)}_resize(t,e){const i=this.options,s=this.canvas,n=i.maintainAspectRatio&&this.aspectRatio,o=this.platform.getMaximumSize(s,t,e,n),a=i.devicePixelRatio||this.platform.getDevicePixelRatio(),r=this.width?"resize":"attach";this.width=o.width,this.height=o.height,this._aspectRatio=this.aspectRatio,ke(this,a,!0)&&(this.notifyPlugins("resize",{size:o}),J(i.onResize,[this,o],this),this.attached&&this._doResize(r)&&this.render())}ensureScalesHaveIDs(){Q(this.options.scales||{},((t,e)=>{t.id=e}))}buildOrUpdateScales(){const t=this.options,e=t.scales,i=this.scales,s=Object.keys(i).reduce(((t,e)=>(t[e]=!1,t)),{});let n=[];e&&(n=n.concat(Object.keys(e).map((t=>{const i=e[t],s=Ys(t,i),n="r"===s,o="x"===s;return{options:i,dposition:n?"chartArea":o?"bottom":"left",dtype:n?"radialLinear":o?"category":"linear"}})))),Q(n,(e=>{const n=e.options,o=n.id,a=Ys(o,n),r=K(n.type,e.dtype);void 0!==n.position&&sn(n.position,a)===sn(e.dposition)||(n.position=e.dposition),s[o]=!0;let l=null;if(o in i&&i[o].type===r)l=i[o];else{l=new(Ws.getScale(r))({id:o,type:r,ctx:this.ctx,chart:this}),i[l.id]=l}l.init(n,t)})),Q(s,((t,e)=>{t||delete i[e]})),Q(i,(t=>{ni.configure(this,t,t.options),ni.addBox(this,t)}))}_updateMetasets(){const t=this._metasets,e=this.data.datasets.length,i=t.length;if(t.sort(((t,e)=>t.index-e.index)),i>e){for(let t=e;t<i;++t)this._destroyDatasetMeta(t);t.splice(e,i-e)}this._sortedMetasets=t.slice(0).sort(nn("order","index"))}_removeUnreferencedMetasets(){const{_metasets:t,data:{datasets:e}}=this;t.length>e.length&&delete this._stacks,t.forEach(((t,i)=>{0===e.filter((e=>e===t._dataset)).length&&this._destroyDatasetMeta(i)}))}buildOrUpdateControllers(){const t=[],e=this.data.datasets;let i,s;for(this._removeUnreferencedMetasets(),i=0,s=e.length;i<s;i++){const s=e[i];let n=this.getDatasetMeta(i);const o=s.type||this.config.type;if(n.type&&n.type!==o&&(this._destroyDatasetMeta(i),n=this.getDatasetMeta(i)),n.type=o,n.indexAxis=s.indexAxis||$s(o,this.options),n.order=s.order||0,n.index=i,n.label=""+s.label,n.visible=this.isDatasetVisible(i),n.controller)n.controller.updateIndex(i),n.controller.linkScales();else{const e=Ws.getController(o),{datasetElementType:s,dataElementType:a}=bt.datasets[o];Object.assign(e.prototype,{dataElementType:Ws.getElement(a),datasetElementType:s&&Ws.getElement(s)}),n.controller=new e(this,i),t.push(n.controller)}}return this._updateMetasets(),t}_resetElements(){Q(this.data.datasets,((t,e)=>{this.getDatasetMeta(e).controller.reset()}),this)}reset(){this._resetElements(),this.notifyPlugins("reset")}update(t){const e=this.config;e.update();const i=this._options=e.createResolver(e.chartOptionScopes(),this.getContext()),s=this._animationsDisabled=!i.animation;if(this._updateScales(),this._checkEventBindings(),this._updateHiddenIndices(),this._plugins.invalidate(),!1===this.notifyPlugins("beforeUpdate",{mode:t,cancelable:!0}))return;const n=this.buildOrUpdateControllers();this.notifyPlugins("beforeElementsUpdate");let o=0;for(let t=0,e=this.data.datasets.length;t<e;t++){const{controller:e}=this.getDatasetMeta(t),i=!s&&-1===n.indexOf(e);e.buildOrUpdateElements(i),o=Math.max(+e.getMaxOverflow(),o)}o=this._minPadding=i.layout.autoPadding?o:0,this._updateLayout(o),s||Q(n,(t=>{t.reset()})),this._updateDatasets(t),this.notifyPlugins("afterUpdate",{mode:t}),this._layers.sort(nn("z","_idx"));const{_active:a,_lastEvent:r}=this;r?this._eventHandler(r,!0):a.length&&this._updateHoverStyles(a,a,!0),this.render()}_updateScales(){Q(this.scales,(t=>{ni.removeBox(this,t)})),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){const t=this.options,e=new Set(Object.keys(this._listeners)),i=new Set(t.events);ut(e,i)&&!!this._responsiveListeners===t.responsive||(this.unbindEvents(),this.bindEvents())}_updateHiddenIndices(){const{_hiddenIndices:t}=this,e=this._getUniformDataChanges()||[];for(const{method:i,start:s,count:n}of e){cn(t,s,"_removeElements"===i?-n:n)}}_getUniformDataChanges(){const t=this._dataChanges;if(!t||!t.length)return;this._dataChanges=[];const e=this.data.datasets.length,i=e=>new Set(t.filter((t=>t[0]===e)).map(((t,e)=>e+","+t.splice(1).join(",")))),s=i(0);for(let t=1;t<e;t++)if(!ut(s,i(t)))return;return Array.from(s).map((t=>t.split(","))).map((t=>({method:t[1],start:+t[2],count:+t[3]})))}_updateLayout(t){if(!1===this.notifyPlugins("beforeLayout",{cancelable:!0}))return;ni.update(this,this.width,this.height,t);const e=this.chartArea,i=e.width<=0||e.height<=0;this._layers=[],Q(this.boxes,(t=>{i&&"chartArea"===t.position||(t.configure&&t.configure(),this._layers.push(...t._layers()))}),this),this._layers.forEach(((t,e)=>{t._idx=e})),this.notifyPlugins("afterLayout")}_updateDatasets(t){if(!1!==this.notifyPlugins("beforeDatasetsUpdate",{mode:t,cancelable:!0})){for(let t=0,e=this.data.datasets.length;t<e;++t)this.getDatasetMeta(t).controller.configure();for(let e=0,i=this.data.datasets.length;e<i;++e)this._updateDataset(e,dt(t)?t({datasetIndex:e}):t);this.notifyPlugins("afterDatasetsUpdate",{mode:t})}}_updateDataset(t,e){const i=this.getDatasetMeta(t),s={meta:i,index:t,mode:e,cancelable:!0};!1!==this.notifyPlugins("beforeDatasetUpdate",s)&&(i.controller._update(e),s.cancelable=!1,this.notifyPlugins("afterDatasetUpdate",s))}render(){!1!==this.notifyPlugins("beforeRender",{cancelable:!0})&&(a.has(this)?this.attached&&!a.running(this)&&a.start(this):(this.draw(),on({chart:this})))}draw(){let t;if(this._resizeBeforeDraw){const{width:t,height:e}=this._resizeBeforeDraw;this._resize(t,e),this._resizeBeforeDraw=null}if(this.clear(),this.width<=0||this.height<=0)return;if(!1===this.notifyPlugins("beforeDraw",{cancelable:!0}))return;const e=this._layers;for(t=0;t<e.length&&e[t].z<=0;++t)e[t].draw(this.chartArea);for(this._drawDatasets();t<e.length;++t)e[t].draw(this.chartArea);this.notifyPlugins("afterDraw")}_getSortedDatasetMetas(t){const e=this._sortedMetasets,i=[];let s,n;for(s=0,n=e.length;s<n;++s){const n=e[s];t&&!n.visible||i.push(n)}return i}getSortedVisibleDatasetMetas(){return this._getSortedDatasetMetas(!0)}_drawDatasets(){if(!1===this.notifyPlugins("beforeDatasetsDraw",{cancelable:!0}))return;const t=this.getSortedVisibleDatasetMetas();for(let e=t.length-1;e>=0;--e)this._drawDataset(t[e]);this.notifyPlugins("afterDatasetsDraw")}_drawDataset(t){const e=this.ctx,i=t._clip,s=!i.disabled,n=this.chartArea,o={meta:t,index:t.index,cancelable:!0};!1!==this.notifyPlugins("beforeDatasetDraw",o)&&(s&&Qt(e,{left:!1===i.left?0:n.left-i.left,right:!1===i.right?this.width:n.right+i.right,top:!1===i.top?0:n.top-i.top,bottom:!1===i.bottom?this.height:n.bottom+i.bottom}),t.controller.draw(),s&&te(e),o.cancelable=!1,this.notifyPlugins("afterDatasetDraw",o))}getElementsAtEventForMode(t,e,i,s){const n=Ee.modes[e];return"function"==typeof n?n(this,t,i,s):[]}getDatasetMeta(t){const e=this.data.datasets[t],i=this._metasets;let s=i.filter((t=>t&&t._dataset===e)).pop();return s||(s={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:e&&e.order||0,index:t,_dataset:e,_parsed:[],_sorted:!1},i.push(s)),s}getContext(){return this.$context||(this.$context=Ye(null,{chart:this,type:"chart"}))}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(t){const e=this.data.datasets[t];if(!e)return!1;const i=this.getDatasetMeta(t);return"boolean"==typeof i.hidden?!i.hidden:!e.hidden}setDatasetVisibility(t,e){this.getDatasetMeta(t).hidden=!e}toggleDataVisibility(t){this._hiddenIndices[t]=!this._hiddenIndices[t]}getDataVisibility(t){return!this._hiddenIndices[t]}_updateVisibility(t,e,i){const s=i?"show":"hide",n=this.getDatasetMeta(t),o=n.controller._resolveAnimations(void 0,s);ct(e)?(n.data[e].hidden=!i,this.update()):(this.setDatasetVisibility(t,i),o.update(n,{visible:i}),this.update((e=>e.datasetIndex===t?s:void 0)))}hide(t,e){this._updateVisibility(t,e,!1)}show(t,e){this._updateVisibility(t,e,!0)}_destroyDatasetMeta(t){const e=this._metasets[t];e&&e.controller&&e.controller._destroy(),delete this._metasets[t]}_stop(){let t,e;for(this.stop(),a.remove(this),t=0,e=this.data.datasets.length;t<e;++t)this._destroyDatasetMeta(t)}destroy(){this.notifyPlugins("beforeDestroy");const{canvas:t,ctx:e}=this;this._stop(),this.config.clearCache(),t&&(this.unbindEvents(),Gt(t,e),this.platform.releaseContext(e),this.canvas=null,this.ctx=null),this.notifyPlugins("destroy"),delete ln[this.id],this.notifyPlugins("afterDestroy")}toBase64Image(...t){return this.canvas.toDataURL(...t)}bindEvents(){this.bindUserEvents(),this.options.responsive?this.bindResponsiveEvents():this.attached=!0}bindUserEvents(){const t=this._listeners,e=this.platform,i=(i,s)=>{e.addEventListener(this,i,s),t[i]=s},s=(t,e,i)=>{t.offsetX=e,t.offsetY=i,this._eventHandler(t)};Q(this.options.events,(t=>i(t,s)))}bindResponsiveEvents(){this._responsiveListeners||(this._responsiveListeners={});const t=this._responsiveListeners,e=this.platform,i=(i,s)=>{e.addEventListener(this,i,s),t[i]=s},s=(i,s)=>{t[i]&&(e.removeEventListener(this,i,s),delete t[i])},n=(t,e)=>{this.canvas&&this.resize(t,e)};let o;const a=()=>{s("attach",a),this.attached=!0,this.resize(),i("resize",n),i("detach",o)};o=()=>{this.attached=!1,s("resize",n),this._stop(),this._resize(0,0),i("attach",a)},e.isAttached(this.canvas)?a():o()}unbindEvents(){Q(this._listeners,((t,e)=>{this.platform.removeEventListener(this,e,t)})),this._listeners={},Q(this._responsiveListeners,((t,e)=>{this.platform.removeEventListener(this,e,t)})),this._responsiveListeners=void 0}updateHoverStyle(t,e,i){const s=i?"set":"remove";let n,o,a,r;for("dataset"===e&&(n=this.getDatasetMeta(t[0].datasetIndex),n.controller["_"+s+"DatasetHoverStyle"]()),a=0,r=t.length;a<r;++a){o=t[a];const e=o&&this.getDatasetMeta(o.datasetIndex).controller;e&&e[s+"HoverStyle"](o.element,o.datasetIndex,o.index)}}getActiveElements(){return this._active||[]}setActiveElements(t){const e=this._active||[],i=t.map((({datasetIndex:t,index:e})=>{const i=this.getDatasetMeta(t);if(!i)throw new Error("No dataset found at index "+t);return{datasetIndex:t,element:i.data[e],index:e}}));!tt(i,e)&&(this._active=i,this._lastEvent=null,this._updateHoverStyles(i,e))}notifyPlugins(t,e,i){return this._plugins.notify(this,t,e,i)}_updateHoverStyles(t,e,i){const s=this.options.hover,n=(t,e)=>t.filter((t=>!e.some((e=>t.datasetIndex===e.datasetIndex&&t.index===e.index)))),o=n(e,t),a=i?t:n(t,e);o.length&&this.updateHoverStyle(o,s.mode,!1),a.length&&s.mode&&this.updateHoverStyle(a,s.mode,!0)}_eventHandler(t,e){const i={event:t,replay:e,cancelable:!0,inChartArea:Jt(t,this.chartArea,this._minPadding)},s=e=>(e.options.events||this.options.events).includes(t.native.type);if(!1===this.notifyPlugins("beforeEvent",i,s))return;const n=this._handleEvent(t,e,i.inChartArea);return i.cancelable=!1,this.notifyPlugins("afterEvent",i,s),(n||i.changed)&&this.render(),this}_handleEvent(t,e,i){const{_active:s=[],options:n}=this,o=e,a=this._getActiveElements(t,s,i,o),r=ft(t),l=function(t,e,i,s){return i&&"mouseout"!==t.type?s?e:t:null}(t,this._lastEvent,i,r);i&&(this._lastEvent=null,J(n.onHover,[t,a,this],this),r&&J(n.onClick,[t,a,this],this));const h=!tt(a,s);return(h||e)&&(this._active=a,this._updateHoverStyles(a,s,e)),this._lastEvent=l,h}_getActiveElements(t,e,i,s){if("mouseout"===t.type)return[];if(!i)return e;const n=this.options.hover;return this.getElementsAtEventForMode(t,n.mode,n,s)}}const un=()=>Q(dn.instances,(t=>t._plugins.invalidate())),fn=!0;function gn(){throw new Error("This method is not implemented: Check that a complete date adapter is provided.")}Object.defineProperties(dn,{defaults:{enumerable:fn,value:bt},instances:{enumerable:fn,value:ln},overrides:{enumerable:fn,value:gt},registry:{enumerable:fn,value:Ws},version:{enumerable:fn,value:"3.7.1"},getChart:{enumerable:fn,value:hn},register:{enumerable:fn,value:(...t)=>{Ws.add(...t),un()}},unregister:{enumerable:fn,value:(...t)=>{Ws.remove(...t),un()}}});class pn{constructor(t){this.options=t||{}}formats(){return gn()}parse(t,e){return gn()}format(t,e){return gn()}add(t,e,i){return gn()}diff(t,e,i){return gn()}startOf(t,e,i){return gn()}endOf(t,e){return gn()}}pn.override=function(t){Object.assign(pn.prototype,t)};var mn={_date:pn};function xn(t){const e=t.iScale,i=function(t,e){if(!t._cache.$bar){const i=t.getMatchingVisibleMetas(e);let s=[];for(let e=0,n=i.length;e<n;e++)s=s.concat(i[e].controller.getAllParsedValues(t));t._cache.$bar=fe(s.sort(((t,e)=>t-e)))}return t._cache.$bar}(e,t.type);let s,n,o,a,r=e._length;const l=()=>{32767!==o&&-32768!==o&&(ct(a)&&(r=Math.min(r,Math.abs(o-a)||r)),a=o)};for(s=0,n=i.length;s<n;++s)o=e.getPixelForValue(i[s]),l();for(a=void 0,s=0,n=e.ticks.length;s<n;++s)o=e.getPixelForTick(s),l();return r}function bn(t,e,i,s){return Y(t)?function(t,e,i,s){const n=i.parse(t[0],s),o=i.parse(t[1],s),a=Math.min(n,o),r=Math.max(n,o);let l=a,h=r;Math.abs(a)>Math.abs(r)&&(l=r,h=a),e[i.axis]=h,e._custom={barStart:l,barEnd:h,start:n,end:o,min:a,max:r}}(t,e,i,s):e[i.axis]=i.parse(t,s),e}function _n(t,e,i,s){const n=t.iScale,o=t.vScale,a=n.getLabels(),r=n===o,l=[];let h,c,d,u;for(h=i,c=i+s;h<c;++h)u=e[h],d={},d[n.axis]=r||n.parse(a[h],h),l.push(bn(u,d,o,h));return l}function yn(t){return t&&void 0!==t.barStart&&void 0!==t.barEnd}function vn(t,e,i,s){let n=e.borderSkipped;const o={};if(!n)return void(t.borderSkipped=o);const{start:a,end:r,reverse:l,top:h,bottom:c}=function(t){let e,i,s,n,o;return t.horizontal?(e=t.base>t.x,i="left",s="right"):(e=t.base<t.y,i="bottom",s="top"),e?(n="end",o="start"):(n="start",o="end"),{start:i,end:s,reverse:e,top:n,bottom:o}}(t);"middle"===n&&i&&(t.enableBorderRadius=!0,(i._top||0)===s?n=h:(i._bottom||0)===s?n=c:(o[wn(c,a,r,l)]=!0,n=h)),o[wn(n,a,r,l)]=!0,t.borderSkipped=o}function wn(t,e,i,s){var n,o,a;return s?(a=i,t=Mn(t=(n=t)===(o=e)?a:n===a?o:n,i,e)):t=Mn(t,e,i),t}function Mn(t,e,i){return"start"===t?e:"end"===t?i:t}function kn(t,{inflateAmount:e},i){t.inflateAmount="auto"===e?1===i?.33:0:e}class Sn extends Ps{parsePrimitiveData(t,e,i,s){return _n(t,e,i,s)}parseArrayData(t,e,i,s){return _n(t,e,i,s)}parseObjectData(t,e,i,s){const{iScale:n,vScale:o}=t,{xAxisKey:a="x",yAxisKey:r="y"}=this._parsing,l="x"===n.axis?a:r,h="x"===o.axis?a:r,c=[];let d,u,f,g;for(d=i,u=i+s;d<u;++d)g=e[d],f={},f[n.axis]=n.parse(lt(g,l),d),c.push(bn(lt(g,h),f,o,d));return c}updateRangeFromParsed(t,e,i,s){super.updateRangeFromParsed(t,e,i,s);const n=i._custom;n&&e===this._cachedMeta.vScale&&(t.min=Math.min(t.min,n.min),t.max=Math.max(t.max,n.max))}getMaxOverflow(){return 0}getLabelAndValue(t){const e=this._cachedMeta,{iScale:i,vScale:s}=e,n=this.getParsed(t),o=n._custom,a=yn(o)?"["+o.start+", "+o.end+"]":""+s.getLabelForValue(n[s.axis]);return{label:""+i.getLabelForValue(n[i.axis]),value:a}}initialize(){this.enableOptionSharing=!0,super.initialize();this._cachedMeta.stack=this.getDataset().stack}update(t){const e=this._cachedMeta;this.updateElements(e.data,0,e.data.length,t)}updateElements(t,e,i,s){const n="reset"===s,{index:o,_cachedMeta:{vScale:a}}=this,r=a.getBasePixel(),l=a.isHorizontal(),h=this._getRuler(),c=this.resolveDataElementOptions(e,s),d=this.getSharedOptions(c),u=this.includeOptions(s,d);this.updateSharedOptions(d,s,c);for(let c=e;c<e+i;c++){const e=this.getParsed(c),i=n||$(e[a.axis])?{base:r,head:r}:this._calculateBarValuePixels(c),f=this._calculateBarIndexPixels(c,h),g=(e._stacks||{})[a.axis],p={horizontal:l,base:i.base,enableBorderRadius:!g||yn(e._custom)||o===g._top||o===g._bottom,x:l?i.head:f.center,y:l?f.center:i.head,height:l?f.size:Math.abs(i.size),width:l?Math.abs(i.size):f.size};u&&(p.options=d||this.resolveDataElementOptions(c,t[c].active?"active":s));const m=p.options||t[c].options;vn(p,m,g,o),kn(p,m,h.ratio),this.updateElement(t[c],c,p,s)}}_getStacks(t,e){const i=this._cachedMeta.iScale,s=i.getMatchingVisibleMetas(this._type),n=i.options.stacked,o=s.length,a=[];let r,l;for(r=0;r<o;++r)if(l=s[r],l.controller.options.grouped){if(void 0!==e){const t=l.controller.getParsed(e)[l.controller._cachedMeta.vScale.axis];if($(t)||isNaN(t))continue}if((!1===n||-1===a.indexOf(l.stack)||void 0===n&&void 0===l.stack)&&a.push(l.stack),l.index===t)break}return a.length||a.push(void 0),a}_getStackCount(t){return this._getStacks(void 0,t).length}_getStackIndex(t,e,i){const s=this._getStacks(t,i),n=void 0!==e?s.indexOf(e):-1;return-1===n?s.length-1:n}_getRuler(){const t=this.options,e=this._cachedMeta,i=e.iScale,s=[];let n,o;for(n=0,o=e.data.length;n<o;++n)s.push(i.getPixelForValue(this.getParsed(n)[i.axis],n));const a=t.barThickness;return{min:a||xn(e),pixels:s,start:i._startPixel,end:i._endPixel,stackCount:this._getStackCount(),scale:i,grouped:t.grouped,ratio:a?1:t.categoryPercentage*t.barPercentage}}_calculateBarValuePixels(t){const{_cachedMeta:{vScale:e,_stacked:i},options:{base:s,minBarLength:n}}=this,o=s||0,a=this.getParsed(t),r=a._custom,l=yn(r);let h,c,d=a[e.axis],u=0,f=i?this.applyStack(e,a,i):d;f!==d&&(u=f-d,f=d),l&&(d=r.barStart,f=r.barEnd-r.barStart,0!==d&&Ct(d)!==Ct(r.barEnd)&&(u=0),u+=d);const g=$(s)||l?u:s;let p=e.getPixelForValue(g);if(h=this.chart.getDataVisibility(t)?e.getPixelForValue(u+f):p,c=h-p,Math.abs(c)<n&&(c=function(t,e,i){return 0!==t?Ct(t):(e.isHorizontal()?1:-1)*(e.min>=i?1:-1)}(c,e,o)*n,d===o&&(p-=c/2),h=p+c),p===e.getPixelForValue(o)){const t=Ct(c)*e.getLineWidthForValue(o)/2;p+=t,c-=t}return{size:c,base:p,head:h,center:h+c/2}}_calculateBarIndexPixels(t,e){const i=e.scale,s=this.options,n=s.skipNull,o=K(s.maxBarThickness,1/0);let a,r;if(e.grouped){const i=n?this._getStackCount(t):e.stackCount,l="flex"===s.barThickness?function(t,e,i,s){const n=e.pixels,o=n[t];let a=t>0?n[t-1]:null,r=t<n.length-1?n[t+1]:null;const l=i.categoryPercentage;null===a&&(a=o-(null===r?e.end-e.start:r-o)),null===r&&(r=o+o-a);const h=o-(o-Math.min(a,r))/2*l;return{chunk:Math.abs(r-a)/2*l/s,ratio:i.barPercentage,start:h}}(t,e,s,i):function(t,e,i,s){const n=i.barThickness;let o,a;return $(n)?(o=e.min*i.categoryPercentage,a=i.barPercentage):(o=n*s,a=1),{chunk:o/s,ratio:a,start:e.pixels[t]-o/2}}(t,e,s,i),h=this._getStackIndex(this.index,this._cachedMeta.stack,n?t:void 0);a=l.start+l.chunk*h+l.chunk/2,r=Math.min(o,l.chunk*l.ratio)}else a=i.getPixelForValue(this.getParsed(t)[i.axis],t),r=Math.min(o,e.min*e.ratio);return{base:a-r/2,head:a+r/2,center:a,size:r}}draw(){const t=this._cachedMeta,e=t.vScale,i=t.data,s=i.length;let n=0;for(;n<s;++n)null!==this.getParsed(n)[e.axis]&&i[n].draw(this._ctx)}}Sn.id="bar",Sn.defaults={datasetElementType:!1,dataElementType:"bar",categoryPercentage:.8,barPercentage:.9,grouped:!0,animations:{numbers:{type:"number",properties:["x","y","base","width","height"]}}},Sn.overrides={scales:{_index_:{type:"category",offset:!0,grid:{offset:!0}},_value_:{type:"linear",beginAtZero:!0}}};class Pn extends Ps{initialize(){this.enableOptionSharing=!0,super.initialize()}parsePrimitiveData(t,e,i,s){const n=super.parsePrimitiveData(t,e,i,s);for(let t=0;t<n.length;t++)n[t]._custom=this.resolveDataElementOptions(t+i).radius;return n}parseArrayData(t,e,i,s){const n=super.parseArrayData(t,e,i,s);for(let t=0;t<n.length;t++){const s=e[i+t];n[t]._custom=K(s[2],this.resolveDataElementOptions(t+i).radius)}return n}parseObjectData(t,e,i,s){const n=super.parseObjectData(t,e,i,s);for(let t=0;t<n.length;t++){const s=e[i+t];n[t]._custom=K(s&&s.r&&+s.r,this.resolveDataElementOptions(t+i).radius)}return n}getMaxOverflow(){const t=this._cachedMeta.data;let e=0;for(let i=t.length-1;i>=0;--i)e=Math.max(e,t[i].size(this.resolveDataElementOptions(i))/2);return e>0&&e}getLabelAndValue(t){const e=this._cachedMeta,{xScale:i,yScale:s}=e,n=this.getParsed(t),o=i.getLabelForValue(n.x),a=s.getLabelForValue(n.y),r=n._custom;return{label:e.label,value:"("+o+", "+a+(r?", "+r:"")+")"}}update(t){const e=this._cachedMeta.data;this.updateElements(e,0,e.length,t)}updateElements(t,e,i,s){const n="reset"===s,{iScale:o,vScale:a}=this._cachedMeta,r=this.resolveDataElementOptions(e,s),l=this.getSharedOptions(r),h=this.includeOptions(s,l),c=o.axis,d=a.axis;for(let r=e;r<e+i;r++){const e=t[r],i=!n&&this.getParsed(r),l={},u=l[c]=n?o.getPixelForDecimal(.5):o.getPixelForValue(i[c]),f=l[d]=n?a.getBasePixel():a.getPixelForValue(i[d]);l.skip=isNaN(u)||isNaN(f),h&&(l.options=this.resolveDataElementOptions(r,e.active?"active":s),n&&(l.options.radius=0)),this.updateElement(e,r,l,s)}this.updateSharedOptions(l,s,r)}resolveDataElementOptions(t,e){const i=this.getParsed(t);let s=super.resolveDataElementOptions(t,e);s.$shared&&(s=Object.assign({},s,{$shared:!1}));const n=s.radius;return"active"!==e&&(s.radius=0),s.radius+=K(i&&i._custom,n),s}}Pn.id="bubble",Pn.defaults={datasetElementType:!1,dataElementType:"point",animations:{numbers:{type:"number",properties:["x","y","borderWidth","radius"]}}},Pn.overrides={scales:{x:{type:"linear"},y:{type:"linear"}},plugins:{tooltip:{callbacks:{title:()=>""}}}};class Dn extends Ps{constructor(t,e){super(t,e),this.enableOptionSharing=!0,this.innerRadius=void 0,this.outerRadius=void 0,this.offsetX=void 0,this.offsetY=void 0}linkScales(){}parse(t,e){const i=this.getDataset().data,s=this._cachedMeta;if(!1===this._parsing)s._parsed=i;else{let n,o,a=t=>+i[t];if(U(i[t])){const{key:t="value"}=this._parsing;a=e=>+lt(i[e],t)}for(n=t,o=t+e;n<o;++n)s._parsed[n]=a(n)}}_getRotation(){return It(this.options.rotation-90)}_getCircumference(){return It(this.options.circumference)}_getRotationExtents(){let t=yt,e=-yt;for(let i=0;i<this.chart.data.datasets.length;++i)if(this.chart.isDatasetVisible(i)){const s=this.chart.getDatasetMeta(i).controller,n=s._getRotation(),o=s._getCircumference();t=Math.min(t,n),e=Math.max(e,n+o)}return{rotation:t,circumference:e-t}}update(t){const e=this.chart,{chartArea:i}=e,s=this._cachedMeta,n=s.data,o=this.getMaxBorderWidth()+this.getMaxOffset(n)+this.options.spacing,a=Math.max((Math.min(i.width,i.height)-o)/2,0),r=Math.min(G(this.options.cutout,a),1),l=this._getRingWeight(this.index),{circumference:h,rotation:c}=this._getRotationExtents(),{ratioX:d,ratioY:u,offsetX:f,offsetY:g}=function(t,e,i){let s=1,n=1,o=0,a=0;if(e<yt){const r=t,l=r+e,h=Math.cos(r),c=Math.sin(r),d=Math.cos(l),u=Math.sin(l),f=(t,e,s)=>Ht(t,r,l,!0)?1:Math.max(e,e*i,s,s*i),g=(t,e,s)=>Ht(t,r,l,!0)?-1:Math.min(e,e*i,s,s*i),p=f(0,h,d),m=f(kt,c,u),x=g(_t,h,d),b=g(_t+kt,c,u);s=(p-x)/2,n=(m-b)/2,o=-(p+x)/2,a=-(m+b)/2}return{ratioX:s,ratioY:n,offsetX:o,offsetY:a}}(c,h,r),p=(i.width-o)/d,m=(i.height-o)/u,x=Math.max(Math.min(p,m)/2,0),b=Z(this.options.radius,x),_=(b-Math.max(b*r,0))/this._getVisibleDatasetWeightTotal();this.offsetX=f*b,this.offsetY=g*b,s.total=this.calculateTotal(),this.outerRadius=b-_*this._getRingWeightOffset(this.index),this.innerRadius=Math.max(this.outerRadius-_*l,0),this.updateElements(n,0,n.length,t)}_circumference(t,e){const i=this.options,s=this._cachedMeta,n=this._getCircumference();return e&&i.animation.animateRotate||!this.chart.getDataVisibility(t)||null===s._parsed[t]||s.data[t].hidden?0:this.calculateCircumference(s._parsed[t]*n/yt)}updateElements(t,e,i,s){const n="reset"===s,o=this.chart,a=o.chartArea,r=o.options.animation,l=(a.left+a.right)/2,h=(a.top+a.bottom)/2,c=n&&r.animateScale,d=c?0:this.innerRadius,u=c?0:this.outerRadius,f=this.resolveDataElementOptions(e,s),g=this.getSharedOptions(f),p=this.includeOptions(s,g);let m,x=this._getRotation();for(m=0;m<e;++m)x+=this._circumference(m,n);for(m=e;m<e+i;++m){const e=this._circumference(m,n),i=t[m],o={x:l+this.offsetX,y:h+this.offsetY,startAngle:x,endAngle:x+e,circumference:e,outerRadius:u,innerRadius:d};p&&(o.options=g||this.resolveDataElementOptions(m,i.active?"active":s)),x+=e,this.updateElement(i,m,o,s)}this.updateSharedOptions(g,s,f)}calculateTotal(){const t=this._cachedMeta,e=t.data;let i,s=0;for(i=0;i<e.length;i++){const n=t._parsed[i];null===n||isNaN(n)||!this.chart.getDataVisibility(i)||e[i].hidden||(s+=Math.abs(n))}return s}calculateCircumference(t){const e=this._cachedMeta.total;return e>0&&!isNaN(t)?yt*(Math.abs(t)/e):0}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart,s=i.data.labels||[],n=Ri(e._parsed[t],i.options.locale);return{label:s[t]||"",value:n}}getMaxBorderWidth(t){let e=0;const i=this.chart;let s,n,o,a,r;if(!t)for(s=0,n=i.data.datasets.length;s<n;++s)if(i.isDatasetVisible(s)){o=i.getDatasetMeta(s),t=o.data,a=o.controller;break}if(!t)return 0;for(s=0,n=t.length;s<n;++s)r=a.resolveDataElementOptions(s),"inner"!==r.borderAlign&&(e=Math.max(e,r.borderWidth||0,r.hoverBorderWidth||0));return e}getMaxOffset(t){let e=0;for(let i=0,s=t.length;i<s;++i){const t=this.resolveDataElementOptions(i);e=Math.max(e,t.offset||0,t.hoverOffset||0)}return e}_getRingWeightOffset(t){let e=0;for(let i=0;i<t;++i)this.chart.isDatasetVisible(i)&&(e+=this._getRingWeight(i));return e}_getRingWeight(t){return Math.max(K(this.chart.data.datasets[t].weight,1),0)}_getVisibleDatasetWeightTotal(){return this._getRingWeightOffset(this.chart.data.datasets.length)||1}}Dn.id="doughnut",Dn.defaults={datasetElementType:!1,dataElementType:"arc",animation:{animateRotate:!0,animateScale:!1},animations:{numbers:{type:"number",properties:["circumference","endAngle","innerRadius","outerRadius","startAngle","x","y","offset","borderWidth","spacing"]}},cutout:"50%",rotation:0,circumference:360,radius:"100%",spacing:0,indexAxis:"r"},Dn.descriptors={_scriptable:t=>"spacing"!==t,_indexable:t=>"spacing"!==t},Dn.overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data;if(e.labels.length&&e.datasets.length){const{labels:{pointStyle:i}}=t.legend.options;return e.labels.map(((e,s)=>{const n=t.getDatasetMeta(0).controller.getStyle(s);return{text:e,fillStyle:n.backgroundColor,strokeStyle:n.borderColor,lineWidth:n.borderWidth,pointStyle:i,hidden:!t.getDataVisibility(s),index:s}}))}return[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}},tooltip:{callbacks:{title:()=>"",label(t){let e=t.label;const i=": "+t.formattedValue;return Y(e)?(e=e.slice(),e[0]+=i):e+=i,e}}}}};class Cn extends Ps{initialize(){this.enableOptionSharing=!0,super.initialize()}update(t){const e=this._cachedMeta,{dataset:i,data:s=[],_dataset:n}=e,o=this.chart._animationsDisabled;let{start:a,count:r}=function(t,e,i){const s=e.length;let n=0,o=s;if(t._sorted){const{iScale:a,_parsed:r}=t,l=a.axis,{min:h,max:c,minDefined:d,maxDefined:u}=a.getUserBounds();d&&(n=jt(Math.min(re(r,a.axis,h).lo,i?s:re(e,l,a.getPixelForValue(h)).lo),0,s-1)),o=u?jt(Math.max(re(r,a.axis,c).hi+1,i?0:re(e,l,a.getPixelForValue(c)).hi+1),n,s)-n:s-n}return{start:n,count:o}}(e,s,o);this._drawStart=a,this._drawCount=r,function(t){const{xScale:e,yScale:i,_scaleRanges:s}=t,n={xmin:e.min,xmax:e.max,ymin:i.min,ymax:i.max};if(!s)return t._scaleRanges=n,!0;const o=s.xmin!==e.min||s.xmax!==e.max||s.ymin!==i.min||s.ymax!==i.max;return Object.assign(s,n),o}(e)&&(a=0,r=s.length),i._chart=this.chart,i._datasetIndex=this.index,i._decimated=!!n._decimated,i.points=s;const l=this.resolveDatasetElementOptions(t);this.options.showLine||(l.borderWidth=0),l.segment=this.options.segment,this.updateElement(i,void 0,{animated:!o,options:l},t),this.updateElements(s,a,r,t)}updateElements(t,e,i,s){const n="reset"===s,{iScale:o,vScale:a,_stacked:r,_dataset:l}=this._cachedMeta,h=this.resolveDataElementOptions(e,s),c=this.getSharedOptions(h),d=this.includeOptions(s,c),u=o.axis,f=a.axis,{spanGaps:g,segment:p}=this.options,m=Tt(g)?g:Number.POSITIVE_INFINITY,x=this.chart._animationsDisabled||n||"none"===s;let b=e>0&&this.getParsed(e-1);for(let h=e;h<e+i;++h){const e=t[h],i=this.getParsed(h),g=x?e:{},_=$(i[f]),y=g[u]=o.getPixelForValue(i[u],h),v=g[f]=n||_?a.getBasePixel():a.getPixelForValue(r?this.applyStack(a,i,r):i[f],h);g.skip=isNaN(y)||isNaN(v)||_,g.stop=h>0&&i[u]-b[u]>m,p&&(g.parsed=i,g.raw=l.data[h]),d&&(g.options=c||this.resolveDataElementOptions(h,e.active?"active":s)),x||this.updateElement(e,h,g,s),b=i}this.updateSharedOptions(c,s,h)}getMaxOverflow(){const t=this._cachedMeta,e=t.dataset,i=e.options&&e.options.borderWidth||0,s=t.data||[];if(!s.length)return i;const n=s[0].size(this.resolveDataElementOptions(0)),o=s[s.length-1].size(this.resolveDataElementOptions(s.length-1));return Math.max(i,n,o)/2}draw(){const t=this._cachedMeta;t.dataset.updateControlPoints(this.chart.chartArea,t.iScale.axis),super.draw()}}Cn.id="line",Cn.defaults={datasetElementType:"line",dataElementType:"point",showLine:!0,spanGaps:!1},Cn.overrides={scales:{_index_:{type:"category"},_value_:{type:"linear"}}};class On extends Ps{constructor(t,e){super(t,e),this.innerRadius=void 0,this.outerRadius=void 0}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart,s=i.data.labels||[],n=Ri(e._parsed[t].r,i.options.locale);return{label:s[t]||"",value:n}}update(t){const e=this._cachedMeta.data;this._updateRadius(),this.updateElements(e,0,e.length,t)}_updateRadius(){const t=this.chart,e=t.chartArea,i=t.options,s=Math.min(e.right-e.left,e.bottom-e.top),n=Math.max(s/2,0),o=(n-Math.max(i.cutoutPercentage?n/100*i.cutoutPercentage:1,0))/t.getVisibleDatasetCount();this.outerRadius=n-o*this.index,this.innerRadius=this.outerRadius-o}updateElements(t,e,i,s){const n="reset"===s,o=this.chart,a=this.getDataset(),r=o.options.animation,l=this._cachedMeta.rScale,h=l.xCenter,c=l.yCenter,d=l.getIndexAngle(0)-.5*_t;let u,f=d;const g=360/this.countVisibleElements();for(u=0;u<e;++u)f+=this._computeAngle(u,s,g);for(u=e;u<e+i;u++){const e=t[u];let i=f,p=f+this._computeAngle(u,s,g),m=o.getDataVisibility(u)?l.getDistanceFromCenterForValue(a.data[u]):0;f=p,n&&(r.animateScale&&(m=0),r.animateRotate&&(i=p=d));const x={x:h,y:c,innerRadius:0,outerRadius:m,startAngle:i,endAngle:p,options:this.resolveDataElementOptions(u,e.active?"active":s)};this.updateElement(e,u,x,s)}}countVisibleElements(){const t=this.getDataset(),e=this._cachedMeta;let i=0;return e.data.forEach(((e,s)=>{!isNaN(t.data[s])&&this.chart.getDataVisibility(s)&&i++})),i}_computeAngle(t,e,i){return this.chart.getDataVisibility(t)?It(this.resolveDataElementOptions(t,e).angle||i):0}}On.id="polarArea",On.defaults={dataElementType:"arc",animation:{animateRotate:!0,animateScale:!0},animations:{numbers:{type:"number",properties:["x","y","startAngle","endAngle","innerRadius","outerRadius"]}},indexAxis:"r",startAngle:0},On.overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data;if(e.labels.length&&e.datasets.length){const{labels:{pointStyle:i}}=t.legend.options;return e.labels.map(((e,s)=>{const n=t.getDatasetMeta(0).controller.getStyle(s);return{text:e,fillStyle:n.backgroundColor,strokeStyle:n.borderColor,lineWidth:n.borderWidth,pointStyle:i,hidden:!t.getDataVisibility(s),index:s}}))}return[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}},tooltip:{callbacks:{title:()=>"",label:t=>t.chart.data.labels[t.dataIndex]+": "+t.formattedValue}}},scales:{r:{type:"radialLinear",angleLines:{display:!1},beginAtZero:!0,grid:{circular:!0},pointLabels:{display:!1},startAngle:0}}};class An extends Dn{}An.id="pie",An.defaults={cutout:0,rotation:0,circumference:360,radius:"100%"};class Tn extends Ps{getLabelAndValue(t){const e=this._cachedMeta.vScale,i=this.getParsed(t);return{label:e.getLabels()[t],value:""+e.getLabelForValue(i[e.axis])}}update(t){const e=this._cachedMeta,i=e.dataset,s=e.data||[],n=e.iScale.getLabels();if(i.points=s,"resize"!==t){const e=this.resolveDatasetElementOptions(t);this.options.showLine||(e.borderWidth=0);const o={_loop:!0,_fullLoop:n.length===s.length,options:e};this.updateElement(i,void 0,o,t)}this.updateElements(s,0,s.length,t)}updateElements(t,e,i,s){const n=this.getDataset(),o=this._cachedMeta.rScale,a="reset"===s;for(let r=e;r<e+i;r++){const e=t[r],i=this.resolveDataElementOptions(r,e.active?"active":s),l=o.getPointPositionForValue(r,n.data[r]),h=a?o.xCenter:l.x,c=a?o.yCenter:l.y,d={x:h,y:c,angle:l.angle,skip:isNaN(h)||isNaN(c),options:i};this.updateElement(e,r,d,s)}}}Tn.id="radar",Tn.defaults={datasetElementType:"line",dataElementType:"point",indexAxis:"r",showLine:!0,elements:{line:{fill:"start"}}},Tn.overrides={aspectRatio:1,scales:{r:{type:"radialLinear"}}};class Ln extends Cn{}Ln.id="scatter",Ln.defaults={showLine:!1,fill:!1},Ln.overrides={interaction:{mode:"point"},plugins:{tooltip:{callbacks:{title:()=>"",label:t=>"("+t.label+", "+t.formattedValue+")"}}},scales:{x:{type:"linear"},y:{type:"linear"}}};var Rn=Object.freeze({__proto__:null,BarController:Sn,BubbleController:Pn,DoughnutController:Dn,LineController:Cn,PolarAreaController:On,PieController:An,RadarController:Tn,ScatterController:Ln});function En(t,e,i){const{startAngle:s,pixelMargin:n,x:o,y:a,outerRadius:r,innerRadius:l}=e;let h=n/r;t.beginPath(),t.arc(o,a,r,s-h,i+h),l>n?(h=n/l,t.arc(o,a,l,i+h,s-h,!0)):t.arc(o,a,n,i+kt,s-kt),t.closePath(),t.clip()}function In(t,e,i,s){const n=Be(t.options.borderRadius,["outerStart","outerEnd","innerStart","innerEnd"]);const o=(i-e)/2,a=Math.min(o,s*e/2),r=t=>{const e=(i-Math.min(o,t))*s/2;return jt(t,0,Math.min(o,e))};return{outerStart:r(n.outerStart),outerEnd:r(n.outerEnd),innerStart:jt(n.innerStart,0,a),innerEnd:jt(n.innerEnd,0,a)}}function zn(t,e,i,s){return{x:i+t*Math.cos(e),y:s+t*Math.sin(e)}}function Fn(t,e,i,s,n){const{x:o,y:a,startAngle:r,pixelMargin:l,innerRadius:h}=e,c=Math.max(e.outerRadius+s+i-l,0),d=h>0?h+s+i+l:0;let u=0;const f=n-r;if(s){const t=((h>0?h-s:0)+(c>0?c-s:0))/2;u=(f-(0!==t?f*t/(t+s):f))/2}const g=(f-Math.max(.001,f*c-i/_t)/c)/2,p=r+g+u,m=n-g-u,{outerStart:x,outerEnd:b,innerStart:_,innerEnd:y}=In(e,d,c,m-p),v=c-x,w=c-b,M=p+x/v,k=m-b/w,S=d+_,P=d+y,D=p+_/S,C=m-y/P;if(t.beginPath(),t.arc(o,a,c,M,k),b>0){const e=zn(w,k,o,a);t.arc(e.x,e.y,b,k,m+kt)}const O=zn(P,m,o,a);if(t.lineTo(O.x,O.y),y>0){const e=zn(P,C,o,a);t.arc(e.x,e.y,y,m+kt,C+Math.PI)}if(t.arc(o,a,d,m-y/d,p+_/d,!0),_>0){const e=zn(S,D,o,a);t.arc(e.x,e.y,_,D+Math.PI,p-kt)}const A=zn(v,p,o,a);if(t.lineTo(A.x,A.y),x>0){const e=zn(v,M,o,a);t.arc(e.x,e.y,x,p-kt,M)}t.closePath()}function Bn(t,e,i,s,n){const{options:o}=e,{borderWidth:a,borderJoinStyle:r}=o,l="inner"===o.borderAlign;a&&(l?(t.lineWidth=2*a,t.lineJoin=r||"round"):(t.lineWidth=a,t.lineJoin=r||"bevel"),e.fullCircles&&function(t,e,i){const{x:s,y:n,startAngle:o,pixelMargin:a,fullCircles:r}=e,l=Math.max(e.outerRadius-a,0),h=e.innerRadius+a;let c;for(i&&En(t,e,o+yt),t.beginPath(),t.arc(s,n,h,o+yt,o,!0),c=0;c<r;++c)t.stroke();for(t.beginPath(),t.arc(s,n,l,o,o+yt),c=0;c<r;++c)t.stroke()}(t,e,l),l&&En(t,e,n),Fn(t,e,i,s,n),t.stroke())}class Vn extends Ds{constructor(t){super(),this.options=void 0,this.circumference=void 0,this.startAngle=void 0,this.endAngle=void 0,this.innerRadius=void 0,this.outerRadius=void 0,this.pixelMargin=0,this.fullCircles=0,t&&Object.assign(this,t)}inRange(t,e,i){const s=this.getProps(["x","y"],i),{angle:n,distance:o}=Bt(s,{x:t,y:e}),{startAngle:a,endAngle:r,innerRadius:l,outerRadius:h,circumference:c}=this.getProps(["startAngle","endAngle","innerRadius","outerRadius","circumference"],i),d=this.options.spacing/2,u=K(c,r-a)>=yt||Ht(n,a,r),f=Yt(o,l+d,h+d);return u&&f}getCenterPoint(t){const{x:e,y:i,startAngle:s,endAngle:n,innerRadius:o,outerRadius:a}=this.getProps(["x","y","startAngle","endAngle","innerRadius","outerRadius","circumference"],t),{offset:r,spacing:l}=this.options,h=(s+n)/2,c=(o+a+l+r)/2;return{x:e+Math.cos(h)*c,y:i+Math.sin(h)*c}}tooltipPosition(t){return this.getCenterPoint(t)}draw(t){const{options:e,circumference:i}=this,s=(e.offset||0)/2,n=(e.spacing||0)/2;if(this.pixelMargin="inner"===e.borderAlign?.33:0,this.fullCircles=i>yt?Math.floor(i/yt):0,0===i||this.innerRadius<0||this.outerRadius<0)return;t.save();let o=0;if(s){o=s/2;const e=(this.startAngle+this.endAngle)/2;t.translate(Math.cos(e)*o,Math.sin(e)*o),this.circumference>=_t&&(o=s)}t.fillStyle=e.backgroundColor,t.strokeStyle=e.borderColor;const a=function(t,e,i,s){const{fullCircles:n,startAngle:o,circumference:a}=e;let r=e.endAngle;if(n){Fn(t,e,i,s,o+yt);for(let e=0;e<n;++e)t.fill();isNaN(a)||(r=o+a%yt,a%yt==0&&(r+=yt))}return Fn(t,e,i,s,r),t.fill(),r}(t,this,o,n);Bn(t,this,o,n,a),t.restore()}}function Wn(t,e,i=e){t.lineCap=K(i.borderCapStyle,e.borderCapStyle),t.setLineDash(K(i.borderDash,e.borderDash)),t.lineDashOffset=K(i.borderDashOffset,e.borderDashOffset),t.lineJoin=K(i.borderJoinStyle,e.borderJoinStyle),t.lineWidth=K(i.borderWidth,e.borderWidth),t.strokeStyle=K(i.borderColor,e.borderColor)}function Nn(t,e,i){t.lineTo(i.x,i.y)}function Hn(t,e,i={}){const s=t.length,{start:n=0,end:o=s-1}=i,{start:a,end:r}=e,l=Math.max(n,a),h=Math.min(o,r),c=n<a&&o<a||n>r&&o>r;return{count:s,start:l,loop:e.loop,ilen:h<l&&!c?s+h-l:h-l}}function jn(t,e,i,s){const{points:n,options:o}=e,{count:a,start:r,loop:l,ilen:h}=Hn(n,i,s),c=function(t){return t.stepped?ee:t.tension||"monotone"===t.cubicInterpolationMode?ie:Nn}(o);let d,u,f,{move:g=!0,reverse:p}=s||{};for(d=0;d<=h;++d)u=n[(r+(p?h-d:d))%a],u.skip||(g?(t.moveTo(u.x,u.y),g=!1):c(t,f,u,p,o.stepped),f=u);return l&&(u=n[(r+(p?h:0))%a],c(t,f,u,p,o.stepped)),!!l}function $n(t,e,i,s){const n=e.points,{count:o,start:a,ilen:r}=Hn(n,i,s),{move:l=!0,reverse:h}=s||{};let c,d,u,f,g,p,m=0,x=0;const b=t=>(a+(h?r-t:t))%o,_=()=>{f!==g&&(t.lineTo(m,g),t.lineTo(m,f),t.lineTo(m,p))};for(l&&(d=n[b(0)],t.moveTo(d.x,d.y)),c=0;c<=r;++c){if(d=n[b(c)],d.skip)continue;const e=d.x,i=d.y,s=0|e;s===u?(i<f?f=i:i>g&&(g=i),m=(x*m+e)/++x):(_(),t.lineTo(e,i),u=s,x=0,f=g=i),p=i}_()}function Yn(t){const e=t.options,i=e.borderDash&&e.borderDash.length;return!(t._decimated||t._loop||e.tension||"monotone"===e.cubicInterpolationMode||e.stepped||i)?$n:jn}Vn.id="arc",Vn.defaults={borderAlign:"center",borderColor:"#fff",borderJoinStyle:void 0,borderRadius:0,borderWidth:2,offset:0,spacing:0,angle:void 0},Vn.defaultRoutes={backgroundColor:"backgroundColor"};const Un="function"==typeof Path2D;function Xn(t,e,i,s){Un&&!e.options.segment?function(t,e,i,s){let n=e._path;n||(n=e._path=new Path2D,e.path(n,i,s)&&n.closePath()),Wn(t,e.options),t.stroke(n)}(t,e,i,s):function(t,e,i,s){const{segments:n,options:o}=e,a=Yn(e);for(const r of n)Wn(t,o,r.style),t.beginPath(),a(t,e,r,{start:i,end:i+s-1})&&t.closePath(),t.stroke()}(t,e,i,s)}class qn extends Ds{constructor(t){super(),this.animated=!0,this.options=void 0,this._chart=void 0,this._loop=void 0,this._fullLoop=void 0,this._path=void 0,this._points=void 0,this._segments=void 0,this._decimated=!1,this._pointsUpdated=!1,this._datasetIndex=void 0,t&&Object.assign(this,t)}updateControlPoints(t,e){const i=this.options;if((i.tension||"monotone"===i.cubicInterpolationMode)&&!i.stepped&&!this._pointsUpdated){const s=i.spanGaps?this._loop:this._fullLoop;ki(this._points,i,t,s,e),this._pointsUpdated=!0}}set points(t){this._points=t,delete this._segments,delete this._path,this._pointsUpdated=!1}get points(){return this._points}get segments(){return this._segments||(this._segments=Ni(this,this.options.segment))}first(){const t=this.segments,e=this.points;return t.length&&e[t[0].start]}last(){const t=this.segments,e=this.points,i=t.length;return i&&e[t[i-1].end]}interpolate(t,e){const i=this.options,s=t[e],n=this.points,o=Wi(this,{property:e,start:s,end:s});if(!o.length)return;const a=[],r=function(t){return t.stepped?Ai:t.tension||"monotone"===t.cubicInterpolationMode?Ti:Oi}(i);let l,h;for(l=0,h=o.length;l<h;++l){const{start:h,end:c}=o[l],d=n[h],u=n[c];if(d===u){a.push(d);continue}const f=r(d,u,Math.abs((s-d[e])/(u[e]-d[e])),i.stepped);f[e]=t[e],a.push(f)}return 1===a.length?a[0]:a}pathSegment(t,e,i){return Yn(this)(t,this,e,i)}path(t,e,i){const s=this.segments,n=Yn(this);let o=this._loop;e=e||0,i=i||this.points.length-e;for(const a of s)o&=n(t,this,a,{start:e,end:e+i-1});return!!o}draw(t,e,i,s){const n=this.options||{};(this.points||[]).length&&n.borderWidth&&(t.save(),Xn(t,this,i,s),t.restore()),this.animated&&(this._pointsUpdated=!1,this._path=void 0)}}function Kn(t,e,i,s){const n=t.options,{[i]:o}=t.getProps([i],s);return Math.abs(e-o)<n.radius+n.hitRadius}qn.id="line",qn.defaults={borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",borderWidth:3,capBezierPoints:!0,cubicInterpolationMode:"default",fill:!1,spanGaps:!1,stepped:!1,tension:0},qn.defaultRoutes={backgroundColor:"backgroundColor",borderColor:"borderColor"},qn.descriptors={_scriptable:!0,_indexable:t=>"borderDash"!==t&&"fill"!==t};class Gn extends Ds{constructor(t){super(),this.options=void 0,this.parsed=void 0,this.skip=void 0,this.stop=void 0,t&&Object.assign(this,t)}inRange(t,e,i){const s=this.options,{x:n,y:o}=this.getProps(["x","y"],i);return Math.pow(t-n,2)+Math.pow(e-o,2)<Math.pow(s.hitRadius+s.radius,2)}inXRange(t,e){return Kn(this,t,"x",e)}inYRange(t,e){return Kn(this,t,"y",e)}getCenterPoint(t){const{x:e,y:i}=this.getProps(["x","y"],t);return{x:e,y:i}}size(t){let e=(t=t||this.options||{}).radius||0;e=Math.max(e,e&&t.hoverRadius||0);return 2*(e+(e&&t.borderWidth||0))}draw(t,e){const i=this.options;this.skip||i.radius<.1||!Jt(this,e,this.size(i)/2)||(t.strokeStyle=i.borderColor,t.lineWidth=i.borderWidth,t.fillStyle=i.backgroundColor,Zt(t,i,this.x,this.y))}getRange(){const t=this.options||{};return t.radius+t.hitRadius}}function Zn(t,e){const{x:i,y:s,base:n,width:o,height:a}=t.getProps(["x","y","base","width","height"],e);let r,l,h,c,d;return t.horizontal?(d=a/2,r=Math.min(i,n),l=Math.max(i,n),h=s-d,c=s+d):(d=o/2,r=i-d,l=i+d,h=Math.min(s,n),c=Math.max(s,n)),{left:r,top:h,right:l,bottom:c}}function Jn(t,e,i,s){return t?0:jt(e,i,s)}function Qn(t){const e=Zn(t),i=e.right-e.left,s=e.bottom-e.top,n=function(t,e,i){const s=t.options.borderWidth,n=t.borderSkipped,o=Ve(s);return{t:Jn(n.top,o.top,0,i),r:Jn(n.right,o.right,0,e),b:Jn(n.bottom,o.bottom,0,i),l:Jn(n.left,o.left,0,e)}}(t,i/2,s/2),o=function(t,e,i){const{enableBorderRadius:s}=t.getProps(["enableBorderRadius"]),n=t.options.borderRadius,o=We(n),a=Math.min(e,i),r=t.borderSkipped,l=s||U(n);return{topLeft:Jn(!l||r.top||r.left,o.topLeft,0,a),topRight:Jn(!l||r.top||r.right,o.topRight,0,a),bottomLeft:Jn(!l||r.bottom||r.left,o.bottomLeft,0,a),bottomRight:Jn(!l||r.bottom||r.right,o.bottomRight,0,a)}}(t,i/2,s/2);return{outer:{x:e.left,y:e.top,w:i,h:s,radius:o},inner:{x:e.left+n.l,y:e.top+n.t,w:i-n.l-n.r,h:s-n.t-n.b,radius:{topLeft:Math.max(0,o.topLeft-Math.max(n.t,n.l)),topRight:Math.max(0,o.topRight-Math.max(n.t,n.r)),bottomLeft:Math.max(0,o.bottomLeft-Math.max(n.b,n.l)),bottomRight:Math.max(0,o.bottomRight-Math.max(n.b,n.r))}}}}function to(t,e,i,s){const n=null===e,o=null===i,a=t&&!(n&&o)&&Zn(t,s);return a&&(n||Yt(e,a.left,a.right))&&(o||Yt(i,a.top,a.bottom))}function eo(t,e){t.rect(e.x,e.y,e.w,e.h)}function io(t,e,i={}){const s=t.x!==i.x?-e:0,n=t.y!==i.y?-e:0,o=(t.x+t.w!==i.x+i.w?e:0)-s,a=(t.y+t.h!==i.y+i.h?e:0)-n;return{x:t.x+s,y:t.y+n,w:t.w+o,h:t.h+a,radius:t.radius}}Gn.id="point",Gn.defaults={borderWidth:1,hitRadius:1,hoverBorderWidth:1,hoverRadius:4,pointStyle:"circle",radius:3,rotation:0},Gn.defaultRoutes={backgroundColor:"backgroundColor",borderColor:"borderColor"};class so extends Ds{constructor(t){super(),this.options=void 0,this.horizontal=void 0,this.base=void 0,this.width=void 0,this.height=void 0,this.inflateAmount=void 0,t&&Object.assign(this,t)}draw(t){const{inflateAmount:e,options:{borderColor:i,backgroundColor:s}}=this,{inner:n,outer:o}=Qn(this),a=(r=o.radius).topLeft||r.topRight||r.bottomLeft||r.bottomRight?oe:eo;var r;t.save(),o.w===n.w&&o.h===n.h||(t.beginPath(),a(t,io(o,e,n)),t.clip(),a(t,io(n,-e,o)),t.fillStyle=i,t.fill("evenodd")),t.beginPath(),a(t,io(n,e)),t.fillStyle=s,t.fill(),t.restore()}inRange(t,e,i){return to(this,t,e,i)}inXRange(t,e){return to(this,t,null,e)}inYRange(t,e){return to(this,null,t,e)}getCenterPoint(t){const{x:e,y:i,base:s,horizontal:n}=this.getProps(["x","y","base","horizontal"],t);return{x:n?(e+s)/2:e,y:n?i:(i+s)/2}}getRange(t){return"x"===t?this.width/2:this.height/2}}so.id="bar",so.defaults={borderSkipped:"start",borderWidth:0,borderRadius:0,inflateAmount:"auto",pointStyle:void 0},so.defaultRoutes={backgroundColor:"backgroundColor",borderColor:"borderColor"};var no=Object.freeze({__proto__:null,ArcElement:Vn,LineElement:qn,PointElement:Gn,BarElement:so});function oo(t){if(t._decimated){const e=t._data;delete t._decimated,delete t._data,Object.defineProperty(t,"data",{value:e})}}function ao(t){t.data.datasets.forEach((t=>{oo(t)}))}var ro={id:"decimation",defaults:{algorithm:"min-max",enabled:!1},beforeElementsUpdate:(t,e,i)=>{if(!i.enabled)return void ao(t);const s=t.width;t.data.datasets.forEach(((e,n)=>{const{_data:o,indexAxis:a}=e,r=t.getDatasetMeta(n),l=o||e.data;if("y"===je([a,t.options.indexAxis]))return;if("line"!==r.type)return;const h=t.scales[r.xAxisID];if("linear"!==h.type&&"time"!==h.type)return;if(t.options.parsing)return;let{start:c,count:d}=function(t,e){const i=e.length;let s,n=0;const{iScale:o}=t,{min:a,max:r,minDefined:l,maxDefined:h}=o.getUserBounds();return l&&(n=jt(re(e,o.axis,a).lo,0,i-1)),s=h?jt(re(e,o.axis,r).hi+1,n,i)-n:i-n,{start:n,count:s}}(r,l);if(d<=(i.threshold||4*s))return void oo(e);let u;switch($(o)&&(e._data=l,delete e.data,Object.defineProperty(e,"data",{configurable:!0,enumerable:!0,get:function(){return this._decimated},set:function(t){this._data=t}})),i.algorithm){case"lttb":u=function(t,e,i,s,n){const o=n.samples||s;if(o>=i)return t.slice(e,e+i);const a=[],r=(i-2)/(o-2);let l=0;const h=e+i-1;let c,d,u,f,g,p=e;for(a[l++]=t[p],c=0;c<o-2;c++){let s,n=0,o=0;const h=Math.floor((c+1)*r)+1+e,m=Math.min(Math.floor((c+2)*r)+1,i)+e,x=m-h;for(s=h;s<m;s++)n+=t[s].x,o+=t[s].y;n/=x,o/=x;const b=Math.floor(c*r)+1+e,_=Math.min(Math.floor((c+1)*r)+1,i)+e,{x:y,y:v}=t[p];for(u=f=-1,s=b;s<_;s++)f=.5*Math.abs((y-n)*(t[s].y-v)-(y-t[s].x)*(o-v)),f>u&&(u=f,d=t[s],g=s);a[l++]=d,p=g}return a[l++]=t[h],a}(l,c,d,s,i);break;case"min-max":u=function(t,e,i,s){let n,o,a,r,l,h,c,d,u,f,g=0,p=0;const m=[],x=e+i-1,b=t[e].x,_=t[x].x-b;for(n=e;n<e+i;++n){o=t[n],a=(o.x-b)/_*s,r=o.y;const e=0|a;if(e===l)r<u?(u=r,h=n):r>f&&(f=r,c=n),g=(p*g+o.x)/++p;else{const i=n-1;if(!$(h)&&!$(c)){const e=Math.min(h,c),s=Math.max(h,c);e!==d&&e!==i&&m.push({...t[e],x:g}),s!==d&&s!==i&&m.push({...t[s],x:g})}n>0&&i!==d&&m.push(t[i]),m.push(o),l=e,p=0,u=f=r,h=c=d=n}}return m}(l,c,d,s);break;default:throw new Error(`Unsupported decimation algorithm '${i.algorithm}'`)}e._decimated=u}))},destroy(t){ao(t)}};function lo(t,e,i){const s=function(t){const e=t.options,i=e.fill;let s=K(i&&i.target,i);return void 0===s&&(s=!!e.backgroundColor),!1!==s&&null!==s&&(!0===s?"origin":s)}(t);if(U(s))return!isNaN(s.value)&&s;let n=parseFloat(s);return X(n)&&Math.floor(n)===n?("-"!==s[0]&&"+"!==s[0]||(n=e+n),!(n===e||n<0||n>=i)&&n):["origin","start","end","stack","shape"].indexOf(s)>=0&&s}class ho{constructor(t){this.x=t.x,this.y=t.y,this.radius=t.radius}pathSegment(t,e,i){const{x:s,y:n,radius:o}=this;return e=e||{start:0,end:yt},t.arc(s,n,o,e.end,e.start,!0),!i.bounds}interpolate(t){const{x:e,y:i,radius:s}=this,n=t.angle;return{x:e+Math.cos(n)*s,y:i+Math.sin(n)*s,angle:n}}}function co(t){return(t.scale||{}).getPointPositionForValue?function(t){const{scale:e,fill:i}=t,s=e.options,n=e.getLabels().length,o=[],a=s.reverse?e.max:e.min,r=s.reverse?e.min:e.max;let l,h,c;if(c="start"===i?a:"end"===i?r:U(i)?i.value:e.getBaseValue(),s.grid.circular)return h=e.getPointPositionForValue(0,a),new ho({x:h.x,y:h.y,radius:e.getDistanceFromCenterForValue(c)});for(l=0;l<n;++l)o.push(e.getPointPositionForValue(l,c));return o}(t):function(t){const{scale:e={},fill:i}=t;let s,n=null;return"start"===i?n=e.bottom:"end"===i?n=e.top:U(i)?n=e.getPixelForValue(i.value):e.getBasePixel&&(n=e.getBasePixel()),X(n)?(s=e.isHorizontal(),{x:s?n:null,y:s?null:n}):null}(t)}function uo(t,e,i){for(;e>t;e--){const t=i[e];if(!isNaN(t.x)&&!isNaN(t.y))break}return e}function fo(t,e,i){const s=[];for(let n=0;n<i.length;n++){const o=i[n],{first:a,last:r,point:l}=go(o,e,"x");if(!(!l||a&&r))if(a)s.unshift(l);else if(t.push(l),!r)break}t.push(...s)}function go(t,e,i){const s=t.interpolate(e,i);if(!s)return{};const n=s[i],o=t.segments,a=t.points;let r=!1,l=!1;for(let t=0;t<o.length;t++){const e=o[t],s=a[e.start][i],h=a[e.end][i];if(Yt(n,s,h)){r=n===s,l=n===h;break}}return{first:r,last:l,point:s}}function po(t){const{chart:e,fill:i,line:s}=t;if(X(i))return function(t,e){const i=t.getDatasetMeta(e);return i&&t.isDatasetVisible(e)?i.dataset:null}(e,i);if("stack"===i)return function(t){const{scale:e,index:i,line:s}=t,n=[],o=s.segments,a=s.points,r=function(t,e){const i=[],s=t.getMatchingVisibleMetas("line");for(let t=0;t<s.length;t++){const n=s[t];if(n.index===e)break;n.hidden||i.unshift(n.dataset)}return i}(e,i);r.push(mo({x:null,y:e.bottom},s));for(let t=0;t<o.length;t++){const e=o[t];for(let t=e.start;t<=e.end;t++)fo(n,a[t],r)}return new qn({points:n,options:{}})}(t);if("shape"===i)return!0;const n=co(t);return n instanceof ho?n:mo(n,s)}function mo(t,e){let i=[],s=!1;return Y(t)?(s=!0,i=t):i=function(t,e){const{x:i=null,y:s=null}=t||{},n=e.points,o=[];return e.segments.forEach((({start:t,end:e})=>{e=uo(t,e,n);const a=n[t],r=n[e];null!==s?(o.push({x:a.x,y:s}),o.push({x:r.x,y:s})):null!==i&&(o.push({x:i,y:a.y}),o.push({x:i,y:r.y}))})),o}(t,e),i.length?new qn({points:i,options:{tension:0},_loop:s,_fullLoop:s}):null}function xo(t,e,i){let s=t[e].fill;const n=[e];let o;if(!i)return s;for(;!1!==s&&-1===n.indexOf(s);){if(!X(s))return s;if(o=t[s],!o)return!1;if(o.visible)return s;n.push(s),s=o.fill}return!1}function bo(t,e,i){const{segments:s,points:n}=e;let o=!0,a=!1;t.beginPath();for(const r of s){const{start:s,end:l}=r,h=n[s],c=n[uo(s,l,n)];o?(t.moveTo(h.x,h.y),o=!1):(t.lineTo(h.x,i),t.lineTo(h.x,h.y)),a=!!e.pathSegment(t,r,{move:a}),a?t.closePath():t.lineTo(c.x,i)}t.lineTo(e.first().x,i),t.closePath(),t.clip()}function _o(t,e,i,s){if(s)return;let n=e[t],o=i[t];return"angle"===t&&(n=Nt(n),o=Nt(o)),{property:t,start:n,end:o}}function yo(t,e,i,s){return t&&e?s(t[i],e[i]):t?t[i]:e?e[i]:0}function vo(t,e,i){const{top:s,bottom:n}=e.chart.chartArea,{property:o,start:a,end:r}=i||{};"x"===o&&(t.beginPath(),t.rect(a,s,r-a,n-s),t.clip())}function wo(t,e,i,s){const n=e.interpolate(i,s);n&&t.lineTo(n.x,n.y)}function Mo(t,e){const{line:i,target:s,property:n,color:o,scale:a}=e,r=function(t,e,i){const s=t.segments,n=t.points,o=e.points,a=[];for(const t of s){let{start:s,end:r}=t;r=uo(s,r,n);const l=_o(i,n[s],n[r],t.loop);if(!e.segments){a.push({source:t,target:l,start:n[s],end:n[r]});continue}const h=Wi(e,l);for(const e of h){const s=_o(i,o[e.start],o[e.end],e.loop),r=Vi(t,n,s);for(const t of r)a.push({source:t,target:e,start:{[i]:yo(l,s,"start",Math.max)},end:{[i]:yo(l,s,"end",Math.min)}})}}return a}(i,s,n);for(const{source:e,target:l,start:h,end:c}of r){const{style:{backgroundColor:r=o}={}}=e,d=!0!==s;t.save(),t.fillStyle=r,vo(t,a,d&&_o(n,h,c)),t.beginPath();const u=!!i.pathSegment(t,e);let f;if(d){u?t.closePath():wo(t,s,c,n);const e=!!s.pathSegment(t,l,{move:u,reverse:!0});f=u&&e,f||wo(t,s,h,n)}t.closePath(),t.fill(f?"evenodd":"nonzero"),t.restore()}}function ko(t,e,i){const s=po(e),{line:n,scale:o,axis:a}=e,r=n.options,l=r.fill,h=r.backgroundColor,{above:c=h,below:d=h}=l||{};s&&n.points.length&&(Qt(t,i),function(t,e){const{line:i,target:s,above:n,below:o,area:a,scale:r}=e,l=i._loop?"angle":e.axis;t.save(),"x"===l&&o!==n&&(bo(t,s,a.top),Mo(t,{line:i,target:s,color:n,scale:r,property:l}),t.restore(),t.save(),bo(t,s,a.bottom)),Mo(t,{line:i,target:s,color:o,scale:r,property:l}),t.restore()}(t,{line:n,target:s,above:c,below:d,area:i,scale:o,axis:a}),te(t))}var So={id:"filler",afterDatasetsUpdate(t,e,i){const s=(t.data.datasets||[]).length,n=[];let o,a,r,l;for(a=0;a<s;++a)o=t.getDatasetMeta(a),r=o.dataset,l=null,r&&r.options&&r instanceof qn&&(l={visible:t.isDatasetVisible(a),index:a,fill:lo(r,a,s),chart:t,axis:o.controller.options.indexAxis,scale:o.vScale,line:r}),o.$filler=l,n.push(l);for(a=0;a<s;++a)l=n[a],l&&!1!==l.fill&&(l.fill=xo(n,a,i.propagate))},beforeDraw(t,e,i){const s="beforeDraw"===i.drawTime,n=t.getSortedVisibleDatasetMetas(),o=t.chartArea;for(let e=n.length-1;e>=0;--e){const i=n[e].$filler;i&&(i.line.updateControlPoints(o,i.axis),s&&ko(t.ctx,i,o))}},beforeDatasetsDraw(t,e,i){if("beforeDatasetsDraw"!==i.drawTime)return;const s=t.getSortedVisibleDatasetMetas();for(let e=s.length-1;e>=0;--e){const i=s[e].$filler;i&&ko(t.ctx,i,t.chartArea)}},beforeDatasetDraw(t,e,i){const s=e.meta.$filler;s&&!1!==s.fill&&"beforeDatasetDraw"===i.drawTime&&ko(t.ctx,s,t.chartArea)},defaults:{propagate:!0,drawTime:"beforeDatasetDraw"}};const Po=(t,e)=>{let{boxHeight:i=e,boxWidth:s=e}=t;return t.usePointStyle&&(i=Math.min(i,e),s=Math.min(s,e)),{boxWidth:s,boxHeight:i,itemHeight:Math.max(e,i)}};class Do extends Ds{constructor(t){super(),this._added=!1,this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1,this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this.legendItems=void 0,this.columnSizes=void 0,this.lineWidths=void 0,this.maxHeight=void 0,this.maxWidth=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.height=void 0,this.width=void 0,this._margins=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e,i){this.maxWidth=t,this.maxHeight=e,this._margins=i,this.setDimensions(),this.buildLabels(),this.fit()}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=this._margins.left,this.right=this.width):(this.height=this.maxHeight,this.top=this._margins.top,this.bottom=this.height)}buildLabels(){const t=this.options.labels||{};let e=J(t.generateLabels,[this.chart],this)||[];t.filter&&(e=e.filter((e=>t.filter(e,this.chart.data)))),t.sort&&(e=e.sort(((e,i)=>t.sort(e,i,this.chart.data)))),this.options.reverse&&e.reverse(),this.legendItems=e}fit(){const{options:t,ctx:e}=this;if(!t.display)return void(this.width=this.height=0);const i=t.labels,s=He(i.font),n=s.size,o=this._computeTitleHeight(),{boxWidth:a,itemHeight:r}=Po(i,n);let l,h;e.font=s.string,this.isHorizontal()?(l=this.maxWidth,h=this._fitRows(o,n,a,r)+10):(h=this.maxHeight,l=this._fitCols(o,n,a,r)+10),this.width=Math.min(l,t.maxWidth||this.maxWidth),this.height=Math.min(h,t.maxHeight||this.maxHeight)}_fitRows(t,e,i,s){const{ctx:n,maxWidth:o,options:{labels:{padding:a}}}=this,r=this.legendHitBoxes=[],l=this.lineWidths=[0],h=s+a;let c=t;n.textAlign="left",n.textBaseline="middle";let d=-1,u=-h;return this.legendItems.forEach(((t,f)=>{const g=i+e/2+n.measureText(t.text).width;(0===f||l[l.length-1]+g+2*a>o)&&(c+=h,l[l.length-(f>0?0:1)]=0,u+=h,d++),r[f]={left:0,top:u,row:d,width:g,height:s},l[l.length-1]+=g+a})),c}_fitCols(t,e,i,s){const{ctx:n,maxHeight:o,options:{labels:{padding:a}}}=this,r=this.legendHitBoxes=[],l=this.columnSizes=[],h=o-t;let c=a,d=0,u=0,f=0,g=0;return this.legendItems.forEach(((t,o)=>{const p=i+e/2+n.measureText(t.text).width;o>0&&u+s+2*a>h&&(c+=d+a,l.push({width:d,height:u}),f+=d+a,g++,d=u=0),r[o]={left:f,top:u,col:g,width:p,height:s},d=Math.max(d,p),u+=s+a})),c+=d,l.push({width:d,height:u}),c}adjustHitBoxes(){if(!this.options.display)return;const t=this._computeTitleHeight(),{legendHitBoxes:e,options:{align:i,labels:{padding:s},rtl:o}}=this,a=Ei(o,this.left,this.width);if(this.isHorizontal()){let o=0,r=n(i,this.left+s,this.right-this.lineWidths[o]);for(const l of e)o!==l.row&&(o=l.row,r=n(i,this.left+s,this.right-this.lineWidths[o])),l.top+=this.top+t+s,l.left=a.leftForLtr(a.x(r),l.width),r+=l.width+s}else{let o=0,r=n(i,this.top+t+s,this.bottom-this.columnSizes[o].height);for(const l of e)l.col!==o&&(o=l.col,r=n(i,this.top+t+s,this.bottom-this.columnSizes[o].height)),l.top=r,l.left+=this.left+s,l.left=a.leftForLtr(a.x(l.left),l.width),r+=l.height+s}}isHorizontal(){return"top"===this.options.position||"bottom"===this.options.position}draw(){if(this.options.display){const t=this.ctx;Qt(t,this),this._draw(),te(t)}}_draw(){const{options:t,columnSizes:e,lineWidths:i,ctx:s}=this,{align:a,labels:r}=t,l=bt.color,h=Ei(t.rtl,this.left,this.width),c=He(r.font),{color:d,padding:u}=r,f=c.size,g=f/2;let p;this.drawTitle(),s.textAlign=h.textAlign("left"),s.textBaseline="middle",s.lineWidth=.5,s.font=c.string;const{boxWidth:m,boxHeight:x,itemHeight:b}=Po(r,f),_=this.isHorizontal(),y=this._computeTitleHeight();p=_?{x:n(a,this.left+u,this.right-i[0]),y:this.top+u+y,line:0}:{x:this.left+u,y:n(a,this.top+y+u,this.bottom-e[0].height),line:0},Ii(this.ctx,t.textDirection);const v=b+u;this.legendItems.forEach(((w,M)=>{s.strokeStyle=w.fontColor||d,s.fillStyle=w.fontColor||d;const k=s.measureText(w.text).width,S=h.textAlign(w.textAlign||(w.textAlign=r.textAlign)),P=m+g+k;let D=p.x,C=p.y;h.setWidth(this.width),_?M>0&&D+P+u>this.right&&(C=p.y+=v,p.line++,D=p.x=n(a,this.left+u,this.right-i[p.line])):M>0&&C+v>this.bottom&&(D=p.x=D+e[p.line].width+u,p.line++,C=p.y=n(a,this.top+y+u,this.bottom-e[p.line].height));!function(t,e,i){if(isNaN(m)||m<=0||isNaN(x)||x<0)return;s.save();const n=K(i.lineWidth,1);if(s.fillStyle=K(i.fillStyle,l),s.lineCap=K(i.lineCap,"butt"),s.lineDashOffset=K(i.lineDashOffset,0),s.lineJoin=K(i.lineJoin,"miter"),s.lineWidth=n,s.strokeStyle=K(i.strokeStyle,l),s.setLineDash(K(i.lineDash,[])),r.usePointStyle){const o={radius:m*Math.SQRT2/2,pointStyle:i.pointStyle,rotation:i.rotation,borderWidth:n},a=h.xPlus(t,m/2);Zt(s,o,a,e+g)}else{const o=e+Math.max((f-x)/2,0),a=h.leftForLtr(t,m),r=We(i.borderRadius);s.beginPath(),Object.values(r).some((t=>0!==t))?oe(s,{x:a,y:o,w:m,h:x,radius:r}):s.rect(a,o,m,x),s.fill(),0!==n&&s.stroke()}s.restore()}(h.x(D),C,w),D=o(S,D+m+g,_?D+P:this.right,t.rtl),function(t,e,i){se(s,i.text,t,e+b/2,c,{strikethrough:i.hidden,textAlign:h.textAlign(i.textAlign)})}(h.x(D),C,w),_?p.x+=P+u:p.y+=v})),zi(this.ctx,t.textDirection)}drawTitle(){const t=this.options,e=t.title,i=He(e.font),o=Ne(e.padding);if(!e.display)return;const a=Ei(t.rtl,this.left,this.width),r=this.ctx,l=e.position,h=i.size/2,c=o.top+h;let d,u=this.left,f=this.width;if(this.isHorizontal())f=Math.max(...this.lineWidths),d=this.top+c,u=n(t.align,u,this.right-f);else{const e=this.columnSizes.reduce(((t,e)=>Math.max(t,e.height)),0);d=c+n(t.align,this.top,this.bottom-e-t.labels.padding-this._computeTitleHeight())}const g=n(l,u,u+f);r.textAlign=a.textAlign(s(l)),r.textBaseline="middle",r.strokeStyle=e.color,r.fillStyle=e.color,r.font=i.string,se(r,e.text,g,d,i)}_computeTitleHeight(){const t=this.options.title,e=He(t.font),i=Ne(t.padding);return t.display?e.lineHeight+i.height:0}_getLegendItemAt(t,e){let i,s,n;if(Yt(t,this.left,this.right)&&Yt(e,this.top,this.bottom))for(n=this.legendHitBoxes,i=0;i<n.length;++i)if(s=n[i],Yt(t,s.left,s.left+s.width)&&Yt(e,s.top,s.top+s.height))return this.legendItems[i];return null}handleEvent(t){const e=this.options;if(!function(t,e){if("mousemove"===t&&(e.onHover||e.onLeave))return!0;if(e.onClick&&("click"===t||"mouseup"===t))return!0;return!1}(t.type,e))return;const i=this._getLegendItemAt(t.x,t.y);if("mousemove"===t.type){const o=this._hoveredItem,a=(n=i,null!==(s=o)&&null!==n&&s.datasetIndex===n.datasetIndex&&s.index===n.index);o&&!a&&J(e.onLeave,[t,o,this],this),this._hoveredItem=i,i&&!a&&J(e.onHover,[t,i,this],this)}else i&&J(e.onClick,[t,i,this],this);var s,n}}var Co={id:"legend",_element:Do,start(t,e,i){const s=t.legend=new Do({ctx:t.ctx,options:i,chart:t});ni.configure(t,s,i),ni.addBox(t,s)},stop(t){ni.removeBox(t,t.legend),delete t.legend},beforeUpdate(t,e,i){const s=t.legend;ni.configure(t,s,i),s.options=i},afterUpdate(t){const e=t.legend;e.buildLabels(),e.adjustHitBoxes()},afterEvent(t,e){e.replay||t.legend.handleEvent(e.event)},defaults:{display:!0,position:"top",align:"center",fullSize:!0,reverse:!1,weight:1e3,onClick(t,e,i){const s=e.datasetIndex,n=i.chart;n.isDatasetVisible(s)?(n.hide(s),e.hidden=!0):(n.show(s),e.hidden=!1)},onHover:null,onLeave:null,labels:{color:t=>t.chart.options.color,boxWidth:40,padding:10,generateLabels(t){const e=t.data.datasets,{labels:{usePointStyle:i,pointStyle:s,textAlign:n,color:o}}=t.legend.options;return t._getSortedDatasetMetas().map((t=>{const a=t.controller.getStyle(i?0:void 0),r=Ne(a.borderWidth);return{text:e[t.index].label,fillStyle:a.backgroundColor,fontColor:o,hidden:!t.visible,lineCap:a.borderCapStyle,lineDash:a.borderDash,lineDashOffset:a.borderDashOffset,lineJoin:a.borderJoinStyle,lineWidth:(r.width+r.height)/4,strokeStyle:a.borderColor,pointStyle:s||a.pointStyle,rotation:a.rotation,textAlign:n||a.textAlign,borderRadius:0,datasetIndex:t.index}}),this)}},title:{color:t=>t.chart.options.color,display:!1,position:"center",text:""}},descriptors:{_scriptable:t=>!t.startsWith("on"),labels:{_scriptable:t=>!["generateLabels","filter","sort"].includes(t)}}};class Oo extends Ds{constructor(t){super(),this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this._padding=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e){const i=this.options;if(this.left=0,this.top=0,!i.display)return void(this.width=this.height=this.right=this.bottom=0);this.width=this.right=t,this.height=this.bottom=e;const s=Y(i.text)?i.text.length:1;this._padding=Ne(i.padding);const n=s*He(i.font).lineHeight+this._padding.height;this.isHorizontal()?this.height=n:this.width=n}isHorizontal(){const t=this.options.position;return"top"===t||"bottom"===t}_drawArgs(t){const{top:e,left:i,bottom:s,right:o,options:a}=this,r=a.align;let l,h,c,d=0;return this.isHorizontal()?(h=n(r,i,o),c=e+t,l=o-i):("left"===a.position?(h=i+t,c=n(r,s,e),d=-.5*_t):(h=o-t,c=n(r,e,s),d=.5*_t),l=s-e),{titleX:h,titleY:c,maxWidth:l,rotation:d}}draw(){const t=this.ctx,e=this.options;if(!e.display)return;const i=He(e.font),n=i.lineHeight/2+this._padding.top,{titleX:o,titleY:a,maxWidth:r,rotation:l}=this._drawArgs(n);se(t,e.text,0,0,i,{color:e.color,maxWidth:r,rotation:l,textAlign:s(e.align),textBaseline:"middle",translation:[o,a]})}}var Ao={id:"title",_element:Oo,start(t,e,i){!function(t,e){const i=new Oo({ctx:t.ctx,options:e,chart:t});ni.configure(t,i,e),ni.addBox(t,i),t.titleBlock=i}(t,i)},stop(t){const e=t.titleBlock;ni.removeBox(t,e),delete t.titleBlock},beforeUpdate(t,e,i){const s=t.titleBlock;ni.configure(t,s,i),s.options=i},defaults:{align:"center",display:!1,font:{weight:"bold"},fullSize:!0,padding:10,position:"top",text:"",weight:2e3},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}};const To=new WeakMap;var Lo={id:"subtitle",start(t,e,i){const s=new Oo({ctx:t.ctx,options:i,chart:t});ni.configure(t,s,i),ni.addBox(t,s),To.set(t,s)},stop(t){ni.removeBox(t,To.get(t)),To.delete(t)},beforeUpdate(t,e,i){const s=To.get(t);ni.configure(t,s,i),s.options=i},defaults:{align:"center",display:!1,font:{weight:"normal"},fullSize:!0,padding:0,position:"top",text:"",weight:1500},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}};const Ro={average(t){if(!t.length)return!1;let e,i,s=0,n=0,o=0;for(e=0,i=t.length;e<i;++e){const i=t[e].element;if(i&&i.hasValue()){const t=i.tooltipPosition();s+=t.x,n+=t.y,++o}}return{x:s/o,y:n/o}},nearest(t,e){if(!t.length)return!1;let i,s,n,o=e.x,a=e.y,r=Number.POSITIVE_INFINITY;for(i=0,s=t.length;i<s;++i){const s=t[i].element;if(s&&s.hasValue()){const t=Vt(e,s.getCenterPoint());t<r&&(r=t,n=s)}}if(n){const t=n.tooltipPosition();o=t.x,a=t.y}return{x:o,y:a}}};function Eo(t,e){return e&&(Y(e)?Array.prototype.push.apply(t,e):t.push(e)),t}function Io(t){return("string"==typeof t||t instanceof String)&&t.indexOf("\n")>-1?t.split("\n"):t}function zo(t,e){const{element:i,datasetIndex:s,index:n}=e,o=t.getDatasetMeta(s).controller,{label:a,value:r}=o.getLabelAndValue(n);return{chart:t,label:a,parsed:o.getParsed(n),raw:t.data.datasets[s].data[n],formattedValue:r,dataset:o.getDataset(),dataIndex:n,datasetIndex:s,element:i}}function Fo(t,e){const i=t.chart.ctx,{body:s,footer:n,title:o}=t,{boxWidth:a,boxHeight:r}=e,l=He(e.bodyFont),h=He(e.titleFont),c=He(e.footerFont),d=o.length,u=n.length,f=s.length,g=Ne(e.padding);let p=g.height,m=0,x=s.reduce(((t,e)=>t+e.before.length+e.lines.length+e.after.length),0);if(x+=t.beforeBody.length+t.afterBody.length,d&&(p+=d*h.lineHeight+(d-1)*e.titleSpacing+e.titleMarginBottom),x){p+=f*(e.displayColors?Math.max(r,l.lineHeight):l.lineHeight)+(x-f)*l.lineHeight+(x-1)*e.bodySpacing}u&&(p+=e.footerMarginTop+u*c.lineHeight+(u-1)*e.footerSpacing);let b=0;const _=function(t){m=Math.max(m,i.measureText(t).width+b)};return i.save(),i.font=h.string,Q(t.title,_),i.font=l.string,Q(t.beforeBody.concat(t.afterBody),_),b=e.displayColors?a+2+e.boxPadding:0,Q(s,(t=>{Q(t.before,_),Q(t.lines,_),Q(t.after,_)})),b=0,i.font=c.string,Q(t.footer,_),i.restore(),m+=g.width,{width:m,height:p}}function Bo(t,e,i,s){const{x:n,width:o}=i,{width:a,chartArea:{left:r,right:l}}=t;let h="center";return"center"===s?h=n<=(r+l)/2?"left":"right":n<=o/2?h="left":n>=a-o/2&&(h="right"),function(t,e,i,s){const{x:n,width:o}=s,a=i.caretSize+i.caretPadding;return"left"===t&&n+o+a>e.width||"right"===t&&n-o-a<0||void 0}(h,t,e,i)&&(h="center"),h}function Vo(t,e,i){const s=i.yAlign||e.yAlign||function(t,e){const{y:i,height:s}=e;return i<s/2?"top":i>t.height-s/2?"bottom":"center"}(t,i);return{xAlign:i.xAlign||e.xAlign||Bo(t,e,i,s),yAlign:s}}function Wo(t,e,i,s){const{caretSize:n,caretPadding:o,cornerRadius:a}=t,{xAlign:r,yAlign:l}=i,h=n+o,{topLeft:c,topRight:d,bottomLeft:u,bottomRight:f}=We(a);let g=function(t,e){let{x:i,width:s}=t;return"right"===e?i-=s:"center"===e&&(i-=s/2),i}(e,r);const p=function(t,e,i){let{y:s,height:n}=t;return"top"===e?s+=i:s-="bottom"===e?n+i:n/2,s}(e,l,h);return"center"===l?"left"===r?g+=h:"right"===r&&(g-=h):"left"===r?g-=Math.max(c,u)+n:"right"===r&&(g+=Math.max(d,f)+n),{x:jt(g,0,s.width-e.width),y:jt(p,0,s.height-e.height)}}function No(t,e,i){const s=Ne(i.padding);return"center"===e?t.x+t.width/2:"right"===e?t.x+t.width-s.right:t.x+s.left}function Ho(t){return Eo([],Io(t))}function jo(t,e){const i=e&&e.dataset&&e.dataset.tooltip&&e.dataset.tooltip.callbacks;return i?t.override(i):t}class $o extends Ds{constructor(t){super(),this.opacity=0,this._active=[],this._eventPosition=void 0,this._size=void 0,this._cachedAnimations=void 0,this._tooltipItems=[],this.$animations=void 0,this.$context=void 0,this.chart=t.chart||t._chart,this._chart=this.chart,this.options=t.options,this.dataPoints=void 0,this.title=void 0,this.beforeBody=void 0,this.body=void 0,this.afterBody=void 0,this.footer=void 0,this.xAlign=void 0,this.yAlign=void 0,this.x=void 0,this.y=void 0,this.height=void 0,this.width=void 0,this.caretX=void 0,this.caretY=void 0,this.labelColors=void 0,this.labelPointStyles=void 0,this.labelTextColors=void 0}initialize(t){this.options=t,this._cachedAnimations=void 0,this.$context=void 0}_resolveAnimations(){const t=this._cachedAnimations;if(t)return t;const e=this.chart,i=this.options.setContext(this.getContext()),s=i.enabled&&e.options.animation&&i.animations,n=new gs(this.chart,s);return s._cacheable&&(this._cachedAnimations=Object.freeze(n)),n}getContext(){return this.$context||(this.$context=(t=this.chart.getContext(),e=this,i=this._tooltipItems,Ye(t,{tooltip:e,tooltipItems:i,type:"tooltip"})));var t,e,i}getTitle(t,e){const{callbacks:i}=e,s=i.beforeTitle.apply(this,[t]),n=i.title.apply(this,[t]),o=i.afterTitle.apply(this,[t]);let a=[];return a=Eo(a,Io(s)),a=Eo(a,Io(n)),a=Eo(a,Io(o)),a}getBeforeBody(t,e){return Ho(e.callbacks.beforeBody.apply(this,[t]))}getBody(t,e){const{callbacks:i}=e,s=[];return Q(t,(t=>{const e={before:[],lines:[],after:[]},n=jo(i,t);Eo(e.before,Io(n.beforeLabel.call(this,t))),Eo(e.lines,n.label.call(this,t)),Eo(e.after,Io(n.afterLabel.call(this,t))),s.push(e)})),s}getAfterBody(t,e){return Ho(e.callbacks.afterBody.apply(this,[t]))}getFooter(t,e){const{callbacks:i}=e,s=i.beforeFooter.apply(this,[t]),n=i.footer.apply(this,[t]),o=i.afterFooter.apply(this,[t]);let a=[];return a=Eo(a,Io(s)),a=Eo(a,Io(n)),a=Eo(a,Io(o)),a}_createItems(t){const e=this._active,i=this.chart.data,s=[],n=[],o=[];let a,r,l=[];for(a=0,r=e.length;a<r;++a)l.push(zo(this.chart,e[a]));return t.filter&&(l=l.filter(((e,s,n)=>t.filter(e,s,n,i)))),t.itemSort&&(l=l.sort(((e,s)=>t.itemSort(e,s,i)))),Q(l,(e=>{const i=jo(t.callbacks,e);s.push(i.labelColor.call(this,e)),n.push(i.labelPointStyle.call(this,e)),o.push(i.labelTextColor.call(this,e))})),this.labelColors=s,this.labelPointStyles=n,this.labelTextColors=o,this.dataPoints=l,l}update(t,e){const i=this.options.setContext(this.getContext()),s=this._active;let n,o=[];if(s.length){const t=Ro[i.position].call(this,s,this._eventPosition);o=this._createItems(i),this.title=this.getTitle(o,i),this.beforeBody=this.getBeforeBody(o,i),this.body=this.getBody(o,i),this.afterBody=this.getAfterBody(o,i),this.footer=this.getFooter(o,i);const e=this._size=Fo(this,i),a=Object.assign({},t,e),r=Vo(this.chart,i,a),l=Wo(i,a,r,this.chart);this.xAlign=r.xAlign,this.yAlign=r.yAlign,n={opacity:1,x:l.x,y:l.y,width:e.width,height:e.height,caretX:t.x,caretY:t.y}}else 0!==this.opacity&&(n={opacity:0});this._tooltipItems=o,this.$context=void 0,n&&this._resolveAnimations().update(this,n),t&&i.external&&i.external.call(this,{chart:this.chart,tooltip:this,replay:e})}drawCaret(t,e,i,s){const n=this.getCaretPosition(t,i,s);e.lineTo(n.x1,n.y1),e.lineTo(n.x2,n.y2),e.lineTo(n.x3,n.y3)}getCaretPosition(t,e,i){const{xAlign:s,yAlign:n}=this,{caretSize:o,cornerRadius:a}=i,{topLeft:r,topRight:l,bottomLeft:h,bottomRight:c}=We(a),{x:d,y:u}=t,{width:f,height:g}=e;let p,m,x,b,_,y;return"center"===n?(_=u+g/2,"left"===s?(p=d,m=p-o,b=_+o,y=_-o):(p=d+f,m=p+o,b=_-o,y=_+o),x=p):(m="left"===s?d+Math.max(r,h)+o:"right"===s?d+f-Math.max(l,c)-o:this.caretX,"top"===n?(b=u,_=b-o,p=m-o,x=m+o):(b=u+g,_=b+o,p=m+o,x=m-o),y=b),{x1:p,x2:m,x3:x,y1:b,y2:_,y3:y}}drawTitle(t,e,i){const s=this.title,n=s.length;let o,a,r;if(n){const l=Ei(i.rtl,this.x,this.width);for(t.x=No(this,i.titleAlign,i),e.textAlign=l.textAlign(i.titleAlign),e.textBaseline="middle",o=He(i.titleFont),a=i.titleSpacing,e.fillStyle=i.titleColor,e.font=o.string,r=0;r<n;++r)e.fillText(s[r],l.x(t.x),t.y+o.lineHeight/2),t.y+=o.lineHeight+a,r+1===n&&(t.y+=i.titleMarginBottom-a)}}_drawColorBox(t,e,i,s,n){const o=this.labelColors[i],a=this.labelPointStyles[i],{boxHeight:r,boxWidth:l,boxPadding:h}=n,c=He(n.bodyFont),d=No(this,"left",n),u=s.x(d),f=r<c.lineHeight?(c.lineHeight-r)/2:0,g=e.y+f;if(n.usePointStyle){const e={radius:Math.min(l,r)/2,pointStyle:a.pointStyle,rotation:a.rotation,borderWidth:1},i=s.leftForLtr(u,l)+l/2,h=g+r/2;t.strokeStyle=n.multiKeyBackground,t.fillStyle=n.multiKeyBackground,Zt(t,e,i,h),t.strokeStyle=o.borderColor,t.fillStyle=o.backgroundColor,Zt(t,e,i,h)}else{t.lineWidth=o.borderWidth||1,t.strokeStyle=o.borderColor,t.setLineDash(o.borderDash||[]),t.lineDashOffset=o.borderDashOffset||0;const e=s.leftForLtr(u,l-h),i=s.leftForLtr(s.xPlus(u,1),l-h-2),a=We(o.borderRadius);Object.values(a).some((t=>0!==t))?(t.beginPath(),t.fillStyle=n.multiKeyBackground,oe(t,{x:e,y:g,w:l,h:r,radius:a}),t.fill(),t.stroke(),t.fillStyle=o.backgroundColor,t.beginPath(),oe(t,{x:i,y:g+1,w:l-2,h:r-2,radius:a}),t.fill()):(t.fillStyle=n.multiKeyBackground,t.fillRect(e,g,l,r),t.strokeRect(e,g,l,r),t.fillStyle=o.backgroundColor,t.fillRect(i,g+1,l-2,r-2))}t.fillStyle=this.labelTextColors[i]}drawBody(t,e,i){const{body:s}=this,{bodySpacing:n,bodyAlign:o,displayColors:a,boxHeight:r,boxWidth:l,boxPadding:h}=i,c=He(i.bodyFont);let d=c.lineHeight,u=0;const f=Ei(i.rtl,this.x,this.width),g=function(i){e.fillText(i,f.x(t.x+u),t.y+d/2),t.y+=d+n},p=f.textAlign(o);let m,x,b,_,y,v,w;for(e.textAlign=o,e.textBaseline="middle",e.font=c.string,t.x=No(this,p,i),e.fillStyle=i.bodyColor,Q(this.beforeBody,g),u=a&&"right"!==p?"center"===o?l/2+h:l+2+h:0,_=0,v=s.length;_<v;++_){for(m=s[_],x=this.labelTextColors[_],e.fillStyle=x,Q(m.before,g),b=m.lines,a&&b.length&&(this._drawColorBox(e,t,_,f,i),d=Math.max(c.lineHeight,r)),y=0,w=b.length;y<w;++y)g(b[y]),d=c.lineHeight;Q(m.after,g)}u=0,d=c.lineHeight,Q(this.afterBody,g),t.y-=n}drawFooter(t,e,i){const s=this.footer,n=s.length;let o,a;if(n){const r=Ei(i.rtl,this.x,this.width);for(t.x=No(this,i.footerAlign,i),t.y+=i.footerMarginTop,e.textAlign=r.textAlign(i.footerAlign),e.textBaseline="middle",o=He(i.footerFont),e.fillStyle=i.footerColor,e.font=o.string,a=0;a<n;++a)e.fillText(s[a],r.x(t.x),t.y+o.lineHeight/2),t.y+=o.lineHeight+i.footerSpacing}}drawBackground(t,e,i,s){const{xAlign:n,yAlign:o}=this,{x:a,y:r}=t,{width:l,height:h}=i,{topLeft:c,topRight:d,bottomLeft:u,bottomRight:f}=We(s.cornerRadius);e.fillStyle=s.backgroundColor,e.strokeStyle=s.borderColor,e.lineWidth=s.borderWidth,e.beginPath(),e.moveTo(a+c,r),"top"===o&&this.drawCaret(t,e,i,s),e.lineTo(a+l-d,r),e.quadraticCurveTo(a+l,r,a+l,r+d),"center"===o&&"right"===n&&this.drawCaret(t,e,i,s),e.lineTo(a+l,r+h-f),e.quadraticCurveTo(a+l,r+h,a+l-f,r+h),"bottom"===o&&this.drawCaret(t,e,i,s),e.lineTo(a+u,r+h),e.quadraticCurveTo(a,r+h,a,r+h-u),"center"===o&&"left"===n&&this.drawCaret(t,e,i,s),e.lineTo(a,r+c),e.quadraticCurveTo(a,r,a+c,r),e.closePath(),e.fill(),s.borderWidth>0&&e.stroke()}_updateAnimationTarget(t){const e=this.chart,i=this.$animations,s=i&&i.x,n=i&&i.y;if(s||n){const i=Ro[t.position].call(this,this._active,this._eventPosition);if(!i)return;const o=this._size=Fo(this,t),a=Object.assign({},i,this._size),r=Vo(e,t,a),l=Wo(t,a,r,e);s._to===l.x&&n._to===l.y||(this.xAlign=r.xAlign,this.yAlign=r.yAlign,this.width=o.width,this.height=o.height,this.caretX=i.x,this.caretY=i.y,this._resolveAnimations().update(this,l))}}draw(t){const e=this.options.setContext(this.getContext());let i=this.opacity;if(!i)return;this._updateAnimationTarget(e);const s={width:this.width,height:this.height},n={x:this.x,y:this.y};i=Math.abs(i)<.001?0:i;const o=Ne(e.padding),a=this.title.length||this.beforeBody.length||this.body.length||this.afterBody.length||this.footer.length;e.enabled&&a&&(t.save(),t.globalAlpha=i,this.drawBackground(n,t,s,e),Ii(t,e.textDirection),n.y+=o.top,this.drawTitle(n,t,e),this.drawBody(n,t,e),this.drawFooter(n,t,e),zi(t,e.textDirection),t.restore())}getActiveElements(){return this._active||[]}setActiveElements(t,e){const i=this._active,s=t.map((({datasetIndex:t,index:e})=>{const i=this.chart.getDatasetMeta(t);if(!i)throw new Error("Cannot find a dataset at index "+t);return{datasetIndex:t,element:i.data[e],index:e}})),n=!tt(i,s),o=this._positionChanged(s,e);(n||o)&&(this._active=s,this._eventPosition=e,this._ignoreReplayEvents=!0,this.update(!0))}handleEvent(t,e,i=!0){if(e&&this._ignoreReplayEvents)return!1;this._ignoreReplayEvents=!1;const s=this.options,n=this._active||[],o=this._getActiveElements(t,n,e,i),a=this._positionChanged(o,t),r=e||!tt(o,n)||a;return r&&(this._active=o,(s.enabled||s.external)&&(this._eventPosition={x:t.x,y:t.y},this.update(!0,e))),r}_getActiveElements(t,e,i,s){const n=this.options;if("mouseout"===t.type)return[];if(!s)return e;const o=this.chart.getElementsAtEventForMode(t,n.mode,n,i);return n.reverse&&o.reverse(),o}_positionChanged(t,e){const{caretX:i,caretY:s,options:n}=this,o=Ro[n.position].call(this,t,e);return!1!==o&&(i!==o.x||s!==o.y)}}$o.positioners=Ro;var Yo={id:"tooltip",_element:$o,positioners:Ro,afterInit(t,e,i){i&&(t.tooltip=new $o({chart:t,options:i}))},beforeUpdate(t,e,i){t.tooltip&&t.tooltip.initialize(i)},reset(t,e,i){t.tooltip&&t.tooltip.initialize(i)},afterDraw(t){const e=t.tooltip,i={tooltip:e};!1!==t.notifyPlugins("beforeTooltipDraw",i)&&(e&&e.draw(t.ctx),t.notifyPlugins("afterTooltipDraw",i))},afterEvent(t,e){if(t.tooltip){const i=e.replay;t.tooltip.handleEvent(e.event,i,e.inChartArea)&&(e.changed=!0)}},defaults:{enabled:!0,external:null,position:"average",backgroundColor:"rgba(0,0,0,0.8)",titleColor:"#fff",titleFont:{weight:"bold"},titleSpacing:2,titleMarginBottom:6,titleAlign:"left",bodyColor:"#fff",bodySpacing:2,bodyFont:{},bodyAlign:"left",footerColor:"#fff",footerSpacing:2,footerMarginTop:6,footerFont:{weight:"bold"},footerAlign:"left",padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:(t,e)=>e.bodyFont.size,boxWidth:(t,e)=>e.bodyFont.size,multiKeyBackground:"#fff",displayColors:!0,boxPadding:0,borderColor:"rgba(0,0,0,0)",borderWidth:0,animation:{duration:400,easing:"easeOutQuart"},animations:{numbers:{type:"number",properties:["x","y","width","height","caretX","caretY"]},opacity:{easing:"linear",duration:200}},callbacks:{beforeTitle:H,title(t){if(t.length>0){const e=t[0],i=e.chart.data.labels,s=i?i.length:0;if(this&&this.options&&"dataset"===this.options.mode)return e.dataset.label||"";if(e.label)return e.label;if(s>0&&e.dataIndex<s)return i[e.dataIndex]}return""},afterTitle:H,beforeBody:H,beforeLabel:H,label(t){if(this&&this.options&&"dataset"===this.options.mode)return t.label+": "+t.formattedValue||t.formattedValue;let e=t.dataset.label||"";e&&(e+=": ");const i=t.formattedValue;return $(i)||(e+=i),e},labelColor(t){const e=t.chart.getDatasetMeta(t.datasetIndex).controller.getStyle(t.dataIndex);return{borderColor:e.borderColor,backgroundColor:e.backgroundColor,borderWidth:e.borderWidth,borderDash:e.borderDash,borderDashOffset:e.borderDashOffset,borderRadius:0}},labelTextColor(){return this.options.bodyColor},labelPointStyle(t){const e=t.chart.getDatasetMeta(t.datasetIndex).controller.getStyle(t.dataIndex);return{pointStyle:e.pointStyle,rotation:e.rotation}},afterLabel:H,afterBody:H,beforeFooter:H,footer:H,afterFooter:H}},defaultRoutes:{bodyFont:"font",footerFont:"font",titleFont:"font"},descriptors:{_scriptable:t=>"filter"!==t&&"itemSort"!==t&&"external"!==t,_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:"animation"}},additionalOptionScopes:["interaction"]},Uo=Object.freeze({__proto__:null,Decimation:ro,Filler:So,Legend:Co,SubTitle:Lo,Title:Ao,Tooltip:Yo});function Xo(t,e,i,s){const n=t.indexOf(e);if(-1===n)return((t,e,i,s)=>("string"==typeof e?(i=t.push(e)-1,s.unshift({index:i,label:e})):isNaN(e)&&(i=null),i))(t,e,i,s);return n!==t.lastIndexOf(e)?i:n}class qo extends Bs{constructor(t){super(t),this._startValue=void 0,this._valueRange=0,this._addedLabels=[]}init(t){const e=this._addedLabels;if(e.length){const t=this.getLabels();for(const{index:i,label:s}of e)t[i]===s&&t.splice(i,1);this._addedLabels=[]}super.init(t)}parse(t,e){if($(t))return null;const i=this.getLabels();return((t,e)=>null===t?null:jt(Math.round(t),0,e))(e=isFinite(e)&&i[e]===t?e:Xo(i,t,K(e,t),this._addedLabels),i.length-1)}determineDataLimits(){const{minDefined:t,maxDefined:e}=this.getUserBounds();let{min:i,max:s}=this.getMinMax(!0);"ticks"===this.options.bounds&&(t||(i=0),e||(s=this.getLabels().length-1)),this.min=i,this.max=s}buildTicks(){const t=this.min,e=this.max,i=this.options.offset,s=[];let n=this.getLabels();n=0===t&&e===n.length-1?n:n.slice(t,e+1),this._valueRange=Math.max(n.length-(i?0:1),1),this._startValue=this.min-(i?.5:0);for(let i=t;i<=e;i++)s.push({value:i});return s}getLabelForValue(t){const e=this.getLabels();return t>=0&&t<e.length?e[t]:t}configure(){super.configure(),this.isHorizontal()||(this._reversePixels=!this._reversePixels)}getPixelForValue(t){return"number"!=typeof t&&(t=this.parse(t)),null===t?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}getPixelForTick(t){const e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t].value)}getValueForPixel(t){return Math.round(this._startValue+this.getDecimalForPixel(t)*this._valueRange)}getBasePixel(){return this.bottom}}function Ko(t,e,{horizontal:i,minRotation:s}){const n=It(s),o=(i?Math.sin(n):Math.cos(n))||.001,a=.75*e*(""+t).length;return Math.min(e/o,a)}qo.id="category",qo.defaults={ticks:{callback:qo.prototype.getLabelForValue}};class Go extends Bs{constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._endValue=void 0,this._valueRange=0}parse(t,e){return $(t)||("number"==typeof t||t instanceof Number)&&!isFinite(+t)?null:+t}handleTickRangeOptions(){const{beginAtZero:t}=this.options,{minDefined:e,maxDefined:i}=this.getUserBounds();let{min:s,max:n}=this;const o=t=>s=e?s:t,a=t=>n=i?n:t;if(t){const t=Ct(s),e=Ct(n);t<0&&e<0?a(0):t>0&&e>0&&o(0)}if(s===n){let e=1;(n>=Number.MAX_SAFE_INTEGER||s<=Number.MIN_SAFE_INTEGER)&&(e=Math.abs(.05*n)),a(n+e),t||o(s-e)}this.min=s,this.max=n}getTickLimit(){const t=this.options.ticks;let e,{maxTicksLimit:i,stepSize:s}=t;return s?(e=Math.ceil(this.max/s)-Math.floor(this.min/s)+1,e>1e3&&(console.warn(`scales.${this.id}.ticks.stepSize: ${s} would result generating up to ${e} ticks. Limiting to 1000.`),e=1e3)):(e=this.computeTickLimit(),i=i||11),i&&(e=Math.min(i,e)),e}computeTickLimit(){return Number.POSITIVE_INFINITY}buildTicks(){const t=this.options,e=t.ticks;let i=this.getTickLimit();i=Math.max(2,i);const s=function(t,e){const i=[],{bounds:s,step:n,min:o,max:a,precision:r,count:l,maxTicks:h,maxDigits:c,includeBounds:d}=t,u=n||1,f=h-1,{min:g,max:p}=e,m=!$(o),x=!$(a),b=!$(l),_=(p-g)/(c+1);let y,v,w,M,k=Ot((p-g)/f/u)*u;if(k<1e-14&&!m&&!x)return[{value:g},{value:p}];M=Math.ceil(p/k)-Math.floor(g/k),M>f&&(k=Ot(M*k/f/u)*u),$(r)||(y=Math.pow(10,r),k=Math.ceil(k*y)/y),"ticks"===s?(v=Math.floor(g/k)*k,w=Math.ceil(p/k)*k):(v=g,w=p),m&&x&&n&&Rt((a-o)/n,k/1e3)?(M=Math.round(Math.min((a-o)/k,h)),k=(a-o)/M,v=o,w=a):b?(v=m?o:v,w=x?a:w,M=l-1,k=(w-v)/M):(M=(w-v)/k,M=Lt(M,Math.round(M),k/1e3)?Math.round(M):Math.ceil(M));const S=Math.max(Ft(k),Ft(v));y=Math.pow(10,$(r)?S:r),v=Math.round(v*y)/y,w=Math.round(w*y)/y;let P=0;for(m&&(d&&v!==o?(i.push({value:o}),v<o&&P++,Lt(Math.round((v+P*k)*y)/y,o,Ko(o,_,t))&&P++):v<o&&P++);P<M;++P)i.push({value:Math.round((v+P*k)*y)/y});return x&&d&&w!==a?i.length&&Lt(i[i.length-1].value,a,Ko(a,_,t))?i[i.length-1].value=a:i.push({value:a}):x&&w!==a||i.push({value:w}),i}({maxTicks:i,bounds:t.bounds,min:t.min,max:t.max,precision:e.precision,step:e.stepSize,count:e.count,maxDigits:this._maxDigits(),horizontal:this.isHorizontal(),minRotation:e.minRotation||0,includeBounds:!1!==e.includeBounds},this._range||this);return"ticks"===t.bounds&&Et(s,this,"value"),t.reverse?(s.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),s}configure(){const t=this.ticks;let e=this.min,i=this.max;if(super.configure(),this.options.offset&&t.length){const s=(i-e)/Math.max(t.length-1,1)/2;e-=s,i+=s}this._startValue=e,this._endValue=i,this._valueRange=i-e}getLabelForValue(t){return Ri(t,this.chart.options.locale,this.options.ticks.format)}}class Zo extends Go{determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=X(t)?t:0,this.max=X(e)?e:1,this.handleTickRangeOptions()}computeTickLimit(){const t=this.isHorizontal(),e=t?this.width:this.height,i=It(this.options.ticks.minRotation),s=(t?Math.sin(i):Math.cos(i))||.001,n=this._resolveTickFontOptions(0);return Math.ceil(e/Math.min(40,n.lineHeight/s))}getPixelForValue(t){return null===t?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}getValueForPixel(t){return this._startValue+this.getDecimalForPixel(t)*this._valueRange}}function Jo(t){return 1===t/Math.pow(10,Math.floor(Dt(t)))}Zo.id="linear",Zo.defaults={ticks:{callback:Os.formatters.numeric}};class Qo extends Bs{constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._valueRange=0}parse(t,e){const i=Go.prototype.parse.apply(this,[t,e]);if(0!==i)return X(i)&&i>0?i:null;this._zero=!0}determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=X(t)?Math.max(0,t):null,this.max=X(e)?Math.max(0,e):null,this.options.beginAtZero&&(this._zero=!0),this.handleTickRangeOptions()}handleTickRangeOptions(){const{minDefined:t,maxDefined:e}=this.getUserBounds();let i=this.min,s=this.max;const n=e=>i=t?i:e,o=t=>s=e?s:t,a=(t,e)=>Math.pow(10,Math.floor(Dt(t))+e);i===s&&(i<=0?(n(1),o(10)):(n(a(i,-1)),o(a(s,1)))),i<=0&&n(a(s,-1)),s<=0&&o(a(i,1)),this._zero&&this.min!==this._suggestedMin&&i===a(this.min,0)&&n(a(i,-1)),this.min=i,this.max=s}buildTicks(){const t=this.options,e=function(t,e){const i=Math.floor(Dt(e.max)),s=Math.ceil(e.max/Math.pow(10,i)),n=[];let o=q(t.min,Math.pow(10,Math.floor(Dt(e.min)))),a=Math.floor(Dt(o)),r=Math.floor(o/Math.pow(10,a)),l=a<0?Math.pow(10,Math.abs(a)):1;do{n.push({value:o,major:Jo(o)}),++r,10===r&&(r=1,++a,l=a>=0?1:l),o=Math.round(r*Math.pow(10,a)*l)/l}while(a<i||a===i&&r<s);const h=q(t.max,o);return n.push({value:h,major:Jo(o)}),n}({min:this._userMin,max:this._userMax},this);return"ticks"===t.bounds&&Et(e,this,"value"),t.reverse?(e.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),e}getLabelForValue(t){return void 0===t?"0":Ri(t,this.chart.options.locale,this.options.ticks.format)}configure(){const t=this.min;super.configure(),this._startValue=Dt(t),this._valueRange=Dt(this.max)-Dt(t)}getPixelForValue(t){return void 0!==t&&0!==t||(t=this.min),null===t||isNaN(t)?NaN:this.getPixelForDecimal(t===this.min?0:(Dt(t)-this._startValue)/this._valueRange)}getValueForPixel(t){const e=this.getDecimalForPixel(t);return Math.pow(10,this._startValue+e*this._valueRange)}}function ta(t){const e=t.ticks;if(e.display&&t.display){const t=Ne(e.backdropPadding);return K(e.font&&e.font.size,bt.font.size)+t.height}return 0}function ea(t,e,i,s,n){return t===s||t===n?{start:e-i/2,end:e+i/2}:t<s||t>n?{start:e-i,end:e}:{start:e,end:e+i}}function ia(t){const e={l:t.left+t._padding.left,r:t.right-t._padding.right,t:t.top+t._padding.top,b:t.bottom-t._padding.bottom},i=Object.assign({},e),s=[],n=[],o=t._pointLabels.length,a=t.options.pointLabels,r=a.centerPointLabels?_t/o:0;for(let d=0;d<o;d++){const o=a.setContext(t.getPointLabelContext(d));n[d]=o.padding;const u=t.getPointPosition(d,t.drawingArea+n[d],r),f=He(o.font),g=(l=t.ctx,h=f,c=Y(c=t._pointLabels[d])?c:[c],{w:qt(l,h.string,c),h:c.length*h.lineHeight});s[d]=g;const p=Nt(t.getIndexAngle(d)+r),m=Math.round(zt(p));sa(i,e,p,ea(m,u.x,g.w,0,180),ea(m,u.y,g.h,90,270))}var l,h,c;t.setCenterPoint(e.l-i.l,i.r-e.r,e.t-i.t,i.b-e.b),t._pointLabelItems=function(t,e,i){const s=[],n=t._pointLabels.length,o=t.options,a=ta(o)/2,r=t.drawingArea,l=o.pointLabels.centerPointLabels?_t/n:0;for(let o=0;o<n;o++){const n=t.getPointPosition(o,r+a+i[o],l),h=Math.round(zt(Nt(n.angle+kt))),c=e[o],d=aa(n.y,c.h,h),u=na(h),f=oa(n.x,c.w,u);s.push({x:n.x,y:d,textAlign:u,left:f,top:d,right:f+c.w,bottom:d+c.h})}return s}(t,s,n)}function sa(t,e,i,s,n){const o=Math.abs(Math.sin(i)),a=Math.abs(Math.cos(i));let r=0,l=0;s.start<e.l?(r=(e.l-s.start)/o,t.l=Math.min(t.l,e.l-r)):s.end>e.r&&(r=(s.end-e.r)/o,t.r=Math.max(t.r,e.r+r)),n.start<e.t?(l=(e.t-n.start)/a,t.t=Math.min(t.t,e.t-l)):n.end>e.b&&(l=(n.end-e.b)/a,t.b=Math.max(t.b,e.b+l))}function na(t){return 0===t||180===t?"center":t<180?"left":"right"}function oa(t,e,i){return"right"===i?t-=e:"center"===i&&(t-=e/2),t}function aa(t,e,i){return 90===i||270===i?t-=e/2:(i>270||i<90)&&(t-=e),t}function ra(t,e,i,s){const{ctx:n}=t;if(i)n.arc(t.xCenter,t.yCenter,e,0,yt);else{let i=t.getPointPosition(0,e);n.moveTo(i.x,i.y);for(let o=1;o<s;o++)i=t.getPointPosition(o,e),n.lineTo(i.x,i.y)}}Qo.id="logarithmic",Qo.defaults={ticks:{callback:Os.formatters.logarithmic,major:{enabled:!0}}};class la extends Go{constructor(t){super(t),this.xCenter=void 0,this.yCenter=void 0,this.drawingArea=void 0,this._pointLabels=[],this._pointLabelItems=[]}setDimensions(){const t=this._padding=Ne(ta(this.options)/2),e=this.width=this.maxWidth-t.width,i=this.height=this.maxHeight-t.height;this.xCenter=Math.floor(this.left+e/2+t.left),this.yCenter=Math.floor(this.top+i/2+t.top),this.drawingArea=Math.floor(Math.min(e,i)/2)}determineDataLimits(){const{min:t,max:e}=this.getMinMax(!1);this.min=X(t)&&!isNaN(t)?t:0,this.max=X(e)&&!isNaN(e)?e:0,this.handleTickRangeOptions()}computeTickLimit(){return Math.ceil(this.drawingArea/ta(this.options))}generateTickLabels(t){Go.prototype.generateTickLabels.call(this,t),this._pointLabels=this.getLabels().map(((t,e)=>{const i=J(this.options.pointLabels.callback,[t,e],this);return i||0===i?i:""})).filter(((t,e)=>this.chart.getDataVisibility(e)))}fit(){const t=this.options;t.display&&t.pointLabels.display?ia(this):this.setCenterPoint(0,0,0,0)}setCenterPoint(t,e,i,s){this.xCenter+=Math.floor((t-e)/2),this.yCenter+=Math.floor((i-s)/2),this.drawingArea-=Math.min(this.drawingArea/2,Math.max(t,e,i,s))}getIndexAngle(t){return Nt(t*(yt/(this._pointLabels.length||1))+It(this.options.startAngle||0))}getDistanceFromCenterForValue(t){if($(t))return NaN;const e=this.drawingArea/(this.max-this.min);return this.options.reverse?(this.max-t)*e:(t-this.min)*e}getValueForDistanceFromCenter(t){if($(t))return NaN;const e=t/(this.drawingArea/(this.max-this.min));return this.options.reverse?this.max-e:this.min+e}getPointLabelContext(t){const e=this._pointLabels||[];if(t>=0&&t<e.length){const i=e[t];return function(t,e,i){return Ye(t,{label:i,index:e,type:"pointLabel"})}(this.getContext(),t,i)}}getPointPosition(t,e,i=0){const s=this.getIndexAngle(t)-kt+i;return{x:Math.cos(s)*e+this.xCenter,y:Math.sin(s)*e+this.yCenter,angle:s}}getPointPositionForValue(t,e){return this.getPointPosition(t,this.getDistanceFromCenterForValue(e))}getBasePosition(t){return this.getPointPositionForValue(t||0,this.getBaseValue())}getPointLabelPosition(t){const{left:e,top:i,right:s,bottom:n}=this._pointLabelItems[t];return{left:e,top:i,right:s,bottom:n}}drawBackground(){const{backgroundColor:t,grid:{circular:e}}=this.options;if(t){const i=this.ctx;i.save(),i.beginPath(),ra(this,this.getDistanceFromCenterForValue(this._endValue),e,this._pointLabels.length),i.closePath(),i.fillStyle=t,i.fill(),i.restore()}}drawGrid(){const t=this.ctx,e=this.options,{angleLines:i,grid:s}=e,n=this._pointLabels.length;let o,a,r;if(e.pointLabels.display&&function(t,e){const{ctx:i,options:{pointLabels:s}}=t;for(let n=e-1;n>=0;n--){const e=s.setContext(t.getPointLabelContext(n)),o=He(e.font),{x:a,y:r,textAlign:l,left:h,top:c,right:d,bottom:u}=t._pointLabelItems[n],{backdropColor:f}=e;if(!$(f)){const t=Ne(e.backdropPadding);i.fillStyle=f,i.fillRect(h-t.left,c-t.top,d-h+t.width,u-c+t.height)}se(i,t._pointLabels[n],a,r+o.lineHeight/2,o,{color:e.color,textAlign:l,textBaseline:"middle"})}}(this,n),s.display&&this.ticks.forEach(((t,e)=>{if(0!==e){a=this.getDistanceFromCenterForValue(t.value);!function(t,e,i,s){const n=t.ctx,o=e.circular,{color:a,lineWidth:r}=e;!o&&!s||!a||!r||i<0||(n.save(),n.strokeStyle=a,n.lineWidth=r,n.setLineDash(e.borderDash),n.lineDashOffset=e.borderDashOffset,n.beginPath(),ra(t,i,o,s),n.closePath(),n.stroke(),n.restore())}(this,s.setContext(this.getContext(e-1)),a,n)}})),i.display){for(t.save(),o=n-1;o>=0;o--){const s=i.setContext(this.getPointLabelContext(o)),{color:n,lineWidth:l}=s;l&&n&&(t.lineWidth=l,t.strokeStyle=n,t.setLineDash(s.borderDash),t.lineDashOffset=s.borderDashOffset,a=this.getDistanceFromCenterForValue(e.ticks.reverse?this.min:this.max),r=this.getPointPosition(o,a),t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(r.x,r.y),t.stroke())}t.restore()}}drawBorder(){}drawLabels(){const t=this.ctx,e=this.options,i=e.ticks;if(!i.display)return;const s=this.getIndexAngle(0);let n,o;t.save(),t.translate(this.xCenter,this.yCenter),t.rotate(s),t.textAlign="center",t.textBaseline="middle",this.ticks.forEach(((s,a)=>{if(0===a&&!e.reverse)return;const r=i.setContext(this.getContext(a)),l=He(r.font);if(n=this.getDistanceFromCenterForValue(this.ticks[a].value),r.showLabelBackdrop){t.font=l.string,o=t.measureText(s.label).width,t.fillStyle=r.backdropColor;const e=Ne(r.backdropPadding);t.fillRect(-o/2-e.left,-n-l.size/2-e.top,o+e.width,l.size+e.height)}se(t,s.label,0,-n,l,{color:r.color})})),t.restore()}drawTitle(){}}la.id="radialLinear",la.defaults={display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,lineWidth:1,borderDash:[],borderDashOffset:0},grid:{circular:!1},startAngle:0,ticks:{showLabelBackdrop:!0,callback:Os.formatters.numeric},pointLabels:{backdropColor:void 0,backdropPadding:2,display:!0,font:{size:10},callback:t=>t,padding:5,centerPointLabels:!1}},la.defaultRoutes={"angleLines.color":"borderColor","pointLabels.color":"color","ticks.color":"color"},la.descriptors={angleLines:{_fallback:"grid"}};const ha={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},ca=Object.keys(ha);function da(t,e){return t-e}function ua(t,e){if($(e))return null;const i=t._adapter,{parser:s,round:n,isoWeekday:o}=t._parseOpts;let a=e;return"function"==typeof s&&(a=s(a)),X(a)||(a="string"==typeof s?i.parse(a,s):i.parse(a)),null===a?null:(n&&(a="week"!==n||!Tt(o)&&!0!==o?i.startOf(a,n):i.startOf(a,"isoWeek",o)),+a)}function fa(t,e,i,s){const n=ca.length;for(let o=ca.indexOf(t);o<n-1;++o){const t=ha[ca[o]],n=t.steps?t.steps:Number.MAX_SAFE_INTEGER;if(t.common&&Math.ceil((i-e)/(n*t.size))<=s)return ca[o]}return ca[n-1]}function ga(t,e,i){if(i){if(i.length){const{lo:s,hi:n}=ae(i,e);t[i[s]>=e?i[s]:i[n]]=!0}}else t[e]=!0}function pa(t,e,i){const s=[],n={},o=e.length;let a,r;for(a=0;a<o;++a)r=e[a],n[r]=a,s.push({value:r,major:!1});return 0!==o&&i?function(t,e,i,s){const n=t._adapter,o=+n.startOf(e[0].value,s),a=e[e.length-1].value;let r,l;for(r=o;r<=a;r=+n.add(r,1,s))l=i[r],l>=0&&(e[l].major=!0);return e}(t,s,n,i):s}class ma extends Bs{constructor(t){super(t),this._cache={data:[],labels:[],all:[]},this._unit="day",this._majorUnit=void 0,this._offsets={},this._normalized=!1,this._parseOpts=void 0}init(t,e){const i=t.time||(t.time={}),s=this._adapter=new mn._date(t.adapters.date);ot(i.displayFormats,s.formats()),this._parseOpts={parser:i.parser,round:i.round,isoWeekday:i.isoWeekday},super.init(t),this._normalized=e.normalized}parse(t,e){return void 0===t?null:ua(this,t)}beforeLayout(){super.beforeLayout(),this._cache={data:[],labels:[],all:[]}}determineDataLimits(){const t=this.options,e=this._adapter,i=t.time.unit||"day";let{min:s,max:n,minDefined:o,maxDefined:a}=this.getUserBounds();function r(t){o||isNaN(t.min)||(s=Math.min(s,t.min)),a||isNaN(t.max)||(n=Math.max(n,t.max))}o&&a||(r(this._getLabelBounds()),"ticks"===t.bounds&&"labels"===t.ticks.source||r(this.getMinMax(!1))),s=X(s)&&!isNaN(s)?s:+e.startOf(Date.now(),i),n=X(n)&&!isNaN(n)?n:+e.endOf(Date.now(),i)+1,this.min=Math.min(s,n-1),this.max=Math.max(s+1,n)}_getLabelBounds(){const t=this.getLabelTimestamps();let e=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY;return t.length&&(e=t[0],i=t[t.length-1]),{min:e,max:i}}buildTicks(){const t=this.options,e=t.time,i=t.ticks,s="labels"===i.source?this.getLabelTimestamps():this._generate();"ticks"===t.bounds&&s.length&&(this.min=this._userMin||s[0],this.max=this._userMax||s[s.length-1]);const n=this.min,o=he(s,n,this.max);return this._unit=e.unit||(i.autoSkip?fa(e.minUnit,this.min,this.max,this._getLabelCapacity(n)):function(t,e,i,s,n){for(let o=ca.length-1;o>=ca.indexOf(i);o--){const i=ca[o];if(ha[i].common&&t._adapter.diff(n,s,i)>=e-1)return i}return ca[i?ca.indexOf(i):0]}(this,o.length,e.minUnit,this.min,this.max)),this._majorUnit=i.major.enabled&&"year"!==this._unit?function(t){for(let e=ca.indexOf(t)+1,i=ca.length;e<i;++e)if(ha[ca[e]].common)return ca[e]}(this._unit):void 0,this.initOffsets(s),t.reverse&&o.reverse(),pa(this,o,this._majorUnit)}initOffsets(t){let e,i,s=0,n=0;this.options.offset&&t.length&&(e=this.getDecimalForValue(t[0]),s=1===t.length?1-e:(this.getDecimalForValue(t[1])-e)/2,i=this.getDecimalForValue(t[t.length-1]),n=1===t.length?i:(i-this.getDecimalForValue(t[t.length-2]))/2);const o=t.length<3?.5:.25;s=jt(s,0,o),n=jt(n,0,o),this._offsets={start:s,end:n,factor:1/(s+1+n)}}_generate(){const t=this._adapter,e=this.min,i=this.max,s=this.options,n=s.time,o=n.unit||fa(n.minUnit,e,i,this._getLabelCapacity(e)),a=K(n.stepSize,1),r="week"===o&&n.isoWeekday,l=Tt(r)||!0===r,h={};let c,d,u=e;if(l&&(u=+t.startOf(u,"isoWeek",r)),u=+t.startOf(u,l?"day":o),t.diff(i,e,o)>1e5*a)throw new Error(e+" and "+i+" are too far apart with stepSize of "+a+" "+o);const f="data"===s.ticks.source&&this.getDataTimestamps();for(c=u,d=0;c<i;c=+t.add(c,a,o),d++)ga(h,c,f);return c!==i&&"ticks"!==s.bounds&&1!==d||ga(h,c,f),Object.keys(h).sort(((t,e)=>t-e)).map((t=>+t))}getLabelForValue(t){const e=this._adapter,i=this.options.time;return i.tooltipFormat?e.format(t,i.tooltipFormat):e.format(t,i.displayFormats.datetime)}_tickFormatFunction(t,e,i,s){const n=this.options,o=n.time.displayFormats,a=this._unit,r=this._majorUnit,l=a&&o[a],h=r&&o[r],c=i[e],d=r&&h&&c&&c.major,u=this._adapter.format(t,s||(d?h:l)),f=n.ticks.callback;return f?J(f,[u,e,i],this):u}generateTickLabels(t){let e,i,s;for(e=0,i=t.length;e<i;++e)s=t[e],s.label=this._tickFormatFunction(s.value,e,t)}getDecimalForValue(t){return null===t?NaN:(t-this.min)/(this.max-this.min)}getPixelForValue(t){const e=this._offsets,i=this.getDecimalForValue(t);return this.getPixelForDecimal((e.start+i)*e.factor)}getValueForPixel(t){const e=this._offsets,i=this.getDecimalForPixel(t)/e.factor-e.end;return this.min+i*(this.max-this.min)}_getLabelSize(t){const e=this.options.ticks,i=this.ctx.measureText(t).width,s=It(this.isHorizontal()?e.maxRotation:e.minRotation),n=Math.cos(s),o=Math.sin(s),a=this._resolveTickFontOptions(0).size;return{w:i*n+a*o,h:i*o+a*n}}_getLabelCapacity(t){const e=this.options.time,i=e.displayFormats,s=i[e.unit]||i.millisecond,n=this._tickFormatFunction(t,0,pa(this,[t],this._majorUnit),s),o=this._getLabelSize(n),a=Math.floor(this.isHorizontal()?this.width/o.w:this.height/o.h)-1;return a>0?a:1}getDataTimestamps(){let t,e,i=this._cache.data||[];if(i.length)return i;const s=this.getMatchingVisibleMetas();if(this._normalized&&s.length)return this._cache.data=s[0].controller.getAllParsedValues(this);for(t=0,e=s.length;t<e;++t)i=i.concat(s[t].controller.getAllParsedValues(this));return this._cache.data=this.normalize(i)}getLabelTimestamps(){const t=this._cache.labels||[];let e,i;if(t.length)return t;const s=this.getLabels();for(e=0,i=s.length;e<i;++e)t.push(ua(this,s[e]));return this._cache.labels=this._normalized?t:this.normalize(t)}normalize(t){return fe(t.sort(da))}}function xa(t,e,i){let s,n,o,a,r=0,l=t.length-1;i?(e>=t[r].pos&&e<=t[l].pos&&({lo:r,hi:l}=re(t,"pos",e)),({pos:s,time:o}=t[r]),({pos:n,time:a}=t[l])):(e>=t[r].time&&e<=t[l].time&&({lo:r,hi:l}=re(t,"time",e)),({time:s,pos:o}=t[r]),({time:n,pos:a}=t[l]));const h=n-s;return h?o+(a-o)*(e-s)/h:o}ma.id="time",ma.defaults={bounds:"data",adapters:{},time:{parser:!1,unit:!1,round:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{source:"auto",major:{enabled:!1}}};class ba extends ma{constructor(t){super(t),this._table=[],this._minPos=void 0,this._tableRange=void 0}initOffsets(){const t=this._getTimestampsForTable(),e=this._table=this.buildLookupTable(t);this._minPos=xa(e,this.min),this._tableRange=xa(e,this.max)-this._minPos,super.initOffsets(t)}buildLookupTable(t){const{min:e,max:i}=this,s=[],n=[];let o,a,r,l,h;for(o=0,a=t.length;o<a;++o)l=t[o],l>=e&&l<=i&&s.push(l);if(s.length<2)return[{time:e,pos:0},{time:i,pos:1}];for(o=0,a=s.length;o<a;++o)h=s[o+1],r=s[o-1],l=s[o],Math.round((h+r)/2)!==l&&n.push({time:l,pos:o/(a-1)});return n}_getTimestampsForTable(){let t=this._cache.all||[];if(t.length)return t;const e=this.getDataTimestamps(),i=this.getLabelTimestamps();return t=e.length&&i.length?this.normalize(e.concat(i)):e.length?e:i,t=this._cache.all=t,t}getDecimalForValue(t){return(xa(this._table,t)-this._minPos)/this._tableRange}getValueForPixel(t){const e=this._offsets,i=this.getDecimalForPixel(t)/e.factor-e.end;return xa(this._table,i*this._tableRange+this._minPos,!0)}}ba.id="timeseries",ba.defaults=ma.defaults;var _a=Object.freeze({__proto__:null,CategoryScale:qo,LinearScale:Zo,LogarithmicScale:Qo,RadialLinearScale:la,TimeScale:ma,TimeSeriesScale:ba});return dn.register(Rn,_a,no,Uo),dn.helpers={...Yi},dn._adapters=mn,dn.Animation=us,dn.Animations=gs,dn.animator=a,dn.controllers=Ws.controllers.items,dn.DatasetController=Ps,dn.Element=Ds,dn.elements=no,dn.Interaction=Ee,dn.layouts=ni,dn.platforms=hs,dn.Scale=Bs,dn.Ticks=Os,Object.assign(dn,Rn,_a,no,Uo,hs),dn.Chart=dn,"undefined"!=typeof window&&(window.Chart=dn),dn}));
|